diff --git a/tutorial/java/src/CalculatorHandler.java b/tutorial/java/src/CalculatorHandler.java
new file mode 100644
index 0000000..4216be5
--- /dev/null
+++ b/tutorial/java/src/CalculatorHandler.java
@@ -0,0 +1,92 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+import org.apache.thrift.TException;
+
+// Generated code
+import tutorial.*;
+import shared.*;
+
+import java.util.HashMap;
+
+public class CalculatorHandler implements Calculator.Iface {
+
+  private HashMap<Integer,SharedStruct> log;
+
+  public CalculatorHandler() {
+    log = new HashMap<Integer, SharedStruct>();
+  }
+
+  public void ping() {
+    System.out.println("ping()");
+  }
+
+  public int add(int n1, int n2) {
+    System.out.println("add(" + n1 + "," + n2 + ")");
+    return n1 + n2;
+  }
+
+  public int calculate(int logid, Work work) throws InvalidOperation {
+    System.out.println("calculate(" + logid + ", {" + work.op + "," + work.num1 + "," + work.num2 + "})");
+    int val = 0;
+    switch (work.op) {
+    case ADD:
+      val = work.num1 + work.num2;
+      break;
+    case SUBTRACT:
+      val = work.num1 - work.num2;
+      break;
+    case MULTIPLY:
+      val = work.num1 * work.num2;
+      break;
+    case DIVIDE:
+      if (work.num2 == 0) {
+        InvalidOperation io = new InvalidOperation();
+        io.what = work.op.getValue();
+        io.why = "Cannot divide by 0";
+        throw io;
+      }
+      val = work.num1 / work.num2;
+      break;
+    default:
+      InvalidOperation io = new InvalidOperation();
+      io.what = work.op.getValue();
+      io.why = "Unknown operation";
+      throw io;
+    }
+
+    SharedStruct entry = new SharedStruct();
+    entry.key = logid;
+    entry.value = Integer.toString(val);
+    log.put(logid, entry);
+
+    return val;
+  }
+
+  public SharedStruct getStruct(int key) {
+    System.out.println("getStruct(" + key + ")");
+    return log.get(key);
+  }
+
+  public void zip() {
+    System.out.println("zip()");
+  }
+
+}
+
diff --git a/tutorial/java/src/JavaServer.java b/tutorial/java/src/JavaServer.java
index 29c4d58..788473a 100644
--- a/tutorial/java/src/JavaServer.java
+++ b/tutorial/java/src/JavaServer.java
@@ -18,7 +18,9 @@
  */
 
 import org.apache.thrift.server.TServer;
+import org.apache.thrift.server.TServer.Args;
 import org.apache.thrift.server.TSimpleServer;
+import org.apache.thrift.server.TThreadPoolServer;
 import org.apache.thrift.transport.TSSLTransportFactory;
 import org.apache.thrift.transport.TServerSocket;
 import org.apache.thrift.transport.TServerTransport;
@@ -32,76 +34,13 @@
 
 public class JavaServer {
 
-  public static class CalculatorHandler implements Calculator.Iface {
-
-    private HashMap<Integer,SharedStruct> log;
-
-    public CalculatorHandler() {
-      log = new HashMap<Integer, SharedStruct>();
-    }
-
-    public void ping() {
-      System.out.println("ping()");
-    }
-
-    public int add(int n1, int n2) {
-      System.out.println("add(" + n1 + "," + n2 + ")");
-      return n1 + n2;
-    }
-
-    public int calculate(int logid, Work work) throws InvalidOperation {
-      System.out.println("calculate(" + logid + ", {" + work.op + "," + work.num1 + "," + work.num2 + "})");
-      int val = 0;
-      switch (work.op) {
-        case ADD:
-          val = work.num1 + work.num2;
-          break;
-        case SUBTRACT:
-          val = work.num1 - work.num2;
-          break;
-        case MULTIPLY:
-          val = work.num1 * work.num2;
-          break;
-        case DIVIDE:
-          if (work.num2 == 0) {
-            InvalidOperation io = new InvalidOperation();
-            io.what = work.op.getValue();
-            io.why = "Cannot divide by 0";
-            throw io;
-          }
-          val = work.num1 / work.num2;
-          break;
-        default:
-          InvalidOperation io = new InvalidOperation();
-          io.what = work.op.getValue();
-          io.why = "Unknown operation";
-          throw io;
-      }
-
-      SharedStruct entry = new SharedStruct();
-      entry.key = logid;
-      entry.value = Integer.toString(val);
-      log.put(logid, entry);
-
-      return val;
-    }
-
-    public SharedStruct getStruct(int key) {
-      System.out.println("getStruct(" + key + ")");
-      return log.get(key);
-    }
-
-    public void zip() {
-      System.out.println("zip()");
-    }
-
-  }
+  public static CalculatorHandler handler;
 
   public static Calculator.Processor processor;
 
   public static void main(String [] args) {
     try {
-      CalculatorHandler handler = new CalculatorHandler();
+      handler = new CalculatorHandler();
       processor = new Calculator.Processor(handler);
 
       Runnable simple = new Runnable() {
@@ -125,10 +64,10 @@
   public static void simple(Calculator.Processor processor) {
     try {
       TServerTransport serverTransport = new TServerSocket(9090);
-      TServer server = new TSimpleServer(processor, serverTransport);
+      TServer server = new TSimpleServer(new Args(serverTransport).processor(processor));
 
       // Use this for a multithreaded server
-      // server = new TThreadPoolServer(processor, serverTransport);
+      // TServer server = new TThreadPoolServer(new TThreadPoolServer.Args(serverTransport).processor(processor));
 
       System.out.println("Starting the simple server...");
       server.serve();
@@ -157,10 +96,10 @@
        * from the factory class. 
        */
       TServerTransport serverTransport = TSSLTransportFactory.getServerSocket(9091, 0, null, params);
-      TServer server = new TSimpleServer(processor, serverTransport);
+      TServer server = new TSimpleServer(new Args(serverTransport).processor(processor));
 
       // Use this for a multi threaded server
-      // server = new TThreadPoolServer(processor, serverTransport);
+      // TServer server = new TThreadPoolServer(new TThreadPoolServer.Args(serverTransport).processor(processor));
 
       System.out.println("Starting the secure server...");
       server.serve();
