diff --git a/compiler/cpp/src/generate/t_java_generator.cc b/compiler/cpp/src/generate/t_java_generator.cc
index 37c0c59..52166bf 100644
--- a/compiler/cpp/src/generate/t_java_generator.cc
+++ b/compiler/cpp/src/generate/t_java_generator.cc
@@ -58,9 +58,11 @@
 string t_java_generator::java_type_imports() {
   return
     string() +
+    "import java.util.List;\n" +
     "import java.util.ArrayList;\n" +
-    "import java.util.AbstractMap;\n" +
+    "import java.util.Map;\n" +
     "import java.util.HashMap;\n" +
+    "import java.util.Set;\n" +
     "import java.util.HashSet;\n" +
     "import com.facebook.thrift.*;\n\n";
 }
@@ -1775,6 +1777,7 @@
 string t_java_generator::type_name(t_type* ttype, bool in_container, bool in_init) {
   // In Java typedefs are just resolved to their real type
   ttype = get_true_type(ttype);
+  string prefix;
 
   if (ttype->is_base_type()) {
     return base_type_name((t_base_type*)ttype, in_container);
@@ -1782,21 +1785,30 @@
     return (in_container ? "Integer" : "int");
   } else if (ttype->is_map()) {
     t_map* tmap = (t_map*) ttype;
-    string prefix;
     if (in_init) {
       prefix = "HashMap";
     } else {
-      prefix = "AbstractMap";
+      prefix = "Map";
     }
     return prefix + "<" +
       type_name(tmap->get_key_type(), true) + "," +
       type_name(tmap->get_val_type(), true) + ">";
   } else if (ttype->is_set()) {
     t_set* tset = (t_set*) ttype;
-    return "HashSet<" + type_name(tset->get_elem_type(), true) + ">";
+    if (in_init) {
+      prefix = "HashSet<";
+    } else {
+      prefix = "Set<";
+    }
+    return prefix + type_name(tset->get_elem_type(), true) + ">";
   } else if (ttype->is_list()) {
     t_list* tlist = (t_list*) ttype;
-    return "ArrayList<" + type_name(tlist->get_elem_type(), true) + ">";
+    if (in_init) {
+      prefix = "ArrayList<";
+    } else {
+      prefix = "List<";
+    }
+    return prefix + type_name(tlist->get_elem_type(), true) + ">";
   }
 
   // Check for namespacing
diff --git a/test/java/src/TestClient.java b/test/java/src/TestClient.java
index 87f3971..85aac9e 100644
--- a/test/java/src/TestClient.java
+++ b/test/java/src/TestClient.java
@@ -13,9 +13,11 @@
 import com.facebook.thrift.protocol.TBinaryProtocol;
 import com.facebook.thrift.protocol.TJSONProtocol;
 
-import java.util.AbstractMap;
+import java.util.Map;
 import java.util.HashMap;
+import java.util.Set;
 import java.util.HashSet;
+import java.util.List;
 import java.util.ArrayList;
 
 /**
@@ -170,7 +172,7 @@
         /**
          * MAP TEST
          */
-        HashMap<Integer,Integer> mapout = new HashMap<Integer,Integer>();
+        Map<Integer,Integer> mapout = new HashMap<Integer,Integer>();
         for (int i = 0; i < 5; ++i) {
           mapout.put(i, i-10);
         }
@@ -185,7 +187,7 @@
           System.out.print(key + " => " + mapout.get(key));
         }
         System.out.print("})");
-        AbstractMap<Integer,Integer> mapin = testClient.testMap(mapout);
+        Map<Integer,Integer> mapin = testClient.testMap(mapout);
         System.out.print(" = {");
         first = true;
         for (int key : mapin.keySet()) {
@@ -201,7 +203,7 @@
         /**
          * SET TEST
          */
-        HashSet<Integer> setout = new HashSet<Integer>();
+        Set<Integer> setout = new HashSet<Integer>();
         for (int i = -2; i < 3; ++i) {
           setout.add(i);
         }
@@ -216,7 +218,7 @@
           System.out.print(elem);
         }
         System.out.print("})");
-        HashSet<Integer> setin = testClient.testSet(setout);
+        Set<Integer> setin = testClient.testSet(setout);
         System.out.print(" = {");
         first = true;
         for (int elem : setin) {
@@ -232,7 +234,7 @@
         /**
          * LIST TEST
          */
-        ArrayList<Integer> listout = new ArrayList<Integer>();
+        List<Integer> listout = new ArrayList<Integer>();
         for (int i = -2; i < 3; ++i) {
           listout.add(i);
         }
@@ -247,7 +249,7 @@
           System.out.print(elem);
         }
         System.out.print("})");
