diff --git a/compiler/cpp/src/generate/t_cpp_generator.cc b/compiler/cpp/src/generate/t_cpp_generator.cc
index 2cff3fc..7934f0c 100644
--- a/compiler/cpp/src/generate/t_cpp_generator.cc
+++ b/compiler/cpp/src/generate/t_cpp_generator.cc
@@ -480,8 +480,10 @@
 
   generate_service_interface(tservice);
   generate_service_helpers(tservice);
-  generate_service_server(tservice);
   generate_service_client(tservice);
+  generate_service_server(tservice);
+  generate_service_multiface(tservice);
+
 
   f_service_ <<
     ns_close_ << endl <<
@@ -537,6 +539,93 @@
 }
 
 /**
+ * Generates a multiface, which is a single server that just takes a set
+ * of objects implementing the interface and calls them all, returning the
+ * value of the last one to be called.
+ *
+ * @param tservice The service to generate a multiserver for.
+ */
+void t_cpp_generator::generate_service_multiface(t_service* tservice) {
+    // Generate the dispatch methods
+  vector<t_function*> functions = tservice->get_functions();
+  vector<t_function*>::iterator f_iter; 
+
+  string list_type = string("std::vector<boost::shared_ptr<") + service_name_ + "If> >";
+
+  // Generate the header portion
+  f_header_ <<
+    "class " << service_name_ << "Multiface : " <<
+    "public " << service_name_ << "If {" << endl <<
+    " public: " << endl;
+  indent_up();
+  f_header_ << 
+    indent() << service_name_ << "Multiface(" << list_type << "& ifaces) : _ifaces(ifaces) {}" << endl <<
+    indent() << "virtual ~" << service_name_ << "Multiface() {}" << endl;
+  indent_down();
+
+  // Protected data members
+  f_header_ <<
+    " protected:" << endl;
+  indent_up();
+  f_header_ <<
+    indent() << list_type << "& _ifaces;" << endl;
+  indent_down();
+
+  f_header_ <<
+    indent() << " public:" << endl;
+  indent_up();
+
+  for (f_iter = functions.begin(); f_iter != functions.end(); ++f_iter) {
+    t_struct* arglist = (*f_iter)->get_arglist();
+    const vector<t_field*>& args = arglist->get_members();
+    vector<t_field*>::const_iterator a_iter;
+
+    string call = string("_ifaces[i]->") + (*f_iter)->get_name() + "(";
+    bool first = true;
+    for (a_iter = args.begin(); a_iter != args.end(); ++a_iter) {
+      if (first) {
+        first = false;
+      } else {
+        call += ", ";
+      }
+      call += (*a_iter)->get_name();
+    }
+    call += ")";
+
+    f_header_ <<
+      indent() << function_signature(*f_iter) << " {" << endl;
+    indent_up();
+    f_header_ <<
+      indent() << "uint32_t sz = _ifaces.size();" << endl <<
+      indent() << "for (uint32_t i = 0; i < sz; ++i) {" << endl;
+    if (!(*f_iter)->get_returntype()->is_void()) {
+      f_header_ <<
+        indent() << "  if (i == sz - 1) {" << endl <<
+        indent() << "    return " << call << ";" << endl <<
+        indent() << "  } else {" << endl <<
+        indent() << "    " << call << ";" << endl <<
+        indent() << "  }" << endl;
+    } else {
+      f_header_ <<
+        indent() << "  " << call << ";" << endl;
+    }
+
+    f_header_ <<
+      indent() << "}" << endl;
+    
+    indent_down();
+    f_header_ <<
+      indent() << "}" << endl <<
+      endl;
+  }
+
+  indent_down();
+  f_header_ <<
+    indent() << "};" << endl <<
+    endl;
+}
+
+/**
  * Generates a service client definition.
  *
  * @param tservice The service to generate a server for.
@@ -746,17 +835,16 @@
   // Generate the header portion
   f_header_ <<
     "class " << service_name_ << "Server : " <<
-    "public " << service_name_ << "If, " <<
     "public facebook::thrift::TProcessor {" << endl <<
     " public: " << endl;
   indent_up();
   f_header_ << 
     indent() <<
-    service_name_ << "Server(boost::shared_ptr<const facebook::thrift::protocol::TProtocol> protocol) : " <<
-                       "_iprot(protocol), _oprot(protocol) {}" << endl <<
+    service_name_ << "Server(boost::shared_ptr<" << service_name_ << "If> iface, boost::shared_ptr<const facebook::thrift::protocol::TProtocol> prot) : " <<
+                       "_iface(iface), _iprot(prot), _oprot(prot) {}" << endl <<
     indent() <<
-    service_name_ << "Server(boost::shared_ptr<const facebook::thrift::protocol::TProtocol> iprot, boost::shared_ptr<const facebook::thrift::protocol::TProtocol> oprot) : " <<
-                       "_iprot(iprot), _oprot(oprot) {}" << endl <<
+    service_name_ << "Server(boost::shared_ptr<" << service_name_ << "If> iface, boost::shared_ptr<const facebook::thrift::protocol::TProtocol> iprot, boost::shared_ptr<const facebook::thrift::protocol::TProtocol> oprot) : " <<
+                       "_iface(iface), _iprot(iprot), _oprot(oprot) {}" << endl <<
     indent() << "bool process(boost::shared_ptr<facebook::thrift::transport::TTransport> _itrans, " <<
                              "boost::shared_ptr<facebook::thrift::transport::TTransport> _otrans);" << endl <<
     indent() << "virtual ~" << service_name_ << "Server() {}" << endl;
@@ -767,6 +855,7 @@
     " protected:" << endl;
   indent_up();
   f_header_ <<
+    indent() << "boost::shared_ptr<" << service_name_ << "If> _iface;" << endl <<
     indent() << "boost::shared_ptr<const facebook::thrift::protocol::TProtocol> _iprot;" << endl <<
     indent() << "boost::shared_ptr<const facebook::thrift::protocol::TProtocol> _oprot;" << endl;
   indent_down();
@@ -838,9 +927,6 @@
     "}" << endl <<
     endl;
 
-  // Multiserver
-  generate_service_multiserver(tservice);
-
   // Generate the process subfunctions
   for (f_iter = functions.begin(); f_iter != functions.end(); ++f_iter) {
     generate_process_function(tservice, *f_iter);
@@ -848,100 +934,6 @@
 }
 
 /**
- * Generates a multiserver, which is a single server that just takes a set
- * of objects implementing the interface and calls them all, returning the
- * value of the last one to be called.
- *
- * @param tservice The service to generate a multiserver for.
- */
-void t_cpp_generator::generate_service_multiserver(t_service* tservice) {
-    // Generate the dispatch methods
-  vector<t_function*> functions = tservice->get_functions();
-  vector<t_function*>::iterator f_iter; 
-
-  string list_type = string("std::vector<boost::shared_ptr<") + service_name_ + "If> >";
-
-  // Generate the header portion
-  f_header_ <<
-    "class " << service_name_ << "MultiServer : " <<
-    "public " << service_name_ << "Server {" << endl <<
-    " public: " << endl;
-  indent_up();
-  f_header_ << 
-    indent() <<
-    service_name_ << "MultiServer(boost::shared_ptr<const facebook::thrift::protocol::TProtocol> protocol, " << list_type << "& servers) : " <<
-    service_name_ << "Server(protocol), _servers(servers) {}" << endl <<
-    indent() <<
-    service_name_ << "MultiServer(boost::shared_ptr<const facebook::thrift::protocol::TProtocol> iprot, boost::shared_ptr<const facebook::thrift::protocol::TProtocol> oprot, " << list_type << "& servers) : " <<
-    service_name_ << "Server(iprot, oprot), _servers(servers) {}" << endl <<
-    indent() << "virtual ~" << service_name_ << "MultiServer() {}" << endl;
-  indent_down();
-
-  // Protected data members
-  f_header_ <<
-    " protected:" << endl;
-  indent_up();
-  f_header_ <<
-    indent() << list_type << "& _servers;" << endl;
-  indent_down();
-
-  f_header_ <<
-    indent() << " public:" << endl;
-  indent_up();
-
-  for (f_iter = functions.begin(); f_iter != functions.end(); ++f_iter) {
-    t_struct* arglist = (*f_iter)->get_arglist();
-    const vector<t_field*>& args = arglist->get_members();
-    vector<t_field*>::const_iterator a_iter;
-
-    string call = string("_servers[i]->") + (*f_iter)->get_name() + "(";
-    bool first = true;
-    for (a_iter = args.begin(); a_iter != args.end(); ++a_iter) {
-      if (first) {
-        first = false;
-      } else {
-        call += ", ";
-      }
-      call += (*a_iter)->get_name();
-    }
-    call += ")";
-
-    f_header_ <<
-      indent() << function_signature(*f_iter) << " {" << endl;
-    indent_up();
-    f_header_ <<
-      indent() << "uint32_t sz = _servers.size();" << endl <<
-      indent() << "for (uint32_t i = 0; i < sz; ++i) {" << endl;
-    if (!(*f_iter)->get_returntype()->is_void()) {
-      f_header_ <<
-        indent() << "  if (i == sz - 1) {" << endl <<
-        indent() << "    return " << call << ";" << endl <<
-        indent() << "  } else {" << endl <<
-        indent() << "    " << call << ";" << endl <<
-        indent() << "  }" << endl;
-    } else {
-      f_header_ <<
-        indent() << "  " << call << ";" << endl;
-    }
-
-    f_header_ <<
-      indent() << "}" << endl;
-    
-    indent_down();
-    f_header_ <<
-      indent() << "}" << endl <<
-      endl;
-  }
-
-  indent_down();
-
-  f_header_ <<
-    indent() << "};" << endl <<
-    endl;
-}
-
-
-/**
  * Generates a struct and helpers for a function.
  *
  * @param tfunction The function
@@ -1019,7 +1011,7 @@
     f_service_ << "__result.success = ";    
   }
   f_service_ <<
-    tfunction->get_name() << "(";
+    "_iface->" << tfunction->get_name() << "(";
   bool first = true;
   for (f_iter = fields.begin(); f_iter != fields.end(); ++f_iter) {
     if (first) {
diff --git a/compiler/cpp/src/generate/t_cpp_generator.h b/compiler/cpp/src/generate/t_cpp_generator.h
index fd208b6..55c7c2f 100644
--- a/compiler/cpp/src/generate/t_cpp_generator.h
+++ b/compiler/cpp/src/generate/t_cpp_generator.h
@@ -42,10 +42,10 @@
   /** Service-level generation functions */
 
   void generate_service_interface (t_service* tservice);
