diff --git a/compiler/cpp/src/generate/t_java_generator.cc b/compiler/cpp/src/generate/t_java_generator.cc
index 8786d40..ab8af66 100644
--- a/compiler/cpp/src/generate/t_java_generator.cc
+++ b/compiler/cpp/src/generate/t_java_generator.cc
@@ -2097,6 +2097,9 @@
     indent(out) << "new EnumMetaData(TType.ENUM, " << type_name(type) << ".class";
   } else {
     indent(out) << "new FieldValueMetaData(" << get_java_type_string(type);
+    if (type->is_typedef()) {
+      indent(out) << ", \"" << ((t_typedef*)type)->get_symbolic() << "\"";
+    }
   }
   out << ")";
   indent_down();
diff --git a/lib/java/build.xml b/lib/java/build.xml
index 1afc3cb..57be5e3 100644
--- a/lib/java/build.xml
+++ b/lib/java/build.xml
@@ -205,8 +205,6 @@
       classpathref="test.classpath" failonerror="true" />
     <java classname="org.apache.thrift.test.ToStringTest"
       classpathref="test.classpath" failonerror="true" />
-    <java classname="org.apache.thrift.test.MetaDataTest"
-      classpathref="test.classpath" failonerror="true" />
     <java classname="org.apache.thrift.test.JavaBeansTest"
       classpathref="test.classpath" failonerror="true" />
   </target>
