diff --git a/jdwp/src/test/java/org/apache/harmony/jpda/tests/jdwp/ClassType/AbstractNewInstanceTestCase.java b/jdwp/src/test/java/org/apache/harmony/jpda/tests/jdwp/ClassType/AbstractNewInstanceTestCase.java
index faf7720..4120863 100644
--- a/jdwp/src/test/java/org/apache/harmony/jpda/tests/jdwp/ClassType/AbstractNewInstanceTestCase.java
+++ b/jdwp/src/test/java/org/apache/harmony/jpda/tests/jdwp/ClassType/AbstractNewInstanceTestCase.java
@@ -78,8 +78,9 @@
      * @param constructorSignature the constructor signature
      * @param provider the arguments provider
      * @param expectedTag the expected JDWP tag
+     * @return the tagged object returned by the constructor
      */
-    protected void checkNewInstanceTag(String typeSignature, String constructorSignature,
+    protected TaggedObject checkNewInstanceTag(String typeSignature, String constructorSignature,
             ConstructorArgumentsProvider provider, byte expectedTag) {
         synchronizer.receiveMessage(JPDADebuggeeSynchronizer.SGNL_READY);
 
@@ -144,5 +145,7 @@
 
         // Debuggee is suspended on the breakpoint: resume it now.
         resumeDebuggee();
+
+        return objectResult;
     }
 }
diff --git a/jdwp/src/test/java/org/apache/harmony/jpda/tests/jdwp/ClassType/NewInstanceStringTest.java b/jdwp/src/test/java/org/apache/harmony/jpda/tests/jdwp/ClassType/NewInstanceStringTest.java
index 751c953..ec618f0 100644
--- a/jdwp/src/test/java/org/apache/harmony/jpda/tests/jdwp/ClassType/NewInstanceStringTest.java
+++ b/jdwp/src/test/java/org/apache/harmony/jpda/tests/jdwp/ClassType/NewInstanceStringTest.java
@@ -19,6 +19,7 @@
 package org.apache.harmony.jpda.tests.jdwp.ClassType;
 
 import org.apache.harmony.jpda.tests.framework.jdwp.JDWPConstants;
+import org.apache.harmony.jpda.tests.framework.jdwp.TaggedObject;
 import org.apache.harmony.jpda.tests.framework.jdwp.Value;
 
 import java.util.List;