+  void generate_service_multiface (t_service* tservice);
   void generate_service_helpers   (t_service* tservice);
   void generate_service_client    (t_service* tservice);
   void generate_service_server    (t_service* tservice);
-  void generate_service_multiserver(t_service* tservice);
   void generate_process_function  (t_service* tservice, t_function* tfunction);
 
   void generate_function_helpers  (t_function* tfunction);
diff --git a/compiler/cpp/src/generate/t_java_generator.cc b/compiler/cpp/src/generate/t_java_generator.cc
index 059e6b0..390c563 100644
--- a/compiler/cpp/src/generate/t_java_generator.cc
+++ b/compiler/cpp/src/generate/t_java_generator.cc
@@ -599,27 +599,29 @@
 
   // Generate the header portion
   f_service_ <<
-    "public abstract static class Server implements Iface, TProcessor {" << endl;
+    "public static class Server implements TProcessor {" << endl;
   indent_up();
 
   indent(f_service_) <<
-    "public Server(TProtocol prot)" << endl;
+    "public Server(Iface iface, TProtocol prot)" << endl;
   scope_up(f_service_);
   indent(f_service_) << 
-    "this(prot, prot);" << endl;
+    "this(iface, prot, prot);" << endl;
   scope_down(f_service_);
   f_service_ << endl;
 
   indent(f_service_) <<