diff --git a/lib/java/src/org/apache/thrift/meta_data/FieldValueMetaData.java b/lib/java/src/org/apache/thrift/meta_data/FieldValueMetaData.java
index 076a768..2aad65d 100644
--- a/lib/java/src/org/apache/thrift/meta_data/FieldValueMetaData.java
+++ b/lib/java/src/org/apache/thrift/meta_data/FieldValueMetaData.java
@@ -28,8 +28,27 @@
 public class FieldValueMetaData implements java.io.Serializable {
   public final byte type;  
 
-  public FieldValueMetaData(byte type){
+  private final boolean isTypedefType;
+  private final String typedefName;
+
+  public FieldValueMetaData(byte type) {
     this.type = type;
+    this.isTypedefType = false;
+    this.typedefName = null;
+  }
+
+  public FieldValueMetaData(byte type, String typedefName) {
+    this.type = type;
+    this.isTypedefType = true;
+    this.typedefName = typedefName;
+  }
+
+  public boolean isTypedef() {
+    return isTypedefType;
+  }
+
+  public String getTypedefName() {
+    return typedefName;
   }
 
   public boolean isStruct() {
diff --git a/lib/java/test/org/apache/thrift/TestStruct.java b/lib/java/test/org/apache/thrift/TestStruct.java
index 6ba48a4..4ab2a1e 100644
--- a/lib/java/test/org/apache/thrift/TestStruct.java
+++ b/lib/java/test/org/apache/thrift/TestStruct.java
@@ -5,17 +5,26 @@
 import java.io.ObjectInputStream;
 import java.io.ObjectOutputStream;
 import java.util.HashMap;
+import java.util.Map;
 
 import junit.framework.TestCase;
 
+import org.apache.thrift.meta_data.FieldMetaData;
+import org.apache.thrift.meta_data.ListMetaData;
+import org.apache.thrift.meta_data.MapMetaData;
+import org.apache.thrift.meta_data.SetMetaData;
+import org.apache.thrift.meta_data.StructMetaData;
 import org.apache.thrift.protocol.TBinaryProtocol;
+import org.apache.thrift.protocol.TType;
 
 import thrift.test.Bonk;
+import thrift.test.CrazyNesting;
 import thrift.test.HolyMoley;
 import thrift.test.Insanity;
 import thrift.test.Nesting;
 import thrift.test.Numberz;
 import thrift.test.OneOfEach;
+import thrift.test.Xtruct;
 
 public class TestStruct extends TestCase {
 
@@ -186,4 +195,52 @@
     int compareTo = insanity1.compareTo(insanity2);
     assertEquals(insanity1 + " should be equal to " + insanity2 + ", but is: " + compareTo, 0, compareTo);
   }
+
+  public void testMetaData() throws Exception {
+    Map<CrazyNesting._Fields, FieldMetaData> mdMap = CrazyNesting.metaDataMap;
+
+    // Check for struct fields existence
+    assertEquals(3, mdMap.size());
+    assertTrue(mdMap.containsKey(CrazyNesting._Fields.SET_FIELD));
+    assertTrue(mdMap.containsKey(CrazyNesting._Fields.LIST_FIELD));
+    assertTrue(mdMap.containsKey(CrazyNesting._Fields.STRING_FIELD));
+
+    // Check for struct fields contents
+    assertEquals("string_field", mdMap.get(CrazyNesting._Fields.STRING_FIELD).fieldName);
+    assertEquals("list_field", mdMap.get(CrazyNesting._Fields.LIST_FIELD).fieldName);
+    assertEquals("set_field", mdMap.get(CrazyNesting._Fields.SET_FIELD).fieldName);
+
+    assertEquals(TFieldRequirementType.DEFAULT, mdMap.get(CrazyNesting._Fields.STRING_FIELD).requirementType);
+    assertEquals(TFieldRequirementType.REQUIRED, mdMap.get(CrazyNesting._Fields.LIST_FIELD).requirementType);
+    assertEquals(TFieldRequirementType.OPTIONAL, mdMap.get(CrazyNesting._Fields.SET_FIELD).requirementType);
+
+    assertEquals(TType.STRING, mdMap.get(CrazyNesting._Fields.STRING_FIELD).valueMetaData.type);
+    assertEquals(TType.LIST, mdMap.get(CrazyNesting._Fields.LIST_FIELD).valueMetaData.type);
+    assertEquals(TType.SET, mdMap.get(CrazyNesting._Fields.SET_FIELD).valueMetaData.type);
+
+    // Check nested structures
+    assertTrue(mdMap.get(CrazyNesting._Fields.LIST_FIELD).valueMetaData.isContainer());
+
+    assertFalse(mdMap.get(CrazyNesting._Fields.LIST_FIELD).valueMetaData.isStruct());
+
+    assertEquals(TType.STRUCT, ((MapMetaData)((ListMetaData)((SetMetaData)((MapMetaData)((MapMetaData)((ListMetaData)mdMap.get(CrazyNesting._Fields.LIST_FIELD).valueMetaData).elemMetaData).valueMetaData).valueMetaData).elemMetaData).elemMetaData).keyMetaData.type);
+
+    assertEquals(Insanity.class, ((StructMetaData)((MapMetaData)((ListMetaData)((SetMetaData)((MapMetaData)((MapMetaData)((ListMetaData)mdMap.get(CrazyNesting._Fields.LIST_FIELD).valueMetaData).elemMetaData).valueMetaData).valueMetaData).elemMetaData).elemMetaData).keyMetaData).structClass);
+
+    // Check that FieldMetaData contains a map with metadata for all generated struct classes
+    assertNotNull(FieldMetaData.getStructMetaDataMap(CrazyNesting.class));
+    assertNotNull(FieldMetaData.getStructMetaDataMap(Insanity.class));
+    assertNotNull(FieldMetaData.getStructMetaDataMap(Xtruct.class));
+
+    assertEquals(CrazyNesting.metaDataMap, FieldMetaData.getStructMetaDataMap(CrazyNesting.class));
+    assertEquals(Insanity.metaDataMap, FieldMetaData.getStructMetaDataMap(Insanity.class));
+
+    for (Map.Entry<? extends TFieldIdEnum, FieldMetaData> mdEntry : mdMap.entrySet()) {
+      assertEquals(mdEntry.getKey(), CrazyNesting._Fields.findByName(mdEntry.getValue().fieldName));
+    }
+
+    MapMetaData vmd = (MapMetaData)Insanity.metaDataMap.get(Insanity._Fields.USER_MAP).valueMetaData;
+    assertTrue(vmd.valueMetaData.isTypedef());
+    assertFalse(vmd.keyMetaData.isTypedef());
+  }
 }
diff --git a/lib/java/test/org/apache/thrift/test/MetaDataTest.java b/lib/java/test/org/apache/thrift/test/MetaDataTest.java
deleted file mode 100644
index 8bb9f2c..0000000
--- a/lib/java/test/org/apache/thrift/test/MetaDataTest.java
+++ /dev/null
@@ -1,83 +0,0 @@
-/*
- * 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.
- */
-
-
-package org.apache.thrift.test;
-
-import java.util.Map;
-import org.apache.thrift.TFieldRequirementType;
-import org.apache.thrift.meta_data.FieldMetaData;
-import org.apache.thrift.meta_data.ListMetaData;
-import org.apache.thrift.meta_data.MapMetaData;
-import org.apache.thrift.meta_data.SetMetaData;
-import org.apache.thrift.meta_data.StructMetaData;
-import org.apache.thrift.protocol.TType;
-import org.apache.thrift.TFieldIdEnum;
-import thrift.test.*;
-
-public class MetaDataTest {
-  public static void main(String[] args) throws Exception {
-    Map<CrazyNesting._Fields, FieldMetaData> mdMap = CrazyNesting.metaDataMap;
-
-    // Check for struct fields existence
-    if (mdMap.size() != 3)
-      throw new RuntimeException("metadata map contains wrong number of entries!");
-    if (!mdMap.containsKey(CrazyNesting._Fields.SET_FIELD) || !mdMap.containsKey(CrazyNesting._Fields.LIST_FIELD) || !mdMap.containsKey(CrazyNesting._Fields.STRING_FIELD))
-      throw new RuntimeException("metadata map doesn't contain entry for a struct field!");
-
-    // Check for struct fields contents
-    if (!mdMap.get(CrazyNesting._Fields.STRING_FIELD).fieldName.equals("string_field") ||
-            !mdMap.get(CrazyNesting._Fields.LIST_FIELD).fieldName.equals("list_field") ||
-            !mdMap.get(CrazyNesting._Fields.SET_FIELD).fieldName.equals("set_field"))
-      throw new RuntimeException("metadata map contains a wrong fieldname");
-    if (mdMap.get(CrazyNesting._Fields.STRING_FIELD).requirementType != TFieldRequirementType.DEFAULT ||
-            mdMap.get(CrazyNesting._Fields.LIST_FIELD).requirementType != TFieldRequirementType.REQUIRED ||
-            mdMap.get(CrazyNesting._Fields.SET_FIELD).requirementType != TFieldRequirementType.OPTIONAL)
-      throw new RuntimeException("metadata map contains the wrong requirement type for a field");
-    if (mdMap.get(CrazyNesting._Fields.STRING_FIELD).valueMetaData.type != TType.STRING ||
-            mdMap.get(CrazyNesting._Fields.LIST_FIELD).valueMetaData.type != TType.LIST ||
-            mdMap.get(CrazyNesting._Fields.SET_FIELD).valueMetaData.type != TType.SET)
-      throw new RuntimeException("metadata map contains the wrong requirement type for a field");
-
-    // Check nested structures
-    if (!mdMap.get(CrazyNesting._Fields.LIST_FIELD).valueMetaData.isContainer())
-      throw new RuntimeException("value metadata for a list is stored as non-container!");
-    if (mdMap.get(CrazyNesting._Fields.LIST_FIELD).valueMetaData.isStruct())
-      throw new RuntimeException("value metadata for a list is stored as a struct!");
-    if (((MapMetaData)((ListMetaData)((SetMetaData)((MapMetaData)((MapMetaData)((ListMetaData)mdMap.get(CrazyNesting._Fields.LIST_FIELD).valueMetaData).elemMetaData).valueMetaData).valueMetaData).elemMetaData).elemMetaData).keyMetaData.type != TType.STRUCT)
-      throw new RuntimeException("metadata map contains wrong type for a value in a deeply nested structure");
-    if (((StructMetaData)((MapMetaData)((ListMetaData)((SetMetaData)((MapMetaData)((MapMetaData)((ListMetaData)mdMap.get(CrazyNesting._Fields.LIST_FIELD).valueMetaData).elemMetaData).valueMetaData).valueMetaData).elemMetaData).elemMetaData).keyMetaData).structClass != Insanity.class)
-      throw new RuntimeException("metadata map contains wrong class for a struct in a deeply nested structure");
-
-    // Check that FieldMetaData contains a map with metadata for all generated struct classes
-    if (FieldMetaData.getStructMetaDataMap(CrazyNesting.class) == null ||
-            FieldMetaData.getStructMetaDataMap(Insanity.class) == null ||
-            FieldMetaData.getStructMetaDataMap(Xtruct.class) == null)
-      throw new RuntimeException("global metadata map doesn't contain an entry for a known struct");
-    if (FieldMetaData.getStructMetaDataMap(CrazyNesting.class) != CrazyNesting.metaDataMap ||
-            FieldMetaData.getStructMetaDataMap(Insanity.class) != Insanity.metaDataMap)
-      throw new RuntimeException("global metadata map contains wrong entry for a loaded struct");    
-
-    for (Map.Entry<? extends TFieldIdEnum, FieldMetaData> mdEntry : mdMap.entrySet()) {
-      if (!CrazyNesting._Fields.findByName(mdEntry.getValue().fieldName).equals(mdEntry.getKey())) {
-        throw new RuntimeException("Field name map contained invalid Name <-> ID mapping");
-      }
-    }
-  }
-}