@@ -38,7 +39,7 @@
      * <code>java.lang.String()</code>.
      */
     public void testNewInstanceString_NoArgConstructor() {
-        runTestNewInstanceString("()V", new NoConstructorArgumentProvider());
+        runTestNewInstanceString("()V", "", new NoConstructorArgumentProvider());
     }
 
     /**
@@ -46,7 +47,7 @@
      * <code>java.lang.String(byte[])</code>.
      */
     public void testNewInstanceString_ByteArrayArgConstructor() {
-        runTestNewInstanceString("([B)V", new ConstructorArgumentsProvider() {
+        runTestNewInstanceString("([B)V", "my test string", new ConstructorArgumentsProvider() {
 
             @Override
             public void provideConstructorArguments(List<Value> constructorArguments) {
@@ -63,7 +64,7 @@
      * <code>java.lang.String(byte[], int, int)</code>.
      */
     public void testNewInstanceString_ByteArrayIntIntConstructor() {
-        runTestNewInstanceString("([BII)V", new ConstructorArgumentsProvider() {
+        runTestNewInstanceString("([BII)V", "m", new ConstructorArgumentsProvider() {
             @Override
             public void provideConstructorArguments(List<Value> constructorArguments) {
                 // Pass a reference to BYTE_ARRAY static field.
@@ -81,7 +82,8 @@
      * <code>java.lang.String(byte[], int, int, java.lang.String)</code>.
      */
     public void testNewInstanceString_ByteArrayIntIntStringConstructor() {
-        runTestNewInstanceString("([BIILjava/lang/String;)V", new ConstructorArgumentsProvider() {
+        runTestNewInstanceString("([BIILjava/lang/String;)V", "m",
+                new ConstructorArgumentsProvider() {
             @Override
             public void provideConstructorArguments(List<Value> constructorArguments) {
                 // Pass a reference to BYTE_ARRAY and STRING_CHARSET static
@@ -102,7 +104,8 @@
      * <code>java.lang.String(byte[], java.lang.String)</code>.
      */
     public void testNewInstanceString_ByteArrayStringConstructor() {
-        runTestNewInstanceString("([BLjava/lang/String;)V", new ConstructorArgumentsProvider() {
+        runTestNewInstanceString("([BLjava/lang/String;)V", "my test string",
+                new ConstructorArgumentsProvider() {
             @Override
             public void provideConstructorArguments(List<Value> constructorArguments) {
                 // Pass a reference to BYTE_ARRAY and STRING_CHARSET static
@@ -122,7 +125,7 @@
      * .
      */
     public void testNewInstanceString_ByteArrayIntIntCharsetConstructor() {
-        runTestNewInstanceString("([BIILjava/nio/charset/Charset;)V",
+        runTestNewInstanceString("([BIILjava/nio/charset/Charset;)V", "m",
                 new ConstructorArgumentsProvider() {
                     @Override
                     public void provideConstructorArguments(List<Value> constructorArguments) {
@@ -144,7 +147,7 @@
      * <code>java.lang.String(byte[], java.nio.charset.Charset)</code>.
      */
     public void testNewInstanceString_ByteArrayCharsetConstructor() {
-        runTestNewInstanceString("([BLjava/nio/charset/Charset;)V",
+        runTestNewInstanceString("([BLjava/nio/charset/Charset;)V", "my test string",
                 new ConstructorArgumentsProvider() {
                     @Override
                     public void provideConstructorArguments(List<Value> constructorArguments) {
@@ -164,7 +167,7 @@
      * <code>java.lang.String(char[])</code>.
      */
     public void testNewInstanceString_CharArrayConstructor() {
-        runTestNewInstanceString("([C)V", new ConstructorArgumentsProvider() {
+        runTestNewInstanceString("([C)V", "my test string", new ConstructorArgumentsProvider() {
             @Override
             public void provideConstructorArguments(List<Value> constructorArguments) {
                 // Pass a reference to CHAR_ARRAY static field.
@@ -180,7 +183,7 @@
      * <code>java.lang.String(char[], int, int)</code>.
      */
     public void testNewInstanceString_CharArrayIntIntConstructor() {
-        runTestNewInstanceString("([CII)V", new ConstructorArgumentsProvider() {
+        runTestNewInstanceString("([CII)V", "m", new ConstructorArgumentsProvider() {
             @Override
             public void provideConstructorArguments(List<Value> constructorArguments) {
                 // Pass a reference to CHAR_ARRAY static field.
@@ -198,7 +201,8 @@
      * <code>java.lang.String(java.lang.String)</code>.
      */
     public void testNewInstanceString_StringConstructor() {
-        runTestNewInstanceString("(Ljava/lang/String;)V", new ConstructorArgumentsProvider() {
+        runTestNewInstanceString("(Ljava/lang/String;)V", "my test string",
+                new ConstructorArgumentsProvider() {
             @Override
             public void provideConstructorArguments(List<Value> constructorArguments) {
                 // Pass a reference to TEST_STRING static field.
@@ -214,7 +218,8 @@
      * <code>java.lang.String(java.lang.StringBuffer)</code>.
      */
     public void testNewInstanceString_StringBufferConstructor() {
-        runTestNewInstanceString("(Ljava/lang/StringBuffer;)V", new ConstructorArgumentsProvider() {
+        runTestNewInstanceString("(Ljava/lang/StringBuffer;)V", "my test string",
+                new ConstructorArgumentsProvider() {
             @Override
             public void provideConstructorArguments(List<Value> constructorArguments) {
                 // Pass a reference to STRING_BUFFER static field.
@@ -230,7 +235,7 @@
      * <code>java.lang.String(int[], * int, int)</code>.
      */
     public void testNewInstanceString_IntArrayIntIntConstructor() {
-        runTestNewInstanceString("([III)V", new ConstructorArgumentsProvider() {
+        runTestNewInstanceString("([III)V", "m", new ConstructorArgumentsProvider() {
             @Override
             public void provideConstructorArguments(List<Value> constructorArguments) {
                 // Pass a reference to INT_ARRAY static field.
@@ -248,7 +253,7 @@
      * <code>java.lang.String(java.lang.StringBuilder)</code>.
      */
     public void testNewInstanceString_StringBuilderConstructor() {
-        runTestNewInstanceString("(Ljava/lang/StringBuilder;)V",
+        runTestNewInstanceString("(Ljava/lang/StringBuilder;)V", "my test string",
                 new ConstructorArgumentsProvider() {
                     @Override
                     public void provideConstructorArguments(List<Value> constructorArguments) {
@@ -264,10 +269,15 @@
     /**
      * Exercises ClassType.NewInstance command for java.lang.String.
      */
-    private void runTestNewInstanceString(String constructorSignature,
+    private void runTestNewInstanceString(String constructorSignature, String expectedString,
             ConstructorArgumentsProvider provider) {
-        checkNewInstanceTag("Ljava/lang/String;", constructorSignature, provider,
-                JDWPConstants.Tag.STRING_TAG);
+        TaggedObject result = checkNewInstanceTag("Ljava/lang/String;", constructorSignature,
+                provider, JDWPConstants.Tag.STRING_TAG);
+
+        // Get the character data out of the new String and check that it's expected.
+        String resultString = getStringValue(result.objectID);
+        assertString("ClassType::NewInstance command returned invalid string,",
+                expectedString, resultString);
     }
 
     private Value getStaticFieldValue(long classId, String fieldName) {