-    "public Server(TProtocol iprot, TProtocol oprot)" << endl;
+    "public Server(Iface iface, TProtocol iprot, TProtocol oprot)" << endl;
   scope_up(f_service_);
   f_service_ <<
+    indent() << "_iface = iface;" << endl <<
     indent() << "_iprot = iprot;" << endl <<
     indent() << "_oprot = oprot;" << endl;
   scope_down(f_service_);
   f_service_ << endl;
  
   f_service_ <<
+    indent() << "private Iface _iface;" << endl <<
     indent() << "private TProtocol _iprot;" << endl <<
     indent() << "private TProtocol _oprot;" << endl << endl;
   
@@ -753,7 +755,7 @@
     f_service_ << "__result.success = ";
   }
   f_service_ <<
-    tfunction->get_name() << "(";
+    "_iface." << tfunction->get_name() << "(";
   bool first = true;
   for (f_iter = fields.begin(); f_iter != fields.end(); ++f_iter) {
     if (first) {
diff --git a/test/cpp/src/TestServer.cc b/test/cpp/src/TestServer.cc
index 75b88d4..63a7594 100644
--- a/test/cpp/src/TestServer.cc
+++ b/test/cpp/src/TestServer.cc
@@ -19,10 +19,9 @@
 
 using namespace thrift::test;
 
-class TestServer : public ThriftTestServer {
+class TestHandler : public ThriftTestIf {
  public:
-  TestServer(shared_ptr<TProtocol> protocol) :
-    ThriftTestServer(protocol) {}
+  TestHandler() {}
 
   void testVoid() {
     printf("testVoid()\n");
@@ -339,7 +338,9 @@
   // Dispatcher
   shared_ptr<TBinaryProtocol> binaryProtocol(new TBinaryProtocol);
 
-  shared_ptr<TestServer> testServer(new TestServer(binaryProtocol));
+  shared_ptr<TestHandler> testHandler(new TestHandler());
+
+  shared_ptr<ThriftTestServer> testServer(new ThriftTestServer(testHandler, binaryProtocol));
 
   // Options
   shared_ptr<TServerOptions> serverOptions(new TServerOptions());
diff --git a/test/java/src/TestServer.java b/test/java/src/TestServer.java
index 4e415ae..7418cbb 100644
--- a/test/java/src/TestServer.java
+++ b/test/java/src/TestServer.java
@@ -16,207 +16,212 @@
 import java.util.HashMap;
 import java.util.HashSet;
 
-public class TestServer extends ThriftTest.Server {
-  public TestServer(TProtocol prot) {
-    super(prot);
-  }
-  
-  public void testVoid() {
-    System.out.print("testVoid()\n");
-  }
+public class TestServer {
 
-  public String testString(String thing) {
-    System.out.print("testString(\"" + thing + "\")\n");
-    return thing;
-  }
+  public static class TestHandler implements ThriftTest.Iface {
 
-  public byte testByte(byte thing) {
-    System.out.print("testByte(" + thing + ")\n");
-    return thing;
-  }
+    public TestHandler() {}
+  
+    public void testVoid() {
+      System.out.print("testVoid()\n");
+    }
 
-  public int testI32(int thing) {
-    System.out.print("testI32(" + thing + ")\n");
-    return thing;
-  }
+    public String testString(String thing) {
+      System.out.print("testString(\"" + thing + "\")\n");
+      return thing;
+    }
 
-  public long testI64(long thing) {
-    System.out.print("testI64(" + thing + ")\n");
-    return thing;
-  }
+    public byte testByte(byte thing) {
+      System.out.print("testByte(" + thing + ")\n");
+      return thing;
+    }
+
+    public int testI32(int thing) {
+      System.out.print("testI32(" + thing + ")\n");
+      return thing;
+    }
+
+    public long testI64(long thing) {
+      System.out.print("testI64(" + thing + ")\n");
+      return thing;
+    }
   
-  public Xtruct testStruct(Xtruct thing) {
-    System.out.print("testStruct({" +
-                     "\"" + thing.string_thing + "\", " +
-                     thing.byte_thing + ", " +
-                     thing.i32_thing + ", " +
-                     thing.i64_thing + "})\n");
-    return thing;
-  }
+    public Xtruct testStruct(Xtruct thing) {
+      System.out.print("testStruct({" +
+                       "\"" + thing.string_thing + "\", " +
+                       thing.byte_thing + ", " +
+                       thing.i32_thing + ", " +
+                       thing.i64_thing + "})\n");
+      return thing;
+    }
   
-  public Xtruct2 testNest(Xtruct2 nest) {
-    Xtruct thing = nest.struct_thing;
-    System.out.print("testNest({" +
-                     nest.byte_thing + ", {" +
-                     "\"" + thing.string_thing + "\", " +
-                     thing.byte_thing + ", " +
-                     thing.i32_thing + ", " +
-                     thing.i64_thing + "}, " +
-                     nest.i32_thing + "})\n");
-    return nest;
-  }
+    public Xtruct2 testNest(Xtruct2 nest) {
+      Xtruct thing = nest.struct_thing;
+      System.out.print("testNest({" +
+                       nest.byte_thing + ", {" +
+                       "\"" + thing.string_thing + "\", " +
+                       thing.byte_thing + ", " +
+                       thing.i32_thing + ", " +
+                       thing.i64_thing + "}, " +
+                       nest.i32_thing + "})\n");
+      return nest;
+    }
   
-  public HashMap<Integer,Integer> testMap(HashMap<Integer,Integer> thing) {
-    System.out.print("testMap({");
-    boolean first = true;
-    for (int key : thing.keySet()) {
-      if (first) {
-        first = false;
-      } else {
-        System.out.print(", ");
+    public HashMap<Integer,Integer> testMap(HashMap<Integer,Integer> thing) {
+      System.out.print("testMap({");
+      boolean first = true;
+      for (int key : thing.keySet()) {
+        if (first) {
+          first = false;
+        } else {
+          System.out.print(", ");
+        }
+        System.out.print(key + " => " + thing.get(key));
       }
-      System.out.print(key + " => " + thing.get(key));
+      System.out.print("})\n");
+      return thing;
     }
-    System.out.print("})\n");
-    return thing;
-  }
 
-  public HashSet<Integer> testSet(HashSet<Integer> thing) {
-    System.out.print("testSet({");
-    boolean first = true;
-    for (int elem : thing) {
-      if (first) {
-        first = false;
-      } else {
-        System.out.print(", ");
+    public HashSet<Integer> testSet(HashSet<Integer> thing) {
+      System.out.print("testSet({");
+      boolean first = true;
+      for (int elem : thing) {
+        if (first) {
+          first = false;
+        } else {
+          System.out.print(", ");
+        }
+        System.out.print(elem);
       }
-      System.out.print(elem);
+      System.out.print("})\n");
+      return thing;
     }
-    System.out.print("})\n");
-    return thing;
-  }
 
-  public ArrayList<Integer> testList(ArrayList<Integer> thing) {
-    System.out.print("testList({");
-    boolean first = true;
-    for (int elem : thing) {
-      if (first) {
-        first = false;
-      } else {
-        System.out.print(", ");
+    public ArrayList<Integer> testList(ArrayList<Integer> thing) {
+      System.out.print("testList({");
+      boolean first = true;
+      for (int elem : thing) {
+        if (first) {
+          first = false;
+        } else {
+          System.out.print(", ");
+        }
+        System.out.print(elem);
       }
-      System.out.print(elem);
-    }
-    System.out.print("})\n");
-    return thing;
-  }
-
-  public int testEnum(int thing) {
-    System.out.print("testEnum(" + thing + ")\n");
-    return thing;
-  }
-
-  public long testTypedef(long thing) {
-    System.out.print("testTypedef(" + thing + ")\n");
-    return thing;
-  }
-
-  public HashMap<Integer,HashMap<Integer,Integer>> testMapMap(int hello) {
-    System.out.print("testMapMap(" + hello + ")\n");
-    HashMap<Integer,HashMap<Integer,Integer>> mapmap =
-      new HashMap<Integer,HashMap<Integer,Integer>>();
-
-    HashMap<Integer,Integer> pos = new HashMap<Integer,Integer>();
-    HashMap<Integer,Integer> neg = new HashMap<Integer,Integer>();
-    for (int i = 1; i < 5; i++) {
-      pos.put(i, i);
-      neg.put(-i, -i);
+      System.out.print("})\n");
+      return thing;
     }
 
-    mapmap.put(4, pos);
-    mapmap.put(-4, neg);
+    public int testEnum(int thing) {
+      System.out.print("testEnum(" + thing + ")\n");
+      return thing;
+    }
 
-    return mapmap;
-  }
+    public long testTypedef(long thing) {
+      System.out.print("testTypedef(" + thing + ")\n");
+      return thing;
+    }
 
-  public HashMap<Long, HashMap<Integer,Insanity>> testInsanity(Insanity argument) {
-    System.out.print("testInsanity()\n");
+    public HashMap<Integer,HashMap<Integer,Integer>> testMapMap(int hello) {
+      System.out.print("testMapMap(" + hello + ")\n");
+      HashMap<Integer,HashMap<Integer,Integer>> mapmap =
+        new HashMap<Integer,HashMap<Integer,Integer>>();
+
+      HashMap<Integer,Integer> pos = new HashMap<Integer,Integer>();
+      HashMap<Integer,Integer> neg = new HashMap<Integer,Integer>();
+      for (int i = 1; i < 5; i++) {
+        pos.put(i, i);
+        neg.put(-i, -i);
+      }
+
+      mapmap.put(4, pos);
+      mapmap.put(-4, neg);
+
+      return mapmap;
+    }
+
+    public HashMap<Long, HashMap<Integer,Insanity>> testInsanity(Insanity argument) {
+      System.out.print("testInsanity()\n");
     
-    Xtruct hello = new Xtruct();
-    hello.string_thing = "Hello2";
-    hello.byte_thing = 2;
-    hello.i32_thing = 2;
-    hello.i64_thing = 2;
+      Xtruct hello = new Xtruct();
+      hello.string_thing = "Hello2";
+      hello.byte_thing = 2;
+      hello.i32_thing = 2;
+      hello.i64_thing = 2;
 
-    Xtruct goodbye = new Xtruct();
-    goodbye.string_thing = "Goodbye4";
-    goodbye.byte_thing = (byte)4;
-    goodbye.i32_thing = 4;
-    goodbye.i64_thing = (long)4;
+      Xtruct goodbye = new Xtruct();
+      goodbye.string_thing = "Goodbye4";
+      goodbye.byte_thing = (byte)4;
+      goodbye.i32_thing = 4;
+      goodbye.i64_thing = (long)4;
 
-    Insanity crazy = new Insanity();
-    crazy.userMap.put(Numberz.EIGHT, (long)8);
-    crazy.xtructs.add(goodbye);
+      Insanity crazy = new Insanity();
+      crazy.userMap.put(Numberz.EIGHT, (long)8);
+      crazy.xtructs.add(goodbye);
 
-    Insanity looney = new Insanity();
-    crazy.userMap.put(Numberz.FIVE, (long)5);
-    crazy.xtructs.add(hello);
+      Insanity looney = new Insanity();
+      crazy.userMap.put(Numberz.FIVE, (long)5);
+      crazy.xtructs.add(hello);
 
-    HashMap<Integer,Insanity> first_map = new HashMap<Integer, Insanity>();
-    HashMap<Integer,Insanity> second_map = new HashMap<Integer, Insanity>();;
+      HashMap<Integer,Insanity> first_map = new HashMap<Integer, Insanity>();
+      HashMap<Integer,Insanity> second_map = new HashMap<Integer, Insanity>();;
 
-    first_map.put(Numberz.TWO, crazy);
-    first_map.put(Numberz.THREE, crazy);
+      first_map.put(Numberz.TWO, crazy);
+      first_map.put(Numberz.THREE, crazy);
 
-    second_map.put(Numberz.SIX, looney);
+      second_map.put(Numberz.SIX, looney);
 
-    HashMap<Long,HashMap<Integer,Insanity>> insane =
-      new HashMap<Long, HashMap<Integer,Insanity>>();
-    insane.put((long)1, first_map);
-    insane.put((long)2, second_map);
+      HashMap<Long,HashMap<Integer,Insanity>> insane =
+        new HashMap<Long, HashMap<Integer,Insanity>>();
+      insane.put((long)1, first_map);
+      insane.put((long)2, second_map);
 
-    return insane;
-  }
+      return insane;
+    }
 
-  public Xtruct testMulti(byte arg0, int arg1, long arg2, HashMap<Short,String> arg3, int arg4, long arg5) {
-    System.out.print("testMulti()\n");
+    public Xtruct testMulti(byte arg0, int arg1, long arg2, HashMap<Short,String> arg3, int arg4, long arg5) {
+      System.out.print("testMulti()\n");
     
-    Xtruct hello = new Xtruct();;
-    hello.string_thing = "Hello2";
-    hello.byte_thing = arg0;
-    hello.i32_thing = arg1;
-    hello.i64_thing = arg2;
-    return hello;
-  }
-
-  public void testException(String arg) throws Xception {
-    System.out.print("testException("+arg+")\n");
-    if (arg.equals("Xception")) {
-      Xception x = new Xception();
-      x.errorCode = 1001;
-      x.message = "This is an Xception";
-      throw x;
+      Xtruct hello = new Xtruct();;
+      hello.string_thing = "Hello2";
+      hello.byte_thing = arg0;
+      hello.i32_thing = arg1;
+      hello.i64_thing = arg2;
+      return hello;
     }
-    return;
-  }
 
-  public Xtruct testMultiException(String arg0, String arg1) throws Xception, Xception2 {
-    System.out.print("testMultiException(" + arg0 + ", " + arg1 + ")\n");
-    if (arg0.equals("Xception")) {
-      Xception x = new Xception();
-      x.errorCode = 1001;
-      x.message = "This is an Xception";
-    } else if (arg0.equals("Xception2")) {
-      Xception2 x = new Xception2();
-      x.errorCode = 2002;
-      x.struct_thing.string_thing = "This is an Xception2";
+    public void testException(String arg) throws Xception {
+      System.out.print("testException("+arg+")\n");
+      if (arg.equals("Xception")) {
+        Xception x = new Xception();
+        x.errorCode = 1001;
+        x.message = "This is an Xception";
+        throw x;
+      }
+      return;
     }
+
+    public Xtruct testMultiException(String arg0, String arg1) throws Xception, Xception2 {
+      System.out.print("testMultiException(" + arg0 + ", " + arg1 + ")\n");
+      if (arg0.equals("Xception")) {
+        Xception x = new Xception();
+        x.errorCode = 1001;
+        x.message = "This is an Xception";
+        throw x;
+      } else if (arg0.equals("Xception2")) {
+        Xception2 x = new Xception2();
+        x.errorCode = 2002;
+        x.struct_thing = new Xtruct();
+        x.struct_thing.string_thing = "This is an Xception2";
+        throw x;
+      }
      
-    Xtruct result = new Xtruct();
-    result.string_thing = arg1;
-    return result;
-  }
+      Xtruct result = new Xtruct();
+      result.string_thing = arg1;
+      return result;
+    }
 
+  } // class TestHandler
 
   public static void main(String [] args) {
     try {
@@ -226,20 +231,26 @@
       }
       
       // Processor
-      TBinaryProtocol binaryProtocol = new TBinaryProtocol();
-      TestServer testServer = new TestServer(binaryProtocol);
+      TBinaryProtocol binaryProtocol =
+        new TBinaryProtocol();
+      TestHandler testHandler =
+        new TestHandler();
+      ThriftTest.Server testServer =
+        new ThriftTest.Server(testHandler, binaryProtocol);
 
       // Options
-      TServer.Options serverOptions = new TServer.Options();
+      TServer.Options serverOptions =
+        new TServer.Options();
 
       // Transport
-      ServerSocket serverSocket = new ServerSocket(port);
-      TServerSocket tServerSocket = new TServerSocket(serverSocket);
+      ServerSocket serverSocket =
+        new ServerSocket(port);
+      TServerSocket tServerSocket =
+        new TServerSocket(serverSocket);
 
       // Server
-      TSimpleServer simpleServer = new TSimpleServer(testServer,
-                                                     serverOptions,
-                                                     tServerSocket);
+      TSimpleServer simpleServer =
+        new TSimpleServer(testServer, serverOptions, tServerSocket);
 
       // Run it
       System.out.println("Starting the server on port " + port + "...");