-        ArrayList<Integer> listin = testClient.testList(listout);
+        List<Integer> listin = testClient.testList(listout);
         System.out.print(" = {");
         first = true;
         for (int elem : listin) {
@@ -294,12 +296,12 @@
          * NESTED MAP TEST
          */
         System.out.print("testMapMap(1)");
-        AbstractMap<Integer,AbstractMap<Integer,Integer>> mm =
+        Map<Integer,Map<Integer,Integer>> mm =
           testClient.testMapMap(1);
         System.out.print(" = {");
         for (int key : mm.keySet()) {
           System.out.print(key + " => {");
-          AbstractMap<Integer,Integer> m2 = mm.get(key);
+          Map<Integer,Integer> m2 = mm.get(key);
           for (int k2 : m2.keySet()) {
             System.out.print(k2 + " => " + m2.get(k2) + ", ");
           }
@@ -321,17 +323,17 @@
         insane.xtructs = new ArrayList<Xtruct>();
         insane.xtructs.add(truck);
         System.out.print("testInsanity()");
-        AbstractMap<Long,AbstractMap<Integer,Insanity>> whoa =
+        Map<Long,Map<Integer,Insanity>> whoa =
           testClient.testInsanity(insane);
         System.out.print(" = {");
         for (long key : whoa.keySet()) {
-          AbstractMap<Integer,Insanity> val = whoa.get(key);
+          Map<Integer,Insanity> val = whoa.get(key);
           System.out.print(key + " => {");
 
           for (int k2 : val.keySet()) {
             Insanity v2 = val.get(k2);
             System.out.print(k2 + " => {");
-            AbstractMap<Integer, Long> userMap = v2.userMap;
+            Map<Integer, Long> userMap = v2.userMap;
             System.out.print("{");
             if (userMap != null) {
               for (int k3 : userMap.keySet()) {
@@ -340,7 +342,7 @@
             }
             System.out.print("}, ");
 
-            ArrayList<Xtruct> xtructs = v2.xtructs;
+            List<Xtruct> xtructs = v2.xtructs;
             System.out.print("{");
             if (xtructs != null) {
               for (Xtruct x : xtructs) {
diff --git a/test/java/src/TestServer.java b/test/java/src/TestServer.java
index 5a844a3..21003b1 100644
--- a/test/java/src/TestServer.java
+++ b/test/java/src/TestServer.java
@@ -14,9 +14,11 @@
 import thrift.test.*;
 
 import java.net.ServerSocket;
+import java.util.List;
 import java.util.ArrayList;
-import java.util.AbstractMap;
+import java.util.Map;
 import java.util.HashMap;
+import java.util.Set;
 import java.util.HashSet;
 
 public class TestServer {
@@ -75,7 +77,7 @@
       return nest;
     }
 
-    public AbstractMap<Integer,Integer> testMap(AbstractMap<Integer,Integer> thing) {
+    public Map<Integer,Integer> testMap(Map<Integer,Integer> thing) {
       System.out.print("testMap({");
       boolean first = true;
       for (int key : thing.keySet()) {
@@ -90,7 +92,7 @@
       return thing;
     }
 
-    public HashSet<Integer> testSet(HashSet<Integer> thing) {
+    public Set<Integer> testSet(Set<Integer> thing) {
       System.out.print("testSet({");
       boolean first = true;
       for (int elem : thing) {
@@ -105,7 +107,7 @@
       return thing;
     }
 
-    public ArrayList<Integer> testList(ArrayList<Integer> thing) {
+    public List<Integer> testList(List<Integer> thing) {
       System.out.print("testList({");
       boolean first = true;
       for (int elem : thing) {
@@ -130,10 +132,10 @@
       return thing;
     }
 
-    public AbstractMap<Integer,AbstractMap<Integer,Integer>> testMapMap(int hello) {
+    public Map<Integer,Map<Integer,Integer>> testMapMap(int hello) {
       System.out.print("testMapMap(" + hello + ")\n");
-      AbstractMap<Integer,AbstractMap<Integer,Integer>> mapmap =
-        new HashMap<Integer,AbstractMap<Integer,Integer>>();
+      Map<Integer,Map<Integer,Integer>> mapmap =
+        new HashMap<Integer,Map<Integer,Integer>>();
 
       HashMap<Integer,Integer> pos = new HashMap<Integer,Integer>();
       HashMap<Integer,Integer> neg = new HashMap<Integer,Integer>();
@@ -148,7 +150,7 @@
       return mapmap;
     }
 
-    public AbstractMap<Long, AbstractMap<Integer,Insanity>> testInsanity(Insanity argument) {
+    public Map<Long, Map<Integer,Insanity>> testInsanity(Insanity argument) {
       System.out.print("testInsanity()\n");
 
       Xtruct hello = new Xtruct();
@@ -182,15 +184,15 @@
 
       second_map.put(Numberz.SIX, looney);
 
-      AbstractMap<Long,AbstractMap<Integer,Insanity>> insane =
-        new HashMap<Long, AbstractMap<Integer,Insanity>>();
+      Map<Long,Map<Integer,Insanity>> insane =
+        new HashMap<Long, Map<Integer,Insanity>>();
       insane.put((long)1, first_map);
       insane.put((long)2, second_map);
 
       return insane;
     }
 
-    public Xtruct testMulti(byte arg0, int arg1, long arg2, AbstractMap<Short,String> arg3, int arg4, long arg5) {
+    public Xtruct testMulti(byte arg0, int arg1, long arg2, Map<Short,String> arg3, int arg4, long arg5) {
       System.out.print("testMulti()\n");
 
       Xtruct hello = new Xtruct();;
