You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@juneau.apache.org by ja...@apache.org on 2017/02/15 20:50:40 UTC

[1/8] incubator-juneau git commit: Modification to UON spec. Remove bean subtype support.

Repository: incubator-juneau
Updated Branches:
  refs/heads/master 268a3e37f -> 097b81032


http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/097b8103/juneau-rest-test/src/test/java/org/apache/juneau/rest/test/ContentTest.java
----------------------------------------------------------------------
diff --git a/juneau-rest-test/src/test/java/org/apache/juneau/rest/test/ContentTest.java b/juneau-rest-test/src/test/java/org/apache/juneau/rest/test/ContentTest.java
index 8a19e64..724a3dd 100644
--- a/juneau-rest-test/src/test/java/org/apache/juneau/rest/test/ContentTest.java
+++ b/juneau-rest-test/src/test/java/org/apache/juneau/rest/test/ContentTest.java
@@ -23,7 +23,7 @@ import org.apache.juneau.rest.client.*;
 import org.apache.juneau.urlencoding.*;
 import org.junit.*;
 
-public class ContentTest {
+public class ContentTest extends RestTestcase {
 
 	private static String URL = "/testContent";
 
@@ -41,18 +41,10 @@ public class ContentTest {
 		//	}
 		r = c.doPost(URL + "/boolean?body=true", null).getResponseAsString();
 		assertEquals("true", r);
-		r = c.doPost(URL + "/boolean?body=(true)", null).getResponseAsString();
-		assertEquals("true", r);
-		r = c.doPost(URL + "/boolean?body=$b(true)", null).getResponseAsString();
-		assertEquals("true", r);
 		r = c.doPost(URL + "/boolean?body=false", null).getResponseAsString();
 		assertEquals("false", r);
-		r = c.doPost(URL + "/boolean?body=(false)", null).getResponseAsString();
-		assertEquals("false", r);
-		r = c.doPost(URL + "/boolean?body=$b(false)", null).getResponseAsString();
-		assertEquals("false", r);
 		try {
-			r = c.doPost(URL + "/boolean?body=%00&noTrace=true", null).getResponseAsString();
+			r = c.doPost(URL + "/boolean?body=null&noTrace=true", null).getResponseAsString();
 			fail("Exception expected!");
 		} catch (RestCallException e) {
 			assertEquals(400, e.getResponseCode());
@@ -71,17 +63,9 @@ public class ContentTest {
 		//	}
 		r = c.doPost(URL + "/Boolean?body=true", null).getResponseAsString();
 		assertEquals("true", r);
-		r = c.doPost(URL + "/Boolean?body=(true)", null).getResponseAsString();
-		assertEquals("true", r);
-		r = c.doPost(URL + "/Boolean?body=$b(true)", null).getResponseAsString();
-		assertEquals("true", r);
 		r = c.doPost(URL + "/Boolean?body=false", null).getResponseAsString();
 		assertEquals("false", r);
-		r = c.doPost(URL + "/Boolean?body=(false)", null).getResponseAsString();
-		assertEquals("false", r);
-		r = c.doPost(URL + "/Boolean?body=$b(false)", null).getResponseAsString();
-		assertEquals("false", r);
-		r = c.doPost(URL + "/Boolean?body=%00", null).getResponseAsString();
+		r = c.doPost(URL + "/Boolean?body=null", null).getResponseAsString();
 		assertEquals("null", r);
 		try {
 			r = c.doPost(URL + "/Boolean?body=bad&noTrace=true", null).getResponseAsString();
@@ -96,12 +80,8 @@ public class ContentTest {
 		//	}
 		r = c.doPost(URL + "/int?body=-123", null).getResponseAsString();
 		assertEquals("-123", r);
-		r = c.doPost(URL + "/int?body=(-123)", null).getResponseAsString();
-		assertEquals("-123", r);
-		r = c.doPost(URL + "/int?body=$n(-123)", null).getResponseAsString();
-		assertEquals("-123", r);
 		try {
-			r = c.doPost(URL + "/int?body=%00&noTrace=true", null).getResponseAsString();
+			r = c.doPost(URL + "/int?body=null&noTrace=true", null).getResponseAsString();
 			fail("Exception expected!");
 		} catch (RestCallException e) {
 			assertEquals(400, e.getResponseCode());
@@ -119,11 +99,7 @@ public class ContentTest {
 		//	}
 		r = c.doPost(URL + "/Integer?body=-123", null).getResponseAsString();
 		assertEquals("-123", r);
-		r = c.doPost(URL + "/Integer?body=(-123)", null).getResponseAsString();
-		assertEquals("-123", r);
-		r = c.doPost(URL + "/Integer?body=$n(-123)", null).getResponseAsString();
-		assertEquals("-123", r);
-		r = c.doPost(URL + "/Integer?body=%00", null).getResponseAsString();
+		r = c.doPost(URL + "/Integer?body=null", null).getResponseAsString();
 		assertEquals("null", r);
 		try {
 			r = c.doPost(URL + "/Integer?body=bad&noTrace=true", null).getResponseAsString();
@@ -138,12 +114,8 @@ public class ContentTest {
 		//	}
 		r = c.doPost(URL + "/float?body=-1.23", null).getResponseAsString();
 		assertEquals("-1.23", r);
-		r = c.doPost(URL + "/float?body=(-1.23)", null).getResponseAsString();
-		assertEquals("-1.23", r);
-		r = c.doPost(URL + "/float?body=$n(-1.23)", null).getResponseAsString();
-		assertEquals("-1.23", r);
 		try {
-			r = c.doPost(URL + "/float?body=%00&noTrace=true", null).getResponseAsString();
+			r = c.doPost(URL + "/float?body=null&noTrace=true", null).getResponseAsString();
 			fail("Exception expected!");
 		} catch (RestCallException e) {
 			assertEquals(400, e.getResponseCode());
@@ -161,11 +133,7 @@ public class ContentTest {
 		//	}
 		r = c.doPost(URL + "/Float?body=-1.23", null).getResponseAsString();
 		assertEquals("-1.23", r);
-		r = c.doPost(URL + "/Float?body=(-1.23)", null).getResponseAsString();
-		assertEquals("-1.23", r);
-		r = c.doPost(URL + "/Float?body=$n(-1.23)", null).getResponseAsString();
-		assertEquals("-1.23", r);
-		r = c.doPost(URL + "/Float?body=%00", null).getResponseAsString();
+		r = c.doPost(URL + "/Float?body=null", null).getResponseAsString();
 		assertEquals("null", r);
 		try {
 			r = c.doPost(URL + "/Float?body=bad&noTrace=true", null).getResponseAsString();
@@ -180,7 +148,7 @@ public class ContentTest {
 		//	}
 		r = c.doPost(URL + "/Map?body=(a=b,c=d)", null).getResponseAsString();
 		assertEquals("{a:'b',c:'d'}", r);
-		r = c.doPost(URL + "/Map?body=%00", null).getResponseAsString();
+		r = c.doPost(URL + "/Map?body=null", null).getResponseAsString();
 		assertEquals("null", r);
 		try {
 			r = c.doPost(URL + "/Map?body=bad&noTrace=true", null).getResponseAsString();
@@ -196,8 +164,6 @@ public class ContentTest {
 		DTOs.B b = DTOs.B.create();
 		r = c.doPost(URL + "/B?body=" + UonSerializer.DEFAULT.serialize(b), null).getResponseAsString();
 		assertEquals("{f01:['a','b'],f02:['c','d'],f03:[1,2],f04:[3,4],f05:[['e','f'],['g','h']],f06:[['i','j'],['k','l']],f07:[{a:'a',b:1,c:true},{a:'a',b:1,c:true}],f08:[{a:'a',b:1,c:true},{a:'a',b:1,c:true}],f09:[[{a:'a',b:1,c:true}],[{a:'a',b:1,c:true}]],f10:[[{a:'a',b:1,c:true}],[{a:'a',b:1,c:true}]],f11:['a','b'],f12:['c','d'],f13:[1,2],f14:[3,4],f15:[['e','f'],['g','h']],f16:[['i','j'],['k','l']],f17:[{a:'a',b:1,c:true},{a:'a',b:1,c:true}],f18:[{a:'a',b:1,c:true},{a:'a',b:1,c:true}],f19:[[{a:'a',b:1,c:true}],[{a:'a',b:1,c:true}]],f20:[[{a:'a',b:1,c:true}],[{a:'a',b:1,c:true}]]}", r);
-		r = c.doPost(URL + "/B?body=" + UonSerializer.DEFAULT_SIMPLE.serialize(b), null).getResponseAsString();
-		assertEquals("{f01:['a','b'],f02:['c','d'],f03:[1,2],f04:[3,4],f05:[['e','f'],['g','h']],f06:[['i','j'],['k','l']],f07:[{a:'a',b:1,c:true},{a:'a',b:1,c:true}],f08:[{a:'a',b:1,c:true},{a:'a',b:1,c:true}],f09:[[{a:'a',b:1,c:true}],[{a:'a',b:1,c:true}]],f10:[[{a:'a',b:1,c:true}],[{a:'a',b:1,c:true}]],f11:['a','b'],f12:['c','d'],f13:[1,2],f14:[3,4],f15:[['e','f'],['g','h']],f16:[['i','j'],['k','l']],f17:[{a:'a',b:1,c:true},{a:'a',b:1,c:true}],f18:[{a:'a',b:1,c:true},{a:'a',b:1,c:true}],f19:[[{a:'a',b:1,c:true}],[{a:'a',b:1,c:true}]],f20:[[{a:'a',b:1,c:true}],[{a:'a',b:1,c:true}]]}", r);
 
 		//	@RestMethod(name="POST", path="/C")
 		//	public DTO2s.C testPojo2(@Body DTO2s.C c) {
@@ -206,8 +172,6 @@ public class ContentTest {
 		DTOs.C x = DTOs.C.create();
 		r = c.doPost(URL + "/C?body=" + UonSerializer.DEFAULT.serialize(x), null).getResponseAsString();
 		assertEquals("{f01:['a','b'],f02:['c','d'],f03:[1,2],f04:[3,4],f05:[['e','f'],['g','h']],f06:[['i','j'],['k','l']],f07:[{a:'a',b:1,c:true},{a:'a',b:1,c:true}],f08:[{a:'a',b:1,c:true},{a:'a',b:1,c:true}],f09:[[{a:'a',b:1,c:true}],[{a:'a',b:1,c:true}]],f10:[[{a:'a',b:1,c:true}],[{a:'a',b:1,c:true}]],f11:['a','b'],f12:['c','d'],f13:[1,2],f14:[3,4],f15:[['e','f'],['g','h']],f16:[['i','j'],['k','l']],f17:[{a:'a',b:1,c:true},{a:'a',b:1,c:true}],f18:[{a:'a',b:1,c:true},{a:'a',b:1,c:true}],f19:[[{a:'a',b:1,c:true}],[{a:'a',b:1,c:true}]],f20:[[{a:'a',b:1,c:true}],[{a:'a',b:1,c:true}]]}", r);
-		r = c.doPost(URL + "/C?body=" + UonSerializer.DEFAULT_SIMPLE.serialize(x), null).getResponseAsString();
-		assertEquals("{f01:['a','b'],f02:['c','d'],f03:[1,2],f04:[3,4],f05:[['e','f'],['g','h']],f06:[['i','j'],['k','l']],f07:[{a:'a',b:1,c:true},{a:'a',b:1,c:true}],f08:[{a:'a',b:1,c:true},{a:'a',b:1,c:true}],f09:[[{a:'a',b:1,c:true}],[{a:'a',b:1,c:true}]],f10:[[{a:'a',b:1,c:true}],[{a:'a',b:1,c:true}]],f11:['a','b'],f12:['c','d'],f13:[1,2],f14:[3,4],f15:[['e','f'],['g','h']],f16:[['i','j'],['k','l']],f17:[{a:'a',b:1,c:true},{a:'a',b:1,c:true}],f18:[{a:'a',b:1,c:true},{a:'a',b:1,c:true}],f19:[[{a:'a',b:1,c:true}],[{a:'a',b:1,c:true}]],f20:[[{a:'a',b:1,c:true}],[{a:'a',b:1,c:true}]]}", r);
 
 		c.closeQuietly();
 	}
@@ -524,18 +488,10 @@ public class ContentTest {
 		//	}
 		r = c.doPost(URL + "/boolean", "true").getResponseAsString();
 		assertEquals("true", r);
-		r = c.doPost(URL + "/boolean", "(true)").getResponseAsString();
-		assertEquals("true", r);
-		r = c.doPost(URL + "/boolean", "$b(true)").getResponseAsString();
-		assertEquals("true", r);
 		r = c.doPost(URL + "/boolean", "false").getResponseAsString();
 		assertEquals("false", r);
-		r = c.doPost(URL + "/boolean", "(false)").getResponseAsString();
-		assertEquals("false", r);
-		r = c.doPost(URL + "/boolean", "$b(false)").getResponseAsString();
-		assertEquals("false", r);
 		try {
-			r = c.doPost(URL + "/boolean?noTrace=true", "%00").getResponseAsString();
+			r = c.doPost(URL + "/boolean?noTrace=true", "null").getResponseAsString();
 			fail("Exception expected!");
 		} catch (RestCallException e) {
 			assertEquals(400, e.getResponseCode());
@@ -554,17 +510,9 @@ public class ContentTest {
 		//	}
 		r = c.doPost(URL + "/Boolean", "true").getResponseAsString();
 		assertEquals("true", r);
-		r = c.doPost(URL + "/Boolean", "(true)").getResponseAsString();
-		assertEquals("true", r);
-		r = c.doPost(URL + "/Boolean", "$b(true)").getResponseAsString();
-		assertEquals("true", r);
 		r = c.doPost(URL + "/Boolean", "false").getResponseAsString();
 		assertEquals("false", r);
-		r = c.doPost(URL + "/Boolean", "(false)").getResponseAsString();
-		assertEquals("false", r);
-		r = c.doPost(URL + "/Boolean", "$b(false)").getResponseAsString();
-		assertEquals("false", r);
-		r = c.doPost(URL + "/Boolean", "\u0000").getResponseAsString();
+		r = c.doPost(URL + "/Boolean", "null").getResponseAsString();
 		assertEquals("null", r);
 		try {
 			r = c.doPost(URL + "/Boolean?noTrace=true", "bad").getResponseAsString();
@@ -579,12 +527,8 @@ public class ContentTest {
 		//	}
 		r = c.doPost(URL + "/int", "-123").getResponseAsString();
 		assertEquals("-123", r);
-		r = c.doPost(URL + "/int", "(-123)").getResponseAsString();
-		assertEquals("-123", r);
-		r = c.doPost(URL + "/int", "$n(-123)").getResponseAsString();
-		assertEquals("-123", r);
 		try {
-			r = c.doPost(URL + "/int?noTrace=true", "%00").getResponseAsString();
+			r = c.doPost(URL + "/int?noTrace=true", "null").getResponseAsString();
 			fail("Exception expected!");
 		} catch (RestCallException e) {
 			assertEquals(400, e.getResponseCode());
@@ -602,11 +546,7 @@ public class ContentTest {
 		//	}
 		r = c.doPost(URL + "/Integer", "-123").getResponseAsString();
 		assertEquals("-123", r);
-		r = c.doPost(URL + "/Integer", "(-123)").getResponseAsString();
-		assertEquals("-123", r);
-		r = c.doPost(URL + "/Integer", "$n(-123)").getResponseAsString();
-		assertEquals("-123", r);
-		r = c.doPost(URL + "/Integer", "\u0000").getResponseAsString();
+		r = c.doPost(URL + "/Integer", "null").getResponseAsString();
 		assertEquals("null", r);
 		try {
 			r = c.doPost(URL + "/Integer?noTrace=true", "bad").getResponseAsString();
@@ -621,12 +561,8 @@ public class ContentTest {
 		//	}
 		r = c.doPost(URL + "/float", "-1.23").getResponseAsString();
 		assertEquals("-1.23", r);
-		r = c.doPost(URL + "/float", "(-1.23)").getResponseAsString();
-		assertEquals("-1.23", r);
-		r = c.doPost(URL + "/float", "$n(-1.23)").getResponseAsString();
-		assertEquals("-1.23", r);
 		try {
-			r = c.doPost(URL + "/float?noTrace=true", "\u0000").getResponseAsString();
+			r = c.doPost(URL + "/float?noTrace=true", "null").getResponseAsString();
 			fail("Exception expected!");
 		} catch (RestCallException e) {
 			assertEquals(400, e.getResponseCode());
@@ -644,11 +580,7 @@ public class ContentTest {
 		//	}
 		r = c.doPost(URL + "/Float", "-1.23").getResponseAsString();
 		assertEquals("-1.23", r);
-		r = c.doPost(URL + "/Float", "(-1.23)").getResponseAsString();
-		assertEquals("-1.23", r);
-		r = c.doPost(URL + "/Float", "$n(-1.23)").getResponseAsString();
-		assertEquals("-1.23", r);
-		r = c.doPost(URL + "/Float", "\u0000").getResponseAsString();
+		r = c.doPost(URL + "/Float", "null").getResponseAsString();
 		assertEquals("null", r);
 		try {
 			r = c.doPost(URL + "/Float?noTrace=true", "bad").getResponseAsString();
@@ -663,7 +595,7 @@ public class ContentTest {
 		//	}
 		r = c.doPost(URL + "/Map", "(a=b,c=d)").getResponseAsString();
 		assertEquals("{a:'b',c:'d'}", r);
-		r = c.doPost(URL + "/Map", "\u0000").getResponseAsString();
+		r = c.doPost(URL + "/Map", "null").getResponseAsString();
 		assertEquals("null", r);
 		try {
 			r = c.doPost(URL + "/Map?noTrace=true", "bad").getResponseAsString();
@@ -679,8 +611,6 @@ public class ContentTest {
 		DTOs.B b = DTOs.B.create();
 		r = c.doPost(URL + "/B", "" + UonSerializer.DEFAULT.serialize(b)).getResponseAsString();
 		assertEquals("{f01:['a','b'],f02:['c','d'],f03:[1,2],f04:[3,4],f05:[['e','f'],['g','h']],f06:[['i','j'],['k','l']],f07:[{a:'a',b:1,c:true},{a:'a',b:1,c:true}],f08:[{a:'a',b:1,c:true},{a:'a',b:1,c:true}],f09:[[{a:'a',b:1,c:true}],[{a:'a',b:1,c:true}]],f10:[[{a:'a',b:1,c:true}],[{a:'a',b:1,c:true}]],f11:['a','b'],f12:['c','d'],f13:[1,2],f14:[3,4],f15:[['e','f'],['g','h']],f16:[['i','j'],['k','l']],f17:[{a:'a',b:1,c:true},{a:'a',b:1,c:true}],f18:[{a:'a',b:1,c:true},{a:'a',b:1,c:true}],f19:[[{a:'a',b:1,c:true}],[{a:'a',b:1,c:true}]],f20:[[{a:'a',b:1,c:true}],[{a:'a',b:1,c:true}]]}", r);
-		r = c.doPost(URL + "/B", "" + UonSerializer.DEFAULT_SIMPLE.serialize(b)).getResponseAsString();
-		assertEquals("{f01:['a','b'],f02:['c','d'],f03:[1,2],f04:[3,4],f05:[['e','f'],['g','h']],f06:[['i','j'],['k','l']],f07:[{a:'a',b:1,c:true},{a:'a',b:1,c:true}],f08:[{a:'a',b:1,c:true},{a:'a',b:1,c:true}],f09:[[{a:'a',b:1,c:true}],[{a:'a',b:1,c:true}]],f10:[[{a:'a',b:1,c:true}],[{a:'a',b:1,c:true}]],f11:['a','b'],f12:['c','d'],f13:[1,2],f14:[3,4],f15:[['e','f'],['g','h']],f16:[['i','j'],['k','l']],f17:[{a:'a',b:1,c:true},{a:'a',b:1,c:true}],f18:[{a:'a',b:1,c:true},{a:'a',b:1,c:true}],f19:[[{a:'a',b:1,c:true}],[{a:'a',b:1,c:true}]],f20:[[{a:'a',b:1,c:true}],[{a:'a',b:1,c:true}]]}", r);
 
 		//	@RestMethod(name="POST", path="/C")
 		//	public DTO2s.C testPojo2(@Body DTO2s.C c) {
@@ -689,8 +619,6 @@ public class ContentTest {
 		DTOs.C x = DTOs.C.create();
 		r = c.doPost(URL + "/C", "" + UonSerializer.DEFAULT.serialize(x)).getResponseAsString();
 		assertEquals("{f01:['a','b'],f02:['c','d'],f03:[1,2],f04:[3,4],f05:[['e','f'],['g','h']],f06:[['i','j'],['k','l']],f07:[{a:'a',b:1,c:true},{a:'a',b:1,c:true}],f08:[{a:'a',b:1,c:true},{a:'a',b:1,c:true}],f09:[[{a:'a',b:1,c:true}],[{a:'a',b:1,c:true}]],f10:[[{a:'a',b:1,c:true}],[{a:'a',b:1,c:true}]],f11:['a','b'],f12:['c','d'],f13:[1,2],f14:[3,4],f15:[['e','f'],['g','h']],f16:[['i','j'],['k','l']],f17:[{a:'a',b:1,c:true},{a:'a',b:1,c:true}],f18:[{a:'a',b:1,c:true},{a:'a',b:1,c:true}],f19:[[{a:'a',b:1,c:true}],[{a:'a',b:1,c:true}]],f20:[[{a:'a',b:1,c:true}],[{a:'a',b:1,c:true}]]}", r);
-		r = c.doPost(URL + "/C", "" + UonSerializer.DEFAULT_SIMPLE.serialize(x)).getResponseAsString();
-		assertEquals("{f01:['a','b'],f02:['c','d'],f03:[1,2],f04:[3,4],f05:[['e','f'],['g','h']],f06:[['i','j'],['k','l']],f07:[{a:'a',b:1,c:true},{a:'a',b:1,c:true}],f08:[{a:'a',b:1,c:true},{a:'a',b:1,c:true}],f09:[[{a:'a',b:1,c:true}],[{a:'a',b:1,c:true}]],f10:[[{a:'a',b:1,c:true}],[{a:'a',b:1,c:true}]],f11:['a','b'],f12:['c','d'],f13:[1,2],f14:[3,4],f15:[['e','f'],['g','h']],f16:[['i','j'],['k','l']],f17:[{a:'a',b:1,c:true},{a:'a',b:1,c:true}],f18:[{a:'a',b:1,c:true},{a:'a',b:1,c:true}],f19:[[{a:'a',b:1,c:true}],[{a:'a',b:1,c:true}]],f20:[[{a:'a',b:1,c:true}],[{a:'a',b:1,c:true}]]}", r);
 
 		c.closeQuietly();
 	}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/097b8103/juneau-rest-test/src/test/java/org/apache/juneau/rest/test/DefaultContentTypesTest.java
----------------------------------------------------------------------
diff --git a/juneau-rest-test/src/test/java/org/apache/juneau/rest/test/DefaultContentTypesTest.java b/juneau-rest-test/src/test/java/org/apache/juneau/rest/test/DefaultContentTypesTest.java
index a508ee2..aa662d8 100644
--- a/juneau-rest-test/src/test/java/org/apache/juneau/rest/test/DefaultContentTypesTest.java
+++ b/juneau-rest-test/src/test/java/org/apache/juneau/rest/test/DefaultContentTypesTest.java
@@ -21,7 +21,7 @@ import org.apache.juneau.rest.client.*;
 import org.junit.*;
 
 
-public class DefaultContentTypesTest {
+public class DefaultContentTypesTest extends RestTestcase {
 
 	private static String URL = "/testDefaultContentTypes";
 	private static boolean debug = false;

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/097b8103/juneau-rest-test/src/test/java/org/apache/juneau/rest/test/ErrorConditionsTest.java
----------------------------------------------------------------------
diff --git a/juneau-rest-test/src/test/java/org/apache/juneau/rest/test/ErrorConditionsTest.java b/juneau-rest-test/src/test/java/org/apache/juneau/rest/test/ErrorConditionsTest.java
index 46d0f69..7a6f7ce 100644
--- a/juneau-rest-test/src/test/java/org/apache/juneau/rest/test/ErrorConditionsTest.java
+++ b/juneau-rest-test/src/test/java/org/apache/juneau/rest/test/ErrorConditionsTest.java
@@ -22,7 +22,7 @@ import org.apache.juneau.rest.client.*;
 import org.junit.*;
 
 
-public class ErrorConditionsTest {
+public class ErrorConditionsTest extends RestTestcase {
 
 	private static String URL = "/testErrorConditions";
 	private static boolean debug = false;

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/097b8103/juneau-rest-test/src/test/java/org/apache/juneau/rest/test/GroupsTest.java
----------------------------------------------------------------------
diff --git a/juneau-rest-test/src/test/java/org/apache/juneau/rest/test/GroupsTest.java b/juneau-rest-test/src/test/java/org/apache/juneau/rest/test/GroupsTest.java
index f28f051..ad0d052 100644
--- a/juneau-rest-test/src/test/java/org/apache/juneau/rest/test/GroupsTest.java
+++ b/juneau-rest-test/src/test/java/org/apache/juneau/rest/test/GroupsTest.java
@@ -23,7 +23,7 @@ import org.apache.juneau.rest.client.*;
 import org.junit.*;
 
 
-public class GroupsTest {
+public class GroupsTest extends RestTestcase {
 
 	private static String URL = "/testGroups";
 	private static boolean debug = false;

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/097b8103/juneau-rest-test/src/test/java/org/apache/juneau/rest/test/GzipTest.java
----------------------------------------------------------------------
diff --git a/juneau-rest-test/src/test/java/org/apache/juneau/rest/test/GzipTest.java b/juneau-rest-test/src/test/java/org/apache/juneau/rest/test/GzipTest.java
index d73fdb6..4869b64 100644
--- a/juneau-rest-test/src/test/java/org/apache/juneau/rest/test/GzipTest.java
+++ b/juneau-rest-test/src/test/java/org/apache/juneau/rest/test/GzipTest.java
@@ -30,7 +30,7 @@ import org.junit.*;
  * Note:  WAS does automatic gzip decompression on http request messages, so we have to invent
  * 	our own 'mycoding' compression.
  */
-public class GzipTest {
+public class GzipTest extends RestTestcase {
 
 	private static boolean debug = false;
 

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/097b8103/juneau-rest-test/src/test/java/org/apache/juneau/rest/test/InheritanceTest.java
----------------------------------------------------------------------
diff --git a/juneau-rest-test/src/test/java/org/apache/juneau/rest/test/InheritanceTest.java b/juneau-rest-test/src/test/java/org/apache/juneau/rest/test/InheritanceTest.java
index 93500c7..25acda5 100644
--- a/juneau-rest-test/src/test/java/org/apache/juneau/rest/test/InheritanceTest.java
+++ b/juneau-rest-test/src/test/java/org/apache/juneau/rest/test/InheritanceTest.java
@@ -18,7 +18,7 @@ import org.apache.juneau.json.*;
 import org.apache.juneau.rest.client.*;
 import org.junit.*;
 
-public class InheritanceTest {
+public class InheritanceTest extends RestTestcase {
 
 	private static RestClient client;
 

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/097b8103/juneau-rest-test/src/test/java/org/apache/juneau/rest/test/LargePojosTest.java
----------------------------------------------------------------------
diff --git a/juneau-rest-test/src/test/java/org/apache/juneau/rest/test/LargePojosTest.java b/juneau-rest-test/src/test/java/org/apache/juneau/rest/test/LargePojosTest.java
index f9e8414..dc5c944 100644
--- a/juneau-rest-test/src/test/java/org/apache/juneau/rest/test/LargePojosTest.java
+++ b/juneau-rest-test/src/test/java/org/apache/juneau/rest/test/LargePojosTest.java
@@ -20,7 +20,7 @@ import org.apache.juneau.xml.*;
 import org.junit.*;
 
 @Ignore
-public class LargePojosTest {
+public class LargePojosTest extends RestTestcase {
 
 	private static String URL = "/testLargePojos";
 	boolean debug = false;

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/097b8103/juneau-rest-test/src/test/java/org/apache/juneau/rest/test/MessagesTest.java
----------------------------------------------------------------------
diff --git a/juneau-rest-test/src/test/java/org/apache/juneau/rest/test/MessagesTest.java b/juneau-rest-test/src/test/java/org/apache/juneau/rest/test/MessagesTest.java
index 7201784..e833de7 100644
--- a/juneau-rest-test/src/test/java/org/apache/juneau/rest/test/MessagesTest.java
+++ b/juneau-rest-test/src/test/java/org/apache/juneau/rest/test/MessagesTest.java
@@ -23,7 +23,7 @@ import org.junit.*;
 /**
  * Validates that resource bundles can be defined on both parent and child classes.
  */
-public class MessagesTest {
+public class MessagesTest extends RestTestcase {
 
 	//====================================================================================================
 	// Return contents of resource bundle.

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/097b8103/juneau-rest-test/src/test/java/org/apache/juneau/rest/test/NlsPropertyTest.java
----------------------------------------------------------------------
diff --git a/juneau-rest-test/src/test/java/org/apache/juneau/rest/test/NlsPropertyTest.java b/juneau-rest-test/src/test/java/org/apache/juneau/rest/test/NlsPropertyTest.java
index 770eaf9..ddd9c5d 100644
--- a/juneau-rest-test/src/test/java/org/apache/juneau/rest/test/NlsPropertyTest.java
+++ b/juneau-rest-test/src/test/java/org/apache/juneau/rest/test/NlsPropertyTest.java
@@ -18,7 +18,7 @@ import org.apache.juneau.plaintext.*;
 import org.apache.juneau.rest.client.*;
 import org.junit.*;
 
-public class NlsPropertyTest {
+public class NlsPropertyTest extends RestTestcase {
 
 	private static String URL = "/testNlsProperty";
 

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/097b8103/juneau-rest-test/src/test/java/org/apache/juneau/rest/test/NlsTest.java
----------------------------------------------------------------------
diff --git a/juneau-rest-test/src/test/java/org/apache/juneau/rest/test/NlsTest.java b/juneau-rest-test/src/test/java/org/apache/juneau/rest/test/NlsTest.java
index 3013a10..6869df8 100644
--- a/juneau-rest-test/src/test/java/org/apache/juneau/rest/test/NlsTest.java
+++ b/juneau-rest-test/src/test/java/org/apache/juneau/rest/test/NlsTest.java
@@ -19,7 +19,7 @@ import org.apache.juneau.json.*;
 import org.apache.juneau.rest.client.*;
 import org.junit.*;
 
-public class NlsTest {
+public class NlsTest extends RestTestcase {
 
 	private static String URL = "/testNls";
 

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/097b8103/juneau-rest-test/src/test/java/org/apache/juneau/rest/test/NoParserInputTest.java
----------------------------------------------------------------------
diff --git a/juneau-rest-test/src/test/java/org/apache/juneau/rest/test/NoParserInputTest.java b/juneau-rest-test/src/test/java/org/apache/juneau/rest/test/NoParserInputTest.java
index 7219d05..b63d14a 100644
--- a/juneau-rest-test/src/test/java/org/apache/juneau/rest/test/NoParserInputTest.java
+++ b/juneau-rest-test/src/test/java/org/apache/juneau/rest/test/NoParserInputTest.java
@@ -20,7 +20,7 @@ import org.apache.juneau.plaintext.*;
 import org.apache.juneau.rest.client.*;
 import org.junit.*;
 
-public class NoParserInputTest {
+public class NoParserInputTest extends RestTestcase {
 
 	private static String URL = "/testNoParserInput";
 	private static boolean debug = false;

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/097b8103/juneau-rest-test/src/test/java/org/apache/juneau/rest/test/OnPostCallTest.java
----------------------------------------------------------------------
diff --git a/juneau-rest-test/src/test/java/org/apache/juneau/rest/test/OnPostCallTest.java b/juneau-rest-test/src/test/java/org/apache/juneau/rest/test/OnPostCallTest.java
index 91039cc..aa52ca6 100644
--- a/juneau-rest-test/src/test/java/org/apache/juneau/rest/test/OnPostCallTest.java
+++ b/juneau-rest-test/src/test/java/org/apache/juneau/rest/test/OnPostCallTest.java
@@ -19,7 +19,7 @@ import java.io.*;
 import org.apache.juneau.rest.client.*;
 import org.junit.*;
 
-public class OnPostCallTest {
+public class OnPostCallTest extends RestTestcase {
 
 	private static String URL = "/testOnPostCall";
 

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/097b8103/juneau-rest-test/src/test/java/org/apache/juneau/rest/test/OnPreCallTest.java
----------------------------------------------------------------------
diff --git a/juneau-rest-test/src/test/java/org/apache/juneau/rest/test/OnPreCallTest.java b/juneau-rest-test/src/test/java/org/apache/juneau/rest/test/OnPreCallTest.java
index eb845ec..8159dad 100644
--- a/juneau-rest-test/src/test/java/org/apache/juneau/rest/test/OnPreCallTest.java
+++ b/juneau-rest-test/src/test/java/org/apache/juneau/rest/test/OnPreCallTest.java
@@ -19,7 +19,7 @@ import java.io.*;
 import org.apache.juneau.rest.client.*;
 import org.junit.*;
 
-public class OnPreCallTest {
+public class OnPreCallTest extends RestTestcase {
 
 	private static String URL = "/testOnPreCall";
 

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/097b8103/juneau-rest-test/src/test/java/org/apache/juneau/rest/test/OptionsWithoutNlsTest.java
----------------------------------------------------------------------
diff --git a/juneau-rest-test/src/test/java/org/apache/juneau/rest/test/OptionsWithoutNlsTest.java b/juneau-rest-test/src/test/java/org/apache/juneau/rest/test/OptionsWithoutNlsTest.java
index 5774864..36529af 100644
--- a/juneau-rest-test/src/test/java/org/apache/juneau/rest/test/OptionsWithoutNlsTest.java
+++ b/juneau-rest-test/src/test/java/org/apache/juneau/rest/test/OptionsWithoutNlsTest.java
@@ -19,7 +19,7 @@ import org.apache.juneau.json.*;
 import org.apache.juneau.rest.client.*;
 import org.junit.*;
 
-public class OptionsWithoutNlsTest {
+public class OptionsWithoutNlsTest extends RestTestcase {
 
 	private static String URL = "/testOptionsWithoutNls";
 

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/097b8103/juneau-rest-test/src/test/java/org/apache/juneau/rest/test/OverlappingMethodsTest.java
----------------------------------------------------------------------
diff --git a/juneau-rest-test/src/test/java/org/apache/juneau/rest/test/OverlappingMethodsTest.java b/juneau-rest-test/src/test/java/org/apache/juneau/rest/test/OverlappingMethodsTest.java
index fff7a3f..4b4cb43 100644
--- a/juneau-rest-test/src/test/java/org/apache/juneau/rest/test/OverlappingMethodsTest.java
+++ b/juneau-rest-test/src/test/java/org/apache/juneau/rest/test/OverlappingMethodsTest.java
@@ -19,7 +19,7 @@ import static org.junit.Assert.*;
 import org.apache.juneau.rest.client.*;
 import org.junit.*;
 
-public class OverlappingMethodsTest {
+public class OverlappingMethodsTest extends RestTestcase {
 
 	private static String URL = "/testOverlappingMethods";
 	private static boolean debug = false;

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/097b8103/juneau-rest-test/src/test/java/org/apache/juneau/rest/test/ParamsTest.java
----------------------------------------------------------------------
diff --git a/juneau-rest-test/src/test/java/org/apache/juneau/rest/test/ParamsTest.java b/juneau-rest-test/src/test/java/org/apache/juneau/rest/test/ParamsTest.java
index fd42791..9e14c52 100644
--- a/juneau-rest-test/src/test/java/org/apache/juneau/rest/test/ParamsTest.java
+++ b/juneau-rest-test/src/test/java/org/apache/juneau/rest/test/ParamsTest.java
@@ -27,7 +27,7 @@ import org.apache.juneau.json.*;
 import org.apache.juneau.rest.client.*;
 import org.junit.*;
 
-public class ParamsTest {
+public class ParamsTest extends RestTestcase {
 
 	private static String URL = "/testParams";
 	private static boolean debug = false;
@@ -82,12 +82,12 @@ public class ParamsTest {
 		// This should match /get1/{foo} and not /get1/{foo}/{bar}
 		// NOTE:  When testing on Tomcat, must specify the following system property:
 		// -Dorg.apache.tomcat.util.buf.UDecoder.ALLOW_ENCODED_SLASH=true
-		String x = "x%2Fy+z";  // [x/y z]
+		String x = "x%2Fy";  // [x/y]
 		r = client.doGet(URL + "/get1/"+x);
-		assertEquals("GET /get1a x/y z", r.getResponse(String.class));
+		assertEquals("GET /get1a x/y", r.getResponse(String.class));
 
 		r = client.doGet(URL + "/get1/"+x+"/"+x);
-		assertEquals("GET /get1b x/y z,x/y z", r.getResponse(String.class));
+		assertEquals("GET /get1b x/y,x/y", r.getResponse(String.class));
 
 		r = client.doGet(URL + "/get1/foo");
 		assertEquals("GET /get1a foo", r.getResponse(String.class));
@@ -137,7 +137,7 @@ public class ParamsTest {
 		//	public void doPost(RestRequest req, RestResponse res, Person p) {
 		//		res.setOutput("POST, /person, name="+p.name+", age="+p.age+" remainder="+req.getRemainder());
 		//	}
-		r = client.doPost(URL + "/person/(name=John+Smith,birthDate=Jan+12~,+1952)", "");
+		r = client.doPost(URL + "/person/(name='John+Smith',birthDate='Jan+12,+1952')", "");
 		assertEquals("POST /person/{name=John Smith,birthDate.year=1952} remainder=null", r.getResponse(String.class));
 
 		// Fall through to top-level POST
@@ -218,11 +218,11 @@ public class ParamsTest {
 		String r;
 		String url = URL + "/testPlainParamGet";
 
-		r = client.doGet(url + "?p1=(p1)").getResponseAsString();
-		assertEquals("p1=[(p1),(p1),p1]", r);
+		r = client.doGet(url + "?p1=p1").getResponseAsString();
+		assertEquals("p1=[p1,p1,p1]", r);
 
-		r = client.doGet(url + "?p1=$s(p1)").getResponseAsString();
-		assertEquals("p1=[$s(p1),$s(p1),p1]", r);
+		r = client.doGet(url + "?p1='p1'").getResponseAsString();
+		assertEquals("p1=['p1','p1',p1]", r);
 
 		client.closeQuietly();
 	}
@@ -237,28 +237,28 @@ public class ParamsTest {
 		String url = URL + "/testParamPost";
 
 		r = client.doFormPost(url, new ObjectMap("{p1:'p1',p2:2}")).getResponseAsString();
-		assertEquals("p1=[p1,p1,p1],p2=[2,$n(2),2]", r);
+		assertEquals("p1=[p1,p1,p1],p2=[2,2,2]", r);
 
 		r = client.doFormPost(url, new ObjectMap("{p1:null,p2:0}")).getResponseAsString();
-		assertEquals("p1=[null,\u0000,null],p2=[0,$n(0),0]", r);
+		assertEquals("p1=[null,null,null],p2=[0,0,0]", r);
 
 		r = client.doFormPost(url, new ObjectMap("{}")).getResponseAsString();
 		assertEquals("p1=[null,null,null],p2=[0,null,0]", r);
 
 		r = client.doFormPost(url, new ObjectMap("{p1:null}")).getResponseAsString();
-		assertEquals("p1=[null,\u0000,null],p2=[0,null,0]", r);
+		assertEquals("p1=[null,null,null],p2=[0,null,0]", r);
 
 		r = client.doFormPost(url, new ObjectMap("{p2:0}")).getResponseAsString();
-		assertEquals("p1=[null,null,null],p2=[0,$n(0),0]", r);
+		assertEquals("p1=[null,null,null],p2=[0,0,0]", r);
 
 		r = client.doFormPost(url, new ObjectMap("{p1:'foo',p2:0}")).getResponseAsString();
-		assertEquals("p1=[foo,foo,foo],p2=[0,$n(0),0]", r);
+		assertEquals("p1=[foo,foo,foo],p2=[0,0,0]", r);
 
 		r = client.doFormPost(url, new ObjectMap("{p1:null,p2:1}")).getResponseAsString();
-		assertEquals("p1=[null,\u0000,null],p2=[1,$n(1),1]", r);
+		assertEquals("p1=[null,null,null],p2=[1,1,1]", r);
 
 		r = client.doFormPost(url, new ObjectMap("{p1:'a/b%c=d e,f/g%h=i j',p2:1}")).getResponseAsString();
-		assertEquals("p1=[a/b%c=d e,f/g%h=i j,a/b%c=d e,f/g%h=i j,a/b%c=d e,f/g%h=i j],p2=[1,$n(1),1]", r);
+		assertEquals("p1=[a/b%c=d e,f/g%h=i j,'a/b%c=d e,f/g%h=i j',a/b%c=d e,f/g%h=i j],p2=[1,1,1]", r);
 
 		client.closeQuietly();
 	}
@@ -273,18 +273,18 @@ public class ParamsTest {
 		String url = URL + "/testPlainParamPost";
 
 		List<NameValuePair> nvps = new ArrayList<NameValuePair>();
-		nvps.add(new BasicNameValuePair("p1", "(p1)"));
+		nvps.add(new BasicNameValuePair("p1", "p1"));
 		HttpEntity he = new UrlEncodedFormEntity(nvps);
 
 		r = client.doPost(url, he).getResponseAsString();
-		assertEquals("p1=[(p1),(p1),p1]", r);
+		assertEquals("p1=[p1,p1,p1]", r);
 
 		nvps = new ArrayList<NameValuePair>();
-		nvps.add(new BasicNameValuePair("p1", "$s(p1)"));
+		nvps.add(new BasicNameValuePair("p1", "'p1'"));
 		he = new UrlEncodedFormEntity(nvps);
 
 		r = client.doFormPost(url, he).getResponseAsString();
-		assertEquals("p1=[$s(p1),$s(p1),p1]", r);
+		assertEquals("p1=['p1','p1',p1]", r);
 
 		client.closeQuietly();
 	}
@@ -335,11 +335,11 @@ public class ParamsTest {
 		String r;
 		String url = URL + "/testPlainQParamGet";
 
-		r = client.doGet(url + "?p1=(p1)").getResponseAsString();
-		assertEquals("p1=[(p1),(p1),p1]", r);
+		r = client.doGet(url + "?p1=p1").getResponseAsString();
+		assertEquals("p1=[p1,p1,p1]", r);
 
-		r = client.doGet(url + "?p1=$s(p1)").getResponseAsString();
-		assertEquals("p1=[$s(p1),$s(p1),p1]", r);
+		r = client.doGet(url + "?p1='p1'").getResponseAsString();
+		assertEquals("p1=['p1','p1',p1]", r);
 
 		client.closeQuietly();
 	}
@@ -652,22 +652,22 @@ public class ParamsTest {
 			+ "&f02=c&f02=d"
 			+ "&f03=1&f03=2"
 			+ "&f04=3&f04=4"
-			+ "&f05=(e,f)&f05=(g,h)"
-			+ "&f06=(i,j)&f06=(k,l)"
+			+ "&f05=@(e,f)&f05=@(g,h)"
+			+ "&f06=@(i,j)&f06=@(k,l)"
 			+ "&f07=(a=a,b=1,c=true)&f07=(a=b,b=2,c=false)"
 			+ "&f08=(a=a,b=1,c=true)&f08=(a=b,b=2,c=false)"
-			+ "&f09=((a=a,b=1,c=true))&f09=((a=b,b=2,c=false))"
-			+ "&f10=((a=a,b=1,c=true))&f10=((a=b,b=2,c=false))"
+			+ "&f09=@((a=a,b=1,c=true))&f09=@((a=b,b=2,c=false))"
+			+ "&f10=@((a=a,b=1,c=true))&f10=@((a=b,b=2,c=false))"
 			+ "&f11=a&f11=b"
 			+ "&f12=c&f12=d"
 			+ "&f13=1&f13=2"
 			+ "&f14=3&f14=4"
-			+ "&f15=(e,f)&f15=(g,h)"
-			+ "&f16=(i,j)&f16=(k,l)"
+			+ "&f15=@(e,f)&f15=@(g,h)"
+			+ "&f16=@(i,j)&f16=@(k,l)"
 			+ "&f17=(a=a,b=1,c=true)&f17=(a=b,b=2,c=false)"
 			+ "&f18=(a=a,b=1,c=true)&f18=(a=b,b=2,c=false)"
-			+ "&f19=((a=a,b=1,c=true))&f19=((a=b,b=2,c=false))"
-			+ "&f20=((a=a,b=1,c=true))&f20=((a=b,b=2,c=false))";
+			+ "&f19=@((a=a,b=1,c=true))&f19=@((a=b,b=2,c=false))"
+			+ "&f20=@((a=a,b=1,c=true))&f20=@((a=b,b=2,c=false))";
 		r = client.doPost(url, new StringEntity(in)).getResponseAsString();
 		assertEquals(in, r);
 
@@ -692,22 +692,22 @@ public class ParamsTest {
 			+ "&f02=c&f02=d"
 			+ "&f03=1&f03=2"
 			+ "&f04=3&f04=4"
-			+ "&f05=(e,f)&f05=(g,h)"
-			+ "&f06=(i,j)&f06=(k,l)"
+			+ "&f05=@(e,f)&f05=@(g,h)"
+			+ "&f06=@(i,j)&f06=@(k,l)"
 			+ "&f07=(a=a,b=1,c=true)&f07=(a=b,b=2,c=false)"
 			+ "&f08=(a=a,b=1,c=true)&f08=(a=b,b=2,c=false)"
-			+ "&f09=((a=a,b=1,c=true))&f09=((a=b,b=2,c=false))"
-			+ "&f10=((a=a,b=1,c=true))&f10=((a=b,b=2,c=false))"
+			+ "&f09=@((a=a,b=1,c=true))&f09=@((a=b,b=2,c=false))"
+			+ "&f10=@((a=a,b=1,c=true))&f10=@((a=b,b=2,c=false))"
 			+ "&f11=a&f11=b"
 			+ "&f12=c&f12=d"
 			+ "&f13=1&f13=2"
 			+ "&f14=3&f14=4"
-			+ "&f15=(e,f)&f15=(g,h)"
-			+ "&f16=(i,j)&f16=(k,l)"
+			+ "&f15=@(e,f)&f15=@(g,h)"
+			+ "&f16=@(i,j)&f16=@(k,l)"
 			+ "&f17=(a=a,b=1,c=true)&f17=(a=b,b=2,c=false)"
 			+ "&f18=(a=a,b=1,c=true)&f18=(a=b,b=2,c=false)"
-			+ "&f19=((a=a,b=1,c=true))&f19=((a=b,b=2,c=false))"
-			+ "&f20=((a=a,b=1,c=true))&f20=((a=b,b=2,c=false))";
+			+ "&f19=@((a=a,b=1,c=true))&f19=@((a=b,b=2,c=false))"
+			+ "&f20=@((a=a,b=1,c=true))&f20=@((a=b,b=2,c=false))";
 		r = client.doPost(url, new StringEntity(in)).getResponseAsString();
 		assertEquals(in, r);
 

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/097b8103/juneau-rest-test/src/test/java/org/apache/juneau/rest/test/ParsersTest.java
----------------------------------------------------------------------
diff --git a/juneau-rest-test/src/test/java/org/apache/juneau/rest/test/ParsersTest.java b/juneau-rest-test/src/test/java/org/apache/juneau/rest/test/ParsersTest.java
index 8d2a0d4..48f86ce 100644
--- a/juneau-rest-test/src/test/java/org/apache/juneau/rest/test/ParsersTest.java
+++ b/juneau-rest-test/src/test/java/org/apache/juneau/rest/test/ParsersTest.java
@@ -20,7 +20,7 @@ import org.apache.juneau.plaintext.*;
 import org.apache.juneau.rest.client.*;
 import org.junit.*;
 
-public class ParsersTest {
+public class ParsersTest extends RestTestcase {
 
 	private static String URL = "/testParsers";
 	private static boolean debug = false;

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/097b8103/juneau-rest-test/src/test/java/org/apache/juneau/rest/test/PathTest.java
----------------------------------------------------------------------
diff --git a/juneau-rest-test/src/test/java/org/apache/juneau/rest/test/PathTest.java b/juneau-rest-test/src/test/java/org/apache/juneau/rest/test/PathTest.java
index 5af0423..733a685 100644
--- a/juneau-rest-test/src/test/java/org/apache/juneau/rest/test/PathTest.java
+++ b/juneau-rest-test/src/test/java/org/apache/juneau/rest/test/PathTest.java
@@ -18,7 +18,7 @@ import org.apache.juneau.json.*;
 import org.apache.juneau.rest.client.*;
 import org.junit.*;
 
-public class PathTest {
+public class PathTest extends RestTestcase {
 
 	private static String URL = "/testPath";
 

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/097b8103/juneau-rest-test/src/test/java/org/apache/juneau/rest/test/PathsTest.java
----------------------------------------------------------------------
diff --git a/juneau-rest-test/src/test/java/org/apache/juneau/rest/test/PathsTest.java b/juneau-rest-test/src/test/java/org/apache/juneau/rest/test/PathsTest.java
index 1561e27..4282a80 100644
--- a/juneau-rest-test/src/test/java/org/apache/juneau/rest/test/PathsTest.java
+++ b/juneau-rest-test/src/test/java/org/apache/juneau/rest/test/PathsTest.java
@@ -19,7 +19,7 @@ import org.apache.juneau.json.*;
 import org.apache.juneau.rest.client.*;
 import org.junit.*;
 
-public class PathsTest {
+public class PathsTest extends RestTestcase {
 
 	private static String URL = "/testPaths";
 

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/097b8103/juneau-rest-test/src/test/java/org/apache/juneau/rest/test/PropertiesTest.java
----------------------------------------------------------------------
diff --git a/juneau-rest-test/src/test/java/org/apache/juneau/rest/test/PropertiesTest.java b/juneau-rest-test/src/test/java/org/apache/juneau/rest/test/PropertiesTest.java
index ed4d6f5..67b827a 100644
--- a/juneau-rest-test/src/test/java/org/apache/juneau/rest/test/PropertiesTest.java
+++ b/juneau-rest-test/src/test/java/org/apache/juneau/rest/test/PropertiesTest.java
@@ -18,7 +18,7 @@ import org.apache.juneau.json.*;
 import org.apache.juneau.rest.client.*;
 import org.junit.*;
 
-public class PropertiesTest {
+public class PropertiesTest extends RestTestcase {
 
 	private static String URL = "/testProperties";
 

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/097b8103/juneau-rest-test/src/test/java/org/apache/juneau/rest/test/RestClientTest.java
----------------------------------------------------------------------
diff --git a/juneau-rest-test/src/test/java/org/apache/juneau/rest/test/RestClientTest.java b/juneau-rest-test/src/test/java/org/apache/juneau/rest/test/RestClientTest.java
index ad22033..7902f5b 100644
--- a/juneau-rest-test/src/test/java/org/apache/juneau/rest/test/RestClientTest.java
+++ b/juneau-rest-test/src/test/java/org/apache/juneau/rest/test/RestClientTest.java
@@ -23,7 +23,7 @@ import org.apache.juneau.json.*;
 import org.apache.juneau.rest.client.*;
 import org.junit.*;
 
-public class RestClientTest {
+public class RestClientTest extends RestTestcase {
 
 	private static String URL = "/testRestClient";
 

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/097b8103/juneau-rest-test/src/test/java/org/apache/juneau/rest/test/RestTestcase.java
----------------------------------------------------------------------
diff --git a/juneau-rest-test/src/test/java/org/apache/juneau/rest/test/RestTestcase.java b/juneau-rest-test/src/test/java/org/apache/juneau/rest/test/RestTestcase.java
new file mode 100644
index 0000000..70d4a5d
--- /dev/null
+++ b/juneau-rest-test/src/test/java/org/apache/juneau/rest/test/RestTestcase.java
@@ -0,0 +1,36 @@
+// ***************************************************************************************************************************
+// * 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.juneau.rest.test;
+
+import org.junit.*;
+
+/**
+ * Superclass of REST testcases that start up the REST test microservice before running the tests locally.
+ *
+ * @author James Bognar (james.bognar@salesforce.com)
+ */
+public class RestTestcase {
+
+	private static boolean microserviceStarted;
+
+	@BeforeClass
+	public static void setUp() {
+		microserviceStarted = TestMicroservice.startMicroservice();
+	}
+
+	@AfterClass
+	public static void tearDown() {
+		if (microserviceStarted)
+			TestMicroservice.stopMicroservice();
+	}
+}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/097b8103/juneau-rest-test/src/test/java/org/apache/juneau/rest/test/RestUtilsTest.java
----------------------------------------------------------------------
diff --git a/juneau-rest-test/src/test/java/org/apache/juneau/rest/test/RestUtilsTest.java b/juneau-rest-test/src/test/java/org/apache/juneau/rest/test/RestUtilsTest.java
index 45f0eb7..23ad14d 100644
--- a/juneau-rest-test/src/test/java/org/apache/juneau/rest/test/RestUtilsTest.java
+++ b/juneau-rest-test/src/test/java/org/apache/juneau/rest/test/RestUtilsTest.java
@@ -17,7 +17,7 @@ import static org.junit.Assert.*;
 
 import org.junit.*;
 
-public class RestUtilsTest {
+public class RestUtilsTest extends RestTestcase {
 
 	//====================================================================================================
 	// decode(String)

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/097b8103/juneau-rest-test/src/test/java/org/apache/juneau/rest/test/SerializersTest.java
----------------------------------------------------------------------
diff --git a/juneau-rest-test/src/test/java/org/apache/juneau/rest/test/SerializersTest.java b/juneau-rest-test/src/test/java/org/apache/juneau/rest/test/SerializersTest.java
index 515f384..ab0649c 100644
--- a/juneau-rest-test/src/test/java/org/apache/juneau/rest/test/SerializersTest.java
+++ b/juneau-rest-test/src/test/java/org/apache/juneau/rest/test/SerializersTest.java
@@ -20,7 +20,7 @@ import org.apache.juneau.json.*;
 import org.apache.juneau.rest.client.*;
 import org.junit.*;
 
-public class SerializersTest {
+public class SerializersTest extends RestTestcase {
 
 	private static String URL = "/testSerializers";
 	private static boolean debug = false;

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/097b8103/juneau-rest-test/src/test/java/org/apache/juneau/rest/test/StaticFilesTest.java
----------------------------------------------------------------------
diff --git a/juneau-rest-test/src/test/java/org/apache/juneau/rest/test/StaticFilesTest.java b/juneau-rest-test/src/test/java/org/apache/juneau/rest/test/StaticFilesTest.java
index e71510b..96e31f8 100644
--- a/juneau-rest-test/src/test/java/org/apache/juneau/rest/test/StaticFilesTest.java
+++ b/juneau-rest-test/src/test/java/org/apache/juneau/rest/test/StaticFilesTest.java
@@ -18,7 +18,7 @@ import org.apache.juneau.plaintext.*;
 import org.apache.juneau.rest.client.*;
 import org.junit.*;
 
-public class StaticFilesTest {
+public class StaticFilesTest extends RestTestcase {
 
 	private static String URL = "/testStaticFiles";
 

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/097b8103/juneau-rest-test/src/test/java/org/apache/juneau/rest/test/TestMicroservice.java
----------------------------------------------------------------------
diff --git a/juneau-rest-test/src/test/java/org/apache/juneau/rest/test/TestMicroservice.java b/juneau-rest-test/src/test/java/org/apache/juneau/rest/test/TestMicroservice.java
new file mode 100644
index 0000000..8c5300f
--- /dev/null
+++ b/juneau-rest-test/src/test/java/org/apache/juneau/rest/test/TestMicroservice.java
@@ -0,0 +1,60 @@
+// ***************************************************************************************************************************
+// * 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.juneau.rest.test;
+
+import java.util.*;
+
+import org.apache.juneau.microservice.*;
+
+/**
+ * Utility class for starting up the tests microservice.
+ * @author james.bognar
+ */
+public class TestMicroservice {
+	static Microservice microservice;
+
+	/**
+	 * Starts the microservice.
+	 * @return <jk>true</jk> if the service started, <jk>false</jk> if it's already started.
+	 * 	If this returns <jk>false</jk> then don't call stopMicroservice()!.
+	 */
+	public static boolean startMicroservice() {
+		if (microservice != null)
+			return false;
+		try {
+			Locale.setDefault(Locale.US);
+			microservice = new RestMicroservice()
+				.setConfig("juneau-rest-test.cfg", false)
+				.setManifestContents(
+					"Test-Entry: test-value"
+				);
+			microservice.start();
+			return true;
+		} catch (Throwable e) {
+			System.err.println(e); // NOT DEBUG
+			return false;
+		}
+	}
+
+	/**
+	 * Stops the microservice.
+	 */
+	public static void stopMicroservice() {
+		try {
+			microservice.stop();
+			microservice = null;
+		} catch (Exception e) {
+			System.err.println(e); // NOT DEBUG
+		}
+	}
+}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/097b8103/juneau-rest-test/src/test/java/org/apache/juneau/rest/test/TestUtils.java
----------------------------------------------------------------------
diff --git a/juneau-rest-test/src/test/java/org/apache/juneau/rest/test/TestUtils.java b/juneau-rest-test/src/test/java/org/apache/juneau/rest/test/TestUtils.java
index a1cd6c2..164a04e 100644
--- a/juneau-rest-test/src/test/java/org/apache/juneau/rest/test/TestUtils.java
+++ b/juneau-rest-test/src/test/java/org/apache/juneau/rest/test/TestUtils.java
@@ -44,7 +44,7 @@ public class TestUtils {
 	public static void checkErrorResponse(boolean debug, RestCallException e, int status, String...contains) throws AssertionFailedError {
 		String r = e.getResponseMessage();
 		if (debug) {
-			System.err.println(r);
+			System.err.println(r); // NOT DEBUG
 			e.printStackTrace();
 		}
 		if (status != e.getResponseCode())
@@ -52,7 +52,7 @@ public class TestUtils {
 		for (String s : contains) {
 			if (r == null || ! r.contains(s)) {
 				if (! debug)
-					System.err.println(r);
+					System.err.println(r); // NOT DEBUG
 				throw new AssertionFailedError(MessageFormat.format("Response did not have the following expected text: ''{0}''", s));
 			}
 		}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/097b8103/juneau-rest-test/src/test/java/org/apache/juneau/rest/test/TransformsTest.java
----------------------------------------------------------------------
diff --git a/juneau-rest-test/src/test/java/org/apache/juneau/rest/test/TransformsTest.java b/juneau-rest-test/src/test/java/org/apache/juneau/rest/test/TransformsTest.java
index aafc861..d758fd8 100644
--- a/juneau-rest-test/src/test/java/org/apache/juneau/rest/test/TransformsTest.java
+++ b/juneau-rest-test/src/test/java/org/apache/juneau/rest/test/TransformsTest.java
@@ -18,7 +18,7 @@ import org.apache.juneau.json.*;
 import org.apache.juneau.rest.client.*;
 import org.junit.*;
 
-public class TransformsTest {
+public class TransformsTest extends RestTestcase {
 
 	private static String URL = "/testTransforms";
 

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/097b8103/juneau-rest-test/src/test/java/org/apache/juneau/rest/test/UrisTest.java
----------------------------------------------------------------------
diff --git a/juneau-rest-test/src/test/java/org/apache/juneau/rest/test/UrisTest.java b/juneau-rest-test/src/test/java/org/apache/juneau/rest/test/UrisTest.java
index 673ef83..42ed4ab 100644
--- a/juneau-rest-test/src/test/java/org/apache/juneau/rest/test/UrisTest.java
+++ b/juneau-rest-test/src/test/java/org/apache/juneau/rest/test/UrisTest.java
@@ -24,7 +24,7 @@ import org.junit.*;
 /**
  * Verifies that all the RestRequest.getXXX() methods involving URIs work correctly.
  */
-public class UrisTest {
+public class UrisTest extends RestTestcase {
 
 	private static String URL2 = Constants.getServerTestUrl() + "/testuris";           // /jazz/juneau/sample/testuris
 	private static int port = getPort(Constants.getServerTestUrl());                  // 9443

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/097b8103/juneau-rest-test/src/test/java/org/apache/juneau/rest/test/UrlContentTest.java
----------------------------------------------------------------------
diff --git a/juneau-rest-test/src/test/java/org/apache/juneau/rest/test/UrlContentTest.java b/juneau-rest-test/src/test/java/org/apache/juneau/rest/test/UrlContentTest.java
index a4424b4..4ecee25 100644
--- a/juneau-rest-test/src/test/java/org/apache/juneau/rest/test/UrlContentTest.java
+++ b/juneau-rest-test/src/test/java/org/apache/juneau/rest/test/UrlContentTest.java
@@ -17,7 +17,7 @@ import static org.junit.Assert.*;
 import org.apache.juneau.rest.client.*;
 import org.junit.*;
 
-public class UrlContentTest {
+public class UrlContentTest extends RestTestcase {
 
 	private static String URL = "/testUrlContent";
 	private static RestClient client;

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/097b8103/juneau-rest-test/src/test/java/org/apache/juneau/rest/test/UrlPathPatternTest.java
----------------------------------------------------------------------
diff --git a/juneau-rest-test/src/test/java/org/apache/juneau/rest/test/UrlPathPatternTest.java b/juneau-rest-test/src/test/java/org/apache/juneau/rest/test/UrlPathPatternTest.java
index c122074..f577d5f 100644
--- a/juneau-rest-test/src/test/java/org/apache/juneau/rest/test/UrlPathPatternTest.java
+++ b/juneau-rest-test/src/test/java/org/apache/juneau/rest/test/UrlPathPatternTest.java
@@ -20,7 +20,7 @@ import org.apache.juneau.json.*;
 import org.apache.juneau.rest.*;
 import org.junit.*;
 
-public class UrlPathPatternTest {
+public class UrlPathPatternTest extends RestTestcase {
 	@Test
 	public void testComparison() throws Exception {
 		List<UrlPathPattern> l = new LinkedList<UrlPathPattern>();

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/097b8103/juneau-rest-test/src/test/java/org/apache/juneau/rest/test/_TestSuite.java
----------------------------------------------------------------------
diff --git a/juneau-rest-test/src/test/java/org/apache/juneau/rest/test/_TestSuite.java b/juneau-rest-test/src/test/java/org/apache/juneau/rest/test/_TestSuite.java
index 43f1b6e..2eb975c 100644
--- a/juneau-rest-test/src/test/java/org/apache/juneau/rest/test/_TestSuite.java
+++ b/juneau-rest-test/src/test/java/org/apache/juneau/rest/test/_TestSuite.java
@@ -12,9 +12,6 @@
 // ***************************************************************************************************************************
 package org.apache.juneau.rest.test;
 
-import java.util.*;
-
-import org.apache.juneau.microservice.*;
 import org.junit.*;
 import org.junit.runner.*;
 import org.junit.runners.*;
@@ -64,29 +61,14 @@ import org.junit.runners.Suite.*;
 	UrlPathPatternTest.class
 })
 public class _TestSuite {
-	static Microservice microservice;
 
 	@BeforeClass
 	public static void setUp() {
-		try {
-			Locale.setDefault(Locale.US);
-			microservice = new RestMicroservice()
-				.setConfig("juneau-rest-test.cfg", false)
-				.setManifestContents(
-					"Test-Entry: test-value"
-				);
-			microservice.start();
-		} catch (Exception e) {
-			throw new RuntimeException(e);
-		}
+		TestMicroservice.startMicroservice();
 	}
 
 	@AfterClass
 	public static void tearDown() {
-		try {
-			microservice.stop();
-		} catch (Exception e) {
-			throw new RuntimeException(e);
-		}
+		TestMicroservice.stopMicroservice();
 	}
 }

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/097b8103/juneau-rest/src/main/java/org/apache/juneau/rest/RestRequest.java
----------------------------------------------------------------------
diff --git a/juneau-rest/src/main/java/org/apache/juneau/rest/RestRequest.java b/juneau-rest/src/main/java/org/apache/juneau/rest/RestRequest.java
index 7269178..64a5a2a 100644
--- a/juneau-rest/src/main/java/org/apache/juneau/rest/RestRequest.java
+++ b/juneau-rest/src/main/java/org/apache/juneau/rest/RestRequest.java
@@ -761,9 +761,10 @@ public final class RestRequest extends HttpServletRequestWrapper {
 	 * 	<li>This method returns the raw unparsed value, and differs from calling <code>getFormDataParameter(name, String.<jk>class</js>)</code>
 	 * 		which will convert the value from UON notation:
 	 * 		<ul>
-	 * 			<li><js>"\u0000"</js> =&gt; <jk>null</jk>
-	 * 			<li><js>"$s(foo)"</js> =&gt; <js>"foo"</js>
-	 * 			<li><js>"(foo)"</js> =&gt; <js>"foo"</js>
+	 * 			<li><js>"null"</js> =&gt; <jk>null</jk>
+	 * 			<li><js>"'null'"</js> =&gt; <js>"null"</js>
+	 * 			<li><js>"'foo bar'"</js> =&gt; <js>"foo bar"</js>
+	 * 			<li><js>"foo~~bar"</js> =&gt; <js>"foo~bar"</js>
 	 * 		</ul>
 	 * </ul>
 	 *
@@ -1643,7 +1644,7 @@ public final class RestRequest extends HttpServletRequestWrapper {
 		ParserMatch pm = parserGroup.getParserMatch(mediaType);
 
 		// If no patching parser for URL-encoding, use the one defined on the servlet.
-		if (pm == null && mediaType.equals("application/x-www-form-urlencoded"))
+		if (pm == null && mediaType.equals(MediaType.URLENCODING))
 			pm = new ParserMatch(MediaType.URLENCODING, urlEncodingParser);
 
 		return pm;
@@ -1900,13 +1901,18 @@ public final class RestRequest extends HttpServletRequestWrapper {
 	private <T> T parseParameter(String val, ClassMeta<T> c) throws ParseException {
 		if (val == null)
 			return null;
-		// Shortcut - If we're returning a string and the value doesn't start with '$' or '(', then
+
+		// Shortcut - If we're returning a string and the value doesn't start with "'" or is "null", then
 		// just return the string since it's a plain value.
+		// This allows us to bypass the creation of a UonParserSession object.
 		if (c.getInnerClass() == String.class && val.length() > 0) {
 			char x = val.charAt(0);
-			if (x != '(' && x != '$' && x != '\u0000' && val.indexOf('~') == -1)
+			if (x != '\'' && x != 'n' && val.indexOf('~') == -1)
 				return (T)val;
+			if (x == 'n' && "null".equals(val))
+				return null;
 		}
+
 		return urlEncodingParser.parseParameter(val, c);
 	}
 

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/097b8103/juneau-rest/src/main/java/org/apache/juneau/rest/RestServletDefault.java
----------------------------------------------------------------------
diff --git a/juneau-rest/src/main/java/org/apache/juneau/rest/RestServletDefault.java b/juneau-rest/src/main/java/org/apache/juneau/rest/RestServletDefault.java
index f61c213..a95ae6d 100644
--- a/juneau-rest/src/main/java/org/apache/juneau/rest/RestServletDefault.java
+++ b/juneau-rest/src/main/java/org/apache/juneau/rest/RestServletDefault.java
@@ -78,21 +78,11 @@ import org.apache.juneau.xml.*;
  * 		<td>{@link UonSerializer}</td>
  * 	</tr>
  * 	<tr>
- * 		<td class='code'>text/uon-simple</td>
- * 		<td class='code'>text/uon</td>
- * 		<td>{@link org.apache.juneau.urlencoding.UonSerializer.Simple}</td>
- * 	</tr>
- * 	<tr>
  * 		<td class='code'>application/x-www-form-urlencoded</td>
  * 		<td class='code'>application/x-www-form-urlencoded</td>
  * 		<td>{@link UrlEncodingSerializer}</td>
  * 	</tr>
  * 	<tr>
- * 		<td class='code'>application/x-www-form-urlencoded-simple</td>
- * 		<td class='code'>application/x-www-form-urlencoded</td>
- * 		<td>{@link org.apache.juneau.urlencoding.UrlEncodingSerializer.Simple}</td>
- * 	</tr>
- * 	<tr>
  * 		<td class='code'>text/xml+soap</td>
  * 		<td class='code'>text/xml</td>
  * 		<td>{@link SoapXmlSerializer}</td>
@@ -178,9 +168,7 @@ import org.apache.juneau.xml.*;
 		XmlDocSerializer.class,
 		XmlSchemaDocSerializer.class,
 		UonSerializer.class,
-		UonSerializer.Simple.class,
 		UrlEncodingSerializer.class,
-		UrlEncodingSerializer.Simple.class,
 		MsgPackSerializer.class,
 		SoapXmlSerializer.class,
 		PlainTextSerializer.class,

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/097b8103/juneau-rest/src/main/java/org/apache/juneau/rest/jena/RestServletJenaDefault.java
----------------------------------------------------------------------
diff --git a/juneau-rest/src/main/java/org/apache/juneau/rest/jena/RestServletJenaDefault.java b/juneau-rest/src/main/java/org/apache/juneau/rest/jena/RestServletJenaDefault.java
index ce8823a..f2d7ae5 100644
--- a/juneau-rest/src/main/java/org/apache/juneau/rest/jena/RestServletJenaDefault.java
+++ b/juneau-rest/src/main/java/org/apache/juneau/rest/jena/RestServletJenaDefault.java
@@ -83,21 +83,11 @@ import org.apache.juneau.xml.*;
  * 		<td>{@link UonSerializer}</td>
  * 	</tr>
  * 	<tr>
- * 		<td class='code'>text/uon-simple</td>
- * 		<td class='code'>text/uon</td>
- * 		<td>{@link org.apache.juneau.urlencoding.UonSerializer.Simple}</td>
- * 	</tr>
- * 	<tr>
  * 		<td class='code'>application/x-www-form-urlencoded</td>
  * 		<td class='code'>application/x-www-form-urlencoded</td>
  * 		<td>{@link UrlEncodingSerializer}</td>
  * 	</tr>
  * 	<tr>
- * 		<td class='code'>application/x-www-form-urlencoded-simple</td>
- * 		<td class='code'>application/x-www-form-urlencoded</td>
- * 		<td>{@link org.apache.juneau.urlencoding.UrlEncodingSerializer.Simple}</td>
- * 	</tr>
- * 	<tr>
  * 		<td class='code'>text/xml+soap</td>
  * 		<td class='code'>text/xml</td>
  * 		<td>{@link SoapXmlSerializer}</td>
@@ -209,9 +199,7 @@ import org.apache.juneau.xml.*;
 		XmlDocSerializer.Simple.class,
 		XmlSchemaDocSerializer.class,
 		UonSerializer.class,
-		UonSerializer.Simple.class,
 		UrlEncodingSerializer.class,
-		UrlEncodingSerializer.Simple.class,
 		MsgPackSerializer.class,
 		SoapXmlSerializer.class,
 		JavaSerializedObjectSerializer.class,

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/097b8103/juneau-rest/src/main/java/org/apache/juneau/rest/response/DefaultHandler.java
----------------------------------------------------------------------
diff --git a/juneau-rest/src/main/java/org/apache/juneau/rest/response/DefaultHandler.java b/juneau-rest/src/main/java/org/apache/juneau/rest/response/DefaultHandler.java
index 1e1d1bd..52650e1 100644
--- a/juneau-rest/src/main/java/org/apache/juneau/rest/response/DefaultHandler.java
+++ b/juneau-rest/src/main/java/org/apache/juneau/rest/response/DefaultHandler.java
@@ -55,7 +55,7 @@ public class DefaultHandler implements ResponseHandler {
 			try {
 				ObjectMap p = res.getProperties();
 				if (req.isPlainText()) {
-					p.put(SerializerContext.SERIALIZER_useIndentation, true);
+					p.put(SerializerContext.SERIALIZER_useWhitespace, true);
 					res.setContentType("text/plain");
 				}
 				p.append("mediaType", mediaType).append("characterEncoding", res.getCharacterEncoding());


[4/8] incubator-juneau git commit: Modification to UON spec. Remove bean subtype support.

Posted by ja...@apache.org.
http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/097b8103/juneau-core/src/main/java/org/apache/juneau/json/JsonParser.java
----------------------------------------------------------------------
diff --git a/juneau-core/src/main/java/org/apache/juneau/json/JsonParser.java b/juneau-core/src/main/java/org/apache/juneau/json/JsonParser.java
index a897d1a..ac4a096 100644
--- a/juneau-core/src/main/java/org/apache/juneau/json/JsonParser.java
+++ b/juneau-core/src/main/java/org/apache/juneau/json/JsonParser.java
@@ -101,7 +101,6 @@ public final class JsonParser extends ReaderParser {
 		ClassMeta<?> sType = eType.getSerializedClassMeta();
 		session.setCurrentClass(sType);
 		String wrapperAttr = sType.getExtendedMeta(JsonClassMeta.class).getWrapperAttr();
-		BeanRegistry breg = pMeta == null ? session.getBeanRegistry() : pMeta.getBeanRegistry();
 
 		Object o = null;
 
@@ -124,7 +123,7 @@ public final class JsonParser extends ReaderParser {
 			if (c == '{') {
 				ObjectMap m2 = new ObjectMap(session);
 				parseIntoMap2(session, r, m2, string(), object(), pMeta);
-				o = breg.cast(m2);
+				o = session.cast(m2, pMeta, eType);
 			} else if (c == '[') {
 				o = parseIntoCollection2(session, r, new ObjectList(session), object(), pMeta);
 			} else if (c == '\'' || c == '"') {
@@ -155,7 +154,7 @@ public final class JsonParser extends ReaderParser {
 			if (c == '{') {
 				ObjectMap m = new ObjectMap(session);
 				parseIntoMap2(session, r, m, string(), object(), pMeta);
-				o = breg.cast(m);
+				o = session.cast(m, pMeta, eType);
 			} else {
 				Collection l = (sType.canCreateNewInstance(outer) ? (Collection)sType.newInstance() : new ObjectList(session));
 				o = parseIntoCollection2(session, r, l, sType.getElementType(), pMeta);
@@ -171,7 +170,7 @@ public final class JsonParser extends ReaderParser {
 			if (c == '{') {
 				ObjectMap m = new ObjectMap(session);
 				parseIntoMap2(session, r, m, string(), object(), pMeta);
-				o = breg.cast(m);
+				o = session.cast(m, pMeta, eType);
 			} else {
 				ArrayList l = (ArrayList)parseIntoCollection2(session, r, new ArrayList(), sType.getElementType(), pMeta);
 				o = session.toArray(sType, l);
@@ -180,7 +179,7 @@ public final class JsonParser extends ReaderParser {
 			Map m = new ObjectMap(session);
 			parseIntoMap2(session, r, m, sType.getKeyType(), sType.getValueType(), pMeta);
 			if (m.containsKey(session.getBeanTypePropertyName()))
-				o = breg.cast((ObjectMap)m);
+				o = session.cast((ObjectMap)m, pMeta, eType);
 			else
 				throw new ParseException(session, "Class ''{0}'' could not be instantiated.  Reason: ''{1}''", sType.getInnerClass().getName(), sType.getNotABeanReason());
 		} else if (sType.canCreateNewInstanceFromString(outer) && ! session.isStrict()) {
@@ -222,7 +221,7 @@ public final class JsonParser extends ReaderParser {
 			// Need to weed out octal and hexadecimal formats:  0123,-0123,0x123,-0x123.
 			// Don't weed out 0 or -0.
 			boolean isNegative = false;
-			char c = (s.length() == 0 ? 'x' : s.charAt(0));
+			char c = s.charAt(0);
 			if (c == '-') {
 				isNegative = true;
 				c = (s.length() == 1 ? 'x' : s.charAt(1));
@@ -505,13 +504,8 @@ public final class JsonParser extends ReaderParser {
 						BeanPropertyMeta pMeta = m.getPropertyMeta(currAttr);
 						session.setCurrentProperty(pMeta);
 						if (pMeta == null) {
-							if (m.getMeta().isSubTyped()) {
-								Object value = parseAnything(session, object(), r.unread(), m.getBean(false), null);
-								m.put(currAttr, value);
-							} else {
-								onUnknownProperty(session, currAttr, m, currAttrLine, currAttrCol);
-								parseAnything(session, object(), r.unread(), m.getBean(false), null); // Read content anyway to ignore it
-							}
+							onUnknownProperty(session, currAttr, m, currAttrLine, currAttrCol);
+							parseAnything(session, object(), r.unread(), m.getBean(false), null); // Read content anyway to ignore it
 						} else {
 							ClassMeta<?> cm = pMeta.getClassMeta();
 							Object value = parseAnything(session, cm, r.unread(), m.getBean(false), pMeta);

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/097b8103/juneau-core/src/main/java/org/apache/juneau/json/JsonSerializer.java
----------------------------------------------------------------------
diff --git a/juneau-core/src/main/java/org/apache/juneau/json/JsonSerializer.java b/juneau-core/src/main/java/org/apache/juneau/json/JsonSerializer.java
index 07121d3..3a89b68 100644
--- a/juneau-core/src/main/java/org/apache/juneau/json/JsonSerializer.java
+++ b/juneau-core/src/main/java/org/apache/juneau/json/JsonSerializer.java
@@ -113,7 +113,6 @@ public class JsonSerializer extends WriterSerializer {
 		/** Constructor */
 		public Readable() {
 			setUseWhitespace(true);
-			setUseIndentation(true);
 		}
 	}
 
@@ -132,7 +131,6 @@ public class JsonSerializer extends WriterSerializer {
 		/** Constructor */
 		public SimpleReadable() {
 			setUseWhitespace(true);
-			setUseIndentation(true);
 		}
 	}
 
@@ -162,7 +160,6 @@ public class JsonSerializer extends WriterSerializer {
 		if (eType == null)
 			eType = object();
 
-		boolean addTypeProperty;    // Add "_type" attribute to element?
 		ClassMeta<?> aType;			// The actual type
 		ClassMeta<?> sType;			// The serialized type
 
@@ -176,7 +173,7 @@ public class JsonSerializer extends WriterSerializer {
 		}
 
 		sType = aType.getSerializedClassMeta();
-		addTypeProperty = (session.isAddBeanTypeProperties() && ! eType.equals(aType));
+		String typeName = session.getBeanTypeName(eType, aType, pMeta);
 
 		// Swap if necessary
 		PojoSwap swap = aType.getPojoSwap();
@@ -201,12 +198,12 @@ public class JsonSerializer extends WriterSerializer {
 		else if (sType.isNumber() || sType.isBoolean())
 			out.append(o);
 		else if (sType.isBean())
-			serializeBeanMap(session, out, session.toBeanMap(o), addTypeProperty);
+			serializeBeanMap(session, out, session.toBeanMap(o), typeName);
 		else if (sType.isUri() || (pMeta != null && pMeta.isUri()))
 			out.q().appendUri(o).q();
 		else if (sType.isMap()) {
 			if (o instanceof BeanMap)
-				serializeBeanMap(session, out, (BeanMap)o, addTypeProperty);
+				serializeBeanMap(session, out, (BeanMap)o, typeName);
 			else
 				serializeMap(session, out, (Map)o, eType);
 		}
@@ -260,12 +257,12 @@ public class JsonSerializer extends WriterSerializer {
 		return out;
 	}
 
-	private SerializerWriter serializeBeanMap(JsonSerializerSession session, JsonWriter out, BeanMap<?> m, boolean addTypeProperty) throws Exception {
+	private SerializerWriter serializeBeanMap(JsonSerializerSession session, JsonWriter out, BeanMap<?> m, String typeName) throws Exception {
 		int depth = session.getIndent();
 		out.append('{');
 
 		boolean addComma = false;
-		for (BeanPropertyValue p : m.getValues(session.isTrimNulls(), addTypeProperty ? session.createBeanTypeNameProperty(m) : null)) {
+		for (BeanPropertyValue p : m.getValues(session.isTrimNulls(), typeName != null ? session.createBeanTypeNameProperty(m, typeName) : null)) {
 			BeanPropertyMeta pMeta = p.getMeta();
 			ClassMeta<?> cMeta = p.getClassMeta();
 			String key = p.getName();
@@ -373,32 +370,6 @@ public class JsonSerializer extends WriterSerializer {
 	}
 
 	/**
-	 * <b>Configuration property:</b>  Use whitespace.
-	 * <p>
-	 * <ul>
-	 * 	<li><b>Name:</b> <js>"JsonSerializer.useWhitespace"</js>
-	 * 	<li><b>Data type:</b> <code>Boolean</code>
-	 * 	<li><b>Default:</b> <jk>false</jk>
-	 * 	<li><b>Session-overridable:</b> <jk>true</jk>
-	 * </ul>
-	 * <p>
-	 * If <jk>true</jk>, whitespace is added to the output to improve readability.
-	 * <p>
-	 * <h5 class='section'>Notes:</h5>
-	 * <ul>
-	 * 	<li>This is equivalent to calling <code>setProperty(<jsf>JSON_useWhitespace</jsf>, value)</code>.
-	 * </ul>
-	 *
-	 * @param value The new value for this property.
-	 * @return This object (for method chaining).
-	 * @throws LockedException If {@link #lock()} was called on this class.
-	 * @see JsonSerializerContext#JSON_useWhitespace
-	 */
-	public JsonSerializer setUseWhitespace(boolean value) throws LockedException {
-		return setProperty(JSON_useWhitespace, value);
-	}
-
-	/**
 	 * <b>Configuration property:</b>  Prefix solidus <js>'/'</js> characters with escapes.
 	 * <p>
 	 * <ul>
@@ -452,8 +423,8 @@ public class JsonSerializer extends WriterSerializer {
 	}
 
 	@Override /* Serializer */
-	public JsonSerializer setUseIndentation(boolean value) throws LockedException {
-		super.setUseIndentation(value);
+	public JsonSerializer setUseWhitespace(boolean value) throws LockedException {
+		super.setUseWhitespace(value);
 		return this;
 	}
 

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/097b8103/juneau-core/src/main/java/org/apache/juneau/json/JsonSerializerContext.java
----------------------------------------------------------------------
diff --git a/juneau-core/src/main/java/org/apache/juneau/json/JsonSerializerContext.java b/juneau-core/src/main/java/org/apache/juneau/json/JsonSerializerContext.java
index eec89c8..6cdceb3 100644
--- a/juneau-core/src/main/java/org/apache/juneau/json/JsonSerializerContext.java
+++ b/juneau-core/src/main/java/org/apache/juneau/json/JsonSerializerContext.java
@@ -49,20 +49,6 @@ public final class JsonSerializerContext extends SerializerContext {
 	public static final String JSON_simpleMode = "JsonSerializer.simpleMode";
 
 	/**
-	 * <b>Configuration property:</b>  Use whitespace.
-	 * <p>
-	 * <ul>
-	 * 	<li><b>Name:</b> <js>"JsonSerializer.useWhitespace"</js>
-	 * 	<li><b>Data type:</b> <code>Boolean</code>
-	 * 	<li><b>Default:</b> <jk>false</jk>
-	 * 	<li><b>Session-overridable:</b> <jk>true</jk>
-	 * </ul>
-	 * <p>
-	 * If <jk>true</jk>, whitespace is added to the output to improve readability.
-	 */
-	public static final String JSON_useWhitespace = "JsonSerializer.useWhitespace";
-
-	/**
 	 * <b>Configuration property:</b>  Prefix solidus <js>'/'</js> characters with escapes.
 	 * <p>
 	 * <ul>
@@ -82,7 +68,6 @@ public final class JsonSerializerContext extends SerializerContext {
 
 	final boolean
 		simpleMode,
-		useWhitespace,
 		escapeSolidus;
 
 	/**
@@ -95,7 +80,6 @@ public final class JsonSerializerContext extends SerializerContext {
 	public JsonSerializerContext(ContextFactory cf) {
 		super(cf);
 		simpleMode = cf.getProperty(JSON_simpleMode, boolean.class, false);
-		useWhitespace = cf.getProperty(JSON_useWhitespace, boolean.class, false);
 		escapeSolidus = cf.getProperty(JSON_escapeSolidus, boolean.class, false);
 	}
 
@@ -104,7 +88,6 @@ public final class JsonSerializerContext extends SerializerContext {
 		return super.asMap()
 			.append("JsonSerializerContext", new ObjectMap()
 				.append("simpleMode", simpleMode)
-				.append("useWhitespace", useWhitespace)
 				.append("escapeSolidus", escapeSolidus)
 			);
 	}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/097b8103/juneau-core/src/main/java/org/apache/juneau/json/JsonSerializerSession.java
----------------------------------------------------------------------
diff --git a/juneau-core/src/main/java/org/apache/juneau/json/JsonSerializerSession.java b/juneau-core/src/main/java/org/apache/juneau/json/JsonSerializerSession.java
index ae0fb4a..1d99bf7 100644
--- a/juneau-core/src/main/java/org/apache/juneau/json/JsonSerializerSession.java
+++ b/juneau-core/src/main/java/org/apache/juneau/json/JsonSerializerSession.java
@@ -18,7 +18,6 @@ import java.lang.reflect.*;
 import java.util.*;
 
 import org.apache.juneau.*;
-import org.apache.juneau.MediaType;
 import org.apache.juneau.serializer.*;
 
 /**
@@ -28,7 +27,7 @@ import org.apache.juneau.serializer.*;
  */
 public final class JsonSerializerSession extends SerializerSession {
 
-	private final boolean simpleMode, useWhitespace, escapeSolidus;
+	private final boolean simpleMode, escapeSolidus;
 
 	/**
 	 * Create a new session using properties specified in the context.
@@ -49,11 +48,9 @@ public final class JsonSerializerSession extends SerializerSession {
 		super(ctx, op, output, javaMethod, locale, timeZone, mediaType);
 		if (op == null || op.isEmpty()) {
 			simpleMode = ctx.simpleMode;
-			useWhitespace = ctx.useWhitespace;
 			escapeSolidus = ctx.escapeSolidus;
 		} else {
 			simpleMode = op.getBoolean(JSON_simpleMode, ctx.simpleMode);
-			useWhitespace = op.getBoolean(JSON_useWhitespace, ctx.useWhitespace);
 			escapeSolidus = op.getBoolean(JSON_escapeSolidus, ctx.escapeSolidus);
 		}
 	}
@@ -68,15 +65,6 @@ public final class JsonSerializerSession extends SerializerSession {
 	}
 
 	/**
-	 * Returns the {@link JsonSerializerContext#JSON_useWhitespace} setting value for this session.
-	 *
-	 * @return The {@link JsonSerializerContext#JSON_useWhitespace} setting value for this session.
-	 */
-	public final boolean isUseWhitespace() {
-		return useWhitespace;
-	}
-
-	/**
 	 * Returns the {@link JsonSerializerContext#JSON_escapeSolidus} setting value for this session.
 	 *
 	 * @return The {@link JsonSerializerContext#JSON_escapeSolidus} setting value for this session.
@@ -90,6 +78,6 @@ public final class JsonSerializerSession extends SerializerSession {
 		Object output = getOutput();
 		if (output instanceof JsonWriter)
 			return (JsonWriter)output;
-		return new JsonWriter(super.getWriter(), isUseIndentation(), isUseWhitespace(), isEscapeSolidus(), getQuoteChar(), isSimpleMode(), isTrimStrings(), getRelativeUriBase(), getAbsolutePathUriBase());
+		return new JsonWriter(super.getWriter(), isUseWhitespace(), isEscapeSolidus(), getQuoteChar(), isSimpleMode(), isTrimStrings(), getRelativeUriBase(), getAbsolutePathUriBase());
 	}
 }

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/097b8103/juneau-core/src/main/java/org/apache/juneau/json/JsonWriter.java
----------------------------------------------------------------------
diff --git a/juneau-core/src/main/java/org/apache/juneau/json/JsonWriter.java b/juneau-core/src/main/java/org/apache/juneau/json/JsonWriter.java
index 4b3af99..093a4f0 100644
--- a/juneau-core/src/main/java/org/apache/juneau/json/JsonWriter.java
+++ b/juneau-core/src/main/java/org/apache/juneau/json/JsonWriter.java
@@ -55,8 +55,7 @@ public final class JsonWriter extends SerializerWriter {
 	/**
 	 * Constructor.
 	 * @param out The writer being wrapped.
-	 * @param useIndentation If <jk>true</jk>, tabs will be used in output.
-	 * @param useWhitespace If <jk>true</jk>, whitespace will be used in output.
+	 * @param useWhitespace If <jk>true</jk>, tabs and spaces will be used in output.
 	 * @param escapeSolidus If <jk>true</jk>, forward slashes should be escaped in the output.
 	 * @param quoteChar The quote character to use (i.e. <js>'\''</js> or <js>'"'</js>)
 	 * @param laxMode If <jk>true</jk>, JSON attributes will only be quoted when necessary.
@@ -64,8 +63,8 @@ public final class JsonWriter extends SerializerWriter {
 	 * @param relativeUriBase The base (e.g. <js>https://localhost:9443/contextPath"</js>) for relative URIs (e.g. <js>"my/path"</js>).
 	 * @param absolutePathUriBase The base (e.g. <js>https://localhost:9443"</js>) for relative URIs with absolute paths (e.g. <js>"/contextPath/my/path"</js>).
 	 */
-	protected JsonWriter(Writer out, boolean useIndentation, boolean useWhitespace, boolean escapeSolidus, char quoteChar, boolean laxMode, boolean trimStrings, String relativeUriBase, String absolutePathUriBase) {
-		super(out, useIndentation, useWhitespace, trimStrings, quoteChar, relativeUriBase, absolutePathUriBase);
+	protected JsonWriter(Writer out, boolean useWhitespace, boolean escapeSolidus, char quoteChar, boolean laxMode, boolean trimStrings, String relativeUriBase, String absolutePathUriBase) {
+		super(out, useWhitespace, trimStrings, quoteChar, relativeUriBase, absolutePathUriBase);
 		this.laxMode = laxMode;
 		this.escapeSolidus = escapeSolidus;
 		this.ec = escapeSolidus ? encodedChars2 : encodedChars;
@@ -90,8 +89,6 @@ public final class JsonWriter extends SerializerWriter {
 		  */
 		if (s == null)
 			return this;
-//		if (trimStrings)
-//			s = s.trim();
 		boolean doConvert = false;
 		for (int i = 0; i < s.length() && ! doConvert; i++) {
 			char c = s.charAt(i);

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/097b8103/juneau-core/src/main/java/org/apache/juneau/msgpack/MsgPackParser.java
----------------------------------------------------------------------
diff --git a/juneau-core/src/main/java/org/apache/juneau/msgpack/MsgPackParser.java b/juneau-core/src/main/java/org/apache/juneau/msgpack/MsgPackParser.java
index 0b15adc..08b80e4 100644
--- a/juneau-core/src/main/java/org/apache/juneau/msgpack/MsgPackParser.java
+++ b/juneau-core/src/main/java/org/apache/juneau/msgpack/MsgPackParser.java
@@ -53,7 +53,6 @@ public final class MsgPackParser extends InputStreamParser {
 		PojoSwap<T,Object> transform = (PojoSwap<T,Object>)eType.getPojoSwap();
 		ClassMeta<?> sType = eType.getSerializedClassMeta();
 		session.setCurrentClass(sType);
-		BeanRegistry breg = (pMeta == null ? session.getBeanRegistry() : pMeta.getBeanRegistry());
 
 		Object o = null;
 		DataType dt = is.readDataType();
@@ -83,7 +82,7 @@ public final class MsgPackParser extends InputStreamParser {
 				ObjectMap om = new ObjectMap(session);
 				for (int i = 0; i < length; i++)
 					om.put(parseAnything(session, string(), is, outer, pMeta), parseAnything(session, object(), is, om, pMeta));
-				o = breg.cast(om);
+				o = session.cast(om, pMeta, eType);
 			}
 
 			if (sType.isObject()) {
@@ -135,7 +134,7 @@ public final class MsgPackParser extends InputStreamParser {
 					ObjectMap m = new ObjectMap(session);
 					for (int i = 0; i < length; i++)
 						m.put(parseAnything(session, string(), is, outer, pMeta), parseAnything(session, object(), is, m, pMeta));
-					o = breg.cast(m);
+					o = session.cast(m, pMeta, eType);
 				} else if (dt == ARRAY) {
 					Collection l = (sType.canCreateNewInstance(outer) ? (Collection)sType.newInstance() : new ObjectList(session));
 					for (int i = 0; i < length; i++)
@@ -149,7 +148,7 @@ public final class MsgPackParser extends InputStreamParser {
 					ObjectMap m = new ObjectMap(session);
 					for (int i = 0; i < length; i++)
 						m.put(parseAnything(session, string(), is, outer, pMeta), parseAnything(session, object(), is, m, pMeta));
-					o = breg.cast(m);
+					o = session.cast(m, pMeta, eType);
 				} else if (dt == ARRAY) {
 					Collection l = (sType.isCollection() && sType.canCreateNewInstance(outer) ? (Collection)sType.newInstance() : new ObjectList(session));
 					for (int i = 0; i < length; i++)
@@ -163,7 +162,7 @@ public final class MsgPackParser extends InputStreamParser {
 				for (int i = 0; i < length; i++)
 					m.put(parseAnything(session, string(), is, outer, pMeta), parseAnything(session, object(), is, m, pMeta));
 				if (m.containsKey(session.getBeanTypePropertyName()))
-					o = breg.cast(m);
+					o = session.cast(m, pMeta, eType);
 				else
 					throw new ParseException(session, "Class ''{0}'' could not be instantiated.  Reason: ''{1}''", sType.getInnerClass().getName(), sType.getNotABeanReason());
 			} else {
@@ -204,277 +203,277 @@ public final class MsgPackParser extends InputStreamParser {
 	//--------------------------------------------------------------------------------
 
 	@Override /* Parser */
-	public Parser setTrimStrings(boolean value) throws LockedException {
+	public MsgPackParser setTrimStrings(boolean value) throws LockedException {
 		super.setTrimStrings(value);
 		return this;
 	}
 
 	@Override /* Parser */
-	public Parser setStrict(boolean value) throws LockedException {
+	public MsgPackParser setStrict(boolean value) throws LockedException {
 		super.setStrict(value);
 		return this;
 	}
 
 	@Override /* Parser */
-	public Parser setInputStreamCharset(String value) throws LockedException {
+	public MsgPackParser setInputStreamCharset(String value) throws LockedException {
 		super.setInputStreamCharset(value);
 		return this;
 	}
 
 	@Override /* Parser */
-	public Parser setFileCharset(String value) throws LockedException {
+	public MsgPackParser setFileCharset(String value) throws LockedException {
 		super.setFileCharset(value);
 		return this;
 	}
 
 	@Override /* CoreApi */
-	public Parser setBeansRequireDefaultConstructor(boolean value) throws LockedException {
+	public MsgPackParser setBeansRequireDefaultConstructor(boolean value) throws LockedException {
 		super.setBeansRequireDefaultConstructor(value);
 		return this;
 	}
 
 	@Override /* CoreApi */
-	public Parser setBeansRequireSerializable(boolean value) throws LockedException {
+	public MsgPackParser setBeansRequireSerializable(boolean value) throws LockedException {
 		super.setBeansRequireSerializable(value);
 		return this;
 	}
 
 	@Override /* CoreApi */
-	public Parser setBeansRequireSettersForGetters(boolean value) throws LockedException {
+	public MsgPackParser setBeansRequireSettersForGetters(boolean value) throws LockedException {
 		super.setBeansRequireSettersForGetters(value);
 		return this;
 	}
 
 	@Override /* CoreApi */
-	public Parser setBeansRequireSomeProperties(boolean value) throws LockedException {
+	public MsgPackParser setBeansRequireSomeProperties(boolean value) throws LockedException {
 		super.setBeansRequireSomeProperties(value);
 		return this;
 	}
 
 	@Override /* CoreApi */
-	public Parser setBeanMapPutReturnsOldValue(boolean value) throws LockedException {
+	public MsgPackParser setBeanMapPutReturnsOldValue(boolean value) throws LockedException {
 		super.setBeanMapPutReturnsOldValue(value);
 		return this;
 	}
 
 	@Override /* CoreApi */
-	public Parser setBeanConstructorVisibility(Visibility value) throws LockedException {
+	public MsgPackParser setBeanConstructorVisibility(Visibility value) throws LockedException {
 		super.setBeanConstructorVisibility(value);
 		return this;
 	}
 
 	@Override /* CoreApi */
-	public Parser setBeanClassVisibility(Visibility value) throws LockedException {
+	public MsgPackParser setBeanClassVisibility(Visibility value) throws LockedException {
 		super.setBeanClassVisibility(value);
 		return this;
 	}
 
 	@Override /* CoreApi */
-	public Parser setBeanFieldVisibility(Visibility value) throws LockedException {
+	public MsgPackParser setBeanFieldVisibility(Visibility value) throws LockedException {
 		super.setBeanFieldVisibility(value);
 		return this;
 	}
 
 	@Override /* CoreApi */
-	public Parser setMethodVisibility(Visibility value) throws LockedException {
+	public MsgPackParser setMethodVisibility(Visibility value) throws LockedException {
 		super.setMethodVisibility(value);
 		return this;
 	}
 
 	@Override /* CoreApi */
-	public Parser setUseJavaBeanIntrospector(boolean value) throws LockedException {
+	public MsgPackParser setUseJavaBeanIntrospector(boolean value) throws LockedException {
 		super.setUseJavaBeanIntrospector(value);
 		return this;
 	}
 
 	@Override /* CoreApi */
-	public Parser setUseInterfaceProxies(boolean value) throws LockedException {
+	public MsgPackParser setUseInterfaceProxies(boolean value) throws LockedException {
 		super.setUseInterfaceProxies(value);
 		return this;
 	}
 
 	@Override /* CoreApi */
-	public Parser setIgnoreUnknownBeanProperties(boolean value) throws LockedException {
+	public MsgPackParser setIgnoreUnknownBeanProperties(boolean value) throws LockedException {
 		super.setIgnoreUnknownBeanProperties(value);
 		return this;
 	}
 
 	@Override /* CoreApi */
-	public Parser setIgnoreUnknownNullBeanProperties(boolean value) throws LockedException {
+	public MsgPackParser setIgnoreUnknownNullBeanProperties(boolean value) throws LockedException {
 		super.setIgnoreUnknownNullBeanProperties(value);
 		return this;
 	}
 
 	@Override /* CoreApi */
-	public Parser setIgnorePropertiesWithoutSetters(boolean value) throws LockedException {
+	public MsgPackParser setIgnorePropertiesWithoutSetters(boolean value) throws LockedException {
 		super.setIgnorePropertiesWithoutSetters(value);
 		return this;
 	}
 
 	@Override /* CoreApi */
-	public Parser setIgnoreInvocationExceptionsOnGetters(boolean value) throws LockedException {
+	public MsgPackParser setIgnoreInvocationExceptionsOnGetters(boolean value) throws LockedException {
 		super.setIgnoreInvocationExceptionsOnGetters(value);
 		return this;
 	}
 
 	@Override /* CoreApi */
-	public Parser setIgnoreInvocationExceptionsOnSetters(boolean value) throws LockedException {
+	public MsgPackParser setIgnoreInvocationExceptionsOnSetters(boolean value) throws LockedException {
 		super.setIgnoreInvocationExceptionsOnSetters(value);
 		return this;
 	}
 
 	@Override /* CoreApi */
-	public Parser setSortProperties(boolean value) throws LockedException {
+	public MsgPackParser setSortProperties(boolean value) throws LockedException {
 		super.setSortProperties(value);
 		return this;
 	}
 
 	@Override /* CoreApi */
-	public Parser setNotBeanPackages(String...values) throws LockedException {
+	public MsgPackParser setNotBeanPackages(String...values) throws LockedException {
 		super.setNotBeanPackages(values);
 		return this;
 	}
 
 	@Override /* CoreApi */
-	public Parser setNotBeanPackages(Collection<String> values) throws LockedException {
+	public MsgPackParser setNotBeanPackages(Collection<String> values) throws LockedException {
 		super.setNotBeanPackages(values);
 		return this;
 	}
 
 	@Override /* CoreApi */
-	public Parser addNotBeanPackages(String...values) throws LockedException {
+	public MsgPackParser addNotBeanPackages(String...values) throws LockedException {
 		super.addNotBeanPackages(values);
 		return this;
 	}
 
 	@Override /* CoreApi */
-	public Parser addNotBeanPackages(Collection<String> values) throws LockedException {
+	public MsgPackParser addNotBeanPackages(Collection<String> values) throws LockedException {
 		super.addNotBeanPackages(values);
 		return this;
 	}
 
 	@Override /* CoreApi */
-	public Parser removeNotBeanPackages(String...values) throws LockedException {
+	public MsgPackParser removeNotBeanPackages(String...values) throws LockedException {
 		super.removeNotBeanPackages(values);
 		return this;
 	}
 
 	@Override /* CoreApi */
-	public Parser removeNotBeanPackages(Collection<String> values) throws LockedException {
+	public MsgPackParser removeNotBeanPackages(Collection<String> values) throws LockedException {
 		super.removeNotBeanPackages(values);
 		return this;
 	}
 
 	@Override /* CoreApi */
-	public Parser setNotBeanClasses(Class<?>...values) throws LockedException {
+	public MsgPackParser setNotBeanClasses(Class<?>...values) throws LockedException {
 		super.setNotBeanClasses(values);
 		return this;
 	}
 
 	@Override /* CoreApi */
-	public Parser setNotBeanClasses(Collection<Class<?>> values) throws LockedException {
+	public MsgPackParser setNotBeanClasses(Collection<Class<?>> values) throws LockedException {
 		super.setNotBeanClasses(values);
 		return this;
 	}
 
 	@Override /* CoreApi */
-	public Parser addNotBeanClasses(Class<?>...values) throws LockedException {
+	public MsgPackParser addNotBeanClasses(Class<?>...values) throws LockedException {
 		super.addNotBeanClasses(values);
 		return this;
 	}
 
 	@Override /* CoreApi */
-	public Parser addNotBeanClasses(Collection<Class<?>> values) throws LockedException {
+	public MsgPackParser addNotBeanClasses(Collection<Class<?>> values) throws LockedException {
 		super.addNotBeanClasses(values);
 		return this;
 	}
 
 	@Override /* CoreApi */
-	public Parser removeNotBeanClasses(Class<?>...values) throws LockedException {
+	public MsgPackParser removeNotBeanClasses(Class<?>...values) throws LockedException {
 		super.removeNotBeanClasses(values);
 		return this;
 	}
 
 	@Override /* CoreApi */
-	public Parser removeNotBeanClasses(Collection<Class<?>> values) throws LockedException {
+	public MsgPackParser removeNotBeanClasses(Collection<Class<?>> values) throws LockedException {
 		super.removeNotBeanClasses(values);
 		return this;
 	}
 
 	@Override /* CoreApi */
-	public Parser setBeanFilters(Class<?>...values) throws LockedException {
+	public MsgPackParser setBeanFilters(Class<?>...values) throws LockedException {
 		super.setBeanFilters(values);
 		return this;
 	}
 
 	@Override /* CoreApi */
-	public Parser setBeanFilters(Collection<Class<?>> values) throws LockedException {
+	public MsgPackParser setBeanFilters(Collection<Class<?>> values) throws LockedException {
 		super.setBeanFilters(values);
 		return this;
 	}
 
 	@Override /* CoreApi */
-	public Parser addBeanFilters(Class<?>...values) throws LockedException {
+	public MsgPackParser addBeanFilters(Class<?>...values) throws LockedException {
 		super.addBeanFilters(values);
 		return this;
 	}
 
 	@Override /* CoreApi */
-	public Parser addBeanFilters(Collection<Class<?>> values) throws LockedException {
+	public MsgPackParser addBeanFilters(Collection<Class<?>> values) throws LockedException {
 		super.addBeanFilters(values);
 		return this;
 	}
 
 	@Override /* CoreApi */
-	public Parser removeBeanFilters(Class<?>...values) throws LockedException {
+	public MsgPackParser removeBeanFilters(Class<?>...values) throws LockedException {
 		super.removeBeanFilters(values);
 		return this;
 	}
 
 	@Override /* CoreApi */
-	public Parser removeBeanFilters(Collection<Class<?>> values) throws LockedException {
+	public MsgPackParser removeBeanFilters(Collection<Class<?>> values) throws LockedException {
 		super.removeBeanFilters(values);
 		return this;
 	}
 
 	@Override /* CoreApi */
-	public Parser setPojoSwaps(Class<?>...values) throws LockedException {
+	public MsgPackParser setPojoSwaps(Class<?>...values) throws LockedException {
 		super.setPojoSwaps(values);
 		return this;
 	}
 
 	@Override /* CoreApi */
-	public Parser setPojoSwaps(Collection<Class<?>> values) throws LockedException {
+	public MsgPackParser setPojoSwaps(Collection<Class<?>> values) throws LockedException {
 		super.setPojoSwaps(values);
 		return this;
 	}
 
 	@Override /* CoreApi */
-	public Parser addPojoSwaps(Class<?>...values) throws LockedException {
+	public MsgPackParser addPojoSwaps(Class<?>...values) throws LockedException {
 		super.addPojoSwaps(values);
 		return this;
 	}
 
 	@Override /* CoreApi */
-	public Parser addPojoSwaps(Collection<Class<?>> values) throws LockedException {
+	public MsgPackParser addPojoSwaps(Collection<Class<?>> values) throws LockedException {
 		super.addPojoSwaps(values);
 		return this;
 	}
 
 	@Override /* CoreApi */
-	public Parser removePojoSwaps(Class<?>...values) throws LockedException {
+	public MsgPackParser removePojoSwaps(Class<?>...values) throws LockedException {
 		super.removePojoSwaps(values);
 		return this;
 	}
 
 	@Override /* CoreApi */
-	public Parser removePojoSwaps(Collection<Class<?>> values) throws LockedException {
+	public MsgPackParser removePojoSwaps(Collection<Class<?>> values) throws LockedException {
 		super.removePojoSwaps(values);
 		return this;
 	}
 
 	@Override /* CoreApi */
-	public Parser setImplClasses(Map<Class<?>,Class<?>> values) throws LockedException {
+	public MsgPackParser setImplClasses(Map<Class<?>,Class<?>> values) throws LockedException {
 		super.setImplClasses(values);
 		return this;
 	}
@@ -486,109 +485,109 @@ public final class MsgPackParser extends InputStreamParser {
 	}
 
 	@Override /* CoreApi */
-	public Parser setBeanDictionary(Class<?>...values) throws LockedException {
+	public MsgPackParser setBeanDictionary(Class<?>...values) throws LockedException {
 		super.setBeanDictionary(values);
 		return this;
 	}
 
 	@Override /* CoreApi */
-	public Parser setBeanDictionary(Collection<Class<?>> values) throws LockedException {
+	public MsgPackParser setBeanDictionary(Collection<Class<?>> values) throws LockedException {
 		super.setBeanDictionary(values);
 		return this;
 	}
 
 	@Override /* CoreApi */
-	public Parser addToBeanDictionary(Class<?>...values) throws LockedException {
+	public MsgPackParser addToBeanDictionary(Class<?>...values) throws LockedException {
 		super.addToBeanDictionary(values);
 		return this;
 	}
 
 	@Override /* CoreApi */
-	public Parser addToBeanDictionary(Collection<Class<?>> values) throws LockedException {
+	public MsgPackParser addToBeanDictionary(Collection<Class<?>> values) throws LockedException {
 		super.addToBeanDictionary(values);
 		return this;
 	}
 
 	@Override /* CoreApi */
-	public Parser removeFromBeanDictionary(Class<?>...values) throws LockedException {
+	public MsgPackParser removeFromBeanDictionary(Class<?>...values) throws LockedException {
 		super.removeFromBeanDictionary(values);
 		return this;
 	}
 
 	@Override /* CoreApi */
-	public Parser removeFromBeanDictionary(Collection<Class<?>> values) throws LockedException {
+	public MsgPackParser removeFromBeanDictionary(Collection<Class<?>> values) throws LockedException {
 		super.removeFromBeanDictionary(values);
 		return this;
 	}
 
 	@Override /* CoreApi */
-	public Parser setBeanTypePropertyName(String value) throws LockedException {
+	public MsgPackParser setBeanTypePropertyName(String value) throws LockedException {
 		super.setBeanTypePropertyName(value);
 		return this;
 	}
 
 	@Override /* CoreApi */
-	public Parser setDefaultParser(Class<?> value) throws LockedException {
+	public MsgPackParser setDefaultParser(Class<?> value) throws LockedException {
 		super.setDefaultParser(value);
 		return this;
 	}
 
 	@Override /* CoreApi */
-	public Parser setLocale(Locale value) throws LockedException {
+	public MsgPackParser setLocale(Locale value) throws LockedException {
 		super.setLocale(value);
 		return this;
 	}
 
 	@Override /* CoreApi */
-	public Parser setTimeZone(TimeZone value) throws LockedException {
+	public MsgPackParser setTimeZone(TimeZone value) throws LockedException {
 		super.setTimeZone(value);
 		return this;
 	}
 
 	@Override /* CoreApi */
-	public Parser setMediaType(MediaType value) throws LockedException {
+	public MsgPackParser setMediaType(MediaType value) throws LockedException {
 		super.setMediaType(value);
 		return this;
 	}
 
 	@Override /* CoreApi */
-	public Parser setDebug(boolean value) throws LockedException {
+	public MsgPackParser setDebug(boolean value) throws LockedException {
 		super.setDebug(value);
 		return this;
 	}
 
 	@Override /* CoreApi */
-	public Parser setProperty(String name, Object value) throws LockedException {
+	public MsgPackParser setProperty(String name, Object value) throws LockedException {
 		super.setProperty(name, value);
 		return this;
 	}
 
 	@Override /* CoreApi */
-	public Parser setProperties(ObjectMap properties) throws LockedException {
+	public MsgPackParser setProperties(ObjectMap properties) throws LockedException {
 		super.setProperties(properties);
 		return this;
 	}
 
 	@Override /* CoreApi */
-	public Parser addToProperty(String name, Object value) throws LockedException {
+	public MsgPackParser addToProperty(String name, Object value) throws LockedException {
 		super.addToProperty(name, value);
 		return this;
 	}
 
 	@Override /* CoreApi */
-	public Parser putToProperty(String name, Object key, Object value) throws LockedException {
+	public MsgPackParser putToProperty(String name, Object key, Object value) throws LockedException {
 		super.putToProperty(name, key, value);
 		return this;
 	}
 
 	@Override /* CoreApi */
-	public Parser putToProperty(String name, Object value) throws LockedException {
+	public MsgPackParser putToProperty(String name, Object value) throws LockedException {
 		super.putToProperty(name, value);
 		return this;
 	}
 
 	@Override /* CoreApi */
-	public Parser removeFromProperty(String name, Object value) throws LockedException {
+	public MsgPackParser removeFromProperty(String name, Object value) throws LockedException {
 		super.removeFromProperty(name, value);
 		return this;
 	}
@@ -599,7 +598,7 @@ public final class MsgPackParser extends InputStreamParser {
 	//--------------------------------------------------------------------------------
 
 	@Override /* CoreApi */
-	public Parser setClassLoader(ClassLoader classLoader) throws LockedException {
+	public MsgPackParser setClassLoader(ClassLoader classLoader) throws LockedException {
 		super.setClassLoader(classLoader);
 		return this;
 	}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/097b8103/juneau-core/src/main/java/org/apache/juneau/msgpack/MsgPackSerializer.java
----------------------------------------------------------------------
diff --git a/juneau-core/src/main/java/org/apache/juneau/msgpack/MsgPackSerializer.java b/juneau-core/src/main/java/org/apache/juneau/msgpack/MsgPackSerializer.java
index 4ce103d..cd842d6 100644
--- a/juneau-core/src/main/java/org/apache/juneau/msgpack/MsgPackSerializer.java
+++ b/juneau-core/src/main/java/org/apache/juneau/msgpack/MsgPackSerializer.java
@@ -57,7 +57,6 @@ public class MsgPackSerializer extends OutputStreamSerializer {
 		if (eType == null)
 			eType = object();
 
-		boolean addTypeProperty;		// Add "_type" attribute to element?
 		ClassMeta<?> aType;			// The actual type
 		ClassMeta<?> sType;			// The serialized type
 
@@ -71,7 +70,7 @@ public class MsgPackSerializer extends OutputStreamSerializer {
 		}
 
 		sType = aType.getSerializedClassMeta();
-		addTypeProperty = (session.isAddBeanTypeProperties() && ! eType.equals(aType));
+		String typeName = session.getBeanTypeName(eType, aType, pMeta);
 
 		// Swap if necessary
 		PojoSwap swap = aType.getPojoSwap();
@@ -92,12 +91,12 @@ public class MsgPackSerializer extends OutputStreamSerializer {
 		else if (sType.isNumber())
 			out.appendNumber((Number)o);
 		else if (sType.isBean())
-			serializeBeanMap(session, out, session.toBeanMap(o), addTypeProperty);
+			serializeBeanMap(session, out, session.toBeanMap(o), typeName);
 		else if (sType.isUri() || (pMeta != null && pMeta.isUri()))
 			out.appendString(session.resolveUri(o.toString()));
 		else if (sType.isMap()) {
 			if (o instanceof BeanMap)
-				serializeBeanMap(session, out, (BeanMap)o, addTypeProperty);
+				serializeBeanMap(session, out, (BeanMap)o, typeName);
 			else
 				serializeMap(session, out, (Map)o, eType);
 		}
@@ -138,9 +137,9 @@ public class MsgPackSerializer extends OutputStreamSerializer {
 		}
 	}
 
-	private void serializeBeanMap(MsgPackSerializerSession session, MsgPackOutputStream out, final BeanMap<?> m, boolean addTypeProperty) throws Exception {
+	private void serializeBeanMap(MsgPackSerializerSession session, MsgPackOutputStream out, final BeanMap<?> m, String typeName) throws Exception {
 
-		List<BeanPropertyValue> values = m.getValues(session.isTrimNulls(), addTypeProperty ? session.createBeanTypeNameProperty(m) : null);
+		List<BeanPropertyValue> values = m.getValues(session.isTrimNulls(), typeName != null ? session.createBeanTypeNameProperty(m, typeName) : null);
 
 		int size = values.size();
 		for (BeanPropertyValue p : values)
@@ -234,8 +233,8 @@ public class MsgPackSerializer extends OutputStreamSerializer {
 	}
 
 	@Override /* Serializer */
-	public MsgPackSerializer setUseIndentation(boolean value) throws LockedException {
-		super.setUseIndentation(value);
+	public MsgPackSerializer setUseWhitespace(boolean value) throws LockedException {
+		super.setUseWhitespace(value);
 		return this;
 	}
 

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/097b8103/juneau-core/src/main/java/org/apache/juneau/parser/ParserGroup.java
----------------------------------------------------------------------
diff --git a/juneau-core/src/main/java/org/apache/juneau/parser/ParserGroup.java b/juneau-core/src/main/java/org/apache/juneau/parser/ParserGroup.java
index 6f2247b..3d9fa30 100644
--- a/juneau-core/src/main/java/org/apache/juneau/parser/ParserGroup.java
+++ b/juneau-core/src/main/java/org/apache/juneau/parser/ParserGroup.java
@@ -78,7 +78,7 @@ public final class ParserGroup extends Lockable {
 	 */
 	public ParserGroup append(Parser p) {
 		checkLock();
-		synchronized(parsers) {
+		synchronized(this) {
 			cache.clear();
 			parsers.add(0, p);
 		}
@@ -110,7 +110,7 @@ public final class ParserGroup extends Lockable {
 			append(p.newInstance());
 		} catch (NoClassDefFoundError e) {
 			// Ignore if dependent library not found (e.g. Jena).
-			System.err.println(e);
+			System.err.println(e); // NOT DEBUG
 		}
 		return this;
 	}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/097b8103/juneau-core/src/main/java/org/apache/juneau/parser/ParserReader.java
----------------------------------------------------------------------
diff --git a/juneau-core/src/main/java/org/apache/juneau/parser/ParserReader.java b/juneau-core/src/main/java/org/apache/juneau/parser/ParserReader.java
index 07f21fe..de3187a 100644
--- a/juneau-core/src/main/java/org/apache/juneau/parser/ParserReader.java
+++ b/juneau-core/src/main/java/org/apache/juneau/parser/ParserReader.java
@@ -109,6 +109,20 @@ public class ParserReader extends Reader {
 	}
 
 	/**
+	 * Same as {@link #read()} but skips over any whitespace characters.
+	 *
+	 * @return The first non-whitespace character, or -1 if the end of stream reached.
+	 * @throws IOException
+	 */
+	public final int readSkipWs() throws IOException {
+		while (true) {
+			int c = read();
+			if (c == -1 || ! Character.isWhitespace(c))
+				return c;
+		}
+	}
+
+	/**
 	 * Same as {@link #read()} but detects and combines extended unicode characters (i.e. characters
 	 * 	above 0x10000).
 	 *
@@ -205,7 +219,7 @@ public class ParserReader extends Reader {
 	/**
 	 * Peeks the next character in the stream.
 	 * <p>
-	 * 	This is equivalent to doing a {@code read()} followed by an {@code unread()}.
+	 * This is equivalent to doing a {@code read()} followed by an {@code unread()}.
 	 *
 	 * @return The peeked character, or (char)-1 if the end of the stream has been reached.
 	 * @throws IOException If a problem occurred trying to read from the reader.
@@ -218,6 +232,25 @@ public class ParserReader extends Reader {
 	}
 
 	/**
+	 * Same as {@link #peek()} but skips over any whitespace characters.
+	 * <p>
+	 * This is equivalent to doing a {@code read()} followed by an {@code unread()}.
+	 *
+	 * @return The peeked character, or (char)-1 if the end of the stream has been reached.
+	 * @throws IOException If a problem occurred trying to read from the reader.
+	 */
+	public final int peekSkipWs() throws IOException {
+		while(true) {
+			int c = read();
+			boolean isWs = Character.isWhitespace(c);
+			if (c != -1 && ! isWs)
+				unread();
+			if (! isWs)
+				return c;
+		}
+	}
+
+	/**
 	 * Read the specified number of characters off the stream.
 	 *
 	 * @param num The number of characters to read.

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/097b8103/juneau-core/src/main/java/org/apache/juneau/parser/ParserSession.java
----------------------------------------------------------------------
diff --git a/juneau-core/src/main/java/org/apache/juneau/parser/ParserSession.java b/juneau-core/src/main/java/org/apache/juneau/parser/ParserSession.java
index e471056..8a4a87b 100644
--- a/juneau-core/src/main/java/org/apache/juneau/parser/ParserSession.java
+++ b/juneau-core/src/main/java/org/apache/juneau/parser/ParserSession.java
@@ -20,6 +20,7 @@ import java.nio.charset.*;
 import java.util.*;
 
 import org.apache.juneau.*;
+import org.apache.juneau.internal.*;
 
 /**
  * Session object that lives for the duration of a single use of {@link Parser}.
@@ -103,6 +104,8 @@ public class ParserSession extends BeanSession {
 			return (InputStream)input;
 		if (input instanceof byte[])
 			return new ByteArrayInputStream((byte[])input);
+		if (input instanceof String)
+			return new ByteArrayInputStream(StringUtils.fromHex((String)input));
 		if (input instanceof File)
 			try {
 				inputStream = new FileInputStream((File)input);
@@ -269,6 +272,77 @@ public class ParserSession extends BeanSession {
 	}
 
 	/**
+	 * Converts the specified <code>ObjectMap</code> into a bean identified by the <js>"_type"</js>
+	 * property in the map.
+	 *
+	 * @param m The map to convert to a bean.
+	 * @param pMeta The current bean property being parsed.
+	 * @param eType The current expected type being parsed.
+	 * @return The converted bean, or the same map if the <js>"_type"</js> entry wasn't found
+	 * 	or didn't resolve to a bean.
+	 */
+	public final Object cast(ObjectMap m, BeanPropertyMeta pMeta, ClassMeta<?> eType) {
+
+		String btpn = getBeanTypePropertyName();
+
+		Object o = m.get(btpn);
+		if (o == null)
+			return m;
+		String typeName = o.toString();
+
+		ClassMeta<?> cm = getClassMeta(typeName, pMeta, eType);
+
+		if (cm != null) {
+			BeanMap<?> bm = m.getBeanSession().newBeanMap(cm.getInnerClass());
+
+			// Iterate through all the entries in the map and set the individual field values.
+			for (Map.Entry<String,Object> e : m.entrySet()) {
+				String k = e.getKey();
+				Object v = e.getValue();
+				if (! k.equals(btpn)) {
+					// Attempt to recursively cast child maps.
+					if (v instanceof ObjectMap)
+						v = cast((ObjectMap)v, pMeta, eType);
+					bm.put(k, v);
+				}
+			}
+			return bm.getBean();
+		}
+
+		return m;
+	}
+
+	/**
+	 * Give the specified dictionary name, resolve it to a class.
+	 *
+	 * @param typeName The dictionary name to resolve.
+	 * @param pMeta The bean property we're currently parsing.
+	 * @param eType The expected type we're currently parsing.
+	 * @return The resolved class, or <jk>null</jk> if the type name could not be resolved.
+	 */
+	public final ClassMeta<?> getClassMeta(String typeName, BeanPropertyMeta pMeta, ClassMeta<?> eType) {
+		BeanRegistry br = null;
+
+		// Resolve via @BeanProperty(beanDictionary={})
+		if (pMeta != null) {
+			br = pMeta.getBeanRegistry();
+			if (br != null && br.hasName(typeName))
+				return br.getClassMeta(typeName);
+		}
+
+		// Resolve via @Bean(beanDictionary={}) on the expected type where the
+		// expected type is an interface with subclasses.
+		if (eType != null) {
+			br = eType.getBeanRegistry();
+			if (br != null && br.hasName(typeName))
+				return br.getClassMeta(typeName);
+		}
+
+		// Last resort, resolve using the session registry.
+		return getBeanRegistry().getClassMeta(typeName);
+	}
+
+	/**
 	 * Perform cleanup on this context object if necessary.
 	 */
 	@Override

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/097b8103/juneau-core/src/main/java/org/apache/juneau/serializer/OutputStreamSerializer.java
----------------------------------------------------------------------
diff --git a/juneau-core/src/main/java/org/apache/juneau/serializer/OutputStreamSerializer.java b/juneau-core/src/main/java/org/apache/juneau/serializer/OutputStreamSerializer.java
index 0c8f215..0901c14 100644
--- a/juneau-core/src/main/java/org/apache/juneau/serializer/OutputStreamSerializer.java
+++ b/juneau-core/src/main/java/org/apache/juneau/serializer/OutputStreamSerializer.java
@@ -15,6 +15,7 @@ package org.apache.juneau.serializer;
 import java.io.*;
 
 import org.apache.juneau.annotation.*;
+import org.apache.juneau.internal.*;
 
 /**
  * Subclass of {@link Serializer} for byte-based serializers.
@@ -50,7 +51,7 @@ public abstract class OutputStreamSerializer extends Serializer {
 	 * Convenience method for serializing an object to a <code><jk>byte</jk></code>.
 	 *
 	 * @param o The object to serialize.
-	 * @return The output serialized to a string.
+	 * @return The output serialized to a byte array.
 	 * @throws SerializeException If a problem occurred trying to convert the output.
 	 */
 	@Override
@@ -59,4 +60,17 @@ public abstract class OutputStreamSerializer extends Serializer {
 		serialize(createSession(baos), o);
 		return baos.toByteArray();
 	}
+
+	/**
+	 * Convenience method for serializing an object to a hex-encoded String.
+	 *
+	 * @param o The object to serialize.
+	 * @return The output serialized to a hex-encoded string.
+	 * @throws SerializeException If a problem occurred trying to convert the output.
+	 */
+	public final String serializeToHex(Object o) throws SerializeException {
+		ByteArrayOutputStream baos = new ByteArrayOutputStream();
+		serialize(createSession(baos), o);
+		return StringUtils.toHex(baos.toByteArray());
+	}
 }

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/097b8103/juneau-core/src/main/java/org/apache/juneau/serializer/Serializer.java
----------------------------------------------------------------------
diff --git a/juneau-core/src/main/java/org/apache/juneau/serializer/Serializer.java b/juneau-core/src/main/java/org/apache/juneau/serializer/Serializer.java
index ac43ecb..313ff47 100644
--- a/juneau-core/src/main/java/org/apache/juneau/serializer/Serializer.java
+++ b/juneau-core/src/main/java/org/apache/juneau/serializer/Serializer.java
@@ -413,30 +413,29 @@ public abstract class Serializer extends CoreApi {
 	}
 
 	/**
-	 * <b>Configuration property:</b>  Use indentation.
+	 * <b>Configuration property:</b>  Use whitespace.
 	 * <p>
 	 * <ul>
-	 * 	<li><b>Name:</b> <js>"Serializer.useIndentation"</js>
+	 * 	<li><b>Name:</b> <js>"Serializer.useWhitepace"</js>
 	 * 	<li><b>Data type:</b> <code>Boolean</code>
 	 * 	<li><b>Default:</b> <jk>false</jk>
 	 * 	<li><b>Session-overridable:</b> <jk>true</jk>
 	 * </ul>
 	 * <p>
-	 * If <jk>true</jk>, newlines and indentation is added to the output to improve readability.
+	 * If <jk>true</jk>, newlines and indentation and spaces are added to the output to improve readability.
 	 * <p>
 	 * <h5 class='section'>Notes:</h5>
 	 * <ul>
-	 * 	<li>This is equivalent to calling <code>setProperty(<jsf>SERIALIZER_useIndentation</jsf>, value)</code>.
-	 * 	<li>Checking for recursion can cause a small performance penalty.
+	 * 	<li>This is equivalent to calling <code>setProperty(<jsf>SERIALIZER_useWhitespace</jsf>, value)</code>.
 	 * </ul>
 	 *
 	 * @param value The new value for this property.
 	 * @return This object (for method chaining).
 	 * @throws LockedException If {@link #lock()} was called on this class.
-	 * @see SerializerContext#SERIALIZER_useIndentation
+	 * @see SerializerContext#SERIALIZER_useWhitespace
 	 */
-	public Serializer setUseIndentation(boolean value) throws LockedException {
-		return setProperty(SERIALIZER_useIndentation, value);
+	public Serializer setUseWhitespace(boolean value) throws LockedException {
+		return setProperty(SERIALIZER_useWhitespace, value);
 	}
 
 	/**

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/097b8103/juneau-core/src/main/java/org/apache/juneau/serializer/SerializerContext.java
----------------------------------------------------------------------
diff --git a/juneau-core/src/main/java/org/apache/juneau/serializer/SerializerContext.java b/juneau-core/src/main/java/org/apache/juneau/serializer/SerializerContext.java
index 7abdd45..38fdfef 100644
--- a/juneau-core/src/main/java/org/apache/juneau/serializer/SerializerContext.java
+++ b/juneau-core/src/main/java/org/apache/juneau/serializer/SerializerContext.java
@@ -98,18 +98,18 @@ public class SerializerContext extends BeanContext {
 	public static final String SERIALIZER_ignoreRecursions = "Serializer.ignoreRecursions";
 
 	/**
-	 * <b>Configuration property:</b>  Use indentation.
+	 * <b>Configuration property:</b>  Use whitespace.
 	 * <p>
 	 * <ul>
-	 * 	<li><b>Name:</b> <js>"Serializer.useIndentation"</js>
+	 * 	<li><b>Name:</b> <js>"Serializer.useWhitespace"</js>
 	 * 	<li><b>Data type:</b> <code>Boolean</code>
 	 * 	<li><b>Default:</b> <jk>false</jk>
 	 * 	<li><b>Session-overridable:</b> <jk>true</jk>
 	 * </ul>
 	 * <p>
-	 * If <jk>true</jk>, newlines and indentation is added to the output to improve readability.
+	 * If <jk>true</jk>, whitespace is added to the output to improve readability.
 	 */
-	public static final String SERIALIZER_useIndentation = "Serializer.useIndentation";
+	public static final String SERIALIZER_useWhitespace = "Serializer.useWhitespace";
 
 	/**
 	 * <b>Configuration property:</b>  Add <js>"_type"</js> properties when needed.
@@ -318,7 +318,7 @@ public class SerializerContext extends BeanContext {
 	final boolean
 		detectRecursions,
 		ignoreRecursions,
-		useIndentation,
+		useWhitespace,
 		addBeanTypeProperties,
 		trimNulls,
 		trimEmptyCollections,
@@ -340,8 +340,8 @@ public class SerializerContext extends BeanContext {
 		initialDepth = cf.getProperty(SERIALIZER_initialDepth, int.class, 0);
 		detectRecursions = cf.getProperty(SERIALIZER_detectRecursions, boolean.class, false);
 		ignoreRecursions = cf.getProperty(SERIALIZER_ignoreRecursions, boolean.class, false);
-		useIndentation = cf.getProperty(SERIALIZER_useIndentation, boolean.class, false);
-		addBeanTypeProperties = cf.getProperty(SERIALIZER_addBeanTypeProperties, boolean.class, false);
+		useWhitespace = cf.getProperty(SERIALIZER_useWhitespace, boolean.class, false);
+		addBeanTypeProperties = cf.getProperty(SERIALIZER_addBeanTypeProperties, boolean.class, true);
 		trimNulls = cf.getProperty(SERIALIZER_trimNullProperties, boolean.class, true);
 		trimEmptyCollections = cf.getProperty(SERIALIZER_trimEmptyCollections, boolean.class, false);
 		trimEmptyMaps = cf.getProperty(SERIALIZER_trimEmptyMaps, boolean.class, false);
@@ -379,7 +379,7 @@ public class SerializerContext extends BeanContext {
 				.append("initialDepth", initialDepth)
 				.append("detectRecursions", detectRecursions)
 				.append("ignoreRecursions", ignoreRecursions)
-				.append("useIndentation", useIndentation)
+				.append("useWhitespace", useWhitespace)
 				.append("addBeanTypeProperties", addBeanTypeProperties)
 				.append("trimNulls", trimNulls)
 				.append("trimEmptyCollections", trimEmptyCollections)

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/097b8103/juneau-core/src/main/java/org/apache/juneau/serializer/SerializerGroup.java
----------------------------------------------------------------------
diff --git a/juneau-core/src/main/java/org/apache/juneau/serializer/SerializerGroup.java b/juneau-core/src/main/java/org/apache/juneau/serializer/SerializerGroup.java
index 63f0400..d2d6847 100644
--- a/juneau-core/src/main/java/org/apache/juneau/serializer/SerializerGroup.java
+++ b/juneau-core/src/main/java/org/apache/juneau/serializer/SerializerGroup.java
@@ -51,7 +51,7 @@ import org.apache.juneau.*;
  * 	g.append(JsonSerializer.<jk>class</jk>, XmlSerializer.<jk>class</jk>);
  *
  * 	<jc>// Change settings for all serializers in the group and lock it.</jc>
- * 	g.setProperty(SerializerContext.<jsf>SERIALIZER_useIndentation</jsf>, <jk>true</jk>)
+ * 	g.setProperty(SerializerContext.<jsf>SERIALIZER_useWhitespace</jsf>, <jk>true</jk>)
  * 		.addPojoSwaps(CalendarSwap.ISO8601DT.<jk>class</jk>)
  * 		.lock();
  *
@@ -79,7 +79,7 @@ public final class SerializerGroup extends Lockable {
 	 */
 	public SerializerGroup append(Serializer s) {
 		checkLock();
-		synchronized(serializers) {
+		synchronized(this) {
 			cache.clear();
 			serializers.add(0, s);
 		}
@@ -111,7 +111,7 @@ public final class SerializerGroup extends Lockable {
 			append(s.newInstance());
 		} catch (NoClassDefFoundError e) {
 			// Ignore if dependent library not found (e.g. Jena).
-			System.err.println(e);
+			System.err.println(e); // NOT DEBUG
 		}
 		return this;
 	}
@@ -303,17 +303,17 @@ public final class SerializerGroup extends Lockable {
 	}
 
 	/**
-	 * Calls {@link Serializer#setUseIndentation(boolean)} on all serializers in this group.
+	 * Calls {@link Serializer#setUseWhitespace(boolean)} on all serializers in this group.
 	 *
 	 * @param value The new value for this property.
 	 * @return This object (for method chaining).
 	 * @throws LockedException If {@link #lock()} was called on this class.
-	 * @see SerializerContext#SERIALIZER_useIndentation
+	 * @see SerializerContext#SERIALIZER_useWhitespace
 	 */
-	public SerializerGroup setUseIndentation(boolean value) throws LockedException {
+	public SerializerGroup setUseWhitespace(boolean value) throws LockedException {
 		checkLock();
 		for (Serializer s : serializers)
-			s.setUseIndentation(value);
+			s.setUseWhitespace(value);
 		return this;
 	}
 

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/097b8103/juneau-core/src/main/java/org/apache/juneau/serializer/SerializerSession.java
----------------------------------------------------------------------
diff --git a/juneau-core/src/main/java/org/apache/juneau/serializer/SerializerSession.java b/juneau-core/src/main/java/org/apache/juneau/serializer/SerializerSession.java
index 1ad5ee5..7d499e6 100644
--- a/juneau-core/src/main/java/org/apache/juneau/serializer/SerializerSession.java
+++ b/juneau-core/src/main/java/org/apache/juneau/serializer/SerializerSession.java
@@ -20,7 +20,6 @@ import java.lang.reflect.*;
 import java.util.*;
 
 import org.apache.juneau.*;
-import org.apache.juneau.MediaType;
 import org.apache.juneau.internal.*;
 import org.apache.juneau.transform.*;
 
@@ -43,7 +42,7 @@ public class SerializerSession extends BeanSession {
 	private final boolean
 		detectRecursions,
 		ignoreRecursions,
-		useIndentation,
+		useWhitespace,
 		addBeanTypeProperties,
 		trimNulls,
 		trimEmptyCollections,
@@ -103,7 +102,7 @@ public class SerializerSession extends BeanSession {
 			initialDepth = ctx.initialDepth;
 			detectRecursions = ctx.detectRecursions;
 			ignoreRecursions = ctx.ignoreRecursions;
-			useIndentation = ctx.useIndentation;
+			useWhitespace = ctx.useWhitespace;
 			addBeanTypeProperties = ctx.addBeanTypeProperties;
 			trimNulls = ctx.trimNulls;
 			trimEmptyCollections = ctx.trimEmptyCollections;
@@ -119,7 +118,7 @@ public class SerializerSession extends BeanSession {
 			initialDepth = op.getInt(SERIALIZER_initialDepth, ctx.initialDepth);
 			detectRecursions = op.getBoolean(SERIALIZER_detectRecursions, ctx.detectRecursions);
 			ignoreRecursions = op.getBoolean(SERIALIZER_ignoreRecursions, ctx.ignoreRecursions);
-			useIndentation = op.getBoolean(SERIALIZER_useIndentation, ctx.useIndentation);
+			useWhitespace = op.getBoolean(SERIALIZER_useWhitespace, ctx.useWhitespace);
 			addBeanTypeProperties = op.getBoolean(SERIALIZER_addBeanTypeProperties, ctx.addBeanTypeProperties);
 			trimNulls = op.getBoolean(SERIALIZER_trimNullProperties, ctx.trimNulls);
 			trimEmptyCollections = op.getBoolean(SERIALIZER_trimEmptyCollections, ctx.trimEmptyCollections);
@@ -273,12 +272,12 @@ public class SerializerSession extends BeanSession {
 	}
 
 	/**
-	 * Returns the {@link SerializerContext#SERIALIZER_useIndentation} setting value for this session.
+	 * Returns the {@link SerializerContext#SERIALIZER_useWhitespace} setting value for this session.
 	 *
-	 * @return The {@link SerializerContext#SERIALIZER_useIndentation} setting value for this session.
+	 * @return The {@link SerializerContext#SERIALIZER_useWhitespace} setting value for this session.
 	 */
-	public final boolean isUseIndentation() {
-		return useIndentation;
+	public final boolean isUseWhitespace() {
+		return useWhitespace;
 	}
 
 	/**
@@ -682,16 +681,63 @@ public class SerializerSession extends BeanSession {
 	/**
 	 * Create a "_type" property that contains the dictionary name of the bean.
 	 *
-	 * @param m
-	 * 	The bean map to create a class property on.
-	 * @return
-	 * 	A new bean property value.
+	 * @param m The bean map to create a class property on.
+	 * @param typeName The type name of the bean.
+	 * @return A new bean property value.
 	 */
-	public BeanPropertyValue createBeanTypeNameProperty(BeanMap<?> m) {
+	public BeanPropertyValue createBeanTypeNameProperty(BeanMap<?> m, String typeName) {
 		BeanMeta<?> bm = m.getMeta();
-		String name = bm.getClassMeta().getDictionaryName();
-		if (name == null)
+		return new BeanPropertyValue(bm.getTypeProperty(), typeName, null);
+	}
+
+	/**
+	 * Resolves the dictionary name for the actual type.
+	 *
+	 * @param eType The expected type of the bean property.
+	 * @param aType The actual type of the bean property.
+	 * @param pMeta The current bean property being serialized.
+	 * @return The bean dictionary name, or <jk>null</jk> if a name could not be found.
+	 */
+	public String getBeanTypeName(ClassMeta<?> eType, ClassMeta<?> aType, BeanPropertyMeta pMeta) {
+		if (eType == aType)
 			return null;
-		return new BeanPropertyValue(bm.getTypeProperty(), name, null);
+
+		if (! addBeanTypeProperties)
+			return null;
+
+		String eTypeTn = eType.getDictionaryName();
+
+		// First see if it's defined on the actual type.
+		String tn = aType.getDictionaryName();
+		if (tn != null && ! tn.equals(eTypeTn)) {
+			return tn;
+		}
+
+		// Then see if it's defined on the expected type.
+		// The expected type might be an interface with mappings for implementation classes.
+		BeanRegistry br = eType.getBeanRegistry();
+		if (br != null) {
+			tn = br.getTypeName(aType);
+			if (tn != null && ! tn.equals(eTypeTn))
+				return tn;
+		}
+
+		// Then look on the bean property.
+		br = pMeta == null ? null : pMeta.getBeanRegistry();
+		if (br != null) {
+			tn = br.getTypeName(aType);
+			if (tn != null && ! tn.equals(eTypeTn))
+				return tn;
+		}
+
+		// Finally look in the session.
+		br = getBeanRegistry();
+		if (br != null) {
+			tn = br.getTypeName(aType);
+			if (tn != null && ! tn.equals(eTypeTn))
+				return tn;
+		}
+
+		return null;
 	}
 }

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/097b8103/juneau-core/src/main/java/org/apache/juneau/serializer/SerializerWriter.java
----------------------------------------------------------------------
diff --git a/juneau-core/src/main/java/org/apache/juneau/serializer/SerializerWriter.java b/juneau-core/src/main/java/org/apache/juneau/serializer/SerializerWriter.java
index 00f8b8b..1e6272b 100644
--- a/juneau-core/src/main/java/org/apache/juneau/serializer/SerializerWriter.java
+++ b/juneau-core/src/main/java/org/apache/juneau/serializer/SerializerWriter.java
@@ -33,9 +33,6 @@ public class SerializerWriter extends Writer {
 	/** The underlying writer. */
 	protected final Writer out;
 
-	/** Use-indentation flag. */
-	protected final boolean useIndentation;
-
 	/** Use-whitespace flag. */
 	protected final boolean useWhitespace;
 
@@ -53,16 +50,14 @@ public class SerializerWriter extends Writer {
 
 	/**
 	 * @param out The writer being wrapped.
-	 * @param useIndentation If <jk>true</jk>, calling {@link #cr(int)} will create an indentation.
-	 * @param useWhitespace If <jk>true</jk>, calling {@link #s()} will write a space character.
+	 * @param useWhitespace If <jk>true</jk>, calling {@link #cr(int)} will create an indentation and calling {@link #s()} will write a space character.
 	 * @param trimStrings If <jk>true</jk>, strings should be trimmed before they're serialized.
 	 * @param quoteChar The character to write when {@link #q()} is called.
 	 * @param relativeUriBase The base (e.g. <js>https://localhost:9443/contextPath"</js>) for relative URIs (e.g. <js>"my/path"</js>).
 	 * @param absolutePathUriBase The base (e.g. <js>https://localhost:9443"</js>) for relative URIs with absolute paths (e.g. <js>"/contextPath/my/path"</js>).
 	 */
-	public SerializerWriter(Writer out, boolean useIndentation, boolean useWhitespace, boolean trimStrings, char quoteChar, String relativeUriBase, String absolutePathUriBase) {
+	public SerializerWriter(Writer out, boolean useWhitespace, boolean trimStrings, char quoteChar, String relativeUriBase, String absolutePathUriBase) {
 		this.out = out;
-		this.useIndentation = useIndentation;
 		this.useWhitespace = useWhitespace;
 		this.trimStrings = trimStrings;
 		this.quoteChar = quoteChar;
@@ -73,21 +68,21 @@ public class SerializerWriter extends Writer {
 	/**
 	 * Performs a carriage return.
 	 * <p>
-	 * 	Adds a newline and the specified number of tabs (if the {@code useIndentation} setting is enabled) to the output.
+	 * 	Adds a newline and the specified number of tabs (if the {@code useWhitespace} setting is enabled) to the output.
 	 *
 	 * @param depth The indentation.
 	 * @throws IOException If a problem occurred trying to write to the writer.
 	 * @return This object (for method chaining).
 	 */
 	public SerializerWriter cr(int depth) throws IOException {
-		if (useIndentation)
+		if (useWhitespace)
 			return nl().i(depth);
 		return this;
 	}
 
 	/**
-	 * Writes an indent (if the {@code useIndentation} setting is enabled), followed by text,
-	 * 	followed by a newline (if the {@code useIndentation} setting is enabled).
+	 * Writes an indent (if the {@code useWhitespace} setting is enabled), followed by text,
+	 * 	followed by a newline (if the {@code useWhitespace} setting is enabled).
 	 *
 	 * @param indent The number of tabs to indent.
 	 * @param text The text to write.
@@ -99,7 +94,7 @@ public class SerializerWriter extends Writer {
 	}
 
 	/**
-	 * Writes the specified text followed by a newline (if the {@code useIndentation} setting is enabled).
+	 * Writes the specified text followed by a newline (if the {@code useWhitespace} setting is enabled).
 	 *
 	 * @param text The text to write.
 	 * @throws IOException If a problem occurred trying to write to the writer.
@@ -110,7 +105,7 @@ public class SerializerWriter extends Writer {
 	}
 
 	/**
-	 * Writes an indent (if the {@code useIndentation} setting is enabled), followed by text.
+	 * Writes an indent (if the {@code useWhitespace} setting is enabled), followed by text.
 	 *
 	 * @param indent The number of tabs to indent.
 	 * @param text The text to write.
@@ -122,7 +117,7 @@ public class SerializerWriter extends Writer {
 	}
 
 	/**
-	 * Writes an indent (if the {@code useIndentation} setting is enabled), followed by text.
+	 * Writes an indent (if the {@code useWhitespace} setting is enabled), followed by text.
 	 *
 	 * @param indent The number of tabs to indent.
 	 * @param c The character to write.
@@ -134,8 +129,8 @@ public class SerializerWriter extends Writer {
 	}
 
 	/**
-	 * Writes an indent (if the {@code useIndentation} setting is enabled), followed by text,
-	 * 	optionally followed by a newline (if the {@code useIndentation} setting is enabled).
+	 * Writes an indent (if the {@code useWhitespace} setting is enabled), followed by text,
+	 * 	optionally followed by a newline (if the {@code useWhitespace} setting is enabled).
 	 *
 	 * @param indent The number of tabs to indent.
 	 * @param newline If <jk>true</jk>, then a newline is written.
@@ -222,40 +217,40 @@ public class SerializerWriter extends Writer {
 	}
 
 	/**
-	 * Writes an indent to the writer if the {@code useIndentation} setting is enabled.
+	 * Writes an indent to the writer if the {@code useWhitespace} setting is enabled.
 	 *
 	 * @param indent The number of tabs to indent.
 	 * @throws IOException If a problem occurred trying to write to the writer.
 	 * @return This object (for method chaining).
 	 */
 	public SerializerWriter i(int indent) throws IOException {
-		if (useIndentation)
+		if (useWhitespace)
 			for (int i = 0; i < indent; i++)
 				out.write('\t');
 		return this;
 	}
 
 	/**
-	 * Writes a newline to the writer if the {@code useIndentation} setting is enabled.
+	 * Writes a newline to the writer if the {@code useWhitespace} setting is enabled.
 	 *
 	 * @throws IOException If a problem occurred trying to write to the writer.
 	 * @return This object (for method chaining).
 	 */
 	public SerializerWriter nl() throws IOException {
-		if (useIndentation)
+		if (useWhitespace)
 			out.write('\n');
 		return this;
 	}
 
 	/**
-	 * Writes a newline to the writer if the {@code useIndentation} setting is enabled and the boolean flag is true.
+	 * Writes a newline to the writer if the {@code useWhitespace} setting is enabled and the boolean flag is true.
 	 *
 	 * @param b The boolean flag.
 	 * @return This object (for method chaining).
 	 * @throws IOException If a problem occurred trying to write to the writer.
 	 */
 	public SerializerWriter nlIf(boolean b) throws IOException {
-		if (b && useIndentation)
+		if (b && useWhitespace)
 			out.write('\n');
 		return this;
 	}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/097b8103/juneau-core/src/main/java/org/apache/juneau/serializer/WriterSerializer.java
----------------------------------------------------------------------
diff --git a/juneau-core/src/main/java/org/apache/juneau/serializer/WriterSerializer.java b/juneau-core/src/main/java/org/apache/juneau/serializer/WriterSerializer.java
index 27aa39c..8a38a88 100644
--- a/juneau-core/src/main/java/org/apache/juneau/serializer/WriterSerializer.java
+++ b/juneau-core/src/main/java/org/apache/juneau/serializer/WriterSerializer.java
@@ -99,7 +99,7 @@ public abstract class WriterSerializer extends Serializer {
 	 * @return This object (for method chaining).
 	 */
 	public final WriterSerializer println(Object o) {
-		System.out.println(toString(o));
+		System.out.println(toString(o));  // NOT DEBUG
 		return this;
 	}
 }

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/097b8103/juneau-core/src/main/java/org/apache/juneau/transform/AnnotationBeanFilterBuilder.java
----------------------------------------------------------------------
diff --git a/juneau-core/src/main/java/org/apache/juneau/transform/AnnotationBeanFilterBuilder.java b/juneau-core/src/main/java/org/apache/juneau/transform/AnnotationBeanFilterBuilder.java
index a194286..76c8dc0 100644
--- a/juneau-core/src/main/java/org/apache/juneau/transform/AnnotationBeanFilterBuilder.java
+++ b/juneau-core/src/main/java/org/apache/juneau/transform/AnnotationBeanFilterBuilder.java
@@ -32,10 +32,10 @@ public final class AnnotationBeanFilterBuilder extends BeanFilterBuilder {
 	 * @param annotations The {@link Bean @Bean} annotations found on the class and all parent classes in child-to-parent order.
 	 * @throws Exception Thrown from property namer constructor.
 	 */
-	public AnnotationBeanFilterBuilder(Class<?> annotatedClass, List<Bean> annotations) throws Exception {
+	public AnnotationBeanFilterBuilder(Class<?> annotatedClass, Map<Class<?>,Bean> annotations) throws Exception {
 		super(annotatedClass);
 
-		ListIterator<Bean> li = annotations.listIterator(annotations.size());
+		ListIterator<Bean> li = new ArrayList<Bean>(annotations.values()).listIterator(annotations.size());
 		while (li.hasPrevious()) {
 			Bean b = li.previous();
 
@@ -60,19 +60,8 @@ public final class AnnotationBeanFilterBuilder extends BeanFilterBuilder {
 			if (b.stopClass() != Object.class)
 				setStopClass(b.stopClass());
 
-			if (b.subTypes().length > 0) {
-				setSubTypeProperty(b.subTypeProperty());
-
-				for (Class<?> bst : b.subTypes()) {
-					Bean b2 = bst.getAnnotation(Bean.class);
-					String name = null;
-					if (! b2.typeName().isEmpty())
-						name = b2.typeName();
-					else
-						name = bst.getSimpleName();
-					addSubType(name, bst);
-				}
-			}
+			if (b.beanDictionary().length > 0)
+				addToBeanDictionary(b.beanDictionary());
 		}
 	}
 }

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/097b8103/juneau-core/src/main/java/org/apache/juneau/transform/BeanFilter.java
----------------------------------------------------------------------
diff --git a/juneau-core/src/main/java/org/apache/juneau/transform/BeanFilter.java b/juneau-core/src/main/java/org/apache/juneau/transform/BeanFilter.java
index b4fc90e..3817910 100644
--- a/juneau-core/src/main/java/org/apache/juneau/transform/BeanFilter.java
+++ b/juneau-core/src/main/java/org/apache/juneau/transform/BeanFilter.java
@@ -12,8 +12,6 @@
 // ***************************************************************************************************************************
 package org.apache.juneau.transform;
 
-import java.util.*;
-
 import org.apache.juneau.*;
 import org.apache.juneau.annotation.*;
 import org.apache.juneau.internal.*;
@@ -31,12 +29,11 @@ public class BeanFilter {
 
 	private final Class<?> beanClass;
 	private final String[] properties, excludeProperties;
-	private final Map<Class<?>, String> subTypes;
-	private final String subTypeAttr;
 	private final PropertyNamer propertyNamer;
 	private final Class<?> interfaceClass, stopClass;
 	private final boolean sortProperties;
 	private final String typeName;
+	private final Class<?>[] beanDictionary;
 
 	/**
 	 * Constructor.
@@ -50,8 +47,7 @@ public class BeanFilter {
 		this.stopClass = builder.stopClass;
 		this.sortProperties = builder.sortProperties;
 		this.propertyNamer = builder.propertyNamer;
-		this.subTypeAttr = builder.subTypeProperty;
-		this.subTypes = builder.subTypes == null ? null : Collections.unmodifiableMap(builder.subTypes);
+		this.beanDictionary = builder.beanDictionary == null ? null : builder.beanDictionary.toArray(new Class<?>[builder.beanDictionary.size()]);
 	}
 
 	/**
@@ -80,6 +76,15 @@ public class BeanFilter {
 	}
 
 	/**
+	 * Returns the bean dictionary defined on this bean.
+	 *
+	 * @return The bean dictionary defined on this bean, or <jk>null</jk> if no bean dictionary is defined.
+	 */
+	public Class<?>[] getBeanDictionary() {
+		return beanDictionary;
+	}
+
+	/**
 	 * Returns <jk>true</jk> if the properties defined on this bean class should be ordered alphabetically.
 	 * <p>
 	 * 	This method is only used when the {@link #getProperties()} method returns <jk>null</jk>.
@@ -110,24 +115,6 @@ public class BeanFilter {
 	}
 
 	/**
-	 * Returns the name of the sub type property associated with the bean class.
-	 *
-	 * @return The sub type property name, or <jk>null</jk> if bean has no subtypes defined.
-	 */
-	public String getSubTypeProperty() {
-		return subTypeAttr;
-	}
-
-	/**
-	 * Returns the subtypes associated with the bean class.
-	 *
-	 * @return The set of sub types associated with this bean class, or <jk>null</jk> if bean has no subtypes defined.
-	 */
-	public Map<Class<?>, String> getSubTypes() {
-		return subTypes;
-	}
-
-	/**
 	 * Returns the interface class associated with this class.
 	 *
 	 * @return The interface class associated with this class, or <jk>null</jk> if no interface class is associated.

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/097b8103/juneau-core/src/main/java/org/apache/juneau/transform/BeanFilterBuilder.java
----------------------------------------------------------------------
diff --git a/juneau-core/src/main/java/org/apache/juneau/transform/BeanFilterBuilder.java b/juneau-core/src/main/java/org/apache/juneau/transform/BeanFilterBuilder.java
index 6c2928f..b56ce30 100644
--- a/juneau-core/src/main/java/org/apache/juneau/transform/BeanFilterBuilder.java
+++ b/juneau-core/src/main/java/org/apache/juneau/transform/BeanFilterBuilder.java
@@ -51,8 +51,7 @@ public abstract class BeanFilterBuilder {
 	Class<?> interfaceClass, stopClass;
 	boolean sortProperties;
 	PropertyNamer propertyNamer;
-	String subTypeProperty;
-	Map<Class<?>,String> subTypes;
+	List<Class<?>> beanDictionary;
 
 	/**
 	 * Constructor.
@@ -205,87 +204,16 @@ public abstract class BeanFilterBuilder {
 	}
 
 	/**
-	 * Defines a virtual property on a superclass that identifies bean subtype classes.
-	 * <p>
-	 * In the following example, the abstract class has two subclasses that are differentiated
-	 * 	by a property called <code>subType</code>
-	 *
-	 * <p class='bcode'>
-	 * 	<jc>// Abstract superclass</jc>
-	 * 	<jk>public abstract class</jk> A {
-	 * 		<jk>public</jk> String <jf>f0</jf> = <js>"f0"</js>;
-	 * 	}
-	 *
-	 * 	<jc>// Subclass 1</jc>
-	 * 	<jk>public class</jk> A1 <jk>extends</jk> A {
-	 * 		<jk>public</jk> String <jf>f1</jf>;
-	 * 	}
-	 *
-	 * 	<jc>// Subclass 2</jc>
-	 * 	<jk>public class</jk> A2 <jk>extends</jk> A {
-	 * 		<jk>public</jk> String <jf>f2</jf>;
-	 * 	}
-	 *
-	 * 	<jc>// Filter for defining subtypes</jc>
-	 * 	<jk>public class</jk> AFilter <jk>extends</jk> BeanFilterBuilder {
-	 * 		<jk>public</jk> AFilter() {
-	 * 			super(A.<jk>class</jk>);
-	 * 			setSubTypeProperty(<js>"subType"</js>);
-	 *				addSubType("A1", A1.<jk>class</jk>);
-	 *				addSubType("A2", A2.<jk>class</jk>);
-	 * 		}
-	 * 	}
-	 * </p>
-	 * <p>
-	 * The following shows what happens when serializing a subclassed object to JSON:
-	 * <p class='bcode'>
-	 * 	JsonSerializer s = <jk>new</jk> JsonSerializer().addBeanFilters(AFilter.<jk>class</jk>);
-	 * 	A1 a1 = <jk>new</jk> A1();
-	 * 	a1.<jf>f1</jf> = <js>"f1"</js>;
-	 * 	String r = s.serialize(a1);
-	 * 	<jsm>assertEquals</jsm>(<js>"{subType:'A1',f1:'f1',f0:'f0'}"</js>, r);
-	 *	</p>
-	 * <p>
-	 * The following shows what happens when parsing back into the original object.
-	 * <p class='bcode'>
-	 * 	JsonParser p = <jk>new</jk> JsonParser().addBeanFilters(AFilter.<jk>class</jk>);
-	 * 	A a = p.parse(r, A.<jk>class</jk>);
-	 * 	<jsm>assertTrue</jsm>(a <jk>instanceof</jk> A1);
-	 * </p>
-	 *
-	 * @param subTypeProperty The name of the subtype property for this bean.
-	 * 	Default is <js>"_subtype"</js>.
-	 * @return This object (for method chaining).
-	 */
-	public BeanFilterBuilder setSubTypeProperty(String subTypeProperty) {
-		this.subTypeProperty = subTypeProperty;
-		return this;
-	}
-
-	/**
-	 * Specifies the subtype mappings for this bean class.
-	 * See {@link #setSubTypeProperty(String)}.
-	 *
-	 * @param subTypes The mappings of subtype classes to subtype names.
-	 * @return This object (for method chaining).
-	 */
-	public BeanFilterBuilder setSubTypes(Map<Class<?>,String> subTypes) {
-		this.subTypes = subTypes;
-		return this;
-	}
-
-	/**
-	 * Adds an entry to the subtype mappings for this bean class.
-	 * See {@link #setSubTypeProperty(String)}.
+	 * Adds a class to this bean's bean dictionary.
 	 *
-	 * @param name The subtype name.
-	 * @param c The subtype class.
+	 * @param c The class to add to this bean dictionary.
 	 * @return This object (for method chaining).
 	 */
-	public BeanFilterBuilder addSubType(String name, Class<?> c) {
-		if (subTypes == null)
-			subTypes = new LinkedHashMap<Class<?>,String>();
-		subTypes.put(c, name);
+	public BeanFilterBuilder addToBeanDictionary(Class<?>...c) {
+		if (beanDictionary == null)
+			beanDictionary = new ArrayList<Class<?>>(Arrays.asList(c));
+		else for (Class<?> cc : c)
+			beanDictionary.add(cc);
 		return this;
 	}
 

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/097b8103/juneau-core/src/main/java/org/apache/juneau/transform/package.html
----------------------------------------------------------------------
diff --git a/juneau-core/src/main/java/org/apache/juneau/transform/package.html b/juneau-core/src/main/java/org/apache/juneau/transform/package.html
index 9a9b2a6..f9722e3 100644
--- a/juneau-core/src/main/java/org/apache/juneau/transform/package.html
+++ b/juneau-core/src/main/java/org/apache/juneau/transform/package.html
@@ -210,81 +210,6 @@
 	}
 		</p>
 		
-		<h6 class='topic'>Define bean subtypes</h6>
-		<p>
-			Juneau allows you to losslessly serialize and parse abstract class fields back into the original 
-				concrete objects by defining a subtype attribute and a list of subtypes/ids.
-		</p>
-		<p>
-			For example, let's define the following parent class with two subclasses:
-		</p>
-		<p class='bcode'>
-	<jc>// Abstract parent class</jc>
-	<jk>public abstract class</jk> MyClass {
-		<jk>public</jk> String <jf>foo</jf>=<js>"foo"</js>;
-	}
-
-	<jc>// Subclass 1</jc>
-	<jk>public class</jk> MyClassBar <jk>extends</jk> MyClass {
-		<jk>public</jk> String <jf>bar</jf>=<js>"bar"</js>;
-	}
-	
-	<jc>// Subclass 2</jc>
-	<jk>public class</jk> MyClassBaz <jk>extends</jk> MyClass {
-		<jk>public</jk> String <jf>baz</jf>=<js>"baz"</js>;
-	}
-		</p>
-		<p>
-			Normally, when parsing a serialized <code>MyClass</code> object, the parser does not know what subtype to create.
-			This can be fixed by defining the following bean filter:
-		</p>		
-		<p class='bcode'>
-	<jc>// Define bean filter with our own property namer.</jc>
-	<jk>public class</jk> MyBeanFilter <jk>extends</jk> BeanFilter&lt;MyClass&gt; {
-		<jk>public</jk> MyBeanFilter() {
-			setSubTypeProperty(<js>"subType"</js>);
-			addSubType(MyClassBar.<jk>class</jk>, <js>"BAR"</js>);
-			addSubType(MyClassBaz.<jk>class</jk>, <js>"BAZ"</js>);
-		}
-	}
-		</p>
-		<p>
-			When serialized, the serialized bean will include a <code>"subType"</code> attribute that identifies the subclass, and
-				allows it to be parsed back into the original subclass.
-		</p>
-		<p class='bcode'>
-	<jc>// Serialize to JSON</jc>
-	WriterSerializer s = <jk>new</jk> JsonSerializer().addBeanFilters(MyBeanFilter.<jk>class</jk>);
-	MyClass c = <jk>new</jk> MyClassBar();
-	String json = s.serialize(p);  <jc>// Prints "{subType:'BAR',foo:'foo',bar:'bar'}"</jc>
-	
-	<jc>// Parse back into bean</jc>
-	ReaderParser p = <jk>new</jk> JsonParser().addBeanFilters(MyBeanFilter.<jk>class</jk>);
-	c = p.parse(json, MyClass.<jk>class</jk>); <jc>// c is an instance of MyClassBar</jc>
-		</p>	
-		<p>
-			It should be noted that the sub type attribute is always rendered first in the JSON object so 
-				that the bean object can be instantiated before the real properties are set on it during parsing.  
-			Beans with subtypes are thus 'lazy-instantiated' when the sub type attribute is set.
-			If the sub type attribute is not listed first, the parser will still be able to parse the input,
-			but with reduced efficiency since it must cache the incoming data until the bean can be instantiated.
-		</p>
-		<p>
-			Note that this bean filter is equivalent to specifying the following annotation on the bean class:
-		</p>
-		<p class='bcode'>
-	<ja>@Bean</ja>(
-		subTypeProperty=<js>"subType"</js>,
-		subTypes={
-			<ja>@BeanSubType</ja>(type=MyClassBar.<jk>class</jk>, id=<js>"BAR"</js>),
-			<ja>@BeanSubType</ja>(type=MyClassBaz.<jk>class</jk>, id=<js>"BAZ"</js>)
-		}
-	)
-	<jk>public abstract class</jk> MyClass {
-		...
-	}
-		</p>
-			
 		<h6 class='topic'>Limiting bean properties to parent bean classes</h6>
 		<p>
 			Occassionally, you may want to limit bean properties to some parent interface.


[2/8] incubator-juneau git commit: Modification to UON spec. Remove bean subtype support.

Posted by ja...@apache.org.
http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/097b8103/juneau-core/src/main/java/org/apache/juneau/urlencoding/package.html
----------------------------------------------------------------------
diff --git a/juneau-core/src/main/java/org/apache/juneau/urlencoding/package.html b/juneau-core/src/main/java/org/apache/juneau/urlencoding/package.html
index d75d638..35f591c 100644
--- a/juneau-core/src/main/java/org/apache/juneau/urlencoding/package.html
+++ b/juneau-core/src/main/java/org/apache/juneau/urlencoding/package.html
@@ -137,7 +137,68 @@
 		<p>
 			By appending <code>?Accept=application/x-www-form-urlencoded&amp;plainText=true</code> to the URL, you can view the data as a URL-encoded string:
 		</p>
-		<img class='bordered' src="doc-files/Example_UrlEncoding.png">
+		<p class='bcode'>
+	<un>0</un>=(
+		<ua>uri</ua>=<us>http://localhost:10000/addressBook/people/1</us>,
+		<ua>addressBookUri</ua>=<us>http://localhost:10000/addressBook/</us>,
+		<ua>id</ua>=<un>1</un>,
+		<ua>name</ua>=<us>'Barack+Obama'</us>,
+		<ua>birthDate</ua>=<us>'Aug+4,+1961'</us>,
+		<ua>addresses</ua>=@(
+			(
+				<ua>uri</ua>=<us>http://localhost:10000/addressBook/addresses/1</us>,
+				<ua>personUri</ua>=<us>http://localhost:10000/addressBook/people/1</us>,
+				<ua>id</ua>=<un>1</un>,
+				<ua>street</ua>=<us>'1600+Pennsylvania+Ave'</us>,
+				<ua>city</ua>=<us>Washington</us>,
+				<ua>state</ua>=<us>DC</us>,
+				<ua>zip</ua>=<un>20500</un>,
+				<ua>isCurrent</ua>=<uk>true</uk>
+			),
+			(
+				<ua>uri</ua>=<us>http://localhost:10000/addressBook/addresses/2</us>,
+				<ua>personUri</ua>=<us>http://localhost:10000/addressBook/people/1</us>,
+				<ua>id</ua>=<un>2</un>,
+				<ua>street</ua>=<us>'5046+S+Greenwood+Ave'</us>,
+				<ua>city</ua>=<us>Chicago</us>,
+				<ua>state</ua>=<us>IL</us>,
+				<ua>zip</ua>=<un>60615</un>,
+				<ua>isCurrent</ua>=<uk>false</uk>
+			)
+		),
+		<ua>age</ua>=<un>56</un>
+	)
+	&amp;<un>1</un>=(
+		<ua>uri</ua>=<us>http://localhost:10000/addressBook/people/2</us>,
+		<ua>addressBookUri</ua>=<us>http://localhost:10000/addressBook/</us>,
+		<ua>id</ua>=<un>2</un>,
+		<ua>name</ua>=<us>'George+Walker+Bush'</us>,
+		<ua>birthDate</ua>=<us>'Jul+6,+1946'</us>,
+		<ua>addresses</ua>=@(
+			(
+				<ua>uri</ua>=<us>http://localhost:10000/addressBook/addresses/3</us>,
+				<ua>personUri</ua>=<us>http://localhost:10000/addressBook/people/2</us>,
+				<ua>id</ua>=<un>3</un>,
+				<ua>street</ua>=<us>'43+Prairie+Chapel+Rd'</us>,
+				<ua>city</ua>=<us>Crawford</us>,
+				<ua>state</ua>=<us>TX</us>,
+				<ua>zip</ua>=<un>76638</un>,
+				<ua>isCurrent</ua>=<uk>true</uk>
+			),
+			(
+				<ua>uri</ua>=<us>http://localhost:10000/addressBook/addresses/4</us>,
+				<ua>personUri</ua>=<us>http://localhost:10000/addressBook/people/2</us>,
+				<ua>id</ua>=<un>4</un>,
+				<ua>street</ua>=<us>'1600+Pennsylvania+Ave'</us>,
+				<ua>city</ua>=<us>Washington</us>,
+				<ua>state</ua>=<us>DC</us>,
+				<ua>zip</ua>=<un><us>20500</un>,
+				<ua>isCurrent</ua>=<uk>false</uk>
+			)
+		),
+		<ua>age</ua>=<un>71</un>
+	)		
+		</p>
 		
 		<p>
 			Juneau supports two kinds of serialization:
@@ -150,64 +211,77 @@
 			Top-level beans and maps can serialized as key/value pairs as shown below:
 		</p>
 		<h6 class='figure'>Example:  A bean with 2 string properties, 'foo' and 'baz', serialized to a query string</h6>
-		<p class='bcode'>	http://localhost/sample?<xa>foo</xa>=<xs>bar</xs>&amp;<xa>baz</xa>=<xs>bing</xs></p>
+		<p class='bcode'>	
+	http://localhost/sample?<ua>foo</ua>=<us>bar</us>&amp;<ua>baz</ua>=<us>bing</us>
+		</p>
 		<p>
-			Lower-level beans and maps are also serialized as key/value pairs, but are surrounded with a <js>"$o(...)"</js> construct to denote an object mapping, 
+			Lower-level beans and maps are also serialized as key/value pairs, but are surrounded with a <js>"(...)"</js> construct to denote an object mapping, 
 				and uses a comma as the parameter delimiter instead of <js>"&amp;"</js>.<br>
 		</p>
 		<h6 class='figure'>Example:  A bean serialized as a query parameter value.</h6>
-		<p class='bcode'>	http://localhost/sample?<xa>a1</xa>=$o(<xa>foo</xa>=<xs>bar</xs>,<xa>baz</xa>=<xs>bing</xs>)</p>
-		<p>
-			The UON specification defines two separate modes:  
+		<p class='bcode'>	
+	http://localhost/sample?<ua>a1</ua>=(<ua>foo</ua>=<us>bar</us>,<ua>baz</ua>=<us>bing</us>)
 		</p>
-		<ul class='spaced-list'>
-			<li>Strict mode - Serialized model is fully equivalent to JSON and can be losslessly converted back and forth into a JSON model without additional information.
-			<li>Lax mode - A shortened form that excludes data type information.  Ideal if the data types of values are fixed and already known by the parser.
-		</ul>
+		
+		<h6 class='figure'>General methodology:</h6>
 		<table class='styled' style='border-collapse: collapse;'>
-			<tr><th>Java type</th><th>JSON equivalent</th><th>Strict syntax</th><th>Lax syntax</th></tr>
+			<tr><th>Java type</th><th>JSON equivalent</th><th>UON</th></tr>
 			<tr>
 				<td>Maps/beans</td>
 				<td>OBJECT</td>
-				<td class='code'><xa>a1</xa>=$o(<xa>b1</xa>=<xs>x1</xs>,<xa>b2</xa>=<xs>x2</xs>)<br><xa>a1</xa>=$o(<xa>b1</xa>=$o(<xa>c1</xa>=<xs>x1</xs>,<xa>c2</xa>=<xs>x2</xs>))</td>
-				<td class='code'><xa>a1</xa>=(<xa>b1</xa>=<xs>x1</xs>,<xa>b2</xa>=<xs>x2</xs>)<br><xa>a1</xa>=(<xa>b1</xa>=(<xa>c1</xa>=<xs>x1</xs>,<xa>c2</xa>=<xs>x2</xs>))</td>
+				<td class='code'>
+	<ua>a1</ua>=(<ua>b1</ua>=<us>x1</us>,<ua>b2</ua>=<us>x2</us>)
+	<ua>a1</ua>=(<ua>b1</ua>=(<ua>c1</ua>=<us>x1</us>,<ua>c2</ua>=<us>x2</us>))
+				</td>
 			</tr>
 			<tr>
 				<td>Collections/arrays</td>
 				<td>ARRAY</td>
-				<td class='code'><xa>a1</xa>=$a(<xs>x1</xs>,<xs>x2</xs>)<br><xa>a1</xa>=$a($a(<xs>x1</xs>,<xs>x2</xs>),$a(<xs>x3</xs>,<xs>x4</xs>))<br><xa>a1</xa>=$a($o(<xa>b1</xa>=<xs>x1</xs>,<xa>b2</xa>=<xs>x2</xs>),$o(<xa>c1</xa>=<xs>x1</xs>,<xa>c2</xa>=<xs>x2</xs>))</td>
-				<td class='code'><xa>a1</xa>=(<xs>x1</xs>,<xs>x2</xs>)<br><xa>a1</xa>=((<xs>x1</xs>,<xs>x2</xs>),(<xs>x3</xs>,<xs>x4</xs>))<br><xa>a1</xa>=((<xa>b1</xa>=<xs>x1</xs>,<xa>b2</xa>=<xs>x2</xs>),(<xa>c1</xa>=<xs>x1</xs>,<xa>c2</xa>=<xs>x2</xs>))</td>
+				<td class='code'>
+	<ua>a1</ua>=@(<us>x1</us>,<us>x2</us>)
+	<ua>a1</ua>=@(@(<us>x1</us>,<us>x2</us>),@(<us>x3</us>,<us>x4</us>))
+	<ua>a1</ua>=@((<ua>b1</ua>=<us>x1</us>,<ua>b2</ua>=<us>x2</us>),(<ua>c1</ua>=<us>x1</us>,<ua>c2</ua>=<us>x2</us>))
+				</td>
 			</tr>
 			<tr>
 				<td>Booleans</td>
 				<td>BOOLEAN</td>
-				<td class='code'><xa>a1</xa>=$b(<xs>true</xs>)&amp;<xa>a2</xa>=$b(<xs>false</xs>)</td>
-				<td class='code'><xa>a1</xa>=<xs>true</xs>&amp;<xa>a2</xa>=<xs>false</xs></td>
+				<td class='code'>
+	<ua>a1</ua>=<uk>true</uk>&amp;<ua>a2</ua>=<uk>false</uk>
+				</td>
 			</tr>
 			<tr>
 				<td>int/float/double/...</td>
 				<td>NUMBER</td>
-				<td class='code'><xa>a1</xa>=$n(<xs>123</xs>)&amp;<xa>a2</xa>=$n(<xs>1.23e1</xs>)</td>
-				<td class='code'><xa>a1</xa>=<xs>123</xs>&amp;<xa>a2</xa>=<xs>1.23e1</xs></td>
+				<td class='code'>
+	<ua>a1</ua>=<un>123</un>&amp;<ua>a2</ua>=<un>1.23e1</un>
+				</td>
 			</tr>
 			<tr>
 				<td>null</td>
 				<td>NULL</td>
-				<td class='code'><xa>a1</xa>=<xs>%00</xs></td>
-				<td class='code'><xa>a1</xa>=<xs>%00</xs></td>
+				<td class='code'>
+	<ua>a1</ua>=<uk>null</uk>
+				</td>
 			</tr>
 			<tr>
 				<td>String</td>
 				<td>STRING</td>
-				<td class='code'><xa>a1</xa>=<xs>foobar</xs></td>
-				<td class='code'><xa>a1</xa>=<xs>foobar</xs></td>
+				<td class='code'>
+	<ua>a1</ua>=<us>foobar</us>
+	<ua>a1</ua>=<us>'true'</us>
+	<ua>a1</ua>=<us>'null'</us>
+	<ua>a1</ua>=<us>'123'</us>
+	<ua>a1</ua>=<us>' string with whitespace '</us>
+	<ua>a1</ua>=<us>'string with ~'escaped~' quotes'</us>
+				</td>
 			</tr>
 		</table>
 		<p>
 			Refer to the <a href='doc-files/rfc_uon.txt'>UON specification</a> for a complete set of syntax rules.		
 		<p>
 			<code>PojoSwaps</code> can be used to convert non-serializable POJOs into serializable forms, such as converting 
-				<code>Calendar</code> object to ISO8601 strings, or <code><jk>byte</jk>[]</code> arrays to Base-64 encoded strings.<br>
+				<code>Calendar</code> object to ISO8601 strings, or <code><uk>byte</uk>[]</code> arrays to Base-64 encoded strings.<br>
 			These transforms can be associated at various levels:
 		</p>
 		<ul class='spaced-list'>
@@ -216,7 +290,9 @@
 			<li>On bean properties through the <code><ja>@BeanProperty</ja></code> annotations.
 		</ul>
 		<h6 class='figure'>Example:  A serialized Calendar object using <code>CalendarSwap.RFC2822DTZ</code> transform.</h6>
-		<p class='bcode'>	http://localhost/sample?<xa>a1=<js>Sun~,+03+Mar+1901+09:05:06+GMT</js></p>
+		<p class='bcode'>	
+	http://localhost/sample?<ua>a1=<us>'Sun,+03+Mar+1901+09:05:06+GMT'</us>
+		</p>
 		<p>
 			For more information about transforms, refer to {@link org.apache.juneau.transform}.
 		</p>
@@ -241,23 +317,15 @@
 	</p>
 	<ul class='spaced-list'>
 		<li>{@link org.apache.juneau.urlencoding.UrlEncodingSerializer#DEFAULT} - All default settings, strict mode.
-		<li>{@link org.apache.juneau.urlencoding.UrlEncodingSerializer#DEFAULT_SIMPLE} - All default settings, lax mode.
 		<li>{@link org.apache.juneau.urlencoding.UrlEncodingSerializer#DEFAULT_READABLE} - Use whitespace and indentation for readability.
 		<li>{@link org.apache.juneau.urlencoding.UonSerializer#DEFAULT} - All default settings, strict mode.
-		<li>{@link org.apache.juneau.urlencoding.UonSerializer#DEFAULT_SIMPLE} - All default settings, lax mode.
 		<li>{@link org.apache.juneau.urlencoding.UonSerializer#DEFAULT_READABLE} - Use whitespace and indentation for readability.
 		<li>{@link org.apache.juneau.urlencoding.UonSerializer#DEFAULT_ENCODING} - Same as DEFAULT, but use URL-Encoding on special characters.
-		<li>{@link org.apache.juneau.urlencoding.UonSerializer#DEFAULT_SIMPLE_ENCODING} - Same as DEFAULT_SIMPLE, but use URL-Encoding on special characters.
 	</ul>
 	<p>
 		The general guidelines on which serializer to use is:
 	</p>
 	<ul class='spaced-list'>
-		<li>Use strict mode serializers if the data types of the value are not known on the parsing side, and this
-			information needs to be preserved during transmission.
-		<li>Use lax mode serializers if the data types of the value are known on the parsing side. 
-			For example, if you're serializing/parsing beans, lax mode is usually sufficient since the data types
-			can be inferred from the bean properties.
 		<li>Use encoding serializers when you're using the results to construct a URI yourself, and therefore 
 			need invalid URI characters to be encoded.
 		<li>Use unencoding serializers when you're creating parameter values and passing them off to some other
@@ -298,7 +366,7 @@
 	UonSerializer s = UonSerializer.<jsf>DEFAULT</jsf>;
 
 	<jc>// Create our bean.</jc>
-	Person p = <jk>new</jk> Person(1, <js>"John Smith"</js>);
+	Person p = <uk>new</uk> Person(1, <js>"John Smith"</js>);
 
 	<jc>// Serialize the bean to URL-encoded parameter value.</jc>
 	String urlencoded = s.serialize(p);
@@ -307,7 +375,7 @@
 		The code above produces the following output:
 	</p>
 	<p class='bcode'>
-	$o(<xa>id</xa>=$n(<xs>1</xs>),<xa>name</xa>=<xs>John+Smith</xs>)
+	(<ua>id</ua>=<un>1</un>,<ua>name</ua>=<us>'John+Smith'</us>)
 	</p>
 	<p>
 		The {@link org.apache.juneau.urlencoding.UrlEncodingSerializer} class converts
@@ -324,16 +392,9 @@
 		The code above produces the following output:
 	</p>
 	<p class='bcode'>
-	<xa>id</xa>=$n(<xs>1</xs>)&amp;<xa>name</xa>=<xs>John+Smith</xs>
+	<ua>id</ua>=<un>1</un>&amp;<ua>name</ua>=<us>'John+Smith'</us>
 	</p>
 	<p>
-		The general method guidelines are as follows:
-	</p>
-	<ul class='spaced-list'>
-		<li>Use <code>UonSerializer</code> to create individual query parameter values.
-		<li>Use <code>UrlEncodingSerializer</code> to create complete URL-encoded query strings.
-	</ul>
-	<p>
 		By default, the <code>UrlEncodingSerializer</code> class will URL-Encode special characters, and the <code>UonSerializer</code> will NOT URL-encode special characters.  
 	</p>
 	
@@ -370,7 +431,6 @@
 
 		<ja>@BeanProperty</ja>(swap=CalendarSwap.ISO8601DTZ.<jk>class</jk>) <jk>public</jk> Calendar <jf>birthDate</jf>;
 
-
 		<jc>// Bean constructor (needed by parser)</jc>
 		<jk>public</jk> Person() {}
 
@@ -396,13 +456,13 @@
 			Now when we rerun the sample code, we'll get the following:
 		</p>
 		<p class='bcode'>
-	$o(<xa>id</xa>=$n(<xs>1</xs>),<xa>name</xa>=<xs>John+Smith</xs>,<xa>uri</xa>=<xs>http://sample/addressBook/person/1</xs>,<xa>addressBookUri</xa>=<xs>http://sample/addressBook</xs>,<xa>birthDate</xa>=<xs>1946-08-12T00:00:00Z</xs>)
+	(<ua>id</ua>=<un>1</un>,<ua>name</ua>=<us>'John+Smith'</us>,<ua>uri</ua>=<us>http://sample/addressBook/person/1</us>,<ua>addressBookUri</ua>=<us>http://sample/addressBook</us>,<ua>birthDate</ua>=<us>1946-08-12T00:00:00Z</us>)
 		</p>
 		<p>
 			Using <code>UrlEncodingSerializer</code> instead would create the following:
 		</p>
 		<p class='bcode'>
-	<xa>id</xa>=$n(<xs>1</xs>)&amp;<xa>name</xa>=<xs>John+Smith</xs>&amp;<xa>uri</xa>=<xs>http://sample/addressBook/person/1</xs>&amp;<xa>addressBookUri</xa>=<xs>http://sample/addressBook</xs>&amp;<xa>birthDate</xa>=<xs>1946-08-12T00:00:00Z</xs>
+	<ua>id</ua>=<un>1</un>&amp;<ua>name</ua>=<us>'John+Smith'</us>&amp;<ua>uri</ua>=<us>http://sample/addressBook/person/1</us>&amp;<ua>addressBookUri</ua>=<us>http://sample/addressBook</us>&amp;<ua>birthDate</ua>=<us>1946-08-12T00:00:00Z</us>
 		</p>
 		<p>
 			Another useful feature is the {@link org.apache.juneau.annotation.Bean#propertyNamer()} annotation that allows you to plug in your own
@@ -418,7 +478,7 @@
 		</p>
 		<h6 class='figure'>Results</h6>
 		<p class='bcode'>
-	$o(<xa>id</xa>=$n(<xs>1</xs>),<xa>name</xa>=<xs>John+Smith</xs>,<xa>uri</xa>=<xs>http://sample/addressBook/person/1</xs>,<xa>address-book-uri</xa>=<xs>http://sample/addressBook</xs>,<xa>birth-date</xa>=<xs>1946-08-12T00:00:00Z</xs>)
+	(<ua>id</ua>=<un>1</us>,<ua>name</ua>=<us>'John+Smith'</us>,<ua>uri</ua>=<us>http://sample/addressBook/person/1</us>,<ua>address-book-uri</ua>=<us>http://sample/addressBook</us>,<ua>birth-date</ua>=<us>1946-08-12T00:00:00Z</us>)
 		</p>
 	</div>
 	
@@ -477,73 +537,45 @@
 			Now when we run the sample code, we get the following (in readable format):
 		</p>
 		<p class='bcode'>
-	$o(
-		<xa>id</xa>=$n(<xs>1</xs>), 
-		<xa>name</xa>=<xs>John+Smith</xs>, 
-		<xa>uri</xa>=<xs>http://sample/addressBook/person/1</xs>, 
-		<xa>addressBookUri</xa>=<xs>http://sample/addressBook</xs>,
-		<xa>birthDate</xa>=<xs>1946-08-12T00:00:00Z</xs>,
-		<xa>addresses</xa>=$a(
-			$o(
-				<xa>uri</xa>=<xs>http://sample/addressBook/address/1</xs>, 
-				<xa>personUri</xa>=<xs>http://sample/addressBook/person/1</xs>, 
-				<xa>id</xa>=$n(<xs>1</xs>), 
-				<xa>street</xa>=<xs>100+Main+Street</xs>, 
-				<xa>city</xa>=<xs>Anywhereville</xs>, 
-				<xa>state</xa>=<xs>NY</xs>, 
-				<xa>zip</xa>=$n(<xs>12345</xs>), 
-				<xa>isCurrent</xa>=$b(<xs>true</xs>)
-			)
-		)
-	)
-		</p>
-		<p>
-			If we were to use lax mode instead, we would get the following:
-		</p>
-		<p class='bcode'>
 	(
-		<xa>id</xa>=<xs>1</xs>, 
-		<xa>name</xa>=<xs>John+Smith</xs>, 
-		<xa>uri</xa>=<xs>http://sample/addressBook/person/1</xs>, 
-		<xa>addressBookUri</xa>=<xs>http://sample/addressBook</xs>,
-		<xa>birthDate</xa>=<xs>1946-08-12T00:00:00Z</xs>,
-		<xa>addresses</xa>=(
+		<ua>id</ua>=<un>1</un>, 
+		<ua>name</ua>=<us>'John+Smith'</us>, 
+		<ua>uri</ua>=<us>http://sample/addressBook/person/1</us>, 
+		<ua>addressBookUri</ua>=<us>http://sample/addressBook</us>,
+		<ua>birthDate</ua>=<us>1946-08-12T00:00:00Z</us>,
+		<ua>addresses</ua>=@(
 			(
-				<xa>uri</xa>=<xs>http://sample/addressBook/address/1</xs>, 
-				<xa>personUri</xa>=<xs>http://sample/addressBook/person/1</xs>, 
-				<xa>id</xa>=<xs>1</xs>, 
-				<xa>street</xa>=<xs>100+Main+Street</xs>, 
-				<xa>city</xa>=<xs>Anywhereville</xs>, 
-				<xa>state</xa>=<xs>NY</xs>, 
-				<xa>zip</xa>=<xs>12345</xs>, 
-				<xa>isCurrent</xa>=<xs>true</xs>
+				<ua>uri</ua>=<us>http://sample/addressBook/address/1</us>, 
+				<ua>personUri</ua>=<us>http://sample/addressBook/person/1</us>, 
+				<ua>id</ua>=<un>1</un>, 
+				<ua>street</ua>=<us>'100+Main+Street'</us>, 
+				<ua>city</ua>=<us>Anywhereville</us>, 
+				<ua>state</ua>=<us>NY</us>, 
+				<ua>zip</ua>=<un>12345</un>, 
+				<ua>isCurrent</ua>=<uk>true</uk>
 			)
 		)
 	)
 		</p>
 		<p>
-			Note how the data type information is removed, so it's not possible to distinguish between numbers/booleans/strings, and between objects/arrays.
-			However, this is fine if we're parsing back into the same beans, since we can inver the data types from the bean property metadata.
-		</p>
-		<p>
 			If we were to use <code>UrlEncodingSerializer</code> instead, we would get the following:
 		</p>
 		<p class='bcode'>
-	<xa>id</xa>=$n(<xs>1</xs>)&amp; 
-	<xa>name</xa>=<xs>John+Smith</xs>&amp; 
-	<xa>uri</xa>=<xs>http://sample/addressBook/person/1</xs>&amp; 
-	<xa>addressBookUri</xa>=<xs>http://sample/addressBook</xs>&amp;
-	<xa>birthDate</xa>=<xs>1946-08-12T00:00:00Z</xs>&amp;
-	<xa>addresses</xa>=$a(
-		$o(
-			<xa>uri</xa>=<xs>http://sample/addressBook/address/1</xs>, 
-			<xa>personUri</xa>=<xs>http://sample/addressBook/person/1</xs>, 
-			<xa>id</xa>=$n(<xs>1</xs>), 
-			<xa>street</xa>=<xs>100+Main+Street</xs>, 
-			<xa>city</xa>=<xs>Anywhereville</xs>, 
-			<xa>state</xa>=<xs>NY</xs>, 
-			<xa>zip</xa>=$n(<xs>12345</xs>), 
-			<xa>isCurrent</xa>=$b(<xs>true</xs>)
+	<ua>id</ua>=<un>1</un>&amp; 
+	<ua>name</ua>=<us>'John+Smith'</us>&amp; 
+	<ua>uri</ua>=<us>http://sample/addressBook/person/1</us>&amp; 
+	<ua>addressBookUri</ua>=<us>http://sample/addressBook</us>&amp;
+	<ua>birthDate</ua>=<us>1946-08-12T00:00:00Z</us>&amp;
+	<ua>addresses</ua>=@(
+		(
+			<ua>uri</ua>=<us>http://sample/addressBook/address/1</us>, 
+			<ua>personUri</ua>=<us>http://sample/addressBook/person/1</us>, 
+			<ua>id</ua>=<un>1</un>, 
+			<ua>street</ua>=<us>'100+Main+Street'</us>, 
+			<ua>city</ua>=<us>Anywhereville</us>, 
+			<ua>state</ua>=<us>NY</us>, 
+			<ua>zip</ua>=<un>12345</un>, 
+			<ua>isCurrent</ua>=<uk>true</uk>
 		)
 	)
 		</p>
@@ -552,8 +584,6 @@
 		Note how the top level <code>Person</code> bean is serialized using the standard <js>'&amp;'</js> delimiter, whereas the lower-level <code>Address</code>
 			bean is serialized using the <js>','</js> character to prevent the <code>addresses</code> field from being incompletely parsed.
 	</p>
-	
-
 
 
 	<!-- ======================================================================================================== -->
@@ -608,9 +638,9 @@
 			What we end up with is the following, which does not serialize the contents of the <code>c</code> field:
 		</p>
 		<p class='bcode'>
-	$o(
-		<xa>b</xa>=$o(
-			<xa>c</xa>=$o()
+	(
+		<ua>b</ua>=(
+			<ua>c</ua>=()
 		)
 	)
 		</p>
@@ -706,22 +736,22 @@
 		This code produced the following:
 	</p>
 	<p class='bcode'>
-	$o(
-		<xa>id</xa>=$n(<xs>1</xs>), 
-		<xa>name</xa>=<xs>John+Smith</xs>, 
-		<xa>uri</xa>=<xs>http://sample/addressBook/person/1</xs>, 
-		<xa>addressBookUri</xa>=<xs>http://sample/addressBook</xs>,
-		<xa>birthDate</xa>=<xs>1946-08-12T00:00:00Z</xs>,
-		<xa>addresses</xa>=$a(
-			$o(
-				<xa>uri</xa>=<xs>http://sample/addressBook/address/1</xs>, 
-				<xa>personUri</xa>=<xs>http://sample/addressBook/person/1</xs>, 
-				<xa>id</xa>=$n(<xs>1</xs>), 
-				<xa>street</xa>=<xs>100+Main+Street</xs>, 
-				<xa>city</xa>=<xs>Anywhereville</xs>, 
-				<xa>state</xa>=<xs>NY</xs>, 
-				<xa>zip</xa>=$n(<xs>12345</xs>), 
-				<xa>isCurrent</xa>=$b(<xs>true</xs>)
+	(
+		<ua>id</ua>=<un>1</un>, 
+		<ua>name</ua>=<us>'John+Smith'</us>, 
+		<ua>uri</ua>=<us>http://sample/addressBook/person/1</us>, 
+		<ua>addressBookUri</ua>=<us>http://sample/addressBook</us>,
+		<ua>birthDate</ua>=<us>1946-08-12T00:00:00Z</us>,
+		<ua>addresses</ua>=@(
+			(
+				<ua>uri</ua>=<us>http://sample/addressBook/address/1</us>, 
+				<ua>personUri</ua>=<us>http://sample/addressBook/person/1</us>, 
+				<ua>id</ua>=<un>1</un>, 
+				<ua>street</ua>=<us>'100+Main+Street'</us>, 
+				<ua>city</ua>=<us>Anywhereville</us>, 
+				<ua>state</ua>=<us>NY</us>, 
+				<ua>zip</ua>=<un>12345</un>, 
+				<ua>isCurrent</ua>=<uk>true</uk>
 			)
 		)
 	)
@@ -734,14 +764,14 @@
 	Person p = UonParser.<jsf>DEFAULT</jsf>.parse(urlencoded, Person.<jk>class</jk>);
 
 	<jc>// Render it back as JSON.</jc>
-	json = JsonSerializer.<jsf>DEFAULT_SIMPLE_READABLE</jsf>.serialize(p);
+	json = JsonSerializer.<jsf>DEFAULT_LAX_READABLE</jsf>.serialize(p);
 	</p>
 	<p>
 		We print it back out to JSON to show that all the data has been preserved:
 	</p>
 	<p class='bcode'>
 	{
-		id: <jk>1</jk>, 
+		id: <un>1</un>, 
 		name: <js>'John Smith'</js>, 
 		uri: <js>'http://sample/addressBook/person/1'</js>, 
 		addressBookUri: <js>'http://sample/addressBook'</js>, 
@@ -750,11 +780,11 @@
 			{
 				uri: <js>'http://sample/addressBook/address/1'</js>, 
 				personUri: <js>'http://sample/addressBook/person/1'</js>, 
-				id: <jk>1</jk>, 
+				id: <un>1</un>, 
 				street: <js>'100 Main Street'</js>, 
 				city: <js>'Anywhereville'</js>, 
 				state: <js>'NY'</js>, 
-				zip: <jk>12345</jk>, 
+				zip: <un>12345</un>, 
 				isCurrent: <jk>true</jk>
 			}
 		]
@@ -788,22 +818,22 @@
 			Starting back with our original URL-encoded string:
 		</p>
 		<p class='bcode'>
-	$o(
-		<xa>id</xa>=$n(<xs>1</xs>), 
-		<xa>name</xa>=<xs>John+Smith</xs>, 
-		<xa>uri</xa>=<xs>http://sample/addressBook/person/1</xs>, 
-		<xa>addressBookUri</xa>=<xs>http://sample/addressBook</xs>,
-		<xa>birthDate</xa>=<xs>1946-08-12T00:00:00Z</xs>,
-		<xa>addresses</xa>=$a(
-			$o(
-				<xa>uri</xa>=<xs>http://sample/addressBook/address/1</xs>, 
-				<xa>personUri</xa>=<xs>http://sample/addressBook/person/1</xs>, 
-				<xa>id</xa>=$n(<xs>1</xs>), 
-				<xa>street</xa>=<xs>100+Main+Street</xs>, 
-				<xa>city</xa>=<xs>Anywhereville</xs>, 
-				<xa>state</xa>=<xs>NY</xs>, 
-				<xa>zip</xa>=$n(<xs>12345</xs>), 
-				<xa>isCurrent</xa>=$b(<xs>true</xs>)
+	(
+		<ua>id</ua>=<un>1</un>, 
+		<ua>name</ua>=<us>'John+Smith'</us>, 
+		<ua>uri</ua>=<us>http://sample/addressBook/person/1</us>, 
+		<ua>addressBookUri</ua>=<us>http://sample/addressBook</us>,
+		<ua>birthDate</ua>=<us>1946-08-12T00:00:00Z</us>,
+		<ua>addresses</ua>=@(
+			(
+				<ua>uri</ua>=<us>http://sample/addressBook/address/1</us>, 
+				<ua>personUri</ua>=<us>http://sample/addressBook/person/1</us>, 
+				<ua>id</ua>=<un>1</un>, 
+				<ua>street</ua>=<us>'100+Main+Street'</us>, 
+				<ua>city</ua>=<us>Anywhereville</us>, 
+				<ua>state</ua>=<us>NY</us>, 
+				<ua>zip</ua>=<un>12345</un>, 
+				<ua>isCurrent</ua>=<uk>true</uk>
 			)
 		)
 	)
@@ -816,7 +846,7 @@
 	ObjectMap m = UonParser.<jsf>DEFAULT</jsf>.parse(urlencoded, ObjectMap.<jk>class</jk>);
 
 	<jc>// Convert it back to JSON.</jc>
-	String json = JsonSerializer.<jsf>DEFAULT_SIMPLE_READABLE</jsf>.serialize(m);
+	String json = JsonSerializer.<jsf>DEFAULT_LAX_READABLE</jsf>.serialize(m);
 		</p>
 		<p>
 			What we end up with is the exact same output.<br>
@@ -825,7 +855,7 @@
 		</p>
 		<p class='bcode'>
 	{
-		id: <jk>1</jk>, 
+		id: <un>1</un>, 
 		name: <js>'John Smith'</js>, 
 		uri: <js>'http://sample/addressBook/person/1'</js>, 
 		addressBookUri: <js>'http://sample/addressBook'</js>, 
@@ -834,11 +864,11 @@
 			{
 				uri: <js>'http://sample/addressBook/address/1'</js>, 
 				personUri: <js>'http://sample/addressBook/person/1'</js>, 
-				id: <jk>1</jk>, 
+				id: <un>1</un>, 
 				street: <js>'100 Main Street'</js>, 
 				city: <js>'Anywhereville'</js>, 
 				state: <js>'NY'</js>, 
-				zip: <jk>12345</jk>, 
+				zip: <un>12345</un>, 
 				isCurrent: <jk>true</jk>
 			}
 		]
@@ -957,7 +987,7 @@
 	<ja>@RestResource</ja>(
 		messages=<js>"nls/AddressBookResource"</js>,
 		properties={
-			<ja>@Property</ja>(name=UonSerializerContext.<jsf>UON_simpleMode</jsf>, value=<js>"true"</js>),
+			<ja>@Property</ja>(name=SerializerContext.<jsf>SERIALIZER_useWhitespace</jsf>, value=<js>"true"</js>),
 			<ja>@Property</ja>(name=HtmlDocSerializerContext.<jsf>HTMLDOC_title</jsf>, value=<js>"$L{title}"</js>),
 			<ja>@Property</ja>(name=HtmlDocSerializerContext.<jsf>HTMLDOC_description</jsf>, value=<js>"$L{description}"</js>),
 			<ja>@Property</ja>(name=HtmlDocSerializerContext.<jsf>HTMLDOC_links</jsf>, value=<js>"{options:'?method=OPTIONS',doc:'doc'}"</js>)
@@ -968,7 +998,7 @@
 			</p>
 			<p>
 				Notice how serializer and parser properties can be specified using the <code>@RestResource.properties()</code> annotation.<br>
-				In this case, we're overriding the <jsf>UON_simpleMode</jsf> property to produce lax UON notation.
+				In this case, we're overriding the <jsf>SERIALIZER_useWhitespace</jsf> property to add whitespace to the output.
 				The remaining properties are specific to the HTML serializer.
 			</p>
 			<p>
@@ -1032,7 +1062,7 @@
 		serializers={UrlEncodingSerializer.<jk>class</jk>},
 		parsers={UrlEncodingParser.<jk>class</jk>},
 		properties={
-			<ja>@Property</ja>(name=UonSerializerContext.<jsf>UON_simpleMode</jsf>, value=<js>"true"</js>)
+			<ja>@Property</ja>(name=SerializerContext.<jsf>SERIALIZER_useWhitespace</jsf>, value=<js>"true"</js>)
 		}
 	)
 	<jk>public class</jk> AddressBookResource <jk>extends</jk> RestServlet {
@@ -1046,7 +1076,7 @@
 		serializers={UrlEncodingSerializer.<jk>class</jk>},
 		parsers={UrlEncodingParser.<jk>class</jk>},
 		properties={
-			<ja>@Property</ja>(name=UonSerializerContext.<jsf>UON_simpleMode</jsf>, value=<js>"true"</js>)
+			<ja>@Property</ja>(name=SerializerContext.<jsf>SERIALIZER_useWhitespace</jsf>, value=<js>"true"</js>)
 		}
 	)
 	<jk>public</jk> Person getPerson(RestRequest req, <ja>@Path</ja> <jk>int</jk> id) throws Exception {
@@ -1130,7 +1160,7 @@
 				In Wink, this is accomplished by adding an entry to a config file.
 			</p>
 			<p class='bcode'>
-	<xt>&lt;web-app</xt> <xa>version</xa>=<xs>"2.3"</xs><xt>&gt;</xt>
+	<xt>&lt;web-app</xt> <ua>version</ua>=<us>"2.3"</us><xt>&gt;</xt>
 		<xt>&lt;servlet&gt;</xt>
 			<xt>&lt;servlet-name&gt;</xt>WinkService<xt>&lt;/servlet-name&gt;</xt>
 			<xt>&lt;servlet-class&gt;</xt>org.apache.wink.server.internal.servlet.RestServlet<xt>&lt;/servlet-class&gt;</xt>
@@ -1154,7 +1184,7 @@
 	<ja>@Produces</ja>(<js>"*/*"</js>)
 	<ja>@RestMethod</ja>( <jc>/* Override some properties */</jc>
 		properties={
-			<ja>@Property</ja>(name=UonSerializerContext.<jsf>UON_simpleMode</jsf>, value=<js>"true"</js>)
+			<ja>@Property</ja>(name=SerializerContext.<jsf>SERIALIZER_useWhitespace</jsf>, value=<js>"true"</js>)
 		}
 	)
 	<jk>public</jk> Message getMessage() {
@@ -1203,7 +1233,7 @@
 			UrlEncodingParser.<jk>class</jk>,
 		}
 		properties={
-			<ja>@Property</ja>(name=UonSerializerContext.<jsf>UON_simpleMode</jsf>, value=<js>"true"</js>)
+			<ja>@Property</ja>(name=SerializerContext.<jsf>SERIALIZER_useWhitespace</jsf>, value=<js>"true"</js>)
 		}
 	)
 	<jk>public final class</jk> MyUrlEncodingProvider <jk>extends</jk> BaseProvider {}
@@ -1226,7 +1256,7 @@
 		</p>
 		<p class='bcode'>
 	<jc>// Create a client to handle URL-encoded requests and responses.</jc>
-	RestClient client = <jk>new</jk> RestClient(UrlEncodingSerializer.<jk>class</jk>, UrlEncodingParser.<jk>class</jk>);
+	RestClient client = <uk>new</uk> RestClient(UrlEncodingSerializer.<uk>class</uk>, UrlEncodingParser.<uk>class</uk>);
 		</p>
 		<p>
 			The client handles all content negotiation based on the registered serializers and parsers.

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/097b8103/juneau-core/src/main/java/org/apache/juneau/xml/XmlParser.java
----------------------------------------------------------------------
diff --git a/juneau-core/src/main/java/org/apache/juneau/xml/XmlParser.java b/juneau-core/src/main/java/org/apache/juneau/xml/XmlParser.java
index f352c47..a13c1d9 100644
--- a/juneau-core/src/main/java/org/apache/juneau/xml/XmlParser.java
+++ b/juneau-core/src/main/java/org/apache/juneau/xml/XmlParser.java
@@ -77,7 +77,6 @@ public class XmlParser extends ReaderParser {
 		PojoSwap<T,Object> transform = (PojoSwap<T,Object>)eType.getPojoSwap();
 		ClassMeta<?> sType = eType.getSerializedClassMeta();
 		session.setCurrentClass(sType);
-		BeanRegistry breg = (pMeta == null ? session.getBeanRegistry() : pMeta.getBeanRegistry());
 
 		String wrapperAttr = (isRoot && session.isPreserveRootElement()) ? r.getName().getLocalPart() : null;
 		String typeAttr = r.getAttributeValue(null, session.getBeanTypePropertyName());
@@ -92,11 +91,11 @@ public class XmlParser extends ReaderParser {
 			}
 		}
 
-		if (breg.hasName(typeAttr)) {
-			sType = eType = (ClassMeta<T>)breg.getClassMeta(typeAttr);
-		} else if (elementName != null && breg.hasName(elementName) && ! elementName.equals(currAttr)) {
-			sType = eType = (ClassMeta<T>)breg.getClassMeta(elementName);
-		}
+		ClassMeta tcm = session.getClassMeta(typeAttr, pMeta, eType);
+		if (tcm == null && elementName != null && ! elementName.equals(currAttr))
+			tcm = session.getClassMeta(elementName, pMeta, eType);
+		if (tcm != null)
+			sType = eType = tcm;
 
 		Object o = null;
 
@@ -111,7 +110,7 @@ public class XmlParser extends ReaderParser {
 				parseIntoMap(session, r, m, string(), object(), pMeta);
 				if (wrapperAttr != null)
 					m = new ObjectMap(session).append(wrapperAttr, m);
-				o = breg.cast(m);
+				o = session.cast(m, pMeta, eType);
 			} else if (jsonType == ARRAY)
 				o = parseIntoCollection(session, r, new ObjectList(session), object(), pMeta);
 			else if (jsonType == STRING) {
@@ -280,8 +279,6 @@ public class XmlParser extends ReaderParser {
 			if (bpm == null) {
 				if (xmlMeta.getAttrsProperty() != null) {
 					xmlMeta.getAttrsProperty().add(m, key, val);
-				} else if (m.getMeta().isSubTyped()) {
-					m.put(key, val);
 				} else {
 					Location l = r.getLocation();
 					onUnknownProperty(session, key, m, l.getLineNumber(), l.getColumnNumber());
@@ -362,14 +359,9 @@ public class XmlParser extends ReaderParser {
 					currAttr = session.getElementName(r);
 					BeanPropertyMeta pMeta = xmlMeta.getPropertyMeta(currAttr);
 					if (pMeta == null) {
-						if (m.getMeta().isSubTyped()) {
-							Object value = parseAnything(session, string(), currAttr, r, m.getBean(false), false, null);
-							m.put(currAttr, value);
-						} else {
-							Location loc = r.getLocation();
-							onUnknownProperty(session, currAttr, m, loc.getLineNumber(), loc.getColumnNumber());
-							skipCurrentTag(r);
-						}
+						Location loc = r.getLocation();
+						onUnknownProperty(session, currAttr, m, loc.getLineNumber(), loc.getColumnNumber());
+						skipCurrentTag(r);
 					} else {
 						session.setCurrentProperty(pMeta);
 						XmlFormat xf = pMeta.getExtendedMeta(XmlBeanPropertyMeta.class).getXmlFormat();

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/097b8103/juneau-core/src/main/java/org/apache/juneau/xml/XmlSchemaSerializer.java
----------------------------------------------------------------------
diff --git a/juneau-core/src/main/java/org/apache/juneau/xml/XmlSchemaSerializer.java b/juneau-core/src/main/java/org/apache/juneau/xml/XmlSchemaSerializer.java
index 01d8138..397c513 100644
--- a/juneau-core/src/main/java/org/apache/juneau/xml/XmlSchemaSerializer.java
+++ b/juneau-core/src/main/java/org/apache/juneau/xml/XmlSchemaSerializer.java
@@ -261,7 +261,7 @@ public class XmlSchemaSerializer extends XmlSerializer {
 			this.defaultNs = defaultNs;
 			this.targetNs = targetNs;
 			this.session = session;
-			w = new XmlWriter(sw, session.isUseIndentation(), session.isTrimStrings(), session.getQuoteChar(), null, null, true, null);
+			w = new XmlWriter(sw, session.isUseWhitespace(), session.isTrimStrings(), session.getQuoteChar(), null, null, true, null);
 			int i = session.getIndent();
 			w.oTag(i, "schema");
 			w.attr("xmlns", xs.getUri());

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/097b8103/juneau-core/src/main/java/org/apache/juneau/xml/XmlSerializer.java
----------------------------------------------------------------------
diff --git a/juneau-core/src/main/java/org/apache/juneau/xml/XmlSerializer.java b/juneau-core/src/main/java/org/apache/juneau/xml/XmlSerializer.java
index 7c38f84..0f22162 100644
--- a/juneau-core/src/main/java/org/apache/juneau/xml/XmlSerializer.java
+++ b/juneau-core/src/main/java/org/apache/juneau/xml/XmlSerializer.java
@@ -154,7 +154,7 @@ public class XmlSerializer extends WriterSerializer {
 	public static class SqReadable extends Sq {
 		/** Constructor */
 		public SqReadable() {
-			setUseIndentation(true);
+			setUseWhitespace(true);
 		}
 	}
 
@@ -179,7 +179,7 @@ public class XmlSerializer extends WriterSerializer {
 	public static class NsSqReadable extends NsSq {
 		/** Constructor */
 		public NsSqReadable() {
-			setUseIndentation(true);
+			setUseWhitespace(true);
 		}
 	}
 
@@ -973,8 +973,8 @@ public class XmlSerializer extends WriterSerializer {
 	}
 
 	@Override /* Serializer */
-	public XmlSerializer setUseIndentation(boolean value) throws LockedException {
-		super.setUseIndentation(value);
+	public XmlSerializer setUseWhitespace(boolean value) throws LockedException {
+		super.setUseWhitespace(value);
 		return this;
 	}
 

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/097b8103/juneau-core/src/main/java/org/apache/juneau/xml/XmlSerializerSession.java
----------------------------------------------------------------------
diff --git a/juneau-core/src/main/java/org/apache/juneau/xml/XmlSerializerSession.java b/juneau-core/src/main/java/org/apache/juneau/xml/XmlSerializerSession.java
index 5b1ae85..5ab38d3 100644
--- a/juneau-core/src/main/java/org/apache/juneau/xml/XmlSerializerSession.java
+++ b/juneau-core/src/main/java/org/apache/juneau/xml/XmlSerializerSession.java
@@ -170,6 +170,6 @@ public class XmlSerializerSession extends SerializerSession {
 		Object output = getOutput();
 		if (output instanceof XmlWriter)
 			return (XmlWriter)output;
-		return new XmlWriter(super.getWriter(), isUseIndentation(), isTrimStrings(), getQuoteChar(), getRelativeUriBase(), getAbsolutePathUriBase(), isEnableNamespaces(), getDefaultNamespace());
+		return new XmlWriter(super.getWriter(), isUseWhitespace(), isTrimStrings(), getQuoteChar(), getRelativeUriBase(), getAbsolutePathUriBase(), isEnableNamespaces(), getDefaultNamespace());
 	}
 }

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/097b8103/juneau-core/src/main/java/org/apache/juneau/xml/XmlWriter.java
----------------------------------------------------------------------
diff --git a/juneau-core/src/main/java/org/apache/juneau/xml/XmlWriter.java b/juneau-core/src/main/java/org/apache/juneau/xml/XmlWriter.java
index 1140561..6f5ac83 100644
--- a/juneau-core/src/main/java/org/apache/juneau/xml/XmlWriter.java
+++ b/juneau-core/src/main/java/org/apache/juneau/xml/XmlWriter.java
@@ -34,7 +34,7 @@ public class XmlWriter extends SerializerWriter {
 	 * Constructor.
 	 *
 	 * @param out The wrapped writer.
-	 * @param useIndentation If <jk>true</jk> XML elements will be indented.
+	 * @param useWhitespace If <jk>true</jk> XML elements will be indented.
 	 * @param trimStrings If <jk>true</jk>, strings should be trimmed before they're serialized.
 	 * @param quoteChar The quote character to use for attributes.  Should be <js>'\''</js> or <js>'"'</js>.
 	 * @param relativeUriBase The base (e.g. <js>https://localhost:9443/contextPath"</js>) for relative URIs (e.g. <js>"my/path"</js>).
@@ -42,8 +42,8 @@ public class XmlWriter extends SerializerWriter {
 	 * @param enableNs Flag to indicate if XML namespaces are enabled.
 	 * @param defaultNamespace The default namespace if XML namespaces are enabled.
 	 */
-	public XmlWriter(Writer out, boolean useIndentation, boolean trimStrings, char quoteChar, String relativeUriBase, String absolutePathUriBase, boolean enableNs, Namespace defaultNamespace) {
-		super(out, useIndentation, true, trimStrings, quoteChar, relativeUriBase, absolutePathUriBase);
+	public XmlWriter(Writer out, boolean useWhitespace, boolean trimStrings, char quoteChar, String relativeUriBase, String absolutePathUriBase, boolean enableNs, Namespace defaultNamespace) {
+		super(out, useWhitespace, trimStrings, quoteChar, relativeUriBase, absolutePathUriBase);
 		this.enableNs = enableNs;
 		this.defaultNsPrefix = defaultNamespace == null ? null : defaultNamespace.name;
 	}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/097b8103/juneau-core/src/main/javadoc/doc-files/Server.Uon.png
----------------------------------------------------------------------
diff --git a/juneau-core/src/main/javadoc/doc-files/Server.Uon.png b/juneau-core/src/main/javadoc/doc-files/Server.Uon.png
deleted file mode 100644
index 28e4baf..0000000
Binary files a/juneau-core/src/main/javadoc/doc-files/Server.Uon.png and /dev/null differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/097b8103/juneau-core/src/main/javadoc/doc-files/Server.UrlEncoding.png
----------------------------------------------------------------------
diff --git a/juneau-core/src/main/javadoc/doc-files/Server.UrlEncoding.png b/juneau-core/src/main/javadoc/doc-files/Server.UrlEncoding.png
deleted file mode 100644
index 1572968..0000000
Binary files a/juneau-core/src/main/javadoc/doc-files/Server.UrlEncoding.png and /dev/null differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/097b8103/juneau-core/src/main/javadoc/overview.html
----------------------------------------------------------------------
diff --git a/juneau-core/src/main/javadoc/overview.html b/juneau-core/src/main/javadoc/overview.html
index 8a5032b..50701c5 100644
--- a/juneau-core/src/main/javadoc/overview.html
+++ b/juneau-core/src/main/javadoc/overview.html
@@ -318,6 +318,14 @@
 	//	  &lt;tr&gt;&lt;td&gt;age&lt;/td&gt;&lt;td&gt;21&lt;/td&gt;&lt;/tr&gt;
 	//	&lt;/table&gt;</jc>
 	String html = HtmlSerializer.<jsf>DEFAULT</jsf>.serialize(p);
+	
+	<jc>// Produces:
+	//	"(name='John Smith',age=21)"</jc>
+	String uon = UonSerializer.<jsf>DEFAULT</jsf>.serialize(p);
+
+	<jc>// Produces:
+	//	"name='John+Smith'&amp;age=21"</jc>
+	String urlencoding = UrlEncodingSerializer.<jsf>DEFAULT</jsf>.serialize(p);
 
 	<jc>// Produces:
 	// 82 A4 6E 61 6D 65 AA 4A 6F 68 6E 20 53 6D 69 74 68 A3 61 67 65 15 </jc>
@@ -817,7 +825,7 @@
 			<jk>this</jk>.<jf>value2</jf> = value2;
 		}
 		
-		<jc>// Special swap method that converts this template to a serializable bean,
+		<jc>// Special swap method that converts this template to a serializable bean</jc>
 		<jk>public</jk> Form swap(BeanSession session) {
 			<jk>return</jk> <jsm>form</jsm>(<jf>action</jf>,
 				<jsm>input</jsm>(<js>"text"</js>).name(<js>"v1"</js>).value(<jf>value1</jf>),
@@ -1054,9 +1062,6 @@
 			<ul>
 				<li>You specify the list of possible subclasses through an annotation on a parent bean class.
 				<li>You do not need to register the subtype classes on the bean dictionary of the parser.
-				<li>The default helper attribute name is <js>"_subtype"</js>, not <js>"_type"</js>.
-				<li>Bean subtype virtual properties are ALWAYS serialized.
-					They are not controlled by the {@link org.apache.juneau.serializer.SerializerContext#SERIALIZER_addBeanTypeProperties} setting.
 			</ul>
 			<p>
 				In the following example, the abstract class has two subclasses:
@@ -1064,7 +1069,7 @@
 			<p class='bcode'>
 	<jc>// Abstract superclass</jc>
 	<ja>@Bean</ja>(
-		subTypes={A1.<jk>class</jk>, A2.<jk>class</jk>}
+		beanDictionary={A1.<jk>class</jk>, A2.<jk>class</jk>}
 	)
 	<jk>public abstract class</jk> A {
 		<jk>public</jk> String <jf>f0</jf> = <js>"f0"</js>;
@@ -1083,14 +1088,14 @@
 	}
 			</p>
 			<p>
-				When serialized, the subtype is serialized as a virtual <js>"_subtype"</js> property:
+				When serialized, the subtype is serialized as a virtual <js>"_type"</js> property:
 			</p>	
 			<p class='bcode'>
 	JsonSerializer s = JsonSerializer.<jsf>DEFAULT_LAX</jsf>;
 	A1 a1 = <jk>new</jk> A1();
 	a1.<jf>f1</jf> = <js>"f1"</js>;
 	String r = s.serialize(a1);
-	<jsm>assertEquals</jsm>(<js>"{_subtype:'A1',f1:'f1',f0:'f0'}"</js>, r);
+	<jsm>assertEquals</jsm>(<js>"{_type:'A1',f1:'f1',f0:'f0'}"</js>, r);
 			</p>
 			<p>
 				The following shows what happens when parsing back into the original object.
@@ -1100,9 +1105,6 @@
 	A a = p.parse(r, A.<jk>class</jk>);
 	<jsm>assertTrue</jsm>(a <jk>instanceof</jk> A1);
 			</p>
-			<p class='info'>
-				The <js>"_subtype"</js> property name can be overridden using the {@link org.apache.juneau.annotation.Bean#subTypeProperty() @Bean.subTypeProperty()} annotation.
-			</p>
 		</div>
 	</div>
 		
@@ -5624,6 +5626,29 @@
 				methods for retrieving Map and Collection class metas.  
 				Replaces the various <code>getMapClassMeta()</code>/<code>getCollectionClassMeta()</code> methods.  
 			<li>New section added to this document:	<a class='doclink' href='#DTOs'>Juneau Data Transfer Objects (org.apache.juneau.dto)</a>
+			<li>Modified the UON specification to work with mixed content.
+			<ul>
+				<li>The new specification is considerably cleaner and eliminates the need for separate normal/simple modes.
+					<br>It also allows for arbitrary whitespace to be added to the output without any confusion.
+				<li>Eliminated the <code>UonParser.<jsf>DEFAULT_WS_AWARE</jsf></code> and <code>UrlEncodingParser.<jsf>DEFAULT_WS_AWARE</jsf></code> parsers.
+					<br>The normal {@link org.apache.juneau.urlencoding.UonParser#DEFAULT} and {@link org.apache.juneau.urlencoding.UrlEncodingParser#DEFAULT} parsers will now handle whitespace.
+				<li>Eliminated the <code>UonParserContext.<jsf>UON_whitespaceAware</jsf></code> configuration setting.
+				<li>Eliminated the <code>UonSerializer.<jsf>DEFAULT_SIMPLE</jsf></code>, <code>UonSerializer.<jsf>DEFAULT_SIMPLE_ENCODING</jsf></code>
+					and <code>UrlEncodingSerializer.<jsf>DEFAULT_SIMPLE</jsf></code>
+					serializers since there is no separate simple mode anymore.
+				<li>Eliminated the <code>UonParserContext.<jsf>UON_simpleMode</jsf></code> configuration setting.
+			</ul>
+			<li>Added new {@link org.apache.juneau.serializer.OutputStreamSerializer#serializeToHex(Object)} method. 
+				<br>Useful mostly for testing purposes.
+				<br>Equivalently, the {@link org.apache.juneau.parser.InputStreamParser#parse(Object,Class)} method can now 
+					read the output from this method.
+			<li>Eliminated the <code><ja>@Bean</ja>(subTypeProperty)</code> and <code><ja>@Bean</ja>(subTypes)</code> annotations
+				and replaced them with the ability to define subtypes using the existing {@link org.apache.juneau.annotation.Bean#beanDictionary() @Bean.beanDictionary()}
+				annotation on parent classes and interfaces.
+				<br>This has the added benefit of simplifying the overall code.
+			<li>The {@link org.apache.juneau.serializer.SerializerContext#SERIALIZER_addBeanTypeProperties} setting is now enabled by default.
+			<li>Combined the <code>SERIALIZER_addIndentation</code>/<code>JSON_addWhitespace</code>/<code>UON_addWhitespace</code>
+				properties into a single {@link org.apache.juneau.serializer.SerializerContext#SERIALIZER_addWhitespace} setting.
 		</ul>
 		
 		<h6 class='topic'>org.apache.juneau.rest</h6>
@@ -5652,6 +5677,7 @@
 				<li>{@link org.apache.juneau.rest.RestRequest#getBody(Class)}
 				<li>{@link org.apache.juneau.rest.RestRequest#getBody(Type,Type...)}
 			</ul>
+			<li>Fixed issue where whitespace was not added to UON/URL-Encoding output when <code>&amp;plainText=true</code> specified.
 		</ul>
 	</div>
 	
@@ -6077,7 +6103,7 @@
 			<li>{@link org.apache.juneau.parser.Parser} methods now check for <jk>null</jk> input.
 			<li>{@link org.apache.juneau.serializer.SerializerGroup} and {@link org.apache.juneau.parser.ParserGroup} ignores serializers and parsers if they throw <code>NoClassDefFoundErrors</code>.
 			<li>{@link org.apache.juneau.urlencoding.UrlEncodingParser} creates lists if the same attribute name is encountered more than once.  Before it would just replace the previous value with the new value.
-			<li>New {@link org.apache.juneau.urlencoding.UrlEncodingSerializer#DEFAULT_SIMPLE_EXPANDED} serializer.
+			<li>New <code><del>UrlEncodingSerializer.DEFAULT_SIMPLE_EXPANDED</del></code> serializer.
 			<li>Changes to {@link org.apache.juneau.utils.Args}:
 				<ul>
 					<li><code>getMainArg(int)</code> changed to {@link org.apache.juneau.utils.Args#getArg(int)}.  
@@ -6840,7 +6866,7 @@
 			<li>Several improvements to URL-Encoding support.
 				<ul>
 					<li>Improved whitespace handling in {@link org.apache.juneau.urlencoding.UonParser}.
-					<li>New {@link org.apache.juneau.urlencoding.UonParserContext#UON_whitespaceAware} property for controlling whether whitespace is ignored.
+					<li>New <code><del>UonParserContext.UON_whitespaceAware</del></code> property for controlling whether whitespace is ignored.
 					<li>New {@link org.apache.juneau.urlencoding.UrlEncodingContext#URLENC_expandedParams} property for controlling whether arrays/Collections 
 						should be serialized/parsed as multi-part parameters.
 					<li>New {@link org.apache.juneau.urlencoding.annotation.UrlEncoding#expandedParams() @UrlEncoding.expandedParams()}
@@ -7171,7 +7197,7 @@
 			<li>Changed the default ordering of bean properties to be in parent-to-child class order.
 			<li>New {@link org.apache.juneau.transform.BeanFilter#readProperty(Object,String,Object) readProperty()} and {@link org.apache.juneau.transform.BeanFilter#writeProperty(Object,String,Object) writeProperty()}
 				methods added to {@link org.apache.juneau.transform.BeanFilter} class to allow individualized serialization and parsing behavior on a class-by-class basis.
-			<li>Eliminated previous restriction where bean subtype attributes had to be listed first in JSON objects when using the {@link org.apache.juneau.annotation.Bean#subTypeProperty()} annotation.
+			<li>Eliminated previous restriction where bean subtype attributes had to be listed first in JSON objects when using the <code><del>Bean.subTypeProperty()</del></code> annotation.
 				The previous behavior was not strictly JSON-compliant since JSON objects are supposed to consist of unordered lists of key/value pairs.
 				While targeted for JSON, the restriction is also lifted for all other parsers.  	
 			<li>New fluent-style {@link org.apache.juneau.BeanMap#load(String) BeanMap.load()} methods for initializing bean maps.
@@ -7552,7 +7578,7 @@
 		</p>
 		<ul class='spaced-list'>
 			<li> 
-				Fixed bug involving beans using {@link org.apache.juneau.annotation.Bean#subTypes()} annotation in addition to <code>subTypes</code> property.
+				Fixed bug involving beans using <code><del>Bean.subTypes()</del></code> annotation in addition to <code>subTypes</code> property.
 			</li>
 			<li>
 				Modified the JSON parser to handle non-existent JSON values to get around an issue where Cognos was generating invalid JSON.
@@ -7572,7 +7598,7 @@
 				Revamped the API for filter support:
 				<ul>
 					<li>Updated {@link org.apache.juneau.transform.BeanFilter} class to mirror the {@link org.apache.juneau.annotation.Bean @Bean} annotation.</li>
-					<li>Introduced support for bean {@link org.apache.juneau.annotation.Bean#subTypeProperty() subtypes}. </li>
+					<li>Introduced support for bean <code><del>Bean.subTypeProperty() subtypes</del></code>. </li>
 					<li>Replaced <code><ja>@Bean</ja>(filter=xxx)</code> with new <del><code>@Transform</code></del> annotation.</li>
 				</ul>
 			</li>
@@ -8709,3 +8735,5 @@
 
 </div>
 </body>
+		
+		

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/097b8103/juneau-core/src/main/javadoc/resources/juneau-code.css
----------------------------------------------------------------------
diff --git a/juneau-core/src/main/javadoc/resources/juneau-code.css b/juneau-core/src/main/javadoc/resources/juneau-code.css
index f48f7cd..b0be23a 100644
--- a/juneau-core/src/main/javadoc/resources/juneau-code.css
+++ b/juneau-core/src/main/javadoc/resources/juneau-code.css
@@ -101,8 +101,8 @@ jd { color: #3f5fbf; }
 jt { color: #7f9fbf; font-weight: bold; }
 jk { color: #7f0055; font-weight: bold; }
 js { color: blue; }
-jf { color: blue; }
-jsf { color: blue; font-style: italic; }
+jf { color: DarkBlue; }
+jsf { color: DarkBlue; font-style: italic; }
 jsm { font-style: italic; }
 ja { color: grey; }
 
@@ -113,6 +113,12 @@ xc { color: mediumblue; }
 xs { color: blue; font-style: italic; }
 xv { color: black; }
 
+/*--- URLEncoding/UON code effects ---*/
+ua { color: black; } /* Attribute name */
+uk { color: #7f0055; font-weight: bold; } /* true/false/null */
+un { color: DarkBlue; } /* Number value */
+us { color: blue; } /* String value */
+
 /*--- Manifest-file code effects ---*/
 mk { color: DarkRed; font-weight: bold; }
 mv { color: DarkBlue;}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/097b8103/juneau-examples-rest/src/test/java/org/apache/juneau/examples/rest/AddressBookResourceTest.java
----------------------------------------------------------------------
diff --git a/juneau-examples-rest/src/test/java/org/apache/juneau/examples/rest/AddressBookResourceTest.java b/juneau-examples-rest/src/test/java/org/apache/juneau/examples/rest/AddressBookResourceTest.java
index 67ae42a..dbb736a 100644
--- a/juneau-examples-rest/src/test/java/org/apache/juneau/examples/rest/AddressBookResourceTest.java
+++ b/juneau-examples-rest/src/test/java/org/apache/juneau/examples/rest/AddressBookResourceTest.java
@@ -29,7 +29,7 @@ import org.apache.juneau.xml.*;
 import org.junit.*;
 
 @SuppressWarnings({"serial"})
-public class AddressBookResourceTest {
+public class AddressBookResourceTest extends RestTestcase {
 
 	private static boolean debug = false;
 
@@ -166,35 +166,35 @@ public class AddressBookResourceTest {
 			assertEquals(1, people.size());
 			assertEquals("Barack Obama", people.get(0).name);
 
-			r = client.doGet("/addressBook/people?q=(name='Barack+Obama')");
+			r = client.doGet("/addressBook/people?q=(name='~'Barack+Obama~'')");
 			people = r.getResponse(PersonList.class);
 			assertEquals(1, people.size());
 			assertEquals("Barack Obama", people.get(0).name);
 
-			r = client.doGet("/addressBook/people?q=(name='Barack%20Obama')");
+			r = client.doGet("/addressBook/people?q=(name='~'Barack%20Obama~'')");
 			people = r.getResponse(PersonList.class);
 			assertEquals(1, people.size());
 			assertEquals("Barack Obama", people.get(0).name);
 
-			r = client.doGet("/addressBook/people?v=(name,birthDate)");
+			r = client.doGet("/addressBook/people?v=@(name,birthDate)");
 			people = r.getResponse(PersonList.class);
 			assertEquals("Barack Obama", people.get(0).name);
 			assertTrue(people.get(0).getAge() > 10);
 			assertEquals(0, people.get(0).addresses.size());
 
-			r = client.doGet("/addressBook/people?v=(addresses,birthDate)");
+			r = client.doGet("/addressBook/people?v=@(addresses,birthDate)");
 			people = r.getResponse(PersonList.class);
 			assertNull(people.get(0).name);
 			assertTrue(people.get(0).getAge() > 10);
 			assertEquals(2, people.get(0).addresses.size());
 
-			r = client.doGet("/addressBook/people?s=($o(age=d))");
+			r = client.doGet("/addressBook/people?s=@((age=d))");
 			people = r.getResponse(PersonList.class);
 			assertTrue(people.get(0).getAge() > 10);
-			r = client.doGet("/addressBook/people?s=(age)");
+			r = client.doGet("/addressBook/people?s=@(age)");
 			people = r.getResponse(PersonList.class);
 			assertTrue(people.get(0).getAge() > 10);
-			r = client.doGet("/addressBook/people?s=($o(age=a))");
+			r = client.doGet("/addressBook/people?s=@((age=a))");
 			people = r.getResponse(PersonList.class);
 			assertTrue(people.get(0).getAge() > 10);
 

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/097b8103/juneau-examples-rest/src/test/java/org/apache/juneau/examples/rest/RestTestcase.java
----------------------------------------------------------------------
diff --git a/juneau-examples-rest/src/test/java/org/apache/juneau/examples/rest/RestTestcase.java b/juneau-examples-rest/src/test/java/org/apache/juneau/examples/rest/RestTestcase.java
new file mode 100644
index 0000000..0b79f66
--- /dev/null
+++ b/juneau-examples-rest/src/test/java/org/apache/juneau/examples/rest/RestTestcase.java
@@ -0,0 +1,37 @@
+// ***************************************************************************************************************************
+// * 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.juneau.examples.rest;
+
+import org.apache.juneau.examples.rest.TestMicroservice;
+import org.junit.*;
+
+/**
+ * Superclass of REST testcases that start up the REST test microservice before running the tests locally.
+ *
+ * @author James Bognar (james.bognar@salesforce.com)
+ */
+public class RestTestcase {
+
+	private static boolean microserviceStarted;
+
+	@BeforeClass
+	public static void setUp() {
+		microserviceStarted = TestMicroservice.startMicroservice();
+	}
+
+	@AfterClass
+	public static void tearDown() {
+		if (microserviceStarted)
+			TestMicroservice.stopMicroservice();
+	}
+}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/097b8103/juneau-examples-rest/src/test/java/org/apache/juneau/examples/rest/RootResourcesTest.java
----------------------------------------------------------------------
diff --git a/juneau-examples-rest/src/test/java/org/apache/juneau/examples/rest/RootResourcesTest.java b/juneau-examples-rest/src/test/java/org/apache/juneau/examples/rest/RootResourcesTest.java
index a0eba19..b3c7c98 100644
--- a/juneau-examples-rest/src/test/java/org/apache/juneau/examples/rest/RootResourcesTest.java
+++ b/juneau-examples-rest/src/test/java/org/apache/juneau/examples/rest/RootResourcesTest.java
@@ -25,7 +25,7 @@ import org.apache.juneau.rest.labels.*;
 import org.apache.juneau.xml.*;
 import org.junit.*;
 
-public class RootResourcesTest {
+public class RootResourcesTest extends RestTestcase {
 
 	private static String path = URI.create(Constants.getSampleUrl()).getPath();              // /jazz/juneau/sample
 	private static boolean debug = false;

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/097b8103/juneau-examples-rest/src/test/java/org/apache/juneau/examples/rest/SampleRemoteableServicesResourceTest.java
----------------------------------------------------------------------
diff --git a/juneau-examples-rest/src/test/java/org/apache/juneau/examples/rest/SampleRemoteableServicesResourceTest.java b/juneau-examples-rest/src/test/java/org/apache/juneau/examples/rest/SampleRemoteableServicesResourceTest.java
index 945e14a..28f38fe 100644
--- a/juneau-examples-rest/src/test/java/org/apache/juneau/examples/rest/SampleRemoteableServicesResourceTest.java
+++ b/juneau-examples-rest/src/test/java/org/apache/juneau/examples/rest/SampleRemoteableServicesResourceTest.java
@@ -23,7 +23,7 @@ import org.apache.juneau.urlencoding.*;
 import org.apache.juneau.xml.*;
 import org.junit.*;
 
-public class SampleRemoteableServicesResourceTest {
+public class SampleRemoteableServicesResourceTest extends RestTestcase {
 
 	static RestClient[] clients;
 
@@ -62,7 +62,7 @@ public class SampleRemoteableServicesResourceTest {
 					new CreateAddress("Test street", "Test city", "Test state", 12345, true))
 			);
 			assertEquals(
-				"{id:x,name:'Test Person',birthDate:'Aug 1, 1999',addresses:[{id:x,street:'Test street',city:'Test city',state:'Test state',zip:12345,isCurrent:true}],age:x}",
+				"{_type:'person',id:x,name:'Test Person',birthDate:'Aug 1, 1999',addresses:[{id:x,street:'Test street',city:'Test city',state:'Test state',zip:12345,isCurrent:true}],age:x}",
 				JsonSerializer.DEFAULT_LAX.toString(p).replaceAll("id:\\d+", "id:x").replaceAll("age:\\d+", "age:x"));
 		}
 	}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/097b8103/juneau-examples-rest/src/test/java/org/apache/juneau/examples/rest/TestMicroservice.java
----------------------------------------------------------------------
diff --git a/juneau-examples-rest/src/test/java/org/apache/juneau/examples/rest/TestMicroservice.java b/juneau-examples-rest/src/test/java/org/apache/juneau/examples/rest/TestMicroservice.java
new file mode 100644
index 0000000..303b1ca
--- /dev/null
+++ b/juneau-examples-rest/src/test/java/org/apache/juneau/examples/rest/TestMicroservice.java
@@ -0,0 +1,57 @@
+// ***************************************************************************************************************************
+// * 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.juneau.examples.rest;
+
+import java.util.*;
+
+import org.apache.juneau.microservice.*;
+
+/**
+ * Utility class for starting up the examples microservice.
+ * @author james.bognar
+ */
+public class TestMicroservice {
+	static Microservice microservice;
+
+	/**
+	 * Starts the microservice.
+	 * @return <jk>true</jk> if the service started, <jk>false</jk> if it's already started.
+	 * 	If this returns <jk>false</jk> then don't call stopMicroservice()!.
+	 */
+	public static boolean startMicroservice() {
+		if (microservice != null)
+			return false;
+		try {
+			Locale.setDefault(Locale.US);
+			microservice = new RestMicroservice().setConfig("examples.cfg", false);
+			microservice.start();
+			return true;
+		} catch (Throwable e) {
+			// Probably already started.
+			System.err.println(e); // NOT DEBUG
+			return false;
+		}
+	}
+
+	/**
+	 * Stops the microservice.
+	 */
+	public static void stopMicroservice() {
+		try {
+			microservice.stop();
+			microservice = null;
+		} catch (Exception e) {
+			System.err.println(e); // NOT DEBUG
+		}
+	}
+}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/097b8103/juneau-examples-rest/src/test/java/org/apache/juneau/examples/rest/TestMultiPartFormPostsTest.java
----------------------------------------------------------------------
diff --git a/juneau-examples-rest/src/test/java/org/apache/juneau/examples/rest/TestMultiPartFormPostsTest.java b/juneau-examples-rest/src/test/java/org/apache/juneau/examples/rest/TestMultiPartFormPostsTest.java
index 66596ce..f41b122 100644
--- a/juneau-examples-rest/src/test/java/org/apache/juneau/examples/rest/TestMultiPartFormPostsTest.java
+++ b/juneau-examples-rest/src/test/java/org/apache/juneau/examples/rest/TestMultiPartFormPostsTest.java
@@ -23,7 +23,7 @@ import org.apache.juneau.rest.client.*;
 import org.apache.juneau.utils.*;
 import org.junit.*;
 
-public class TestMultiPartFormPostsTest {
+public class TestMultiPartFormPostsTest extends RestTestcase {
 
 	private static String URL = "/tempDir";
 	boolean debug = false;

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/097b8103/juneau-examples-rest/src/test/java/org/apache/juneau/examples/rest/TestUtils.java
----------------------------------------------------------------------
diff --git a/juneau-examples-rest/src/test/java/org/apache/juneau/examples/rest/TestUtils.java b/juneau-examples-rest/src/test/java/org/apache/juneau/examples/rest/TestUtils.java
index 39463dd..3cd0ed3 100644
--- a/juneau-examples-rest/src/test/java/org/apache/juneau/examples/rest/TestUtils.java
+++ b/juneau-examples-rest/src/test/java/org/apache/juneau/examples/rest/TestUtils.java
@@ -221,7 +221,7 @@ public class TestUtils {
 	 * Test whitespace and generated schema.
 	 */
 	public static void validateXml(Object o, XmlSerializer s) throws Exception {
-		s = s.clone().setUseIndentation(true).setEnableNamespaces(true).setAddNamespaceUrisToRoot(true);
+		s = s.clone().setUseWhitespace(true).setEnableNamespaces(true).setAddNamespaceUrisToRoot(true);
 		String xml = s.serialize(o);
 
 		String xmlSchema = null;

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/097b8103/juneau-examples-rest/src/test/java/org/apache/juneau/examples/rest/_TestSuite.java
----------------------------------------------------------------------
diff --git a/juneau-examples-rest/src/test/java/org/apache/juneau/examples/rest/_TestSuite.java b/juneau-examples-rest/src/test/java/org/apache/juneau/examples/rest/_TestSuite.java
index 214fc8b..4bbc700 100644
--- a/juneau-examples-rest/src/test/java/org/apache/juneau/examples/rest/_TestSuite.java
+++ b/juneau-examples-rest/src/test/java/org/apache/juneau/examples/rest/_TestSuite.java
@@ -12,9 +12,6 @@
 // ***************************************************************************************************************************
 package org.apache.juneau.examples.rest;
 
-import java.util.*;
-
-import org.apache.juneau.microservice.*;
 import org.junit.*;
 import org.junit.runner.*;
 import org.junit.runners.*;
@@ -33,25 +30,14 @@ import org.junit.runners.Suite.*;
 	TestMultiPartFormPostsTest.class
 })
 public class _TestSuite {
-	static Microservice microservice;
 
 	@BeforeClass
 	public static void setUp() {
-		try {
-			Locale.setDefault(Locale.US);
-			microservice = new RestMicroservice().setConfig("examples.cfg", false);
-			microservice.start();
-		} catch (Exception e) {
-			throw new RuntimeException(e);
-		}
+		TestMicroservice.startMicroservice();
 	}
 
 	@AfterClass
 	public static void tearDown() {
-		try {
-			microservice.stop();
-		} catch (Exception e) {
-			throw new RuntimeException(e);
-		}
+		TestMicroservice.stopMicroservice();
 	}
 }

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/097b8103/juneau-rest-test/src/main/java/org/apache/juneau/rest/test/ParamsResource.java
----------------------------------------------------------------------
diff --git a/juneau-rest-test/src/main/java/org/apache/juneau/rest/test/ParamsResource.java b/juneau-rest-test/src/main/java/org/apache/juneau/rest/test/ParamsResource.java
index e65c00a..e3d0f48 100644
--- a/juneau-rest-test/src/main/java/org/apache/juneau/rest/test/ParamsResource.java
+++ b/juneau-rest-test/src/main/java/org/apache/juneau/rest/test/ParamsResource.java
@@ -26,7 +26,6 @@ import org.apache.juneau.plaintext.*;
 import org.apache.juneau.rest.*;
 import org.apache.juneau.rest.annotation.*;
 import org.apache.juneau.transforms.*;
-import org.apache.juneau.urlencoding.*;
 
 /**
  * JUnit automated testcase resource.
@@ -269,8 +268,7 @@ public class ParamsResource extends RestServletDefault {
 	//====================================================================================================
 	@RestMethod(name="POST", path="/testFormPostsWithMultiParamsUsingProperty",
 		properties={
-			@Property(name=URLENC_expandedParams, value="true"),
-			@Property(name=UonSerializerContext.UON_simpleMode, value="true")
+			@Property(name=URLENC_expandedParams, value="true")
 		}
 	)
 	public DTO2s.B testFormPostsWithMultiParamsViaProperty(@Body DTO2s.B content) throws Exception {
@@ -282,11 +280,7 @@ public class ParamsResource extends RestServletDefault {
 	// using @UrlEncoding(expandedParams=true) annotation.
 	// A simple round-trip test to verify that both serializing and parsing works.
 	//====================================================================================================
-	@RestMethod(name="POST", path="/testFormPostsWithMultiParamsUsingAnnotation",
-		properties={
-			@Property(name=UonSerializerContext.UON_simpleMode, value="true")
-		}
-	)
+	@RestMethod(name="POST", path="/testFormPostsWithMultiParamsUsingAnnotation")
 	public DTO2s.C testFormPostsWithMultiParamsUsingAnnotation(@Body DTO2s.C content) throws Exception {
 		return content;
 	}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/097b8103/juneau-rest-test/src/test/java/org/apache/juneau/rest/test/AcceptCharsetTest.java
----------------------------------------------------------------------
diff --git a/juneau-rest-test/src/test/java/org/apache/juneau/rest/test/AcceptCharsetTest.java b/juneau-rest-test/src/test/java/org/apache/juneau/rest/test/AcceptCharsetTest.java
index 9cce642..0bace15 100644
--- a/juneau-rest-test/src/test/java/org/apache/juneau/rest/test/AcceptCharsetTest.java
+++ b/juneau-rest-test/src/test/java/org/apache/juneau/rest/test/AcceptCharsetTest.java
@@ -22,7 +22,7 @@ import org.apache.juneau.internal.*;
 import org.apache.juneau.rest.client.*;
 import org.junit.*;
 
-public class AcceptCharsetTest {
+public class AcceptCharsetTest extends RestTestcase {
 
 	boolean debug = false;
 

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/097b8103/juneau-rest-test/src/test/java/org/apache/juneau/rest/test/BeanContextPropertiesTest.java
----------------------------------------------------------------------
diff --git a/juneau-rest-test/src/test/java/org/apache/juneau/rest/test/BeanContextPropertiesTest.java b/juneau-rest-test/src/test/java/org/apache/juneau/rest/test/BeanContextPropertiesTest.java
index cab1f3d..6580d9d 100644
--- a/juneau-rest-test/src/test/java/org/apache/juneau/rest/test/BeanContextPropertiesTest.java
+++ b/juneau-rest-test/src/test/java/org/apache/juneau/rest/test/BeanContextPropertiesTest.java
@@ -18,7 +18,7 @@ import org.apache.juneau.json.*;
 import org.apache.juneau.rest.client.*;
 import org.junit.*;
 
-public class BeanContextPropertiesTest {
+public class BeanContextPropertiesTest extends RestTestcase {
 
 	boolean debug = false;
 

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/097b8103/juneau-rest-test/src/test/java/org/apache/juneau/rest/test/CallbackStringsTest.java
----------------------------------------------------------------------
diff --git a/juneau-rest-test/src/test/java/org/apache/juneau/rest/test/CallbackStringsTest.java b/juneau-rest-test/src/test/java/org/apache/juneau/rest/test/CallbackStringsTest.java
index 0b73c13..b65d2f8 100644
--- a/juneau-rest-test/src/test/java/org/apache/juneau/rest/test/CallbackStringsTest.java
+++ b/juneau-rest-test/src/test/java/org/apache/juneau/rest/test/CallbackStringsTest.java
@@ -17,7 +17,7 @@ import static org.junit.Assert.*;
 import org.apache.juneau.rest.client.*;
 import org.junit.*;
 
-public class CallbackStringsTest {
+public class CallbackStringsTest extends RestTestcase {
 
 	//====================================================================================================
 	// Basic tests using @Body parameter

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/097b8103/juneau-rest-test/src/test/java/org/apache/juneau/rest/test/CharsetEncodingsTest.java
----------------------------------------------------------------------
diff --git a/juneau-rest-test/src/test/java/org/apache/juneau/rest/test/CharsetEncodingsTest.java b/juneau-rest-test/src/test/java/org/apache/juneau/rest/test/CharsetEncodingsTest.java
index 25197f8..2aeb4f7 100644
--- a/juneau-rest-test/src/test/java/org/apache/juneau/rest/test/CharsetEncodingsTest.java
+++ b/juneau-rest-test/src/test/java/org/apache/juneau/rest/test/CharsetEncodingsTest.java
@@ -23,7 +23,7 @@ import org.apache.juneau.rest.client.*;
 import org.junit.*;
 
 
-public class CharsetEncodingsTest {
+public class CharsetEncodingsTest extends RestTestcase {
 
 	private static boolean debug = false;
 

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/097b8103/juneau-rest-test/src/test/java/org/apache/juneau/rest/test/ClientVersionTest.java
----------------------------------------------------------------------
diff --git a/juneau-rest-test/src/test/java/org/apache/juneau/rest/test/ClientVersionTest.java b/juneau-rest-test/src/test/java/org/apache/juneau/rest/test/ClientVersionTest.java
index c7ca711..85c168b 100644
--- a/juneau-rest-test/src/test/java/org/apache/juneau/rest/test/ClientVersionTest.java
+++ b/juneau-rest-test/src/test/java/org/apache/juneau/rest/test/ClientVersionTest.java
@@ -18,7 +18,7 @@ import org.apache.juneau.plaintext.*;
 import org.apache.juneau.rest.client.*;
 import org.junit.*;
 
-public class ClientVersionTest {
+public class ClientVersionTest extends RestTestcase {
 
 	private static String URL = "/testClientVersion";
 

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/097b8103/juneau-rest-test/src/test/java/org/apache/juneau/rest/test/ConfigTest.java
----------------------------------------------------------------------
diff --git a/juneau-rest-test/src/test/java/org/apache/juneau/rest/test/ConfigTest.java b/juneau-rest-test/src/test/java/org/apache/juneau/rest/test/ConfigTest.java
index be7ebaa..3856466 100644
--- a/juneau-rest-test/src/test/java/org/apache/juneau/rest/test/ConfigTest.java
+++ b/juneau-rest-test/src/test/java/org/apache/juneau/rest/test/ConfigTest.java
@@ -21,7 +21,7 @@ import org.apache.juneau.rest.*;
 import org.apache.juneau.rest.client.*;
 import org.junit.*;
 
-public class ConfigTest {
+public class ConfigTest extends RestTestcase {
 
 	private static String URL = "/testConfig";
 

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/097b8103/juneau-rest-test/src/test/java/org/apache/juneau/rest/test/Constants.java
----------------------------------------------------------------------
diff --git a/juneau-rest-test/src/test/java/org/apache/juneau/rest/test/Constants.java b/juneau-rest-test/src/test/java/org/apache/juneau/rest/test/Constants.java
index 0f8a09d..a996b3b 100644
--- a/juneau-rest-test/src/test/java/org/apache/juneau/rest/test/Constants.java
+++ b/juneau-rest-test/src/test/java/org/apache/juneau/rest/test/Constants.java
@@ -15,7 +15,7 @@ package org.apache.juneau.rest.test;
 import java.net.*;
 
 
-public class Constants {
+public class Constants extends RestTestcase {
 
 	private static String juneauSampleUrl = System.getProperty("JUNO_SAMPLE_URL", "http://localhost:10000");
 	private static URI juneauSampleUri = (juneauSampleUrl == null ? null : URI.create(juneauSampleUrl));


[5/8] incubator-juneau git commit: Modification to UON spec. Remove bean subtype support.

Posted by ja...@apache.org.
http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/097b8103/juneau-core-test/src/test/java/org/apache/juneau/urlencoding/UrlEncodingSerializerTest.java
----------------------------------------------------------------------
diff --git a/juneau-core-test/src/test/java/org/apache/juneau/urlencoding/UrlEncodingSerializerTest.java b/juneau-core-test/src/test/java/org/apache/juneau/urlencoding/UrlEncodingSerializerTest.java
index 3366856..84f240b 100755
--- a/juneau-core-test/src/test/java/org/apache/juneau/urlencoding/UrlEncodingSerializerTest.java
+++ b/juneau-core-test/src/test/java/org/apache/juneau/urlencoding/UrlEncodingSerializerTest.java
@@ -17,13 +17,13 @@ import static org.junit.Assert.*;
 import java.util.*;
 
 import org.apache.juneau.*;
+import org.apache.juneau.json.JsonSerializer;
 import org.junit.*;
 
 @SuppressWarnings("javadoc")
 public class UrlEncodingSerializerTest {
 
 	static UrlEncodingSerializer s = UrlEncodingSerializer.DEFAULT;
-	static UrlEncodingSerializer ss = UrlEncodingSerializer.DEFAULT_SIMPLE;
 	static UrlEncodingSerializer sr = UrlEncodingSerializer.DEFAULT_READABLE;
 
 
@@ -43,253 +43,214 @@ public class UrlEncodingSerializerTest {
 		// 2nd level
 		t = new ObjectMap("{a:'a'}");
 		assertEquals("a=a", s.serialize(t));
-		assertEquals("a=a", ss.serialize(t));
 		assertEquals("a=a", sr.serialize(t));
 
 		// Simple map
 		// Top level
 		t = new ObjectMap("{a:'b',c:123,d:false,e:true,f:null}");
-		assertEquals("a=b&c=$n(123)&d=$b(false)&e=$b(true)&f=%00", s.serialize(t));
-		assertEquals("a=b&c=123&d=false&e=true&f=%00", ss.serialize(t));
-		assertEquals("a=b\n&c=$n(123)\n&d=$b(false)\n&e=$b(true)\n&f=%00", sr.serialize(t));
+		assertEquals("a=b&c=123&d=false&e=true&f=null", s.serialize(t));
+		assertEquals("a=b\n&c=123\n&d=false\n&e=true\n&f=null", sr.serialize(t));
 
 		// 2nd level
 		t = new ObjectMap("{a:{a:'b',c:123,d:false,e:true,f:null}}");
-		assertEquals("a=$o(a=b,c=$n(123),d=$b(false),e=$b(true),f=%00)", s.serialize(t));
-		assertEquals("a=(a=b,c=123,d=false,e=true,f=%00)", ss.serialize(t));
-		assertEquals("a=$o(\n\ta=b,\n\tc=$n(123),\n\td=$b(false),\n\te=$b(true),\n\tf=%00\n)", sr.serialize(t));
+		assertEquals("a=(a=b,c=123,d=false,e=true,f=null)", s.serialize(t));
+		assertEquals("a=(\n\ta=b,\n\tc=123,\n\td=false,\n\te=true,\n\tf=null\n)", sr.serialize(t));
 
 		// Simple map with primitives as literals
 		t = new ObjectMap("{a:'b',c:'123',d:'false',e:'true',f:'null'}");
-		assertEquals("a=b&c=123&d=false&e=true&f=null", s.serialize(t));
-		assertEquals("a=b&c=123&d=false&e=true&f=null", ss.serialize(t));
-		assertEquals("a=b\n&c=123\n&d=false\n&e=true\n&f=null", sr.serialize(t));
+		assertEquals("a=b&c='123'&d='false'&e='true'&f='null'", s.serialize(t));
+		assertEquals("a=b\n&c='123'\n&d='false'\n&e='true'\n&f='null'", sr.serialize(t));
 
 		// null
 		// Note that serializeParams is always encoded.
 		// Top level
 		t = null;
-		assertEquals("_value=%00", s.serialize(t));
-		assertEquals("_value=%00", ss.serialize(t));
-		assertEquals("_value=%00", sr.serialize(t));
+		assertEquals("_value=null", s.serialize(t));
+		assertEquals("_value=null", sr.serialize(t));
 
 		// 2nd level
 		t = new ObjectMap("{null:null}");
-		assertEquals("%00=%00", s.serialize(t));
-		assertEquals("%00=%00", ss.serialize(t));
-		assertEquals("%00=%00", sr.serialize(t));
+		assertEquals("null=null", s.serialize(t));
+		assertEquals("null=null", sr.serialize(t));
 
 		// 3rd level
 		t = new ObjectMap("{null:{null:null}}");
-		assertEquals("%00=$o(%00=%00)", s.serialize(t));
-		assertEquals("%00=(%00=%00)", ss.serialize(t));
-		assertEquals("%00=$o(\n\t%00=%00\n)", sr.serialize(t));
+		assertEquals("null=(null=null)", s.serialize(t));
+		assertEquals("null=(\n\tnull=null\n)", sr.serialize(t));
 
 		// Empty array
 		// Top level
 		t = new String[0];
-		assertEquals("_value=$a()", s.serialize(t));
-		assertEquals("_value=()", ss.serialize(t));
-		assertEquals("_value=$a()", sr.serialize(t));
+		assertEquals("_value=@()", s.serialize(t));
+		assertEquals("_value=@()", sr.serialize(t));
 
 		// 2nd level in map
 		t = new ObjectMap("{x:[]}");
-		assertEquals("x=$a()", s.serialize(t));
-		assertEquals("x=()", ss.serialize(t));
-		assertEquals("x=$a()", sr.serialize(t));
+		assertEquals("x=@()", s.serialize(t));
+		assertEquals("x=@()", sr.serialize(t));
 
 		// Empty 2 dimensional array
 		t = new String[1][0];
-		assertEquals("_value=$a($a())", s.serialize(t));
-		assertEquals("_value=(())", ss.serialize(t));
-		assertEquals("_value=$a(\n\t$a()\n)", sr.serialize(t));
+		assertEquals("_value=@(@())", s.serialize(t));
+		assertEquals("_value=@(\n\t@()\n)", sr.serialize(t));
 
 		// Array containing empty string
 		// Top level
 		t = new String[]{""};
-		assertEquals("_value=$a(())", s.serialize(t));
-		assertEquals("_value=(())", ss.serialize(t));
-		assertEquals("_value=$a(\n\t()\n)", sr.serialize(t));
+		assertEquals("_value=@('')", s.serialize(t));
+		assertEquals("_value=@(\n\t''\n)", sr.serialize(t));
 
 		// 2nd level
 		t = new ObjectMap("{x:['']}");
-		assertEquals("x=$a(())", s.serialize(t));
-		assertEquals("x=(())", ss.serialize(t));
-		assertEquals("x=$a(\n\t()\n)", sr.serialize(t));
+		assertEquals("x=@('')", s.serialize(t));
+		assertEquals("x=@(\n\t''\n)", sr.serialize(t));
 
 		// Array containing 3 empty strings
 		t = new String[]{"","",""};
-		assertEquals("_value=$a(,,)", s.serialize(t));
-		assertEquals("_value=(,,)", ss.serialize(t));
-		assertEquals("_value=$a(\n\t(),\n\t(),\n\t()\n)", sr.serialize(t));
+		assertEquals("_value=@('','','')", s.serialize(t));
+		assertEquals("_value=@(\n\t'',\n\t'',\n\t''\n)", sr.serialize(t));
 
 		// String containing \u0000
 		// Top level
 		t = "\u0000";
-		assertEquals("_value=(%00)", s.serialize(t));
-		assertEquals("_value=(%00)", ss.serialize(t));
-		assertEquals("_value=(%00)", sr.serialize(t));
+		assertEquals("_value=%00", s.serialize(t));
+		assertEquals("_value=%00", sr.serialize(t));
 
 		// 2nd level
 		t = new ObjectMap("{'\u0000':'\u0000'}");
-		assertEquals("(%00)=(%00)", s.serialize(t));
-		assertEquals("(%00)=(%00)", ss.serialize(t));
-		assertEquals("(%00)=(%00)", sr.serialize(t));
+		assertEquals("%00=%00", s.serialize(t));
+		assertEquals("%00=%00", sr.serialize(t));
 
 		// Boolean
 		// Top level
 		t = false;
-		assertEquals("_value=$b(false)", s.serialize(t));
-		assertEquals("_value=false", ss.serialize(t));
-		assertEquals("_value=$b(false)", sr.serialize(t));
+		assertEquals("_value=false", s.serialize(t));
+		assertEquals("_value=false", sr.serialize(t));
 
 		// 2nd level
 		t = new ObjectMap("{x:false}");
-		assertEquals("x=$b(false)", s.serialize(t));
-		assertEquals("x=false", ss.serialize(t));
-		assertEquals("x=$b(false)", sr.serialize(t));
+		assertEquals("x=false", s.serialize(t));
+		assertEquals("x=false", sr.serialize(t));
 
 		// Number
 		// Top level
 		t = 123;
-		assertEquals("_value=$n(123)", s.serialize(t));
-		assertEquals("_value=123", ss.serialize(t));
-		assertEquals("_value=$n(123)", sr.serialize(t));
+		assertEquals("_value=123", s.serialize(t));
+		assertEquals("_value=123", sr.serialize(t));
 
 		// 2nd level
 		t = new ObjectMap("{x:123}");
-		assertEquals("x=$n(123)", s.serialize(t));
-		assertEquals("x=123", ss.serialize(t));
-		assertEquals("x=$n(123)", sr.serialize(t));
+		assertEquals("x=123", s.serialize(t));
+		assertEquals("x=123", sr.serialize(t));
 
 		// Unencoded chars
 		// Top level
 		t = "x;/?:@-_.!*'";
-		assertEquals("_value=x;/?:@-_.!*'", s.serialize(t));
-		assertEquals("_value=x;/?:@-_.!*'", ss.serialize(t));
-		assertEquals("_value=x;/?:@-_.!*'", sr.serialize(t));
+		assertEquals("_value=x;/?:@-_.!*~'", s.serialize(t));
+		assertEquals("_value=x;/?:@-_.!*~'", sr.serialize(t));
 
 		// 2nd level
 		t = new ObjectMap("{x:'x;/?:@-_.!*\\''}");
-		assertEquals("x=x;/?:@-_.!*'", s.serialize(t));
-		assertEquals("x=x;/?:@-_.!*'", ss.serialize(t));
-		assertEquals("x=x;/?:@-_.!*'", sr.serialize(t));
+		assertEquals("x=x;/?:@-_.!*~'", s.serialize(t));
+		assertEquals("x=x;/?:@-_.!*~'", sr.serialize(t));
 
 		// Encoded chars
 		// Top level
 		t = "x{}|\\^[]`<>#%\"&+";
 		assertEquals("_value=x%7B%7D%7C%5C%5E%5B%5D%60%3C%3E%23%25%22%26%2B", s.serialize(t));
-		assertEquals("_value=x%7B%7D%7C%5C%5E%5B%5D%60%3C%3E%23%25%22%26%2B", ss.serialize(t));
 		assertEquals("_value=x%7B%7D%7C%5C%5E%5B%5D%60%3C%3E%23%25%22%26%2B", sr.serialize(t));
 
 		// 2nd level
 		t = new ObjectMap("{'x{}|\\\\^[]`<>#%\"&+':'x{}|\\\\^[]`<>#%\"&+'}");
 		assertEquals("x%7B%7D%7C%5C%5E%5B%5D%60%3C%3E%23%25%22%26%2B=x%7B%7D%7C%5C%5E%5B%5D%60%3C%3E%23%25%22%26%2B", s.serialize(t));
-		assertEquals("x%7B%7D%7C%5C%5E%5B%5D%60%3C%3E%23%25%22%26%2B=x%7B%7D%7C%5C%5E%5B%5D%60%3C%3E%23%25%22%26%2B", ss.serialize(t));
 		assertEquals("x%7B%7D%7C%5C%5E%5B%5D%60%3C%3E%23%25%22%26%2B=x%7B%7D%7C%5C%5E%5B%5D%60%3C%3E%23%25%22%26%2B", sr.serialize(t));
 
 		// Escaped chars
 		// Top level
 		t = "x$,()~";
-		assertEquals("_value=x$,()~", s.serialize(t));
-		assertEquals("_value=x$,()~", ss.serialize(t));
-		assertEquals("_value=x$,()~", sr.serialize(t));
+		assertEquals("_value='x$,()~~'", s.serialize(t));
+		assertEquals("_value='x$,()~~'", sr.serialize(t));
 
 		// 2nd level
 		t = new ObjectMap("{'x$,()~':'x$,()~'}");
-		assertEquals("x$,()~=x$,()~", s.serialize(t));
-		assertEquals("x$,()~=x$,()~", ss.serialize(t));
-		assertEquals("x$,()~=x$,()~", sr.serialize(t));
+		assertEquals("'x$,()~~'='x$,()~~'", s.serialize(t));
+		assertEquals("'x$,()~~'='x$,()~~'", sr.serialize(t));
 
 		// 3rd level
 		t = new ObjectMap("{'x$,()~':{'x$,()~':'x$,()~'}}");
-		assertEquals("x$,()~=$o(x$~,~(~)~~=x$~,~(~)~~)", s.serialize(t));
-		assertEquals("x$,()~=(x$~,~(~)~~=x$~,~(~)~~)", ss.serialize(t));
-		assertEquals("x$,()~=$o(\n\tx$~,~(~)~~=x$~,~(~)~~\n)", sr.serialize(t));
+		assertEquals("'x$,()~~'=('x$,()~~'='x$,()~~')", s.serialize(t));
+		assertEquals("'x$,()~~'=(\n\t'x$,()~~'='x$,()~~'\n)", sr.serialize(t));
 
 		// Equals sign
 		// Gets encoded at top level, and encoded+escaped at 2nd level.
 		// Top level
 		t = "x=";
-		assertEquals("_value=x=", s.serialize(t));
-		assertEquals("_value=x=", ss.serialize(t));
-		assertEquals("_value=x=", sr.serialize(t));
+		assertEquals("_value='x='", s.serialize(t));
+		assertEquals("_value='x='", sr.serialize(t));
 
 		// 2nd level
 		t = new ObjectMap("{'x=':'x='}");
-		assertEquals("x%3D=x=", s.serialize(t));
-		assertEquals("x%3D=x=", ss.serialize(t));
-		assertEquals("x%3D=x=", sr.serialize(t));
+		assertEquals("'x%3D'='x='", s.serialize(t));
+		assertEquals("'x%3D'='x='", sr.serialize(t));
 
 		// 3rd level
 		t = new ObjectMap("{'x=':{'x=':'x='}}");
-		assertEquals("x%3D=$o(x~==x~=)", s.serialize(t));
-		assertEquals("x%3D=(x~==x~=)", ss.serialize(t));
-		assertEquals("x%3D=$o(\n\tx~==x~=\n)", sr.serialize(t));
+		assertEquals("'x%3D'=('x='='x=')", s.serialize(t));
+		assertEquals("'x%3D'=(\n\t'x='='x='\n)", sr.serialize(t));
 
 		// String starting with parenthesis
 		// Top level
 		t = "()";
-		assertEquals("_value=(~(~))", s.serialize(t));
-		assertEquals("_value=(~(~))", ss.serialize(t));
-		assertEquals("_value=(~(~))", sr.serialize(t));
+		assertEquals("_value='()'", s.serialize(t));
+		assertEquals("_value='()'", sr.serialize(t));
 
 		// 2nd level
 		t = new ObjectMap("{'()':'()'}");
-		assertEquals("(~(~))=(~(~))", s.serialize(t));
-		assertEquals("(~(~))=(~(~))", ss.serialize(t));
-		assertEquals("(~(~))=(~(~))", sr.serialize(t));
+		assertEquals("'()'='()'", s.serialize(t));
+		assertEquals("'()'='()'", sr.serialize(t));
 
 		// String starting with $
 		// Top level
 		t = "$a";
-		assertEquals("_value=($a)", s.serialize(t));
-		assertEquals("_value=($a)", ss.serialize(t));
-		assertEquals("_value=($a)", sr.serialize(t));
+		assertEquals("_value=$a", s.serialize(t));
+		assertEquals("_value=$a", sr.serialize(t));
 
 		// 2nd level
 		t = new ObjectMap("{$a:'$a'}");
-		assertEquals("($a)=($a)", s.serialize(t));
-		assertEquals("($a)=($a)", ss.serialize(t));
-		assertEquals("($a)=($a)", sr.serialize(t));
+		assertEquals("$a=$a", s.serialize(t));
+		assertEquals("$a=$a", sr.serialize(t));
 
 		// Blank string
 		// Top level
 		t = "";
-		assertEquals("_value=", s.serialize(t));
-		assertEquals("_value=", ss.serialize(t));
-		assertEquals("_value=", sr.serialize(t));
+		assertEquals("_value=''", s.serialize(t));
+		assertEquals("_value=''", sr.serialize(t));
 
 		// 2nd level
 		t = new ObjectMap("{'':''}");
-		assertEquals("=", s.serialize(t));
-		assertEquals("=", ss.serialize(t));
-		assertEquals("=", sr.serialize(t));
+		assertEquals("''=''", s.serialize(t));
+		assertEquals("''=''", sr.serialize(t));
 
 		// 3rd level
 		t = new ObjectMap("{'':{'':''}}");
-		assertEquals("=$o(=)", s.serialize(t));
-		assertEquals("=(=)", ss.serialize(t));
-		assertEquals("=$o(\n\t()=()\n)", sr.serialize(t));
+		assertEquals("''=(''='')", s.serialize(t));
+		assertEquals("''=(\n\t''=''\n)", sr.serialize(t));
 
 		// Newline character
 		// Top level
 		t = "\n";
-		assertEquals("_value=%0A", s.serialize(t));
-		assertEquals("_value=%0A", ss.serialize(t));
-		assertEquals("_value=(%0A)", sr.serialize(t));
+		assertEquals("_value='%0A'", s.serialize(t));
+		assertEquals("_value='%0A'", sr.serialize(t));
 
 		// 2nd level
 		t = new ObjectMap("{'\n':'\n'}");
-		assertEquals("%0A=%0A", s.serialize(t));
-		assertEquals("%0A=%0A", ss.serialize(t));
-		assertEquals("(%0A)=(%0A)", sr.serialize(t));
+		assertEquals("'%0A'='%0A'", s.serialize(t));
+		assertEquals("'%0A'='%0A'", sr.serialize(t));
 
 		// 3rd level
 		t = new ObjectMap("{'\n':{'\n':'\n'}}");
-		assertEquals("%0A=$o(%0A=%0A)", s.serialize(t));
-		assertEquals("%0A=(%0A=%0A)", ss.serialize(t));
-		assertEquals("(%0A)=$o(\n\t(%0A)=(%0A)\n)", sr.serialize(t));
+		assertEquals("'%0A'=('%0A'='%0A')", s.serialize(t));
+		assertEquals("'%0A'=(\n\t'%0A'='%0A'\n)", sr.serialize(t));
 	}
 
 	//====================================================================================================
@@ -303,58 +264,49 @@ public class UrlEncodingSerializerTest {
 		// Top level
 		t = "�";
 		assertEquals("_value=%C2%A2", s.serialize(t));
-		assertEquals("_value=%C2%A2", ss.serialize(t));
 		assertEquals("_value=%C2%A2", sr.serialize(t));
 
 		// 2nd level
 		t = new ObjectMap("{'�':'�'}");
 		assertEquals("%C2%A2=%C2%A2", s.serialize(t));
-		assertEquals("%C2%A2=%C2%A2", ss.serialize(t));
 		assertEquals("%C2%A2=%C2%A2", sr.serialize(t));
 
 		// 3rd level
 		t = new ObjectMap("{'�':{'�':'�'}}");
-		assertEquals("%C2%A2=$o(%C2%A2=%C2%A2)", s.serialize(t));
-		assertEquals("%C2%A2=(%C2%A2=%C2%A2)", ss.serialize(t));
-		assertEquals("%C2%A2=$o(\n\t%C2%A2=%C2%A2\n)", sr.serialize(t));
+		assertEquals("%C2%A2=(%C2%A2=%C2%A2)", s.serialize(t));
+		assertEquals("%C2%A2=(\n\t%C2%A2=%C2%A2\n)", sr.serialize(t));
 
 		// 3-byte UTF-8 character
 		// Top level
 		t = "\u20ac";
 		assertEquals("_value=%E2%82%AC", s.serialize(t));
-		assertEquals("_value=%E2%82%AC", ss.serialize(t));
 		assertEquals("_value=%E2%82%AC", sr.serialize(t));
 
 		// 2nd level
 		t = new ObjectMap("{'\u20ac':'\u20ac'}");
 		assertEquals("%E2%82%AC=%E2%82%AC", s.serialize(t));
-		assertEquals("%E2%82%AC=%E2%82%AC", ss.serialize(t));
 		assertEquals("%E2%82%AC=%E2%82%AC", sr.serialize(t));
 
 		// 3rd level
 		t = new ObjectMap("{'\u20ac':{'\u20ac':'\u20ac'}}");
-		assertEquals("%E2%82%AC=$o(%E2%82%AC=%E2%82%AC)", s.serialize(t));
-		assertEquals("%E2%82%AC=(%E2%82%AC=%E2%82%AC)", ss.serialize(t));
-		assertEquals("%E2%82%AC=$o(\n\t%E2%82%AC=%E2%82%AC\n)", sr.serialize(t));
+		assertEquals("%E2%82%AC=(%E2%82%AC=%E2%82%AC)", s.serialize(t));
+		assertEquals("%E2%82%AC=(\n\t%E2%82%AC=%E2%82%AC\n)", sr.serialize(t));
 
 		// 4-byte UTF-8 character
 		// Top level
 		t = "\U00024b62";
 		assertEquals("_value=%F0%A4%AD%A2", s.serialize(t));
-		assertEquals("_value=%F0%A4%AD%A2", ss.serialize(t));
 		assertEquals("_value=%F0%A4%AD%A2", sr.serialize(t));
 
 		// 2nd level
 		t = new ObjectMap("{'\U00024b62':'\U00024b62'}");
 		assertEquals("%F0%A4%AD%A2=%F0%A4%AD%A2", s.serialize(t));
-		assertEquals("%F0%A4%AD%A2=%F0%A4%AD%A2", ss.serialize(t));
 		assertEquals("%F0%A4%AD%A2=%F0%A4%AD%A2", sr.serialize(t));
 
 		// 3rd level
 		t = new ObjectMap("{'\U00024b62':{'\U00024b62':'\U00024b62'}}");
-		assertEquals("%F0%A4%AD%A2=$o(%F0%A4%AD%A2=%F0%A4%AD%A2)", s.serialize(t));
-		assertEquals("%F0%A4%AD%A2=(%F0%A4%AD%A2=%F0%A4%AD%A2)", ss.serialize(t));
-		assertEquals("%F0%A4%AD%A2=$o(\n\t%F0%A4%AD%A2=%F0%A4%AD%A2\n)", sr.serialize(t));
+		assertEquals("%F0%A4%AD%A2=(%F0%A4%AD%A2=%F0%A4%AD%A2)", s.serialize(t));
+		assertEquals("%F0%A4%AD%A2=(\n\t%F0%A4%AD%A2=%F0%A4%AD%A2\n)", sr.serialize(t));
 	}
 
 	//====================================================================================================
@@ -366,54 +318,54 @@ public class UrlEncodingSerializerTest {
 		DTOs.B t = DTOs.B.create();
 		String r;
 
-		s = UrlEncodingSerializer.DEFAULT_SIMPLE;
+		s = UrlEncodingSerializer.DEFAULT;
 		r = s.serialize(t);
 		String e = ""
-			+ "f01=(a,b)"
-			+ "&f02=(c,d)"
-			+ "&f03=(1,2)"
-			+ "&f04=(3,4)"
-			+ "&f05=((e,f),(g,h))"
-			+ "&f06=((i,j),(k,l))"
-			+ "&f07=((a=a,b=1,c=true),(a=a,b=1,c=true))"
-			+ "&f08=((a=a,b=1,c=true),(a=a,b=1,c=true))"
-			+ "&f09=(((a=a,b=1,c=true)),((a=a,b=1,c=true)))"
-			+ "&f10=(((a=a,b=1,c=true)),((a=a,b=1,c=true)))"
-			+ "&f11=(a,b)"
-			+ "&f12=(c,d)"
-			+ "&f13=(1,2)"
-			+ "&f14=(3,4)"
-			+ "&f15=((e,f),(g,h))"
-			+ "&f16=((i,j),(k,l))"
-			+ "&f17=((a=a,b=1,c=true),(a=a,b=1,c=true))"
-			+ "&f18=((a=a,b=1,c=true),(a=a,b=1,c=true))"
-			+ "&f19=(((a=a,b=1,c=true)),((a=a,b=1,c=true)))"
-			+ "&f20=(((a=a,b=1,c=true)),((a=a,b=1,c=true)))";
+			+ "f01=@(a,b)"
+			+ "&f02=@(c,d)"
+			+ "&f03=@(1,2)"
+			+ "&f04=@(3,4)"
+			+ "&f05=@(@(e,f),@(g,h))"
+			+ "&f06=@(@(i,j),@(k,l))"
+			+ "&f07=@((a=a,b=1,c=true),(a=a,b=1,c=true))"
+			+ "&f08=@((a=a,b=1,c=true),(a=a,b=1,c=true))"
+			+ "&f09=@(@((a=a,b=1,c=true)),@((a=a,b=1,c=true)))"
+			+ "&f10=@(@((a=a,b=1,c=true)),@((a=a,b=1,c=true)))"
+			+ "&f11=@(a,b)"
+			+ "&f12=@(c,d)"
+			+ "&f13=@(1,2)"
+			+ "&f14=@(3,4)"
+			+ "&f15=@(@(e,f),@(g,h))"
+			+ "&f16=@(@(i,j),@(k,l))"
+			+ "&f17=@((a=a,b=1,c=true),(a=a,b=1,c=true))"
+			+ "&f18=@((a=a,b=1,c=true),(a=a,b=1,c=true))"
+			+ "&f19=@(@((a=a,b=1,c=true)),@((a=a,b=1,c=true)))"
+			+ "&f20=@(@((a=a,b=1,c=true)),@((a=a,b=1,c=true)))";
 		assertEquals(e, r);
 
-		s = UrlEncodingSerializer.DEFAULT_SIMPLE.clone().setExpandedParams(true);
+		s = UrlEncodingSerializer.DEFAULT.clone().setExpandedParams(true);
 		r = s.serialize(t);
 		e = ""
 			+ "f01=a&f01=b"
 			+ "&f02=c&f02=d"
 			+ "&f03=1&f03=2"
 			+ "&f04=3&f04=4"
-			+ "&f05=(e,f)&f05=(g,h)"
-			+ "&f06=(i,j)&f06=(k,l)"
+			+ "&f05=@(e,f)&f05=@(g,h)"
+			+ "&f06=@(i,j)&f06=@(k,l)"
 			+ "&f07=(a=a,b=1,c=true)&f07=(a=a,b=1,c=true)"
 			+ "&f08=(a=a,b=1,c=true)&f08=(a=a,b=1,c=true)"
-			+ "&f09=((a=a,b=1,c=true))&f09=((a=a,b=1,c=true))"
-			+ "&f10=((a=a,b=1,c=true))&f10=((a=a,b=1,c=true))"
+			+ "&f09=@((a=a,b=1,c=true))&f09=@((a=a,b=1,c=true))"
+			+ "&f10=@((a=a,b=1,c=true))&f10=@((a=a,b=1,c=true))"
 			+ "&f11=a&f11=b"
 			+ "&f12=c&f12=d"
 			+ "&f13=1&f13=2"
 			+ "&f14=3&f14=4"
-			+ "&f15=(e,f)&f15=(g,h)"
-			+ "&f16=(i,j)&f16=(k,l)"
+			+ "&f15=@(e,f)&f15=@(g,h)"
+			+ "&f16=@(i,j)&f16=@(k,l)"
 			+ "&f17=(a=a,b=1,c=true)&f17=(a=a,b=1,c=true)"
 			+ "&f18=(a=a,b=1,c=true)&f18=(a=a,b=1,c=true)"
-			+ "&f19=((a=a,b=1,c=true))&f19=((a=a,b=1,c=true))"
-			+ "&f20=((a=a,b=1,c=true))&f20=((a=a,b=1,c=true))";
+			+ "&f19=@((a=a,b=1,c=true))&f19=@((a=a,b=1,c=true))"
+			+ "&f20=@((a=a,b=1,c=true))&f20=@((a=a,b=1,c=true))";
 		assertEquals(e, r);
 	}
 
@@ -427,54 +379,54 @@ public class UrlEncodingSerializerTest {
 		DTOs.C t = DTOs.C.create();
 		String r;
 
-		s = UrlEncodingSerializer.DEFAULT_SIMPLE;
+		s = UrlEncodingSerializer.DEFAULT;
 		r = s.serialize(t);
 		String e = ""
 			+ "f01=a&f01=b"
 			+ "&f02=c&f02=d"
 			+ "&f03=1&f03=2"
 			+ "&f04=3&f04=4"
-			+ "&f05=(e,f)&f05=(g,h)"
-			+ "&f06=(i,j)&f06=(k,l)"
+			+ "&f05=@(e,f)&f05=@(g,h)"
+			+ "&f06=@(i,j)&f06=@(k,l)"
 			+ "&f07=(a=a,b=1,c=true)&f07=(a=a,b=1,c=true)"
 			+ "&f08=(a=a,b=1,c=true)&f08=(a=a,b=1,c=true)"
-			+ "&f09=((a=a,b=1,c=true))&f09=((a=a,b=1,c=true))"
-			+ "&f10=((a=a,b=1,c=true))&f10=((a=a,b=1,c=true))"
+			+ "&f09=@((a=a,b=1,c=true))&f09=@((a=a,b=1,c=true))"
+			+ "&f10=@((a=a,b=1,c=true))&f10=@((a=a,b=1,c=true))"
 			+ "&f11=a&f11=b"
 			+ "&f12=c&f12=d"
 			+ "&f13=1&f13=2"
 			+ "&f14=3&f14=4"
-			+ "&f15=(e,f)&f15=(g,h)"
-			+ "&f16=(i,j)&f16=(k,l)"
+			+ "&f15=@(e,f)&f15=@(g,h)"
+			+ "&f16=@(i,j)&f16=@(k,l)"
 			+ "&f17=(a=a,b=1,c=true)&f17=(a=a,b=1,c=true)"
 			+ "&f18=(a=a,b=1,c=true)&f18=(a=a,b=1,c=true)"
-			+ "&f19=((a=a,b=1,c=true))&f19=((a=a,b=1,c=true))"
-			+ "&f20=((a=a,b=1,c=true))&f20=((a=a,b=1,c=true))";
+			+ "&f19=@((a=a,b=1,c=true))&f19=@((a=a,b=1,c=true))"
+			+ "&f20=@((a=a,b=1,c=true))&f20=@((a=a,b=1,c=true))";
 		assertEquals(e, r);
 
-		s = UrlEncodingSerializer.DEFAULT_SIMPLE.clone().setExpandedParams(true);
+		s = UrlEncodingSerializer.DEFAULT.clone().setExpandedParams(true);
 		r = s.serialize(t);
 		e = ""
 			+ "f01=a&f01=b"
 			+ "&f02=c&f02=d"
 			+ "&f03=1&f03=2"
 			+ "&f04=3&f04=4"
-			+ "&f05=(e,f)&f05=(g,h)"
-			+ "&f06=(i,j)&f06=(k,l)"
+			+ "&f05=@(e,f)&f05=@(g,h)"
+			+ "&f06=@(i,j)&f06=@(k,l)"
 			+ "&f07=(a=a,b=1,c=true)&f07=(a=a,b=1,c=true)"
 			+ "&f08=(a=a,b=1,c=true)&f08=(a=a,b=1,c=true)"
-			+ "&f09=((a=a,b=1,c=true))&f09=((a=a,b=1,c=true))"
-			+ "&f10=((a=a,b=1,c=true))&f10=((a=a,b=1,c=true))"
+			+ "&f09=@((a=a,b=1,c=true))&f09=@((a=a,b=1,c=true))"
+			+ "&f10=@((a=a,b=1,c=true))&f10=@((a=a,b=1,c=true))"
 			+ "&f11=a&f11=b"
 			+ "&f12=c&f12=d"
 			+ "&f13=1&f13=2"
 			+ "&f14=3&f14=4"
-			+ "&f15=(e,f)&f15=(g,h)"
-			+ "&f16=(i,j)&f16=(k,l)"
+			+ "&f15=@(e,f)&f15=@(g,h)"
+			+ "&f16=@(i,j)&f16=@(k,l)"
 			+ "&f17=(a=a,b=1,c=true)&f17=(a=a,b=1,c=true)"
 			+ "&f18=(a=a,b=1,c=true)&f18=(a=a,b=1,c=true)"
-			+ "&f19=((a=a,b=1,c=true))&f19=((a=a,b=1,c=true))"
-			+ "&f20=((a=a,b=1,c=true))&f20=((a=a,b=1,c=true))";
+			+ "&f19=@((a=a,b=1,c=true))&f19=@((a=a,b=1,c=true))"
+			+ "&f20=@((a=a,b=1,c=true))&f20=@((a=a,b=1,c=true))";
 		assertEquals(e, r);
 	}
 
@@ -487,9 +439,18 @@ public class UrlEncodingSerializerTest {
 		t.put("f1", new String[]{"bar"});
 		t.put("f2", new String[]{"bar","baz"});
 		t.put("f3", new String[]{});
-		s = UrlEncodingSerializer.DEFAULT_SIMPLE_EXPANDED;
+		s = UrlEncodingSerializer.DEFAULT_EXPANDED;
 		r = s.serialize(t);
 		String e = "f1=bar&f2=bar&f2=baz";
 		assertEquals(e, r);
 	}
+	
+	@Test
+	public void testParseParameterObjectMap() throws Exception {
+		String in = "(name='foo bar')";
+		
+		ObjectMap r =  UrlEncodingParser.DEFAULT.parseParameter(in, ObjectMap.class);
+	
+		assertEquals("{name:'foo bar'}", JsonSerializer.DEFAULT_LAX.toString(r));
+	}
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/097b8103/juneau-core-test/src/test/java/org/apache/juneau/utils/PojoRestTest.java
----------------------------------------------------------------------
diff --git a/juneau-core-test/src/test/java/org/apache/juneau/utils/PojoRestTest.java b/juneau-core-test/src/test/java/org/apache/juneau/utils/PojoRestTest.java
index 5450e2d..be25076 100755
--- a/juneau-core-test/src/test/java/org/apache/juneau/utils/PojoRestTest.java
+++ b/juneau-core-test/src/test/java/org/apache/juneau/utils/PojoRestTest.java
@@ -71,7 +71,7 @@ public class PojoRestTest {
 		model.put("/person1", p);
 
 		// Make sure it got stored correctly.
-		JsonSerializer serializer = JsonSerializer.DEFAULT_LAX;
+		JsonSerializer serializer = JsonSerializer.DEFAULT_LAX.clone().setAddBeanTypeProperties(false);
 		assertEquals("{person1:{name:'some name',age:123,addresses:[{street:'street A',city:'city A',state:'state A',zip:12345,isCurrent:true},{street:'street B',city:'city B',state:'state B',zip:12345,isCurrent:false}]}}", serializer.serialize(model.getRootObject()));
 
 		// Get the original Person object back.
@@ -82,7 +82,7 @@ public class PojoRestTest {
 		Address a3 = (Address)model.get("/person1/addresses/1");
 		assertEquals("city B", a3.city);
 
-		serializer = new JsonSerializer.Simple().setAddBeanTypeProperties(true);
+		serializer = new JsonSerializer.Simple();
 		p = new Person("some name", 123,
 			new Address("street A", "city A", "state A", 12345, true),
 			new Address("street B", "city B", "state B", 12345, false)
@@ -115,7 +115,7 @@ public class PojoRestTest {
 		model.put("addresses/0", new Address("street D", "city D", "state D", 12345, false));
 		model.put("addresses/1", new Address("street E", "city E", "state E", 12345, false));
 		model.put("addresses/2", new Address("street F", "city F", "state F", 12345, false));
-		serializer = JsonSerializer.DEFAULT_LAX;
+		serializer = JsonSerializer.DEFAULT_LAX.clone().setAddBeanTypeProperties(false);
 		s = serializer.serialize(p);
 		expectedValue = "{name:'some name',age:123,addresses:[{street:'street D',city:'city D',state:'state D',zip:12345,isCurrent:false},{street:'street E',city:'city E',state:'state E',zip:12345,isCurrent:false},{street:'street F',city:'city F',state:'state F',zip:12345,isCurrent:false}]}";
 		assertEquals(expectedValue, s);

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/097b8103/juneau-core-test/src/test/java/org/apache/juneau/xml/XmlContentTest.java
----------------------------------------------------------------------
diff --git a/juneau-core-test/src/test/java/org/apache/juneau/xml/XmlContentTest.java b/juneau-core-test/src/test/java/org/apache/juneau/xml/XmlContentTest.java
index d695969..e11fe18 100755
--- a/juneau-core-test/src/test/java/org/apache/juneau/xml/XmlContentTest.java
+++ b/juneau-core-test/src/test/java/org/apache/juneau/xml/XmlContentTest.java
@@ -34,7 +34,7 @@ public class XmlContentTest {
 	public void testContentFormat() throws Exception {
 		A t = A.newInstance(), t2;
 		XmlSerializer s1 = XmlSerializer.DEFAULT_SQ,
-			s2 = new XmlSerializer().setQuoteChar('\'').setUseIndentation(true).setEnableNamespaces(false);
+			s2 = new XmlSerializer().setQuoteChar('\'').setUseWhitespace(true).setEnableNamespaces(false);
 		XmlParser p = XmlParser.DEFAULT;
 		XmlSerializerSession session;
 		String r;
@@ -142,7 +142,7 @@ public class XmlContentTest {
 	public void testXmlMixed() throws Exception {
 		B t = B.newInstance(), t2;
 		XmlSerializer s1 = XmlSerializer.DEFAULT_SQ,
-			s2 = new XmlSerializer().setQuoteChar('\'').setUseIndentation(true).setEnableNamespaces(false);
+			s2 = new XmlSerializer().setQuoteChar('\'').setUseWhitespace(true).setEnableNamespaces(false);
 		XmlParser p = XmlParser.DEFAULT;
 		XmlSerializerSession session;
 		String r;

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/097b8103/juneau-core/.project
----------------------------------------------------------------------
diff --git a/juneau-core/.project b/juneau-core/.project
index fe1874b..cd59d79 100644
--- a/juneau-core/.project
+++ b/juneau-core/.project
@@ -1,28 +1,23 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<!--
- ***************************************************************************************************************************
- * 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.                                              *
- ***************************************************************************************************************************
--->
 <projectDescription>
-  <name>juneau-core</name>
-  <comment>Base toolkit for serializers, parsers, and bean contexts. NO_M2ECLIPSE_SUPPORT: Project files created with the maven-eclipse-plugin are not supported in M2Eclipse.</comment>
-  <projects/>
-  <buildSpec>
-    <buildCommand>
-      <name>org.eclipse.jdt.core.javabuilder</name>
-    </buildCommand>
-  </buildSpec>
-  <natures>
-    <nature>org.eclipse.jdt.core.javanature</nature>
-  </natures>
-</projectDescription>
\ No newline at end of file
+	<name>juneau-core</name>
+	<comment>Base toolkit for serializers, parsers, and bean contexts. NO_M2ECLIPSE_SUPPORT: Project files created with the maven-eclipse-plugin are not supported in M2Eclipse.</comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.jdt.core.javabuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>edu.umd.cs.findbugs.plugin.eclipse.findbugsBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.jdt.core.javanature</nature>
+		<nature>edu.umd.cs.findbugs.plugin.eclipse.findbugsNature</nature>
+	</natures>
+</projectDescription>

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/097b8103/juneau-core/src/main/java/org/apache/juneau/BeanContext.java
----------------------------------------------------------------------
diff --git a/juneau-core/src/main/java/org/apache/juneau/BeanContext.java b/juneau-core/src/main/java/org/apache/juneau/BeanContext.java
index 116d6e9..881ccf3 100644
--- a/juneau-core/src/main/java/org/apache/juneau/BeanContext.java
+++ b/juneau-core/src/main/java/org/apache/juneau/BeanContext.java
@@ -917,8 +917,8 @@ public class BeanContext extends Context {
 
 		if (! cmCacheCache.containsKey(hashCode)) {
 			ConcurrentHashMap<Class,ClassMeta> cm = new ConcurrentHashMap<Class,ClassMeta>();
-			cm.put(String.class, new ClassMeta(String.class, this, null, null, findPojoSwap(String.class), findChildPojoSwaps(String.class)));
-			cm.put(Object.class, new ClassMeta(Object.class, this, null, null, findPojoSwap(Object.class), findChildPojoSwaps(Object.class)));
+			cm.putIfAbsent(String.class, new ClassMeta(String.class, this, null, null, findPojoSwap(String.class), findChildPojoSwaps(String.class)));
+			cm.putIfAbsent(Object.class, new ClassMeta(Object.class, this, null, null, findPojoSwap(Object.class), findChildPojoSwaps(Object.class)));
 			cmCacheCache.putIfAbsent(hashCode, cm);
 		}
 		this.cmCache = cmCacheCache.get(hashCode);
@@ -1006,7 +1006,7 @@ public class BeanContext extends Context {
 			int ctCount = 0;
 			for (Map<Class,ClassMeta> cm : cmCacheCache.values())
 				ctCount += cm.size();
-			System.out.println(MessageFormat.format("ClassMeta cache: {0} instances in {1} caches", ctCount, cmCacheCache.size()));
+			System.out.println(MessageFormat.format("ClassMeta cache: {0} instances in {1} caches", ctCount, cmCacheCache.size())); // NOT DEBUG
 		} catch (Exception e) {
 			e.printStackTrace();
 		}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/097b8103/juneau-core/src/main/java/org/apache/juneau/BeanMap.java
----------------------------------------------------------------------
diff --git a/juneau-core/src/main/java/org/apache/juneau/BeanMap.java b/juneau-core/src/main/java/org/apache/juneau/BeanMap.java
index 4e1bad6..48fbd40 100644
--- a/juneau-core/src/main/java/org/apache/juneau/BeanMap.java
+++ b/juneau-core/src/main/java/org/apache/juneau/BeanMap.java
@@ -203,15 +203,6 @@ public class BeanMap<T> extends AbstractMap<String,Object> implements Delegate<T
 			if (meta.ctx.ignoreUnknownBeanProperties)
 				return null;
 
-			// If this bean has subtypes, and we haven't set the subtype yet,
-			// store the property in a temporary cache until the bean can be instantiated.
-			// This eliminates the need for requiring that the sub type attribute be provided first.
-			if (meta.subTypeProperty != null) {
-				if (propertyCache == null)
-					propertyCache = new TreeMap<String,Object>();
-				return propertyCache.put(property, value);
-			}
-
 			if (property.equals(session.getBeanTypePropertyName()))
 				return null;
 

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/097b8103/juneau-core/src/main/java/org/apache/juneau/BeanMeta.java
----------------------------------------------------------------------
diff --git a/juneau-core/src/main/java/org/apache/juneau/BeanMeta.java b/juneau-core/src/main/java/org/apache/juneau/BeanMeta.java
index 40f1346..a98677c 100644
--- a/juneau-core/src/main/java/org/apache/juneau/BeanMeta.java
+++ b/juneau-core/src/main/java/org/apache/juneau/BeanMeta.java
@@ -19,7 +19,6 @@ import java.beans.*;
 import java.io.*;
 import java.lang.reflect.*;
 import java.util.*;
-import java.util.Map.*;
 
 import org.apache.juneau.annotation.*;
 import org.apache.juneau.internal.*;
@@ -88,7 +87,6 @@ public class BeanMeta<T> {
 	private final MetadataMap extMeta;  // Extended metadata
 
 	// Other fields
-	final BeanPropertyMeta subTypeProperty;                             // The property indentified as the sub type differentiator property (identified by @Bean.subTypeProperty annotation).
 	private final BeanPropertyMeta typeProperty;                        // "_type" mock bean property.
 	private final String dictionaryName;                                // The @Bean.typeName() annotation defined on this bean class.
 	final String notABeanReason;                                        // Readable string explaining why this class wasn't a bean.
@@ -111,7 +109,7 @@ public class BeanMeta<T> {
 		this.notABeanReason = b.init(this);
 
 		this.beanFilter = beanFilter;
-		this.dictionaryName = beanFilter == null ? null : beanFilter.getTypeName();
+		this.dictionaryName = b.dictionaryName;
 		this.properties = b.properties == null ? null : Collections.unmodifiableMap(b.properties);
 		this.getterProps = Collections.unmodifiableMap(b.getterProps);
 		this.setterProps = Collections.unmodifiableMap(b.setterProps);
@@ -119,7 +117,6 @@ public class BeanMeta<T> {
 		this.constructor = b.constructor;
 		this.constructorArgs = b.constructorArgs;
 		this.extMeta = b.extMeta;
-		this.subTypeProperty = b.subTypeIdProperty == null ? null : b.subTypeIdProperty.build();
 		this.beanRegistry = b.beanRegistry;
 		this.typeProperty = new BeanPropertyMeta.Builder(this, ctx.getBeanTypePropertyName(), ctx.string(), beanRegistry).build();
 	}
@@ -136,9 +133,9 @@ public class BeanMeta<T> {
 		Constructor<T> constructor;
 		String[] constructorArgs = new String[0];
 		MetadataMap extMeta = new MetadataMap();
-		BeanPropertyMeta.Builder subTypeIdProperty;
 		PropertyNamer propertyNamer;
 		BeanRegistry beanRegistry;
+		String dictionaryName;
 
 		private Builder(ClassMeta<T> classMeta, BeanContext ctx, BeanFilter beanFilter, String[] pNames) {
 			this.classMeta = classMeta;
@@ -159,9 +156,10 @@ public class BeanMeta<T> {
 					fVis = ctx.beanFieldVisibility;
 
 				List<Class<?>> bdClasses = new ArrayList<Class<?>>();
+				if (beanFilter != null && beanFilter.getBeanDictionary() != null)
+					bdClasses.addAll(Arrays.asList(beanFilter.getBeanDictionary()));
 				Bean bean = classMeta.innerClass.getAnnotation(Bean.class);
 				if (bean != null) {
-					bdClasses.addAll(Arrays.asList(bean.beanDictionary()));
 					if (! bean.typeName().isEmpty())
 						bdClasses.add(classMeta.innerClass);
 				}
@@ -335,12 +333,10 @@ public class BeanMeta<T> {
 
 				properties = sortProperties ? new TreeMap<String,BeanPropertyMeta>() : new LinkedHashMap<String,BeanPropertyMeta>();
 
-				if (beanFilter != null && beanFilter.getSubTypeProperty() != null) {
-					String subTypeProperty = beanFilter.getSubTypeProperty();
-					BeanPropertyMeta.Builder stp = normalProps.remove(subTypeProperty);
-					this.subTypeIdProperty = new SubTypePropertyMeta.Builder(beanMeta, subTypeProperty, beanFilter.getSubTypes(), stp == null ? null : stp.build(), beanRegistry);
-					properties.put(subTypeProperty, this.subTypeIdProperty.build());
-				}
+				if (beanFilter != null && beanFilter.getTypeName() != null)
+					dictionaryName = beanFilter.getTypeName();
+				if (dictionaryName == null)
+					dictionaryName = findDictionaryName(this.classMeta);
 
 				for (Map.Entry<String,BeanPropertyMeta.Builder> e : normalProps.entrySet())
 					properties.put(e.getKey(), e.getValue().build());
@@ -385,6 +381,27 @@ public class BeanMeta<T> {
 			return null;
 		}
 
+		private String findDictionaryName(ClassMeta<?> cm) {
+			BeanRegistry br = cm.getBeanRegistry();
+			if (br != null) {
+				String s = br.getTypeName(this.classMeta);
+				if (s != null)
+					return s;
+			}
+			Class<?> pcm = cm.innerClass.getSuperclass();
+			if (pcm != null) {
+				String s = findDictionaryName(ctx.getClassMeta(pcm));
+				if (s != null)
+					return s;
+			}
+			for (Class<?> icm : cm.innerClass.getInterfaces()) {
+				String s = findDictionaryName(ctx.getClassMeta(icm));
+				if (s != null)
+					return s;
+			}
+			return null;
+		}
+
 		/*
 		 * Returns the property name of the specified field if it's a valid property.
 		 * Returns null if the field isn't a valid property.
@@ -402,10 +419,8 @@ public class BeanMeta<T> {
 				return name;
 			return null;
 		}
-
 	}
 
-
 	/**
 	 * Returns the {@link ClassMeta} of this bean.
 	 *
@@ -426,27 +441,6 @@ public class BeanMeta<T> {
 	}
 
 	/**
-	 * Returns the subtype property of this bean if it has one.
-	 * <p>
-	 * The subtype is specified using the {@link Bean#subTypeProperty()} annotation.
-	 *
-	 * @return The meta property for the sub type property, or <jk>null</jk> if no subtype is defined for this bean.
-	 */
-	public BeanPropertyMeta getSubTypeProperty() {
-		return subTypeProperty;
-	}
-
-	/**
-	 * Returns <jk>true</jk> if this bean has subtypes associated with it.
-	 * Subtypes are defined using the {@link Bean#subTypes()} annotation.
-	 *
-	 * @return <jk>true</jk> if this bean has subtypes associated with it.
-	 */
-	public boolean isSubTyped() {
-		return subTypeProperty != null;
-	}
-
-	/**
 	 * Returns a mock bean property that resolves to the name <js>"_type"</js> and whose value always resolves
 	 * 	to the dictionary name of the bean.
 	 *
@@ -738,75 +732,6 @@ public class BeanMeta<T> {
 		}
 	}
 
-	/*
-	 * Bean property for getting and setting bean subtype.
-	 */
-	@SuppressWarnings({"rawtypes","unchecked"})
-	private static class SubTypePropertyMeta extends BeanPropertyMeta {
-
-		private final Map<Class<?>,String> subTypes;
-		private final BeanPropertyMeta realProperty;  // Bean property if bean actually has a real subtype field.
-
-		static class Builder extends BeanPropertyMeta.Builder {
-			Map<Class<?>,String> subTypes;
-			BeanPropertyMeta realProperty;
-
-			Builder(BeanMeta beanMeta, String subTypeAttr, Map<Class<?>,String> subTypes, BeanPropertyMeta realProperty, BeanRegistry beanRegistry) {
-				super(beanMeta, subTypeAttr, beanMeta.ctx.string(), beanRegistry);
-				this.subTypes = subTypes;
-				this.realProperty = realProperty;
-			}
-
-			@Override
-			public SubTypePropertyMeta build() {
-				return new SubTypePropertyMeta(this);
-			}
-		}
-
-		SubTypePropertyMeta(Builder b) {
-			super(b);
-			this.subTypes = b.subTypes;
-			this.realProperty = b.realProperty;
-		}
-
-		/*
-		 * Setting this bean property causes the inner bean to be set to the subtype implementation.
-		 */
-		@Override /* BeanPropertyMeta */
-		public Object set(BeanMap<?> m, Object value) throws BeanRuntimeException {
-			if (value == null)
-				throw new BeanRuntimeException("Attempting to set bean subtype property to null.");
-			String subTypeId = value.toString();
-			for (Entry<Class<?>,String> e : subTypes.entrySet()) {
-				if (e.getValue().equals(subTypeId)) {
-					Class subTypeClass = e.getKey();
-					m.meta = beanMeta.ctx.getBeanMeta(subTypeClass);
-					try {
-						m.setBean(subTypeClass.newInstance());
-						if (realProperty != null)
-							realProperty.set(m, value);
-						// If subtype attribute wasn't specified first, set them again from the temporary cache.
-						if (m.propertyCache != null)
-							for (Map.Entry<String,Object> me : m.propertyCache.entrySet())
-								m.put(me.getKey(), me.getValue());
-					} catch (Exception e1) {
-						throw new BeanRuntimeException(e1);
-					}
-					return null;
-				}
-			}
-			throw new BeanRuntimeException(beanMeta.c, "Unknown subtype ID ''{0}''", subTypeId);
-		}
-
-		@Override /* BeanPropertyMeta */
-		public Object get(BeanMap<?> m) throws BeanRuntimeException {
-			String subTypeId = beanMeta.beanFilter.getSubTypes().get(beanMeta.c);
-			if (subTypeId == null)
-				throw new BeanRuntimeException(beanMeta.c, "Unmapped sub type class");
-			return subTypeId;
-		}
-	}
-
 	@Override /* Object */
 	public String toString() {
 		StringBuilder sb = new StringBuilder(c.getName());

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/097b8103/juneau-core/src/main/java/org/apache/juneau/BeanPropertyMeta.java
----------------------------------------------------------------------
diff --git a/juneau-core/src/main/java/org/apache/juneau/BeanPropertyMeta.java b/juneau-core/src/main/java/org/apache/juneau/BeanPropertyMeta.java
index 516d3d4..ba6f2df 100644
--- a/juneau-core/src/main/java/org/apache/juneau/BeanPropertyMeta.java
+++ b/juneau-core/src/main/java/org/apache/juneau/BeanPropertyMeta.java
@@ -451,11 +451,6 @@ public class BeanPropertyMeta {
 
 			if (m.bean == null) {
 
-				// If this bean has subtypes, and we haven't set the subtype yet,
-				// store the property in a temporary cache until the bean can be instantiated.
-				if (m.meta.subTypeProperty != null && m.propertyCache == null)
-					m.propertyCache = new TreeMap<String,Object>();
-
 				// Read-only beans get their properties stored in a cache.
 				if (m.propertyCache != null)
 					return m.propertyCache.put(name, value);
@@ -612,10 +607,10 @@ public class BeanPropertyMeta {
 
 				} else {
 					if (swap != null && value != null && isParentClass(swap.getSwapClass(), value.getClass())) {
-							value = swap.unswap(session, value, rawTypeMeta);
+						value = swap.unswap(session, value, rawTypeMeta);
 					} else {
-							value = session.convertToType(value, rawTypeMeta);
-						}
+						value = session.convertToType(value, rawTypeMeta);
+					}
 					if (setter != null)
 						setter.invoke(bean, new Object[] { value });
 					else if (field != null)

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/097b8103/juneau-core/src/main/java/org/apache/juneau/BeanRegistry.java
----------------------------------------------------------------------
diff --git a/juneau-core/src/main/java/org/apache/juneau/BeanRegistry.java b/juneau-core/src/main/java/org/apache/juneau/BeanRegistry.java
index 13f9657..090fd91 100644
--- a/juneau-core/src/main/java/org/apache/juneau/BeanRegistry.java
+++ b/juneau-core/src/main/java/org/apache/juneau/BeanRegistry.java
@@ -36,18 +36,19 @@ import org.apache.juneau.internal.*;
 public class BeanRegistry {
 
 	private final Map<String,ClassMeta<?>> map;
+	private final Map<Class<?>,String> reverseMap;
 	private final BeanContext beanContext;
-	private final String beanTypePropertyName;
 	private final boolean isEmpty;
 
 	BeanRegistry(BeanContext beanContext, BeanRegistry parent, Class<?>...classes) {
 		this.beanContext = beanContext;
-		this.beanTypePropertyName = beanContext.getBeanTypePropertyName();
 		this.map = new ConcurrentHashMap<String,ClassMeta<?>>();
+		this.reverseMap = new ConcurrentHashMap<Class<?>,String>();
 		for (Class<?> c : beanContext.beanDictionaryClasses)
 			addClass(c);
 		if (parent != null)
-			this.map.putAll(parent.map);
+			for (Map.Entry<String,ClassMeta<?>> e : parent.map.entrySet())
+				addToMap(e.getKey(), e.getValue());
 		for (Class<?> c : classes)
 			addClass(c);
 		isEmpty = map.isEmpty();
@@ -77,13 +78,13 @@ public class BeanRegistry {
 							val = getTypedClassMeta(v);
 						else
 							throw new BeanRuntimeException("Class ''{0}'' was passed to BeanRegistry but value of type ''{1}'' found in map is not a Type object.", c.getName(), v.getClass().getName());
-						map.put(typeName, val);
+						addToMap(typeName, val);
 					}
 				} else {
 					Bean b = c.getAnnotation(Bean.class);
 					if (b == null || b.typeName().isEmpty())
 						throw new BeanRuntimeException("Class ''{0}'' was passed to BeanRegistry but it doesn't have a @Bean.typeName() annotation defined.", c.getName());
-					map.put(b.typeName(), beanContext.getClassMeta(c));
+					addToMap(b.typeName(), beanContext.getClassMeta(c));
 				}
 			}
 		} catch (BeanRuntimeException e) {
@@ -104,34 +105,9 @@ public class BeanRegistry {
 		return beanContext.getClassMeta(type, args);
 	}
 
-	/**
-	 * Converts the specified object map into a bean if it contains a <js>"_type"</js> entry in it.
-	 *
-	 * @param m The object map to convert to a bean if possible.
-	 * @return The new bean, or the original <code>ObjectMap</code> if no <js>"_type"</js> entry was found.
-	 */
-	public Object cast(ObjectMap m) {
-		if (isEmpty)
-			return m;
-		Object o = m.get(beanTypePropertyName);
-		if (o == null)
-			return m;
-		String typeName = o.toString();
-		ClassMeta<?> cm = getClassMeta(typeName);
-		BeanMap<?> bm = m.getBeanSession().newBeanMap(cm.getInnerClass());
-
-		// Iterate through all the entries in the map and set the individual field values.
-		for (Map.Entry<String,Object> e : m.entrySet()) {
-			String k = e.getKey();
-			Object v = e.getValue();
-			if (! k.equals(beanTypePropertyName)) {
-				// Attempt to recursively cast child maps.
-				if (v instanceof ObjectMap)
-					v = cast((ObjectMap)v);
-				bm.put(k, v);
-			}
-		}
-		return bm.getBean();
+	private void addToMap(String typeName, ClassMeta<?> cm) {
+		map.put(typeName, cm);
+		reverseMap.put(cm.innerClass, typeName);
 	}
 
 	/**
@@ -151,15 +127,28 @@ public class BeanRegistry {
 			return cm;
 		if (typeName.charAt(typeName.length()-1) == '^') {
 			cm = getClassMeta(typeName.substring(0, typeName.length()-1));
-			if (cm != null)
+			if (cm != null) {
 				cm = beanContext.getClassMeta(Array.newInstance(cm.innerClass, 1).getClass());
-			map.put(typeName, cm);
+				map.put(typeName, cm);
+			}
 			return cm;
 		}
 		return null;
 	}
 
 	/**
+	 * Given the specified class, return the dictionary name for it.
+	 *
+	 * @param c The class to lookup in this registry.
+	 * @return The dictionary name for the specified class in this registry, or <jk>null</jk> if not found.
+	 */
+	public String getTypeName(ClassMeta<?> c) {
+		if (isEmpty)
+			return null;
+		return reverseMap.get(c.innerClass);
+	}
+
+	/**
 	 * Returns <jk>true</jk> if this dictionary has an entry for the specified type name.
 	 *
 	 * @param typeName The bean type name.
@@ -168,4 +157,14 @@ public class BeanRegistry {
 	public boolean hasName(String typeName) {
 		return getClassMeta(typeName) != null;
 	}
+
+	@Override
+	public String toString() {
+		StringBuilder sb = new StringBuilder();
+		sb.append('{');
+		for (Map.Entry<String,ClassMeta<?>> e : map.entrySet())
+			sb.append(e.getKey()).append(":").append(e.getValue().toString(true)).append(", ");
+		sb.append('}');
+		return sb.toString();
+	}
 }

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/097b8103/juneau-core/src/main/java/org/apache/juneau/BeanSession.java
----------------------------------------------------------------------
diff --git a/juneau-core/src/main/java/org/apache/juneau/BeanSession.java b/juneau-core/src/main/java/org/apache/juneau/BeanSession.java
index 540329b..abc9959 100644
--- a/juneau-core/src/main/java/org/apache/juneau/BeanSession.java
+++ b/juneau-core/src/main/java/org/apache/juneau/BeanSession.java
@@ -551,8 +551,18 @@ public class BeanSession extends Session {
 			}
 
 			// It's a bean being initialized with a Map
-			if (type.isBean() && value instanceof Map)
+			if (type.isBean() && value instanceof Map) {
+				if (value instanceof ObjectMap) {
+					ObjectMap m2 = (ObjectMap)value;
+					String typeName = m2.getString(getBeanTypePropertyName());
+					if (typeName != null) {
+						ClassMeta cm = type.getBeanRegistry().getClassMeta(typeName);
+						if (cm != null && ClassUtils.isParentClass(type.innerClass, cm.innerClass))
+							return (T)m2.cast(cm);
+					}
+				}
 				return newBeanMap(tc).load((Map<?,?>) value).getBean();
+			}
 
 			if (type.canCreateNewInstanceFromNumber(outer) && value instanceof Number)
 				return type.newInstanceFromNumber(this, outer, (Number)value);
@@ -722,12 +732,8 @@ public class BeanSession extends Session {
 		if (m == null)
 			return null;
 		T bean = null;
-		if (m.constructorArgs.length == 0) {
+		if (m.constructorArgs.length == 0) 
 			bean = newBean(outer, c);
-			// Beans with subtypes won't be instantiated until the sub type property is specified.
-			if (bean == null && ! m.getClassMeta().hasSubTypes())
-				return null;
-		}
 		return new BeanMap<T>(this, bean, m);
 	}
 
@@ -768,12 +774,8 @@ public class BeanSession extends Session {
 			return null;
 		try {
 			T o = (T)m.newBean(outer);
-			if (o == null) {
-				// Beans with subtypes won't be instantiated until the sub type property is specified.
-				if (cm.hasSubTypes())
-					return null;
+			if (o == null) 
 				throw new BeanRuntimeException(c, "Class does not have a no-arg constructor.");
-			}
 			return o;
 		} catch (BeanRuntimeException e) {
 			throw e;

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/097b8103/juneau-core/src/main/java/org/apache/juneau/ClassMeta.java
----------------------------------------------------------------------
diff --git a/juneau-core/src/main/java/org/apache/juneau/ClassMeta.java b/juneau-core/src/main/java/org/apache/juneau/ClassMeta.java
index fdcbd2a..c1c2e72 100644
--- a/juneau-core/src/main/java/org/apache/juneau/ClassMeta.java
+++ b/juneau-core/src/main/java/org/apache/juneau/ClassMeta.java
@@ -104,6 +104,7 @@ public final class ClassMeta<T> implements Type {
 		resolvedDictionaryName;                              // The name if this is an array type (e.g. "X^^").
 	private final Throwable initException;                  // Any exceptions thrown in the init() method.
 	private final InvocationHandler invocationHandler;      // The invocation handler for this class (if it has one).
+	private final BeanRegistry beanRegistry;                // The bean registry of this class meta (if it has one).
 
 	private static final Boolean BOOLEAN_DEFAULT = false;
 	private static final Character CHARACTER_DEFAULT = (char)0;
@@ -179,6 +180,7 @@ public final class ClassMeta<T> implements Type {
 		BeanMeta _beanMeta = null;
 		PojoSwap _pojoSwap = null;
 		InvocationHandler _invocationHandler = null;
+		BeanRegistry _beanRegistry = null;
 
 		if (c.isPrimitive()) {
 			if (c == Boolean.TYPE)
@@ -462,6 +464,7 @@ public final class ClassMeta<T> implements Type {
 				try {
 					newMeta = new BeanMeta(this, beanContext, beanFilter, null);
 					_notABeanReason = newMeta.notABeanReason;
+					_beanRegistry = newMeta.beanRegistry;  // Always get the bean registry even if it's not a bean.
 				} catch (RuntimeException e) {
 					_notABeanReason = e.getMessage();
 					throw e;
@@ -493,6 +496,10 @@ public final class ClassMeta<T> implements Type {
 		if (_beanMeta != null && beanContext != null && beanContext.useInterfaceProxies && innerClass.isInterface())
 			_invocationHandler = new BeanProxyInvocationHandler<T>(_beanMeta);
 
+		Bean b = c.getAnnotation(Bean.class);
+		if (b != null && b.beanDictionary().length != 0)
+			_beanRegistry = new BeanRegistry(beanContext, null, b.beanDictionary());
+
 		this.cc = _cc;
 		this.isDelegate = _isDelegate;
 		this.fromStringMethod = _fromStringMethod;
@@ -522,6 +529,7 @@ public final class ClassMeta<T> implements Type {
 		this.resolvedDictionaryName = _resolvedDictionaryName;
 		this.serializedClassMeta = _serializedClassMeta;
 		this.invocationHandler = _invocationHandler;
+		this.beanRegistry = _beanRegistry;
 	}
 
 	/**
@@ -566,6 +574,7 @@ public final class ClassMeta<T> implements Type {
 		this.beanFilter = mainType.beanFilter;
 		this.extMeta = mainType.extMeta;
 		this.initException = mainType.initException;
+		this.beanRegistry = mainType.beanRegistry;
 	}
 
 	private ClassMeta<?> findClassMeta(Class<?> c) {
@@ -578,7 +587,7 @@ public final class ClassMeta<T> implements Type {
 
 	private BeanFilter findBeanFilter() {
 		try {
-			List<Bean> ba = ReflectionUtils.findAnnotations(Bean.class, innerClass);
+			Map<Class<?>,Bean> ba = ReflectionUtils.findAnnotationsMap(Bean.class, innerClass);
 			if (! ba.isEmpty())
 				return new AnnotationBeanFilterBuilder(innerClass, ba).build();
 		} catch (Exception e) {
@@ -629,6 +638,19 @@ public final class ClassMeta<T> implements Type {
 	}
 
 	/**
+	 * Returns the bean registry for this class.
+	 * <p>
+	 * This bean registry contains names specified in the {@link Bean#beanDictionary()} annotation defined
+	 * on the class, regardless of whether the class is an actual bean.
+	 * This allows interfaces to define subclasses with type names.
+	 *
+	 * @return The bean registry for this class, or <jk>null</jk> if no bean registry is associated with it.
+	 */
+	public BeanRegistry getBeanRegistry() {
+		return beanRegistry;
+	}
+
+	/**
 	 * Returns the category of this class.
 	 *
 	 * @return The category of this class.
@@ -648,15 +670,6 @@ public final class ClassMeta<T> implements Type {
 	}
 
 	/**
-	 * Returns <jk>true</jk> if this class as subtypes defined through {@link Bean#subTypes}.
-	 *
-	 * @return <jk>true</jk> if this class has subtypes.
-	 */
-	public boolean hasSubTypes() {
-		return beanFilter != null && beanFilter.getSubTypeProperty() != null;
-	}
-
-	/**
 	 * Returns <jk>true</jk> if this class is a subclass of or the same as the specified class.
 	 *
 	 * @param c The comparison class.
@@ -694,7 +707,9 @@ public final class ClassMeta<T> implements Type {
 						s = f;
 				if (s == null)
 					 s = PojoSwap.NULL;
-				childSwapMap.putIfAbsent(normalClass, s);
+				PojoSwap<?,?> s2 = childSwapMap.putIfAbsent(normalClass, s);
+				if (s2 != null)
+					s = s2;
 			}
 			if (s == PojoSwap.NULL)
 				return null;
@@ -719,7 +734,9 @@ public final class ClassMeta<T> implements Type {
 						s = f;
 				if (s == null)
 					 s = PojoSwap.NULL;
-				childUnswapMap.putIfAbsent(swapClass, s);
+				PojoSwap<?,?> s2 = childUnswapMap.putIfAbsent(swapClass, s);
+				if (s2 != null)
+					s = s2;
 			}
 			if (s == PojoSwap.NULL)
 				return null;
@@ -1155,9 +1172,6 @@ public final class ClassMeta<T> implements Type {
 	public boolean canCreateNewBean(Object outer) {
 		if (beanMeta == null)
 			return false;
-		// Beans with transforms with subtype properties are assumed to be constructable.
-		if (beanFilter != null && beanFilter.getSubTypeProperty() != null)
-			return true;
 		if (beanMeta.constructor == null)
 			return false;
 		if (isMemberClass)

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/097b8103/juneau-core/src/main/java/org/apache/juneau/CoreApi.java
----------------------------------------------------------------------
diff --git a/juneau-core/src/main/java/org/apache/juneau/CoreApi.java b/juneau-core/src/main/java/org/apache/juneau/CoreApi.java
index 1bb1979..f93b180 100644
--- a/juneau-core/src/main/java/org/apache/juneau/CoreApi.java
+++ b/juneau-core/src/main/java/org/apache/juneau/CoreApi.java
@@ -1364,7 +1364,7 @@ public abstract class CoreApi extends Lockable {
 	 * @see BeanContext#BEAN_beanTypePropertyName
 	 */
 	public CoreApi setBeanTypePropertyName(String value) throws LockedException {
-		return addToProperty(BEAN_beanTypePropertyName, value);
+		return setProperty(BEAN_beanTypePropertyName, value);
 	}
 
 	/**
@@ -1390,7 +1390,7 @@ public abstract class CoreApi extends Lockable {
 	 * @see BeanContext#BEAN_defaultParser
 	 */
 	public CoreApi setDefaultParser(Class<?> value) throws LockedException {
-		return addToProperty(BEAN_defaultParser, value);
+		return setProperty(BEAN_defaultParser, value);
 	}
 
 	/**
@@ -1414,7 +1414,7 @@ public abstract class CoreApi extends Lockable {
 	 * @see BeanContext#BEAN_locale
 	 */
 	public CoreApi setLocale(Locale value) throws LockedException {
-		return addToProperty(BEAN_locale, value);
+		return setProperty(BEAN_locale, value);
 	}
 
 	/**
@@ -1464,7 +1464,7 @@ public abstract class CoreApi extends Lockable {
 	 * @see BeanContext#BEAN_mediaType
 	 */
 	public CoreApi setMediaType(MediaType value) throws LockedException {
-		return addToProperty(BEAN_mediaType, value);
+		return setProperty(BEAN_mediaType, value);
 	}
 
 	/**
@@ -1501,7 +1501,7 @@ public abstract class CoreApi extends Lockable {
 	 * @see BeanContext#BEAN_debug
 	 */
 	public CoreApi setDebug(boolean value) throws LockedException {
-		return addToProperty(BEAN_debug, value);
+		return setProperty(BEAN_debug, value);
 	}
 
 	/**

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/097b8103/juneau-core/src/main/java/org/apache/juneau/LockedException.java
----------------------------------------------------------------------
diff --git a/juneau-core/src/main/java/org/apache/juneau/LockedException.java b/juneau-core/src/main/java/org/apache/juneau/LockedException.java
index 9ba5063..4ad8303 100644
--- a/juneau-core/src/main/java/org/apache/juneau/LockedException.java
+++ b/juneau-core/src/main/java/org/apache/juneau/LockedException.java
@@ -25,6 +25,6 @@ public final class LockedException extends RuntimeException {
 	private static final long serialVersionUID = 1L;
 
 	LockedException() {
-		super("Object is locked and object settings cannot be modified.");
+		super("Object is locked and object settings cannot be modified.  Try cloning the object.");
 	}
 }

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/097b8103/juneau-core/src/main/java/org/apache/juneau/annotation/Bean.java
----------------------------------------------------------------------
diff --git a/juneau-core/src/main/java/org/apache/juneau/annotation/Bean.java b/juneau-core/src/main/java/org/apache/juneau/annotation/Bean.java
index 63ae64f..983588d 100644
--- a/juneau-core/src/main/java/org/apache/juneau/annotation/Bean.java
+++ b/juneau-core/src/main/java/org/apache/juneau/annotation/Bean.java
@@ -164,59 +164,6 @@ public @interface Bean {
 	Class<? extends PropertyNamer> propertyNamer() default PropertyNamerDefault.class;
 
 	/**
-	 * Defines a virtual property on a superclass that identifies bean subtype classes.
-	 * <p>
-	 * 	In the following example, the abstract class has two subclasses that are differentiated
-	 * 		by a property called <code>subType</code>
-	 * <p class='bcode'>
-	 * 	<jc>// Abstract superclass</jc>
-	 * 	<ja>@Bean</ja>(
-	 * 		subTypeProperty=<js>"subType"</js>,
-	 * 		subTypes={A1.class, A2.class}
-	 * 	)
-	 * 	<jk>public class</jk> A {
-	 * 		<jk>public</jk> String <jf>f0</jf> = <js>"f0"</js>;
-	 * 	}
-	 *
-	 * 	<jc>// Subclass 1</jc>
-	 * 	<ja>@Bean</ja>(typeName=<js>"A1"</js>)
-	 * 	<jk>public class</jk> A1 <jk>extends</jk> A {
-	 * 		<jk>public</jk> String <jf>f1</jf>;
-	 * 	}
-	 *
-	 * 	<jc>// Subclass 2</jc>
-	 * 	<ja>@Bean</ja>(typeName=<js>"A2"</js>)
-	 * 	<jk>public class</jk> A2 <jk>extends</jk> A {
-	 * 		<jk>public</jk> String <jf>f2</jf>;
-	 * 	}
-	 * <p>
-	 * 	The following shows what happens when serializing a subclassed object to JSON:
-	 * <p class='bcode'>
-	 * 	JsonSerializer s = JsonSerializer.<jsf>DEFAULT_LAX</jsf>;
-	 * 	A1 a1 = <jk>new</jk> A1();
-	 * 	a1.<jf>f1</jf> = <js>"f1"</js>;
-	 * 	String r = s.serialize(a1);
-	 * 	<jsm>assertEquals</jsm>(<js>"{subType:'A1',f1:'f1',f0:'f0'}"</js>, r);
-	 * </p>
-	 * <p>
-	 * 	The following shows what happens when parsing back into the original object.
-	 * <p>
-	 * <p class='bcode'>
-	 * 	JsonParser p = JsonParser.<jsf>DEFAULT</jsf>;
-	 * 	A a = p.parse(r, A.<jk>class</jk>);
-	 * 	<jsm>assertTrue</jsm>(a <jk>instanceof</jk> A1);
-	 * </p>
-	 * <p>
-	 * 	This annotation is an alternative to using the {@link BeanFilter} class with an implemented {@link BeanFilter#getSubTypeProperty()} method.
-	 */
-	String subTypeProperty() default "_subtype";
-
-	/**
-	 * Used in conjunction with {@link #subTypeProperty()} to set up bean subtypes.
-	 */
-	Class<?>[] subTypes() default {};
-
-	/**
 	 * Identifies a class to be used as the interface class for this and all subclasses.
 	 * <p>
 	 * 	When specified, only the list of properties defined on the interface class will be used during serialization.
@@ -273,7 +220,8 @@ public @interface Bean {
 
 
 	/**
-	 * The list of classes that make up the bean dictionary for all properties of this bean.
+	 * The list of classes that make up the bean dictionary for all properties of this bean
+	 * or for subclasses of this bean.
 	 * <p>
 	 * This is a shorthand for setting the {@link BeanProperty#beanDictionary()} on all properties of the bean.
 	 * <p>

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/097b8103/juneau-core/src/main/java/org/apache/juneau/dto/atom/AtomBuilder.java
----------------------------------------------------------------------
diff --git a/juneau-core/src/main/java/org/apache/juneau/dto/atom/AtomBuilder.java b/juneau-core/src/main/java/org/apache/juneau/dto/atom/AtomBuilder.java
index 60d578a..623d79e 100644
--- a/juneau-core/src/main/java/org/apache/juneau/dto/atom/AtomBuilder.java
+++ b/juneau-core/src/main/java/org/apache/juneau/dto/atom/AtomBuilder.java
@@ -129,7 +129,7 @@ public class AtomBuilder {
 	 * @return The new element.
 	 */
 	public static final Icon icon(String uri) {
-		return icon(uri);
+		return new Icon(uri);
 	}
 
 	/**
@@ -171,7 +171,7 @@ public class AtomBuilder {
 	 * @return The new element.
 	 */
 	public static final Logo logo(String uri) {
-		return logo(uri);
+		return new Logo(uri);
 	}
 
 	/**
@@ -181,7 +181,7 @@ public class AtomBuilder {
 	 * @return The new element.
 	 */
 	public static final Logo logo(URI uri) {
-		return logo(uri);
+		return new Logo(uri);
 	}
 
 	/**

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/097b8103/juneau-core/src/main/java/org/apache/juneau/dto/html5/HtmlElement.java
----------------------------------------------------------------------
diff --git a/juneau-core/src/main/java/org/apache/juneau/dto/html5/HtmlElement.java b/juneau-core/src/main/java/org/apache/juneau/dto/html5/HtmlElement.java
index d105866..e3539ec 100644
--- a/juneau-core/src/main/java/org/apache/juneau/dto/html5/HtmlElement.java
+++ b/juneau-core/src/main/java/org/apache/juneau/dto/html5/HtmlElement.java
@@ -16,6 +16,7 @@ import static org.apache.juneau.xml.annotation.XmlFormat.*;
 
 import java.util.*;
 
+import org.apache.juneau.annotation.*;
 import org.apache.juneau.html.*;
 import org.apache.juneau.utils.*;
 import org.apache.juneau.xml.annotation.*;
@@ -35,6 +36,7 @@ public abstract class HtmlElement {
 	 * @return The attributes of this element.
 	 */
 	@Xml(format=ATTRS)
+	@BeanProperty(name="a")
 	public LinkedHashMap<String,Object> getAttrs() {
 		return attrs;
 	}
@@ -44,6 +46,7 @@ public abstract class HtmlElement {
 	 * @param attrs The new attributes for this element.
 	 * @return This object (for method chaining).
 	 */
+	@BeanProperty(name="a")
 	public HtmlElement setAttrs(LinkedHashMap<String,Object> attrs) {
 		this.attrs = attrs;
 		return this;

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/097b8103/juneau-core/src/main/java/org/apache/juneau/dto/html5/HtmlElementContainer.java
----------------------------------------------------------------------
diff --git a/juneau-core/src/main/java/org/apache/juneau/dto/html5/HtmlElementContainer.java b/juneau-core/src/main/java/org/apache/juneau/dto/html5/HtmlElementContainer.java
index 9878c40..1b8269e 100644
--- a/juneau-core/src/main/java/org/apache/juneau/dto/html5/HtmlElementContainer.java
+++ b/juneau-core/src/main/java/org/apache/juneau/dto/html5/HtmlElementContainer.java
@@ -33,7 +33,7 @@ public class HtmlElementContainer extends HtmlElement {
 	 * @return The children of this element.
 	 */
 	@Xml(format=ELEMENTS)
-	@BeanProperty(beanDictionary=HtmlBeanDictionary.class)
+	@BeanProperty(beanDictionary=HtmlBeanDictionary.class, name="c")
 	public LinkedList<Object> getChildren() {
 		return children;
 	}
@@ -43,6 +43,7 @@ public class HtmlElementContainer extends HtmlElement {
 	 * @param children The new children for this container.
 	 * @return This object (for method chaining).
 	 */
+	@BeanProperty(name="c")
 	public HtmlElementContainer setChildren(LinkedList<Object> children) {
 		this.children = children;
 		return this;

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/097b8103/juneau-core/src/main/java/org/apache/juneau/dto/html5/HtmlElementMixed.java
----------------------------------------------------------------------
diff --git a/juneau-core/src/main/java/org/apache/juneau/dto/html5/HtmlElementMixed.java b/juneau-core/src/main/java/org/apache/juneau/dto/html5/HtmlElementMixed.java
index 0890bc9..65b779e 100644
--- a/juneau-core/src/main/java/org/apache/juneau/dto/html5/HtmlElementMixed.java
+++ b/juneau-core/src/main/java/org/apache/juneau/dto/html5/HtmlElementMixed.java
@@ -33,7 +33,7 @@ public class HtmlElementMixed extends HtmlElement {
 	 * @return The children of this element.
 	 */
 	@Xml(format=MIXED)
-	@BeanProperty(beanDictionary=HtmlBeanDictionary.class)
+	@BeanProperty(beanDictionary=HtmlBeanDictionary.class, name="c")
 	public LinkedList<Object> getChildren() {
 		return children;
 	}
@@ -44,6 +44,7 @@ public class HtmlElementMixed extends HtmlElement {
 	 * @param children The new children of this element.
 	 * @return This object (for method chaining).
 	 */
+	@BeanProperty(name="c")
 	public HtmlElement setChildren(LinkedList<Object> children) {
 		this.children = children;
 		return this;

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/097b8103/juneau-core/src/main/java/org/apache/juneau/dto/html5/HtmlElementText.java
----------------------------------------------------------------------
diff --git a/juneau-core/src/main/java/org/apache/juneau/dto/html5/HtmlElementText.java b/juneau-core/src/main/java/org/apache/juneau/dto/html5/HtmlElementText.java
index 5c66b7e..a27cef2 100644
--- a/juneau-core/src/main/java/org/apache/juneau/dto/html5/HtmlElementText.java
+++ b/juneau-core/src/main/java/org/apache/juneau/dto/html5/HtmlElementText.java
@@ -12,6 +12,7 @@
 // ***************************************************************************************************************************
 package org.apache.juneau.dto.html5;
 
+import org.apache.juneau.annotation.*;
 import org.apache.juneau.xml.annotation.*;
 
 /**
@@ -28,6 +29,7 @@ public class HtmlElementText extends HtmlElement {
 	 * @return The inner text of this element, or <jk>null</jk> if no text is set.
 	 */
 	@Xml(format=XmlFormat.TEXT)
+	@BeanProperty(name="c")
 	public Object getText() {
 		return text;
 	}
@@ -38,6 +40,7 @@ public class HtmlElementText extends HtmlElement {
 	 * @param text The inner text of this element, or <jk>null</jk> if no text is set.
 	 * @return This object (for method chaining).
 	 */
+	@BeanProperty(name="c")
 	public HtmlElement setText(Object text) {
 		this.text = text;
 		return this;

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/097b8103/juneau-core/src/main/java/org/apache/juneau/dto/html5/Pre.java
----------------------------------------------------------------------
diff --git a/juneau-core/src/main/java/org/apache/juneau/dto/html5/Pre.java b/juneau-core/src/main/java/org/apache/juneau/dto/html5/Pre.java
index 7d1f553..4f97bd6 100644
--- a/juneau-core/src/main/java/org/apache/juneau/dto/html5/Pre.java
+++ b/juneau-core/src/main/java/org/apache/juneau/dto/html5/Pre.java
@@ -31,7 +31,7 @@ public class Pre extends HtmlElementMixed {
 	//--------------------------------------------------------------------------------
 
 	@Xml(format=MIXED_PWS)
-	@BeanProperty(beanDictionary=HtmlBeanDictionary.class)
+	@BeanProperty(beanDictionary=HtmlBeanDictionary.class, name="c")
 	@Override
 	public LinkedList<Object> getChildren() {
 		return super.getChildren();

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/097b8103/juneau-core/src/main/java/org/apache/juneau/dto/html5/Script.java
----------------------------------------------------------------------
diff --git a/juneau-core/src/main/java/org/apache/juneau/dto/html5/Script.java b/juneau-core/src/main/java/org/apache/juneau/dto/html5/Script.java
index 4992a5c..8e5d4c9 100644
--- a/juneau-core/src/main/java/org/apache/juneau/dto/html5/Script.java
+++ b/juneau-core/src/main/java/org/apache/juneau/dto/html5/Script.java
@@ -99,6 +99,7 @@ public class Script extends HtmlElementText {
 	//--------------------------------------------------------------------------------
 
 	@Xml(format=XmlFormat.TEXT_PWS)
+	@BeanProperty(name="c")
 	@Override
 	public Object getText() {
 		return super.getText();

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/097b8103/juneau-core/src/main/java/org/apache/juneau/dto/html5/Style.java
----------------------------------------------------------------------
diff --git a/juneau-core/src/main/java/org/apache/juneau/dto/html5/Style.java b/juneau-core/src/main/java/org/apache/juneau/dto/html5/Style.java
index 174c1f5..5c8516a 100644
--- a/juneau-core/src/main/java/org/apache/juneau/dto/html5/Style.java
+++ b/juneau-core/src/main/java/org/apache/juneau/dto/html5/Style.java
@@ -50,6 +50,7 @@ public class Style extends HtmlElementText {
 	//--------------------------------------------------------------------------------
 
 	@Xml(format=XmlFormat.TEXT_PWS)
+	@BeanProperty(name="c")
 	@Override /* HtmlElementText */
 	public Object getText() {
 		return super.getText();

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/097b8103/juneau-core/src/main/java/org/apache/juneau/dto/jsonschema/Sample.java
----------------------------------------------------------------------
diff --git a/juneau-core/src/main/java/org/apache/juneau/dto/jsonschema/Sample.java b/juneau-core/src/main/java/org/apache/juneau/dto/jsonschema/Sample.java
index 8e37172..a9aa605 100644
--- a/juneau-core/src/main/java/org/apache/juneau/dto/jsonschema/Sample.java
+++ b/juneau-core/src/main/java/org/apache/juneau/dto/jsonschema/Sample.java
@@ -53,7 +53,7 @@ class Sample {
 			.getProperty("address",true)                         // Get "address" property, resolved to Address schema.
 			.getProperty("street")                               // Get "street" property.
 			.getTypeAsJsonType();                                // Get data type.
-		System.err.println("streetType=" + streetType);         // Prints "streetType=string"
+		System.err.println("streetType=" + streetType);         // Prints "streetType=string" // NOT DEBUG
 
 		JsonType productIdType = purchaseOrderSchema
 			.getProperty("product")                              // Get "product" property
@@ -62,6 +62,6 @@ class Sample {
 			.resolve()                                           // Resolve to Product schema.
 			.getProperty("productId")                            // Get "productId" property.
 			.getTypeAsJsonType();                                // Get data type.
-		System.err.println("productIdType=" + productIdType);   // Prints "productIdType=number"
+		System.err.println("productIdType=" + productIdType);   // Prints "productIdType=number" // NOT DEBUG
 	}
 }

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/097b8103/juneau-core/src/main/java/org/apache/juneau/encoders/EncoderGroup.java
----------------------------------------------------------------------
diff --git a/juneau-core/src/main/java/org/apache/juneau/encoders/EncoderGroup.java b/juneau-core/src/main/java/org/apache/juneau/encoders/EncoderGroup.java
index 5f148d2..4f437c4 100644
--- a/juneau-core/src/main/java/org/apache/juneau/encoders/EncoderGroup.java
+++ b/juneau-core/src/main/java/org/apache/juneau/encoders/EncoderGroup.java
@@ -69,7 +69,7 @@ public final class EncoderGroup extends Lockable {
 	 */
 	public EncoderGroup append(Encoder e) {
 		checkLock();
-		synchronized(encoders) {
+		synchronized(this) {
 			cache.clear();
 			encoders.add(0, e);
 		}
@@ -101,7 +101,7 @@ public final class EncoderGroup extends Lockable {
 			append(e.newInstance());
 		} catch (NoClassDefFoundError x) {
 			// Ignore if dependent library not found (e.g. Jena).
-			System.err.println(e);
+			System.err.println(e); // NOT DEBUG
 		}
 		return this;
 	}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/097b8103/juneau-core/src/main/java/org/apache/juneau/html/HtmlDocSerializer.java
----------------------------------------------------------------------
diff --git a/juneau-core/src/main/java/org/apache/juneau/html/HtmlDocSerializer.java b/juneau-core/src/main/java/org/apache/juneau/html/HtmlDocSerializer.java
index 692357d..ac79d08 100644
--- a/juneau-core/src/main/java/org/apache/juneau/html/HtmlDocSerializer.java
+++ b/juneau-core/src/main/java/org/apache/juneau/html/HtmlDocSerializer.java
@@ -225,8 +225,8 @@ public class HtmlDocSerializer extends HtmlStrippedDocSerializer {
 	}
 
 	@Override /* Serializer */
-	public HtmlDocSerializer setUseIndentation(boolean value) throws LockedException {
-		super.setUseIndentation(value);
+	public HtmlDocSerializer setUseWhitespace(boolean value) throws LockedException {
+		super.setUseWhitespace(value);
 		return this;
 	}
 

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/097b8103/juneau-core/src/main/java/org/apache/juneau/html/HtmlDocSerializerSession.java
----------------------------------------------------------------------
diff --git a/juneau-core/src/main/java/org/apache/juneau/html/HtmlDocSerializerSession.java b/juneau-core/src/main/java/org/apache/juneau/html/HtmlDocSerializerSession.java
index de55239..f270030 100644
--- a/juneau-core/src/main/java/org/apache/juneau/html/HtmlDocSerializerSession.java
+++ b/juneau-core/src/main/java/org/apache/juneau/html/HtmlDocSerializerSession.java
@@ -132,6 +132,6 @@ public final class HtmlDocSerializerSession extends HtmlSerializerSession {
 		Object output = getOutput();
 		if (output instanceof HtmlWriter)
 			return (HtmlWriter)output;
-		return new HtmlWriter(super.getWriter(), isUseIndentation(), isTrimStrings(), getQuoteChar(), getRelativeUriBase(), getAbsolutePathUriBase());
+		return new HtmlWriter(super.getWriter(), isUseWhitespace(), isTrimStrings(), getQuoteChar(), getRelativeUriBase(), getAbsolutePathUriBase());
 	}
 }

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/097b8103/juneau-core/src/main/java/org/apache/juneau/html/HtmlParser.java
----------------------------------------------------------------------
diff --git a/juneau-core/src/main/java/org/apache/juneau/html/HtmlParser.java b/juneau-core/src/main/java/org/apache/juneau/html/HtmlParser.java
index decdaad..39705ca 100644
--- a/juneau-core/src/main/java/org/apache/juneau/html/HtmlParser.java
+++ b/juneau-core/src/main/java/org/apache/juneau/html/HtmlParser.java
@@ -69,7 +69,6 @@ public final class HtmlParser extends XmlParser {
 		PojoSwap<T,Object> transform = (PojoSwap<T,Object>)eType.getPojoSwap();
 		ClassMeta<?> sType = eType.getSerializedClassMeta();
 		session.setCurrentClass(sType);
-		BeanRegistry breg = (pMeta == null ? session.getBeanRegistry() : pMeta.getBeanRegistry());
 
 		int event = r.getEventType();
 		if (event != START_ELEMENT)
@@ -160,9 +159,10 @@ public final class HtmlParser extends XmlParser {
 		} else if (tag == TABLE) {
 
 			String typeName = getAttribute(r, session.getBeanTypePropertyName(), "object");
+			ClassMeta cm = session.getClassMeta(typeName, pMeta, eType);
 
-			if (breg.hasName(typeName)) {
-				sType = eType = (ClassMeta<T>)breg.getClassMeta(typeName);
+			if (cm != null) {
+				sType = eType = cm;
 				typeName = sType.isArray() ? "array" : "object";
 			} else if (! "array".equals(typeName)) {
 				// Type name could be a subtype name.
@@ -201,9 +201,9 @@ public final class HtmlParser extends XmlParser {
 
 		} else if (tag == UL) {
 			String typeName = getAttribute(r, session.getBeanTypePropertyName(), "array");
-
-			if (breg.hasName(typeName))
-				sType = eType = (ClassMeta<T>)breg.getClassMeta(typeName);
+			ClassMeta cm = session.getClassMeta(typeName, pMeta, eType);
+			if (cm != null)
+				sType = eType = cm;
 
 			if (sType.isObject())
 				o = parseIntoCollection(session, r, (Collection)new ObjectList(session), sType.getElementType(), pMeta);
@@ -332,7 +332,6 @@ public final class HtmlParser extends XmlParser {
 
 		if (elementType == null)
 			elementType = (ClassMeta<E>)object();
-		BeanRegistry breg = (pMeta == null ? session.getBeanRegistry() : pMeta.getBeanRegistry());
 
 		HtmlTag tag = nextTag(r, TR);
 		List<String> keys = new ArrayList<String>();
@@ -350,9 +349,9 @@ public final class HtmlParser extends XmlParser {
 				break;
 
 			String type = getAttribute(r, session.getBeanTypePropertyName(), null);
-			if (breg.hasName(type)) {
-				elementType = (ClassMeta)breg.getClassMeta(type);
-			}
+			ClassMeta elementType2 = session.getClassMeta(type, pMeta, null);
+			if (elementType2 != null) 
+				elementType = elementType2;
 
 			if (elementType.canCreateNewBean(l)) {
 				BeanMap m = session.newBeanMap(l, elementType.getInnerClass());
@@ -398,7 +397,7 @@ public final class HtmlParser extends XmlParser {
 				if (m != null && c != null) {
 					ObjectMap m2 = (m instanceof ObjectMap ? (ObjectMap)m : new ObjectMap(m).setBeanSession(session));
 					m2.put(session.getBeanTypePropertyName(), c);
-					l.add((E)breg.cast(m2));
+					l.add((E)session.cast(m2, pMeta, null));
 				} else {
 					l.add((E)m);
 				}
@@ -429,13 +428,8 @@ public final class HtmlParser extends XmlParser {
 				nextTag(r, TD);
 				BeanPropertyMeta pMeta = m.getPropertyMeta(key);
 				if (pMeta == null) {
-					if (m.getMeta().isSubTyped()) {
-						Object value = parseAnything(session, object(), r, m.getBean(false), false, null);
-						m.put(key, value);
-					} else {
-						onUnknownProperty(session, key, m, -1, -1);
-						parseAnything(session, object(), r, null, false, null);
-					}
+					onUnknownProperty(session, key, m, -1, -1);
+					parseAnything(session, object(), r, null, false, null);
 				} else {
 					ClassMeta<?> cm = pMeta.getClassMeta();
 					Object value = parseAnything(session, cm, r, m.getBean(false), false, pMeta);
@@ -448,8 +442,6 @@ public final class HtmlParser extends XmlParser {
 		return m;
 	}
 
-
-
 	/*
 	 * Reads the next tag.  Advances past anything that's not a start or end tag.  Throws an exception if
 	 * 	it's not one of the expected tags.

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/097b8103/juneau-core/src/main/java/org/apache/juneau/html/HtmlParserSession.java
----------------------------------------------------------------------
diff --git a/juneau-core/src/main/java/org/apache/juneau/html/HtmlParserSession.java b/juneau-core/src/main/java/org/apache/juneau/html/HtmlParserSession.java
index 80645af..f885578 100644
--- a/juneau-core/src/main/java/org/apache/juneau/html/HtmlParserSession.java
+++ b/juneau-core/src/main/java/org/apache/juneau/html/HtmlParserSession.java
@@ -32,7 +32,6 @@ import org.apache.juneau.xml.*;
  */
 public final class HtmlParserSession extends XmlParserSession {
 
-	private XMLEventReader xmlEventReader;
 	private static final Set<String> whitespaceElements = new HashSet<String>(
 		Arrays.asList(
 			new String[]{"br","bs","sp","ff"}
@@ -203,19 +202,4 @@ public final class HtmlParserSession extends XmlParserSession {
 			throw new XMLStreamException("Invalid tag found in parseWhitespaceElement(): " + tag);
 		}
 	}
-
-	@Override /* ParserSession */
-	public boolean close() {
-		if (super.close()) {
-			if (xmlEventReader != null) {
-				try {
-					xmlEventReader.close();
-				} catch (XMLStreamException e) {
-					throw new BeanRuntimeException(e);
-				}
-			}
-			return true;
-		}
-		return false;
-	}
 }

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/097b8103/juneau-core/src/main/java/org/apache/juneau/html/HtmlSerializer.java
----------------------------------------------------------------------
diff --git a/juneau-core/src/main/java/org/apache/juneau/html/HtmlSerializer.java b/juneau-core/src/main/java/org/apache/juneau/html/HtmlSerializer.java
index d462732..e5d4589 100644
--- a/juneau-core/src/main/java/org/apache/juneau/html/HtmlSerializer.java
+++ b/juneau-core/src/main/java/org/apache/juneau/html/HtmlSerializer.java
@@ -152,7 +152,7 @@ public class HtmlSerializer extends XmlSerializer {
 	public static class SqReadable extends Sq {
 		/** Constructor */
 		public SqReadable() {
-			setUseIndentation(true);
+			setUseWhitespace(true);
 		}
 	}
 
@@ -831,8 +831,8 @@ public class HtmlSerializer extends XmlSerializer {
 	}
 
 	@Override /* Serializer */
-	public HtmlSerializer setUseIndentation(boolean value) throws LockedException {
-		super.setUseIndentation(value);
+	public HtmlSerializer setUseWhitespace(boolean value) throws LockedException {
+		super.setUseWhitespace(value);
 		return this;
 	}
 

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/097b8103/juneau-core/src/main/java/org/apache/juneau/html/HtmlSerializerSession.java
----------------------------------------------------------------------
diff --git a/juneau-core/src/main/java/org/apache/juneau/html/HtmlSerializerSession.java b/juneau-core/src/main/java/org/apache/juneau/html/HtmlSerializerSession.java
index b97bb9e..3d67924 100644
--- a/juneau-core/src/main/java/org/apache/juneau/html/HtmlSerializerSession.java
+++ b/juneau-core/src/main/java/org/apache/juneau/html/HtmlSerializerSession.java
@@ -83,7 +83,7 @@ public class HtmlSerializerSession extends XmlSerializerSession {
 		Object output = getOutput();
 		if (output instanceof HtmlWriter)
 			return (HtmlWriter)output;
-		return new HtmlWriter(super.getWriter(), isUseIndentation(), isTrimStrings(), getQuoteChar(), getRelativeUriBase(), getAbsolutePathUriBase());
+		return new HtmlWriter(super.getWriter(), isUseWhitespace(), isTrimStrings(), getQuoteChar(), getRelativeUriBase(), getAbsolutePathUriBase());
 	}
 
 	/**

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/097b8103/juneau-core/src/main/java/org/apache/juneau/html/HtmlWriter.java
----------------------------------------------------------------------
diff --git a/juneau-core/src/main/java/org/apache/juneau/html/HtmlWriter.java b/juneau-core/src/main/java/org/apache/juneau/html/HtmlWriter.java
index 3a2a810..95b6092 100644
--- a/juneau-core/src/main/java/org/apache/juneau/html/HtmlWriter.java
+++ b/juneau-core/src/main/java/org/apache/juneau/html/HtmlWriter.java
@@ -26,14 +26,14 @@ public class HtmlWriter extends XmlWriter {
 	 * Constructor.
 	 *
 	 * @param out The writer being wrapped.
-	 * @param useIndentation If <jk>true</jk>, tabs will be used in output.
+	 * @param useWhitespace If <jk>true</jk>, tabs will be used in output.
 	 * @param trimStrings If <jk>true</jk>, strings should be trimmed before they're serialized.
 	 * @param quoteChar The quote character to use (i.e. <js>'\''</js> or <js>'"'</js>)
 	 * @param uriContext The web application context path (e.g. "/contextRoot").
 	 * @param uriAuthority The web application URI authority (e.g. "http://hostname:9080")
 	 */
-	public HtmlWriter(Writer out, boolean useIndentation, boolean trimStrings, char quoteChar, String uriContext, String uriAuthority) {
-		super(out, useIndentation, trimStrings, quoteChar, uriContext, uriAuthority, false, null);
+	public HtmlWriter(Writer out, boolean useWhitespace, boolean trimStrings, char quoteChar, String uriContext, String uriAuthority) {
+		super(out, useWhitespace, trimStrings, quoteChar, uriContext, uriAuthority, false, null);
 	}
 
 	/**

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/097b8103/juneau-core/src/main/java/org/apache/juneau/ini/ConfigMgr.java
----------------------------------------------------------------------
diff --git a/juneau-core/src/main/java/org/apache/juneau/ini/ConfigMgr.java b/juneau-core/src/main/java/org/apache/juneau/ini/ConfigMgr.java
index 7188624..0ebf523 100644
--- a/juneau-core/src/main/java/org/apache/juneau/ini/ConfigMgr.java
+++ b/juneau-core/src/main/java/org/apache/juneau/ini/ConfigMgr.java
@@ -303,10 +303,10 @@ public class ConfigMgr {
 	}
 
 	private static void printUsageAndExit() {
-		System.err.println("---Usage---");
-		System.err.println("java -cp juneau.jar org.apache.juneau.ini.ConfigFile createBatchEnvFile -configFile <configFile> -envFile <envFile> [-verbose]");
-		System.err.println("java -cp juneau.jar org.apache.juneau.ini.ConfigFile createShellEnvFile -configFile <configFile> -envFile <envFile> [-verbose]");
-		System.err.println("java -cp juneau.jar org.apache.juneau.ini.ConfigFile setVals -configFile <configFile> -vals [var1 val1 [var2 val2...]] [-verbose]");
+		System.err.println("---Usage---"); // NOT DEBUG
+		System.err.println("java -cp juneau.jar org.apache.juneau.ini.ConfigFile createBatchEnvFile -configFile <configFile> -envFile <envFile> [-verbose]"); // NOT DEBUG
+		System.err.println("java -cp juneau.jar org.apache.juneau.ini.ConfigFile createShellEnvFile -configFile <configFile> -envFile <envFile> [-verbose]"); // NOT DEBUG
+		System.err.println("java -cp juneau.jar org.apache.juneau.ini.ConfigFile setVals -configFile <configFile> -vals [var1 val1 [var2 val2...]] [-verbose]"); // NOT DEBUG
 		int rc = Integer.getInteger("exit.2", 2);
 		if (rc != 0)
 			System.exit(rc);

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/097b8103/juneau-core/src/main/java/org/apache/juneau/internal/AsciiSet.java
----------------------------------------------------------------------
diff --git a/juneau-core/src/main/java/org/apache/juneau/internal/AsciiSet.java b/juneau-core/src/main/java/org/apache/juneau/internal/AsciiSet.java
index 999de00..7f84418 100644
--- a/juneau-core/src/main/java/org/apache/juneau/internal/AsciiSet.java
+++ b/juneau-core/src/main/java/org/apache/juneau/internal/AsciiSet.java
@@ -54,4 +54,19 @@ public final class AsciiSet {
 			return false;
 		return store[c];
 	}
+
+	/**
+	 * Returns <jk>true</jk> if the specified string contains at least one character in this set.
+	 *
+	 * @param s The string to test.
+	 * @return <jk>true</jk> if the string is not null and contains at least one character in this set.
+	 */
+	public boolean contains(CharSequence s) {
+		if (s == null)
+			return false;
+		for (int i = 0; i < s.length(); i++)
+			if (contains(s.charAt(i)))
+				return true;
+		return false;
+	}
 }


[8/8] incubator-juneau git commit: Modification to UON spec. Remove bean subtype support.

Posted by ja...@apache.org.
Modification to UON spec.  Remove bean subtype support.

Project: http://git-wip-us.apache.org/repos/asf/incubator-juneau/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-juneau/commit/097b8103
Tree: http://git-wip-us.apache.org/repos/asf/incubator-juneau/tree/097b8103
Diff: http://git-wip-us.apache.org/repos/asf/incubator-juneau/diff/097b8103

Branch: refs/heads/master
Commit: 097b8103237202ecd3b79a8232773591c957aa9d
Parents: 268a3e3
Author: JamesBognar <ja...@apache.org>
Authored: Wed Feb 15 15:50:33 2017 -0500
Committer: JamesBognar <ja...@apache.org>
Committed: Wed Feb 15 15:50:33 2017 -0500

----------------------------------------------------------------------
 .../java/org/apache/juneau/jena/RdfParser.java  |  35 +-
 .../org/apache/juneau/jena/RdfSerializer.java   |  14 +-
 .../juneau/jena/RdfSerializerSession.java       |   2 +-
 .../java/org/apache/juneau/BeanFilterTest.java  |  14 +-
 .../java/org/apache/juneau/BeanMapTest.java     |   6 +-
 .../test/java/org/apache/juneau/TestUtils.java  |  14 +-
 .../juneau/a/rttests/RoundTripBeanMapsTest.java |  51 +-
 .../a/rttests/RoundTripLargeObjectsTest.java    |  14 +-
 .../juneau/a/rttests/RoundTripMapsTest.java     |   4 +-
 .../apache/juneau/a/rttests/RoundTripTest.java  |  28 +-
 .../a/rttests/RoundTripTransformBeansTest.java  |   7 +-
 .../apache/juneau/dto/cognos/CognosXmlTest.java |   2 +-
 .../juneau/dto/html5/BasicHtmlSchemaTest.java   | 745 ++++++++++++++++++-
 .../juneau/dto/jsonschema/JsonSchemaTest.java   |  13 +-
 .../java/org/apache/juneau/html/CommonTest.java |   2 +-
 .../apache/juneau/jena/CommonParserTest.java    |   4 +-
 .../java/org/apache/juneau/jena/CommonTest.java |   2 +-
 .../org/apache/juneau/jena/CommonXmlTest.java   |   2 +-
 .../juneau/json/JsonParserEdgeCasesTest.java    |   2 +-
 .../juneau/transforms/CalendarSwapTest.java     |  30 +-
 .../urlencoding/CommonParser_UonTest.java       |  12 +-
 .../CommonParser_UrlEncodingTest.java           |  16 +-
 .../juneau/urlencoding/Common_UonTest.java      |  81 +-
 .../urlencoding/Common_UrlEncodingTest.java     |  71 +-
 .../juneau/urlencoding/UonParserTest.java       | 205 +++--
 .../juneau/urlencoding/UonSerializerTest.java   | 364 ++++-----
 .../urlencoding/UrlEncodingParserTest.java      | 273 +++----
 .../urlencoding/UrlEncodingSerializerTest.java  | 313 ++++----
 .../org/apache/juneau/utils/PojoRestTest.java   |   6 +-
 .../org/apache/juneau/xml/XmlContentTest.java   |   4 +-
 juneau-core/.project                            |  47 +-
 .../java/org/apache/juneau/BeanContext.java     |   6 +-
 .../main/java/org/apache/juneau/BeanMap.java    |   9 -
 .../main/java/org/apache/juneau/BeanMeta.java   | 133 +---
 .../org/apache/juneau/BeanPropertyMeta.java     |  11 +-
 .../java/org/apache/juneau/BeanRegistry.java    |  69 +-
 .../java/org/apache/juneau/BeanSession.java     |  24 +-
 .../main/java/org/apache/juneau/ClassMeta.java  |  44 +-
 .../main/java/org/apache/juneau/CoreApi.java    |  10 +-
 .../java/org/apache/juneau/LockedException.java |   2 +-
 .../java/org/apache/juneau/annotation/Bean.java |  56 +-
 .../org/apache/juneau/dto/atom/AtomBuilder.java |   6 +-
 .../apache/juneau/dto/html5/HtmlElement.java    |   3 +
 .../juneau/dto/html5/HtmlElementContainer.java  |   3 +-
 .../juneau/dto/html5/HtmlElementMixed.java      |   3 +-
 .../juneau/dto/html5/HtmlElementText.java       |   3 +
 .../java/org/apache/juneau/dto/html5/Pre.java   |   2 +-
 .../org/apache/juneau/dto/html5/Script.java     |   1 +
 .../java/org/apache/juneau/dto/html5/Style.java |   1 +
 .../apache/juneau/dto/jsonschema/Sample.java    |   4 +-
 .../apache/juneau/encoders/EncoderGroup.java    |   4 +-
 .../apache/juneau/html/HtmlDocSerializer.java   |   4 +-
 .../juneau/html/HtmlDocSerializerSession.java   |   2 +-
 .../java/org/apache/juneau/html/HtmlParser.java |  32 +-
 .../apache/juneau/html/HtmlParserSession.java   |  16 -
 .../org/apache/juneau/html/HtmlSerializer.java  |   6 +-
 .../juneau/html/HtmlSerializerSession.java      |   2 +-
 .../java/org/apache/juneau/html/HtmlWriter.java |   6 +-
 .../java/org/apache/juneau/ini/ConfigMgr.java   |   8 +-
 .../org/apache/juneau/internal/AsciiSet.java    |  15 +
 .../java/org/apache/juneau/json/JsonParser.java |  20 +-
 .../org/apache/juneau/json/JsonSerializer.java  |  43 +-
 .../juneau/json/JsonSerializerContext.java      |  17 -
 .../juneau/json/JsonSerializerSession.java      |  16 +-
 .../java/org/apache/juneau/json/JsonWriter.java |   9 +-
 .../apache/juneau/msgpack/MsgPackParser.java    | 139 ++--
 .../juneau/msgpack/MsgPackSerializer.java       |  15 +-
 .../org/apache/juneau/parser/ParserGroup.java   |   4 +-
 .../org/apache/juneau/parser/ParserReader.java  |  35 +-
 .../org/apache/juneau/parser/ParserSession.java |  74 ++
 .../serializer/OutputStreamSerializer.java      |  16 +-
 .../apache/juneau/serializer/Serializer.java    |  15 +-
 .../juneau/serializer/SerializerContext.java    |  16 +-
 .../juneau/serializer/SerializerGroup.java      |  14 +-
 .../juneau/serializer/SerializerSession.java    |  78 +-
 .../juneau/serializer/SerializerWriter.java     |  39 +-
 .../juneau/serializer/WriterSerializer.java     |   2 +-
 .../transform/AnnotationBeanFilterBuilder.java  |  19 +-
 .../org/apache/juneau/transform/BeanFilter.java |  35 +-
 .../juneau/transform/BeanFilterBuilder.java     |  88 +--
 .../org/apache/juneau/transform/package.html    |  75 --
 .../apache/juneau/urlencoding/UonParser.java    | 223 +++---
 .../juneau/urlencoding/UonParserContext.java    |  20 +-
 .../juneau/urlencoding/UonParserSession.java    |  14 +-
 .../juneau/urlencoding/UonSerializer.java       | 248 ++----
 .../urlencoding/UonSerializerContext.java       |  80 --
 .../urlencoding/UonSerializerSession.java       |  26 +-
 .../apache/juneau/urlencoding/UonWriter.java    | 104 +--
 .../juneau/urlencoding/UrlEncodingParser.java   |  41 +-
 .../urlencoding/UrlEncodingSerializer.java      | 134 +---
 .../urlencoding/doc-files/Example_HTML.png      | Bin 32778 -> 136001 bytes
 .../doc-files/Example_UrlEncoding.png           | Bin 20958 -> 0 bytes
 .../juneau/urlencoding/doc-files/rfc_uon.txt    | 177 ++---
 .../org/apache/juneau/urlencoding/package.html  | 344 +++++----
 .../java/org/apache/juneau/xml/XmlParser.java   |  26 +-
 .../apache/juneau/xml/XmlSchemaSerializer.java  |   2 +-
 .../org/apache/juneau/xml/XmlSerializer.java    |   8 +-
 .../apache/juneau/xml/XmlSerializerSession.java |   2 +-
 .../java/org/apache/juneau/xml/XmlWriter.java   |   6 +-
 .../src/main/javadoc/doc-files/Server.Uon.png   | Bin 28160 -> 0 bytes
 .../javadoc/doc-files/Server.UrlEncoding.png    | Bin 32516 -> 0 bytes
 juneau-core/src/main/javadoc/overview.html      |  58 +-
 .../src/main/javadoc/resources/juneau-code.css  |  10 +-
 .../examples/rest/AddressBookResourceTest.java  |  16 +-
 .../juneau/examples/rest/RestTestcase.java      |  37 +
 .../juneau/examples/rest/RootResourcesTest.java |   2 +-
 .../SampleRemoteableServicesResourceTest.java   |   4 +-
 .../juneau/examples/rest/TestMicroservice.java  |  57 ++
 .../rest/TestMultiPartFormPostsTest.java        |   2 +-
 .../apache/juneau/examples/rest/TestUtils.java  |   2 +-
 .../apache/juneau/examples/rest/_TestSuite.java |  18 +-
 .../apache/juneau/rest/test/ParamsResource.java |  10 +-
 .../juneau/rest/test/AcceptCharsetTest.java     |   2 +-
 .../rest/test/BeanContextPropertiesTest.java    |   2 +-
 .../juneau/rest/test/CallbackStringsTest.java   |   2 +-
 .../juneau/rest/test/CharsetEncodingsTest.java  |   2 +-
 .../juneau/rest/test/ClientVersionTest.java     |   2 +-
 .../org/apache/juneau/rest/test/ConfigTest.java |   2 +-
 .../org/apache/juneau/rest/test/Constants.java  |   2 +-
 .../apache/juneau/rest/test/ContentTest.java    | 102 +--
 .../rest/test/DefaultContentTypesTest.java      |   2 +-
 .../juneau/rest/test/ErrorConditionsTest.java   |   2 +-
 .../org/apache/juneau/rest/test/GroupsTest.java |   2 +-
 .../org/apache/juneau/rest/test/GzipTest.java   |   2 +-
 .../juneau/rest/test/InheritanceTest.java       |   2 +-
 .../apache/juneau/rest/test/LargePojosTest.java |   2 +-
 .../apache/juneau/rest/test/MessagesTest.java   |   2 +-
 .../juneau/rest/test/NlsPropertyTest.java       |   2 +-
 .../org/apache/juneau/rest/test/NlsTest.java    |   2 +-
 .../juneau/rest/test/NoParserInputTest.java     |   2 +-
 .../apache/juneau/rest/test/OnPostCallTest.java |   2 +-
 .../apache/juneau/rest/test/OnPreCallTest.java  |   2 +-
 .../juneau/rest/test/OptionsWithoutNlsTest.java |   2 +-
 .../rest/test/OverlappingMethodsTest.java       |   2 +-
 .../org/apache/juneau/rest/test/ParamsTest.java |  80 +-
 .../apache/juneau/rest/test/ParsersTest.java    |   2 +-
 .../org/apache/juneau/rest/test/PathTest.java   |   2 +-
 .../org/apache/juneau/rest/test/PathsTest.java  |   2 +-
 .../apache/juneau/rest/test/PropertiesTest.java |   2 +-
 .../apache/juneau/rest/test/RestClientTest.java |   2 +-
 .../apache/juneau/rest/test/RestTestcase.java   |  36 +
 .../apache/juneau/rest/test/RestUtilsTest.java  |   2 +-
 .../juneau/rest/test/SerializersTest.java       |   2 +-
 .../juneau/rest/test/StaticFilesTest.java       |   2 +-
 .../juneau/rest/test/TestMicroservice.java      |  60 ++
 .../org/apache/juneau/rest/test/TestUtils.java  |   4 +-
 .../apache/juneau/rest/test/TransformsTest.java |   2 +-
 .../org/apache/juneau/rest/test/UrisTest.java   |   2 +-
 .../apache/juneau/rest/test/UrlContentTest.java |   2 +-
 .../juneau/rest/test/UrlPathPatternTest.java    |   2 +-
 .../org/apache/juneau/rest/test/_TestSuite.java |  22 +-
 .../org/apache/juneau/rest/RestRequest.java     |  18 +-
 .../apache/juneau/rest/RestServletDefault.java  |  12 -
 .../rest/jena/RestServletJenaDefault.java       |  12 -
 .../juneau/rest/response/DefaultHandler.java    |   2 +-
 155 files changed, 2815 insertions(+), 2907 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/097b8103/juneau-core-rdf/src/main/java/org/apache/juneau/jena/RdfParser.java
----------------------------------------------------------------------
diff --git a/juneau-core-rdf/src/main/java/org/apache/juneau/jena/RdfParser.java b/juneau-core-rdf/src/main/java/org/apache/juneau/jena/RdfParser.java
index 468afc0..3d5baef 100644
--- a/juneau-core-rdf/src/main/java/org/apache/juneau/jena/RdfParser.java
+++ b/juneau-core-rdf/src/main/java/org/apache/juneau/jena/RdfParser.java
@@ -182,19 +182,10 @@ public class RdfParser extends ReaderParser {
 		if (rbm.hasBeanUri() && r2.getURI() != null)
 			rbm.getBeanUriProperty().set(m, r2.getURI());
 		Property subTypeIdProperty = null;
-		BeanPropertyMeta stp = bm.getSubTypeProperty();
-		if (stp != null) {
-			subTypeIdProperty = session.getProperty(stp.getName());
-			Statement st = r2.getProperty(subTypeIdProperty);
-			if (st == null)
-				throw new ParseException(session, "Could not find subtype ID property for bean of type ''{0}''", m.getClassMeta());
-			String subTypeId = st.getLiteral().getString();
-			stp.set(m, subTypeId);
-		}
 		for (StmtIterator i = r2.listProperties(); i.hasNext();) {
 			Statement st = i.next();
 			Property p = st.getPredicate();
-			if (p.equals(subTypeIdProperty))
+			if (subTypeIdProperty != null && p.equals(subTypeIdProperty))
 				continue;
 			String key = session.decodeString(p.getLocalName());
 			BeanPropertyMeta pMeta = m.getPropertyMeta(key);
@@ -212,14 +203,8 @@ public class RdfParser extends ReaderParser {
 					setName(cm, value, key);
 					pMeta.set(m, value);
 				}
-			} else if (! (p.equals(session.getRootProperty()) || p.equals(session.getTypeProperty()) || p.equals(subTypeIdProperty))) {
-				if (bm.isSubTyped()) {
-					RDFNode o = st.getObject();
-					Object value = parseAnything(session, object(), o, m.getBean(false), pMeta);
-					m.put(key, value);
-				} else {
-					onUnknownProperty(session, key, m, -1, -1);
-				}
+			} else if (! (p.equals(session.getRootProperty()) || p.equals(session.getTypeProperty()) || (subTypeIdProperty != null && p.equals(subTypeIdProperty)))) {
+				onUnknownProperty(session, key, m, -1, -1);
 			}
 			session.setCurrentProperty(null);
 		}
@@ -240,15 +225,15 @@ public class RdfParser extends ReaderParser {
 		PojoSwap<T,Object> transform = (PojoSwap<T,Object>)eType.getPojoSwap();
 		ClassMeta<?> sType = eType.getSerializedClassMeta();
 		session.setCurrentClass(sType);
-		BeanRegistry breg = pMeta == null ? session.getBeanRegistry() : pMeta.getBeanRegistry();
 
 		if (! sType.canCreateNewInstance(outer)) {
 			if (n.isResource()) {
 				Statement st = n.asResource().getProperty(session.getTypeProperty());
 				if (st != null) {
  					String c = st.getLiteral().getString();
- 					if (breg.hasName(c))
- 						sType = eType = (ClassMeta<T>)breg.getClassMeta(c);
+ 					ClassMeta tcm = session.getClassMeta(c, pMeta, eType);
+ 					if (tcm != null)
+ 						sType = eType = tcm;
 				}
 			}
 		}
@@ -337,6 +322,14 @@ public class RdfParser extends ReaderParser {
 			o = sType.newInstanceFromString(outer, session.decodeString(getValue(session, n, outer)));
 		} else if (sType.canCreateNewInstanceFromNumber(outer)) {
 			o = sType.newInstanceFromNumber(session, outer, parseNumber(getValue(session, n, outer).toString(), sType.getNewInstanceFromNumberClass()));
+		} else if (n.isResource()) {
+			Resource r = n.asResource();
+			Map m = new ObjectMap(session);
+			parseIntoMap(session, r, m, sType.getKeyType(), sType.getValueType());
+			if (m.containsKey(session.getBeanTypePropertyName()))
+				o = session.cast((ObjectMap)m, pMeta, eType);
+			else
+				throw new ParseException(session, "Class ''{0}'' could not be instantiated.  Reason: ''{1}''", sType.getInnerClass().getName(), sType.getNotABeanReason());
 		} else {
 			throw new ParseException("Class ''{0}'' could not be instantiated.  Reason: ''{1}''", sType.getInnerClass().getName(), sType.getNotABeanReason());
 		}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/097b8103/juneau-core-rdf/src/main/java/org/apache/juneau/jena/RdfSerializer.java
----------------------------------------------------------------------
diff --git a/juneau-core-rdf/src/main/java/org/apache/juneau/jena/RdfSerializer.java b/juneau-core-rdf/src/main/java/org/apache/juneau/jena/RdfSerializer.java
index 9bb6d94..4746592 100644
--- a/juneau-core-rdf/src/main/java/org/apache/juneau/jena/RdfSerializer.java
+++ b/juneau-core-rdf/src/main/java/org/apache/juneau/jena/RdfSerializer.java
@@ -189,6 +189,8 @@ public class RdfSerializer extends WriterSerializer {
 			sType = eType.getSerializedClassMeta();
 		}
 
+		String typeName = session.getBeanTypeName(eType, aType, bpm);
+
 		RDFNode n = null;
 
 		if (o == null || sType.isChar() && ((Character)o).charValue() == 0) {
@@ -221,7 +223,7 @@ public class RdfSerializer extends WriterSerializer {
 					uri = rbm.getBeanUriProperty().get(bm);
 				String uri2 = getUri(session, uri, null);
 				n = m.createResource(uri2);
-				serializeBeanMap(session, bm, (Resource)n);
+				serializeBeanMap(session, bm, (Resource)n, typeName);
 			} else {
 				Map m2 = (Map)o;
 				n = m.createResource();
@@ -236,7 +238,7 @@ public class RdfSerializer extends WriterSerializer {
 				uri = rbm.getBeanUriProperty().get(bm);
 			String uri2 = getUri(session, uri, null);
 			n = m.createResource(uri2);
-			serializeBeanMap(session, bm, (Resource)n);
+			serializeBeanMap(session, bm, (Resource)n, typeName);
 
 		} else if (sType.isCollectionOrArray() || (wType != null && wType.isCollection())) {
 			Collection c = session.sort(sType.isCollection() ? (Collection)o : toList(sType.getInnerClass(), o));
@@ -315,8 +317,8 @@ public class RdfSerializer extends WriterSerializer {
 		}
 	}
 
-	private void serializeBeanMap(RdfSerializerSession session, BeanMap<?> m, Resource r) throws SerializeException {
-		List<BeanPropertyValue> l = m.getValues(session.isTrimNulls());
+	private void serializeBeanMap(RdfSerializerSession session, BeanMap<?> m, Resource r, String typeName) throws SerializeException {
+		List<BeanPropertyValue> l = m.getValues(session.isTrimNulls(), typeName != null ? session.createBeanTypeNameProperty(m, typeName) : null);
 		Collections.reverse(l);
 		for (BeanPropertyValue bpv : l) {
 			BeanPropertyMeta pMeta = bpv.getMeta();
@@ -756,8 +758,8 @@ public class RdfSerializer extends WriterSerializer {
 	}
 
 	@Override /* Serializer */
-	public RdfSerializer setUseIndentation(boolean value) throws LockedException {
-		super.setUseIndentation(value);
+	public RdfSerializer setUseWhitespace(boolean value) throws LockedException {
+		super.setUseWhitespace(value);
 		return this;
 	}
 

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/097b8103/juneau-core-rdf/src/main/java/org/apache/juneau/jena/RdfSerializerSession.java
----------------------------------------------------------------------
diff --git a/juneau-core-rdf/src/main/java/org/apache/juneau/jena/RdfSerializerSession.java b/juneau-core-rdf/src/main/java/org/apache/juneau/jena/RdfSerializerSession.java
index 831ba08..d03b775 100644
--- a/juneau-core-rdf/src/main/java/org/apache/juneau/jena/RdfSerializerSession.java
+++ b/juneau-core-rdf/src/main/java/org/apache/juneau/jena/RdfSerializerSession.java
@@ -60,7 +60,7 @@ public final class RdfSerializerSession extends SerializerSession {
 	protected RdfSerializerSession(RdfSerializerContext ctx, ObjectMap op, Object output, Method javaMethod, Locale locale, TimeZone timeZone, MediaType mediaType) {
 		super(ctx, op, output, javaMethod, locale, timeZone, mediaType);
 		ObjectMap jenaSettings = new ObjectMap();
-		jenaSettings.put("rdfXml.tab", isUseIndentation() ? 2 : 0);
+		jenaSettings.put("rdfXml.tab", isUseWhitespace() ? 2 : 0);
 		jenaSettings.put("rdfXml.attributeQuoteChar", Character.toString(getQuoteChar()));
 		jenaSettings.putAll(ctx.jenaSettings);
 		if (op == null || op.isEmpty()) {

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/097b8103/juneau-core-test/src/test/java/org/apache/juneau/BeanFilterTest.java
----------------------------------------------------------------------
diff --git a/juneau-core-test/src/test/java/org/apache/juneau/BeanFilterTest.java b/juneau-core-test/src/test/java/org/apache/juneau/BeanFilterTest.java
index fb27219..8116344 100755
--- a/juneau-core-test/src/test/java/org/apache/juneau/BeanFilterTest.java
+++ b/juneau-core-test/src/test/java/org/apache/juneau/BeanFilterTest.java
@@ -36,7 +36,7 @@ public class BeanFilterTest {
 		a1.fb = new B2();
 		((B2)a1.fb).f2 = "f2";
 		String r = s.serialize(a1);
-		assertEquals("{subType:'A1',f0:'f0',fb:{subType:'B2',f0b:'f0b',f2:'f2'},f1:'f1'}", r);
+		assertEquals("{_type:'A1',f0:'f0',fb:{_type:'B2',f0b:'f0b',f2:'f2'},f1:'f1'}", r);
 
 		A a = p.parse(r, A.class);
 		assertTrue(a instanceof A1);
@@ -45,7 +45,7 @@ public class BeanFilterTest {
 		assertEquals("f2", ((B2)a.fb).f2);
 
 		// Try out-of-order creation.
-		r = "{f0:'f0',f1:'f1',subType:'A1',fb:{f0b:'f0b',f2:'f2',subType:'B2'}}";
+		r = "{f0:'f0',f1:'f1',_type:'A1',fb:{f0b:'f0b',f2:'f2',_type:'B2'}}";
 		a = p.parse(r, A.class);
 		assertTrue(a instanceof A1);
 		assertTrue(a.fb instanceof B2);
@@ -53,10 +53,7 @@ public class BeanFilterTest {
 		assertEquals("f2", ((B2)a.fb).f2);
 	}
 
-	@Bean(
-		subTypeProperty="subType",
-		subTypes={A1.class,A2.class}
-	)
+	@Bean(beanDictionary={A1.class, A2.class})
 	public static abstract class A {
 		public String f0 = "f0";
 		public B fb;
@@ -72,10 +69,7 @@ public class BeanFilterTest {
 		public String f2;
 	}
 
-	@Bean(
-		subTypeProperty="subType",
-		subTypes={B1.class,B2.class}
-	)
+	@Bean(beanDictionary={B1.class,B2.class})
 	public static abstract class B {
 		public String f0b = "f0b";
 	}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/097b8103/juneau-core-test/src/test/java/org/apache/juneau/BeanMapTest.java
----------------------------------------------------------------------
diff --git a/juneau-core-test/src/test/java/org/apache/juneau/BeanMapTest.java b/juneau-core-test/src/test/java/org/apache/juneau/BeanMapTest.java
index 3343a6d..0b328db 100755
--- a/juneau-core-test/src/test/java/org/apache/juneau/BeanMapTest.java
+++ b/juneau-core-test/src/test/java/org/apache/juneau/BeanMapTest.java
@@ -652,13 +652,13 @@ public class BeanMapTest {
 		BeanMap m = session.toBeanMap(t7);
 		m.put("enum1", "ONE");
 		m.put("enum2", "TWO");
-		assertEquals("{enum1:'ONE',enum2:'TWO'}", serializer.serialize(t7));
+		assertEquals("{_type:'H',enum1:'ONE',enum2:'TWO'}", serializer.serialize(t7));
 		assertEquals(HEnum.ONE, t7.enum1);
 		assertEquals(HEnum.TWO, t7.getEnum2());
 
 		// Use BeanContext to create bean instance.
 		m = BeanContext.DEFAULT.createSession().newBeanMap(H.class).load("{enum1:'TWO',enum2:'THREE'}");
-		assertEquals("{enum1:'TWO',enum2:'THREE'}", serializer.serialize(m.getBean()));
+		assertEquals("{_type:'H',enum1:'TWO',enum2:'THREE'}", serializer.serialize(m.getBean()));
 		t7 = (H)m.getBean();
 		assertEquals(HEnum.TWO, t7.enum1);
 		assertEquals(HEnum.THREE, t7.getEnum2());
@@ -666,7 +666,7 @@ public class BeanMapTest {
 		// Create instance directly from JSON.
 		JsonParser p = new JsonParser().addToBeanDictionary(H.class);
 		t7 = (H)p.parse("{_type:'H',enum1:'THREE',enum2:'ONE'}", Object.class);
-		assertEquals("{enum1:'THREE',enum2:'ONE'}", serializer.serialize(t7));
+		assertEquals("{_type:'H',enum1:'THREE',enum2:'ONE'}", serializer.serialize(t7));
 		assertEquals(HEnum.THREE, t7.enum1);
 		assertEquals(HEnum.ONE, t7.getEnum2());
 	}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/097b8103/juneau-core-test/src/test/java/org/apache/juneau/TestUtils.java
----------------------------------------------------------------------
diff --git a/juneau-core-test/src/test/java/org/apache/juneau/TestUtils.java b/juneau-core-test/src/test/java/org/apache/juneau/TestUtils.java
index 1e278b5..7f6bade 100755
--- a/juneau-core-test/src/test/java/org/apache/juneau/TestUtils.java
+++ b/juneau-core-test/src/test/java/org/apache/juneau/TestUtils.java
@@ -147,7 +147,7 @@ public class TestUtils {
 
 	private static void printLines(String[] lines) {
 		for (int i = 0; i < lines.length; i++)
-			System.err.println(String.format("%4s:" + lines[i], i+1));
+			System.err.println(String.format("%4s:" + lines[i], i+1)); // NOT DEBUG
 	}
 
 	/**
@@ -221,7 +221,7 @@ public class TestUtils {
 	 * Test whitespace and generated schema.
 	 */
 	public static void validateXml(Object o, XmlSerializer s) throws Exception {
-		s = s.clone().setUseIndentation(true).setEnableNamespaces(true).setAddNamespaceUrisToRoot(true);
+		s = s.clone().setUseWhitespace(true).setEnableNamespaces(true).setAddNamespaceUrisToRoot(true);
 		String xml = s.serialize(o);
 
 		String xmlSchema = null;
@@ -231,10 +231,10 @@ public class TestUtils {
 			TestUtils.checkXmlWhitespace(xmlSchema);
 			TestUtils.validateXml(xml, xmlSchema);
 		} catch (Exception e) {
-			System.err.println("---XML---");
-			System.err.println(xml);
-			System.err.println("---XMLSchema---");
-			System.err.println(xmlSchema);
+			System.err.println("---XML---");       // NOT DEBUG
+			System.err.println(xml);               // NOT DEBUG
+			System.err.println("---XMLSchema---"); // NOT DEBUG
+			System.err.println(xmlSchema);         // NOT DEBUG
 			throw e;
 		}
 	}
@@ -271,7 +271,7 @@ public class TestUtils {
 
 	public static void debugOut(Object o) {
 		try {
-			System.err.println(StringUtils.decodeHex(JsonSerializer.DEFAULT_LAX.serialize(o)));
+			System.err.println(StringUtils.decodeHex(JsonSerializer.DEFAULT_LAX.serialize(o))); // NOT DEBUG
 		} catch (SerializeException e) {
 			e.printStackTrace();
 		}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/097b8103/juneau-core-test/src/test/java/org/apache/juneau/a/rttests/RoundTripBeanMapsTest.java
----------------------------------------------------------------------
diff --git a/juneau-core-test/src/test/java/org/apache/juneau/a/rttests/RoundTripBeanMapsTest.java b/juneau-core-test/src/test/java/org/apache/juneau/a/rttests/RoundTripBeanMapsTest.java
index 7d30f9a..d99f5ff 100755
--- a/juneau-core-test/src/test/java/org/apache/juneau/a/rttests/RoundTripBeanMapsTest.java
+++ b/juneau-core-test/src/test/java/org/apache/juneau/a/rttests/RoundTripBeanMapsTest.java
@@ -19,6 +19,7 @@ import java.util.*;
 
 import javax.xml.datatype.*;
 
+import org.apache.juneau.BeanDictionaryMap;
 import org.apache.juneau.annotation.*;
 import org.apache.juneau.json.*;
 import org.apache.juneau.json.annotation.*;
@@ -231,24 +232,23 @@ public class RoundTripBeanMapsTest extends RoundTripTest {
 		Object r = s.serialize(b1);
 		B b = p.parse(r, B.class);
 		assertTrue(b instanceof B1);
-		assertObjectEquals("{subType:'B1',f0:'f0',f1:'f1'}", b, js);
+		assertObjectEquals("{_type:'B1',f0:'f0',f1:'f1'}", b, js);
 
 		B2 b2 = B2.create();
 		r = s.serialize(b2);
 		b = p.parse(r, B.class);
 		assertTrue(b instanceof B2);
-		assertObjectEquals("{subType:'B2',f0:'f0',f2:1}", b, js);
+		assertObjectEquals("{_type:'B2',f0:'f0',f2:1}", b, js);
 
 		B3 b3 = B3.create();
 		r = s.serialize(b3);
 		b = p.parse(r, B.class);
 		assertTrue(b instanceof B3);
-		assertObjectEquals("{subType:'B3',f0:'f0',f3:'2001-01-01T12:34:56.789Z'}", b, js);
+		assertObjectEquals("{_type:'B3',f0:'f0',f3:'2001-01-01T12:34:56.789Z'}", b, js);
 }
 
 	@Bean(
-		subTypeProperty="subType",
-		subTypes={B1.class,B2.class,B3.class}
+		beanDictionary={B1.class,B2.class,B3.class}
 	)
 	public abstract static class B {
 		public String f0 = "f0";
@@ -357,13 +357,18 @@ public class RoundTripBeanMapsTest extends RoundTripTest {
 	public static class CFilter extends BeanFilterBuilder {
 		public CFilter() {
 			super(C.class);
-			setSubTypeProperty("subType");
-			addSubType("C1", C1.class);
-			addSubType("C2", C2.class);
-			addSubType("C3", C3.class);
+			addToBeanDictionary(CFilterDictionaryMap.class);
 		}
 	}
 
+	public static class CFilterDictionaryMap extends BeanDictionaryMap {
+		public CFilterDictionaryMap() {
+			addClass("C1", C1.class);
+			addClass("C2", C2.class);
+			addClass("C3", C3.class);
+		}
+	}
+	
 	//====================================================================================================
 	// Test @Bean(subTypeProperty=xxx) with real bean property
 	//====================================================================================================
@@ -380,16 +385,12 @@ public class RoundTripBeanMapsTest extends RoundTripTest {
 		Object r = s.serialize(ba1);
 		BA b = p.parse(r, BA.class);
 		assertTrue(b instanceof BA1);
-		assertEquals("BA1", b.subType);
-		assertObjectEquals("{subType:'BA1',f0a:'f0a',f0b:'f0b',f1:'f1'}", b);
+		assertObjectEquals("{_type:'BA1',f0a:'f0a',f0b:'f0b',f1:'f1'}", b);
 	}
 
-	@Bean(
-		subTypeProperty="subType",
-		subTypes={BA1.class,BA2.class}
-	)
+	@Bean(beanDictionary={BA1.class,BA2.class})
 	public abstract static class BA {
-		public String f0a, subType, f0b;
+		public String f0a, f0b;
 	}
 
 	@Bean(typeName="BA1")
@@ -400,7 +401,6 @@ public class RoundTripBeanMapsTest extends RoundTripTest {
 			b.f0a = "f0a";
 			b.f0b = "f0b";
 			b.f1 = "f1";
-			b.subType = "xxx";// Should be ignored.
 			return b;
 		}
 	}
@@ -427,12 +427,11 @@ public class RoundTripBeanMapsTest extends RoundTripTest {
 		Object r = s.serialize(c1);
 		CA c = p.parse(r, CA.class);
 		assertTrue(c instanceof CA1);
-		assertEquals("CA1", c.subType);
-		assertObjectEquals("{f0a:'f0a',subType:'CA1',f0b:'f0b',f1:'f1'}", c);
+		assertObjectEquals("{f0a:'f0a',f0b:'f0b',f1:'f1'}", c);
 	}
 
 	public abstract static class CA {
-		public String f0a, subType, f0b;
+		public String f0a, f0b;
 	}
 
 	public static class CA1 extends CA {
@@ -442,7 +441,6 @@ public class RoundTripBeanMapsTest extends RoundTripTest {
 			c.f0a = "f0a";
 			c.f0b = "f0b";
 			c.f1 = "f1";
-			c.subType = "xxx";// Should be ignored.
 			return c;
 		}
 	}
@@ -454,12 +452,17 @@ public class RoundTripBeanMapsTest extends RoundTripTest {
 	public static class CAFilter extends BeanFilterBuilder {
 		public CAFilter() {
 			super(CA.class);
-			setSubTypeProperty("subType");
-			addSubType("CA1", CA1.class);
-			addSubType("CA2", CA2.class);
+			addToBeanDictionary(CAFilterDictionaryMap.class);
 		}
 	}
 
+	public static class CAFilterDictionaryMap extends BeanDictionaryMap {
+		public CAFilterDictionaryMap() {
+			addClass("CA1", CA1.class);
+			addClass("CA2", CA2.class);
+		}
+	}
+	
 	//====================================================================================================
 	// Test @Bean(properties=xxx)
 	//====================================================================================================

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/097b8103/juneau-core-test/src/test/java/org/apache/juneau/a/rttests/RoundTripLargeObjectsTest.java
----------------------------------------------------------------------
diff --git a/juneau-core-test/src/test/java/org/apache/juneau/a/rttests/RoundTripLargeObjectsTest.java b/juneau-core-test/src/test/java/org/apache/juneau/a/rttests/RoundTripLargeObjectsTest.java
index 33b6886..7bbd8d9 100755
--- a/juneau-core-test/src/test/java/org/apache/juneau/a/rttests/RoundTripLargeObjectsTest.java
+++ b/juneau-core-test/src/test/java/org/apache/juneau/a/rttests/RoundTripLargeObjectsTest.java
@@ -66,7 +66,7 @@ public class RoundTripLargeObjectsTest extends RoundTripTest {
 			},
 			{ /* 3 */
 				"Xml DEFAULT w/namespaces,validation",
-				new XmlSerializer.NsSq().setTrimNullProperties(false).setAddNamespaceUrisToRoot(true).setUseIndentation(true),
+				new XmlSerializer.NsSq().setTrimNullProperties(false).setAddNamespaceUrisToRoot(true).setUseWhitespace(true),
 				XmlParser.DEFAULT,
 				CHECK_XML_WHITESPACE | VALIDATE_XML
 			},
@@ -84,13 +84,13 @@ public class RoundTripLargeObjectsTest extends RoundTripTest {
 			},
 			{ /* 6 */
 				"UrlEncoding",
-				new UrlEncodingSerializer().setTrimNullProperties(false).setSimpleMode(false),
+				new UrlEncodingSerializer().setTrimNullProperties(false),
 				UrlEncodingParser.DEFAULT,
 				0
 			},
 			{ /* 7 */
 				"Uon",
-				new UonSerializer().setTrimNullProperties(false).setSimpleMode(false),
+				new UonSerializer().setTrimNullProperties(false),
 				UonParser.DEFAULT,
 				0
 			},
@@ -144,22 +144,22 @@ public class RoundTripLargeObjectsTest extends RoundTripTest {
 		A a = A.create();
 		Serializer s = getSerializer();
 		Parser p = getParser();
-		System.err.println("\n---Speed test on " + label + "---");
+		System.err.println("\n---Speed test on " + label + "---"); // NOT DEBUG
 		Object r = "";
 
 		// Initialization run.
 		r = s.serialize(a);
-		System.err.println(MessageFormat.format("Serialized size: {0,number} ", (r instanceof String ? r.toString().length() : ((byte[])r).length)));
+		System.err.println(MessageFormat.format("Serialized size: {0,number} ", (r instanceof String ? r.toString().length() : ((byte[])r).length))); // NOT DEBUG
 		p.parse(r, A.class);
 
 		startTime = System.currentTimeMillis();
 		for (int i = 0; i < numRuns; i++)
 			r = s.serialize(a);
-		System.err.println(MessageFormat.format("Average serialize time: {0,number}ms", (System.currentTimeMillis()-startTime)/numRuns));
+		System.err.println(MessageFormat.format("Average serialize time: {0,number}ms", (System.currentTimeMillis()-startTime)/numRuns)); // NOT DEBUG
 		startTime = System.currentTimeMillis();
 		for (int i = 0; i < numRuns; i++)
 			a = p.parse(r, A.class);
-		System.err.println(MessageFormat.format("Average parsed time: {0,number}ms", (System.currentTimeMillis()-startTime)/numRuns));
+		System.err.println(MessageFormat.format("Average parsed time: {0,number}ms", (System.currentTimeMillis()-startTime)/numRuns)); // NOT DEBUG
 	}
 
 	public static class A {

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/097b8103/juneau-core-test/src/test/java/org/apache/juneau/a/rttests/RoundTripMapsTest.java
----------------------------------------------------------------------
diff --git a/juneau-core-test/src/test/java/org/apache/juneau/a/rttests/RoundTripMapsTest.java b/juneau-core-test/src/test/java/org/apache/juneau/a/rttests/RoundTripMapsTest.java
index a644e85..f7d2d13 100755
--- a/juneau-core-test/src/test/java/org/apache/juneau/a/rttests/RoundTripMapsTest.java
+++ b/juneau-core-test/src/test/java/org/apache/juneau/a/rttests/RoundTripMapsTest.java
@@ -121,12 +121,12 @@ public class RoundTripMapsTest extends RoundTripTest {
 		assertEquals(e, r);
 
 		s = new UonSerializer.Encoding().addPojoSwaps(getPojoSwaps()).setTrimNullProperties(false);
-		e = "$o(AQID=a,BAUG=%00,%00=b)";
+		e = "(AQID=a,BAUG=null,null=b)";
 		r = s.serialize(t);
 		assertEquals(e, r);
 
 		s = new UrlEncodingSerializer().addPojoSwaps(getPojoSwaps()).setTrimNullProperties(false);
-		e = "AQID=a&BAUG=%00&%00=b";
+		e = "AQID=a&BAUG=null&null=b";
 		r = s.serialize(t);
 		assertEquals(e, r);
 	}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/097b8103/juneau-core-test/src/test/java/org/apache/juneau/a/rttests/RoundTripTest.java
----------------------------------------------------------------------
diff --git a/juneau-core-test/src/test/java/org/apache/juneau/a/rttests/RoundTripTest.java b/juneau-core-test/src/test/java/org/apache/juneau/a/rttests/RoundTripTest.java
index 1912417..25c8222 100755
--- a/juneau-core-test/src/test/java/org/apache/juneau/a/rttests/RoundTripTest.java
+++ b/juneau-core-test/src/test/java/org/apache/juneau/a/rttests/RoundTripTest.java
@@ -66,7 +66,7 @@ public abstract class RoundTripTest {
 			},
 			{ /* 3 */
 				"Xml - namespaces, validation, readable",
-				new XmlSerializer.NsSq().setTrimNullProperties(false).setAddNamespaceUrisToRoot(true).setUseIndentation(true),
+				new XmlSerializer.NsSq().setTrimNullProperties(false).setAddNamespaceUrisToRoot(true).setUseWhitespace(true),
 				XmlParser.DEFAULT,
 				CHECK_XML_WHITESPACE | VALIDATE_XML
 			},
@@ -96,37 +96,37 @@ public abstract class RoundTripTest {
 			},
 			{ /* 8 */
 				"Uon - default",
-				new UonSerializer().setTrimNullProperties(false).setSimpleMode(false),
+				new UonSerializer().setTrimNullProperties(false),
 				UonParser.DEFAULT,
 				0
 			},
 			{ /* 9 */
 				"Uon - readable",
-				new UonSerializer.Readable().setTrimNullProperties(false).setSimpleMode(false),
-				UonParser.DEFAULT_WS_AWARE,
+				new UonSerializer.Readable().setTrimNullProperties(false),
+				UonParser.DEFAULT,
 				0
 			},
 			{ /* 10 */
 				"Uon - encoded",
-				new UonSerializer.Encoding().setTrimNullProperties(false).setSimpleMode(false),
+				new UonSerializer.Encoding().setTrimNullProperties(false),
 				UonParser.DEFAULT_DECODING,
 				0
 			},
 			{ /* 11 */
 				"UrlEncoding - default",
-				new UrlEncodingSerializer().setTrimNullProperties(false).setSimpleMode(false),
+				new UrlEncodingSerializer().setTrimNullProperties(false),
 				UrlEncodingParser.DEFAULT,
 				0
 			},
 			{ /* 12 */
 				"UrlEncoding - readable",
-				new UrlEncodingSerializer.Readable().setTrimNullProperties(false).setSimpleMode(false),
-				UrlEncodingParser.DEFAULT_WS_AWARE,
+				new UrlEncodingSerializer.Readable().setTrimNullProperties(false),
+				UrlEncodingParser.DEFAULT,
 				0
 			},
 			{ /* 13 */
 				"UrlEncoding - expanded params",
-				new UrlEncodingSerializer().setExpandedParams(true).setSimpleMode(false),
+				new UrlEncodingSerializer().setExpandedParams(true),
 				new UrlEncodingParser().setExpandedParams(true),
 				0
 			},
@@ -192,8 +192,8 @@ public abstract class RoundTripTest {
 	public boolean debug = false;
 
 	public RoundTripTest(String label, Serializer s, Parser p, int flags) throws Exception {
-		this.s = s.clone().addBeanFilters(getBeanFilters()).addPojoSwaps(getPojoSwaps()).addToBeanDictionary(getDictionary());
-		this.p = p == null ? null : p.clone().addBeanFilters(getBeanFilters()).addPojoSwaps(getPojoSwaps()).addToBeanDictionary(getDictionary());
+		this.s = s.clone().addBeanFilters(getBeanFilters()).addPojoSwaps(getPojoSwaps()).addToBeanDictionary(getDictionary()).setProperties(getProperties());
+		this.p = p == null ? null : p.clone().addBeanFilters(getBeanFilters()).addPojoSwaps(getPojoSwaps()).addToBeanDictionary(getDictionary()).setProperties(getProperties());
 		this.label = label;
 
 		Map<Class<Object>, Class<? extends Object>> m = getImplClasses();
@@ -221,6 +221,10 @@ public abstract class RoundTripTest {
 	public Class<?>[] getDictionary() {
 		return new Class<?>[0];
 	}
+	
+	public ObjectMap getProperties() {
+		return ObjectMap.EMPTY_MAP;
+	}
 
 	public <T> Map<Class<T>,Class<? extends T>> getImplClasses() {
 		return null;
@@ -286,7 +290,7 @@ public abstract class RoundTripTest {
 		}
 
 		if (debug)
-			System.err.println("Serialized contents from ["+label+"]...\n---START---\n" + (out instanceof byte[] ? TestUtils.toReadableBytes((byte[])out) : out) + "\n---END---\n");
+			System.err.println("Serialized contents from ["+label+"]...\n---START---\n" + (out instanceof byte[] ? TestUtils.toReadableBytes((byte[])out) : out) + "\n---END---\n"); // NOT DEBUG
 
 		if (validateXmlWhitespace)
 			TestUtils.checkXmlWhitespace(out.toString());

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/097b8103/juneau-core-test/src/test/java/org/apache/juneau/a/rttests/RoundTripTransformBeansTest.java
----------------------------------------------------------------------
diff --git a/juneau-core-test/src/test/java/org/apache/juneau/a/rttests/RoundTripTransformBeansTest.java b/juneau-core-test/src/test/java/org/apache/juneau/a/rttests/RoundTripTransformBeansTest.java
index c4d792f..cc6c1b9 100755
--- a/juneau-core-test/src/test/java/org/apache/juneau/a/rttests/RoundTripTransformBeansTest.java
+++ b/juneau-core-test/src/test/java/org/apache/juneau/a/rttests/RoundTripTransformBeansTest.java
@@ -275,14 +275,11 @@ public class RoundTripTransformBeansTest extends RoundTripTest {
 
 		C1 c1 = C3.create();
 		String r = s.serialize(c1);
-		assertEquals("{\"type\":\"C3\",\"f1\":{\"f2\":\"f2\",\"f3\":3}}", r);
+		assertEquals("{\"_type\":\"C3\",\"f1\":{\"f2\":\"f2\",\"f3\":3}}", r);
 	}
 
 
-	@Bean(
-		subTypeProperty="type",
-		subTypes={C3.class}
-	)
+	@Bean(beanDictionary={C3.class})
 	public static interface C1<T> extends Serializable {
 		void setF1(T f1);
 		T getF1();

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/097b8103/juneau-core-test/src/test/java/org/apache/juneau/dto/cognos/CognosXmlTest.java
----------------------------------------------------------------------
diff --git a/juneau-core-test/src/test/java/org/apache/juneau/dto/cognos/CognosXmlTest.java b/juneau-core-test/src/test/java/org/apache/juneau/dto/cognos/CognosXmlTest.java
index bd98a6d..358d8e3 100755
--- a/juneau-core-test/src/test/java/org/apache/juneau/dto/cognos/CognosXmlTest.java
+++ b/juneau-core-test/src/test/java/org/apache/juneau/dto/cognos/CognosXmlTest.java
@@ -73,7 +73,7 @@ public class CognosXmlTest {
 		};
 
 		XmlSerializer s = new XmlSerializer()
-			.setUseIndentation(true)
+			.setUseWhitespace(true)
 			.setQuoteChar('\'')
 			.setDefaultNamespace("cognos")
 			.setEnableNamespaces(true)



[3/8] incubator-juneau git commit: Modification to UON spec. Remove bean subtype support.

Posted by ja...@apache.org.
http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/097b8103/juneau-core/src/main/java/org/apache/juneau/urlencoding/UonParser.java
----------------------------------------------------------------------
diff --git a/juneau-core/src/main/java/org/apache/juneau/urlencoding/UonParser.java b/juneau-core/src/main/java/org/apache/juneau/urlencoding/UonParser.java
index 510078a..21227c7 100644
--- a/juneau-core/src/main/java/org/apache/juneau/urlencoding/UonParser.java
+++ b/juneau-core/src/main/java/org/apache/juneau/urlencoding/UonParser.java
@@ -53,13 +53,10 @@ public class UonParser extends ReaderParser {
 	/** Reusable instance of {@link UonParser.Decoding}. */
 	public static final UonParser DEFAULT_DECODING = new Decoding().lock();
 
-	/** Reusable instance of {@link UonParser}, all default settings, whitespace-aware. */
-	public static final UonParser DEFAULT_WS_AWARE = new UonParser().setWhitespaceAware(true).lock();
-
 	// Characters that need to be preceeded with an escape character.
-	private static final AsciiSet escapedChars = new AsciiSet(",()~=$\u0001\u0002");
+	private static final AsciiSet escapedChars = new AsciiSet("~'\u0001\u0002");
 
-	private static final char NUL='\u0000', AMP='\u0001', EQ='\u0002';  // Flags set in reader to denote & and = characters.
+	private static final char AMP='\u0001', EQ='\u0002';  // Flags set in reader to denote & and = characters.
 
 	/**
 	 * Equivalent to <code><jk>new</jk> UrlEncodingParser().setProperty(UonParserContext.<jsf>UON_decodeChars</jsf>,<jk>true</jk>);</code>.
@@ -89,14 +86,10 @@ public class UonParser extends ReaderParser {
 			eType = (ClassMeta<T>)object();
 		PojoSwap<T,Object> transform = (PojoSwap<T,Object>)eType.getPojoSwap();
 		ClassMeta<?> sType = eType.getSerializedClassMeta();
-		BeanRegistry breg = (pMeta == null ? session.getBeanRegistry() : pMeta.getBeanRegistry());
 
 		Object o = null;
 
-		// Parse type flag '$x'
-		char flag = readFlag(session, r, (char)0);
-
-		int c = r.peek();
+		int c = r.peekSkipWs();
 
 		if (c == -1 || c == AMP) {
 			// If parameter is blank and it's an array or collection, return an empty list.
@@ -108,21 +101,25 @@ public class UonParser extends ReaderParser {
 				o = sType.getPrimitiveDefault();
 			// Otherwise, leave null.
 		} else if (sType.isObject()) {
-			if (flag == 0 || flag == 's') {
-				o = parseString(session, r, isUrlParamValue);
-			} else if (flag == 'b') {
-				o = parseBoolean(session, r);
-			} else if (flag == 'n') {
-				o = parseNumber(session, r, null);
-			} else if (flag == 'o') {
+			if (c == '(') {
 				ObjectMap m = new ObjectMap(session);
 				parseIntoMap(session, r, m, string(), object(), pMeta);
-				o = breg.cast(m);
-			} else if (flag == 'a') {
+				o = session.cast(m, pMeta, eType);
+			} else if (c == '@') {
 				Collection l = new ObjectList(session);
 				o = parseIntoCollection(session, r, l, sType.getElementType(), isUrlParamValue, pMeta);
 			} else {
-				throw new ParseException(session, "Unexpected flag character ''{0}''.", flag);
+				String s = parseString(session, r, isUrlParamValue);
+				if (c != '\'') {
+					if ("true".equals(s) || "false".equals(s))
+						o = Boolean.valueOf(s);
+					else if (StringUtils.isNumeric(s))
+						o = StringUtils.parseNumber(s, Number.class);
+					else
+						o = s;
+				} else {
+					o = s;
+				}
 			}
 		} else if (sType.isBoolean()) {
 			o = parseBoolean(session, r);
@@ -137,12 +134,12 @@ public class UonParser extends ReaderParser {
 			Map m = (sType.canCreateNewInstance(outer) ? (Map)sType.newInstance(outer) : new ObjectMap(session));
 			o = parseIntoMap(session, r, m, sType.getKeyType(), sType.getValueType(), pMeta);
 		} else if (sType.isCollection()) {
-			if (flag == 'o') {
+			if (c == '(') {
 				ObjectMap m = new ObjectMap(session);
 				parseIntoMap(session, r, m, string(), object(), pMeta);
 				// Handle case where it's a collection, but serialized as a map with a _type or _value key.
 				if (m.containsKey(session.getBeanTypePropertyName()))
-					o = breg.cast(m);
+					o = session.cast(m, pMeta, eType);
 				// Handle case where it's a collection, but only a single value was specified.
 				else {
 					Collection l = (sType.canCreateNewInstance(outer) ? (Collection)sType.newInstance(outer) : new ObjectList(session));
@@ -164,12 +161,12 @@ public class UonParser extends ReaderParser {
 		} else if (sType.canCreateNewInstanceFromNumber(outer)) {
 			o = sType.newInstanceFromNumber(session, outer, parseNumber(session, r, sType.getNewInstanceFromNumberClass()));
 		} else if (sType.isArray()) {
-			if (flag == 'o') {
+			if (c == '(') {
 				ObjectMap m = new ObjectMap(session);
 				parseIntoMap(session, r, m, string(), object(), pMeta);
 				// Handle case where it's an array, but serialized as a map with a _type or _value key.
 				if (m.containsKey(session.getBeanTypePropertyName()))
-					o = breg.cast(m);
+					o = session.cast(m, pMeta, eType);
 				// Handle case where it's an array, but only a single value was specified.
 				else {
 					ArrayList l = new ArrayList(1);
@@ -180,12 +177,12 @@ public class UonParser extends ReaderParser {
 				ArrayList l = (ArrayList)parseIntoCollection(session, r, new ArrayList(), sType.getElementType(), isUrlParamValue, pMeta);
 				o = session.toArray(sType, l);
 			}
-		} else if (flag == 'o') {
+		} else if (c == '(') {
 			// It could be a non-bean with _type attribute.
 			ObjectMap m = new ObjectMap(session);
 			parseIntoMap(session, r, m, string(), object(), pMeta);
 			if (m.containsKey(session.getBeanTypePropertyName()))
-				o = breg.cast(m);
+				o = session.cast(m, pMeta, eType);
 			else
 				throw new ParseException(session, "Class ''{0}'' could not be instantiated.  Reason: ''{1}''", sType.getInnerClass().getName(), sType.getNotABeanReason());
 		} else {
@@ -207,8 +204,10 @@ public class UonParser extends ReaderParser {
 			keyType = (ClassMeta<K>)string();
 
 		int c = r.read();
-		if (c == -1 || c == NUL || c == AMP)
+		if (c == -1 || c == AMP)
 			return null;
+		if (c == 'n')
+			return (Map<K,V>)parseNull(session, r);
 		if (c != '(')
 			throw new ParseException(session, "Expected '(' at beginning of object.");
 
@@ -226,12 +225,12 @@ public class UonParser extends ReaderParser {
 				if (state == S1) {
 					if (c == ')')
 						return m;
-					if ((c == '\n' || c == '\r') && session.isWhitespaceAware())
+					if (Character.isWhitespace(c))
 						skipSpace(r);
 					else {
 						r.unread();
 						Object attr = parseAttr(session, r, session.isDecodeChars());
-						currAttr = session.trim((attr == null ? null : session.convertToType(attr, keyType)));
+						currAttr = attr == null ? null : convertAttrToType(session, m, session.trim(attr.toString()), keyType);
 						state = S2;
 						c = 0; // Avoid isInEscape if c was '\'
 					}
@@ -287,18 +286,23 @@ public class UonParser extends ReaderParser {
 
 	private <E> Collection<E> parseIntoCollection(UonParserSession session, ParserReader r, Collection<E> l, ClassMeta<E> elementType, boolean isUrlParamValue, BeanPropertyMeta pMeta) throws Exception {
 
-		int c = r.read();
-		if (c == -1 || c == NUL || c == AMP)
+		int c = r.readSkipWs();
+		if (c == -1 || c == AMP)
 			return null;
+		if (c == 'n')
+			return (Collection<E>)parseNull(session, r);
 
 		// If we're parsing a top-level parameter, we're allowed to have comma-delimited lists outside parenthesis (e.g. "&foo=1,2,3&bar=a,b,c")
 		// This is not allowed at lower levels since we use comma's as end delimiters.
-		boolean isInParens = (c == '(');
-		if (! isInParens)
+		boolean isInParens = (c == '@');
+		if (! isInParens) {
 			if (isUrlParamValue)
 				r.unread();
 			else
 				throw new ParseException(session, "Could not find '(' marking beginning of collection.");
+		} else {
+			r.read();
+		}
 
 		if (isInParens) {
 			final int S1=1; // Looking for starting of first entry.
@@ -315,7 +319,7 @@ public class UonParser extends ReaderParser {
 							r.read();
 						}
 						return l;
-					} else if ((c == '\n' || c == '\r') && session.isWhitespaceAware()) {
+					} else if (Character.isWhitespace(c)) {
 						skipSpace(r);
 					} else {
 						l.add(parseAnything(session, elementType, r.unread(), l, false, pMeta));
@@ -342,7 +346,7 @@ public class UonParser extends ReaderParser {
 			while (c != -1 && c != AMP) {
 				c = r.read();
 				if (state == S1) {
-					if ((c == '\n' || c == '\r') && session.isWhitespaceAware()) {
+					if (Character.isWhitespace(c)) {
 						skipSpace(r);
 					} else {
 						l.add(parseAnything(session, elementType, r.unread(), l, false, pMeta));
@@ -351,7 +355,7 @@ public class UonParser extends ReaderParser {
 				} else if (state == S2) {
 					if (c == ',') {
 						state = S1;
-					} else if ((c == '\n' || c == '\r') && session.isWhitespaceAware()) {
+					} else if (Character.isWhitespace(c)) {
 						skipSpace(r);
 					} else if (c == AMP || c == -1) {
 						r.unread();
@@ -366,9 +370,11 @@ public class UonParser extends ReaderParser {
 
 	private <T> BeanMap<T> parseIntoBeanMap(UonParserSession session, ParserReader r, BeanMap<T> m) throws Exception {
 
-		int c = r.read();
-		if (c == -1 || c == NUL || c == AMP)
+		int c = r.readSkipWs();
+		if (c == -1 || c == AMP)
 			return null;
+		if (c == 'n')
+			return (BeanMap<T>)parseNull(session, r);
 		if (c != '(')
 			throw new ParseException(session, "Expected '(' at beginning of object.");
 
@@ -388,7 +394,7 @@ public class UonParser extends ReaderParser {
 					if (c == ')' || c == -1 || c == AMP) {
 						return m;
 					}
-					if ((c == '\n' || c == '\r') && session.isWhitespaceAware())
+					if (Character.isWhitespace(c))
 						skipSpace(r);
 					else {
 						r.unread();
@@ -413,11 +419,7 @@ public class UonParser extends ReaderParser {
 						if (! currAttr.equals(session.getBeanTypePropertyName())) {
 							BeanPropertyMeta pMeta = m.getPropertyMeta(currAttr);
 							if (pMeta == null) {
-								if (m.getMeta().isSubTyped()) {
-									m.put(currAttr, "");
-								} else {
-									onUnknownProperty(session, currAttr, m, currAttrLine, currAttrCol);
-								}
+								onUnknownProperty(session, currAttr, m, currAttrLine, currAttrCol);
 							} else {
 								Object value = session.convertToType("", pMeta.getClassMeta());
 								pMeta.set(m, value);
@@ -430,13 +432,8 @@ public class UonParser extends ReaderParser {
 						if (! currAttr.equals(session.getBeanTypePropertyName())) {
 							BeanPropertyMeta pMeta = m.getPropertyMeta(currAttr);
 							if (pMeta == null) {
-								if (m.getMeta().isSubTyped()) {
-									Object value = parseAnything(session, object(), r.unread(), m.getBean(false), false, null);
-									m.put(currAttr, value);
-								} else {
-									onUnknownProperty(session, currAttr, m, currAttrLine, currAttrCol);
-									parseAnything(session, object(), r.unread(), m.getBean(false), false, null); // Read content anyway to ignore it
-								}
+								onUnknownProperty(session, currAttr, m, currAttrLine, currAttrCol);
+								parseAnything(session, object(), r.unread(), m.getBean(false), false, null); // Read content anyway to ignore it
 							} else {
 								session.setCurrentProperty(pMeta);
 								ClassMeta<?> cm = pMeta.getClassMeta();
@@ -470,32 +467,26 @@ public class UonParser extends ReaderParser {
 		return null; // Unreachable.
 	}
 
+	Object parseNull(UonParserSession session, ParserReader r) throws Exception {
+		String s = parseString(session, r, false);
+		if ("ull".equals(s))
+			return null;
+		throw new ParseException(session, "Unexpected character sequence: ''{0}''", s);
+	}
+
 	Object parseAttr(UonParserSession session, ParserReader r, boolean encoded) throws Exception {
 		Object attr;
-		int c = r.peek();
-		if (c == '$') {
-			char f = readFlag(session, r, (char)0);
-			if (f == 'b')
-				attr = parseBoolean(session, r);
-			else if (f == 'n')
-				attr = parseNumber(session, r, null);
-			else
-				attr = parseAttrName(session, r, encoded);
-		} else {
-			attr = parseAttrName(session, r, encoded);
-		}
+		attr = parseAttrName(session, r, encoded);
 		return attr;
 	}
 
 	String parseAttrName(UonParserSession session, ParserReader r, boolean encoded) throws Exception {
 
-		// If string is of form '(xxx)', we're looking for ')' at the end.
-		// Otherwise, we're looking for '&' or '=' or -1 denoting the end of this string.
+		// If string is of form 'xxx', we're looking for ' at the end.
+		// Otherwise, we're looking for '&' or '=' or WS or -1 denoting the end of this string.
 
-		int c = r.peek();
-		if (c == '$')
-			readFlag(session, r, 's');
-		if (c == '(')
+		int c = r.peekSkipWs();
+		if (c == '\'')
 			return parsePString(session, r);
 
 		r.mark();
@@ -504,11 +495,11 @@ public class UonParser extends ReaderParser {
 			while (c != -1) {
 				c = r.read();
 				if (! isInEscape) {
-					if (c == AMP || c == EQ || c == -1) {
+					if (c == AMP || c == EQ || c == -1 || Character.isWhitespace(c)) {
 						if (c != -1)
 							r.unread();
 						String s = r.getMarked();
-						return (s.equals("\u0000") ? null : s);
+						return ("null".equals(s) ? null : s);
 					}
 				}
 				else if (c == AMP)
@@ -521,11 +512,11 @@ public class UonParser extends ReaderParser {
 			while (c != -1) {
 				c = r.read();
 				if (! isInEscape) {
-					if (c == '=' || c == -1) {
+					if (c == '=' || c == -1 || Character.isWhitespace(c)) {
 						if (c != -1)
 							r.unread();
 						String s = r.getMarked();
-						return (s.equals("\u0000") ? null : session.trim(s));
+						return ("null".equals(s) ? null : session.trim(s));
 					}
 				}
 				isInEscape = isInEscape(c, r, isInEscape);
@@ -556,11 +547,11 @@ public class UonParser extends ReaderParser {
 
 	String parseString(UonParserSession session, ParserReader r, boolean isUrlParamValue) throws Exception {
 
-		// If string is of form '(xxx)', we're looking for ')' at the end.
+		// If string is of form 'xxx', we're looking for ' at the end.
 		// Otherwise, we're looking for ',' or ')' or -1 denoting the end of this string.
 
-		int c = r.peek();
-		if (c == '(')
+		int c = r.peekSkipWs();
+		if (c == '\'')
 			return parsePString(session, r);
 
 		r.mark();
@@ -581,7 +572,7 @@ public class UonParser extends ReaderParser {
 				s = r.getMarked();
 			else if (c == EQ)
 				r.replace('=');
-			else if ((c == '\n' || c == '\r') && session.isWhitespaceAware()) {
+			else if (Character.isWhitespace(c)) {
 				s = r.getMarked(0, -1);
 				skipSpace(r);
 				c = -1;
@@ -589,19 +580,19 @@ public class UonParser extends ReaderParser {
 			isInEscape = isInEscape(c, r, isInEscape);
 		}
 
-		return (s == null || s.equals("\u0000") ? null : session.trim(s));
+		return ("null".equals(s) ? null : session.trim(s));
 	}
 
 	private static final AsciiSet endCharsParam = new AsciiSet(""+AMP), endCharsNormal = new AsciiSet(",)"+AMP);
 
 
 	/**
-	 * Parses a string of the form "(foo)"
+	 * Parses a string of the form "'foo'"
 	 * All whitespace within parenthesis are preserved.
 	 */
 	static String parsePString(UonParserSession session, ParserReader r) throws Exception {
 
-		r.read(); // Skip first parenthesis.
+		r.read(); // Skip first quote.
 		r.mark();
 		int c = 0;
 
@@ -609,7 +600,7 @@ public class UonParser extends ReaderParser {
 		while (c != -1) {
 			c = r.read();
 			if (! isInEscape) {
-				if (c == ')')
+				if (c == '\'')
 					return session.trim(r.getMarked(0, -1));
 			}
 			if (c == EQ)
@@ -620,9 +611,8 @@ public class UonParser extends ReaderParser {
 	}
 
 	private Boolean parseBoolean(UonParserSession session, ParserReader r) throws Exception {
-		readFlag(session, r, 'b');
 		String s = parseString(session, r, false);
-		if (s == null)
+		if (s == null || s.equals("null"))
 			return null;
 		if (s.equals("true"))
 			return true;
@@ -632,7 +622,6 @@ public class UonParser extends ReaderParser {
 	}
 
 	private Number parseNumber(UonParserSession session, ParserReader r, Class<? extends Number> c) throws Exception {
-		readFlag(session, r, 'n');
 		String s = parseString(session, r, false);
 		if (s == null)
 			return null;
@@ -644,29 +633,13 @@ public class UonParser extends ReaderParser {
 	 * remainder in the input, that it consists only of whitespace and comments.
 	 */
 	private void validateEnd(UonParserSession session, ParserReader r) throws Exception {
-		int c = r.read();
-		if (c != -1)
-			throw new ParseException(session, "Remainder after parse: ''{0}''.", (char)c);
-	}
-
-	/**
-	 * Reads flag character from "$x(" construct if flag is present.
-	 * Returns 0 if no flag is present.
-	 */
-	static char readFlag(UonParserSession session, ParserReader r, char expected) throws Exception {
-		char c = (char)r.peek();
-		if (c == '$') {
-			r.read();
-			char f = (char)r.read();
-			if (expected != 0 && f != expected)
-				throw new ParseException(session, "Unexpected flag character: ''{0}''.  Expected ''{1}''.", f, expected);
-			c = (char)r.peek();
-			// Type flag must be followed by '('
-			if (c != '(')
-				throw new ParseException(session, "Unexpected character following flag: ''{0}''.", c);
-			return f;
+		while (true) {
+			int c = r.read();
+			if (c == -1)
+				return;
+			if (! Character.isWhitespace(c))
+				throw new ParseException(session, "Remainder after parse: ''{0}''.", (char)c);
 		}
-		return 0;
 	}
 
 	private Object[] parseArgs(UonParserSession session, ParserReader r, ClassMeta<?>[] argTypes) throws Exception {
@@ -677,11 +650,12 @@ public class UonParser extends ReaderParser {
 		Object[] o = new Object[argTypes.length];
 		int i = 0;
 
-		int c = r.read();
+		int c = r.readSkipWs();
 		if (c == -1 || c == AMP)
 			return null;
-		if (c != '(')
-			throw new ParseException(session, "Expected '(' at beginning of args array.");
+		if (c != '@')
+			throw new ParseException(session, "Expected '@' at beginning of args array.");
+		c = r.read();
 
 		int state = S1;
 		while (c != -1 && c != AMP) {
@@ -707,7 +681,7 @@ public class UonParser extends ReaderParser {
 	private static void skipSpace(ParserReader r) throws Exception {
 		int c = 0;
 		while ((c = r.read()) != -1) {
-			if (c > ' ' || c <= 2) {
+			if (c <= 2 || ! Character.isWhitespace(c)) {
 				r.unread();
 				return;
 			}
@@ -741,7 +715,6 @@ public class UonParser extends ReaderParser {
 	protected <K,V> Map<K,V> doParseIntoMap(ParserSession session, Map<K,V> m, Type keyType, Type valueType) throws Exception {
 		UonParserSession s = (UonParserSession)session;
 		UonReader r = s.getReader();
-		readFlag(s, r, 'o');
 		m = parseIntoMap(s, r, m, (ClassMeta<K>)session.getClassMeta(keyType), (ClassMeta<V>)session.getClassMeta(valueType), null);
 		validateEnd(s, r);
 		return m;
@@ -751,7 +724,6 @@ public class UonParser extends ReaderParser {
 	protected <E> Collection<E> doParseIntoCollection(ParserSession session, Collection<E> c, Type elementType) throws Exception {
 		UonParserSession s = (UonParserSession)session;
 		UonReader r = s.getReader();
-		readFlag(s, r, 'a');
 		c = parseIntoCollection(s, r, c, (ClassMeta<E>)session.getClassMeta(elementType), false, null);
 		validateEnd(s, r);
 		return c;
@@ -761,7 +733,6 @@ public class UonParser extends ReaderParser {
 	protected Object[] doParseArgs(ParserSession session, ClassMeta<?>[] argTypes) throws Exception {
 		UonParserSession s = (UonParserSession)session;
 		UonReader r = s.getReader();
-		readFlag(s, r, 'a');
 		Object[] a = parseArgs(s, r, argTypes);
 		return a;
 	}
@@ -798,32 +769,6 @@ public class UonParser extends ReaderParser {
 		return setProperty(UON_decodeChars, value);
 	}
 
-	/**
-	 * <b>Configuration property:</b> Whitespace aware.
-	 * <p>
-	 * <ul>
-	 * 	<li><b>Name:</b> <js>"UonParser.whitespaceAware"</js>
-	 * 	<li><b>Data type:</b> <code>Boolean</code>
-	 * 	<li><b>Default:</b> <jk>false</jk>
-	 * 	<li><b>Session-overridable:</b> <jk>true</jk>
-	 * </ul>
-	 * <p>
-	 * Expect input to contain readable whitespace characters from using the {@link UonSerializerContext#UON_useWhitespace} setting.
-	 * <p>
-	 * <h5 class='section'>Notes:</h5>
-	 * <ul>
-	 * 	<li>This is equivalent to calling <code>setProperty(<jsf>UON_whitespaceAware</jsf>, value)</code>.
-	 * </ul>
-	 *
-	 * @param value The new value for this property.
-	 * @return This object (for method chaining).
-	 * @throws LockedException If {@link #lock()} was called on this class.
-	 * @see UonParserContext#UON_whitespaceAware
-	 */
-	public UonParser setWhitespaceAware(boolean value) throws LockedException {
-		return setProperty(UON_whitespaceAware, value);
-	}
-
 	@Override /* Parser */
 	public UonParser setTrimStrings(boolean value) throws LockedException {
 		super.setTrimStrings(value);

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/097b8103/juneau-core/src/main/java/org/apache/juneau/urlencoding/UonParserContext.java
----------------------------------------------------------------------
diff --git a/juneau-core/src/main/java/org/apache/juneau/urlencoding/UonParserContext.java b/juneau-core/src/main/java/org/apache/juneau/urlencoding/UonParserContext.java
index f1f65bb..2cc5745 100644
--- a/juneau-core/src/main/java/org/apache/juneau/urlencoding/UonParserContext.java
+++ b/juneau-core/src/main/java/org/apache/juneau/urlencoding/UonParserContext.java
@@ -48,24 +48,8 @@ public class UonParserContext extends ParserContext {
 	 */
 	public static final String UON_decodeChars = "UonParser.decodeChars";
 
-	/**
-	 * <b>Configuration property:</b> Whitespace aware.
-	 * <p>
-	 * <ul>
-	 * 	<li><b>Name:</b> <js>"UonParser.whitespaceAware"</js>
-	 * 	<li><b>Data type:</b> <code>Boolean</code>
-	 * 	<li><b>Default:</b> <jk>false</jk>
-	 * 	<li><b>Session-overridable:</b> <jk>true</jk>
-	 * </ul>
-	 * <p>
-	 * Expect input to contain readable whitespace characters from using the {@link UonSerializerContext#UON_useWhitespace} setting.
-	 */
-	public static final String UON_whitespaceAware = "UonParser.whitespaceAware";
-
-
 	final boolean
-		decodeChars,
-		whitespaceAware;
+		decodeChars;
 
 	/**
 	 * Constructor.
@@ -77,7 +61,6 @@ public class UonParserContext extends ParserContext {
 	public UonParserContext(ContextFactory cf) {
 		super(cf);
 		this.decodeChars = cf.getProperty(UON_decodeChars, boolean.class, false);
-		this.whitespaceAware = cf.getProperty(UON_whitespaceAware, boolean.class, false);
 	}
 
 	@Override /* Context */
@@ -85,7 +68,6 @@ public class UonParserContext extends ParserContext {
 		return super.asMap()
 			.append("UonParserContext", new ObjectMap()
 				.append("decodeChars", decodeChars)
-				.append("whitespaceAware", whitespaceAware)
 			);
 	}
 }

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/097b8103/juneau-core/src/main/java/org/apache/juneau/urlencoding/UonParserSession.java
----------------------------------------------------------------------
diff --git a/juneau-core/src/main/java/org/apache/juneau/urlencoding/UonParserSession.java b/juneau-core/src/main/java/org/apache/juneau/urlencoding/UonParserSession.java
index c2ea7da..54b8927 100644
--- a/juneau-core/src/main/java/org/apache/juneau/urlencoding/UonParserSession.java
+++ b/juneau-core/src/main/java/org/apache/juneau/urlencoding/UonParserSession.java
@@ -28,7 +28,7 @@ import org.apache.juneau.parser.*;
  */
 public class UonParserSession extends ParserSession {
 
-	private final boolean decodeChars, whitespaceAware;
+	private final boolean decodeChars;
 	private UonReader reader;
 
 	/**
@@ -58,10 +58,8 @@ public class UonParserSession extends ParserSession {
 		super(ctx, op, input, javaMethod, outer, locale, timeZone, mediaType);
 		if (op == null || op.isEmpty()) {
 			decodeChars = ctx.decodeChars;
-			whitespaceAware = ctx.whitespaceAware;
 		} else {
 			decodeChars = op.getBoolean(UON_decodeChars, ctx.decodeChars);
-			whitespaceAware = op.getBoolean(UON_whitespaceAware, ctx.whitespaceAware);
 		}
 	}
 
@@ -83,7 +81,6 @@ public class UonParserSession extends ParserSession {
 	public UonParserSession(UonParserContext ctx, Object input) {
 		super(ctx, null, input, null, null, null, null, null);
 		decodeChars = false;
-		whitespaceAware = ctx.whitespaceAware;
 	}
 
 	/**
@@ -95,15 +92,6 @@ public class UonParserSession extends ParserSession {
 		return decodeChars;
 	}
 
-	/**
-	 * Returns the {@link UonParserContext#UON_whitespaceAware} setting value for this session.
-	 *
-	 * @return The {@link UonParserContext#UON_whitespaceAware} setting value for this session.
-	 */
-	public final boolean isWhitespaceAware() {
-		return whitespaceAware;
-	}
-
 	@Override /* ParserSession */
 	public UonReader getReader() throws Exception {
 		if (reader == null) {

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/097b8103/juneau-core/src/main/java/org/apache/juneau/urlencoding/UonSerializer.java
----------------------------------------------------------------------
diff --git a/juneau-core/src/main/java/org/apache/juneau/urlencoding/UonSerializer.java b/juneau-core/src/main/java/org/apache/juneau/urlencoding/UonSerializer.java
index 8c7848f..9fae479 100644
--- a/juneau-core/src/main/java/org/apache/juneau/urlencoding/UonSerializer.java
+++ b/juneau-core/src/main/java/org/apache/juneau/urlencoding/UonSerializer.java
@@ -73,49 +73,23 @@ import org.apache.juneau.transform.*;
  * 		UON notation would be as follows:
  * </p>
  * <p class='bcode'>
- * 	$o(
- * 		<xa>id</xa>=$n(<xs>1</xs>),
- * 		<xa>name</xa>=<xs>John+Smith</xs>,
- * 		<xa>uri</xa>=<xs>http://sample/addressBook/person/1</xs>,
- * 		<xa>addressBookUri</xa>=<xs>http://sample/addressBook</xs>,
- * 		<xa>birthDate</xa>=<xs>1946-08-12T00:00:00Z</xs>,
- * 		<xa>otherIds</xa>=<xs>%00</xs>,
- * 		<xa>addresses</xa>=$a(
- * 			$o(
- * 				<xa>uri</xa>=<xs>http://sample/addressBook/address/1</xs>,
- * 				<xa>personUri</xa>=<xs>http://sample/addressBook/person/1</xs>,
- * 				<xa>id</xa>=$n(<xs>1</xs>),
- * 				<xa>street</xa>=<xs>100+Main+Street</xs>,
- * 				<xa>city</xa>=<xs>Anywhereville</xs>,
- * 				<xa>state</xa>=<xs>NY</xs>,
- * 				<xa>zip</xa>=$n(<xs>12345</xs>),
- * 				<xa>isCurrent</xa>=$b(<xs>true</xs>)
- * 			)
- * 		)
- * 	)
- * </p>
- * <p>
- * 	A secondary "lax" syntax is available when the data type of the
- * 		values are already known on the receiving end of the transmission:
- * </p>
- * <p class='bcode'>
  * 	(
- * 		<xa>id</xa>=<xs>1</xs>,
- * 		<xa>name</xa>=<xs>John+Smith</xs>,
- * 		<xa>uri</xa>=<xs>http://sample/addressBook/person/1</xs>,
- * 		<xa>addressBookUri</xa>=<xs>http://sample/addressBook</xs>,
- * 		<xa>birthDate</xa>=<xs>1946-08-12T00:00:00Z</xs>,
- * 		<xa>otherIds</xa>=<xs>%00</xs>,
- * 		<xa>addresses</xa>=(
+ * 		<ua>id</ua>=<un>1</un>,
+ * 		<ua>name</ua>=<us>'John+Smith'</us>,
+ * 		<ua>uri</ua>=<us>http://sample/addressBook/person/1</us>,
+ * 		<ua>addressBookUri</ua>=<us>http://sample/addressBook</us>,
+ * 		<ua>birthDate</ua>=<us>1946-08-12T00:00:00Z</us>,
+ * 		<ua>otherIds</ua>=<uk>null</uk>,
+ * 		<ua>addresses</ua>=@(
  * 			(
- * 				<xa>uri</xa>=<xs>http://sample/addressBook/address/1</xs>,
- * 				<xa>personUri</xa>=<xs>http://sample/addressBook/person/1</xs>,
- * 				<xa>id</xa>=<xs>1</xs>,
- * 				<xa>street</xa>=<xs>100+Main+Street</xs>,
- * 				<xa>city</xa>=<xs>Anywhereville</xs>,
- * 				<xa>state</xa>=<xs>NY</xs>,
- * 				<xa>zip</xa>=<xs>12345</xs>,
- * 				<xa>isCurrent</xa>=<xs>true</xs>
+ * 				<ua>uri</ua>=<us>http://sample/addressBook/address/1</us>,
+ * 				<ua>personUri</ua>=<us>http://sample/addressBook/person/1</us>,
+ * 				<ua>id</ua>=<un>1</un>,
+ * 				<ua>street</ua>=<us>'100+Main+Street'</us>,
+ * 				<ua>city</ua>=<us>Anywhereville</us>,
+ * 				<ua>state</ua>=<us>NY</us>,
+ * 				<ua>zip</ua>=<un>12345</un>,
+ * 				<ua>isCurrent</ua>=<uk>true</uk>
  * 			)
  * 		)
  * 	)
@@ -127,13 +101,9 @@ import org.apache.juneau.transform.*;
  * 	Map m = <jk>new</jk> ObjectMap(<js>"{a:'b',c:1,d:false,e:['f',1,false],g:{h:'i'}}"</js>);
  *
  * 	<jc>// Serialize to value equivalent to JSON.</jc>
- * 	<jc>// Produces "$o(a=b,c=$n(1),d=$b(false),e=$a(f,$n(1),$b(false)),g=$o(h=i))"</jc>
+ * 	<jc>// Produces "(a=b,c=1,d=false,e=@(f,1,false),g=(h=i))"</jc>
  * 	String s = UonSerializer.<jsf>DEFAULT</jsf>.serialize(s);
  *
- * 	<jc>// Serialize to simplified value (for when data type is already known by receiver).</jc>
- * 	<jc>// Produces "(a=b,c=1,d=false,e=(f,1,false),g=(h=i))"</jc>
- * 	String s = UonSerializer.<jsf>DEFAULT_SIMPLE</jsf>.serialize(s);
- *
  * 	<jc>// Serialize a bean</jc>
  * 	<jk>public class</jk> Person {
  * 		<jk>public</jk> Person(String s);
@@ -152,11 +122,8 @@ import org.apache.juneau.transform.*;
  *
  * 	Person p = <jk>new</jk> Person(<js>"John Doe"</js>, 23, <js>"123 Main St"</js>, <js>"Anywhere"</js>, <js>"NY"</js>, 12345, <jk>false</jk>);
  *
- * 	<jc>// Produces "$o(name=John Doe,age=23,address=$o(street=123 Main St,city=Anywhere,state=NY,zip=$n(12345)),deceased=$b(false))"</jc>
+ * 	<jc>// Produces "(name='John Doe',age=23,address=(street='123 Main St',city=Anywhere,state=NY,zip=12345),deceased=false)"</jc>
  * 	String s = UonSerializer.<jsf>DEFAULT</jsf>.serialize(s);
- *
- * 	<jc>// Produces "(name=John Doe,age=23,address=(street=123 Main St,city=Anywhere,state=NY,zip=12345),deceased=false)"</jc>
- * 	String s = UonSerializer.<jsf>DEFAULT_SIMPLE</jsf>.serialize(s);
  * </p>
  */
 @Produces("text/uon")
@@ -165,29 +132,12 @@ public class UonSerializer extends WriterSerializer {
 	/** Reusable instance of {@link UonSerializer}, all default settings. */
 	public static final UonSerializer DEFAULT = new UonSerializer().lock();
 
-	/** Reusable instance of {@link UonSerializer.Simple}. */
-	public static final UonSerializer DEFAULT_SIMPLE = new Simple().lock();
-
 	/** Reusable instance of {@link UonSerializer.Readable}. */
 	public static final UonSerializer DEFAULT_READABLE = new Readable().lock();
 
 	/** Reusable instance of {@link UonSerializer.Encoding}. */
 	public static final UonSerializer DEFAULT_ENCODING = new Encoding().lock();
 
-	/** Reusable instance of {@link UonSerializer.SimpleEncoding}. */
-	public static final UonSerializer DEFAULT_SIMPLE_ENCODING = new SimpleEncoding().lock();
-
-	/**
-	 * Equivalent to <code><jk>new</jk> UonSerializer().setSimpleMode(<jk>true</jk>);</code>.
-	 */
-	@Produces(value="text/uon-simple",contentType="text/uon")
-	public static class Simple extends UonSerializer {
-		/** Constructor */
-		public Simple() {
-			setSimpleMode(true);
-		}
-	}
-
 	/**
 	 * Equivalent to <code><jk>new</jk> UonSerializer().setUseWhitespace(<jk>true</jk>).setUseIndentation(<jk>true</jk>);</code>.
 	 */
@@ -195,7 +145,6 @@ public class UonSerializer extends WriterSerializer {
 		/** Constructor */
 		public Readable() {
 			setUseWhitespace(true);
-			setUseIndentation(true);
 		}
 	}
 
@@ -210,19 +159,6 @@ public class UonSerializer extends WriterSerializer {
 	}
 
 	/**
-	 * Equivalent to <code><jk>new</jk> UonSerializer().setSimpleMode(<jk>true</jk>).setEncodeChars(<jk>true</jk>);</code>.
-	 */
-	@Produces(value="text/uon-simple",contentType="text/uon")
-	public static class SimpleEncoding extends UonSerializer {
-		/** Constructor */
-		public SimpleEncoding() {
-			setSimpleMode(true);
-			setEncodeChars(true);
-		}
-	}
-
-
-	/**
 	 * Workhorse method. Determines the type of object, and then calls the
 	 * appropriate type-specific serialization method.
 	 * @param session The context that exist for the duration of a serialize.
@@ -231,25 +167,22 @@ public class UonSerializer extends WriterSerializer {
 	 * @param eType The expected type of the object if this is a bean property.
 	 * @param attrName The bean property name if this is a bean property.  <jk>null</jk> if this isn't a bean property being serialized.
 	 * @param pMeta The bean property metadata.
-	 * @param quoteEmptyStrings <jk>true</jk> if this is the first entry in an array.
-	 * @param isTop If we haven't recursively called this method.
 	 *
 	 * @return The same writer passed in.
 	 * @throws Exception
 	 */
 	@SuppressWarnings({ "rawtypes", "unchecked" })
 	protected SerializerWriter serializeAnything(UonSerializerSession session, UonWriter out, Object o, ClassMeta<?> eType,
-			String attrName, BeanPropertyMeta pMeta, boolean quoteEmptyStrings, boolean isTop) throws Exception {
+			String attrName, BeanPropertyMeta pMeta) throws Exception {
 
 		if (o == null) {
-			out.appendObject(null, false, false, isTop);
+			out.appendObject(null, false);
 			return out;
 		}
 
 		if (eType == null)
 			eType = object();
 
-		boolean addTypeProperty;		// Add "_type" attribute to element?
 		ClassMeta<?> aType;			// The actual type
 		ClassMeta<?> sType;			// The serialized type
 
@@ -263,7 +196,7 @@ public class UonSerializer extends WriterSerializer {
 		}
 
 		sType = aType.getSerializedClassMeta();
-		addTypeProperty = (session.isAddBeanTypeProperties() && ! eType.equals(aType));
+		String typeName = session.getBeanTypeName(eType, aType, pMeta);
 
 		// Swap if necessary
 		PojoSwap swap = aType.getPojoSwap();
@@ -278,14 +211,18 @@ public class UonSerializer extends WriterSerializer {
 
 		// '\0' characters are considered null.
 		if (o == null || (sType.isChar() && ((Character)o).charValue() == 0))
-			out.appendObject(null, false, false, isTop);
+			out.appendObject(null, false);
+		else if (sType.isBoolean())
+			out.appendBoolean(o);
+		else if (sType.isNumber())
+			out.appendNumber(o);
 		else if (sType.isBean())
-			serializeBeanMap(session, out, session.toBeanMap(o), addTypeProperty);
+			serializeBeanMap(session, out, session.toBeanMap(o), typeName);
 		else if (sType.isUri() || (pMeta != null && pMeta.isUri()))
-			out.appendUri(o, isTop);
+			out.appendUri(o);
 		else if (sType.isMap()) {
 			if (o instanceof BeanMap)
-				serializeBeanMap(session, out, (BeanMap)o, addTypeProperty);
+				serializeBeanMap(session, out, (BeanMap)o, typeName);
 			else
 				serializeMap(session, out, (Map)o, eType);
 		}
@@ -296,7 +233,7 @@ public class UonSerializer extends WriterSerializer {
 			serializeCollection(session, out, toList(sType.getInnerClass(), o), eType);
 		}
 		else {
-			out.appendObject(o, quoteEmptyStrings, false, isTop);
+			out.appendObject(o, false);
 		}
 
 		if (! isRecursion)
@@ -312,7 +249,7 @@ public class UonSerializer extends WriterSerializer {
 		ClassMeta<?> keyType = type.getKeyType(), valueType = type.getValueType();
 
 		int depth = session.getIndent();
-		out.startFlag('o');
+		out.append('(');
 
 		Iterator mapEntries = m.entrySet().iterator();
 
@@ -320,8 +257,8 @@ public class UonSerializer extends WriterSerializer {
 			Map.Entry e = (Map.Entry) mapEntries.next();
 			Object value = e.getValue();
 			Object key = session.generalize(e.getKey(), keyType);
-			out.cr(depth).appendObject(key, session.isUseWhitespace(), false, false).append('=');
-			serializeAnything(session, out, value, valueType, (key == null ? null : session.toString(key)), null, session.isUseWhitespace(), false);
+			out.cr(depth).appendObject(key, false).append('=');
+			serializeAnything(session, out, value, valueType, (key == null ? null : session.toString(key)), null);
 			if (mapEntries.hasNext())
 				out.append(',');
 		}
@@ -333,14 +270,14 @@ public class UonSerializer extends WriterSerializer {
 		return out;
 	}
 
-	private SerializerWriter serializeBeanMap(UonSerializerSession session, UonWriter out, BeanMap<?> m, boolean addTypeProperty) throws Exception {
+	private SerializerWriter serializeBeanMap(UonSerializerSession session, UonWriter out, BeanMap<?> m, String typeName) throws Exception {
 		int depth = session.getIndent();
 
-		out.startFlag('o');
+		out.append('(');
 
 		boolean addComma = false;
 
-		for (BeanPropertyValue p : m.getValues(session.isTrimNulls(), addTypeProperty ? session.createBeanTypeNameProperty(m) : null)) {
+		for (BeanPropertyValue p : m.getValues(session.isTrimNulls(), typeName != null ? session.createBeanTypeNameProperty(m, typeName) : null)) {
 			BeanPropertyMeta pMeta = p.getMeta();
 			ClassMeta<?> cMeta = p.getClassMeta();
 
@@ -356,9 +293,9 @@ public class UonSerializer extends WriterSerializer {
 			if (addComma)
 				out.append(',');
 
-			out.cr(depth).appendObject(key, false, false, false).append('=');
+			out.cr(depth).appendObject(key, false).append('=');
 
-			serializeAnything(session, out, value, cMeta, key, pMeta, false, false);
+			serializeAnything(session, out, value, cMeta, key, pMeta);
 
 			addComma = true;
 		}
@@ -377,14 +314,13 @@ public class UonSerializer extends WriterSerializer {
 
 		c = session.sort(c);
 
-		out.startFlag('a');
+		out.append('@').append('(');
 
 		int depth = session.getIndent();
-		boolean quoteEmptyString = (c.size() == 1 || session.isUseWhitespace());
 
 		for (Iterator i = c.iterator(); i.hasNext();) {
 			out.cr(depth);
-			serializeAnything(session, out, i.next(), elementType, "<iterator>", null, quoteEmptyString, false);
+			serializeAnything(session, out, i.next(), elementType, "<iterator>", null);
 			if (i.hasNext())
 				out.append(',');
 		}
@@ -409,7 +345,7 @@ public class UonSerializer extends WriterSerializer {
 	@Override /* Serializer */
 	protected void doSerialize(SerializerSession session, Object o) throws Exception {
 		UonSerializerSession s = (UonSerializerSession)session;
-		serializeAnything(s, s.getWriter(), o, null, "root", null, false, true);
+		serializeAnything(s, s.getWriter(), o, null, "root", null);
 	}
 
 
@@ -418,106 +354,6 @@ public class UonSerializer extends WriterSerializer {
 	//--------------------------------------------------------------------------------
 
 	/**
-	 * <b>Configuration property:</b>  Use simplified output.
-	 * <p>
-	 * <ul>
-	 * 	<li><b>Name:</b> <js>"UonSerializer.simpleMode"</js>
-	 * 	<li><b>Data type:</b> <code>Boolean</code>
-	 * 	<li><b>Default:</b> <jk>false</jk>
-	 * 	<li><b>Session-overridable:</b> <jk>true</jk>
-	 * </ul>
-	 * <p>
-	 * If <jk>true</jk>, type flags will not be prepended to values in most cases.
-	 * <p>
-	 * Use this setting if the data types of the values (e.g. object/array/boolean/number/string)
-	 * 	is known on the receiving end.
-	 * <p>
-	 * It should be noted that the default behavior produces a data structure that can
-	 * 	be losslessly converted into JSON, and any JSON can be losslessly represented
-	 * 	in a URL-encoded value.  However, this strict equivalency does not exist
-	 * 	when simple mode is used.
-	 * <p>
-	 * <table class='styled'>
-	 * 	<tr>
-	 * 		<th>Input (in JSON)</th>
-	 * 		<th>Normal mode output</th>
-	 * 		<th>Simple mode output</th>
-	 * 	</tr>
-	 * 	<tr>
-	 * 		<td class='code'>{foo:'bar',baz:'bing'}</td>
-	 * 		<td class='code'>$o(foo=bar,baz=bing)</td>
-	 * 		<td class='code'>(foo=bar,baz=bing)</td>
-	 * 	</tr>
-	 * 	<tr>
-	 * 		<td class='code'>{foo:{bar:'baz'}}</td>
-	 * 		<td class='code'>$o(foo=$o(bar=baz))</td>
-	 * 		<td class='code'>(foo=(bar=baz))</td>
-	 * 	</tr>
-	 * 	<tr>
-	 * 		<td class='code'>['foo','bar']</td>
-	 * 		<td class='code'>$a(foo,bar)</td>
-	 * 		<td class='code'>(foo,bar)</td>
-	 * 	</tr>
-	 * 	<tr>
-	 * 		<td class='code'>['foo',['bar','baz']]</td>
-	 * 		<td class='code'>$a(foo,$a(bar,baz))</td>
-	 * 		<td class='code'>(foo,(bar,baz))</td>
-	 * 	</tr>
-	 * 	<tr>
-	 * 		<td class='code'>true</td>
-	 * 		<td class='code'>$b(true)</td>
-	 * 		<td class='code'>true</td>
-	 * 	</tr>
-	 * 	<tr>
-	 * 		<td class='code'>123</td>
-	 * 		<td class='code'>$n(123)</td>
-	 * 		<td class='code'>123</td>
-	 * 	</tr>
-	 * </table>
-	 * <p>
-	 * <h5 class='section'>Notes:</h5>
-	 * <ul>
-	 * 	<li>This is equivalent to calling <code>setProperty(<jsf>UON_simpleMode</jsf>, value)</code>.
-	 * 	<li>This introduces a slight performance penalty.
-	 * </ul>
-	 *
-	 * @param value The new value for this property.
-	 * @return This object (for method chaining).
-	 * @throws LockedException If {@link #lock()} was called on this class.
-	 * @see UonSerializerContext#UON_simpleMode
-	 */
-	public UonSerializer setSimpleMode(boolean value) throws LockedException {
-		return setProperty(UON_simpleMode, value);
-	}
-
-	/**
-	 * <b>Configuration property:</b>  Use whitespace.
-	 * <p>
-	 * <ul>
-	 * 	<li><b>Name:</b> <js>"UonSerializer.useWhitespace"</js>
-	 * 	<li><b>Data type:</b> <code>Boolean</code>
-	 * 	<li><b>Default:</b> <jk>false</jk>
-	 * 	<li><b>Session-overridable:</b> <jk>true</jk>
-	 * </ul>
-	 * <p>
-	 * If <jk>true</jk>, whitespace is added to the output to improve readability.
-	 * <p>
-	 * <h5 class='section'>Notes:</h5>
-	 * <ul>
-	 * 	<li>This is equivalent to calling <code>setProperty(<jsf>UON_useWhitespace</jsf>, value)</code>.
-	 * 	<li>This introduces a slight performance penalty.
-	 * </ul>
-	 *
-	 * @param value The new value for this property.
-	 * @return This object (for method chaining).
-	 * @throws LockedException If {@link #lock()} was called on this class.
-	 * @see UonSerializerContext#UON_useWhitespace
-	 */
-	public UonSerializer setUseWhitespace(boolean value) throws LockedException {
-		return setProperty(UON_useWhitespace, value);
-	}
-
-	/**
 	 * <b>Configuration property:</b>  Encode non-valid URI characters.
 	 * <p>
 	 * <ul>
@@ -573,8 +409,8 @@ public class UonSerializer extends WriterSerializer {
 	}
 
 	@Override /* Serializer */
-	public UonSerializer setUseIndentation(boolean value) throws LockedException {
-		super.setUseIndentation(value);
+	public UonSerializer setUseWhitespace(boolean value) throws LockedException {
+		super.setUseWhitespace(value);
 		return this;
 	}
 

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/097b8103/juneau-core/src/main/java/org/apache/juneau/urlencoding/UonSerializerContext.java
----------------------------------------------------------------------
diff --git a/juneau-core/src/main/java/org/apache/juneau/urlencoding/UonSerializerContext.java b/juneau-core/src/main/java/org/apache/juneau/urlencoding/UonSerializerContext.java
index db0cb2f..65867a5 100644
--- a/juneau-core/src/main/java/org/apache/juneau/urlencoding/UonSerializerContext.java
+++ b/juneau-core/src/main/java/org/apache/juneau/urlencoding/UonSerializerContext.java
@@ -34,80 +34,6 @@ import org.apache.juneau.serializer.*;
 public class UonSerializerContext extends SerializerContext {
 
 	/**
-	 * <b>Configuration property:</b>  Use simplified output.
-	 * <p>
-	 * <ul>
-	 * 	<li><b>Name:</b> <js>"UonSerializer.simpleMode"</js>
-	 * 	<li><b>Data type:</b> <code>Boolean</code>
-	 * 	<li><b>Default:</b> <jk>false</jk>
-	 * 	<li><b>Session-overridable:</b> <jk>true</jk>
-	 * </ul>
-	 * <p>
-	 * If <jk>true</jk>, type flags will not be prepended to values in most cases.
-	 * <p>
-	 * Use this setting if the data types of the values (e.g. object/array/boolean/number/string)
-	 * 	is known on the receiving end.
-	 * <p>
-	 * It should be noted that the default behavior produces a data structure that can
-	 * 	be losslessly converted into JSON, and any JSON can be losslessly represented
-	 * 	in a URL-encoded value.  However, this strict equivalency does not exist
-	 * 	when simple mode is used.
-	 * <p>
-	 * <table class='styled'>
-	 * 	<tr>
-	 * 		<th>Input (in JSON)</th>
-	 * 		<th>Normal mode output</th>
-	 * 		<th>Simple mode output</th>
-	 * 	</tr>
-	 * 	<tr>
-	 * 		<td class='code'>{foo:'bar',baz:'bing'}</td>
-	 * 		<td class='code'>$o(foo=bar,baz=bing)</td>
-	 * 		<td class='code'>(foo=bar,baz=bing)</td>
-	 * 	</tr>
-	 * 	<tr>
-	 * 		<td class='code'>{foo:{bar:'baz'}}</td>
-	 * 		<td class='code'>$o(foo=$o(bar=baz))</td>
-	 * 		<td class='code'>(foo=(bar=baz))</td>
-	 * 	</tr>
-	 * 	<tr>
-	 * 		<td class='code'>['foo','bar']</td>
-	 * 		<td class='code'>$a(foo,bar)</td>
-	 * 		<td class='code'>(foo,bar)</td>
-	 * 	</tr>
-	 * 	<tr>
-	 * 		<td class='code'>['foo',['bar','baz']]</td>
-	 * 		<td class='code'>$a(foo,$a(bar,baz))</td>
-	 * 		<td class='code'>(foo,(bar,baz))</td>
-	 * 	</tr>
-	 * 	<tr>
-	 * 		<td class='code'>true</td>
-	 * 		<td class='code'>$b(true)</td>
-	 * 		<td class='code'>true</td>
-	 * 	</tr>
-	 * 	<tr>
-	 * 		<td class='code'>123</td>
-	 * 		<td class='code'>$n(123)</td>
-	 * 		<td class='code'>123</td>
-	 * 	</tr>
-	 * </table>
-	 */
-	public static final String UON_simpleMode = "UonSerializer.simpleMode";
-
-	/**
-	 * <b>Configuration property:</b>  Use whitespace.
-	 * <p>
-	 * <ul>
-	 * 	<li><b>Name:</b> <js>"UonSerializer.useWhitespace"</js>
-	 * 	<li><b>Data type:</b> <code>Boolean</code>
-	 * 	<li><b>Default:</b> <jk>false</jk>
-	 * 	<li><b>Session-overridable:</b> <jk>true</jk>
-	 * </ul>
-	 * <p>
-	 * If <jk>true</jk>, whitespace is added to the output to improve readability.
-	 */
-	public static final String UON_useWhitespace = "UonSerializer.useWhitespace";
-
-	/**
 	 * <b>Configuration property:</b>  Encode non-valid URI characters.
 	 * <p>
 	 * <ul>
@@ -127,8 +53,6 @@ public class UonSerializerContext extends SerializerContext {
 
 
 	final boolean
-		simpleMode,
-		useWhitespace,
 		encodeChars;
 
 	/**
@@ -140,8 +64,6 @@ public class UonSerializerContext extends SerializerContext {
 	 */
 	public UonSerializerContext(ContextFactory cf) {
 		super(cf);
-		simpleMode = cf.getProperty(UON_simpleMode, boolean.class, false);
-		useWhitespace = cf.getProperty(UON_useWhitespace, boolean.class, false);
 		encodeChars = cf.getProperty(UON_encodeChars, boolean.class, false);
 	}
 
@@ -149,8 +71,6 @@ public class UonSerializerContext extends SerializerContext {
 	public ObjectMap asMap() {
 		return super.asMap()
 			.append("UonSerializerContext", new ObjectMap()
-				.append("simpleMode", simpleMode)
-				.append("useWhitespace", useWhitespace)
 				.append("encodeChars", encodeChars)
 			);
 	}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/097b8103/juneau-core/src/main/java/org/apache/juneau/urlencoding/UonSerializerSession.java
----------------------------------------------------------------------
diff --git a/juneau-core/src/main/java/org/apache/juneau/urlencoding/UonSerializerSession.java b/juneau-core/src/main/java/org/apache/juneau/urlencoding/UonSerializerSession.java
index f758b99..b10f68e 100644
--- a/juneau-core/src/main/java/org/apache/juneau/urlencoding/UonSerializerSession.java
+++ b/juneau-core/src/main/java/org/apache/juneau/urlencoding/UonSerializerSession.java
@@ -28,7 +28,7 @@ import org.apache.juneau.serializer.*;
  */
 public class UonSerializerSession extends SerializerSession {
 
-	private final boolean simpleMode, useWhitespace, encodeChars;
+	private final boolean encodeChars;
 
 	/**
 	 * Create a new session using properties specified in the context.
@@ -48,12 +48,8 @@ public class UonSerializerSession extends SerializerSession {
 	protected UonSerializerSession(UonSerializerContext ctx, ObjectMap op, Object output, Method javaMethod, Locale locale, TimeZone timeZone, MediaType mediaType) {
 		super(ctx, op, output, javaMethod, locale, timeZone, mediaType);
 		if (op == null || op.isEmpty()) {
-			simpleMode = ctx.simpleMode;
-			useWhitespace = ctx.useWhitespace;
 			encodeChars = ctx.encodeChars;
 		} else {
-			simpleMode = op.getBoolean(UON_simpleMode, ctx.simpleMode);
-			useWhitespace = op.getBoolean(UON_useWhitespace, ctx.useWhitespace);
 			encodeChars = op.getBoolean(UON_encodeChars, ctx.encodeChars);
 		}
 	}
@@ -63,25 +59,7 @@ public class UonSerializerSession extends SerializerSession {
 		Object output = getOutput();
 		if (output instanceof UonWriter)
 			return (UonWriter)output;
-		return new UonWriter(this, super.getWriter(), useWhitespace, isSimpleMode(), isEncodeChars(), isTrimStrings(), getRelativeUriBase(), getAbsolutePathUriBase());
-	}
-
-	/**
-	 * Returns the {@link UonSerializerContext#UON_useWhitespace} setting value for this session.
-	 *
-	 * @return The {@link UonSerializerContext#UON_useWhitespace} setting value for this session.
-	 */
-	public final boolean isUseWhitespace() {
-		return useWhitespace;
-	}
-
-	/**
-	 * Returns the {@link UonSerializerContext#UON_simpleMode} setting value for this session.
-	 *
-	 * @return The {@link UonSerializerContext#UON_simpleMode} setting value for this session.
-	 */
-	public final boolean isSimpleMode() {
-		return simpleMode;
+		return new UonWriter(this, super.getWriter(), isUseWhitespace(), isEncodeChars(), isTrimStrings(), getRelativeUriBase(), getAbsolutePathUriBase());
 	}
 
 	/**

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/097b8103/juneau-core/src/main/java/org/apache/juneau/urlencoding/UonWriter.java
----------------------------------------------------------------------
diff --git a/juneau-core/src/main/java/org/apache/juneau/urlencoding/UonWriter.java b/juneau-core/src/main/java/org/apache/juneau/urlencoding/UonWriter.java
index 7025620..bfbe5e0 100644
--- a/juneau-core/src/main/java/org/apache/juneau/urlencoding/UonWriter.java
+++ b/juneau-core/src/main/java/org/apache/juneau/urlencoding/UonWriter.java
@@ -28,7 +28,7 @@ import org.apache.juneau.serializer.*;
 public final class UonWriter extends SerializerWriter {
 
 	private final UonSerializerSession session;
-	private final boolean simpleMode, encodeChars;
+	private final boolean encodeChars;
 
 	// Characters that do not need to be URL-encoded in strings.
 	private static final AsciiSet unencodedChars = new AsciiSet("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789;/?:@-_.!*'$(),~=");
@@ -38,10 +38,11 @@ public final class UonWriter extends SerializerWriter {
 	private static final AsciiSet unencodedCharsAttrName = new AsciiSet("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789;/?:@-_.!*'$(),~");
 
 	// Characters that need to be preceeded with an escape character.
-	private static final AsciiSet escapedChars = new AsciiSet(",()~=");
+	private static final AsciiSet escapedChars = new AsciiSet("~'");
 
-	// AsciiSet that maps no characters.
-	private static final AsciiSet emptyCharSet = new AsciiSet("");
+	private static final AsciiSet needsQuoteChars = new AsciiSet("),=\n\t\r\b\f ");
+
+	private static final AsciiSet maybeNeedsQuotesFirstChar = new AsciiSet("),=\n\t\r\b\f tfn+-.#0123456789");
 
 	private static char[] hexArray = "0123456789ABCDEF".toCharArray();
 
@@ -50,17 +51,15 @@ public final class UonWriter extends SerializerWriter {
 	 *
 	 * @param session The session that created this writer.
 	 * @param out The writer being wrapped.
-	 * @param useIndentation If <jk>true</jk>, tabs will be used in output.
-	 * @param simpleMode If <jk>true</jk>, type flags will not be generated in output.
+	 * @param useWhitespace If <jk>true</jk>, tabs will be used in output.
 	 * @param encodeChars If <jk>true</jk>, special characters should be encoded.
 	 * @param trimStrings If <jk>true</jk>, strings should be trimmed before they're serialized.
 	 * @param relativeUriBase The base (e.g. <js>https://localhost:9443/contextPath"</js>) for relative URIs (e.g. <js>"my/path"</js>).
 	 * @param absolutePathUriBase The base (e.g. <js>https://localhost:9443"</js>) for relative URIs with absolute paths (e.g. <js>"/contextPath/my/path"</js>).
 	 */
-	protected UonWriter(UonSerializerSession session, Writer out, boolean useIndentation, boolean simpleMode, boolean encodeChars, boolean trimStrings, String relativeUriBase, String absolutePathUriBase) {
-		super(out, useIndentation, false, trimStrings, '\'', relativeUriBase, absolutePathUriBase);
+	protected UonWriter(UonSerializerSession session, Writer out, boolean useWhitespace, boolean encodeChars, boolean trimStrings, String relativeUriBase, String absolutePathUriBase) {
+		super(out, useWhitespace, trimStrings, '\'', relativeUriBase, absolutePathUriBase);
 		this.session = session;
-		this.simpleMode = simpleMode;
 		this.encodeChars = encodeChars;
 	}
 
@@ -68,46 +67,43 @@ public final class UonWriter extends SerializerWriter {
 	 * Serializes the specified simple object as a UON string value.
 	 *
 	 * @param o The object being serialized.
-	 * @param quoteEmptyStrings Special case where we're serializing an array containing an empty string.
 	 * @param isTopAttrName If this is a top-level attribute name we're serializing.
-	 * @param isTop If this is a top-level value we're serializing.
 	 * @return This object (for method chaining).
 	 * @throws IOException Should never happen.
 	 */
-	protected UonWriter appendObject(Object o, boolean quoteEmptyStrings, boolean isTopAttrName, boolean isTop) throws IOException {
-
-		char typeFlag = 0;
+	protected UonWriter appendObject(Object o, boolean isTopAttrName) throws IOException {
 
+		if (o instanceof Boolean)
+			return appendBoolean(o);
+		if (o instanceof Number)
+			return appendNumber(o);
 		if (o == null)
-			o = "\u0000";
-		else if (o.equals("\u0000"))
-			typeFlag = 's';
+			return append("null");
 
 		String s = session.toString(o);
-//		if (trimStrings)
-//			s = s.trim();
-		if (s.isEmpty()) {
-			if (quoteEmptyStrings)
-				typeFlag = 's';
-		} else if (s.charAt(0) == '(' || s.charAt(0) == '$') {
-			typeFlag = 's';
-		} else if (useIndentation && (s.indexOf('\n') != -1 || (s.charAt(0) <= ' ' && s.charAt(0) != 0))) {
-			// Strings containing newline characters must always be quoted so that they're not confused with whitespace.
-			// Also, strings starting with whitespace must be quoted so that the contents are not ignored when whitespace is ignored.
-			typeFlag = 's';
-		} else if (! simpleMode) {
-			if (o instanceof Boolean)
-				typeFlag = 'b';
-			else if (o instanceof Number)
-				typeFlag = 'n';
-		}
-
-		if (typeFlag != 0)
-			startFlag(typeFlag);
+		char c0 = s.isEmpty() ? 0 : s.charAt(0);
+
+		boolean needsQuotes =
+			s.isEmpty()
+			|| c0 == '@'
+			|| c0 == '('
+			|| needsQuoteChars.contains(s)
+			|| (
+				maybeNeedsQuotesFirstChar.contains(c0)
+				&& (
+					"true".equals(s)
+					|| "false".equals(s)
+					|| "null".equals(s)
+					|| StringUtils.isNumeric(s)
+				)
+			)
+		;
 
 		AsciiSet unenc = (isTopAttrName ? unencodedCharsAttrName : unencodedChars);
-		AsciiSet esc = (isTop && typeFlag == 0 ? emptyCharSet : escapedChars);
+		AsciiSet esc = escapedChars;
 
+		if (needsQuotes)
+			append('\'');
 		for (int i = 0; i < s.length(); i++) {
 			char c = s.charAt(i);
 			if (esc.contains(c))
@@ -135,24 +131,33 @@ public final class UonWriter extends SerializerWriter {
 				}
 			}
 		}
+		if (needsQuotes)
+			append('\'');
 
-		if (typeFlag != 0)
-			append(')');
+		return this;
+	}
 
+	/**
+	 * Appends a boolean value to the output.
+	 *
+	 * @param o The boolean value to append to the output.
+	 * @return This object (for method chaining).
+	 * @throws IOException
+	 */
+	protected UonWriter appendBoolean(Object o) throws IOException {
+		append(o.toString());
 		return this;
 	}
 
 	/**
-	 * Prints <code>$f(</code> in normal mode, and <code>(</code> in simple mode.
+	 * Appends a numeric value to the output.
 	 *
-	 * @param f The flag character.
+	 * @param o The numeric value to append to the output.
 	 * @return This object (for method chaining).
 	 * @throws IOException
 	 */
-	protected UonWriter startFlag(char f) throws IOException {
-		if (f != 's' && ! simpleMode)
-			append('$').append(f);
-		append('(');
+	protected UonWriter appendNumber(Object o) throws IOException {
+		append(o.toString());
 		return this;
 	}
 
@@ -170,11 +175,11 @@ public final class UonWriter extends SerializerWriter {
 	 * Appends a URI to the output.
 	 *
 	 * @param uri The URI to append to the output.
-	 * @param isTop If this is a top-level value we're serializing.
 	 * @return This object (for method chaining).
 	 * @throws IOException
 	 */
-	public SerializerWriter appendUri(Object uri, boolean isTop) throws IOException {
+	@Override
+	public SerializerWriter appendUri(Object uri) throws IOException {
 		String s = uri.toString();
 		if (s.indexOf("://") == -1) {
 			if (StringUtils.startsWith(s, '/')) {
@@ -185,11 +190,10 @@ public final class UonWriter extends SerializerWriter {
 					append(relativeUriBase);
 					if (! relativeUriBase.equals("/"))
 						append("/");
-
 				}
 			}
 		}
-		return appendObject(s, false, false, isTop);
+		return appendObject(s, false);
 	}
 
 

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/097b8103/juneau-core/src/main/java/org/apache/juneau/urlencoding/UrlEncodingParser.java
----------------------------------------------------------------------
diff --git a/juneau-core/src/main/java/org/apache/juneau/urlencoding/UrlEncodingParser.java b/juneau-core/src/main/java/org/apache/juneau/urlencoding/UrlEncodingParser.java
index 460e919..99e28d1 100644
--- a/juneau-core/src/main/java/org/apache/juneau/urlencoding/UrlEncodingParser.java
+++ b/juneau-core/src/main/java/org/apache/juneau/urlencoding/UrlEncodingParser.java
@@ -53,9 +53,6 @@ public class UrlEncodingParser extends UonParser {
 	/** Reusable instance of {@link UrlEncodingParser}. */
 	public static final UrlEncodingParser DEFAULT = new UrlEncodingParser().lock();
 
-	/** Reusable instance of {@link UrlEncodingParser}. */
-	public static final UrlEncodingParser DEFAULT_WS_AWARE = new UrlEncodingParser().setWhitespaceAware(true).lock();
-
 	/**
 	 * Constructor.
 	 */
@@ -69,9 +66,8 @@ public class UrlEncodingParser extends UonParser {
 			eType = (ClassMeta<T>)object();
 		PojoSwap<T,Object> transform = (PojoSwap<T,Object>)eType.getPojoSwap();
 		ClassMeta<?> sType = eType.getSerializedClassMeta();
-		BeanRegistry breg = session.getBeanRegistry();
 
-		int c = r.peek();
+		int c = r.peekSkipWs();
 		if (c == '?')
 			r.read();
 
@@ -83,7 +79,7 @@ public class UrlEncodingParser extends UonParser {
 			if (m.containsKey("_value"))
 				o = m.get("_value");
 			else
-				o = breg.cast(m);
+				o = session.cast(m, null, eType);
 		} else if (sType.isMap()) {
 			Map m = (sType.canCreateNewInstance() ? (Map)sType.newInstance() : new ObjectMap(session));
 			o = parseIntoMap(session, r, m, sType.getKeyType(), sType.getValueType());
@@ -97,7 +93,7 @@ public class UrlEncodingParser extends UonParser {
 			ClassMeta<Object> valueType = object();
 			parseIntoMap(session, r, m, string(), valueType);
 			if (m.containsKey(session.getBeanTypePropertyName()))
-				o = breg.cast(m);
+				o = session.cast(m, null, eType);
 			else if (m.containsKey("_value"))
 				o = session.convertToType(m.get("_value"), sType);
 			else if (sType.isCollection()) {
@@ -132,7 +128,7 @@ public class UrlEncodingParser extends UonParser {
 		if (keyType == null)
 			keyType = (ClassMeta<K>)string();
 
-		int c = r.peek();
+		int c = r.peekSkipWs();
 		if (c == -1)
 			return m;
 
@@ -152,7 +148,7 @@ public class UrlEncodingParser extends UonParser {
 						return m;
 					r.unread();
 					Object attr = parseAttr(session, r, true);
-					currAttr = session.trim(session.convertToType(attr, keyType));
+					currAttr = attr == null ? null : convertAttrToType(session, m, session.trim(attr.toString()), keyType);
 					state = S2;
 					c = 0; // Avoid isInEscape if c was '\'
 				} else if (state == S2) {
@@ -213,7 +209,7 @@ public class UrlEncodingParser extends UonParser {
 
 	private <T> BeanMap<T> parseIntoBeanMap(UrlEncodingParserSession session, ParserReader r, BeanMap<T> m) throws Exception {
 
-		int c = r.peek();
+		int c = r.peekSkipWs();
 		if (c == -1)
 			return m;
 
@@ -254,11 +250,7 @@ public class UrlEncodingParser extends UonParser {
 						if (! currAttr.equals(session.getBeanTypePropertyName())) {
 							BeanPropertyMeta pMeta = m.getPropertyMeta(currAttr);
 							if (pMeta == null) {
-								if (m.getMeta().isSubTyped()) {
-									m.put(currAttr, "");
-								} else {
-									onUnknownProperty(session, currAttr, m, currAttrLine, currAttrCol);
-								}
+								onUnknownProperty(session, currAttr, m, currAttrLine, currAttrCol);
 							} else {
 								session.setCurrentProperty(pMeta);
 								// In cases of "&foo=", create an empty instance of the value if createable.
@@ -276,13 +268,8 @@ public class UrlEncodingParser extends UonParser {
 						if (! currAttr.equals(session.getBeanTypePropertyName())) {
 							BeanPropertyMeta pMeta = m.getPropertyMeta(currAttr);
 							if (pMeta == null) {
-								if (m.getMeta().isSubTyped()) {
-									Object value = parseAnything(session, object(), r.unread(), m.getBean(false), true, null);
-									m.put(currAttr, value);
-								} else {
-									onUnknownProperty(session, currAttr, m, currAttrLine, currAttrCol);
-									parseAnything(session, object(), r.unread(), m.getBean(false), true, null); // Read content anyway to ignore it
-								}
+								onUnknownProperty(session, currAttr, m, currAttrLine, currAttrCol);
+								parseAnything(session, object(), r.unread(), m.getBean(false), true, null); // Read content anyway to ignore it
 							} else {
 								session.setCurrentProperty(pMeta);
 								if (session.shouldUseExpandedParams(pMeta)) {
@@ -345,7 +332,7 @@ public class UrlEncodingParser extends UonParser {
 		final int S4=4; // Found valStart, looking for & or end.
 
 		try {
-			int c = r.peek();
+			int c = r.peekSkipWs();
 			if (c == '?')
 				r.read();
 
@@ -531,7 +518,7 @@ public class UrlEncodingParser extends UonParser {
 	protected <K,V> Map<K,V> doParseIntoMap(ParserSession session, Map<K,V> m, Type keyType, Type valueType) throws Exception {
 		UrlEncodingParserSession s = (UrlEncodingParserSession)session;
 		UonReader r = s.getReader();
-		if (r.peek() == '?')
+		if (r.peekSkipWs() == '?')
 			r.read();
 		m = parseIntoMap(s, r, m, (ClassMeta<K>)session.getClassMeta(keyType), (ClassMeta<V>)session.getClassMeta(valueType));
 		return m;
@@ -598,12 +585,6 @@ public class UrlEncodingParser extends UonParser {
 		return this;
 	}
 
-	@Override /* UonParser */
-	public UrlEncodingParser setWhitespaceAware(boolean value) throws LockedException {
-		super.setWhitespaceAware(value);
-		return this;
-	}
-
 	@Override /* Parser */
 	public UrlEncodingParser setTrimStrings(boolean value) throws LockedException {
 		super.setTrimStrings(value);

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/097b8103/juneau-core/src/main/java/org/apache/juneau/urlencoding/UrlEncodingSerializer.java
----------------------------------------------------------------------
diff --git a/juneau-core/src/main/java/org/apache/juneau/urlencoding/UrlEncodingSerializer.java b/juneau-core/src/main/java/org/apache/juneau/urlencoding/UrlEncodingSerializer.java
index 232ce6b..04b64d6 100644
--- a/juneau-core/src/main/java/org/apache/juneau/urlencoding/UrlEncodingSerializer.java
+++ b/juneau-core/src/main/java/org/apache/juneau/urlencoding/UrlEncodingSerializer.java
@@ -76,46 +76,22 @@ import org.apache.juneau.transform.*;
  * 		URL-encoded notation would be as follows:
  * </p>
  * <p class='bcode'>
- * 	<xa>id</xa>=$n(<xs>1</xs>)
- * 	&amp;<xa>name</xa>=<xs>John+Smith</xs>,
- * 	&amp;<xa>uri</xa>=<xs>http://sample/addressBook/person/1</xs>,
- * 	&amp;<xa>addressBookUri</xa>=<xs>http://sample/addressBook</xs>,
- * 	&amp;<xa>birthDate</xa>=<xs>1946-08-12T00:00:00Z</xs>,
- * 	&amp;<xa>otherIds</xa>=<xs>%00</xs>,
- * 	&amp;<xa>addresses</xa>=$a(
- * 		$o(
- * 			<xa>uri</xa>=<xs>http://sample/addressBook/address/1</xs>,
- * 			<xa>personUri</xa>=<xs>http://sample/addressBook/person/1</xs>,
- * 			<xa>id</xa>=$n(<xs>1</xs>),
- * 			<xa>street</xa>=<xs>100+Main+Street</xs>,
- * 			<xa>city</xa>=<xs>Anywhereville</xs>,
- * 			<xa>state</xa>=<xs>NY</xs>,
- * 			<xa>zip</xa>=$n(<xs>12345</xs>),
- * 			<xa>isCurrent</xa>=$b(<xs>true</xs>)
- * 		)
- * 	)
- * </p>
- * <p>
- * 	A secondary "lax" syntax is available when the data type of the
- * 		values are already known on the receiving end of the transmission:
- * </p>
- * <p class='bcode'>
- * 	<xa>id</xa>=<xs>1</xs>,
- * 	&amp;<xa>name</xa>=<xs>John+Smith</xs>,
- * 	&amp;<xa>uri</xa>=<xs>http://sample/addressBook/person/1</xs>,
- * 	&amp;<xa>addressBookUri</xa>=<xs>http://sample/addressBook</xs>,
- * 	&amp;<xa>birthDate</xa>=<xs>1946-08-12T00:00:00Z</xs>,
- * 	&amp;<xa>otherIds</xa>=<xs>%00</xs>,
- * 	&amp;<xa>addresses</xa>=(
+ * 	<ua>id</ua>=<un>1</un>
+ * 	&amp;<ua>name</ua>=<us>'John+Smith'</us>,
+ * 	&amp;<ua>uri</ua>=<us>http://sample/addressBook/person/1</us>,
+ * 	&amp;<ua>addressBookUri</ua>=<us>http://sample/addressBook</us>,
+ * 	&amp;<ua>birthDate</ua>=<us>1946-08-12T00:00:00Z</us>,
+ * 	&amp;<ua>otherIds</ua>=<uk>null</uk>,
+ * 	&amp;<ua>addresses</ua>=@(
  * 		(
- * 			<xa>uri</xa>=<xs>http://sample/addressBook/address/1</xs>,
- * 			<xa>personUri</xa>=<xs>http://sample/addressBook/person/1</xs>,
- * 			<xa>id</xa>=<xs>1</xs>,
- * 			<xa>street</xa>=<xs>100+Main+Street</xs>,
- * 			<xa>city</xa>=<xs>Anywhereville</xs>,
- * 			<xa>state</xa>=<xs>NY</xs>,
- * 			<xa>zip</xa>=<xs>12345</xs>,
- * 			<xa>isCurrent</xa>=<xs>true</xs>
+ * 			<ua>uri</ua>=<us>http://sample/addressBook/address/1</us>,
+ * 			<ua>personUri</ua>=<us>http://sample/addressBook/person/1</us>,
+ * 			<ua>id</ua>=<un>1</un>,
+ * 			<ua>street</ua>=<us>'100+Main+Street'</us>,
+ * 			<ua>city</ua>=<us>Anywhereville</us>,
+ * 			<ua>state</ua>=<us>NY</us>,
+ * 			<ua>zip</ua>=<un>12345</un>,
+ * 			<ua>isCurrent</ua>=<uk>true</uk>
  * 		)
  * 	)
  * </p>
@@ -126,13 +102,9 @@ import org.apache.juneau.transform.*;
  * 	Map m = <jk>new</jk> ObjectMap(<js>"{a:'b',c:1,d:false,e:['f',1,false],g:{h:'i'}}"</js>);
  *
  * 	<jc>// Serialize to value equivalent to JSON.</jc>
- * 	<jc>// Produces "a=b&amp;c=$n(1)&amp;d=$b(false)&amp;e=$a(f,$n(1),$b(false))&amp;g=$o(h=i)"</jc>
+ * 	<jc>// Produces "a=b&amp;c=1&amp;d=false&amp;e=@(f,1,false)&amp;g=(h=i)"</jc>
  * 	String s = UrlEncodingSerializer.<jsf>DEFAULT</jsf>.serialize(s);
  *
- * 	<jc>// Serialize to simplified value (for when data type is already known by receiver).</jc>
- * 	<jc>// Produces "a=b&amp;c=1&amp;d=false&amp;e=(f,1,false)&amp;g=(h=i))"</jc>
- * 	String s = UrlEncodingSerializer.<jsf>DEFAULT_SIMPLE</jsf>.serialize(s);
- *
  * 	<jc>// Serialize a bean</jc>
  * 	<jk>public class</jk> Person {
  * 		<jk>public</jk> Person(String s);
@@ -151,11 +123,8 @@ import org.apache.juneau.transform.*;
  *
  * 	Person p = <jk>new</jk> Person(<js>"John Doe"</js>, 23, <js>"123 Main St"</js>, <js>"Anywhere"</js>, <js>"NY"</js>, 12345, <jk>false</jk>);
  *
- * 	<jc>// Produces "name=John+Doe&amp;age=23&amp;address=$o(street=123+Main+St,city=Anywhere,state=NY,zip=$n(12345))&amp;deceased=$b(false)"</jc>
+ * 	<jc>// Produces "name=John+Doe&amp;age=23&amp;address=(street='123+Main+St',city=Anywhere,state=NY,zip=12345)&amp;deceased=false"</jc>
  * 	String s = UrlEncodingSerializer.<jsf>DEFAULT</jsf>.serialize(s);
- *
- * 	<jc>// Produces "name=John+Doe&amp;age=23&amp;address=(street=123+Main+St,city=Anywhere,state=NY,zip=12345)&amp;deceased=false)"</jc>
- * 	String s = UrlEncodingSerializer.<jsf>DEFAULT_SIMPLE</jsf>.serialize(s);
  * </p>
  */
 @Produces("application/x-www-form-urlencoded")
@@ -165,11 +134,8 @@ public class UrlEncodingSerializer extends UonSerializer {
 	/** Reusable instance of {@link UrlEncodingSerializer}, all default settings. */
 	public static final UrlEncodingSerializer DEFAULT = new UrlEncodingSerializer().lock();
 
-	/** Reusable instance of {@link UrlEncodingSerializer.Simple}. */
-	public static final UrlEncodingSerializer DEFAULT_SIMPLE = new Simple().lock();
-
-	/** Reusable instance of {@link UrlEncodingSerializer.SimpleExpanded}. */
-	public static final UrlEncodingSerializer DEFAULT_SIMPLE_EXPANDED = new SimpleExpanded().lock();
+	/** Reusable instance of {@link UrlEncodingSerializer.Expanded}. */
+	public static final UrlEncodingSerializer DEFAULT_EXPANDED = new Expanded().lock();
 
 	/** Reusable instance of {@link UrlEncodingSerializer.Readable}. */
 	public static final UrlEncodingSerializer DEFAULT_READABLE = new Readable().lock();
@@ -182,23 +148,12 @@ public class UrlEncodingSerializer extends UonSerializer {
 	}
 
 	/**
-	 * Equivalent to <code><jk>new</jk> UrlEncodingSerializer().setSimpleMode(<jk>true</jk>);</code>.
-	 */
-	@Produces(value="application/x-www-form-urlencoded-simple",contentType="application/x-www-form-urlencoded")
-	public static class Simple extends UrlEncodingSerializer {
-		/** Constructor */
-		public Simple() {
-			setSimpleMode(true);
-		}
-	}
-
-	/**
 	 * Equivalent to <code><jk>new</jk> UrlEncodingSerializer().setSimpleMode(<jk>true</jk>).setExpandedParams(<jk>true</jk>);</code>.
 	 */
-	@Produces(value="application/x-www-form-urlencoded-simple",contentType="application/x-www-form-urlencoded")
-	public static class SimpleExpanded extends Simple {
+	@Produces(value="application/x-www-form-urlencoded",contentType="application/x-www-form-urlencoded")
+	public static class Expanded extends UrlEncodingSerializer {
 		/** Constructor */
-		public SimpleExpanded() {
+		public Expanded() {
 			setExpandedParams(true);
 		}
 	}
@@ -220,7 +175,6 @@ public class UrlEncodingSerializer extends UonSerializer {
 	@SuppressWarnings({ "rawtypes", "unchecked" })
 	private SerializerWriter serializeAnything(UrlEncodingSerializerSession session, UonWriter out, Object o) throws Exception {
 
-		boolean addTypeProperty;		// Add "_type" attribute to element?
 		ClassMeta<?> aType;			// The actual type
 		ClassMeta<?> sType;			// The serialized type
 
@@ -230,7 +184,7 @@ public class UrlEncodingSerializer extends UonSerializer {
 			aType = object();
 
 		sType = aType.getSerializedClassMeta();
-		addTypeProperty = (session.isAddBeanTypeProperties());
+		String typeName = session.getBeanTypeName(session.object(), aType, null);
 
 		// Swap if necessary
 		PojoSwap swap = aType.getPojoSwap();
@@ -245,18 +199,18 @@ public class UrlEncodingSerializer extends UonSerializer {
 
 		if (sType.isMap()) {
 			if (o instanceof BeanMap)
-				serializeBeanMap(session, out, (BeanMap)o, addTypeProperty);
+				serializeBeanMap(session, out, (BeanMap)o, typeName);
 			else
 				serializeMap(session, out, (Map)o, sType);
 		} else if (sType.isBean()) {
-			serializeBeanMap(session, out, session.toBeanMap(o), addTypeProperty);
+			serializeBeanMap(session, out, session.toBeanMap(o), typeName);
 		} else if (sType.isCollection()) {
 			serializeMap(session, out, getCollectionMap((Collection)o), session.getClassMeta(Map.class, Integer.class, sType.getElementType()));
 		} else {
 			// All other types can't be serialized as key/value pairs, so we create a
 			// mock key/value pair with a "_value" key.
 			out.append("_value=");
-			super.serializeAnything(session, out, o, null, null, null, false, true);
+			super.serializeAnything(session, out, o, null, null, null);
 		}
 
 		session.pop();
@@ -294,15 +248,15 @@ public class UrlEncodingSerializer extends UonSerializer {
 				while (i.hasNext()) {
 					if (addAmp)
 						out.cr(depth).append('&');
-					out.appendObject(key, false, true, true).append('=');
-					super.serializeAnything(session, out, i.next(), null, (key == null ? null : key.toString()), null, false, true);
+					out.appendObject(key, true).append('=');
+					super.serializeAnything(session, out, i.next(), null, (key == null ? null : key.toString()), null);
 					addAmp = true;
 				}
 			} else {
 				if (addAmp)
 					out.cr(depth).append('&');
-				out.appendObject(key, false, true, true).append('=');
-				super.serializeAnything(session, out, value, valueType, (key == null ? null : key.toString()), null, false, true);
+				out.appendObject(key, true).append('=');
+				super.serializeAnything(session, out, value, valueType, (key == null ? null : key.toString()), null);
 				addAmp = true;
 			}
 		}
@@ -311,12 +265,12 @@ public class UrlEncodingSerializer extends UonSerializer {
 	}
 
 	@SuppressWarnings({ "rawtypes" })
-	private SerializerWriter serializeBeanMap(UrlEncodingSerializerSession session, UonWriter out, BeanMap<?> m, boolean addTypeProperty) throws Exception {
+	private SerializerWriter serializeBeanMap(UrlEncodingSerializerSession session, UonWriter out, BeanMap<?> m, String typeName) throws Exception {
 		int depth = session.getIndent();
 
 		boolean addAmp = false;
 
-		for (BeanPropertyValue p : m.getValues(session.isTrimNulls(), addTypeProperty ? session.createBeanTypeNameProperty(m) : null)) {
+		for (BeanPropertyValue p : m.getValues(session.isTrimNulls(), typeName != null ? session.createBeanTypeNameProperty(m, typeName) : null)) {
 			BeanPropertyMeta pMeta = p.getMeta();
 			ClassMeta<?> cMeta = p.getClassMeta();
 
@@ -337,9 +291,9 @@ public class UrlEncodingSerializer extends UonSerializer {
 					if (addAmp)
 						out.cr(depth).append('&');
 
-					out.appendObject(key, false, true, true).append('=');
+					out.appendObject(key, true).append('=');
 
-					super.serializeAnything(session, out, i.next(), cMeta.getElementType(), key, pMeta, false, true);
+					super.serializeAnything(session, out, i.next(), cMeta.getElementType(), key, pMeta);
 
 					addAmp = true;
 				}
@@ -347,9 +301,9 @@ public class UrlEncodingSerializer extends UonSerializer {
 				if (addAmp)
 					out.cr(depth).append('&');
 
-				out.appendObject(key, false, true, true).append('=');
+				out.appendObject(key, true).append('=');
 
-				super.serializeAnything(session, out, value, cMeta, key, pMeta, false, true);
+				super.serializeAnything(session, out, value, cMeta, key, pMeta);
 
 				addAmp = true;
 			}
@@ -461,18 +415,6 @@ public class UrlEncodingSerializer extends UonSerializer {
 	}
 
 	@Override /* UonSerializer */
-	public UrlEncodingSerializer setSimpleMode(boolean value) throws LockedException {
-		super.setSimpleMode(value);
-		return this;
-	}
-
-	@Override /* UonSerializer */
-	public UrlEncodingSerializer setUseWhitespace(boolean value) throws LockedException {
-		super.setUseWhitespace(value);
-		return this;
-	}
-
-	@Override /* UonSerializer */
 	public UrlEncodingSerializer setEncodeChars(boolean value) throws LockedException {
 		super.setEncodeChars(value);
 		return this;
@@ -503,8 +445,8 @@ public class UrlEncodingSerializer extends UonSerializer {
 	}
 
 	@Override /* Serializer */
-	public UrlEncodingSerializer setUseIndentation(boolean value) throws LockedException {
-		super.setUseIndentation(value);
+	public UrlEncodingSerializer setUseWhitespace(boolean value) throws LockedException {
+		super.setUseWhitespace(value);
 		return this;
 	}
 

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/097b8103/juneau-core/src/main/java/org/apache/juneau/urlencoding/doc-files/Example_HTML.png
----------------------------------------------------------------------
diff --git a/juneau-core/src/main/java/org/apache/juneau/urlencoding/doc-files/Example_HTML.png b/juneau-core/src/main/java/org/apache/juneau/urlencoding/doc-files/Example_HTML.png
index ab74763..04dcf41 100644
Binary files a/juneau-core/src/main/java/org/apache/juneau/urlencoding/doc-files/Example_HTML.png and b/juneau-core/src/main/java/org/apache/juneau/urlencoding/doc-files/Example_HTML.png differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/097b8103/juneau-core/src/main/java/org/apache/juneau/urlencoding/doc-files/Example_UrlEncoding.png
----------------------------------------------------------------------
diff --git a/juneau-core/src/main/java/org/apache/juneau/urlencoding/doc-files/Example_UrlEncoding.png b/juneau-core/src/main/java/org/apache/juneau/urlencoding/doc-files/Example_UrlEncoding.png
deleted file mode 100644
index 34de8a7..0000000
Binary files a/juneau-core/src/main/java/org/apache/juneau/urlencoding/doc-files/Example_UrlEncoding.png and /dev/null differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/097b8103/juneau-core/src/main/java/org/apache/juneau/urlencoding/doc-files/rfc_uon.txt
----------------------------------------------------------------------
diff --git a/juneau-core/src/main/java/org/apache/juneau/urlencoding/doc-files/rfc_uon.txt b/juneau-core/src/main/java/org/apache/juneau/urlencoding/doc-files/rfc_uon.txt
index 116a509..a78153f 100644
--- a/juneau-core/src/main/java/org/apache/juneau/urlencoding/doc-files/rfc_uon.txt
+++ b/juneau-core/src/main/java/org/apache/juneau/urlencoding/doc-files/rfc_uon.txt
@@ -1,7 +1,7 @@
 Network Working Group                                          J. Bognar
-Request for Comments: 9999                                     C. Chaney  
-Category: Informational                                              IBM
-                                                                Jan 2014
+Request for Comments: 9999                                                
+Category: Informational                                       Salesforce
+                                                                Feb 2017
 
                             ***DRAFT***
                URI Object Notation (UON): Generic Syntax
@@ -38,7 +38,8 @@ Abstract
    (Uniform Resource Identifiers).  Its purpose is to define a 
    generalized object notation for URI query parameter values similar in 
    concept to Javascript Object Notation (RFC4627).  The goal is a 
-   syntax such that any data structure defined in JSON can be losslessly 
+   syntax that allows for array and map structures to be
+   such that any data structure defined in JSON can be losslessly 
    defined in an equivalent URI-based grammar, yet be fully compliant 
    with the RFC2396 specification. 
 
@@ -77,32 +78,17 @@ Abstract
             ] 
          } 
 
-      Using the "strict" syntax defined in this document, the equivalent 
+      Using the syntax defined in this document, the equivalent 
       UON notation would be as follows:
 
-         x=$o(id=$n(1),name=John+Smith,uri=http://sample/
-         addressBook/person/1,addressBookUri=http://sample/
-         addressBook,birthDate=1946-08-12T00:00:00Z,otherIds=%00,
-         addresses=$a($o(uri=http://sample/addressBook/
-         address/1,personUri=http://sample/addressBook/
-         person/1,id=$n(1),street=100+Main+Street,city=
-         Anywhereville,state=NY,zip=$n(12345),isCurrent=$b(true)))) 
-
-      A secondary "lax" syntax is available when the data type of the
-      values are already known on the receiving end of the transmission:
-
          x=(id=1,name=John+Smith,uri=http://sample/
          addressBook/person/1,addressBookUri=http://sample/
          addressBook,birthDate=1946-08-12T00:00:00Z,otherIds=%00,
-         addresses=((uri=http://sample/addressBook/
+         addresses=@((uri=http://sample/addressBook/
          address/1,personUri=http://sample/addressBook/
          person/1,id=1,street=100+Main+Street,city=
          Anywhereville,state=NY,zip=12345,isCurrent=true))) 
 
-      Values represented in strict mode can be losslessly converted
-      back and forth into a JSON model without any additional
-      information.  Values represented in lax mode cannot.
-
 1. Language constraints
 
    The grammar syntax is constrained to usage of characters allowed by 
@@ -137,146 +123,97 @@ Abstract
 2.1. Objects 
 
    Objects are values consisting of one or more child name/value pairs.
-   The $o() construct is used to define an object.
+   The (...) construct is used to define an object.
 
    Example:  A simple map with two key/value pairs:
 
-      a1=$o(b1=x1,b2=x2)
+      a1=(b1=x1,b2=x2)
 
    Example:  A nested map:
    
-      a1=$o(b1=$o(c1=x1,c2=x2))
-
-   When the data type is already known to be an object on the receiving 
-   end, then the type flag can be removed from the construct to produce
-   a simplified value. 
-
-   Example:  A nested map using "lax" syntax:
-
-     a1=(b1=(c1=x1,c2=x2))
+      a1=(b1=(c1=x1,c2=x2))
 
 2.2. Arrays
 
    Arrays are values consisting of zero or more child values.
-   The $a() construct is used to define an array.
+   The @(...) construct is used to define an array.
 
    Example:  An array of two string values:
 
-      a1=$a(x1,x2)
+      a1=@(x1,x2)
 
    Example:  A 2-dimensional array:
 
-      a1=$a($a(x1,x2),$a(x3,x4))
+      a1=@(@(x1,x2),@(x3,x4))
 
    Example:  An array of objects:
 
-      a1=$a($o(b1=x1,b2=x2),$o(c1=x1,c2=x2))
-
-   When the data type is already known to be an array on the receiving 
-   end, then the type flag can be removed from the construct to produce
-   a simplified value. 
-   
-   Example:  An array of objects using "lax" syntax:
-
-      a1=((b1=x1,b2=x2),(c1=x1,c2=x2))
+      a1=@((b1=x1,b2=x2),(c1=x1,c2=x2))
 
 2.3. Booleans
 
    Booleans are values that can only take on values "true" or "false".  
-   The $b() construct is used to define a boolean.
    
    Example:  Two boolean values:
 
-      a1=$b(true)&a2=$b(false)
-   
-   When the data type is already known to be a boolean on the receiving 
-   end, then the type flag and parentheses can be removed from the 
-   construct to produce a simplified value. 
-
-   Example:  Two boolean values using "lax" syntax:
-
       a1=true&a2=false
-
+   
 2.4. Numbers
 
-   The $n() construct is used to define a number.
+   Numbers are represented without constructs.
    Both decimal and float numbers are supported.
    
    Example:  Two numerical values, one decimal and one float:
 
-      a1=$n(123)&a2=$n(1.23e1)
-
-   When the data type is already known to be a number on the receiving 
-   end, then the type flag and parentheses can be removed from the 
-   construct to produce a simplified value. 
-   
-   Example:  Two numerical values using "lax" syntax:
-
       a1=123&a2=1.23e1
 
 2.5. Strings
 
-   Anything not conforming to one of the constructs described above 
-   are treated as simple strings.  
-   
-   Example:  A simple string value:
-
-      a1=foobar
+   Strings are encapsulated in single quote (') characters.
    
-   The tilde character (~) is used for escaping characters to prevent 
-   them from being confused with syntax characters.  
-
-   The following characters must be escaped in string literals:  
+   Example:  Simple string values:
 
-      $ , ( ) ~ =
+      a1='foobar'&a2='123'&a3='true'
+         
+   The quotes are optional when the string cannot be confused
+   with one of the constructs listed above (i.e. objects/arrays/
+   booleans/numbers/null). 
    
-   For example, the string literal "$o(b1=x)" should be 
-   represented as follows:
+   Example:  A simple string value, unquoted:
 
-      a1=~$o~(b1~=x~)
-   
-   In addition, strings can optionally be enclosed in parentheses
-   when needed to handle ambiguous cases.
-   
-   The following two values are equivalent:
-   
       a1=foobar
-      a1=(foobar)
+    
+   Strings must be quoted for the following cases:
       
-   Using parentheses, the following construct can be used to represent
-   an empty string:
-   
-      a1=()
+      - The string can be confused with a boolean or number.
+      - The string is empty.
+      - The string contains one or more whitespace characters.
+      - The string starts with one of the following characters:
+        @ (
+      - The string contains any of the following characters:
+        ) , =
    
-   The purpose for this is to handle a potential ambiguity in the 
-   representation of an empty array ([]) vs. an array containing one
-   empty string ([""]).  An array containing one empty string is 
+   For example, the string literal "(b1=x)" should be 
    represented as follows:
 
-      a1=$a(())
-
-   Without this construct, there would not be a way to tell the 
-   difference between an empty array and an array containing an empty    
-   string:
-
-      a1=$a()
+      a1='(b1=x)'
+   
+   The tilde character (~) is used for escaping characters to prevent 
+   them from being confused with syntax characters.  
 
-   Note that an array consisting of two empty strings does not suffer 
-   from this ambiguity, and the use of parenthesis is optional in 
-   this case: 
+   The following characters must be escaped in string literals:  
 
-      a1=$a(,)
+      ' ~
+   
+   Example:  The string "foo'bar~baz"
 
+      a1='foo~'bar~~baz'
+   
 2.7. Null values
 
-   Nulls are represented by ASCII '0' as an escaped hex sequence:
-
-      a1=%00
-
-   Note that a string consisting of a single null character can be 
-   represented with the following construct:
+   Nulls are represented by the keyword 'null':
 
-      a1=(%00)
+      a1=null
 
 2.8. Top-level attribute names
 
@@ -301,7 +238,7 @@ Abstract
    
    The following query strings are fully equivalent in structure:
    
-     a1=$o(b1=x1,b2=x2)
+     a1=(b1='x1',b2='x2')
      %61%31=%24%6F%28%62%31%3D%78%31%2C%62%32%3D%78%32%29
 
 
@@ -313,22 +250,12 @@ Abstract
    attrname    = (string | null)
    value       = (var | string | null)
 
-   string      = ("(" litchar* ")") | litchar*
+   string      = ("'" litchar* "'") | litchar*
    null        = "%00"
    
-   var         = ovar | avar | nvar | bvar
-   ovar        = ovar_strict | ovar_lax
-   avar        = avar_strict | avar_lax
-   nvar        = nvar_strict | nvar_lax
-   bvar        = bvar_strict | bvar_lax
-   ovar_strict = "$o(" [pairs] ")"
-   ovar_lax    =   "(" [pairs] ")"
-   avar_strict = "$a(" [values] ")"
-   avar_lax    =   "(" [values] ")"
-   nvar_strict = "$n(" number ")"
-   nvar_lax    =       number
-   bvar_strict = "$b(" boolean ")" 
-   bvar_lax    =       boolean
+   var         = ovar | avar | nvar | boolean | number
+   ovar        = "(" [pairs] ")"
+   avar        = "@(" [values] ")"
 
    pairs       = pair ["," pairs]
    pair        = key "=" value	
@@ -345,7 +272,7 @@ Abstract
    exp         = "e" [("+" | "-")] digit+
 
    litchar     = unencoded | encode_seq | escape_seq
-   escaped     = "$" | "," | "(" | ")" | "~" | "=" 
+   escaped     = "@" | "," | "(" | ")" | "~" | "=" 
    unencoded   = alpha | digit | 
                  ";" | "/" | "?" | ":" | "@" |
                  "-" | "_" | "." | "!" | "*" | "'" 


[6/8] incubator-juneau git commit: Modification to UON spec. Remove bean subtype support.

Posted by ja...@apache.org.
http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/097b8103/juneau-core-test/src/test/java/org/apache/juneau/urlencoding/CommonParser_UonTest.java
----------------------------------------------------------------------
diff --git a/juneau-core-test/src/test/java/org/apache/juneau/urlencoding/CommonParser_UonTest.java b/juneau-core-test/src/test/java/org/apache/juneau/urlencoding/CommonParser_UonTest.java
index 9b51a35..37f2376 100755
--- a/juneau-core-test/src/test/java/org/apache/juneau/urlencoding/CommonParser_UonTest.java
+++ b/juneau-core-test/src/test/java/org/apache/juneau/urlencoding/CommonParser_UonTest.java
@@ -35,11 +35,11 @@ public class CommonParser_UonTest {
 		Map m = null;
 		String in;
 
-		in = "$o(a=$n(1))";
+		in = "(a=1)";
 		m = (Map)p.parse(in, Object.class);
 		assertEquals(1, m.get("a"));
 
-		in = "$o(a=$n(1),b=foo+bar)";
+		in = "(a=1,b='foo+bar')";
 		m = (Map)p.parse(in, Object.class);
 		assertEquals(1, m.get("a"));
 		assertEquals("foo+bar", m.get("b"));
@@ -47,19 +47,19 @@ public class CommonParser_UonTest {
 		assertEquals(1, m.get("a"));
 		assertEquals("foo bar", m.get("b"));
 
-		in = "$o(a=$n(1),b=foo+bar,c=$b(false))";
+		in = "(a=1,b='foo+bar',c=false)";
 		m = (Map)pe.parse(in, Object.class);
 		assertEquals(1, m.get("a"));
 		assertEquals("foo bar", m.get("b"));
 		assertEquals(false, m.get("c"));
 
-		in = "$o(a=$n(1),b=foo%20bar,c=$b(false))";
+		in = "(a=1,b='foo%20bar',c=false)";
 		m = (Map)pe.parse(in, Object.class);
 		assertEquals(1, m.get("a"));
 		assertEquals("foo bar", m.get("b"));
 		assertEquals(false, m.get("c"));
 
-		ObjectList jl = (ObjectList)p.parse("$a($o(attribute=value),$o(attribute='value'))", Object.class);
+		ObjectList jl = (ObjectList)p.parse("@((attribute=value),(attribute=~'value~'))", Object.class);
 		assertEquals("value", jl.getObjectMap(0).getString("attribute"));
 		assertEquals("'value'", jl.getObjectMap(1).getString("attribute"));
 
@@ -127,7 +127,7 @@ public class CommonParser_UonTest {
 
 		ReaderParser p = UonParser.DEFAULT;
 
-		String json = "(ints=(1,2,3),beans=((a=1,b=2)))";
+		String json = "(ints=@(1,2,3),beans=@((a=1,b=2)))";
 		C t = p.parse(json, C.class);
 		assertEquals(t.getInts().size(), 3);
 		assertEquals(t.getBeans().get(0).b, 2);

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/097b8103/juneau-core-test/src/test/java/org/apache/juneau/urlencoding/CommonParser_UrlEncodingTest.java
----------------------------------------------------------------------
diff --git a/juneau-core-test/src/test/java/org/apache/juneau/urlencoding/CommonParser_UrlEncodingTest.java b/juneau-core-test/src/test/java/org/apache/juneau/urlencoding/CommonParser_UrlEncodingTest.java
index 2690017..e026be1 100755
--- a/juneau-core-test/src/test/java/org/apache/juneau/urlencoding/CommonParser_UrlEncodingTest.java
+++ b/juneau-core-test/src/test/java/org/apache/juneau/urlencoding/CommonParser_UrlEncodingTest.java
@@ -36,32 +36,32 @@ public class CommonParser_UrlEncodingTest {
 		Map m = null;
 		String in;
 
-		in = "a=$n(1)";
+		in = "a=1";
 		m = (Map)p.parse(in, Object.class);
 		assertEquals(1, m.get("a"));
 
-		in = "a=$n(1)&b=foo+bar";
+		in = "a=1&b='foo+bar'";
 		m = (Map)p.parse(in, Object.class);
 		assertEquals(1, m.get("a"));
 		assertEquals("foo bar", m.get("b"));
 
-		in = "a=$n(1)&b=foo+bar&c=$b(false)";
+		in = "a=1&b='foo+bar'&c=false";
 		m = (Map)p.parse(in, Object.class);
 		assertEquals(1, m.get("a"));
 		assertEquals("foo bar", m.get("b"));
 		assertEquals(false, m.get("c"));
 
-		in = "a=$n(1)&b=foo%20bar&c=$b(false)";
+		in = "a=1&b='foo%20bar'&c=false";
 		m = (Map)p.parse(in, Object.class);
 		assertEquals(1, m.get("a"));
 		assertEquals("foo bar", m.get("b"));
 		assertEquals(false, m.get("c"));
 
-		ObjectMap jm = (ObjectMap)p.parse("x=$a($o(attribute=value),$o(attribute='value'))", Object.class);
+		ObjectMap jm = (ObjectMap)p.parse("x=@((attribute=value),(attribute=~'value~'))", Object.class);
 		assertEquals("value", jm.getObjectList("x").getObjectMap(0).getString("attribute"));
 		assertEquals("'value'", jm.getObjectList("x").getObjectMap(1).getString("attribute"));
 
-		ObjectList jl = (ObjectList)p.parse("_value=$a($o(attribute=value),$o(attribute='value'))", Object.class);
+		ObjectList jl = (ObjectList)p.parse("_value=@((attribute=value),(attribute=~'value~'))", Object.class);
 		assertEquals("value", jl.getObjectMap(0).getString("attribute"));
 		assertEquals("'value'", jl.getObjectMap(1).getString("attribute"));
 
@@ -129,7 +129,7 @@ public class CommonParser_UrlEncodingTest {
 
 		ReaderParser p = UrlEncodingParser.DEFAULT;
 
-		String json = "ints=(1,2,3)&beans=((a=1,b=2))";
+		String json = "ints=@(1,2,3)&beans=@((a=1,b=2))";
 		C t = p.parse(json, C.class);
 		assertEquals(t.getInts().size(), 3);
 		assertEquals(t.getBeans().get(0).b, 2);
@@ -170,7 +170,7 @@ public class CommonParser_UrlEncodingTest {
 
 	@Test
 	public void testCollections() throws Exception {
-		WriterSerializer s = new UrlEncodingSerializer().setSimpleMode(true);
+		WriterSerializer s = new UrlEncodingSerializer();
 		ReaderParser p = new UrlEncodingParser();
 
 		List l = new ObjectList("foo","bar");

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/097b8103/juneau-core-test/src/test/java/org/apache/juneau/urlencoding/Common_UonTest.java
----------------------------------------------------------------------
diff --git a/juneau-core-test/src/test/java/org/apache/juneau/urlencoding/Common_UonTest.java b/juneau-core-test/src/test/java/org/apache/juneau/urlencoding/Common_UonTest.java
index 3a819ee..00643d0 100755
--- a/juneau-core-test/src/test/java/org/apache/juneau/urlencoding/Common_UonTest.java
+++ b/juneau-core-test/src/test/java/org/apache/juneau/urlencoding/Common_UonTest.java
@@ -40,13 +40,13 @@ public class Common_UonTest {
 
 		s.setTrimNullProperties(false);
 		String r = s.serialize(t1);
-		assertEquals("$o(s1=%00,s2=s2)", r);
+		assertEquals("(s1=null,s2=s2)", r);
 		t2 = pe.parse(r, A.class);
 		assertEqualObjects(t1, t2);
 
 		s.setTrimNullProperties(true);
 		r = s.serialize(t1);
-		assertEquals("$o(s2=s2)", r);
+		assertEquals("(s2=s2)", r);
 		t2 = p.parse(r, A.class);
 		assertEqualObjects(t1, t2);
 	}
@@ -66,19 +66,19 @@ public class Common_UonTest {
 	//====================================================================================================
 	@Test
 	public void testTrimEmptyMaps() throws Exception {
-		UonSerializer s = UonSerializer.DEFAULT_SIMPLE_ENCODING.clone();
+		UonSerializer s = UonSerializer.DEFAULT_ENCODING.clone();
 		B t1 = B.create(), t2;
 		String r;
 
 		s.setTrimEmptyMaps(false);
 		r = s.serialize(t1);
-		assertEquals("(f1=(),f2=(f2a=%00,f2b=(s2=s2)))", r);
+		assertEquals("(f1=(),f2=(f2a=null,f2b=(s2=s2)))", r);
 		t2 = pe.parse(r, B.class);
 		assertEqualObjects(t1, t2);
 
 		s.setTrimEmptyMaps(true);
 		r = s.serialize(t1);
-		assertEquals("(f2=(f2a=%00,f2b=(s2=s2)))", r);
+		assertEquals("(f2=(f2a=null,f2b=(s2=s2)))", r);
 		t2 = pe.parse(r, B.class);
 		assertNull(t2.f1);
 	}
@@ -105,13 +105,13 @@ public class Common_UonTest {
 
 		s.setTrimEmptyCollections(false);
 		r = s.serialize(t1);
-		assertEquals("$o(f1=$a(),f2=$a(%00,$o(s2=s2)))", r);
+		assertEquals("(f1=@(),f2=@(null,(s2=s2)))", r);
 		t2 = pe.parse(r, C.class);
 		assertEqualObjects(t1, t2);
 
 		s.setTrimEmptyCollections(true);
 		r = s.serialize(t1);
-		assertEquals("$o(f2=$a(%00,$o(s2=s2)))", r);
+		assertEquals("(f2=@(null,(s2=s2)))", r);
 		t2 = pe.parse(r, C.class);
 		assertNull(t2.f1);
 	}
@@ -138,13 +138,13 @@ public class Common_UonTest {
 
 		s.setTrimEmptyCollections(false);
 		r = s.serialize(t1);
-		assertEquals("$o(f1=$a(),f2=$a(%00,$o(s2=s2)))", r);
+		assertEquals("(f1=@(),f2=@(null,(s2=s2)))", r);
 		t2 = pe.parse(r, D.class);
 		assertEqualObjects(t1, t2);
 
 		s.setTrimEmptyCollections(true);
 		r = s.serialize(t1);
-		assertEquals("$o(f2=$a(%00,$o(s2=s2)))", r);
+		assertEquals("(f2=@(null,(s2=s2)))", r);
 		t2 = pe.parse(r, D.class);
 		assertNull(t2.f1);
 	}
@@ -166,11 +166,8 @@ public class Common_UonTest {
 	@Test
 	public void testBeanPropertyProperies() throws Exception {
 		UonSerializer s = UonSerializer.DEFAULT;
-		UonSerializer ss = UonSerializer.DEFAULT_SIMPLE;
-		String ue = ss.serialize(new E1());
-		assertEquals("(x1=(f1=1),x2=(f1=1),x3=((f1=1)),x4=((f1=1)),x5=((f1=1)),x6=((f1=1)))", ue);
-		ue = s.serialize(new E1());
-		assertEquals("$o(x1=$o(f1=$n(1)),x2=$o(f1=$n(1)),x3=$a($o(f1=$n(1))),x4=$a($o(f1=$n(1))),x5=$a($o(f1=$n(1))),x6=$a($o(f1=$n(1))))", ue);
+		String ue = s.serialize(new E1());
+		assertEquals("(x1=(f1=1),x2=(f1=1),x3=@((f1=1)),x4=@((f1=1)),x5=@((f1=1)),x6=@((f1=1)))", ue);
 	}
 
 	public static class E1 {
@@ -204,7 +201,7 @@ public class Common_UonTest {
 		t.x1.add(new F());
 		l.add(t);
 		String xml = s.serialize(l);
-		assertEquals("$a($o(x1=$a($o(x2=$n(2))),x2=$n(2)))", xml);
+		assertEquals("@((x1=@((x2=2)),x2=2))", xml);
 	}
 
 	public static class F {
@@ -251,7 +248,7 @@ public class Common_UonTest {
 		s.setRelativeUriBase(null);
 		r = s.serialize(t);
 		expected = ""
-			+"$o("
+			+"("
 			+"f0=f0/x0,"
 			+"f1=f1/x1,"
 			+"f2=/f2/x2,"
@@ -263,10 +260,10 @@ public class Common_UonTest {
 			+"f8=f8/x8,"
 			+"f9=f9/x9,"
 			+"fa=http://www.apache.org/fa/xa#MY_LABEL,"
-			+"fb=http://www.apache.org/fb/xb?label~=MY_LABEL&foo~=bar,"
-			+"fc=http://www.apache.org/fc/xc?foo~=bar&label~=MY_LABEL,"
-			+"fd=http://www.apache.org/fd/xd?label2~=MY_LABEL&foo~=bar,"
-			+"fe=http://www.apache.org/fe/xe?foo~=bar&label2~=MY_LABEL"
+			+"fb='http://www.apache.org/fb/xb?label=MY_LABEL&foo=bar',"
+			+"fc='http://www.apache.org/fc/xc?foo=bar&label=MY_LABEL',"
+			+"fd='http://www.apache.org/fd/xd?label2=MY_LABEL&foo=bar',"
+			+"fe='http://www.apache.org/fe/xe?foo=bar&label2=MY_LABEL'"
 			+")";
 		assertEquals(expected, r);
 
@@ -277,7 +274,7 @@ public class Common_UonTest {
 		s.setRelativeUriBase("/cr");
 		r = s.serialize(t);
 		expected = ""
-			+"$o("
+			+"("
 			+"f0=/cr/f0/x0,"
 			+"f1=/cr/f1/x1,"
 			+"f2=/f2/x2,"
@@ -289,10 +286,10 @@ public class Common_UonTest {
 			+"f8=/cr/f8/x8,"
 			+"f9=/cr/f9/x9,"
 			+"fa=http://www.apache.org/fa/xa#MY_LABEL,"
-			+"fb=http://www.apache.org/fb/xb?label~=MY_LABEL&foo~=bar,"
-			+"fc=http://www.apache.org/fc/xc?foo~=bar&label~=MY_LABEL,"
-			+"fd=http://www.apache.org/fd/xd?label2~=MY_LABEL&foo~=bar,"
-			+"fe=http://www.apache.org/fe/xe?foo~=bar&label2~=MY_LABEL"
+			+"fb='http://www.apache.org/fb/xb?label=MY_LABEL&foo=bar',"
+			+"fc='http://www.apache.org/fc/xc?foo=bar&label=MY_LABEL',"
+			+"fd='http://www.apache.org/fd/xd?label2=MY_LABEL&foo=bar',"
+			+"fe='http://www.apache.org/fe/xe?foo=bar&label2=MY_LABEL'"
 			+")";
 		assertEquals(expected, r);
 
@@ -303,7 +300,7 @@ public class Common_UonTest {
 		s.setRelativeUriBase("/");
 		r = s.serialize(t);
 		expected = ""
-			+"$o("
+			+"("
 			+"f0=/f0/x0,"
 			+"f1=/f1/x1,"
 			+"f2=/f2/x2,"
@@ -315,10 +312,10 @@ public class Common_UonTest {
 			+"f8=/f8/x8,"
 			+"f9=/f9/x9,"
 			+"fa=http://www.apache.org/fa/xa#MY_LABEL,"
-			+"fb=http://www.apache.org/fb/xb?label~=MY_LABEL&foo~=bar,"
-			+"fc=http://www.apache.org/fc/xc?foo~=bar&label~=MY_LABEL,"
-			+"fd=http://www.apache.org/fd/xd?label2~=MY_LABEL&foo~=bar,"
-			+"fe=http://www.apache.org/fe/xe?foo~=bar&label2~=MY_LABEL"
+			+"fb='http://www.apache.org/fb/xb?label=MY_LABEL&foo=bar',"
+			+"fc='http://www.apache.org/fc/xc?foo=bar&label=MY_LABEL',"
+			+"fd='http://www.apache.org/fd/xd?label2=MY_LABEL&foo=bar',"
+			+"fe='http://www.apache.org/fe/xe?foo=bar&label2=MY_LABEL'"
 			+")";
 		assertEquals(expected, r);
 
@@ -327,7 +324,7 @@ public class Common_UonTest {
 		s.setAbsolutePathUriBase("http://foo");
 		r = s.serialize(t);
 		expected = ""
-			+"$o("
+			+"("
 			+"f0=f0/x0,"
 			+"f1=f1/x1,"
 			+"f2=http://foo/f2/x2,"
@@ -339,10 +336,10 @@ public class Common_UonTest {
 			+"f8=f8/x8,"
 			+"f9=f9/x9,"
 			+"fa=http://www.apache.org/fa/xa#MY_LABEL,"
-			+"fb=http://www.apache.org/fb/xb?label~=MY_LABEL&foo~=bar,"
-			+"fc=http://www.apache.org/fc/xc?foo~=bar&label~=MY_LABEL,"
-			+"fd=http://www.apache.org/fd/xd?label2~=MY_LABEL&foo~=bar,"
-			+"fe=http://www.apache.org/fe/xe?foo~=bar&label2~=MY_LABEL"
+			+"fb='http://www.apache.org/fb/xb?label=MY_LABEL&foo=bar',"
+			+"fc='http://www.apache.org/fc/xc?foo=bar&label=MY_LABEL',"
+			+"fd='http://www.apache.org/fd/xd?label2=MY_LABEL&foo=bar',"
+			+"fe='http://www.apache.org/fe/xe?foo=bar&label2=MY_LABEL'"
 			+")";
 		assertEquals(expected, r);
 
@@ -353,7 +350,7 @@ public class Common_UonTest {
 		s.setAbsolutePathUriBase("");  // Same as null.
 		r = s.serialize(t);
 		expected = ""
-			+"$o("
+			+"("
 			+"f0=f0/x0,"
 			+"f1=f1/x1,"
 			+"f2=/f2/x2,"
@@ -365,10 +362,10 @@ public class Common_UonTest {
 			+"f8=f8/x8,"
 			+"f9=f9/x9,"
 			+"fa=http://www.apache.org/fa/xa#MY_LABEL,"
-			+"fb=http://www.apache.org/fb/xb?label~=MY_LABEL&foo~=bar,"
-			+"fc=http://www.apache.org/fc/xc?foo~=bar&label~=MY_LABEL,"
-			+"fd=http://www.apache.org/fd/xd?label2~=MY_LABEL&foo~=bar,"
-			+"fe=http://www.apache.org/fe/xe?foo~=bar&label2~=MY_LABEL"
+			+"fb='http://www.apache.org/fb/xb?label=MY_LABEL&foo=bar',"
+			+"fc='http://www.apache.org/fc/xc?foo=bar&label=MY_LABEL',"
+			+"fd='http://www.apache.org/fd/xd?label2=MY_LABEL&foo=bar',"
+			+"fe='http://www.apache.org/fe/xe?foo=bar&label2=MY_LABEL'"
 			+")";
 		assertEquals(expected, r);
 	}
@@ -380,7 +377,7 @@ public class Common_UonTest {
 	public void testLockedSerializer() throws Exception {
 		UonSerializer s = new UonSerializer().lock();
 		try {
-			s.setSimpleMode(true);
+			s.setUseWhitespace(true);
 			fail("Locked exception not thrown");
 		} catch (LockedException e) {}
 		try {
@@ -430,7 +427,7 @@ public class Common_UonTest {
 		}
 
 		s.setIgnoreRecursions(true);
-		assertEquals("$o(name=foo,r2=$o(name=bar,r3=$o(name=baz)))", s.serialize(r1));
+		assertEquals("(name=foo,r2=(name=bar,r3=(name=baz)))", s.serialize(r1));
 	}
 
 	public static class R1 {

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/097b8103/juneau-core-test/src/test/java/org/apache/juneau/urlencoding/Common_UrlEncodingTest.java
----------------------------------------------------------------------
diff --git a/juneau-core-test/src/test/java/org/apache/juneau/urlencoding/Common_UrlEncodingTest.java b/juneau-core-test/src/test/java/org/apache/juneau/urlencoding/Common_UrlEncodingTest.java
index efd9e93..c8f40d3 100755
--- a/juneau-core-test/src/test/java/org/apache/juneau/urlencoding/Common_UrlEncodingTest.java
+++ b/juneau-core-test/src/test/java/org/apache/juneau/urlencoding/Common_UrlEncodingTest.java
@@ -39,7 +39,7 @@ public class Common_UrlEncodingTest {
 
 		s.setTrimNullProperties(false);
 		String r = s.serialize(t1);
-		assertEquals("s1=%00&s2=s2", r);
+		assertEquals("s1=null&s2=s2", r);
 		t2 = p.parse(r, A.class);
 		assertEqualObjects(t1, t2);
 
@@ -65,19 +65,19 @@ public class Common_UrlEncodingTest {
 	//====================================================================================================
 	@Test
 	public void testTrimEmptyMaps() throws Exception {
-		UrlEncodingSerializer s = UrlEncodingSerializer.DEFAULT_SIMPLE.clone();
+		UrlEncodingSerializer s = UrlEncodingSerializer.DEFAULT.clone();
 		B t1 = B.create(), t2;
 		String r;
 
 		s.setTrimEmptyMaps(false);
 		r = s.serialize(t1);
-		assertEquals("f1=()&f2=(f2a=%00,f2b=(s2=s2))", r);
+		assertEquals("f1=()&f2=(f2a=null,f2b=(s2=s2))", r);
 		t2 = p.parse(r, B.class);
 		assertEqualObjects(t1, t2);
 
 		s.setTrimEmptyMaps(true);
 		r = s.serialize(t1);
-		assertEquals("f2=(f2a=%00,f2b=(s2=s2))", r);
+		assertEquals("f2=(f2a=null,f2b=(s2=s2))", r);
 		t2 = p.parse(r, B.class);
 		assertNull(t2.f1);
 	}
@@ -104,13 +104,13 @@ public class Common_UrlEncodingTest {
 
 		s.setTrimEmptyCollections(false);
 		r = s.serialize(t1);
-		assertEquals("f1=$a()&f2=$a(%00,$o(s2=s2))", r);
+		assertEquals("f1=@()&f2=@(null,(s2=s2))", r);
 		t2 = p.parse(r, C.class);
 		assertEqualObjects(t1, t2);
 
 		s.setTrimEmptyCollections(true);
 		r = s.serialize(t1);
-		assertEquals("f2=$a(%00,$o(s2=s2))", r);
+		assertEquals("f2=@(null,(s2=s2))", r);
 		t2 = p.parse(r, C.class);
 		assertNull(t2.f1);
 	}
@@ -137,13 +137,13 @@ public class Common_UrlEncodingTest {
 
 		s.setTrimEmptyCollections(false);
 		r = s.serialize(t1);
-		assertEquals("f1=$a()&f2=$a(%00,$o(s2=s2))", r);
+		assertEquals("f1=@()&f2=@(null,(s2=s2))", r);
 		t2 = p.parse(r, D.class);
 		assertEqualObjects(t1, t2);
 
 		s.setTrimEmptyCollections(true);
 		r = s.serialize(t1);
-		assertEquals("f2=$a(%00,$o(s2=s2))", r);
+		assertEquals("f2=@(null,(s2=s2))", r);
 		t2 = p.parse(r, D.class);
 		assertNull(t2.f1);
 	}
@@ -165,11 +165,8 @@ public class Common_UrlEncodingTest {
 	@Test
 	public void testBeanPropertyProperies() throws Exception {
 		UrlEncodingSerializer s = UrlEncodingSerializer.DEFAULT;
-		UrlEncodingSerializer ss = UrlEncodingSerializer.DEFAULT_SIMPLE;
-		String ue = ss.serialize(new E1());
-		assertEquals("x1=(f1=1)&x2=(f1=1)&x3=((f1=1))&x4=((f1=1))&x5=((f1=1))&x6=((f1=1))", ue);
-		ue = s.serialize(new E1());
-		assertEquals("x1=$o(f1=$n(1))&x2=$o(f1=$n(1))&x3=$a($o(f1=$n(1)))&x4=$a($o(f1=$n(1)))&x5=$a($o(f1=$n(1)))&x6=$a($o(f1=$n(1)))", ue);
+		String ue = s.serialize(new E1());
+		assertEquals("x1=(f1=1)&x2=(f1=1)&x3=@((f1=1))&x4=@((f1=1))&x5=@((f1=1))&x6=@((f1=1))", ue);
 	}
 
 	public static class E1 {
@@ -204,9 +201,9 @@ public class Common_UrlEncodingTest {
 		l.add(t);
 		ObjectMap m = new ObjectMap().append("t", l);
 		String xml = s.serialize(m);
-		assertEquals("t=$a($o(x1=$a($o(x2=$n(2))),x2=$n(2)))", xml);
+		assertEquals("t=@((x1=@((x2=2)),x2=2))", xml);
 		xml = s.serialize(l);
-		assertEquals("$n(0)=$o(x1=$a($o(x2=$n(2))),x2=$n(2))", xml);
+		assertEquals("0=(x1=@((x2=2)),x2=2)", xml);
 	}
 
 	public static class F {
@@ -264,10 +261,10 @@ public class Common_UrlEncodingTest {
 			+"&f8=f8/x8"
 			+"&f9=f9/x9"
 			+"&fa=http://www.apache.org/fa/xa%23MY_LABEL"
-			+"&fb=http://www.apache.org/fb/xb?label=MY_LABEL%26foo=bar"
-			+"&fc=http://www.apache.org/fc/xc?foo=bar%26label=MY_LABEL"
-			+"&fd=http://www.apache.org/fd/xd?label2=MY_LABEL%26foo=bar"
-			+"&fe=http://www.apache.org/fe/xe?foo=bar%26label2=MY_LABEL";
+			+"&fb='http://www.apache.org/fb/xb?label=MY_LABEL%26foo=bar'"
+			+"&fc='http://www.apache.org/fc/xc?foo=bar%26label=MY_LABEL'"
+			+"&fd='http://www.apache.org/fd/xd?label2=MY_LABEL%26foo=bar'"
+			+"&fe='http://www.apache.org/fe/xe?foo=bar%26label2=MY_LABEL'";
 		assertEquals(expected, r);
 
 		s.setRelativeUriBase("");  // Same as null.
@@ -288,10 +285,10 @@ public class Common_UrlEncodingTest {
 			+"&f8=/cr/f8/x8"
 			+"&f9=/cr/f9/x9"
 			+"&fa=http://www.apache.org/fa/xa%23MY_LABEL"
-			+"&fb=http://www.apache.org/fb/xb?label=MY_LABEL%26foo=bar"
-			+"&fc=http://www.apache.org/fc/xc?foo=bar%26label=MY_LABEL"
-			+"&fd=http://www.apache.org/fd/xd?label2=MY_LABEL%26foo=bar"
-			+"&fe=http://www.apache.org/fe/xe?foo=bar%26label2=MY_LABEL";
+			+"&fb='http://www.apache.org/fb/xb?label=MY_LABEL%26foo=bar'"
+			+"&fc='http://www.apache.org/fc/xc?foo=bar%26label=MY_LABEL'"
+			+"&fd='http://www.apache.org/fd/xd?label2=MY_LABEL%26foo=bar'"
+			+"&fe='http://www.apache.org/fe/xe?foo=bar%26label2=MY_LABEL'";
 		assertEquals(expected, r);
 
 		s.setRelativeUriBase("/cr/");  // Same as above
@@ -312,10 +309,10 @@ public class Common_UrlEncodingTest {
 			+"&f8=/f8/x8"
 			+"&f9=/f9/x9"
 			+"&fa=http://www.apache.org/fa/xa%23MY_LABEL"
-			+"&fb=http://www.apache.org/fb/xb?label=MY_LABEL%26foo=bar"
-			+"&fc=http://www.apache.org/fc/xc?foo=bar%26label=MY_LABEL"
-			+"&fd=http://www.apache.org/fd/xd?label2=MY_LABEL%26foo=bar"
-			+"&fe=http://www.apache.org/fe/xe?foo=bar%26label2=MY_LABEL";
+			+"&fb='http://www.apache.org/fb/xb?label=MY_LABEL%26foo=bar'"
+			+"&fc='http://www.apache.org/fc/xc?foo=bar%26label=MY_LABEL'"
+			+"&fd='http://www.apache.org/fd/xd?label2=MY_LABEL%26foo=bar'"
+			+"&fe='http://www.apache.org/fe/xe?foo=bar%26label2=MY_LABEL'";
 		assertEquals(expected, r);
 
 		s.setRelativeUriBase(null);
@@ -334,10 +331,10 @@ public class Common_UrlEncodingTest {
 			+"&f8=f8/x8"
 			+"&f9=f9/x9"
 			+"&fa=http://www.apache.org/fa/xa%23MY_LABEL"
-			+"&fb=http://www.apache.org/fb/xb?label=MY_LABEL%26foo=bar"
-			+"&fc=http://www.apache.org/fc/xc?foo=bar%26label=MY_LABEL"
-			+"&fd=http://www.apache.org/fd/xd?label2=MY_LABEL%26foo=bar"
-			+"&fe=http://www.apache.org/fe/xe?foo=bar%26label2=MY_LABEL";
+			+"&fb='http://www.apache.org/fb/xb?label=MY_LABEL%26foo=bar'"
+			+"&fc='http://www.apache.org/fc/xc?foo=bar%26label=MY_LABEL'"
+			+"&fd='http://www.apache.org/fd/xd?label2=MY_LABEL%26foo=bar'"
+			+"&fe='http://www.apache.org/fe/xe?foo=bar%26label2=MY_LABEL'";
 		assertEquals(expected, r);
 
 		s.setAbsolutePathUriBase("http://foo/");
@@ -358,10 +355,10 @@ public class Common_UrlEncodingTest {
 			+"&f8=f8/x8"
 			+"&f9=f9/x9"
 			+"&fa=http://www.apache.org/fa/xa%23MY_LABEL"
-			+"&fb=http://www.apache.org/fb/xb?label=MY_LABEL%26foo=bar"
-			+"&fc=http://www.apache.org/fc/xc?foo=bar%26label=MY_LABEL"
-			+"&fd=http://www.apache.org/fd/xd?label2=MY_LABEL%26foo=bar"
-			+"&fe=http://www.apache.org/fe/xe?foo=bar%26label2=MY_LABEL";
+			+"&fb='http://www.apache.org/fb/xb?label=MY_LABEL%26foo=bar'"
+			+"&fc='http://www.apache.org/fc/xc?foo=bar%26label=MY_LABEL'"
+			+"&fd='http://www.apache.org/fd/xd?label2=MY_LABEL%26foo=bar'"
+			+"&fe='http://www.apache.org/fe/xe?foo=bar%26label2=MY_LABEL'";
 		assertEquals(expected, r);
 	}
 
@@ -372,7 +369,7 @@ public class Common_UrlEncodingTest {
 	public void testLockedSerializer() throws Exception {
 		UrlEncodingSerializer s = new UrlEncodingSerializer().lock();
 		try {
-			s.setSimpleMode(true);
+			s.setUseWhitespace(true);
 			fail("Locked exception not thrown");
 		} catch (LockedException e) {}
 		try {
@@ -422,7 +419,7 @@ public class Common_UrlEncodingTest {
 		}
 
 		s.setIgnoreRecursions(true);
-		assertEquals("name=foo&r2=$o(name=bar,r3=$o(name=baz))", s.serialize(r1));
+		assertEquals("name=foo&r2=(name=bar,r3=(name=baz))", s.serialize(r1));
 	}
 
 	public static class R1 {

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/097b8103/juneau-core-test/src/test/java/org/apache/juneau/urlencoding/UonParserTest.java
----------------------------------------------------------------------
diff --git a/juneau-core-test/src/test/java/org/apache/juneau/urlencoding/UonParserTest.java b/juneau-core-test/src/test/java/org/apache/juneau/urlencoding/UonParserTest.java
index 375de89..de54711 100755
--- a/juneau-core-test/src/test/java/org/apache/juneau/urlencoding/UonParserTest.java
+++ b/juneau-core-test/src/test/java/org/apache/juneau/urlencoding/UonParserTest.java
@@ -40,24 +40,24 @@ public class UonParserTest {
 		assertEquals("a", p.parse(t, String.class));
 		assertEquals("a", p.parse(t, Object.class));
 		assertEquals("a", pe.parse(t, String.class));
-		t = "(a)";
+		t = "'a'";
 		assertEquals("a", p.parse(t, String.class));
 		assertEquals("a", p.parse(t, Object.class));
-		t = "$s(a)";
+		t = " 'a' ";
 		assertEquals("a", p.parse(t, String.class));
 
 		// 2nd level
-		t = "$o(a=a)";
+		t = "(a=a)";
 		assertEquals("a", ((Map)p.parse(t, Map.class)).get("a"));
 		assertEquals("a", ((Map)pe.parse(t, Map.class)).get("a"));
 
-		t = "(a=a)";
+		t = "('a'='a')";
 		assertEquals("a", ((Map)p.parse(t, Map.class)).get("a"));
 		assertEquals("a", ((Map)pe.parse(t, Map.class)).get("a"));
 
 		// Simple map
 		// Top level
-		t = "$o(a=b,c=$n(123),d=$b(false),e=$b(true),f=%00)";
+		t = "(a=b,c=123,d=false,e=true,f=null)";
 		m = p.parse(t, Map.class);
 		assertEquals("b", m.get("a"));
 		assertTrue(m.get("c") instanceof Number);
@@ -76,26 +76,20 @@ public class UonParserTest {
 
 		// null
 		// Top level
-		t = "%00";
-		assertEquals("%00", p.parse(t, Object.class));
+		t = "null";
+		assertNull(p.parse(t, Object.class));
 		assertNull(pe.parse(t, Object.class));
 
 		// 2nd level
-		t = "$o(%00=%00)";
+		t = "(null=null)";
 		m = p.parse(t, Map.class);
-		assertEquals("%00", m.get("%00"));
-		m = pe.parse(t, Map.class);
 		assertTrue(m.containsKey(null));
 		assertNull(m.get(null));
-
-		t = "(%00=%00)";
-		m = p.parse(t, Map.class);
-		assertEquals("%00", m.get("%00"));
 		m = pe.parse(t, Map.class);
 		assertTrue(m.containsKey(null));
 		assertNull(m.get(null));
 
-		t = "(\u0000=\u0000)";
+		t = " ( null = null ) ";
 		m = p.parse(t, Map.class);
 		assertTrue(m.containsKey(null));
 		assertNull(m.get(null));
@@ -104,42 +98,43 @@ public class UonParserTest {
 		assertNull(m.get(null));
 
 		// 3rd level
-		t = "$o(%00=$o(%00=%00))";
+		t = "(null=(null=null))";
 		m = p.parse(t, Map.class);
-		assertEquals("%00", ((Map)m.get("%00")).get("%00"));
+		assertTrue(((Map)m.get(null)).containsKey(null));
+		assertNull(((Map)m.get(null)).get(null));
 		m = pe.parse(t, Map.class);
 		assertTrue(((Map)m.get(null)).containsKey(null));
 		assertNull(((Map)m.get(null)).get(null));
 
 		// Empty array
 		// Top level
-		t = "$a()";
+		t = "@()";
 		List l = (List)p.parse(t, Object.class);
 		assertTrue(l.isEmpty());
-		t = "()";
+		t = " @( ) ";
 		l = p.parse(t, List.class);
 		assertTrue(l.isEmpty());
 
 		// 2nd level in map
-		t = "$o(x=$a())";
+		t = "(x=@())";
 		m = p.parse(t, HashMap.class, String.class, List.class);
 		assertTrue(m.containsKey("x"));
 		assertTrue(((List)m.get("x")).isEmpty());
 		m = (Map)p.parse(t, Object.class);
 		assertTrue(m.containsKey("x"));
 		assertTrue(((List)m.get("x")).isEmpty());
-		t = "(x=())";
+		t = " ( x = @( ) )";
 		m = p.parse(t, HashMap.class, String.class, List.class);
 		assertTrue(m.containsKey("x"));
 		assertTrue(((List)m.get("x")).isEmpty());
 
 		// Empty 2 dimensional array
-		t = "$a($a())";
+		t = "@(@())";
 		l = (List)p.parse(t, Object.class);
 		assertTrue(l.size() == 1);
 		l = (List)l.get(0);
 		assertTrue(l.isEmpty());
-		t = "(())";
+		t = " @( @( ) ) ";
 		l = p.parse(t, LinkedList.class, List.class);
 		assertTrue(l.size() == 1);
 		l = (List)l.get(0);
@@ -147,31 +142,31 @@ public class UonParserTest {
 
 		// Array containing empty string
 		// Top level
-		t = "$a(())";
+		t = "@('')";
 		l = (List)p.parse(t, Object.class);
 		assertTrue(l.size() == 1);
 		assertEquals("", l.get(0));
-		t = "(())";
+		t = " @( '' ) ";
 		l = p.parse(t, List.class, String.class);
 		assertTrue(l.size() == 1);
 		assertEquals("", l.get(0));
 
 		// 2nd level
-		t = "$o(()=$a(()))";
+		t = "(''=@(''))";
 		m = (Map)p.parse(t, Object.class);
 		assertEquals("", ((List)m.get("")).get(0));
-		t = "(=(()))";
+		t = " ( '' = @( '' ) ) ";
 		m = p.parse(t, HashMap.class, String.class, List.class);
 		assertEquals("", ((List)m.get("")).get(0));
 
 		// Array containing 3 empty strings
-		t = "$a(,,)";
+		t = "@('','','')";
 		l = (List)p.parse(t, Object.class);
 		assertTrue(l.size() == 3);
 		assertEquals("", l.get(0));
 		assertEquals("", l.get(1));
 		assertEquals("", l.get(2));
-		t = "(,,)";
+		t = " @( '' , '' , '' ) ";
 		l = p.parse(t, List.class, Object.class);
 		assertTrue(l.size() == 3);
 		assertEquals("", l.get(0));
@@ -180,18 +175,18 @@ public class UonParserTest {
 
 		// String containing \u0000
 		// Top level
-		t = "$s(\u0000)";
+		t = "'\u0000'";
 		assertEquals("\u0000", p.parse(t, Object.class));
-		t = "(\u0000)";
+		t = " '\u0000' ";
 		assertEquals("\u0000", p.parse(t, String.class));
 		assertEquals("\u0000", p.parse(t, Object.class));
 
 		// 2nd level
-		t = "$o((\u0000)=(\u0000))";
+		t = "('\u0000'='\u0000')";
 		m = (Map)p.parse(t, Object.class);
 		assertTrue(m.size() == 1);
 		assertEquals("\u0000", m.get("\u0000"));
-		t = "((\u0000)=(\u0000))";
+		t = " ( '\u0000' = '\u0000' ) ";
 		m = p.parse(t, HashMap.class, String.class, String.class);
 		assertTrue(m.size() == 1);
 		assertEquals("\u0000", m.get("\u0000"));
@@ -201,29 +196,26 @@ public class UonParserTest {
 
 		// Boolean
 		// Top level
-		t = "$b(false)";
+		t = "false";
 		Boolean b = (Boolean)p.parse(t, Object.class);
 		assertEquals(Boolean.FALSE, b);
 		b = p.parse(t, Boolean.class);
 		assertEquals(Boolean.FALSE, b);
-		t = "false";
+		t = " false ";
 		b = p.parse(t, Boolean.class);
 		assertEquals(Boolean.FALSE, b);
 
 		// 2nd level
-		t = "$o(x=$b(false))";
+		t = "(x=false)";
 		m = (Map)p.parse(t, Object.class);
 		assertEquals(Boolean.FALSE, m.get("x"));
-		t = "(x=$b(false))";
+		t = " ( x = false ) ";
 		m = p.parse(t, HashMap.class, String.class, Object.class);
 		assertEquals(Boolean.FALSE, m.get("x"));
-		t = "(x=false)";
-		m = p.parse(t, HashMap.class, String.class, Boolean.class);
-		assertEquals(Boolean.FALSE, m.get("x"));
 
 		// Number
 		// Top level
-		t = "$n(123)";
+		t = "123";
 		Integer i = (Integer)p.parse(t, Object.class);
 		assertEquals(123, i.intValue());
 		i = p.parse(t, Integer.class);
@@ -232,15 +224,15 @@ public class UonParserTest {
 		assertEquals(123, d.intValue());
 		Float f = p.parse(t, Float.class);
 		assertEquals(123, f.intValue());
-		t = "123";
+		t = " 123 ";
 		i = p.parse(t, Integer.class);
 		assertEquals(123, i.intValue());
 
 		// 2nd level
-		t = "$o(x=$n(123))";
+		t = "(x=123)";
 		m = (Map)p.parse(t, Object.class);
 		assertEquals(123, ((Integer)m.get("x")).intValue());
-		t = "(x=123)";
+		t = " ( x = 123 ) ";
 		m = p.parse(t, HashMap.class, String.class, Number.class);
 		assertEquals(123, ((Integer)m.get("x")).intValue());
 		m = p.parse(t, HashMap.class, String.class, Double.class);
@@ -248,12 +240,12 @@ public class UonParserTest {
 
 		// Unencoded chars
 		// Top level
-		t = "x;/?:@-_.!*'";
+		t = "x;/?:@-_.!*~'";
 		assertEquals("x;/?:@-_.!*'", p.parse(t, Object.class));
 		assertEquals("x;/?:@-_.!*'", pe.parse(t, Object.class));
 
 		// 2nd level
-		t = "$o(x;/?:@-_.!*'=x;/?:@-_.!*')";
+		t = "(x;/?:@-_.!*~'=x;/?:@-_.!*~')";
 		m = (Map)p.parse(t, Object.class);
 		assertEquals("x;/?:@-_.!*'", m.get("x;/?:@-_.!*'"));
 		m = p.parse(t, HashMap.class, String.class, Object.class);
@@ -277,7 +269,7 @@ public class UonParserTest {
 		assertEquals("x{}|\\^[]`<>#%\"&+", pe.parse(t, String.class));
 
 		// 2nd level
-		t = "$o(x{}|\\^[]`<>#%\"&+=x{}|\\^[]`<>#%\"&+)";
+		t = "(x{}|\\^[]`<>#%\"&+=x{}|\\^[]`<>#%\"&+)";
 		m = (Map)p.parse(t, Object.class);
 		assertEquals("x{}|\\^[]`<>#%\"&+", m.get("x{}|\\^[]`<>#%\"&+"));
 		try {
@@ -286,30 +278,24 @@ public class UonParserTest {
 		} catch (ParseException e) {
 			// Good.
 		}
-		t = "$o(x%7B%7D%7C%5C%5E%5B%5D%60%3C%3E%23%25%22%26%2B=x%7B%7D%7C%5C%5E%5B%5D%60%3C%3E%23%25%22%26%2B)";
+		t = "(x%7B%7D%7C%5C%5E%5B%5D%60%3C%3E%23%25%22%26%2B=x%7B%7D%7C%5C%5E%5B%5D%60%3C%3E%23%25%22%26%2B)";
 		m = (Map)pe.parse(t, Object.class);
 		assertEquals("x{}|\\^[]`<>#%\"&+", m.get("x{}|\\^[]`<>#%\"&+"));
 
 		// Special chars
 		// Top level
-		t = "x~$~,~(~)";
-		assertEquals("x$,()", p.parse(t, Object.class));
-		t = "(x~$~,~(~))";
-		assertEquals("x$,()", p.parse(t, Object.class));
-		t = "$s(x~$~,~(~))";
-		assertEquals("x$,()", p.parse(t, Object.class));
+		t = "'x$,()~''";
+		assertEquals("x$,()'", p.parse(t, Object.class));
+		t = " 'x$,()~'' ";
+		assertEquals("x$,()'", p.parse(t, Object.class));
 
 		// 2nd level
-		// Note behavior on serializeParams() is different since 2nd-level is top level.
-		t = "$o(x~$~,~(~)=x~$~,~(~))";
+		t = "('x$,()~''='x$,()~'')";
 		m = (Map)p.parse(t, Object.class);
-		assertEquals("x$,()", m.get("x$,()"));
-		t = "$o((x~$~,~(~))=(x~$~,~(~)))";
+		assertEquals("x$,()'", m.get("x$,()'"));
+		t = " ( 'x$,()~'' = 'x$,()~'' ) ";
 		m = (Map)p.parse(t, Object.class);
-		assertEquals("x$,()", m.get("x$,()"));
-		t = "$o($s(x~$~,~(~))=$s(x~$~,~(~)))";
-		m = (Map)p.parse(t, Object.class);
-		assertEquals("x$,()", m.get("x$,()"));
+		assertEquals("x$,()'", m.get("x$,()'"));
 
 		// Equals sign
 		// Gets encoded at top level, and encoded+escaped at 2nd level.
@@ -320,79 +306,64 @@ public class UonParserTest {
 		assertEquals("x=", pe.parse(t, Object.class));
 
 		// 2nd level
-		t = "$o(x~==x~=)";
+		t = "('x='='x=')";
 		m = (Map)p.parse(t, Object.class);
 		assertEquals("x=", m.get("x="));
-		t = "$o((x~=)=(x~=))";
+		t = "('x='='x=')";
 		m = (Map)p.parse(t, Object.class);
 		assertEquals("x=", m.get("x="));
-		t = "$o($s(x~=)=$s(x~=))";
+		t = " ( 'x=' = 'x=' ) ";
 		m = (Map)p.parse(t, Object.class);
 		assertEquals("x=", m.get("x="));
-		t = "(x~==x~=)";
+		t = "('x='='x=')";
 		m = p.parse(t, HashMap.class, String.class, Object.class);
 		assertEquals("x=", m.get("x="));
-		t = "((x~=)=(x~=))";
+		t = " ( 'x=' = 'x=' ) ";
 		m = p.parse(t, HashMap.class, String.class, Object.class);
 		assertEquals("x=", m.get("x="));
-		t = "($s(x~=)=$s(x~=))";
-		m = p.parse(t, HashMap.class, String.class, Object.class);
-		assertEquals("x=", m.get("x="));
-		t = "$o(x~%3D=x~%3D)";
-		m = (Map)pe.parse(t, Object.class);
-		assertEquals("x=", m.get("x="));
-		t = "$o((x~%3D)=(x~%3D))";
+		t = "('x%3D'='x%3D')";
 		m = (Map)pe.parse(t, Object.class);
 		assertEquals("x=", m.get("x="));
-		t = "$o($s(x~%3D)=$s(x~%3D))";
+		t = " ( 'x%3D' = 'x%3D' ) ";
 		m = (Map)pe.parse(t, Object.class);
 		assertEquals("x=", m.get("x="));
-		t = "(x~%3D=x~%3D)";
-		m = pe.parse(t, HashMap.class, String.class, Object.class);
-		assertEquals("x=", m.get("x="));
-		t = "((x~%3D)=(x~%3D))";
-		m = pe.parse(t, HashMap.class, String.class, Object.class);
-		assertEquals("x=", m.get("x="));
-		t = "($s(x~%3D)=$s(x~%3D))";
-		m = pe.parse(t, HashMap.class, String.class, Object.class);
-		assertEquals("x=", m.get("x="));
 
 		// String starting with parenthesis
 		// Top level
-		t = "~(~)";
+		t = "'()'";
 		assertEquals("()", p.parse(t, Object.class));
 		assertEquals("()", p.parse(t, String.class));
 
-		t = "(~(~))";
-		assertEquals("()", p.parse(t, Object.class));
-		assertEquals("()", p.parse(t, String.class));
-		t = "$s(~(~))";
+		t = " '()' ";
 		assertEquals("()", p.parse(t, Object.class));
 		assertEquals("()", p.parse(t, String.class));
 
 		// 2nd level
-		t = "$o((~(~))=(~(~)))";
+		t = "('()'='()')";
 		m = (Map)p.parse(t, Object.class);
 		assertEquals("()", m.get("()"));
-		t = "((~(~))=(~(~)))";
-		m = p.parse(t, HashMap.class, String.class, Object.class);
-		assertEquals("()", m.get("()"));
-		t = "($s(~(~))=$s(~(~)))";
+		t = " ( '()' = '()' ) ";
 		m = p.parse(t, HashMap.class, String.class, Object.class);
 		assertEquals("()", m.get("()"));
 
 		// String starting with $
 		// Top level
-		t = "($a)";
+		t = "$a";
 		assertEquals("$a", p.parse(t, Object.class));
-		t = "($a)";
+		t = "'$a'";
 		assertEquals("$a", p.parse(t, Object.class));
 
 		// 2nd level
-		t = "$o(($a)=($a))";
+		t = "($a=$a)";
+		m = (Map)p.parse(t, Object.class);
+		assertEquals("$a", m.get("$a"));
+		t = " ( $a = $a ) ";
 		m = (Map)p.parse(t, Object.class);
 		assertEquals("$a", m.get("$a"));
-		t = "(($a)=($a))";
+		t = "('$a'='$a')";
+		m = p.parse(t, HashMap.class, String.class, Object.class);
+		assertEquals("$a", m.get("$a"));
+		t = " ( '$a' = '$a' ) ";
 		m = p.parse(t, HashMap.class, String.class, Object.class);
 		assertEquals("$a", m.get("$a"));
 
@@ -403,36 +374,36 @@ public class UonParserTest {
 		assertEquals("", pe.parse(t, Object.class));
 
 		// 2nd level
-		t = "$o(=)";
+		t = "(=)";
 		m = (Map)p.parse(t, Object.class);
 		assertEquals("", m.get(""));
-		t = "(=)";
+		t = "(''='')";
 		m = p.parse(t, HashMap.class, String.class, Object.class);
 		assertEquals("", m.get(""));
 
 		// 3rd level
-		t = "$o(=$o(=))";
+		t = "(=(=))";
 		m = (Map)p.parse(t, Object.class);
 		assertEquals("", ((Map)m.get("")).get(""));
-		t = "(=(=))";
+		t = " ( = ( = ) ) ";
 		m = p.parse(t, HashMap.class, String.class, HashMap.class);
 		assertEquals("", ((Map)m.get("")).get(""));
 
 		// Newline character
 		// Top level
-		t = "(%0A)";
+		t = "'%0A'";
 		assertEquals("\n", pe.parse(t, Object.class));
 		assertEquals("%0A", p.parse(t, Object.class));
 
 		// 2nd level
-		t = "$o((%0A)=(%0A))";
+		t = "('%0A'='%0A')";
 		m = (Map)pe.parse(t, Object.class);
 		assertEquals("\n", m.get("\n"));
 		m = (Map)p.parse(t, Object.class);
 		assertEquals("%0A", m.get("%0A"));
 
 		// 3rd level
-		t = "$o((%0A)=$o((%0A)=(%0A)))";
+		t = "('%0A'=('%0A'='%0A'))";
 		m = (Map)pe.parse(t, Object.class);
 		assertEquals("\n", ((Map)m.get("\n")).get("\n"));
 	}
@@ -455,18 +426,18 @@ public class UonParserTest {
 		assertEquals("�", pe.parse(t, String.class));
 
 		// 2nd level
-		t = "$o(�=�)";
+		t = "(�=�)";
 		m = (Map)p.parse(t, Object.class);
 		assertEquals("�", m.get("�"));
-		t = "$o(%C2%A2=%C2%A2)";
+		t = "(%C2%A2=%C2%A2)";
 		m = (Map)pe.parse(t, Object.class);
 		assertEquals("�", m.get("�"));
 
 		// 3rd level
-		t = "$o(�=$o(�=�))";
+		t = "(�=(�=�))";
 		m = (Map)p.parse(t, Object.class);
 		assertEquals("�", ((Map)m.get("�")).get("�"));
-		t = "$o(%C2%A2=$o(%C2%A2=%C2%A2))";
+		t = "(%C2%A2=(%C2%A2=%C2%A2))";
 		m = (Map)pe.parse(t, Object.class);
 		assertEquals("�", ((Map)m.get("�")).get("�"));
 
@@ -480,18 +451,18 @@ public class UonParserTest {
 		assertEquals("\u20ac", pe.parse(t, String.class));
 
 		// 2nd level
-		t = "$o(\u20ac=\u20ac)";
+		t = "(\u20ac=\u20ac)";
 		m = (Map)p.parse(t, Object.class);
 		assertEquals("\u20ac", m.get("\u20ac"));
-		t = "$o(%E2%82%AC=%E2%82%AC)";
+		t = "(%E2%82%AC=%E2%82%AC)";
 		m = (Map)pe.parse(t, Object.class);
 		assertEquals("\u20ac", m.get("\u20ac"));
 
 		// 3rd level
-		t = "$o(\u20ac=$o(\u20ac=\u20ac))";
+		t = "(\u20ac=(\u20ac=\u20ac))";
 		m = (Map)p.parse(t, Object.class);
 		assertEquals("\u20ac", ((Map)m.get("\u20ac")).get("\u20ac"));
-		t = "$o(%E2%82%AC=$o(%E2%82%AC=%E2%82%AC))";
+		t = "(%E2%82%AC=(%E2%82%AC=%E2%82%AC))";
 		m = (Map)pe.parse(t, Object.class);
 		assertEquals("\u20ac", ((Map)m.get("\u20ac")).get("\u20ac"));
 
@@ -505,18 +476,18 @@ public class UonParserTest {
 		assertEquals("\U00024b62", pe.parse(t, String.class));
 
 		// 2nd level
-		t = "$o(\U00024b62=\U00024b62)";
+		t = "(\U00024b62=\U00024b62)";
 		m = (Map)p.parse(t, Object.class);
 		assertEquals("\U00024b62", m.get("\U00024b62"));
-		t = "$o(%F0%A4%AD%A2=%F0%A4%AD%A2)";
+		t = "(%F0%A4%AD%A2=%F0%A4%AD%A2)";
 		m = (Map)pe.parse(t, Object.class);
 		assertEquals("\U00024b62", m.get("\U00024b62"));
 
 		// 3rd level
-		t = "$o(\U00024b62=$o(\U00024b62=\U00024b62))";
+		t = "(\U00024b62=(\U00024b62=\U00024b62))";
 		m = (Map)p.parse(t, Object.class);
 		assertEquals("\U00024b62", ((Map)m.get("\U00024b62")).get("\U00024b62"));
-		t = "$o(%F0%A4%AD%A2=$o(%F0%A4%AD%A2=%F0%A4%AD%A2))";
+		t = "(%F0%A4%AD%A2=(%F0%A4%AD%A2=%F0%A4%AD%A2))";
 		m = (Map)pe.parse(t, Object.class);
 		assertEquals("\U00024b62", ((Map)m.get("\U00024b62")).get("\U00024b62"));
 	}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/097b8103/juneau-core-test/src/test/java/org/apache/juneau/urlencoding/UonSerializerTest.java
----------------------------------------------------------------------
diff --git a/juneau-core-test/src/test/java/org/apache/juneau/urlencoding/UonSerializerTest.java b/juneau-core-test/src/test/java/org/apache/juneau/urlencoding/UonSerializerTest.java
index 3787f90..4c6d001 100755
--- a/juneau-core-test/src/test/java/org/apache/juneau/urlencoding/UonSerializerTest.java
+++ b/juneau-core-test/src/test/java/org/apache/juneau/urlencoding/UonSerializerTest.java
@@ -21,9 +21,7 @@ import org.junit.*;
 public class UonSerializerTest {
 
 	static UonSerializer s = UonSerializer.DEFAULT_ENCODING;
-	static UonSerializer ss = UonSerializer.DEFAULT_SIMPLE_ENCODING;
 	static UonSerializer su = UonSerializer.DEFAULT;
-	static UonSerializer ssu = UonSerializer.DEFAULT_SIMPLE;
 	static UonSerializer sr = UonSerializer.DEFAULT_READABLE;
 
 
@@ -39,341 +37,261 @@ public class UonSerializerTest {
 		// Top level
 		t = "a";
 		assertEquals("a", s.serialize(t));
-		assertEquals("a", ss.serialize(t));
 		assertEquals("a", su.serialize(t));
-		assertEquals("a", ssu.serialize(t));
 		assertEquals("a", sr.serialize(t));
 
 		// 2nd level
 		t = new ObjectMap("{a:'a'}");
-		assertEquals("$o(a=a)", s.serialize(t));
-		assertEquals("(a=a)", ss.serialize(t));
-		assertEquals("$o(a=a)", su.serialize(t));
-		assertEquals("(a=a)", ssu.serialize(t));
-		assertEquals("$o(\n\ta=a\n)", sr.serialize(t));
+		assertEquals("(a=a)", s.serialize(t));
+		assertEquals("(a=a)", su.serialize(t));
+		assertEquals("(\n\ta=a\n)", sr.serialize(t));
 
 		// Simple map
 		// Top level
 		t = new ObjectMap("{a:'b',c:123,d:false,e:true,f:null}");
-		assertEquals("$o(a=b,c=$n(123),d=$b(false),e=$b(true),f=%00)", s.serialize(t));
-		assertEquals("(a=b,c=123,d=false,e=true,f=%00)", ss.serialize(t));
-		assertEquals("$o(a=b,c=$n(123),d=$b(false),e=$b(true),f=\u0000)", su.serialize(t));
-		assertEquals("(a=b,c=123,d=false,e=true,f=\u0000)", ssu.serialize(t));
-		assertEquals("$o(\n\ta=b,\n\tc=$n(123),\n\td=$b(false),\n\te=$b(true),\n\tf=\u0000\n)", sr.serialize(t));
+		assertEquals("(a=b,c=123,d=false,e=true,f=null)", s.serialize(t));
+		assertEquals("(a=b,c=123,d=false,e=true,f=null)", su.serialize(t));
+		assertEquals("(\n\ta=b,\n\tc=123,\n\td=false,\n\te=true,\n\tf=null\n)", sr.serialize(t));
 
 		// 2nd level
 		t = new ObjectMap("{a:{a:'b',c:123,d:false,e:true,f:null}}");
-		assertEquals("$o(a=$o(a=b,c=$n(123),d=$b(false),e=$b(true),f=%00))", s.serialize(t));
-		assertEquals("(a=(a=b,c=123,d=false,e=true,f=%00))", ss.serialize(t));
-		assertEquals("$o(a=$o(a=b,c=$n(123),d=$b(false),e=$b(true),f=\u0000))", su.serialize(t));
-		assertEquals("(a=(a=b,c=123,d=false,e=true,f=\u0000))", ssu.serialize(t));
-		assertEquals("$o(\n\ta=$o(\n\t\ta=b,\n\t\tc=$n(123),\n\t\td=$b(false),\n\t\te=$b(true),\n\t\tf=\u0000\n\t)\n)", sr.serialize(t));
+		assertEquals("(a=(a=b,c=123,d=false,e=true,f=null))", s.serialize(t));
+		assertEquals("(a=(a=b,c=123,d=false,e=true,f=null))", su.serialize(t));
+		assertEquals("(\n\ta=(\n\t\ta=b,\n\t\tc=123,\n\t\td=false,\n\t\te=true,\n\t\tf=null\n\t)\n)", sr.serialize(t));
 
 		// Simple map with primitives as literals
 		t = new ObjectMap("{a:'b',c:'123',d:'false',e:'true',f:'null'}");
-		assertEquals("$o(a=b,c=123,d=false,e=true,f=null)", s.serialize(t));
-		assertEquals("(a=b,c=123,d=false,e=true,f=null)", ss.serialize(t));
-		assertEquals("$o(a=b,c=123,d=false,e=true,f=null)", su.serialize(t));
-		assertEquals("(a=b,c=123,d=false,e=true,f=null)", ssu.serialize(t));
-		assertEquals("$o(\n\ta=b,\n\tc=123,\n\td=false,\n\te=true,\n\tf=null\n)", sr.serialize(t));
+		assertEquals("(a=b,c='123',d='false',e='true',f='null')", s.serialize(t));
+		assertEquals("(a=b,c='123',d='false',e='true',f='null')", su.serialize(t));
+		assertEquals("(\n\ta=b,\n\tc='123',\n\td='false',\n\te='true',\n\tf='null'\n)", sr.serialize(t));
 
 		// null
 		// Note that serializeParams is always encoded.
 		// Top level
 		t = null;
-		assertEquals("%00", s.serialize(t));
-		assertEquals("%00", ss.serialize(t));
-		assertEquals("\u0000", su.serialize(t));
-		assertEquals("\u0000", ssu.serialize(t));
-		assertEquals("\u0000", sr.serialize(t));
+		assertEquals("null", s.serialize(t));
+		assertEquals("null", su.serialize(t));
+		assertEquals("null", sr.serialize(t));
 
 		// 2nd level
 		t = new ObjectMap("{null:null}");
-		assertEquals("$o(%00=%00)", s.serialize(t));
-		assertEquals("(%00=%00)", ss.serialize(t));
-		assertEquals("$o(\u0000=\u0000)", su.serialize(t));
-		assertEquals("(\u0000=\u0000)", ssu.serialize(t));
-		assertEquals("$o(\n\t\u0000=\u0000\n)", sr.serialize(t));
+		assertEquals("(null=null)", s.serialize(t));
+		assertEquals("(null=null)", su.serialize(t));
+		assertEquals("(\n\tnull=null\n)", sr.serialize(t));
 
 		// 3rd level
 		t = new ObjectMap("{null:{null:null}}");
-		assertEquals("$o(%00=$o(%00=%00))", s.serialize(t));
-		assertEquals("(%00=(%00=%00))", ss.serialize(t));
-		assertEquals("$o(\u0000=$o(\u0000=\u0000))", su.serialize(t));
-		assertEquals("(\u0000=(\u0000=\u0000))", ssu.serialize(t));
-		assertEquals("$o(\n\t\u0000=$o(\n\t\t\u0000=\u0000\n\t)\n)", sr.serialize(t));
+		assertEquals("(null=(null=null))", s.serialize(t));
+		assertEquals("(null=(null=null))", su.serialize(t));
+		assertEquals("(\n\tnull=(\n\t\tnull=null\n\t)\n)", sr.serialize(t));
 
 		// Empty array
 		// Top level
 		t = new String[0];
-		assertEquals("$a()", s.serialize(t));
-		assertEquals("()", ss.serialize(t));
-		assertEquals("$a()", su.serialize(t));
-		assertEquals("()", ssu.serialize(t));
-		assertEquals("$a()", sr.serialize(t));
+		assertEquals("@()", s.serialize(t));
+		assertEquals("@()", su.serialize(t));
+		assertEquals("@()", sr.serialize(t));
 
 		// 2nd level in map
 		t = new ObjectMap("{x:[]}");
-		assertEquals("$o(x=$a())", s.serialize(t));
-		assertEquals("(x=())", ss.serialize(t));
-		assertEquals("$o(x=$a())", su.serialize(t));
-		assertEquals("(x=())", ssu.serialize(t));
-		assertEquals("$o(\n\tx=$a()\n)", sr.serialize(t));
+		assertEquals("(x=@())", s.serialize(t));
+		assertEquals("(x=@())", su.serialize(t));
+		assertEquals("(\n\tx=@()\n)", sr.serialize(t));
 
 		// Empty 2 dimensional array
 		t = new String[1][0];
-		assertEquals("$a($a())", s.serialize(t));
-		assertEquals("(())", ss.serialize(t));
-		assertEquals("$a($a())", su.serialize(t));
-		assertEquals("(())", ssu.serialize(t));
-		assertEquals("$a(\n\t$a()\n)", sr.serialize(t));
+		assertEquals("@(@())", s.serialize(t));
+		assertEquals("@(@())", su.serialize(t));
+		assertEquals("@(\n\t@()\n)", sr.serialize(t));
 
 		// Array containing empty string
 		// Top level
 		t = new String[]{""};
-		assertEquals("$a(())", s.serialize(t));
-		assertEquals("(())", ss.serialize(t));
-		assertEquals("$a(())", su.serialize(t));
-		assertEquals("(())", ssu.serialize(t));
-		assertEquals("$a(\n\t()\n)", sr.serialize(t));
+		assertEquals("@('')", s.serialize(t));
+		assertEquals("@('')", su.serialize(t));
+		assertEquals("@(\n\t''\n)", sr.serialize(t));
 
 		// 2nd level
 		t = new ObjectMap("{x:['']}");
-		assertEquals("$o(x=$a(()))", s.serialize(t));
-		assertEquals("(x=(()))", ss.serialize(t));
-		assertEquals("$o(x=$a(()))", su.serialize(t));
-		assertEquals("(x=(()))", ssu.serialize(t));
-		assertEquals("$o(\n\tx=$a(\n\t\t()\n\t)\n)", sr.serialize(t));
+		assertEquals("(x=@(''))", s.serialize(t));
+		assertEquals("(x=@(''))", su.serialize(t));
+		assertEquals("(\n\tx=@(\n\t\t''\n\t)\n)", sr.serialize(t));
 
 		// Array containing 3 empty strings
 		t = new String[]{"","",""};
-		assertEquals("$a(,,)", s.serialize(t));
-		assertEquals("(,,)", ss.serialize(t));
-		assertEquals("$a(,,)", su.serialize(t));
-		assertEquals("(,,)", ssu.serialize(t));
-		assertEquals("$a(\n\t(),\n\t(),\n\t()\n)", sr.serialize(t));
+		assertEquals("@('','','')", s.serialize(t));
+		assertEquals("@('','','')", su.serialize(t));
+		assertEquals("@(\n\t'',\n\t'',\n\t''\n)", sr.serialize(t));
 
 		// String containing \u0000
 		// Top level
 		t = "\u0000";
-		assertEquals("(%00)", s.serialize(t));
-		assertEquals("(%00)", ss.serialize(t));
-		assertEquals("(\u0000)", su.serialize(t));
-		assertEquals("(\u0000)", ssu.serialize(t));
-		assertEquals("(\u0000)", sr.serialize(t));
+		assertEquals("%00", s.serialize(t));
+		assertEquals("\u0000", su.serialize(t));
+		assertEquals("\u0000", sr.serialize(t));
 
 		// 2nd level
 		t = new ObjectMap("{'\u0000':'\u0000'}");
-		assertEquals("$o((%00)=(%00))", s.serialize(t));
-		assertEquals("((%00)=(%00))", ss.serialize(t));
-		assertEquals("$o((\u0000)=(\u0000))", su.serialize(t));
-		assertEquals("((\u0000)=(\u0000))", ssu.serialize(t));
-		assertEquals("$o(\n\t(\u0000)=(\u0000)\n)", sr.serialize(t));
+		assertEquals("(%00=%00)", s.serialize(t));
+		assertEquals("(\u0000=\u0000)", su.serialize(t));
+		assertEquals("(\n\t\u0000=\u0000\n)", sr.serialize(t));
 
 		// Boolean
 		// Top level
 		t = false;
-		assertEquals("$b(false)", s.serialize(t));
-		assertEquals("false", ss.serialize(t));
-		assertEquals("$b(false)", su.serialize(t));
-		assertEquals("false", ssu.serialize(t));
-		assertEquals("$b(false)", sr.serialize(t));
+		assertEquals("false", s.serialize(t));
+		assertEquals("false", su.serialize(t));
+		assertEquals("false", sr.serialize(t));
 
 		// 2nd level
 		t = new ObjectMap("{x:false}");
-		assertEquals("$o(x=$b(false))", s.serialize(t));
-		assertEquals("(x=false)", ss.serialize(t));
-		assertEquals("$o(x=$b(false))", su.serialize(t));
-		assertEquals("(x=false)", ssu.serialize(t));
-		assertEquals("$o(\n\tx=$b(false)\n)", sr.serialize(t));
+		assertEquals("(x=false)", s.serialize(t));
+		assertEquals("(x=false)", su.serialize(t));
+		assertEquals("(\n\tx=false\n)", sr.serialize(t));
 
 		// Number
 		// Top level
 		t = 123;
-		assertEquals("$n(123)", s.serialize(t));
-		assertEquals("123", ss.serialize(t));
-		assertEquals("$n(123)", su.serialize(t));
-		assertEquals("123", ssu.serialize(t));
-		assertEquals("$n(123)", sr.serialize(t));
+		assertEquals("123", s.serialize(t));
+		assertEquals("123", su.serialize(t));
+		assertEquals("123", sr.serialize(t));
 
 		// 2nd level
 		t = new ObjectMap("{x:123}");
-		assertEquals("$o(x=$n(123))", s.serialize(t));
-		assertEquals("(x=123)", ss.serialize(t));
-		assertEquals("$o(x=$n(123))", su.serialize(t));
-		assertEquals("(x=123)", ssu.serialize(t));
-		assertEquals("$o(\n\tx=$n(123)\n)", sr.serialize(t));
+		assertEquals("(x=123)", s.serialize(t));
+		assertEquals("(x=123)", su.serialize(t));
+		assertEquals("(\n\tx=123\n)", sr.serialize(t));
 
 		// Unencoded chars
 		// Top level
 		t = "x;/?:@-_.!*'";
-		assertEquals("x;/?:@-_.!*'", s.serialize(t));
-		assertEquals("x;/?:@-_.!*'", ss.serialize(t));
-		assertEquals("x;/?:@-_.!*'", su.serialize(t));
-		assertEquals("x;/?:@-_.!*'", ssu.serialize(t));
-		assertEquals("x;/?:@-_.!*'", sr.serialize(t));
+		assertEquals("x;/?:@-_.!*~'", s.serialize(t));
+		assertEquals("x;/?:@-_.!*~'", su.serialize(t));
+		assertEquals("x;/?:@-_.!*~'", sr.serialize(t));
 
 		// 2nd level
 		t = new ObjectMap("{x:'x;/?:@-_.!*\\''}");
-		assertEquals("$o(x=x;/?:@-_.!*')", s.serialize(t));
-		assertEquals("(x=x;/?:@-_.!*')", ss.serialize(t));
-		assertEquals("$o(x=x;/?:@-_.!*')", su.serialize(t));
-		assertEquals("(x=x;/?:@-_.!*')", ssu.serialize(t));
-		assertEquals("$o(\n\tx=x;/?:@-_.!*'\n)", sr.serialize(t));
+		assertEquals("(x=x;/?:@-_.!*~')", s.serialize(t));
+		assertEquals("(x=x;/?:@-_.!*~')", su.serialize(t));
+		assertEquals("(\n\tx=x;/?:@-_.!*~'\n)", sr.serialize(t));
 
 		// Encoded chars
 		// Top level
 		t = "x{}|\\^[]`<>#%\"&+";
 		assertEquals("x%7B%7D%7C%5C%5E%5B%5D%60%3C%3E%23%25%22%26%2B", s.serialize(t));
-		assertEquals("x%7B%7D%7C%5C%5E%5B%5D%60%3C%3E%23%25%22%26%2B", ss.serialize(t));
 		assertEquals("x{}|\\^[]`<>#%\"&+", su.serialize(t));
-		assertEquals("x{}|\\^[]`<>#%\"&+", ssu.serialize(t));
 		assertEquals("x{}|\\^[]`<>#%\"&+", sr.serialize(t));
 
 		// 2nd level
 		t = new ObjectMap("{'x{}|\\\\^[]`<>#%\"&+':'x{}|\\\\^[]`<>#%\"&+'}");
-		assertEquals("$o(x%7B%7D%7C%5C%5E%5B%5D%60%3C%3E%23%25%22%26%2B=x%7B%7D%7C%5C%5E%5B%5D%60%3C%3E%23%25%22%26%2B)", s.serialize(t));
-		assertEquals("(x%7B%7D%7C%5C%5E%5B%5D%60%3C%3E%23%25%22%26%2B=x%7B%7D%7C%5C%5E%5B%5D%60%3C%3E%23%25%22%26%2B)", ss.serialize(t));
-		assertEquals("$o(x{}|\\^[]`<>#%\"&+=x{}|\\^[]`<>#%\"&+)", su.serialize(t));
-		assertEquals("(x{}|\\^[]`<>#%\"&+=x{}|\\^[]`<>#%\"&+)", ssu.serialize(t));
-		assertEquals("$o(\n\tx{}|\\^[]`<>#%\"&+=x{}|\\^[]`<>#%\"&+\n)", sr.serialize(t));
+		assertEquals("(x%7B%7D%7C%5C%5E%5B%5D%60%3C%3E%23%25%22%26%2B=x%7B%7D%7C%5C%5E%5B%5D%60%3C%3E%23%25%22%26%2B)", s.serialize(t));
+		assertEquals("(x{}|\\^[]`<>#%\"&+=x{}|\\^[]`<>#%\"&+)", su.serialize(t));
+		assertEquals("(\n\tx{}|\\^[]`<>#%\"&+=x{}|\\^[]`<>#%\"&+\n)", sr.serialize(t));
 
 		// Escaped chars
 		// Top level
 		t = "x$,()~";
-		assertEquals("x$,()~", s.serialize(t));
-		assertEquals("x$,()~", ss.serialize(t));
-		assertEquals("x$,()~", su.serialize(t));
-		assertEquals("x$,()~", ssu.serialize(t));
-		assertEquals("x$,()~", sr.serialize(t));
+		assertEquals("'x$,()~~'", s.serialize(t));
+		assertEquals("'x$,()~~'", su.serialize(t));
+		assertEquals("'x$,()~~'", sr.serialize(t));
 
 		// 2nd level
 		// Note behavior on serializeParams() is different since 2nd-level is top level.
 		t = new ObjectMap("{'x$,()~':'x$,()~'}");
-		assertEquals("$o(x$~,~(~)~~=x$~,~(~)~~)", s.serialize(t));
-		assertEquals("(x$~,~(~)~~=x$~,~(~)~~)", ss.serialize(t));
-		assertEquals("$o(x$~,~(~)~~=x$~,~(~)~~)", su.serialize(t));
-		assertEquals("(x$~,~(~)~~=x$~,~(~)~~)", ssu.serialize(t));
-		assertEquals("$o(\n\tx$~,~(~)~~=x$~,~(~)~~\n)", sr.serialize(t));
+		assertEquals("('x$,()~~'='x$,()~~')", s.serialize(t));
+		assertEquals("('x$,()~~'='x$,()~~')", su.serialize(t));
+		assertEquals("(\n\t'x$,()~~'='x$,()~~'\n)", sr.serialize(t));
 
 		// 3rd level
 		// Note behavior on serializeParams().
 		t = new ObjectMap("{'x$,()~':{'x$,()~':'x$,()~'}}");
-		assertEquals("$o(x$~,~(~)~~=$o(x$~,~(~)~~=x$~,~(~)~~))", s.serialize(t));
-		assertEquals("(x$~,~(~)~~=(x$~,~(~)~~=x$~,~(~)~~))", ss.serialize(t));
-		assertEquals("$o(x$~,~(~)~~=$o(x$~,~(~)~~=x$~,~(~)~~))", su.serialize(t));
-		assertEquals("(x$~,~(~)~~=(x$~,~(~)~~=x$~,~(~)~~))", ssu.serialize(t));
-		assertEquals("$o(\n\tx$~,~(~)~~=$o(\n\t\tx$~,~(~)~~=x$~,~(~)~~\n\t)\n)", sr.serialize(t));
+		assertEquals("('x$,()~~'=('x$,()~~'='x$,()~~'))", s.serialize(t));
+		assertEquals("('x$,()~~'=('x$,()~~'='x$,()~~'))", su.serialize(t));
+		assertEquals("(\n\t'x$,()~~'=(\n\t\t'x$,()~~'='x$,()~~'\n\t)\n)", sr.serialize(t));
 
 		// Equals sign
 		// Gets encoded at top level, and encoded+escaped at 2nd level.
 		// Top level
 		t = "x=";
-		assertEquals("x=", s.serialize(t));
-		assertEquals("x=", ss.serialize(t));
-		assertEquals("x=", su.serialize(t));
-		assertEquals("x=", ssu.serialize(t));
-		assertEquals("x=", sr.serialize(t));
+		assertEquals("'x='", s.serialize(t));
+		assertEquals("'x='", su.serialize(t));
+		assertEquals("'x='", sr.serialize(t));
 
 		// 2nd level
 		t = new ObjectMap("{'x=':'x='}");
-		assertEquals("$o(x~==x~=)", s.serialize(t));
-		assertEquals("(x~==x~=)", ss.serialize(t));
-		assertEquals("$o(x~==x~=)", su.serialize(t));
-		assertEquals("(x~==x~=)", ssu.serialize(t));
-		assertEquals("$o(\n\tx~==x~=\n)", sr.serialize(t));
+		assertEquals("('x='='x=')", s.serialize(t));
+		assertEquals("('x='='x=')", su.serialize(t));
+		assertEquals("(\n\t'x='='x='\n)", sr.serialize(t));
 
 		// 3rd level
 		t = new ObjectMap("{'x=':{'x=':'x='}}");
-		assertEquals("$o(x~==$o(x~==x~=))", s.serialize(t));
-		assertEquals("(x~==(x~==x~=))", ss.serialize(t));
-		assertEquals("$o(x~==$o(x~==x~=))", su.serialize(t));
-		assertEquals("(x~==(x~==x~=))", ssu.serialize(t));
-		assertEquals("$o(\n\tx~==$o(\n\t\tx~==x~=\n\t)\n)", sr.serialize(t));
+		assertEquals("('x='=('x='='x='))", s.serialize(t));
+		assertEquals("('x='=('x='='x='))", su.serialize(t));
+		assertEquals("(\n\t'x='=(\n\t\t'x='='x='\n\t)\n)", sr.serialize(t));
 
 		// String starting with parenthesis
 		// Top level
 		t = "()";
-		assertEquals("(~(~))", s.serialize(t));
-		assertEquals("(~(~))", ss.serialize(t));
-		assertEquals("(~(~))", su.serialize(t));
-		assertEquals("(~(~))", ssu.serialize(t));
-		assertEquals("(~(~))", sr.serialize(t));
+		assertEquals("'()'", s.serialize(t));
+		assertEquals("'()'", su.serialize(t));
+		assertEquals("'()'", sr.serialize(t));
 
 		// 2nd level
 		t = new ObjectMap("{'()':'()'}");
-		assertEquals("$o((~(~))=(~(~)))", s.serialize(t));
-		assertEquals("((~(~))=(~(~)))", ss.serialize(t));
-		assertEquals("$o((~(~))=(~(~)))", su.serialize(t));
-		assertEquals("((~(~))=(~(~)))", ssu.serialize(t));
-		assertEquals("$o(\n\t(~(~))=(~(~))\n)", sr.serialize(t));
+		assertEquals("('()'='()')", s.serialize(t));
+		assertEquals("('()'='()')", su.serialize(t));
+		assertEquals("(\n\t'()'='()'\n)", sr.serialize(t));
 
 		// String starting with $
 		// Top level
 		t = "$a";
-		assertEquals("($a)", s.serialize(t));
-		assertEquals("($a)", ss.serialize(t));
-		assertEquals("($a)", su.serialize(t));
-		assertEquals("($a)", ssu.serialize(t));
-		assertEquals("($a)", sr.serialize(t));
+		assertEquals("$a", s.serialize(t));
+		assertEquals("$a", su.serialize(t));
+		assertEquals("$a", sr.serialize(t));
 
 		// 2nd level
 		t = new ObjectMap("{$a:'$a'}");
-		assertEquals("$o(($a)=($a))", s.serialize(t));
-		assertEquals("(($a)=($a))", ss.serialize(t));
-		assertEquals("$o(($a)=($a))", su.serialize(t));
-		assertEquals("(($a)=($a))", ssu.serialize(t));
-		assertEquals("$o(\n\t($a)=($a)\n)", sr.serialize(t));
+		assertEquals("($a=$a)", s.serialize(t));
+		assertEquals("($a=$a)", su.serialize(t));
+		assertEquals("(\n\t$a=$a\n)", sr.serialize(t));
 
 		// Blank string
 		// Top level
 		t = "";
-		assertEquals("", s.serialize(t));
-		assertEquals("", ss.serialize(t));
-		assertEquals("", su.serialize(t));
-		assertEquals("", ssu.serialize(t));
-		assertEquals("", sr.serialize(t));
+		assertEquals("''", s.serialize(t));
+		assertEquals("''", su.serialize(t));
+		assertEquals("''", sr.serialize(t));
 
 		// 2nd level
 		t = new ObjectMap("{'':''}");
-		assertEquals("$o(=)", s.serialize(t));
-		assertEquals("(=)", ss.serialize(t));
-		assertEquals("$o(=)", su.serialize(t));
-		assertEquals("(=)", ssu.serialize(t));
-		assertEquals("$o(\n\t()=()\n)", sr.serialize(t));
+		assertEquals("(''='')", s.serialize(t));
+		assertEquals("(''='')", su.serialize(t));
+		assertEquals("(\n\t''=''\n)", sr.serialize(t));
 
 		// 3rd level
 		t = new ObjectMap("{'':{'':''}}");
-		assertEquals("$o(=$o(=))", s.serialize(t));
-		assertEquals("(=(=))", ss.serialize(t));
-		assertEquals("$o(=$o(=))", su.serialize(t));
-		assertEquals("(=(=))", ssu.serialize(t));
-		assertEquals("$o(\n\t()=$o(\n\t\t()=()\n\t)\n)", sr.serialize(t));
+		assertEquals("(''=(''=''))", s.serialize(t));
+		assertEquals("(''=(''=''))", su.serialize(t));
+		assertEquals("(\n\t''=(\n\t\t''=''\n\t)\n)", sr.serialize(t));
 
 		// Newline character
 		// Top level
 		t = "\n";
-		assertEquals("%0A", s.serialize(t));
-		assertEquals("%0A", ss.serialize(t));
-		assertEquals("\n", su.serialize(t));
-		assertEquals("\n", ssu.serialize(t));
-		assertEquals("(\n)", sr.serialize(t));
+		assertEquals("'%0A'", s.serialize(t));
+		assertEquals("'\n'", su.serialize(t));
+		assertEquals("'\n'", sr.serialize(t));
 
 		// 2nd level
 		t = new ObjectMap("{'\n':'\n'}");
-		assertEquals("$o(%0A=%0A)", s.serialize(t));
-		assertEquals("(%0A=%0A)", ss.serialize(t));
-		assertEquals("$o(\n=\n)", su.serialize(t));
-		assertEquals("(\n=\n)", ssu.serialize(t));
-		assertEquals("$o(\n\t(\n)=(\n)\n)", sr.serialize(t));
+		assertEquals("('%0A'='%0A')", s.serialize(t));
+		assertEquals("('\n'='\n')", su.serialize(t));
+		assertEquals("(\n\t'\n'='\n'\n)", sr.serialize(t));
 
 		// 3rd level
 		t = new ObjectMap("{'\n':{'\n':'\n'}}");
-		assertEquals("$o(%0A=$o(%0A=%0A))", s.serialize(t));
-		assertEquals("(%0A=(%0A=%0A))", ss.serialize(t));
-		assertEquals("$o(\n=$o(\n=\n))", su.serialize(t));
-		assertEquals("(\n=(\n=\n))", ssu.serialize(t));
-		assertEquals("$o(\n\t(\n)=$o(\n\t\t(\n)=(\n)\n\t)\n)", sr.serialize(t));
+		assertEquals("('%0A'=('%0A'='%0A'))", s.serialize(t));
+		assertEquals("('\n'=('\n'='\n'))", su.serialize(t));
+		assertEquals("(\n\t'\n'=(\n\t\t'\n'='\n'\n\t)\n)", sr.serialize(t));
 	}
 
 	//====================================================================================================
@@ -387,75 +305,57 @@ public class UonSerializerTest {
 		// Top level
 		t = "�";
 		assertEquals("%C2%A2", s.serialize(t));
-		assertEquals("%C2%A2", ss.serialize(t));
 		assertEquals("�", su.serialize(t));
-		assertEquals("�", ssu.serialize(t));
 		assertEquals("�", sr.serialize(t));
 
 		// 2nd level
 		t = new ObjectMap("{'�':'�'}");
-		assertEquals("$o(%C2%A2=%C2%A2)", s.serialize(t));
-		assertEquals("(%C2%A2=%C2%A2)", ss.serialize(t));
-		assertEquals("$o(�=�)", su.serialize(t));
-		assertEquals("(�=�)", ssu.serialize(t));
-		assertEquals("$o(\n\t�=�\n)", sr.serialize(t));
+		assertEquals("(%C2%A2=%C2%A2)", s.serialize(t));
+		assertEquals("(�=�)", su.serialize(t));
+		assertEquals("(\n\t�=�\n)", sr.serialize(t));
 
 		// 3rd level
 		t = new ObjectMap("{'�':{'�':'�'}}");
-		assertEquals("$o(%C2%A2=$o(%C2%A2=%C2%A2))", s.serialize(t));
-		assertEquals("(%C2%A2=(%C2%A2=%C2%A2))", ss.serialize(t));
-		assertEquals("$o(�=$o(�=�))", su.serialize(t));
-		assertEquals("(�=(�=�))", ssu.serialize(t));
-		assertEquals("$o(\n\t�=$o(\n\t\t�=�\n\t)\n)", sr.serialize(t));
+		assertEquals("(%C2%A2=(%C2%A2=%C2%A2))", s.serialize(t));
+		assertEquals("(�=(�=�))", su.serialize(t));
+		assertEquals("(\n\t�=(\n\t\t�=�\n\t)\n)", sr.serialize(t));
 
 		// 3-byte UTF-8 character
 		// Top level
 		t = "\u20ac";
 		assertEquals("%E2%82%AC", s.serialize(t));
-		assertEquals("%E2%82%AC", ss.serialize(t));
 		assertEquals("\u20ac", su.serialize(t));
-		assertEquals("\u20ac", ssu.serialize(t));
 		assertEquals("\u20ac", sr.serialize(t));
 
 		// 2nd level
 		t = new ObjectMap("{'\u20ac':'\u20ac'}");
-		assertEquals("$o(%E2%82%AC=%E2%82%AC)", s.serialize(t));
-		assertEquals("(%E2%82%AC=%E2%82%AC)", ss.serialize(t));
-		assertEquals("$o(\u20ac=\u20ac)", su.serialize(t));
-		assertEquals("(\u20ac=\u20ac)", ssu.serialize(t));
-		assertEquals("$o(\n\t\u20ac=\u20ac\n)", sr.serialize(t));
+		assertEquals("(%E2%82%AC=%E2%82%AC)", s.serialize(t));
+		assertEquals("(\u20ac=\u20ac)", su.serialize(t));
+		assertEquals("(\n\t\u20ac=\u20ac\n)", sr.serialize(t));
 
 		// 3rd level
 		t = new ObjectMap("{'\u20ac':{'\u20ac':'\u20ac'}}");
-		assertEquals("$o(%E2%82%AC=$o(%E2%82%AC=%E2%82%AC))", s.serialize(t));
-		assertEquals("(%E2%82%AC=(%E2%82%AC=%E2%82%AC))", ss.serialize(t));
-		assertEquals("$o(\u20ac=$o(\u20ac=\u20ac))", su.serialize(t));
-		assertEquals("(\u20ac=(\u20ac=\u20ac))", ssu.serialize(t));
-		assertEquals("$o(\n\t\u20ac=$o(\n\t\t\u20ac=\u20ac\n\t)\n)", sr.serialize(t));
+		assertEquals("(%E2%82%AC=(%E2%82%AC=%E2%82%AC))", s.serialize(t));
+		assertEquals("(\u20ac=(\u20ac=\u20ac))", su.serialize(t));
+		assertEquals("(\n\t\u20ac=(\n\t\t\u20ac=\u20ac\n\t)\n)", sr.serialize(t));
 
 		// 4-byte UTF-8 character
 		// Top level
 		t = "\U00024b62";
 		assertEquals("%F0%A4%AD%A2", s.serialize(t));
-		assertEquals("%F0%A4%AD%A2", ss.serialize(t));
 		assertEquals("\U00024b62", su.serialize(t));
-		assertEquals("\U00024b62", ssu.serialize(t));
 		assertEquals("\U00024b62", sr.serialize(t));
 
 		// 2nd level
 		t = new ObjectMap("{'\U00024b62':'\U00024b62'}");
-		assertEquals("$o(%F0%A4%AD%A2=%F0%A4%AD%A2)", s.serialize(t));
-		assertEquals("(%F0%A4%AD%A2=%F0%A4%AD%A2)", ss.serialize(t));
-		assertEquals("$o(\U00024b62=\U00024b62)", su.serialize(t));
-		assertEquals("(\U00024b62=\U00024b62)", ssu.serialize(t));
-		assertEquals("$o(\n\t\U00024b62=\U00024b62\n)", sr.serialize(t));
+		assertEquals("(%F0%A4%AD%A2=%F0%A4%AD%A2)", s.serialize(t));
+		assertEquals("(\U00024b62=\U00024b62)", su.serialize(t));
+		assertEquals("(\n\t\U00024b62=\U00024b62\n)", sr.serialize(t));
 
 		// 3rd level
 		t = new ObjectMap("{'\U00024b62':{'\U00024b62':'\U00024b62'}}");
-		assertEquals("$o(%F0%A4%AD%A2=$o(%F0%A4%AD%A2=%F0%A4%AD%A2))", s.serialize(t));
-		assertEquals("(%F0%A4%AD%A2=(%F0%A4%AD%A2=%F0%A4%AD%A2))", ss.serialize(t));
-		assertEquals("$o(\U00024b62=$o(\U00024b62=\U00024b62))", su.serialize(t));
-		assertEquals("(\U00024b62=(\U00024b62=\U00024b62))", ssu.serialize(t));
-		assertEquals("$o(\n\t\U00024b62=$o(\n\t\t\U00024b62=\U00024b62\n\t)\n)", sr.serialize(t));
+		assertEquals("(%F0%A4%AD%A2=(%F0%A4%AD%A2=%F0%A4%AD%A2))", s.serialize(t));
+		assertEquals("(\U00024b62=(\U00024b62=\U00024b62))", su.serialize(t));
+		assertEquals("(\n\t\U00024b62=(\n\t\t\U00024b62=\U00024b62\n\t)\n)", sr.serialize(t));
 	}
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/097b8103/juneau-core-test/src/test/java/org/apache/juneau/urlencoding/UrlEncodingParserTest.java
----------------------------------------------------------------------
diff --git a/juneau-core-test/src/test/java/org/apache/juneau/urlencoding/UrlEncodingParserTest.java b/juneau-core-test/src/test/java/org/apache/juneau/urlencoding/UrlEncodingParserTest.java
index 30ab795..753d585 100755
--- a/juneau-core-test/src/test/java/org/apache/juneau/urlencoding/UrlEncodingParserTest.java
+++ b/juneau-core-test/src/test/java/org/apache/juneau/urlencoding/UrlEncodingParserTest.java
@@ -41,19 +41,19 @@ public class UrlEncodingParserTest {
 		t = "_value=a";
 		assertEquals("a", p.parse(t, Object.class));
 		assertEquals("a", p.parse(t, String.class));
-		t = "_value=(a)";
+		t = "_value='a'";
 		assertEquals("a", p.parse(t, String.class));
 		assertEquals("a", p.parse(t, Object.class));
-		t = "_value=$s(a)";
+		t = "_value= 'a' ";
 		assertEquals("a", p.parse(t, String.class));
 
 		t = "a";
 		assertEquals("a", p.parseParameter(t, Object.class));
 		assertEquals("a", p.parseParameter(t, String.class));
-		t = "(a)";
+		t = "'a'";
 		assertEquals("a", p.parseParameter(t, String.class));
 		assertEquals("a", p.parseParameter(t, Object.class));
-		t = "$s(a)";
+		t = " 'a' ";
 		assertEquals("a", p.parseParameter(t, String.class));
 
 		// 2nd level
@@ -62,7 +62,7 @@ public class UrlEncodingParserTest {
 
 		// Simple map
 		// Top level
-		t = "?a=b&c=$n(123)&d=$b(false)&e=$b(true)&f=%00";
+		t = "?a=b&c=123&d=false&e=true&f=null";
 		m = p.parse(t, Map.class);
 		assertEquals("b", m.get("a"));
 		assertTrue(m.get("c") instanceof Number);
@@ -73,7 +73,7 @@ public class UrlEncodingParserTest {
 		assertEquals(Boolean.TRUE, m.get("e"));
 		assertNull(m.get("f"));
 
-		t = "$o(a=b,c=$n(123),d=$b(false),e=$b(true),f=%00)";
+		t = "(a=b,c=123,d=false,e=true,f=%00)";
 		m = p.parseParameter(t, Map.class);
 		assertEquals("b", m.get("a"));
 		assertTrue(m.get("c") instanceof Number);
@@ -84,7 +84,7 @@ public class UrlEncodingParserTest {
 		assertEquals(Boolean.TRUE, m.get("e"));
 		assertEquals("%00", m.get("f"));
 
-		t = "$o(a=b,c=$n(123),d=$b(false),e=$b(true),f=\u0000)";
+		t = "(a=b,c=123,d=false,e=true,f=null)";
 		m = p.parseParameter(t, Map.class);
 		assertTrue(m.containsKey("f"));
 		assertNull(m.get("f"));
@@ -96,75 +96,73 @@ public class UrlEncodingParserTest {
 
 		// null
 		// Top level
-		t = "_value=%00";
+		t = "_value=null";
 		assertNull(p.parse(t, Object.class));
-		t = "\u0000";
+		t = "null";
 		assertNull(p.parseParameter(t, Object.class));
-		t = "%00";
-		assertEquals("%00", p.parseParameter(t, Object.class));
 
 		// 2nd level
-		t = "?%00=%00";
+		t = "?null=null";
 		m = p.parse(t, Map.class);
 		assertTrue(m.containsKey(null));
 		assertNull(m.get(null));
 
-		t = "?\u0000=\u0000";
+		t = "?null=null";
 		m = p.parse(t, Map.class);
 		assertTrue(m.containsKey(null));
 		assertNull(m.get(null));
 
 		// 3rd level
-		t = "?%00=$o(%00=%00)";
+		t = "?null=(null=null)";
 		m = p.parse(t, Map.class);
 		assertTrue(((Map)m.get(null)).containsKey(null));
 		assertNull(((Map)m.get(null)).get(null));
 
 		// Empty array
 		// Top level
-		t = "_value=$a()";
+		t = "_value=@()";
 		l = (List)p.parse(t, Object.class);
 		assertTrue(l.isEmpty());
-		t = "_value=()";
+		t = "_value= @( ) ";
 		l = p.parse(t, List.class);
 		assertTrue(l.isEmpty());
-		t = "$a()";
+		t = "@()";
 		l = (List)p.parseParameter(t, Object.class);
 		assertTrue(l.isEmpty());
-		t = "()";
+		t = " @( ) ";
 		l = p.parseParameter(t, List.class);
 		assertTrue(l.isEmpty());
 
 		// 2nd level in map
-		t = "?x=$a()";
+		t = "?x=@()";
 		m = p.parse(t, HashMap.class, String.class, List.class);
 		assertTrue(m.containsKey("x"));
 		assertTrue(((List)m.get("x")).isEmpty());
 		m = (Map)p.parse(t, Object.class);
 		assertTrue(m.containsKey("x"));
 		assertTrue(((List)m.get("x")).isEmpty());
-		t = "?x=()";
+		t = "?x=@()";
 		m = p.parse(t, HashMap.class, String.class, List.class);
 		assertTrue(m.containsKey("x"));
 		assertTrue(((List)m.get("x")).isEmpty());
 
 		// Empty 2 dimensional array
-		t = "_value=$a($a())";
+		t = "_value=@(@())";
 		l = (List)p.parse(t, Object.class);
 		assertTrue(l.size() == 1);
 		l = (List)l.get(0);
 		assertTrue(l.isEmpty());
-		t = "0=()";
+		t = "0=@()";
 		l = p.parse(t, LinkedList.class, List.class);
 		assertTrue(l.size() == 1);
 		l = (List)l.get(0);
 		assertTrue(l.isEmpty());
-		t = "$a($a())";
+		t = "@(@())";
 		l = (List)p.parseParameter(t, Object.class);
 		assertTrue(l.size() == 1);
 		l = (List)l.get(0);
 		assertTrue(l.isEmpty());
-		t = "(())";
+		t = "@(@())";
 		l = (List)p.parseParameter(t, LinkedList.class, List.class);
 		assertTrue(l.size() == 1);
 		l = (List)l.get(0);
@@ -172,51 +170,51 @@ public class UrlEncodingParserTest {
 
 		// Array containing empty string
 		// Top level
-		t = "_value=$a(())";
+		t = "_value=@('')";
 		l = (List)p.parse(t, Object.class);
 		assertTrue(l.size() == 1);
 		assertEquals("", l.get(0));
-		t = "0=()";
+		t = "0=''";
 		l = p.parse(t, List.class, String.class);
 		assertTrue(l.size() == 1);
 		assertEquals("", l.get(0));
-		t = "$a(())";
+		t = "@('')";
 		l = (List)p.parseParameter(t, Object.class);
 		assertTrue(l.size() == 1);
 		assertEquals("", l.get(0));
-		t = "(())";
+		t = "@('')";
 		l = (List)p.parseParameter(t, List.class, String.class);
 		assertTrue(l.size() == 1);
 		assertEquals("", l.get(0));
 
 		// 2nd level
-		t = "?()=$a(())";
+		t = "?''=@('')";
 		m = (Map)p.parse(t, Object.class);
 		assertEquals("", ((List)m.get("")).get(0));
-		t = "?()=(())";
+		t = "?''=@('')";
 		m = p.parse(t, HashMap.class, String.class, List.class);
 		assertEquals("", ((List)m.get("")).get(0));
 
 		// Array containing 3 empty strings
-		t = "_value=$a(,,)";
+		t = "_value=@('','','')";
 		l = (List)p.parse(t, Object.class);
 		assertTrue(l.size() == 3);
 		assertEquals("", l.get(0));
 		assertEquals("", l.get(1));
 		assertEquals("", l.get(2));
-		t = "0=&1=&2=";
+		t = "0=''&1=''&2=''";
 		l = p.parse(t, List.class, Object.class);
 		assertTrue(l.size() == 3);
 		assertEquals("", l.get(0));
 		assertEquals("", l.get(1));
 		assertEquals("", l.get(2));
-		t = "$a(,,)";
+		t = "@('','','')";
 		l = (List)p.parseParameter(t, Object.class);
 		assertTrue(l.size() == 3);
 		assertEquals("", l.get(0));
 		assertEquals("", l.get(1));
 		assertEquals("", l.get(2));
-		t = "(,,)";
+		t = "@('','','')";
 		l = (List)p.parseParameter(t, List.class, Object.class);
 		assertTrue(l.size() == 3);
 		assertEquals("", l.get(0));
@@ -225,19 +223,19 @@ public class UrlEncodingParserTest {
 
 		// String containing \u0000
 		// Top level
-		t = "_value=$s(\u0000)";
+		t = "_value='\u0000'";
 		assertEquals("\u0000", p.parse(t, Object.class));
-		t = "_value=(\u0000)";
+		t = "_value='\u0000'";
 		assertEquals("\u0000", p.parse(t, String.class));
 		assertEquals("\u0000", p.parse(t, Object.class));
-		t = "$s(\u0000)";
+		t = "'\u0000'";
 		assertEquals("\u0000", p.parseParameter(t, Object.class));
-		t = "(\u0000)";
+		t = "'\u0000'";
 		assertEquals("\u0000", p.parseParameter(t, String.class));
 		assertEquals("\u0000", p.parseParameter(t, Object.class));
 
 		// 2nd level
-		t = "?(\u0000)=(\u0000)";
+		t = "?'\u0000'='\u0000'";
 		m = (Map)p.parse(t, Object.class);
 		assertTrue(m.size() == 1);
 		assertEquals("\u0000", m.get("\u0000"));
@@ -247,7 +245,7 @@ public class UrlEncodingParserTest {
 
 		// Boolean
 		// Top level
-		t = "_value=$b(false)";
+		t = "_value=false";
 		Boolean b = (Boolean)p.parse(t, Object.class);
 		assertEquals(Boolean.FALSE, b);
 		b = p.parse(t, Boolean.class);
@@ -255,7 +253,7 @@ public class UrlEncodingParserTest {
 		t = "_value=false";
 		b = p.parse(t, Boolean.class);
 		assertEquals(Boolean.FALSE, b);
-		t = "$b(false)";
+		t = "false";
 		b = (Boolean)p.parseParameter(t, Object.class);
 		assertEquals(Boolean.FALSE, b);
 		b = p.parseParameter(t, Boolean.class);
@@ -265,7 +263,7 @@ public class UrlEncodingParserTest {
 		assertEquals(Boolean.FALSE, b);
 
 		// 2nd level
-		t = "?x=$b(false)";
+		t = "?x=false";
 		m = (Map)p.parse(t, Object.class);
 		assertEquals(Boolean.FALSE, m.get("x"));
 		t = "?x=false";
@@ -274,7 +272,7 @@ public class UrlEncodingParserTest {
 
 		// Number
 		// Top level
-		t = "_value=$n(123)";
+		t = "_value=123";
 		Integer i = (Integer)p.parse(t, Object.class);
 		assertEquals(123, i.intValue());
 		i = p.parse(t, Integer.class);
@@ -286,7 +284,7 @@ public class UrlEncodingParserTest {
 		t = "_value=123";
 		i = p.parse(t, Integer.class);
 		assertEquals(123, i.intValue());
-		t = "$n(123)";
+		t = "123";
 		i = (Integer)p.parseParameter(t, Object.class);
 		assertEquals(123, i.intValue());
 		i = p.parseParameter(t, Integer.class);
@@ -300,7 +298,7 @@ public class UrlEncodingParserTest {
 		assertEquals(123, i.intValue());
 
 		// 2nd level
-		t = "?x=$n(123)";
+		t = "?x=123";
 		m = (Map)p.parse(t, Object.class);
 		assertEquals(123, ((Integer)m.get("x")).intValue());
 		m = p.parse(t, HashMap.class, String.class, Double.class);
@@ -355,86 +353,77 @@ public class UrlEncodingParserTest {
 		// Special chars
 		// These characters are escaped and not encoded.
 		// Top level
-		t = "_value=x~$~,~(~)";
+		t = "_value='x$,()'";
 		assertEquals("x$,()", p.parse(t, Object.class));
-		t = "x~$~,~(~)";
+		t = "'x$,()'";
 		assertEquals("x$,()", p.parseParameter(t, Object.class));
-		t = "_value=x~~$~~,~~(~~)";
+		t = "_value='x~~$~~,~~(~~)'";
 		assertEquals("x~$~,~(~)", p.parse(t, Object.class));
-		t = "x~~$~~,~~(~~)";
+		t = "'x~~$~~,~~(~~)'";
 		assertEquals("x~$~,~(~)", p.parseParameter(t, Object.class));
 
 		// At secondary levels, these characters are escaped and not encoded.
 		// 2nd level
-		t = "?x~$~,~(~)=x~$~,~(~)";
+		t = "?'x$,()'='x$,()'";
 		m = (Map)p.parse(t, Object.class);
 		assertEquals("x$,()", m.get("x$,()"));
-		t = "?x~~$~~,~~(~~)=x~~$~~,~~(~~)";
+		t = "?'x~~$~~,~~(~~)'='x~~$~~,~~(~~)'";
 		m = (Map)p.parse(t, Object.class);
 		assertEquals("x~$~,~(~)", m.get("x~$~,~(~)"));
 
 		// Equals sign
 		// Gets encoded at top level, and encoded+escaped at 2nd level.
 		// Top level
-		t = "_value=x=";
+		t = "_value='x='";
 		assertEquals("x=", p.parse(t, Object.class));
-		t = "_value=x%3D";
+		t = "_value='x%3D'";
 		assertEquals("x=", p.parse(t, Object.class));
-		t = "x=";
+		t = "'x='";
 		assertEquals("x=", p.parseParameter(t, Object.class));
-		t = "x%3D";
+		t = "'x%3D'";
 		assertEquals("x%3D", p.parseParameter(t, Object.class));
 
 		// 2nd level
-		t = "?x~%3D=x~%3D";
+		t = "?'x%3D'='x%3D'";
 		m = (Map)p.parse(t, Object.class);
 		assertEquals("x=", m.get("x="));
-		t = "?x~~%3D=x~~%3D";
+		t = "?'x~~%3D'='x~~%3D'";
 		m = (Map)p.parse(t, Object.class);
 		assertEquals("x~=", m.get("x~="));
 
 		// String starting with parenthesis
 		// Top level
-		t = "_value=~(~)";
-		assertEquals("()", p.parse(t, Object.class));
-		assertEquals("()", p.parse(t, String.class));
-		t = "_value=(~(~))";
+		t = "_value='()'";
 		assertEquals("()", p.parse(t, Object.class));
 		assertEquals("()", p.parse(t, String.class));
-		t = "_value=(~(~))";
+		t = "_value='()'";
 		assertEquals("()", p.parse(t, Object.class));
 		assertEquals("()", p.parse(t, String.class));
-		t = "~(~)";
-		assertEquals("()", p.parseParameter(t, Object.class));
-		assertEquals("()", p.parseParameter(t, String.class));
-		t = "(~(~))";
-		assertEquals("()", p.parseParameter(t, Object.class));
-		assertEquals("()", p.parseParameter(t, String.class));
-		t = "(~(~))";
+		t = "'()'";
 		assertEquals("()", p.parseParameter(t, Object.class));
 		assertEquals("()", p.parseParameter(t, String.class));
 
 		// 2nd level
-		t = "?(~(~))=(~(~))";
+		t = "?'()'='()'";
 		m = (Map)p.parse(t, Object.class);
 		assertEquals("()", m.get("()"));
-		t = "?(~(~))=(~(~))";
+		t = "?'()'='()'";
 		m = p.parse(t, HashMap.class, String.class, Object.class);
 		assertEquals("()", m.get("()"));
 
 		// String starting with $
 		// Top level
-		t = "_value=(~$a)";
+		t = "_value=$a";
 		assertEquals("$a", p.parse(t, Object.class));
-		t = "_value=(~$a)";
+		t = "_value=$a";
 		assertEquals("$a", p.parse(t, Object.class));
-		t = "(~$a)";
+		t = "$a";
 		assertEquals("$a", p.parseParameter(t, Object.class));
-		t = "(~$a)";
+		t = "$a";
 		assertEquals("$a", p.parseParameter(t, Object.class));
 
 		// 2nd level
-		t = "?(~$a)=(~$a)";
+		t = "?$a=$a";
 		m = (Map)p.parse(t, Object.class);
 		assertEquals("$a", m.get("$a"));
 		m = p.parse(t, HashMap.class, String.class, Object.class);
@@ -455,7 +444,7 @@ public class UrlEncodingParserTest {
 		assertEquals("", m.get(""));
 
 		// 3rd level
-		t = "?=$o(=)";
+		t = "?=(=)";
 		m = (Map)p.parse(t, Object.class);
 		assertEquals("", ((Map)m.get("")).get(""));
 		t = "?=(=)";
@@ -464,20 +453,20 @@ public class UrlEncodingParserTest {
 
 		// Newline character
 		// Top level
-		t = "_value=(%0A)";
+		t = "_value='%0A'";
 		assertEquals("\n", p.parse(t, Object.class));
-		t = "(%0A)";
+		t = "'%0A'";
 		assertEquals("%0A", p.parseParameter(t, Object.class));
-		t = "(\n)";
+		t = "'\n'";
 		assertEquals("\n", p.parseParameter(t, Object.class));
 
 		// 2nd level
-		t = "?%0A=(%0A)";
+		t = "?'%0A'='%0A'";
 		m = (Map)p.parse(t, Object.class);
 		assertEquals("\n", m.get("\n"));
 
 		// 3rd level
-		t = "?%0A=$o((%0A)=(%0A))";
+		t = "?'%0A'=('%0A'='%0A')";
 		m = (Map)p.parse(t, Object.class);
 		assertEquals("\n", ((Map)m.get("\n")).get("\n"));
 	}
@@ -511,7 +500,7 @@ public class UrlEncodingParserTest {
 		assertEquals("�", m.get("�"));
 
 		// 3rd level
-		t = "?%C2%A2=$o(%C2%A2=%C2%A2)";
+		t = "?%C2%A2=(%C2%A2=%C2%A2)";
 		m = (Map)p.parse(t, Object.class);
 		assertEquals("�", ((Map)m.get("�")).get("�"));
 
@@ -536,7 +525,7 @@ public class UrlEncodingParserTest {
 		assertEquals("\u20ac", m.get("\u20ac"));
 
 		// 3rd level
-		t = "?%E2%82%AC=$o(%E2%82%AC=%E2%82%AC)";
+		t = "?%E2%82%AC=(%E2%82%AC=%E2%82%AC)";
 		m = (Map)p.parse(t, Object.class);
 		assertEquals("\u20ac", ((Map)m.get("\u20ac")).get("\u20ac"));
 
@@ -561,7 +550,7 @@ public class UrlEncodingParserTest {
 		assertEquals("\U00024b62", m.get("\U00024b62"));
 
 		// 3rd level
-		t = "?%F0%A4%AD%A2=$o(%F0%A4%AD%A2=%F0%A4%AD%A2)";
+		t = "?%F0%A4%AD%A2=(%F0%A4%AD%A2=%F0%A4%AD%A2)";
 		m = (Map)p.parse(t, Object.class);
 		assertEquals("\U00024b62", ((Map)m.get("\U00024b62")).get("\U00024b62"));
 	}
@@ -584,7 +573,7 @@ public class UrlEncodingParserTest {
 		assertEquals("foo", t.f1);
 		assertEquals(123, t.f2);
 
-		s = "$o(f1=foo,f2=123)";
+		s = "('f1'='foo','f2'=123)";
 		t = p.parseParameter(s, A.class);
 		assertEquals("foo", t.f1);
 		assertEquals(123, t.f2);
@@ -705,19 +694,19 @@ public class UrlEncodingParserTest {
 		c = p.parse(s, C1.class);
 		assertObjectEquals("{f1:['a~b','a~b']}", c);
 
-		s = "?f1=(a~b,a~b)";
+		s = "?f1=@(a~b,a~b)";
 		c = p.parse(s, C1.class);
 		assertObjectEquals("{f1:['a~b','a~b']}", c);
 
-		s = "?f1=((a~b),(a~b))";
+		s = "?f1=@('a~b','a~b')";
 		c = p.parse(s, C1.class);
 		assertObjectEquals("{f1:['a~b','a~b']}", c);
 
-		s = "?f1=($s(a~b),$s(a~b))";
+		s = "?f1=@('a~b','a~b')";
 		c = p.parse(s, C1.class);
 		assertObjectEquals("{f1:['a~b','a~b']}", c);
 
-		s = "?f1=$a($s(a~b),$s(a~b))";
+		s = "?f1=@('a~b','a~b')";
 		c = p.parse(s, C1.class);
 		assertObjectEquals("{f1:['a~b','a~b']}", c);
 
@@ -725,40 +714,36 @@ public class UrlEncodingParserTest {
 		c = p.parse(s, C1.class);
 		assertObjectEquals("{f1:['~','~']}", c);
 
-		s = "?f1=(~~,~~)";
+		s = "?f1=@(~~,~~)";
 		c = p.parse(s, C1.class);
 		assertObjectEquals("{f1:['~','~']}", c);
 
-		s = "?f1=(~~~~~~,~~~~~~)";
+		s = "?f1=@(~~~~~~,~~~~~~)";
 		c = p.parse(s, C1.class);
 		assertObjectEquals("{f1:['~~~','~~~']}", c);
 
-		s = "?f1=((~~~~~~),(~~~~~~))";
+		s = "?f1=@('~~~~~~','~~~~~~')";
 		c = p.parse(s, C1.class);
 		assertObjectEquals("{f1:['~~~','~~~']}", c);
 
-		// The ~ should be treated as an escape if followed by any of the following characters:  ,()~=
-		s = "?f1=~,~(~)~~~=~$,~,~(~)~~~=~$";
+		// The ~ should be treated as an escape if followed by any of the following characters:  '~
+		s = "?f1=~'~~,~'~~";
 		c = p.parse(s, C1.class);
-		assertObjectEquals("{f1:[',()~=$',',()~=$']}", c);
+		assertObjectEquals("{f1:['\\'~','\\'~']}", c);
 
-		s = "?f1=(~,~(~)~~~=~$,~,~(~)~~~=~$)";
+		s = "?f1=@(~'~~,~'~~)";
 		c = p.parse(s, C1.class);
-		assertObjectEquals("{f1:[',()~=$',',()~=$']}", c);
+		assertObjectEquals("{f1:['\\'~','\\'~']}", c);
 
-		s = "?f1=((~,~(~)~~~=~$),(~,~(~)~~~=~$))";
+		s = "?f1=@('~'~~','~'~~')";
 		c = p.parse(s, C1.class);
-		assertObjectEquals("{f1:[',()~=$',',()~=$']}", c);
+		assertObjectEquals("{f1:['\\'~','\\'~']}", c);
 
 		s = "?a~b=a~b";
 		ObjectMap m = p.parse(s, ObjectMap.class);
 		assertEquals("{'a~b':'a~b'}", m.toString());
 
-		s = "?(a~b)=(a~b)";
-		m = p.parse(s, ObjectMap.class);
-		assertEquals("{'a~b':'a~b'}", m.toString());
-
-		s = "?$s(a~b)=$s(a~b)";
+		s = "?'a~b'='a~b'";
 		m = p.parse(s, ObjectMap.class);
 		assertEquals("{'a~b':'a~b'}", m.toString());
 
@@ -766,7 +751,7 @@ public class UrlEncodingParserTest {
 		m = p.parse(s, ObjectMap.class);
 		assertEquals("{'~':'~'}", m.toString());
 
-		s = "?(~~)=(~~)";
+		s = "?'~~'='~~'";
 		m = p.parse(s, ObjectMap.class);
 		assertEquals("{'~':'~'}", m.toString());
 
@@ -774,37 +759,9 @@ public class UrlEncodingParserTest {
 		m = p.parse(s, ObjectMap.class);
 		assertEquals("{'~~~':'~~~'}", m.toString());
 
-		s = "?(~~~~~~)=(~~~~~~)";
+		s = "?'~~~~~~'='~~~~~~'";
 		m = p.parse(s, ObjectMap.class);
 		assertEquals("{'~~~':'~~~'}", m.toString());
-
-		s = "?$s(~~~~~~)=$s(~~~~~~)";
-		m = p.parse(s, ObjectMap.class);
-		assertEquals("{'~~~':'~~~'}", m.toString());
-
-		s = "?~,~(~)~~~=~$=~,~(~)~~~=~$";
-		m = p.parse(s, ObjectMap.class);
-		assertEquals("{',()~=$':',()~=$'}", m.toString());
-
-		s = "?(~,~(~)~~~=~$)=(~,~(~)~~~=~$)";
-		m = p.parse(s, ObjectMap.class);
-		assertEquals("{',()~=$':',()~=$'}", m.toString());
-
-		s = "?$s(~,~(~)~~~=~$)=$s(~,~(~)~~~=~$)";
-		m = p.parse(s, ObjectMap.class);
-		assertEquals("{',()~=$':',()~=$'}", m.toString());
-
-		s = "?%7E%2C%7E%28%7E%29%7E%7E%7E%3D%7E%24=%7E%2C%7E%28%7E%29%7E%7E%7E%3D%7E%24";
-		m = p.parse(s, ObjectMap.class);
-		assertEquals("{',()~=$':',()~=$'}", m.toString());
-
-		s = "?(%7E%2C%7E%28%7E%29%7E%7E%7E%3D%7E%24)=(%7E%2C%7E%28%7E%29%7E%7E%7E%3D%7E%24)";
-		m = p.parse(s, ObjectMap.class);
-		assertEquals("{',()~=$':',()~=$'}", m.toString());
-
-		s = "?$s(%7E%2C%7E%28%7E%29%7E%7E%7E%3D%7E%24)=$s(%7E%2C%7E%28%7E%29%7E%7E%7E%3D%7E%24)";
-		m = p.parse(s, ObjectMap.class);
-		assertEquals("{',()~=$':',()~=$'}", m.toString());
 	}
 
 	public static class C1 {
@@ -816,7 +773,7 @@ public class UrlEncodingParserTest {
 	//====================================================================================================
 	@Test
 	public void testWhitespace() throws Exception {
-		UrlEncodingParser p = UrlEncodingParser.DEFAULT_WS_AWARE;
+		UrlEncodingParser p = UrlEncodingParser.DEFAULT;
 		String s;
 		ObjectMap m;
 
@@ -824,36 +781,36 @@ public class UrlEncodingParserTest {
 		m = p.parse(s, ObjectMap.class);
 		assertEquals("{f1:'foo',f2:'bar'}", m.toString());
 
-		s = "?f1=(\n\t)&f2=(\n\t)";
+		s = "?f1='\n\t'&f2='\n\t'";
 		m = p.parse(s, ObjectMap.class);
 		assertEquals("\n\t", m.getString("f1"));
 		assertEquals("\n\t", m.getString("f2"));
 
-		s = "?f1=(\n\t)\n\t&f2=(\n\t)\n\t";
+		s = "?f1='\n\t'\n\t&f2='\n\t'\n\t";
 		m = p.parse(s, ObjectMap.class);
 		assertEquals("\n\t", m.getString("f1"));
 		assertEquals("\n\t", m.getString("f2"));
 		assertEquals("{f1:'\\n\\t',f2:'\\n\\t'}", m.toString());  // Note that JsonSerializer escapes newlines and tabs.
 
-		s = "?f1=$s(\n\t)\n\t&f2=$s(\n\t)\n\t";
+		s = "?f1='\n\t'\n\t&f2='\n\t'\n\t";
 		m = p.parse(s, ObjectMap.class);
 		assertEquals("\n\t", m.getString("f1"));
 		assertEquals("\n\t", m.getString("f2"));
 		assertEquals("{f1:'\\n\\t',f2:'\\n\\t'}", m.toString());  // Note that JsonSerializer escapes newlines and tabs.
 
-		s = "?f1=$o(\n\tf1a=a,\n\tf1b=b\n\t)\n\t&f2=$o(\n\tf2a=a,\n\tf2b=b\n\t)\n\t";
+		s = "?f1=(\n\tf1a=a,\n\tf1b=b\n\t)\n\t&f2=(\n\tf2a=a,\n\tf2b=b\n\t)\n\t";
 		m = p.parse(s, ObjectMap.class);
 		assertEquals("{f1:{f1a:'a',f1b:'b'},f2:{f2a:'a',f2b:'b'}}", m.toString());  // Note that JsonSerializer escapes newlines and tabs.
 		D d = p.parse(s, D.class);
 		assertObjectEquals("{f1:{f1a:'a',f1b:'b'},f2:{f2a:'a',f2b:'b'}}", d);  // Note that JsonSerializer escapes newlines and tabs.
 
-		s = "?f1=$o(\n\tf1a=(\n\t),\n\tf1b=(\n\t)\n\t)\n\t&f2=$o(\n\tf2a=(\n\t),\n\tf2b=(\n\t)\n\t)\n\t";
+		s = "?f1=(\n\tf1a='\n\t',\n\tf1b='\n\t'\n\t)\n\t&f2=(\n\tf2a='\n\t',\n\tf2b='\n\t'\n\t)\n\t";
 		m = p.parse(s, ObjectMap.class);
 		assertEquals("{f1:{f1a:'\\n\\t',f1b:'\\n\\t'},f2:{f2a:'\\n\\t',f2b:'\\n\\t'}}", m.toString());  // Note that JsonSerializer escapes newlines and tabs.
 		d = p.parse(s, D.class);
 		assertObjectEquals("{f1:{f1a:'\\n\\t',f1b:'\\n\\t'},f2:{f2a:'\\n\\t',f2b:'\\n\\t'}}", d);  // Note that JsonSerializer escapes newlines and tabs.
 
-		s = "?f1=$a(\n\tfoo,\n\tbar\n\t)\n\t&f2=$a(\n\tfoo,\n\tbar\n\t)\n\t";
+		s = "?f1=@(\n\tfoo,\n\tbar\n\t)\n\t&f2=@(\n\tfoo,\n\tbar\n\t)\n\t";
 		m = p.parse(s, ObjectMap.class);
 		assertEquals("{f1:['foo','bar'],f2:['foo','bar']}", m.toString());  // Note that JsonSerializer escapes newlines and tabs.
 
@@ -899,22 +856,22 @@ public class UrlEncodingParserTest {
 			+ "&f02=c&f02=d"
 			+ "&f03=1&f03=2"
 			+ "&f04=3&f04=4"
-			+ "&f05=(e,f)&f05=(g,h)"
-			+ "&f06=(i,j)&f06=(k,l)"
+			+ "&f05=@(e,f)&f05=@(g,h)"
+			+ "&f06=@(i,j)&f06=@(k,l)"
 			+ "&f07=(a=a,b=1,c=true)&f07=(a=b,b=2,c=false)"
 			+ "&f08=(a=a,b=1,c=true)&f08=(a=b,b=2,c=false)"
-			+ "&f09=((a=a,b=1,c=true))&f09=((a=b,b=2,c=false))"
-			+ "&f10=((a=a,b=1,c=true))&f10=((a=b,b=2,c=false))"
+			+ "&f09=@((a=a,b=1,c=true))&f09=@((a=b,b=2,c=false))"
+			+ "&f10=@((a=a,b=1,c=true))&f10=@((a=b,b=2,c=false))"
 			+ "&f11=a&f11=b"
 			+ "&f12=c&f12=d"
 			+ "&f13=1&f13=2"
 			+ "&f14=3&f14=4"
-			+ "&f15=(e,f)&f15=(g,h)"
-			+ "&f16=(i,j)&f16=(k,l)"
+			+ "&f15=@(e,f)&f15=@(g,h)"
+			+ "&f16=@(i,j)&f16=@(k,l)"
 			+ "&f17=(a=a,b=1,c=true)&f17=(a=b,b=2,c=false)"
 			+ "&f18=(a=a,b=1,c=true)&f18=(a=b,b=2,c=false)"
-			+ "&f19=((a=a,b=1,c=true))&f19=((a=b,b=2,c=false))"
-			+ "&f20=((a=a,b=1,c=true))&f20=((a=b,b=2,c=false))";
+			+ "&f19=@((a=a,b=1,c=true))&f19=@((a=b,b=2,c=false))"
+			+ "&f20=@((a=a,b=1,c=true))&f20=@((a=b,b=2,c=false))";
 
 		DTOs.B t = p.parse(in, DTOs.B.class);
 		String e = "{"
@@ -955,22 +912,22 @@ public class UrlEncodingParserTest {
 			+ "&f02=c&f02=d"
 			+ "&f03=1&f03=2"
 			+ "&f04=3&f04=4"
-			+ "&f05=(e,f)&f05=(g,h)"
-			+ "&f06=(i,j)&f06=(k,l)"
+			+ "&f05=@(e,f)&f05=@(g,h)"
+			+ "&f06=@(i,j)&f06=@(k,l)"
 			+ "&f07=(a=a,b=1,c=true)&f07=(a=b,b=2,c=false)"
 			+ "&f08=(a=a,b=1,c=true)&f08=(a=b,b=2,c=false)"
-			+ "&f09=((a=a,b=1,c=true))&f09=((a=b,b=2,c=false))"
-			+ "&f10=((a=a,b=1,c=true))&f10=((a=b,b=2,c=false))"
+			+ "&f09=@((a=a,b=1,c=true))&f09=@((a=b,b=2,c=false))"
+			+ "&f10=@((a=a,b=1,c=true))&f10=@((a=b,b=2,c=false))"
 			+ "&f11=a&f11=b"
 			+ "&f12=c&f12=d"
 			+ "&f13=1&f13=2"
 			+ "&f14=3&f14=4"
-			+ "&f15=(e,f)&f15=(g,h)"
-			+ "&f16=(i,j)&f16=(k,l)"
+			+ "&f15=@(e,f)&f15=@(g,h)"
+			+ "&f16=@(i,j)&f16=@(k,l)"
 			+ "&f17=(a=a,b=1,c=true)&f17=(a=b,b=2,c=false)"
 			+ "&f18=(a=a,b=1,c=true)&f18=(a=b,b=2,c=false)"
-			+ "&f19=((a=a,b=1,c=true))&f19=((a=b,b=2,c=false))"
-			+ "&f20=((a=a,b=1,c=true))&f20=((a=b,b=2,c=false))";
+			+ "&f19=@((a=a,b=1,c=true))&f19=@((a=b,b=2,c=false))"
+			+ "&f20=@((a=a,b=1,c=true))&f20=@((a=b,b=2,c=false))";
 
 		DTOs.C t = p.parse(in, DTOs.C.class);
 		String e = "{"


[7/8] incubator-juneau git commit: Modification to UON spec. Remove bean subtype support.

Posted by ja...@apache.org.
http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/097b8103/juneau-core-test/src/test/java/org/apache/juneau/dto/html5/BasicHtmlSchemaTest.java
----------------------------------------------------------------------
diff --git a/juneau-core-test/src/test/java/org/apache/juneau/dto/html5/BasicHtmlSchemaTest.java b/juneau-core-test/src/test/java/org/apache/juneau/dto/html5/BasicHtmlSchemaTest.java
index ae3a028..a64ed6f 100755
--- a/juneau-core-test/src/test/java/org/apache/juneau/dto/html5/BasicHtmlSchemaTest.java
+++ b/juneau-core-test/src/test/java/org/apache/juneau/dto/html5/BasicHtmlSchemaTest.java
@@ -18,8 +18,16 @@ import static org.apache.juneau.dto.html5.HtmlBuilder.*;
 import java.util.*;
 
 import org.apache.juneau.html.*;
+import org.apache.juneau.json.JsonParser;
+import org.apache.juneau.json.JsonSerializer;
+import org.apache.juneau.msgpack.MsgPackParser;
+import org.apache.juneau.msgpack.MsgPackSerializer;
 import org.apache.juneau.parser.*;
 import org.apache.juneau.serializer.*;
+import org.apache.juneau.urlencoding.UonParser;
+import org.apache.juneau.urlencoding.UonSerializer;
+import org.apache.juneau.urlencoding.UrlEncodingParser;
+import org.apache.juneau.urlencoding.UrlEncodingSerializer;
 import org.apache.juneau.xml.*;
 import org.junit.*;
 import org.junit.runner.*;
@@ -35,12 +43,32 @@ public class BasicHtmlSchemaTest {
 		sXmlNsSq = XmlSerializer.DEFAULT_NS_SQ,
 		sXmlSqReadable = XmlSerializer.DEFAULT_SQ_READABLE,
 		sHtmlSq = HtmlSerializer.DEFAULT_SQ,
-		sHtmlSqReadable = HtmlSerializer.DEFAULT_SQ_READABLE;
-
+		sHtmlSqReadable = HtmlSerializer.DEFAULT_SQ_READABLE,
+		sJson = JsonSerializer.DEFAULT_LAX,
+		sJsonT = JsonSerializer.DEFAULT_LAX.clone().setBeanTypePropertyName("t"),
+		sUon = UonSerializer.DEFAULT,
+		sUonT = UonSerializer.DEFAULT.clone().setBeanTypePropertyName("t"),
+		sUrlEncoding = UrlEncodingSerializer.DEFAULT,
+		sUrlEncodingT = UrlEncodingSerializer.DEFAULT.clone().setBeanTypePropertyName("t");
+	
+	private static final OutputStreamSerializer 
+		sMsgPack = MsgPackSerializer.DEFAULT,
+		sMsgPackT = MsgPackSerializer.DEFAULT.clone().setBeanTypePropertyName("t");
+	
 	private static final ReaderParser
 		pXml = XmlParser.DEFAULT,
-		pHtml = HtmlParser.DEFAULT;
+		pHtml = HtmlParser.DEFAULT,
+		pJson = JsonParser.DEFAULT,
+		pJsonT = JsonParser.DEFAULT.clone().setBeanTypePropertyName("t"),
+		pUon = UonParser.DEFAULT,
+		pUonT = UonParser.DEFAULT.clone().setBeanTypePropertyName("t"),
+		pUrlEncoding = UrlEncodingParser.DEFAULT,
+		pUrlEncodingT = UrlEncodingParser.DEFAULT.clone().setBeanTypePropertyName("t");
 
+	private static final InputStreamParser 
+		pMsgPack = MsgPackParser.DEFAULT,
+		pMsgPackT = MsgPackParser.DEFAULT.clone().setBeanTypePropertyName("t");
+	
 	private static final B btag = b("bbb");
 
 	@Parameterized.Parameters
@@ -53,6 +81,14 @@ public class BasicHtmlSchemaTest {
 				"<a href='http://foo'>bar</a>\n",
 				"<a href='http://foo'>bar</a>",
 				"<a href='http://foo'>bar</a>\n",
+				"{_type:'a',a:{href:'http://foo'},c:['bar']}",
+				"{t:'a',a:{href:'http://foo'},c:['bar']}",
+				"83A55F74797065A161A16181A468726566AA687474703A2F2F666F6FA16391A3626172",
+				"83A174A161A16181A468726566AA687474703A2F2F666F6FA16391A3626172",
+				"(_type=a,a=(href=http://foo),c=@(bar))",
+				"(t=a,a=(href=http://foo),c=@(bar))",
+				"_type=a&a=(href=http://foo)&c=@(bar)",
+				"t=a&a=(href=http://foo)&c=@(bar)",
 			},
 			{
 				"A-2",
@@ -61,6 +97,14 @@ public class BasicHtmlSchemaTest {
 				"<a href='http://foo'>bar<b>bbb</b>baz</a>\n",
 				"<a href='http://foo'>bar<b>bbb</b>baz</a>",
 				"<a href='http://foo'>bar<b>bbb</b>baz</a>\n",
+				"{_type:'a',a:{href:'http://foo'},c:['bar',{_type:'b',c:['bbb']},'baz']}",
+				"{t:'a',a:{href:'http://foo'},c:['bar',{t:'b',c:['bbb']},'baz']}",
+				"83A55F74797065A161A16181A468726566AA687474703A2F2F666F6FA16393A362617282A55F74797065A162A16391A3626262A362617A",
+				"83A174A161A16181A468726566AA687474703A2F2F666F6FA16393A362617282A174A162A16391A3626262A362617A",
+				"(_type=a,a=(href=http://foo),c=@(bar,(_type=b,c=@(bbb)),baz))",
+				"(t=a,a=(href=http://foo),c=@(bar,(t=b,c=@(bbb)),baz))",
+				"_type=a&a=(href=http://foo)&c=@(bar,(_type=b,c=@(bbb)),baz)",
+				"t=a&a=(href=http://foo)&c=@(bar,(t=b,c=@(bbb)),baz)",
 			},
 			{
 				"A-3",
@@ -69,6 +113,14 @@ public class BasicHtmlSchemaTest {
 				"<a href='http://foo'>_xE000_</a>\n",
 				"<a href='http://foo'><sp/></a>",
 				"<a href='http://foo'><sp/></a>\n",
+				"{_type:'a',a:{href:'http://foo'},c:['']}",
+				"{t:'a',a:{href:'http://foo'},c:['']}",
+				"83A55F74797065A161A16181A468726566AA687474703A2F2F666F6FA16391A0",
+				"83A174A161A16181A468726566AA687474703A2F2F666F6FA16391A0",
+				"(_type=a,a=(href=http://foo),c=@(''))",
+				"(t=a,a=(href=http://foo),c=@(''))",
+				"_type=a&a=(href=http://foo)&c=@('')",
+				"t=a&a=(href=http://foo)&c=@('')",
 			},
 			{
 				"A-4",
@@ -77,6 +129,14 @@ public class BasicHtmlSchemaTest {
 				"<a href='http://foo'>_x0020_</a>\n",
 				"<a href='http://foo'><sp> </sp></a>",
 				"<a href='http://foo'><sp> </sp></a>\n",
+				"{_type:'a',a:{href:'http://foo'},c:[' ']}",
+				"{t:'a',a:{href:'http://foo'},c:[' ']}",
+				"83A55F74797065A161A16181A468726566AA687474703A2F2F666F6FA16391A120",
+				"83A174A161A16181A468726566AA687474703A2F2F666F6FA16391A120",
+				"(_type=a,a=(href=http://foo),c=@(' '))",
+				"(t=a,a=(href=http://foo),c=@(' '))",
+				"_type=a&a=(href=http://foo)&c=@('+')",
+				"t=a&a=(href=http://foo)&c=@('+')",
 			},
 			{
 				"A-5",
@@ -85,6 +145,14 @@ public class BasicHtmlSchemaTest {
 				"<a href='http://foo'/>\n",
 				"<a href='http://foo'/>",
 				"<a href='http://foo'/>\n",
+				"{_type:'a',a:{href:'http://foo'}}",
+				"{t:'a',a:{href:'http://foo'}}",
+				"82A55F74797065A161A16181A468726566AA687474703A2F2F666F6F",
+				"82A174A161A16181A468726566AA687474703A2F2F666F6F",
+				"(_type=a,a=(href=http://foo))",
+				"(t=a,a=(href=http://foo))",
+				"_type=a&a=(href=http://foo)",
+				"t=a&a=(href=http://foo)",
 			},
 			{
 				"Abbr-1",
@@ -93,6 +161,14 @@ public class BasicHtmlSchemaTest {
 				"<abbr>foo</abbr>\n",
 				"<abbr>foo</abbr>",
 				"<abbr>foo</abbr>\n",
+				"{_type:'abbr',c:['foo']}",
+				"{t:'abbr',c:['foo']}",
+				"82A55F74797065A461626272A16391A3666F6F",
+				"82A174A461626272A16391A3666F6F",
+				"(_type=abbr,c=@(foo))",
+				"(t=abbr,c=@(foo))",
+				"_type=abbr&c=@(foo)",
+				"t=abbr&c=@(foo)",
 			},
 			{
 				"Abbr-2",
@@ -101,6 +177,14 @@ public class BasicHtmlSchemaTest {
 				"<abbr title='foo'>bar<b>bbb</b>baz</abbr>\n",
 				"<abbr title='foo'>bar<b>bbb</b>baz</abbr>",
 				"<abbr title='foo'>bar<b>bbb</b>baz</abbr>\n",
+				"{_type:'abbr',a:{title:'foo'},c:['bar',{_type:'b',c:['bbb']},'baz']}",
+				"{t:'abbr',a:{title:'foo'},c:['bar',{t:'b',c:['bbb']},'baz']}",
+				"83A55F74797065A461626272A16181A57469746C65A3666F6FA16393A362617282A55F74797065A162A16391A3626262A362617A",
+				"83A174A461626272A16181A57469746C65A3666F6FA16393A362617282A174A162A16391A3626262A362617A",
+				"(_type=abbr,a=(title=foo),c=@(bar,(_type=b,c=@(bbb)),baz))",
+				"(t=abbr,a=(title=foo),c=@(bar,(t=b,c=@(bbb)),baz))",
+				"_type=abbr&a=(title=foo)&c=@(bar,(_type=b,c=@(bbb)),baz)",
+				"t=abbr&a=(title=foo)&c=@(bar,(t=b,c=@(bbb)),baz)",
 			},
 			{
 				"Address-1",
@@ -109,6 +193,14 @@ public class BasicHtmlSchemaTest {
 				"<address/>\n",
 				"<address/>",
 				"<address/>\n",
+				"{_type:'address'}",
+				"{t:'address'}",
+				"81A55F74797065A761646472657373",
+				"81A174A761646472657373",
+				"(_type=address)",
+				"(t=address)",
+				"_type=address",
+				"t=address",
 			},
 			{
 				"Address-2",
@@ -117,6 +209,14 @@ public class BasicHtmlSchemaTest {
 				"<address>_xE000_</address>\n",
 				"<address><sp/></address>",
 				"<address><sp/></address>\n",
+				"{_type:'address',c:['']}",
+				"{t:'address',c:['']}",
+				"82A55F74797065A761646472657373A16391A0",
+				"82A174A761646472657373A16391A0",
+				"(_type=address,c=@(''))",
+				"(t=address,c=@(''))",
+				"_type=address&c=@('')",
+				"t=address&c=@('')",
 			},
 			{
 				"Address-3",
@@ -125,6 +225,14 @@ public class BasicHtmlSchemaTest {
 				"<address>foo<a href='bar'>baz</a><a href='qux'>quux</a></address>\n",
 				"<address>foo<a href='bar'>baz</a><a href='qux'>quux</a></address>",
 				"<address>foo<a href='bar'>baz</a><a href='qux'>quux</a></address>\n",
+				"{_type:'address',c:['foo',{_type:'a',a:{href:'bar'},c:['baz']},{_type:'a',a:{href:'qux'},c:['quux']}]}",
+				"{t:'address',c:['foo',{t:'a',a:{href:'bar'},c:['baz']},{t:'a',a:{href:'qux'},c:['quux']}]}",
+				"82A55F74797065A761646472657373A16393A3666F6F83A55F74797065A161A16181A468726566A3626172A16391A362617A83A55F74797065A161A16181A468726566A3717578A16391A471757578",
+				"82A174A761646472657373A16393A3666F6F83A174A161A16181A468726566A3626172A16391A362617A83A174A161A16181A468726566A3717578A16391A471757578",
+				"(_type=address,c=@(foo,(_type=a,a=(href=bar),c=@(baz)),(_type=a,a=(href=qux),c=@(quux))))",
+				"(t=address,c=@(foo,(t=a,a=(href=bar),c=@(baz)),(t=a,a=(href=qux),c=@(quux))))",
+				"_type=address&c=@(foo,(_type=a,a=(href=bar),c=@(baz)),(_type=a,a=(href=qux),c=@(quux)))",
+				"t=address&c=@(foo,(t=a,a=(href=bar),c=@(baz)),(t=a,a=(href=qux),c=@(quux)))",
 			},
 			{
 				"Aside-1",
@@ -135,6 +243,14 @@ public class BasicHtmlSchemaTest {
 				"<aside><h1>header1</h1><p>foo</p></aside>\n",
 				"<aside><h1>header1</h1><p>foo</p></aside>",
 				"<aside><h1>header1</h1><p>foo</p></aside>\n",
+				"{_type:'aside',c:[{_type:'h1',c:['header1']},{_type:'p',c:['foo']}]}",
+				"{t:'aside',c:[{t:'h1',c:['header1']},{t:'p',c:['foo']}]}",
+				"82A55F74797065A56173696465A1639282A55F74797065A26831A16391A76865616465723182A55F74797065A170A16391A3666F6F",
+				"82A174A56173696465A1639282A174A26831A16391A76865616465723182A174A170A16391A3666F6F",
+				"(_type=aside,c=@((_type=h1,c=@(header1)),(_type=p,c=@(foo))))",
+				"(t=aside,c=@((t=h1,c=@(header1)),(t=p,c=@(foo))))",
+				"_type=aside&c=@((_type=h1,c=@(header1)),(_type=p,c=@(foo)))",
+				"t=aside&c=@((t=h1,c=@(header1)),(t=p,c=@(foo)))",
 			},
 			{
 				"Audio/Source-1",
@@ -146,6 +262,14 @@ public class BasicHtmlSchemaTest {
 				"<audio controls='true'>\n\t<source src='foo.ogg' type='audio/ogg'/>\n\t<source src='foo.mp3' type='audio/mpeg'/>\n</audio>\n",
 				"<audio controls='true'><source src='foo.ogg' type='audio/ogg'/><source src='foo.mp3' type='audio/mpeg'/></audio>",
 				"<audio controls='true'>\n\t<source src='foo.ogg' type='audio/ogg'/>\n\t<source src='foo.mp3' type='audio/mpeg'/>\n</audio>\n",
+				"{_type:'audio',a:{controls:true},c:[{_type:'source',a:{src:'foo.ogg',type:'audio/ogg'}},{_type:'source',a:{src:'foo.mp3',type:'audio/mpeg'}}]}",
+				"{t:'audio',a:{controls:true},c:[{t:'source',a:{src:'foo.ogg',type:'audio/ogg'}},{t:'source',a:{src:'foo.mp3',type:'audio/mpeg'}}]}",
+				"83A55F74797065A5617564696FA16181A8636F6E74726F6C73C3A1639282A55F74797065A6736F75726365A16182A3737263A7666F6F2E6F6767A474797065A9617564696F2F6F676782A55F74797065A6736F75726365A16182A3737263A7666F6F2E6D7033A474797065AA617564696F2F6D706567",
+				"83A174A5617564696FA16181A8636F6E74726F6C73C3A1639282A174A6736F75726365A16182A3737263A7666F6F2E6F6767A474797065A9617564696F2F6F676782A174A6736F75726365A16182A3737263A7666F6F2E6D7033A474797065AA617564696F2F6D706567",
+				"(_type=audio,a=(controls=true),c=@((_type=source,a=(src=foo.ogg,type=audio/ogg)),(_type=source,a=(src=foo.mp3,type=audio/mpeg))))",
+				"(t=audio,a=(controls=true),c=@((t=source,a=(src=foo.ogg,type=audio/ogg)),(t=source,a=(src=foo.mp3,type=audio/mpeg))))",
+				"_type=audio&a=(controls=true)&c=@((_type=source,a=(src=foo.ogg,type=audio/ogg)),(_type=source,a=(src=foo.mp3,type=audio/mpeg)))",
+				"t=audio&a=(controls=true)&c=@((t=source,a=(src=foo.ogg,type=audio/ogg)),(t=source,a=(src=foo.mp3,type=audio/mpeg)))",
 			},
 			{
 				"Bdi-1",
@@ -154,6 +278,14 @@ public class BasicHtmlSchemaTest {
 				"<p>foo<bdi>\u0625\u064a\u0627\u0646</bdi>bar</p>\n",
 				"<p>foo<bdi>\u0625\u064a\u0627\u0646</bdi>bar</p>",
 				"<p>foo<bdi>\u0625\u064a\u0627\u0646</bdi>bar</p>\n",
+				"{_type:'p',c:['foo',{_type:'bdi',c:'\u0625\u064a\u0627\u0646'},'bar']}",
+				"{t:'p',c:['foo',{t:'bdi',c:'\u0625\u064a\u0627\u0646'},'bar']}",
+				"82A55F74797065A170A16393A3666F6F82A55F74797065A3626469A163A8D8A5D98AD8A7D986A3626172",
+				"82A174A170A16393A3666F6F82A174A3626469A163A8D8A5D98AD8A7D986A3626172",
+				"(_type=p,c=@(foo,(_type=bdi,c=\u0625\u064a\u0627\u0646),bar))",
+				"(t=p,c=@(foo,(t=bdi,c=\u0625\u064a\u0627\u0646),bar))",
+				"_type=p&c=@(foo,(_type=bdi,c=%D8%A5%D9%8A%D8%A7%D9%86),bar)",
+				"t=p&c=@(foo,(t=bdi,c=%D8%A5%D9%8A%D8%A7%D9%86),bar)",
 			},
 			{
 				"Bdo-1",
@@ -162,6 +294,14 @@ public class BasicHtmlSchemaTest {
 				"<p>foo<bdo dir='rtl'>baz</bdo>bar</p>\n",
 				"<p>foo<bdo dir='rtl'>baz</bdo>bar</p>",
 				"<p>foo<bdo dir='rtl'>baz</bdo>bar</p>\n",
+				"{_type:'p',c:['foo',{_type:'bdo',a:{dir:'rtl'},c:['baz']},'bar']}",
+				"{t:'p',c:['foo',{t:'bdo',a:{dir:'rtl'},c:['baz']},'bar']}",
+				"82A55F74797065A170A16393A3666F6F83A55F74797065A362646FA16181A3646972A372746CA16391A362617AA3626172",
+				"82A174A170A16393A3666F6F83A174A362646FA16181A3646972A372746CA16391A362617AA3626172",
+				"(_type=p,c=@(foo,(_type=bdo,a=(dir=rtl),c=@(baz)),bar))",
+				"(t=p,c=@(foo,(t=bdo,a=(dir=rtl),c=@(baz)),bar))",
+				"_type=p&c=@(foo,(_type=bdo,a=(dir=rtl),c=@(baz)),bar)",
+				"t=p&c=@(foo,(t=bdo,a=(dir=rtl),c=@(baz)),bar)",
 			},
 			{
 				"Blockquote-1",
@@ -170,6 +310,14 @@ public class BasicHtmlSchemaTest {
 				"<blockquote>foo</blockquote>\n",
 				"<blockquote>foo</blockquote>",
 				"<blockquote>foo</blockquote>\n",
+				"{_type:'blockquote',c:['foo']}",
+				"{t:'blockquote',c:['foo']}",
+				"82A55F74797065AA626C6F636B71756F7465A16391A3666F6F",
+				"82A174AA626C6F636B71756F7465A16391A3666F6F",
+				"(_type=blockquote,c=@(foo))",
+				"(t=blockquote,c=@(foo))",
+				"_type=blockquote&c=@(foo)",
+				"t=blockquote&c=@(foo)",
 			},
 			{
 				"Br-1",
@@ -178,6 +326,14 @@ public class BasicHtmlSchemaTest {
 				"<br/>\n",
 				"<br/>",
 				"<br/>\n",
+				"{_type:'br'}",
+				"{t:'br'}",
+				"81A55F74797065A26272",
+				"81A174A26272",
+				"(_type=br)",
+				"(t=br)",
+				"_type=br",
+				"t=br",
 			},
 			{
 				"Br-2",
@@ -186,6 +342,14 @@ public class BasicHtmlSchemaTest {
 				"<p><br/></p>\n",
 				"<p><br/></p>",
 				"<p><br/></p>\n",
+				"{_type:'p',c:[{_type:'br'}]}",
+				"{t:'p',c:[{t:'br'}]}",
+				"82A55F74797065A170A1639181A55F74797065A26272",
+				"82A174A170A1639181A174A26272",
+				"(_type=p,c=@((_type=br)))",
+				"(t=p,c=@((t=br)))",
+				"_type=p&c=@((_type=br))",
+				"t=p&c=@((t=br))",
 			},
 			{
 				"Button-1",
@@ -194,6 +358,14 @@ public class BasicHtmlSchemaTest {
 				"<button type='button'>foo</button>\n",
 				"<button type='button'>foo</button>",
 				"<button type='button'>foo</button>\n",
+				"{_type:'button',a:{type:'button'},c:['foo']}",
+				"{t:'button',a:{type:'button'},c:['foo']}",
+				"83A55F74797065A6627574746F6EA16181A474797065A6627574746F6EA16391A3666F6F",
+				"83A174A6627574746F6EA16181A474797065A6627574746F6EA16391A3666F6F",
+				"(_type=button,a=(type=button),c=@(foo))",
+				"(t=button,a=(type=button),c=@(foo))",
+				"_type=button&a=(type=button)&c=@(foo)",
+				"t=button&a=(type=button)&c=@(foo)",
 			},
 			{
 				"Canvas-1",
@@ -202,6 +374,14 @@ public class BasicHtmlSchemaTest {
 				"<canvas width='100' height='200'/>\n",
 				"<canvas width='100' height='200'/>",
 				"<canvas width='100' height='200'/>\n",
+				"{_type:'canvas',a:{width:100,height:200}}",
+				"{t:'canvas',a:{width:100,height:200}}",
+				"82A55F74797065A663616E766173A16182A5776964746864A6686569676874D100C8",
+				"82A174A663616E766173A16182A5776964746864A6686569676874D100C8",
+				"(_type=canvas,a=(width=100,height=200))",
+				"(t=canvas,a=(width=100,height=200))",
+				"_type=canvas&a=(width=100,height=200)",
+				"t=canvas&a=(width=100,height=200)",
 			},
 			{
 				"Cite-1",
@@ -210,14 +390,14 @@ public class BasicHtmlSchemaTest {
 				"<p><cite>foo</cite></p>\n",
 				"<p><cite>foo</cite></p>",
 				"<p><cite>foo</cite></p>\n",
-			},
-			{
-				"Cite-1",
-				p(cite("foo")),
-				"<p><cite>foo</cite></p>",
-				"<p><cite>foo</cite></p>\n",
-				"<p><cite>foo</cite></p>",
-				"<p><cite>foo</cite></p>\n",
+				"{_type:'p',c:[{_type:'cite',c:['foo']}]}",
+				"{t:'p',c:[{t:'cite',c:['foo']}]}",
+				"82A55F74797065A170A1639182A55F74797065A463697465A16391A3666F6F",
+				"82A174A170A1639182A174A463697465A16391A3666F6F",
+				"(_type=p,c=@((_type=cite,c=@(foo))))",
+				"(t=p,c=@((t=cite,c=@(foo))))",
+				"_type=p&c=@((_type=cite,c=@(foo)))",
+				"t=p&c=@((t=cite,c=@(foo)))",
 			},
 			{
 				"Code-1",
@@ -226,6 +406,14 @@ public class BasicHtmlSchemaTest {
 				"<code>foo&#x000a;&#x0009;bar</code>\n",
 				"<code>foo<br/><sp>&#x2003;</sp>bar</code>",
 				"<code>foo<br/><sp>&#x2003;</sp>bar</code>\n",
+				"{_type:'code',c:['foo\\n\\tbar']}",
+				"{t:'code',c:['foo\\n\\tbar']}",
+				"82A55F74797065A4636F6465A16391A8666F6F0A09626172",
+				"82A174A4636F6465A16391A8666F6F0A09626172",
+				"(_type=code,c=@('foo\n\tbar'))",
+				"(t=code,c=@('foo\n\tbar'))",
+				"_type=code&c=@('foo%0A%09bar')",
+				"t=code&c=@('foo%0A%09bar')",
 			},
 			{
 				"Datalist-1",
@@ -237,6 +425,14 @@ public class BasicHtmlSchemaTest {
 				"<datalist id='foo'>\n\t<option value='One'/>\n\t<option value='Two'/>\n</datalist>\n",
 				"<datalist id='foo'><option value='One'/><option value='Two'/></datalist>",
 				"<datalist id='foo'>\n\t<option value='One'/>\n\t<option value='Two'/>\n</datalist>\n",
+				"{_type:'datalist',a:{id:'foo'},c:[{_type:'option',a:{value:'One'}},{_type:'option',a:{value:'Two'}}]}",
+				"{t:'datalist',a:{id:'foo'},c:[{t:'option',a:{value:'One'}},{t:'option',a:{value:'Two'}}]}",
+				"83A55F74797065A8646174616C697374A16181A26964A3666F6FA1639282A55F74797065A66F7074696F6EA16181A576616C7565A34F6E6582A55F74797065A66F7074696F6EA16181A576616C7565A354776F",
+				"83A174A8646174616C697374A16181A26964A3666F6FA1639282A174A66F7074696F6EA16181A576616C7565A34F6E6582A174A66F7074696F6EA16181A576616C7565A354776F",
+				"(_type=datalist,a=(id=foo),c=@((_type=option,a=(value=One)),(_type=option,a=(value=Two))))",
+				"(t=datalist,a=(id=foo),c=@((t=option,a=(value=One)),(t=option,a=(value=Two))))",
+				"_type=datalist&a=(id=foo)&c=@((_type=option,a=(value=One)),(_type=option,a=(value=Two)))",
+				"t=datalist&a=(id=foo)&c=@((t=option,a=(value=One)),(t=option,a=(value=Two)))",
 			},
 			{
 				"Dl/Dt/Dd",
@@ -248,6 +444,14 @@ public class BasicHtmlSchemaTest {
 				"<dl>\n\t<dt>foo</dt>\n\t<dd>bar</dd>\n</dl>\n",
 				"<dl><dt>foo</dt><dd>bar</dd></dl>",
 				"<dl>\n\t<dt>foo</dt>\n\t<dd>bar</dd>\n</dl>\n",
+				"{_type:'dl',c:[{_type:'dt',c:['foo']},{_type:'dd',c:['bar']}]}",
+				"{t:'dl',c:[{t:'dt',c:['foo']},{t:'dd',c:['bar']}]}",
+				"82A55F74797065A2646CA1639282A55F74797065A26474A16391A3666F6F82A55F74797065A26464A16391A3626172",
+				"82A174A2646CA1639282A174A26474A16391A3666F6F82A174A26464A16391A3626172",
+				"(_type=dl,c=@((_type=dt,c=@(foo)),(_type=dd,c=@(bar))))",
+				"(t=dl,c=@((t=dt,c=@(foo)),(t=dd,c=@(bar))))",
+				"_type=dl&c=@((_type=dt,c=@(foo)),(_type=dd,c=@(bar)))",
+				"t=dl&c=@((t=dt,c=@(foo)),(t=dd,c=@(bar)))",
 			},
 			{
 				"Del/Ins",
@@ -256,6 +460,14 @@ public class BasicHtmlSchemaTest {
 				"<p><del>foo<b>bbb</b>bar</del><ins>baz</ins></p>\n",
 				"<p><del>foo<b>bbb</b>bar</del><ins>baz</ins></p>",
 				"<p><del>foo<b>bbb</b>bar</del><ins>baz</ins></p>\n",
+				"{_type:'p',c:[{_type:'del',c:['foo',{_type:'b',c:['bbb']},'bar']},{_type:'ins',c:['baz']}]}",
+				"{t:'p',c:[{t:'del',c:['foo',{t:'b',c:['bbb']},'bar']},{t:'ins',c:['baz']}]}",
+				"82A55F74797065A170A1639282A55F74797065A364656CA16393A3666F6F82A55F74797065A162A16391A3626262A362617282A55F74797065A3696E73A16391A362617A",
+				"82A174A170A1639282A174A364656CA16393A3666F6F82A174A162A16391A3626262A362617282A174A3696E73A16391A362617A",
+				"(_type=p,c=@((_type=del,c=@(foo,(_type=b,c=@(bbb)),bar)),(_type=ins,c=@(baz))))",
+				"(t=p,c=@((t=del,c=@(foo,(t=b,c=@(bbb)),bar)),(t=ins,c=@(baz))))",
+				"_type=p&c=@((_type=del,c=@(foo,(_type=b,c=@(bbb)),bar)),(_type=ins,c=@(baz)))",
+				"t=p&c=@((t=del,c=@(foo,(t=b,c=@(bbb)),bar)),(t=ins,c=@(baz)))",
 			},
 			{
 				"Dfn",
@@ -264,6 +476,14 @@ public class BasicHtmlSchemaTest {
 				"<p><dfn>foo</dfn></p>\n",
 				"<p><dfn>foo</dfn></p>",
 				"<p><dfn>foo</dfn></p>\n",
+				"{_type:'p',c:[{_type:'dfn',c:['foo']}]}",
+				"{t:'p',c:[{t:'dfn',c:['foo']}]}",
+				"82A55F74797065A170A1639182A55F74797065A364666EA16391A3666F6F",
+				"82A174A170A1639182A174A364666EA16391A3666F6F",
+				"(_type=p,c=@((_type=dfn,c=@(foo))))",
+				"(t=p,c=@((t=dfn,c=@(foo))))",
+				"_type=p&c=@((_type=dfn,c=@(foo)))",
+				"t=p&c=@((t=dfn,c=@(foo)))",
 			},
 			{
 				"Div",
@@ -272,6 +492,14 @@ public class BasicHtmlSchemaTest {
 				"<div>foo<b>bbb</b>bar</div>\n",
 				"<div>foo<b>bbb</b>bar</div>",
 				"<div>foo<b>bbb</b>bar</div>\n",
+				"{_type:'div',c:['foo',{_type:'b',c:['bbb']},'bar']}",
+				"{t:'div',c:['foo',{t:'b',c:['bbb']},'bar']}",
+				"82A55F74797065A3646976A16393A3666F6F82A55F74797065A162A16391A3626262A3626172",
+				"82A174A3646976A16393A3666F6F82A174A162A16391A3626262A3626172",
+				"(_type=div,c=@(foo,(_type=b,c=@(bbb)),bar))",
+				"(t=div,c=@(foo,(t=b,c=@(bbb)),bar))",
+				"_type=div&c=@(foo,(_type=b,c=@(bbb)),bar)",
+				"t=div&c=@(foo,(t=b,c=@(bbb)),bar)",
 			},
 			{
 				"Em",
@@ -280,6 +508,14 @@ public class BasicHtmlSchemaTest {
 				"<p>foo<em>bar</em>baz</p>\n",
 				"<p>foo<em>bar</em>baz</p>",
 				"<p>foo<em>bar</em>baz</p>\n",
+				"{_type:'p',c:['foo',{_type:'em',c:['bar']},'baz']}",
+				"{t:'p',c:['foo',{t:'em',c:['bar']},'baz']}",
+				"82A55F74797065A170A16393A3666F6F82A55F74797065A2656DA16391A3626172A362617A",
+				"82A174A170A16393A3666F6F82A174A2656DA16391A3626172A362617A",
+				"(_type=p,c=@(foo,(_type=em,c=@(bar)),baz))",
+				"(t=p,c=@(foo,(t=em,c=@(bar)),baz))",
+				"_type=p&c=@(foo,(_type=em,c=@(bar)),baz)",
+				"t=p&c=@(foo,(t=em,c=@(bar)),baz)",
 			},
 			{
 				"Embed",
@@ -288,6 +524,14 @@ public class BasicHtmlSchemaTest {
 				"<embed src='foo.swf'/>\n",
 				"<embed src='foo.swf'/>",
 				"<embed src='foo.swf'/>\n",
+				"{_type:'embed',a:{src:'foo.swf'}}",
+				"{t:'embed',a:{src:'foo.swf'}}",
+				"82A55F74797065A5656D626564A16181A3737263A7666F6F2E737766",
+				"82A174A5656D626564A16181A3737263A7666F6F2E737766",
+				"(_type=embed,a=(src=foo.swf))",
+				"(t=embed,a=(src=foo.swf))",
+				"_type=embed&a=(src=foo.swf)",
+				"t=embed&a=(src=foo.swf)",
 			},
 			{
 				"Form/Fieldset/Legend/Input/Keygen/Label",
@@ -304,6 +548,14 @@ public class BasicHtmlSchemaTest {
 				"<form action='bar'><fieldset><legend>foo:</legend>Name:<input type='text'/><br/>Email:<input type='text'/><br/>X:<keygen name='X'/><label for='Name'>label</label></fieldset></form>\n",
 				"<form action='bar'><fieldset><legend>foo:</legend>Name:<input type='text'/><br/>Email:<input type='text'/><br/>X:<keygen name='X'/><label for='Name'>label</label></fieldset></form>",
 				"<form action='bar'><fieldset><legend>foo:</legend>Name:<input type='text'/><br/>Email:<input type='text'/><br/>X:<keygen name='X'/><label for='Name'>label</label></fieldset></form>\n",
+				"{_type:'form',a:{action:'bar'},c:[{_type:'fieldset',c:[{_type:'legend',c:['foo:']},'Name:',{_type:'input',a:{type:'text'}},{_type:'br'},'Email:',{_type:'input',a:{type:'text'}},{_type:'br'},'X:',{_type:'keygen',a:{name:'X'}},{_type:'label',a:{'for':'Name'},c:['label']}]}]}",
+				"{t:'form',a:{action:'bar'},c:[{t:'fieldset',c:[{t:'legend',c:['foo:']},'Name:',{t:'input',a:{type:'text'}},{t:'br'},'Email:',{t:'input',a:{type:'text'}},{t:'br'},'X:',{t:'keygen',a:{name:'X'}},{t:'label',a:{'for':'Name'},c:['label']}]}]}",
+				"83A55F74797065A4666F726DA16181A6616374696F6EA3626172A1639182A55F74797065A86669656C64736574A1639A82A55F74797065A66C6567656E64A16391A4666F6F3AA54E616D653A82A55F74797065A5696E707574A16181A474797065A47465787481A55F74797065A26272A6456D61696C3A82A55F74797065A5696E707574A16181A474797065A47465787481A55F74797065A26272A2583A82A55F74797065A66B657967656EA16181A46E616D65A15883A55F74797065A56C6162656CA16181A3666F72A44E616D65A16391A56C6162656C",
+				"83A174A4666F726DA16181A6616374696F6EA3626172A1639182A174A86669656C64736574A1639A82A174A66C6567656E64A16391A4666F6F3AA54E616D653A82A174A5696E707574A16181A474797065A47465787481A174A26272A6456D61696C3A82A174A5696E707574A16181A474797065A47465787481A174A26272A2583A82A174A66B657967656EA16181A46E616D65A15883A174A56C6162656CA16181A3666F72A44E616D65A16391A56C6162656C",
+				"(_type=form,a=(action=bar),c=@((_type=fieldset,c=@((_type=legend,c=@(foo:)),Name:,(_type=input,a=(type=text)),(_type=br),Email:,(_type=input,a=(type=text)),(_type=br),X:,(_type=keygen,a=(name=X)),(_type=label,a=(for=Name),c=@(label))))))",
+				"(t=form,a=(action=bar),c=@((t=fieldset,c=@((t=legend,c=@(foo:)),Name:,(t=input,a=(type=text)),(t=br),Email:,(t=input,a=(type=text)),(t=br),X:,(t=keygen,a=(name=X)),(t=label,a=(for=Name),c=@(label))))))",
+				"_type=form&a=(action=bar)&c=@((_type=fieldset,c=@((_type=legend,c=@(foo:)),Name:,(_type=input,a=(type=text)),(_type=br),Email:,(_type=input,a=(type=text)),(_type=br),X:,(_type=keygen,a=(name=X)),(_type=label,a=(for=Name),c=@(label)))))",
+				"t=form&a=(action=bar)&c=@((t=fieldset,c=@((t=legend,c=@(foo:)),Name:,(t=input,a=(type=text)),(t=br),Email:,(t=input,a=(type=text)),(t=br),X:,(t=keygen,a=(name=X)),(t=label,a=(for=Name),c=@(label)))))",
 			},
 			{
 				"Figure/Figcaption/Img",
@@ -315,6 +567,14 @@ public class BasicHtmlSchemaTest {
 				"<figure>\n\t<img src='foo.png' alt='foo' width='100' height='200'/>\n\t<figcaption>The caption</figcaption>\n</figure>\n",
 				"<figure><img src='foo.png' alt='foo' width='100' height='200'/><figcaption>The caption</figcaption></figure>",
 				"<figure>\n\t<img src='foo.png' alt='foo' width='100' height='200'/>\n\t<figcaption>The caption</figcaption>\n</figure>\n",
+				"{_type:'figure',c:[{_type:'img',a:{src:'foo.png',alt:'foo',width:100,height:200}},{_type:'figcaption',c:['The caption']}]}",
+				"{t:'figure',c:[{t:'img',a:{src:'foo.png',alt:'foo',width:100,height:200}},{t:'figcaption',c:['The caption']}]}",
+				"82A55F74797065A6666967757265A1639282A55F74797065A3696D67A16184A3737263A7666F6F2E706E67A3616C74A3666F6FA5776964746864A6686569676874D100C882A55F74797065AA66696763617074696F6EA16391AB5468652063617074696F6E",
+				"82A174A6666967757265A1639282A174A3696D67A16184A3737263A7666F6F2E706E67A3616C74A3666F6FA5776964746864A6686569676874D100C882A174AA66696763617074696F6EA16391AB5468652063617074696F6E",
+				"(_type=figure,c=@((_type=img,a=(src=foo.png,alt=foo,width=100,height=200)),(_type=figcaption,c=@('The caption'))))",
+				"(t=figure,c=@((t=img,a=(src=foo.png,alt=foo,width=100,height=200)),(t=figcaption,c=@('The caption'))))",
+				"_type=figure&c=@((_type=img,a=(src=foo.png,alt=foo,width=100,height=200)),(_type=figcaption,c=@('The+caption')))",
+				"t=figure&c=@((t=img,a=(src=foo.png,alt=foo,width=100,height=200)),(t=figcaption,c=@('The+caption')))",
 			},
 			{
 				"H1/H2/H3/H4/H5/H6",
@@ -325,6 +585,14 @@ public class BasicHtmlSchemaTest {
 				"<div><h1>One</h1><h2>Two</h2><h3>Three</h3><h4>Four</h4><h5>Five</h5><h6>Six</h6></div>\n",
 				"<div><h1>One</h1><h2>Two</h2><h3>Three</h3><h4>Four</h4><h5>Five</h5><h6>Six</h6></div>",
 				"<div><h1>One</h1><h2>Two</h2><h3>Three</h3><h4>Four</h4><h5>Five</h5><h6>Six</h6></div>\n",
+				"{_type:'div',c:[{_type:'h1',c:['One']},{_type:'h2',c:['Two']},{_type:'h3',c:['Three']},{_type:'h4',c:['Four']},{_type:'h5',c:['Five']},{_type:'h6',c:['Six']}]}",
+				"{t:'div',c:[{t:'h1',c:['One']},{t:'h2',c:['Two']},{t:'h3',c:['Three']},{t:'h4',c:['Four']},{t:'h5',c:['Five']},{t:'h6',c:['Six']}]}",
+				"82A55F74797065A3646976A1639682A55F74797065A26831A16391A34F6E6582A55F74797065A26832A16391A354776F82A55F74797065A26833A16391A5546872656582A55F74797065A26834A16391A4466F757282A55F74797065A26835A16391A44669766582A55F74797065A26836A16391A3536978",
+				"82A174A3646976A1639682A174A26831A16391A34F6E6582A174A26832A16391A354776F82A174A26833A16391A5546872656582A174A26834A16391A4466F757282A174A26835A16391A44669766582A174A26836A16391A3536978",
+				"(_type=div,c=@((_type=h1,c=@(One)),(_type=h2,c=@(Two)),(_type=h3,c=@(Three)),(_type=h4,c=@(Four)),(_type=h5,c=@(Five)),(_type=h6,c=@(Six))))",
+				"(t=div,c=@((t=h1,c=@(One)),(t=h2,c=@(Two)),(t=h3,c=@(Three)),(t=h4,c=@(Four)),(t=h5,c=@(Five)),(t=h6,c=@(Six))))",
+				"_type=div&c=@((_type=h1,c=@(One)),(_type=h2,c=@(Two)),(_type=h3,c=@(Three)),(_type=h4,c=@(Four)),(_type=h5,c=@(Five)),(_type=h6,c=@(Six)))",
+				"t=div&c=@((t=h1,c=@(One)),(t=h2,c=@(Two)),(t=h3,c=@(Three)),(t=h4,c=@(Four)),(t=h5,c=@(Five)),(t=h6,c=@(Six)))",
 			},
 			{
 				"Hr",
@@ -333,6 +601,14 @@ public class BasicHtmlSchemaTest {
 				"<p><hr/></p>\n",
 				"<p><hr/></p>",
 				"<p><hr/></p>\n",
+				"{_type:'p',c:[{_type:'hr'}]}",
+				"{t:'p',c:[{t:'hr'}]}",
+				"82A55F74797065A170A1639181A55F74797065A26872",
+				"82A174A170A1639181A174A26872",
+				"(_type=p,c=@((_type=hr)))",
+				"(t=p,c=@((t=hr)))",
+				"_type=p&c=@((_type=hr))",
+				"t=p&c=@((t=hr))",
 			},
 			{
 				"Html/Head/Body/Title/Base/Link/Meta",
@@ -367,6 +643,14 @@ public class BasicHtmlSchemaTest {
 				+"	</head>\n"
 				+"	<body>bar</body>\n"
 				+"</html>\n",
+				"{_type:'html',c:[{_type:'head',c:[{_type:'title',c:'title'},{_type:'base',a:{href:'foo',target:'_blank'}},{_type:'link',a:{rel:'stylesheet',type:'text/css',href:'theme.css'}},{_type:'meta',a:{charset:'UTF-8'}}]},{_type:'body',c:['bar']}]}",
+				"{t:'html',c:[{t:'head',c:[{t:'title',c:'title'},{t:'base',a:{href:'foo',target:'_blank'}},{t:'link',a:{rel:'stylesheet',type:'text/css',href:'theme.css'}},{t:'meta',a:{charset:'UTF-8'}}]},{t:'body',c:['bar']}]}",
+				"82A55F74797065A468746D6CA1639282A55F74797065A468656164A1639482A55F74797065A57469746C65A163A57469746C6582A55F74797065A462617365A16182A468726566A3666F6FA6746172676574A65F626C616E6B82A55F74797065A46C696E6BA16183A372656CAA7374796C657368656574A474797065A8746578742F637373A468726566A97468656D652E63737382A55F74797065A46D657461A16181A763686172736574A55554462D3882A55F74797065A4626F6479A16391A3626172",
+				"82A174A468746D6CA1639282A174A468656164A1639482A174A57469746C65A163A57469746C6582A174A462617365A16182A468726566A3666F6FA6746172676574A65F626C616E6B82A174A46C696E6BA16183A372656CAA7374796C657368656574A474797065A8746578742F637373A468726566A97468656D652E63737382A174A46D657461A16181A763686172736574A55554462D3882A174A4626F6479A16391A3626172",
+				"(_type=html,c=@((_type=head,c=@((_type=title,c=title),(_type=base,a=(href=foo,target=_blank)),(_type=link,a=(rel=stylesheet,type=text/css,href=theme.css)),(_type=meta,a=(charset=UTF-8)))),(_type=body,c=@(bar))))",
+				"(t=html,c=@((t=head,c=@((t=title,c=title),(t=base,a=(href=foo,target=_blank)),(t=link,a=(rel=stylesheet,type=text/css,href=theme.css)),(t=meta,a=(charset=UTF-8)))),(t=body,c=@(bar))))",
+				"_type=html&c=@((_type=head,c=@((_type=title,c=title),(_type=base,a=(href=foo,target=_blank)),(_type=link,a=(rel=stylesheet,type=text/css,href=theme.css)),(_type=meta,a=(charset=UTF-8)))),(_type=body,c=@(bar)))",
+				"t=html&c=@((t=head,c=@((t=title,c=title),(t=base,a=(href=foo,target=_blank)),(t=link,a=(rel=stylesheet,type=text/css,href=theme.css)),(t=meta,a=(charset=UTF-8)))),(t=body,c=@(bar)))",
 			},
 			{
 				"I",
@@ -375,6 +659,14 @@ public class BasicHtmlSchemaTest {
 				"<p><i>foo</i></p>\n",
 				"<p><i>foo</i></p>",
 				"<p><i>foo</i></p>\n",
+				"{_type:'p',c:[{_type:'i',c:['foo']}]}",
+				"{t:'p',c:[{t:'i',c:['foo']}]}",
+				"82A55F74797065A170A1639182A55F74797065A169A16391A3666F6F",
+				"82A174A170A1639182A174A169A16391A3666F6F",
+				"(_type=p,c=@((_type=i,c=@(foo))))",
+				"(t=p,c=@((t=i,c=@(foo))))",
+				"_type=p&c=@((_type=i,c=@(foo)))",
+				"t=p&c=@((t=i,c=@(foo)))",
 			},
 			{
 				"Iframe",
@@ -383,6 +675,14 @@ public class BasicHtmlSchemaTest {
 				"<iframe>foo</iframe>\n",
 				"<iframe>foo</iframe>",
 				"<iframe>foo</iframe>\n",
+				"{_type:'iframe',c:['foo']}",
+				"{t:'iframe',c:['foo']}",
+				"82A55F74797065A6696672616D65A16391A3666F6F",
+				"82A174A6696672616D65A16391A3666F6F",
+				"(_type=iframe,c=@(foo))",
+				"(t=iframe,c=@(foo))",
+				"_type=iframe&c=@(foo)",
+				"t=iframe&c=@(foo)",
 			},
 			{
 				"Kbd",
@@ -391,6 +691,14 @@ public class BasicHtmlSchemaTest {
 				"<p><kbd>foo</kbd></p>\n",
 				"<p><kbd>foo</kbd></p>",
 				"<p><kbd>foo</kbd></p>\n",
+				"{_type:'p',c:[{_type:'kbd',c:['foo']}]}",
+				"{t:'p',c:[{t:'kbd',c:['foo']}]}",
+				"82A55F74797065A170A1639182A55F74797065A36B6264A16391A3666F6F",
+				"82A174A170A1639182A174A36B6264A16391A3666F6F",
+				"(_type=p,c=@((_type=kbd,c=@(foo))))",
+				"(t=p,c=@((t=kbd,c=@(foo))))",
+				"_type=p&c=@((_type=kbd,c=@(foo)))",
+				"t=p&c=@((t=kbd,c=@(foo)))",
 			},
 			{
 				"Main/Article/Header/Footer-1",
@@ -405,6 +713,14 @@ public class BasicHtmlSchemaTest {
 				"<main>\n\t<article><header><h1>header1</h1><p>header2</p></header><p>content</p><footer><h2>footer1</h2><p>footer2</p></footer></article>\n</main>\n",
 				"<main><article><header><h1>header1</h1><p>header2</p></header><p>content</p><footer><h2>footer1</h2><p>footer2</p></footer></article></main>",
 				"<main>\n\t<article><header><h1>header1</h1><p>header2</p></header><p>content</p><footer><h2>footer1</h2><p>footer2</p></footer></article>\n</main>\n",
+				"{_type:'main',c:[{_type:'article',c:[{_type:'header',c:[{_type:'h1',c:['header1']},{_type:'p',c:['header2']}]},{_type:'p',c:['content']},{_type:'footer',c:[{_type:'h2',c:['footer1']},{_type:'p',c:['footer2']}]}]}]}",
+				"{t:'main',c:[{t:'article',c:[{t:'header',c:[{t:'h1',c:['header1']},{t:'p',c:['header2']}]},{t:'p',c:['content']},{t:'footer',c:[{t:'h2',c:['footer1']},{t:'p',c:['footer2']}]}]}]}",
+				"82A55F74797065A46D61696EA1639182A55F74797065A761727469636C65A1639382A55F74797065A6686561646572A1639282A55F74797065A26831A16391A76865616465723182A55F74797065A170A16391A76865616465723282A55F74797065A170A16391A7636F6E74656E7482A55F74797065A6666F6F746572A1639282A55F74797065A26832A16391A7666F6F7465723182A55F74797065A170A16391A7666F6F74657232",
+				"82A174A46D61696EA1639182A174A761727469636C65A1639382A174A6686561646572A1639282A174A26831A16391A76865616465723182A174A170A16391A76865616465723282A174A170A16391A7636F6E74656E7482A174A6666F6F746572A1639282A174A26832A16391A7666F6F7465723182A174A170A16391A7666F6F74657232",
+				"(_type=main,c=@((_type=article,c=@((_type=header,c=@((_type=h1,c=@(header1)),(_type=p,c=@(header2)))),(_type=p,c=@(content)),(_type=footer,c=@((_type=h2,c=@(footer1)),(_type=p,c=@(footer2))))))))",
+				"(t=main,c=@((t=article,c=@((t=header,c=@((t=h1,c=@(header1)),(t=p,c=@(header2)))),(t=p,c=@(content)),(t=footer,c=@((t=h2,c=@(footer1)),(t=p,c=@(footer2))))))))",
+				"_type=main&c=@((_type=article,c=@((_type=header,c=@((_type=h1,c=@(header1)),(_type=p,c=@(header2)))),(_type=p,c=@(content)),(_type=footer,c=@((_type=h2,c=@(footer1)),(_type=p,c=@(footer2)))))))",
+				"t=main&c=@((t=article,c=@((t=header,c=@((t=h1,c=@(header1)),(t=p,c=@(header2)))),(t=p,c=@(content)),(t=footer,c=@((t=h2,c=@(footer1)),(t=p,c=@(footer2)))))))",
 			},
 			{
 				"Map/Area-1",
@@ -413,6 +729,14 @@ public class BasicHtmlSchemaTest {
 				"<map name='baz'>\n\t<area shape='rect' coords='0,1,2,3' href='foo' alt='bar'/>\n</map>\n",
 				"<map name='baz'><area shape='rect' coords='0,1,2,3' href='foo' alt='bar'/></map>",
 				"<map name='baz'>\n\t<area shape='rect' coords='0,1,2,3' href='foo' alt='bar'/>\n</map>\n",
+				"{_type:'map',a:{name:'baz'},c:[{_type:'area',a:{shape:'rect',coords:'0,1,2,3',href:'foo',alt:'bar'}}]}",
+				"{t:'map',a:{name:'baz'},c:[{t:'area',a:{shape:'rect',coords:'0,1,2,3',href:'foo',alt:'bar'}}]}",
+				"83A55F74797065A36D6170A16181A46E616D65A362617AA1639182A55F74797065A461726561A16184A57368617065A472656374A6636F6F726473A7302C312C322C33A468726566A3666F6FA3616C74A3626172",
+				"83A174A36D6170A16181A46E616D65A362617AA1639182A174A461726561A16184A57368617065A472656374A6636F6F726473A7302C312C322C33A468726566A3666F6FA3616C74A3626172",
+				"(_type=map,a=(name=baz),c=@((_type=area,a=(shape=rect,coords='0,1,2,3',href=foo,alt=bar))))",
+				"(t=map,a=(name=baz),c=@((t=area,a=(shape=rect,coords='0,1,2,3',href=foo,alt=bar))))",
+				"_type=map&a=(name=baz)&c=@((_type=area,a=(shape=rect,coords='0,1,2,3',href=foo,alt=bar)))",
+				"t=map&a=(name=baz)&c=@((t=area,a=(shape=rect,coords='0,1,2,3',href=foo,alt=bar)))",
 			},
 			{
 				"Mark",
@@ -421,6 +745,14 @@ public class BasicHtmlSchemaTest {
 				"<p><mark>foo</mark></p>\n",
 				"<p><mark>foo</mark></p>",
 				"<p><mark>foo</mark></p>\n",
+				"{_type:'p',c:[{_type:'mark',c:['foo']}]}",
+				"{t:'p',c:[{t:'mark',c:['foo']}]}",
+				"82A55F74797065A170A1639182A55F74797065A46D61726BA16391A3666F6F",
+				"82A174A170A1639182A174A46D61726BA16391A3666F6F",
+				"(_type=p,c=@((_type=mark,c=@(foo))))",
+				"(t=p,c=@((t=mark,c=@(foo))))",
+				"_type=p&c=@((_type=mark,c=@(foo)))",
+				"t=p&c=@((t=mark,c=@(foo)))",
 			},
 			{
 				"Meter",
@@ -429,6 +761,14 @@ public class BasicHtmlSchemaTest {
 				"<meter value='1' min='0' max='2'>foo</meter>\n",
 				"<meter value='1' min='0' max='2'>foo</meter>",
 				"<meter value='1' min='0' max='2'>foo</meter>\n",
+				"{_type:'meter',a:{value:1,min:0,max:2},c:['foo']}",
+				"{t:'meter',a:{value:1,min:0,max:2},c:['foo']}",
+				"83A55F74797065A56D65746572A16183A576616C756501A36D696E00A36D617802A16391A3666F6F",
+				"83A174A56D65746572A16183A576616C756501A36D696E00A36D617802A16391A3666F6F",
+				"(_type=meter,a=(value=1,min=0,max=2),c=@(foo))",
+				"(t=meter,a=(value=1,min=0,max=2),c=@(foo))",
+				"_type=meter&a=(value=1,min=0,max=2)&c=@(foo)",
+				"t=meter&a=(value=1,min=0,max=2)&c=@(foo)",
 			},
 			{
 				"Nav",
@@ -437,6 +777,14 @@ public class BasicHtmlSchemaTest {
 				"<nav><a href='foo'>bar</a></nav>\n",
 				"<nav><a href='foo'>bar</a></nav>",
 				"<nav><a href='foo'>bar</a></nav>\n",
+				"{_type:'nav',c:[{_type:'a',a:{href:'foo'},c:['bar']}]}",
+				"{t:'nav',c:[{t:'a',a:{href:'foo'},c:['bar']}]}",
+				"82A55F74797065A36E6176A1639183A55F74797065A161A16181A468726566A3666F6FA16391A3626172",
+				"82A174A36E6176A1639183A174A161A16181A468726566A3666F6FA16391A3626172",
+				"(_type=nav,c=@((_type=a,a=(href=foo),c=@(bar))))",
+				"(t=nav,c=@((t=a,a=(href=foo),c=@(bar))))",
+				"_type=nav&c=@((_type=a,a=(href=foo),c=@(bar)))",
+				"t=nav&c=@((t=a,a=(href=foo),c=@(bar)))",
 			},
 			{
 				"Noscript",
@@ -445,6 +793,14 @@ public class BasicHtmlSchemaTest {
 				"<noscript>No script!</noscript>\n",
 				"<noscript>No script!</noscript>",
 				"<noscript>No script!</noscript>\n",
+				"{_type:'noscript',c:['No script!']}",
+				"{t:'noscript',c:['No script!']}",
+				"82A55F74797065A86E6F736372697074A16391AA4E6F2073637269707421",
+				"82A174A86E6F736372697074A16391AA4E6F2073637269707421",
+				"(_type=noscript,c=@('No script!'))",
+				"(t=noscript,c=@('No script!'))",
+				"_type=noscript&c=@('No+script!')",
+				"t=noscript&c=@('No+script!')",
 			},
 			{
 				"Object/Param",
@@ -453,6 +809,14 @@ public class BasicHtmlSchemaTest {
 				"<object width='1' height='2' data='foo.swf'><param name='autoplay' value='true'/></object>\n",
 				"<object width='1' height='2' data='foo.swf'><param name='autoplay' value='true'/></object>",
 				"<object width='1' height='2' data='foo.swf'><param name='autoplay' value='true'/></object>\n",
+				"{_type:'object',a:{width:1,height:2,data:'foo.swf'},c:[{_type:'param',a:{name:'autoplay',value:true}}]}",
+				"{t:'object',a:{width:1,height:2,data:'foo.swf'},c:[{t:'param',a:{name:'autoplay',value:true}}]}",
+				"83A55F74797065A66F626A656374A16183A5776964746801A668656967687402A464617461A7666F6F2E737766A1639182A55F74797065A5706172616DA16182A46E616D65A86175746F706C6179A576616C7565C3",
+				"83A174A66F626A656374A16183A5776964746801A668656967687402A464617461A7666F6F2E737766A1639182A174A5706172616DA16182A46E616D65A86175746F706C6179A576616C7565C3",
+				"(_type=object,a=(width=1,height=2,data=foo.swf),c=@((_type=param,a=(name=autoplay,value=true))))",
+				"(t=object,a=(width=1,height=2,data=foo.swf),c=@((t=param,a=(name=autoplay,value=true))))",
+				"_type=object&a=(width=1,height=2,data=foo.swf)&c=@((_type=param,a=(name=autoplay,value=true)))",
+				"t=object&a=(width=1,height=2,data=foo.swf)&c=@((t=param,a=(name=autoplay,value=true)))",
 			},
 			{
 				"Ol/Li",
@@ -461,6 +825,14 @@ public class BasicHtmlSchemaTest {
 				"<ol>\n\t<li>foo</li>\n</ol>\n",
 				"<ol><li>foo</li></ol>",
 				"<ol>\n\t<li>foo</li>\n</ol>\n",
+				"{_type:'ol',c:[{_type:'li',c:['foo']}]}",
+				"{t:'ol',c:[{t:'li',c:['foo']}]}",
+				"82A55F74797065A26F6CA1639182A55F74797065A26C69A16391A3666F6F",
+				"82A174A26F6CA1639182A174A26C69A16391A3666F6F",
+				"(_type=ol,c=@((_type=li,c=@(foo))))",
+				"(t=ol,c=@((t=li,c=@(foo))))",
+				"_type=ol&c=@((_type=li,c=@(foo)))",
+				"t=ol&c=@((t=li,c=@(foo)))",
 			},
 			{
 				"Output",
@@ -473,6 +845,14 @@ public class BasicHtmlSchemaTest {
 				"<form action='testform' oninput='x.value=parseInt(a.value)+parseInt(b.value)'>0<input type='range' id='a' value='50'/>+<input type='number' id='b' value='50'/>=<output name='x' for='a b'/></form>\n",
 				"<form action='testform' oninput='x.value=parseInt(a.value)+parseInt(b.value)'>0<input type='range' id='a' value='50'/>+<input type='number' id='b' value='50'/>=<output name='x' for='a b'/></form>",
 				"<form action='testform' oninput='x.value=parseInt(a.value)+parseInt(b.value)'>0<input type='range' id='a' value='50'/>+<input type='number' id='b' value='50'/>=<output name='x' for='a b'/></form>\n",
+				"{_type:'form',a:{action:'testform',oninput:'x.value=parseInt(a.value)+parseInt(b.value)'},c:[0,{_type:'input',a:{type:'range',id:'a',value:50}},'+',{_type:'input',a:{type:'number',id:'b',value:50}},'=',{_type:'output',a:{name:'x','for':'a b'}}]}",
+				"{t:'form',a:{action:'testform',oninput:'x.value=parseInt(a.value)+parseInt(b.value)'},c:[0,{t:'input',a:{type:'range',id:'a',value:50}},'+',{t:'input',a:{type:'number',id:'b',value:50}},'=',{t:'output',a:{name:'x','for':'a b'}}]}",
+				"83A55F74797065A4666F726DA16182A6616374696F6EA874657374666F726DA76F6E696E707574D92B782E76616C75653D7061727365496E7428612E76616C7565292B7061727365496E7428622E76616C756529A163960082A55F74797065A5696E707574A16183A474797065A572616E6765A26964A161A576616C756532A12B82A55F74797065A5696E707574A16183A474797065A66E756D626572A26964A162A576616C756532A13D82A55F74797065A66F7574707574A16182A46E616D65A178A3666F72A3612062",
+				"83A174A4666F726DA16182A6616374696F6EA874657374666F726DA76F6E696E707574D92B782E76616C75653D7061727365496E7428612E76616C7565292B7061727365496E7428622E76616C756529A163960082A174A5696E707574A16183A474797065A572616E6765A26964A161A576616C756532A12B82A174A5696E707574A16183A474797065A66E756D626572A26964A162A576616C756532A13D82A174A66F7574707574A16182A46E616D65A178A3666F72A3612062",
+				"(_type=form,a=(action=testform,oninput='x.value=parseInt(a.value)+parseInt(b.value)'),c=@(0,(_type=input,a=(type=range,id=a,value=50)),+,(_type=input,a=(type=number,id=b,value=50)),'=',(_type=output,a=(name=x,for='a b'))))",
+				"(t=form,a=(action=testform,oninput='x.value=parseInt(a.value)+parseInt(b.value)'),c=@(0,(t=input,a=(type=range,id=a,value=50)),+,(t=input,a=(type=number,id=b,value=50)),'=',(t=output,a=(name=x,for='a b'))))",
+				"_type=form&a=(action=testform,oninput='x.value=parseInt(a.value)%2BparseInt(b.value)')&c=@(0,(_type=input,a=(type=range,id=a,value=50)),%2B,(_type=input,a=(type=number,id=b,value=50)),'=',(_type=output,a=(name=x,for='a+b')))",
+				"t=form&a=(action=testform,oninput='x.value=parseInt(a.value)%2BparseInt(b.value)')&c=@(0,(t=input,a=(type=range,id=a,value=50)),%2B,(t=input,a=(type=number,id=b,value=50)),'=',(t=output,a=(name=x,for='a+b')))",
 			},
 			{
 				"p",
@@ -481,6 +861,14 @@ public class BasicHtmlSchemaTest {
 				"<p>foo</p>\n",
 				"<p>foo</p>",
 				"<p>foo</p>\n",
+				"{_type:'p',c:['foo']}",
+				"{t:'p',c:['foo']}",
+				"82A55F74797065A170A16391A3666F6F",
+				"82A174A170A16391A3666F6F",
+				"(_type=p,c=@(foo))",
+				"(t=p,c=@(foo))",
+				"_type=p&c=@(foo)",
+				"t=p&c=@(foo)",
 			},
 			{
 				"Pre",
@@ -489,6 +877,14 @@ public class BasicHtmlSchemaTest {
 				"<pre>foo   &#x000a;   bar</pre>\n",
 				"<pre>foo   \n   bar</pre>",
 				"<pre>foo   \n   bar</pre>\n",	
+				"{_type:'pre',c:['foo   \\n   bar']}",
+				"{t:'pre',c:['foo   \\n   bar']}",
+				"82A55F74797065A3707265A16391AD666F6F2020200A202020626172",
+				"82A174A3707265A16391AD666F6F2020200A202020626172",
+				"(_type=pre,c=@('foo   \n   bar'))",
+				"(t=pre,c=@('foo   \n   bar'))",
+				"_type=pre&c=@('foo+++%0A+++bar')",
+				"t=pre&c=@('foo+++%0A+++bar')",
 			},
 			{
 				"Progress",
@@ -497,6 +893,14 @@ public class BasicHtmlSchemaTest {
 				"<progress value='1'/>\n",
 				"<progress value='1'/>",
 				"<progress value='1'/>\n",	
+				"{_type:'progress',a:{value:1}}",
+				"{t:'progress',a:{value:1}}",
+				"82A55F74797065A870726F6772657373A16181A576616C756501",
+				"82A174A870726F6772657373A16181A576616C756501",
+				"(_type=progress,a=(value=1))",
+				"(t=progress,a=(value=1))",
+				"_type=progress&a=(value=1)",
+				"t=progress&a=(value=1)",
 			},
 			{
 				"Q",
@@ -505,6 +909,14 @@ public class BasicHtmlSchemaTest {
 				"<p>foo<q>bar</q>baz</p>\n",
 				"<p>foo<q>bar</q>baz</p>",
 				"<p>foo<q>bar</q>baz</p>\n",	
+				"{_type:'p',c:['foo',{_type:'q',c:['bar']},'baz']}",
+				"{t:'p',c:['foo',{t:'q',c:['bar']},'baz']}",
+				"82A55F74797065A170A16393A3666F6F82A55F74797065A171A16391A3626172A362617A",
+				"82A174A170A16393A3666F6F82A174A171A16391A3626172A362617A",
+				"(_type=p,c=@(foo,(_type=q,c=@(bar)),baz))",
+				"(t=p,c=@(foo,(t=q,c=@(bar)),baz))",
+				"_type=p&c=@(foo,(_type=q,c=@(bar)),baz)",
+				"t=p&c=@(foo,(t=q,c=@(bar)),baz)",
 			},
 			{
 				"Ruby/Rb/Rtc/Rp/Rt",
@@ -515,6 +927,14 @@ public class BasicHtmlSchemaTest {
 				"<ruby>\u6cd5<rb>\u83ef</rb>\u7d4c<rtc>\u304d<rp>\u3051</rp>\u3087</rtc></ruby>\n",
 				"<ruby>\u6cd5<rb>\u83ef</rb>\u7d4c<rtc>\u304d<rp>\u3051</rp>\u3087</rtc></ruby>",
 				"<ruby>\u6cd5<rb>\u83ef</rb>\u7d4c<rtc>\u304d<rp>\u3051</rp>\u3087</rtc></ruby>\n",
+				"{_type:'ruby',c:['\u6cd5',{_type:'rb',c:['\u83ef']},'\u7d4c',{_type:'rtc',c:['\u304d',{_type:'rp',c:['\u3051']},'\u3087']}]}",
+				"{t:'ruby',c:['\u6cd5',{t:'rb',c:['\u83ef']},'\u7d4c',{t:'rtc',c:['\u304d',{t:'rp',c:['\u3051']},'\u3087']}]}",
+				"82A55F74797065A472756279A16394A3E6B39582A55F74797065A27262A16391A3E88FAFA3E7B58C82A55F74797065A3727463A16393A3E3818D82A55F74797065A27270A16391A3E38191A3E38287",
+				"82A174A472756279A16394A3E6B39582A174A27262A16391A3E88FAFA3E7B58C82A174A3727463A16393A3E3818D82A174A27270A16391A3E38191A3E38287",
+				"(_type=ruby,c=@(\u6cd5,(_type=rb,c=@(\u83ef)),\u7d4c,(_type=rtc,c=@(\u304d,(_type=rp,c=@(\u3051)),\u3087))))",
+				"(t=ruby,c=@(\u6cd5,(t=rb,c=@(\u83ef)),\u7d4c,(t=rtc,c=@(\u304d,(t=rp,c=@(\u3051)),\u3087))))",
+				"_type=ruby&c=@(%E6%B3%95,(_type=rb,c=@(%E8%8F%AF)),%E7%B5%8C,(_type=rtc,c=@(%E3%81%8D,(_type=rp,c=@(%E3%81%91)),%E3%82%87)))",
+				"t=ruby&c=@(%E6%B3%95,(t=rb,c=@(%E8%8F%AF)),%E7%B5%8C,(t=rtc,c=@(%E3%81%8D,(t=rp,c=@(%E3%81%91)),%E3%82%87)))",
 			},
 			{
 				"S",
@@ -523,6 +943,14 @@ public class BasicHtmlSchemaTest {
 				"<p>foo<s>bar</s>baz</p>\n",
 				"<p>foo<s>bar</s>baz</p>",
 				"<p>foo<s>bar</s>baz</p>\n",
+				"{_type:'p',c:['foo',{_type:'s',c:['bar']},'baz']}",
+				"{t:'p',c:['foo',{t:'s',c:['bar']},'baz']}",
+				"82A55F74797065A170A16393A3666F6F82A55F74797065A173A16391A3626172A362617A",
+				"82A174A170A16393A3666F6F82A174A173A16391A3626172A362617A",
+				"(_type=p,c=@(foo,(_type=s,c=@(bar)),baz))",
+				"(t=p,c=@(foo,(t=s,c=@(bar)),baz))",
+				"_type=p&c=@(foo,(_type=s,c=@(bar)),baz)",
+				"t=p&c=@(foo,(t=s,c=@(bar)),baz)",
 			},
 			{
 				"Samp",
@@ -531,6 +959,14 @@ public class BasicHtmlSchemaTest {
 				"<samp>foo</samp>\n",
 				"<samp>foo</samp>",
 				"<samp>foo</samp>\n",
+				"{_type:'samp',c:['foo']}",
+				"{t:'samp',c:['foo']}",
+				"82A55F74797065A473616D70A16391A3666F6F",
+				"82A174A473616D70A16391A3666F6F",
+				"(_type=samp,c=@(foo))",
+				"(t=samp,c=@(foo))",
+				"_type=samp&c=@(foo)",
+				"t=samp&c=@(foo)",
 			},
 			{
 				"Script",
@@ -539,6 +975,14 @@ public class BasicHtmlSchemaTest {
 				"<script type='text/javascript'>&#x000a;&#x0009;alert('hello world!');&#x000a;</script>\n",
 				"<script type='text/javascript'>\n\talert('hello world!');\n</script>",
 				"<script type='text/javascript'>\n\talert('hello world!');\n</script>\n",
+				"{_type:'script',a:{type:'text/javascript'},c:'\\n\\talert(\\'hello world!\\');\\n'}",
+				"{t:'script',a:{type:'text/javascript'},c:'\\n\\talert(\\'hello world!\\');\\n'}",
+				"83A55F74797065A6736372697074A16181A474797065AF746578742F6A617661736372697074A163B90A09616C657274282768656C6C6F20776F726C642127293B0A",
+				"83A174A6736372697074A16181A474797065AF746578742F6A617661736372697074A163B90A09616C657274282768656C6C6F20776F726C642127293B0A",
+				"(_type=script,a=(type=text/javascript),c='\n\talert(~'hello world!~');\n')",
+				"(t=script,a=(type=text/javascript),c='\n\talert(~'hello world!~');\n')",
+				"_type=script&a=(type=text/javascript)&c='%0A%09alert(~'hello+world!~');%0A'",
+				"t=script&a=(type=text/javascript)&c='%0A%09alert(~'hello+world!~');%0A'",
 			},
 			{
 				"Section",
@@ -547,6 +991,14 @@ public class BasicHtmlSchemaTest {
 				"<section><h1>foo</h1><p>bar</p></section>\n",
 				"<section><h1>foo</h1><p>bar</p></section>",
 				"<section><h1>foo</h1><p>bar</p></section>\n",
+				"{_type:'section',c:[{_type:'h1',c:['foo']},{_type:'p',c:['bar']}]}",
+				"{t:'section',c:[{t:'h1',c:['foo']},{t:'p',c:['bar']}]}",
+				"82A55F74797065A773656374696F6EA1639282A55F74797065A26831A16391A3666F6F82A55F74797065A170A16391A3626172",
+				"82A174A773656374696F6EA1639282A174A26831A16391A3666F6F82A174A170A16391A3626172",
+				"(_type=section,c=@((_type=h1,c=@(foo)),(_type=p,c=@(bar))))",
+				"(t=section,c=@((t=h1,c=@(foo)),(t=p,c=@(bar))))",
+				"_type=section&c=@((_type=h1,c=@(foo)),(_type=p,c=@(bar)))",
+				"t=section&c=@((t=h1,c=@(foo)),(t=p,c=@(bar)))",
 			},
 			{
 				"Select/Optgroup/Option",
@@ -555,6 +1007,14 @@ public class BasicHtmlSchemaTest {
 				"<select name='foo'>\n\t<optgroup label='bar'>\n\t\t<option value='o1'>v1</option>\n\t</optgroup>\n</select>\n",
 				"<select name='foo'><optgroup label='bar'><option value='o1'>v1</option></optgroup></select>",
 				"<select name='foo'>\n\t<optgroup label='bar'>\n\t\t<option value='o1'>v1</option>\n\t</optgroup>\n</select>\n",
+				"{_type:'select',a:{name:'foo'},c:[{_type:'optgroup',a:{label:'bar'},c:[{_type:'option',a:{value:'o1'},c:'v1'}]}]}",
+				"{t:'select',a:{name:'foo'},c:[{t:'optgroup',a:{label:'bar'},c:[{t:'option',a:{value:'o1'},c:'v1'}]}]}",
+				"83A55F74797065A673656C656374A16181A46E616D65A3666F6FA1639183A55F74797065A86F707467726F7570A16181A56C6162656CA3626172A1639183A55F74797065A66F7074696F6EA16181A576616C7565A26F31A163A27631",
+				"83A174A673656C656374A16181A46E616D65A3666F6FA1639183A174A86F707467726F7570A16181A56C6162656CA3626172A1639183A174A66F7074696F6EA16181A576616C7565A26F31A163A27631",
+				"(_type=select,a=(name=foo),c=@((_type=optgroup,a=(label=bar),c=@((_type=option,a=(value=o1),c=v1)))))",
+				"(t=select,a=(name=foo),c=@((t=optgroup,a=(label=bar),c=@((t=option,a=(value=o1),c=v1)))))",
+				"_type=select&a=(name=foo)&c=@((_type=optgroup,a=(label=bar),c=@((_type=option,a=(value=o1),c=v1))))",
+				"t=select&a=(name=foo)&c=@((t=optgroup,a=(label=bar),c=@((t=option,a=(value=o1),c=v1))))",
 			},
 			{
 				"Small",
@@ -563,6 +1023,14 @@ public class BasicHtmlSchemaTest {
 				"<p><small>foo</small></p>\n",
 				"<p><small>foo</small></p>",
 				"<p><small>foo</small></p>\n",
+				"{_type:'p',c:[{_type:'small',c:['foo']}]}",
+				"{t:'p',c:[{t:'small',c:['foo']}]}",
+				"82A55F74797065A170A1639182A55F74797065A5736D616C6CA16391A3666F6F",
+				"82A174A170A1639182A174A5736D616C6CA16391A3666F6F",
+				"(_type=p,c=@((_type=small,c=@(foo))))",
+				"(t=p,c=@((t=small,c=@(foo))))",
+				"_type=p&c=@((_type=small,c=@(foo)))",
+				"t=p&c=@((t=small,c=@(foo)))",
 			},
 			{
 				"Span",
@@ -571,6 +1039,14 @@ public class BasicHtmlSchemaTest {
 				"<p>My mother has_x0020_<span style='color:blue'>blue</span>_x0020_eyes.</p>\n",
 				"<p>My mother has<sp> </sp><span style='color:blue'>blue</span><sp> </sp>eyes.</p>",
 				"<p>My mother has<sp> </sp><span style='color:blue'>blue</span><sp> </sp>eyes.</p>\n",
+				"{_type:'p',c:['My mother has ',{_type:'span',a:{style:'color:blue'},c:['blue']},' eyes.']}",
+				"{t:'p',c:['My mother has ',{t:'span',a:{style:'color:blue'},c:['blue']},' eyes.']}",
+				"82A55F74797065A170A16393AE4D79206D6F74686572206861732083A55F74797065A47370616EA16181A57374796C65AA636F6C6F723A626C7565A16391A4626C7565A620657965732E",
+				"82A174A170A16393AE4D79206D6F74686572206861732083A174A47370616EA16181A57374796C65AA636F6C6F723A626C7565A16391A4626C7565A620657965732E",
+				"(_type=p,c=@('My mother has ',(_type=span,a=(style=color:blue),c=@(blue)),' eyes.'))",
+				"(t=p,c=@('My mother has ',(t=span,a=(style=color:blue),c=@(blue)),' eyes.'))",
+				"_type=p&c=@('My+mother+has+',(_type=span,a=(style=color:blue),c=@(blue)),'+eyes.')",
+				"t=p&c=@('My+mother+has+',(t=span,a=(style=color:blue),c=@(blue)),'+eyes.')",
 			},
 			{
 				"Strong",
@@ -579,6 +1055,14 @@ public class BasicHtmlSchemaTest {
 				"<p><strong>foo</strong></p>\n",
 				"<p><strong>foo</strong></p>",
 				"<p><strong>foo</strong></p>\n",
+				"{_type:'p',c:[{_type:'strong',c:['foo']}]}",
+				"{t:'p',c:[{t:'strong',c:['foo']}]}",
+				"82A55F74797065A170A1639182A55F74797065A67374726F6E67A16391A3666F6F",
+				"82A174A170A1639182A174A67374726F6E67A16391A3666F6F",
+				"(_type=p,c=@((_type=strong,c=@(foo))))",
+				"(t=p,c=@((t=strong,c=@(foo))))",
+				"_type=p&c=@((_type=strong,c=@(foo)))",
+				"t=p&c=@((t=strong,c=@(foo)))",
 			},
 			{
 				"Style",
@@ -587,6 +1071,14 @@ public class BasicHtmlSchemaTest {
 				"<head>\n\t<style>&#x000a;&#x0009;h1 {color:red;}&#x000a;&#x0009;p: {color:blue;}&#x000a;</style>\n</head>\n",
 				"<head><style>\n\th1 {color:red;}\n\tp: {color:blue;}\n</style></head>",
 				"<head>\n\t<style>\n\th1 {color:red;}\n\tp: {color:blue;}\n</style>\n</head>\n",
+				"{_type:'head',c:[{_type:'style',c:'\\n\\th1 {color:red;}\\n\\tp: {color:blue;}\\n'}]}",
+				"{t:'head',c:[{t:'style',c:'\\n\\th1 {color:red;}\\n\\tp: {color:blue;}\\n'}]}",
+				"82A55F74797065A468656164A1639182A55F74797065A57374796C65A163D9240A096831207B636F6C6F723A7265643B7D0A09703A207B636F6C6F723A626C75653B7D0A",
+				"82A174A468656164A1639182A174A57374796C65A163D9240A096831207B636F6C6F723A7265643B7D0A09703A207B636F6C6F723A626C75653B7D0A",
+				"(_type=head,c=@((_type=style,c='\n\th1 {color:red;}\n\tp: {color:blue;}\n')))",
+				"(t=head,c=@((t=style,c='\n\th1 {color:red;}\n\tp: {color:blue;}\n')))",
+				"_type=head&c=@((_type=style,c='%0A%09h1+%7Bcolor:red;%7D%0A%09p:+%7Bcolor:blue;%7D%0A'))",
+				"t=head&c=@((t=style,c='%0A%09h1+%7Bcolor:red;%7D%0A%09p:+%7Bcolor:blue;%7D%0A'))",
 			},
 			{
 				"Sub",
@@ -595,6 +1087,14 @@ public class BasicHtmlSchemaTest {
 				"<p><sub>foo</sub></p>\n",
 				"<p><sub>foo</sub></p>",
 				"<p><sub>foo</sub></p>\n",
+				"{_type:'p',c:[{_type:'sub',c:['foo']}]}",
+				"{t:'p',c:[{t:'sub',c:['foo']}]}",
+				"82A55F74797065A170A1639182A55F74797065A3737562A16391A3666F6F",
+				"82A174A170A1639182A174A3737562A16391A3666F6F",
+				"(_type=p,c=@((_type=sub,c=@(foo))))",
+				"(t=p,c=@((t=sub,c=@(foo))))",
+				"_type=p&c=@((_type=sub,c=@(foo)))",
+				"t=p&c=@((t=sub,c=@(foo)))",
 			},
 			{
 				"Sup",
@@ -603,6 +1103,14 @@ public class BasicHtmlSchemaTest {
 				"<p><sup>foo</sup></p>\n",
 				"<p><sup>foo</sup></p>",
 				"<p><sup>foo</sup></p>\n",
+				"{_type:'p',c:[{_type:'sup',c:['foo']}]}",
+				"{t:'p',c:[{t:'sup',c:['foo']}]}",
+				"82A55F74797065A170A1639182A55F74797065A3737570A16391A3666F6F",
+				"82A174A170A1639182A174A3737570A16391A3666F6F",
+				"(_type=p,c=@((_type=sup,c=@(foo))))",
+				"(t=p,c=@((t=sup,c=@(foo))))",
+				"_type=p&c=@((_type=sup,c=@(foo)))",
+				"t=p&c=@((t=sup,c=@(foo)))",
 			},
 			{
 				"Table/Colgroup/Col/Caption/THead/TBody/TFoot/Tr/Th/Td-1",
@@ -716,6 +1224,14 @@ public class BasicHtmlSchemaTest {
 						+"\t\t</tr>\n"
 					+"\t</tfoot>\n"
 				+"</table>\n",
+				"{_type:'table',c:[{_type:'caption',c:['caption1']},{_type:'colgroup',c:[{_type:'col',a:{'class':'foo'}},{_type:'col',a:{'class':'bar'}}]},{_type:'thead',c:[{_type:'tr',c:[{_type:'th',c:['c1']},{_type:'th',c:['c2']}]}]},{_type:'tbody',c:[{_type:'tr',c:[{_type:'td',c:['v1']},{_type:'td',c:['v2']}]}]},{_type:'tfoot',c:[{_type:'tr',c:[{_type:'td',c:['f1']},{_type:'td',c:['f2']}]}]}]}",
+				"{t:'table',c:[{t:'caption',c:['caption1']},{t:'colgroup',c:[{t:'col',a:{'class':'foo'}},{t:'col',a:{'class':'bar'}}]},{t:'thead',c:[{t:'tr',c:[{t:'th',c:['c1']},{t:'th',c:['c2']}]}]},{t:'tbody',c:[{t:'tr',c:[{t:'td',c:['v1']},{t:'td',c:['v2']}]}]},{t:'tfoot',c:[{t:'tr',c:[{t:'td',c:['f1']},{t:'td',c:['f2']}]}]}]}",
+				"82A55F74797065A57461626C65A1639582A55F74797065A763617074696F6EA16391A863617074696F6E3182A55F74797065A8636F6C67726F7570A1639282A55F74797065A3636F6CA16181A5636C617373A3666F6F82A55F74797065A3636F6CA16181A5636C617373A362617282A55F74797065A57468656164A1639182A55F74797065A27472A1639282A55F74797065A27468A16391A2633182A55F74797065A27468A16391A2633282A55F74797065A574626F6479A1639182A55F74797065A27472A1639282A55F74797065A27464A16391A2763182A55F74797065A27464A16391A2763282A55F74797065A574666F6F74A1639182A55F74797065A27472A1639282A55F74797065A27464A16391A2663182A55F74797065A27464A16391A26632",
+				"82A174A57461626C65A1639582A174A763617074696F6EA16391A863617074696F6E3182A174A8636F6C67726F7570A1639282A174A3636F6CA16181A5636C617373A3666F6F82A174A3636F6CA16181A5636C617373A362617282A174A57468656164A1639182A174A27472A1639282A174A27468A16391A2633182A174A27468A16391A2633282A174A574626F6479A1639182A174A27472A1639282A174A27464A16391A2763182A174A27464A16391A2763282A174A574666F6F74A1639182A174A27472A1639282A174A27464A16391A2663182A174A27464A16391A26632",
+				"(_type=table,c=@((_type=caption,c=@(caption1)),(_type=colgroup,c=@((_type=col,a=(class=foo)),(_type=col,a=(class=bar)))),(_type=thead,c=@((_type=tr,c=@((_type=th,c=@(c1)),(_type=th,c=@(c2)))))),(_type=tbody,c=@((_type=tr,c=@((_type=td,c=@(v1)),(_type=td,c=@(v2)))))),(_type=tfoot,c=@((_type=tr,c=@((_type=td,c=@(f1)),(_type=td,c=@(f2))))))))",
+				"(t=table,c=@((t=caption,c=@(caption1)),(t=colgroup,c=@((t=col,a=(class=foo)),(t=col,a=(class=bar)))),(t=thead,c=@((t=tr,c=@((t=th,c=@(c1)),(t=th,c=@(c2)))))),(t=tbody,c=@((t=tr,c=@((t=td,c=@(v1)),(t=td,c=@(v2)))))),(t=tfoot,c=@((t=tr,c=@((t=td,c=@(f1)),(t=td,c=@(f2))))))))",
+				"_type=table&c=@((_type=caption,c=@(caption1)),(_type=colgroup,c=@((_type=col,a=(class=foo)),(_type=col,a=(class=bar)))),(_type=thead,c=@((_type=tr,c=@((_type=th,c=@(c1)),(_type=th,c=@(c2)))))),(_type=tbody,c=@((_type=tr,c=@((_type=td,c=@(v1)),(_type=td,c=@(v2)))))),(_type=tfoot,c=@((_type=tr,c=@((_type=td,c=@(f1)),(_type=td,c=@(f2)))))))",
+				"t=table&c=@((t=caption,c=@(caption1)),(t=colgroup,c=@((t=col,a=(class=foo)),(t=col,a=(class=bar)))),(t=thead,c=@((t=tr,c=@((t=th,c=@(c1)),(t=th,c=@(c2)))))),(t=tbody,c=@((t=tr,c=@((t=td,c=@(v1)),(t=td,c=@(v2)))))),(t=tfoot,c=@((t=tr,c=@((t=td,c=@(f1)),(t=td,c=@(f2)))))))",
 			},
 			{
 				"Template",
@@ -724,6 +1240,14 @@ public class BasicHtmlSchemaTest {
 				"<template id='foo'><div>bar</div></template>\n",
 				"<template id='foo'><div>bar</div></template>",
 				"<template id='foo'><div>bar</div></template>\n",
+				"{_type:'template',a:{id:'foo'},c:[{_type:'div',c:['bar']}]}",
+				"{t:'template',a:{id:'foo'},c:[{t:'div',c:['bar']}]}",
+				"83A55F74797065A874656D706C617465A16181A26964A3666F6FA1639182A55F74797065A3646976A16391A3626172",
+				"83A174A874656D706C617465A16181A26964A3666F6FA1639182A174A3646976A16391A3626172",
+				"(_type=template,a=(id=foo),c=@((_type=div,c=@(bar))))",
+				"(t=template,a=(id=foo),c=@((t=div,c=@(bar))))",
+				"_type=template&a=(id=foo)&c=@((_type=div,c=@(bar)))",
+				"t=template&a=(id=foo)&c=@((t=div,c=@(bar)))",
 			},
 			{
 				"Textarea",
@@ -732,6 +1256,14 @@ public class BasicHtmlSchemaTest {
 				"<textarea name='foo'>bar</textarea>\n",
 				"<textarea name='foo'>bar</textarea>",
 				"<textarea name='foo'>bar</textarea>\n",
+				"{_type:'textarea',a:{name:'foo'},c:'bar'}",
+				"{t:'textarea',a:{name:'foo'},c:'bar'}",
+				"83A55F74797065A87465787461726561A16181A46E616D65A3666F6FA163A3626172",
+				"83A174A87465787461726561A16181A46E616D65A3666F6FA163A3626172",
+				"(_type=textarea,a=(name=foo),c=bar)",
+				"(t=textarea,a=(name=foo),c=bar)",
+				"_type=textarea&a=(name=foo)&c=bar",
+				"t=textarea&a=(name=foo)&c=bar",
 			},
 			{	
 				"Time",
@@ -740,6 +1272,14 @@ public class BasicHtmlSchemaTest {
 				"<p>I have a date on_x0020_<time datetime='2016-02-14 18:00'>Valentines day</time>.</p>\n",
 				"<p>I have a date on<sp> </sp><time datetime='2016-02-14 18:00'>Valentines day</time>.</p>",
 				"<p>I have a date on<sp> </sp><time datetime='2016-02-14 18:00'>Valentines day</time>.</p>\n",
+				"{_type:'p',c:['I have a date on ',{_type:'time',a:{datetime:'2016-02-14 18:00'},c:['Valentines day']},'.']}",
+				"{t:'p',c:['I have a date on ',{t:'time',a:{datetime:'2016-02-14 18:00'},c:['Valentines day']},'.']}",
+				"82A55F74797065A170A16393B149206861766520612064617465206F6E2083A55F74797065A474696D65A16181A86461746574696D65B0323031362D30322D31342031383A3030A16391AE56616C656E74696E657320646179A12E",
+				"82A174A170A16393B149206861766520612064617465206F6E2083A174A474696D65A16181A86461746574696D65B0323031362D30322D31342031383A3030A16391AE56616C656E74696E657320646179A12E",
+				"(_type=p,c=@('I have a date on ',(_type=time,a=(datetime='2016-02-14 18:00'),c=@('Valentines day')),.))",
+				"(t=p,c=@('I have a date on ',(t=time,a=(datetime='2016-02-14 18:00'),c=@('Valentines day')),.))",
+				"_type=p&c=@('I+have+a+date+on+',(_type=time,a=(datetime='2016-02-14+18:00'),c=@('Valentines+day')),.)",
+				"t=p&c=@('I+have+a+date+on+',(t=time,a=(datetime='2016-02-14+18:00'),c=@('Valentines+day')),.)",
 			},
 			{
 				"U",
@@ -748,6 +1288,14 @@ public class BasicHtmlSchemaTest {
 				"<p><u>foo</u></p>\n",
 				"<p><u>foo</u></p>",
 				"<p><u>foo</u></p>\n",
+				"{_type:'p',c:[{_type:'u',c:['foo']}]}",
+				"{t:'p',c:[{t:'u',c:['foo']}]}",
+				"82A55F74797065A170A1639182A55F74797065A175A16391A3666F6F",
+				"82A174A170A1639182A174A175A16391A3666F6F",
+				"(_type=p,c=@((_type=u,c=@(foo))))",
+				"(t=p,c=@((t=u,c=@(foo))))",
+				"_type=p&c=@((_type=u,c=@(foo)))",
+				"t=p&c=@((t=u,c=@(foo)))",
 			},
 			{
 				"Ul/Li",
@@ -756,6 +1304,14 @@ public class BasicHtmlSchemaTest {
 				"<ul>\n\t<li>foo</li>\n</ul>\n",
 				"<ul><li>foo</li></ul>",
 				"<ul>\n\t<li>foo</li>\n</ul>\n",
+				"{_type:'ul',c:[{_type:'li',c:['foo']}]}",
+				"{t:'ul',c:[{t:'li',c:['foo']}]}",
+				"82A55F74797065A2756CA1639182A55F74797065A26C69A16391A3666F6F",
+				"82A174A2756CA1639182A174A26C69A16391A3666F6F",
+				"(_type=ul,c=@((_type=li,c=@(foo))))",
+				"(t=ul,c=@((t=li,c=@(foo))))",
+				"_type=ul&c=@((_type=li,c=@(foo)))",
+				"t=ul&c=@((t=li,c=@(foo)))",
 			},
 			{
 				"Var",
@@ -764,6 +1320,14 @@ public class BasicHtmlSchemaTest {
 				"<p><var>foo</var></p>\n",
 				"<p><var>foo</var></p>",
 				"<p><var>foo</var></p>\n",
+				"{_type:'p',c:[{_type:'var',c:['foo']}]}",
+				"{t:'p',c:[{t:'var',c:['foo']}]}",
+				"82A55F74797065A170A1639182A55F74797065A3766172A16391A3666F6F",
+				"82A174A170A1639182A174A3766172A16391A3666F6F",
+				"(_type=p,c=@((_type=var,c=@(foo))))",
+				"(t=p,c=@((t=var,c=@(foo))))",
+				"_type=p&c=@((_type=var,c=@(foo)))",
+				"t=p&c=@((t=var,c=@(foo)))",
 			},
 			{
 				"Video/Source/Track",
@@ -775,6 +1339,14 @@ public class BasicHtmlSchemaTest {
 				"<video width='100' height='200' controls='true'>\n\t<source src='foo.mp4' type='video/mp4'/>\n\t<track src='subtitles_en.vtt' kind='subtitles' srclang='en'/>\n</video>\n",
 				"<video width='100' height='200' controls='true'><source src='foo.mp4' type='video/mp4'/><track src='subtitles_en.vtt' kind='subtitles' srclang='en'/></video>",
 				"<video width='100' height='200' controls='true'>\n\t<source src='foo.mp4' type='video/mp4'/>\n\t<track src='subtitles_en.vtt' kind='subtitles' srclang='en'/>\n</video>\n",
+				"{_type:'video',a:{width:100,height:200,controls:true},c:[{_type:'source',a:{src:'foo.mp4',type:'video/mp4'}},{_type:'track',a:{src:'subtitles_en.vtt',kind:'subtitles',srclang:'en'}}]}",
+				"{t:'video',a:{width:100,height:200,controls:true},c:[{t:'source',a:{src:'foo.mp4',type:'video/mp4'}},{t:'track',a:{src:'subtitles_en.vtt',kind:'subtitles',srclang:'en'}}]}",
+				"83A55F74797065A5766964656FA16183A5776964746864A6686569676874D100C8A8636F6E74726F6C73C3A1639282A55F74797065A6736F75726365A16182A3737263A7666F6F2E6D7034A474797065A9766964656F2F6D703482A55F74797065A5747261636BA16183A3737263B07375627469746C65735F656E2E767474A46B696E64A97375627469746C6573A77372636C616E67A2656E",
+				"83A174A5766964656FA16183A5776964746864A6686569676874D100C8A8636F6E74726F6C73C3A1639282A174A6736F75726365A16182A3737263A7666F6F2E6D7034A474797065A9766964656F2F6D703482A174A5747261636BA16183A3737263B07375627469746C65735F656E2E767474A46B696E64A97375627469746C6573A77372636C616E67A2656E",
+				"(_type=video,a=(width=100,height=200,controls=true),c=@((_type=source,a=(src=foo.mp4,type=video/mp4)),(_type=track,a=(src=subtitles_en.vtt,kind=subtitles,srclang=en))))",
+				"(t=video,a=(width=100,height=200,controls=true),c=@((t=source,a=(src=foo.mp4,type=video/mp4)),(t=track,a=(src=subtitles_en.vtt,kind=subtitles,srclang=en))))",
+				"_type=video&a=(width=100,height=200,controls=true)&c=@((_type=source,a=(src=foo.mp4,type=video/mp4)),(_type=track,a=(src=subtitles_en.vtt,kind=subtitles,srclang=en)))",
+				"t=video&a=(width=100,height=200,controls=true)&c=@((t=source,a=(src=foo.mp4,type=video/mp4)),(t=track,a=(src=subtitles_en.vtt,kind=subtitles,srclang=en)))",
 			},
 			{
 				"Wbr",
@@ -783,26 +1355,44 @@ public class BasicHtmlSchemaTest {
 				"<p>foo<wbr/>bar</p>\n",
 				"<p>foo<wbr/>bar</p>",
 				"<p>foo<wbr/>bar</p>\n",
+				"{_type:'p',c:['foo',{_type:'wbr'},'bar']}",
+				"{t:'p',c:['foo',{t:'wbr'},'bar']}",
+				"82A55F74797065A170A16393A3666F6F81A55F74797065A3776272A3626172",
+				"82A174A170A16393A3666F6F81A174A3776272A3626172",
+				"(_type=p,c=@(foo,(_type=wbr),bar))",
+				"(t=p,c=@(foo,(t=wbr),bar))",
+				"_type=p&c=@(foo,(_type=wbr),bar)",
+				"t=p&c=@(foo,(t=wbr),bar)",
 			},
 		});
 	}
 
 
-	private String label, xml, xmlr, html, htmlr;
+	private String label, xml, xmlr, html, htmlr, json, jsonT, msgPack, msgPackT, uon, uonT, urlEncoding, urlEncodingT;
 	private Object in;
 
-	public BasicHtmlSchemaTest(String label, Object in, String xml, String xmlr, String html, String htmlr) throws Exception {
+	public BasicHtmlSchemaTest(String label, Object in, String xml, String xmlr, String html, String htmlr, String json, String jsonT, String msgPack, String msgPackT, String uon, String uonT, String urlEncoding, String urlEncodingT) throws Exception {
 		this.label = label;
 		this.in = in;
 		this.xml = xml;
 		this.xmlr = xmlr;
 		this.html = html;
 		this.htmlr = htmlr;
+		this.json = json;
+		this.jsonT = jsonT;
+		this.msgPack = msgPack;
+		this.msgPackT = msgPackT;
+		this.uon = uon;
+		this.uonT = uonT;
+		this.urlEncoding = urlEncoding;
+		this.urlEncodingT = urlEncodingT;
 	}
 
 	private void testSerialize(WriterSerializer s, String expected) throws Exception {
 		try {
 			String r = s.serialize(in);
+			if (expected.equals("xxx"))
+				System.out.println(label + "=\t" + r); // NOT DEBUG
 			assertEquals(label + " serialize-normal failed", expected, r);
 		} catch (AssertionError e) {
 			throw e;
@@ -824,6 +1414,45 @@ public class BasicHtmlSchemaTest {
 		}
 	}
 
+	private void testSerialize(OutputStreamSerializer s, String expected) throws Exception {
+		try {
+			String r = s.serializeToHex(in);
+			if (expected.equals("xxx"))
+				System.out.println(label + "=\t" + r); // NOT DEBUG
+			assertEquals(label + " serialize-normal failed", expected, r);
+		} catch (AssertionError e) {
+			throw e;
+		} catch (Exception e) {
+			throw new AssertionError(label + " test failed.  exception=" + e.getLocalizedMessage());
+		}
+	}
+
+	private void testParse(OutputStreamSerializer s, InputStreamParser p, String expected) throws Exception {
+		try {
+			String r = s.serializeToHex(in);
+			Object o = p.parse(r, in == null ? Object.class : in.getClass());
+			r = s.serializeToHex(o);
+			assertEquals(label + " parse-normal failed", expected, r);
+		} catch (AssertionError e) {
+			throw e;
+		} catch (Exception e) {
+			throw new AssertionError(label + " test failed.  exception=" + e.getLocalizedMessage());
+		}
+	}
+
+	private void testParseJsonEquivalency(OutputStreamSerializer s, InputStreamParser p, String expected) throws Exception {
+		try {
+			String r = s.serializeToHex(in);
+			Object o = p.parse(r, in == null ? Object.class : in.getClass());
+			r = sJson.serialize(o);
+			assertEquals(label + " parse-normal failed on JSON equivalency", expected, r);
+		} catch (AssertionError e) {
+			throw e;
+		} catch (Exception e) {
+			throw new AssertionError(label + " test failed.  exception=" + e.getLocalizedMessage());
+		}
+	}
+
 	@Test
 	public void serializeXmlDefaultSq() throws Exception {
 		testSerialize(sXmlSq, xml);
@@ -873,4 +1502,94 @@ public class BasicHtmlSchemaTest {
 	public void parseHtmlDefaultSqReadable() throws Exception {
 		testParse(sHtmlSqReadable, pHtml, htmlr);
 	}
+
+	@Test
+	public void serializeJson() throws Exception {
+		testSerialize(sJson, json);
+	}
+
+	@Test
+	public void parseJson() throws Exception {
+		testParse(sJson, pJson, json);
+	}
+
+	@Test
+	public void serializeJsonT() throws Exception {
+		testSerialize(sJsonT, jsonT);
+	}
+
+	@Test
+	public void parseJsonT() throws Exception {
+		testParse(sJsonT, pJsonT, jsonT);
+	}
+
+	@Test
+	public void serializeMsgPack() throws Exception {
+		testSerialize(sMsgPack, msgPack);
+	}
+
+	@Test
+	public void parseMsgPack() throws Exception {
+		testParse(sMsgPack, pMsgPack, msgPack);
+	}
+
+	@Test
+	public void parseMsgPackJsonEquivalency() throws Exception {
+		testParseJsonEquivalency(sMsgPack, pMsgPack, json);
+	}
+
+	@Test
+	public void serializeMsgPackT() throws Exception {
+		testSerialize(sMsgPackT, msgPackT);
+	}
+
+	@Test
+	public void parseMsgPackT() throws Exception {
+		testParse(sMsgPackT, pMsgPackT, msgPackT);
+	}
+
+	@Test
+	public void parseMsgPackTJsonEquivalency() throws Exception {
+		testParseJsonEquivalency(sMsgPackT, pMsgPackT, json);
+	}
+
+	@Test
+	public void serializeUon() throws Exception {
+		testSerialize(sUon, uon);
+	}
+
+	@Test
+	public void parseUon() throws Exception {
+		testParse(sUon, pUon, uon);
+	}
+
+	@Test
+	public void serializeUonT() throws Exception {
+		testSerialize(sUonT, uonT);
+	}
+
+	@Test
+	public void parseUonT() throws Exception {
+		testParse(sUonT, pUonT, uonT);
+	}
+
+	@Test
+	public void serializeUrlEncoding() throws Exception {
+		testSerialize(sUrlEncoding, urlEncoding);
+	}
+
+	@Test
+	public void parseUrlEncoding() throws Exception {
+		testParse(sUrlEncoding, pUrlEncoding, urlEncoding);
+	}
+
+	@Test
+	public void serializeUrlEncodingT() throws Exception {
+		testSerialize(sUrlEncodingT, urlEncodingT);
+	}
+
+	@Test
+	public void parseUrlEncodingT() throws Exception {
+		testParse(sUrlEncodingT, pUrlEncodingT, urlEncodingT);
+	}
 }

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/097b8103/juneau-core-test/src/test/java/org/apache/juneau/dto/jsonschema/JsonSchemaTest.java
----------------------------------------------------------------------
diff --git a/juneau-core-test/src/test/java/org/apache/juneau/dto/jsonschema/JsonSchemaTest.java b/juneau-core-test/src/test/java/org/apache/juneau/dto/jsonschema/JsonSchemaTest.java
index e6883f5..0d3d9d8 100755
--- a/juneau-core-test/src/test/java/org/apache/juneau/dto/jsonschema/JsonSchemaTest.java
+++ b/juneau-core-test/src/test/java/org/apache/juneau/dto/jsonschema/JsonSchemaTest.java
@@ -12,7 +12,6 @@
 // ***************************************************************************************************************************
 package org.apache.juneau.dto.jsonschema;
 
-import static org.apache.juneau.TestUtils.*;
 import static org.junit.Assert.*;
 
 import java.net.*;
@@ -25,7 +24,7 @@ public class JsonSchemaTest {
 
 	@Test
 	public void testSchema1() throws Exception {
-		JsonSerializer s = JsonSerializer.DEFAULT_LAX_READABLE;
+		JsonSerializer s = JsonSerializer.DEFAULT_LAX_READABLE.clone().setAddBeanTypeProperties(false);
 		JsonParser p = JsonParser.DEFAULT;
 		String r;
 		Schema t, t2;
@@ -113,12 +112,13 @@ public class JsonSchemaTest {
 		r = s.serialize(t);
 		assertEquals(expected, r);
 		t2 = p.parse(r, Schema.class);
-		assertEqualObjects(t, t2);
+		r = s.serialize(t2);
+		assertEquals(expected, r);
 	}
 
 	@Test
 	public void testSchema2() throws Exception {
-		JsonSerializer s = JsonSerializer.DEFAULT_LAX_READABLE;
+		JsonSerializer s = JsonSerializer.DEFAULT_LAX_READABLE.clone().setAddBeanTypeProperties(false);
 		JsonParser p = JsonParser.DEFAULT;
 		String r;
 		Schema t, t2;
@@ -149,7 +149,8 @@ public class JsonSchemaTest {
 		r = s.serialize(t);
 		assertEquals(expected, r);
 		t2 = p.parse(r, Schema.class);
-		assertEqualObjects(t, t2);
+		r = s.serialize(t2);
+		assertEquals(expected, r);
 	}
 
 	/** Bean with simple values for each property */
@@ -188,7 +189,7 @@ public class JsonSchemaTest {
 			.setNot(new SchemaRef("http://not"))
 		;
 	}
-
+	
 	/** Bean with other possible property value types not covered in test1 */
 	public static Schema getTest2() {
 		return new Schema()

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/097b8103/juneau-core-test/src/test/java/org/apache/juneau/html/CommonTest.java
----------------------------------------------------------------------
diff --git a/juneau-core-test/src/test/java/org/apache/juneau/html/CommonTest.java b/juneau-core-test/src/test/java/org/apache/juneau/html/CommonTest.java
index 0109e44..d4e29a5 100755
--- a/juneau-core-test/src/test/java/org/apache/juneau/html/CommonTest.java
+++ b/juneau-core-test/src/test/java/org/apache/juneau/html/CommonTest.java
@@ -353,7 +353,7 @@ public class CommonTest {
 	//====================================================================================================
 	@Test
 	public void testUris() throws Exception {
-		HtmlSerializer s = new HtmlSerializer.Sq().setUriAnchorText(PROPERTY_NAME).setUseIndentation(false).setAddKeyValueTableHeaders(true);
+		HtmlSerializer s = new HtmlSerializer.Sq().setUriAnchorText(PROPERTY_NAME).setUseWhitespace(false).setAddKeyValueTableHeaders(true);
 		TestURI t = new TestURI();
 		String r;
 		String expected;

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/097b8103/juneau-core-test/src/test/java/org/apache/juneau/jena/CommonParserTest.java
----------------------------------------------------------------------
diff --git a/juneau-core-test/src/test/java/org/apache/juneau/jena/CommonParserTest.java b/juneau-core-test/src/test/java/org/apache/juneau/jena/CommonParserTest.java
index 7d034cd..341246a 100755
--- a/juneau-core-test/src/test/java/org/apache/juneau/jena/CommonParserTest.java
+++ b/juneau-core-test/src/test/java/org/apache/juneau/jena/CommonParserTest.java
@@ -44,7 +44,7 @@ public class CommonParserTest {
 		return new RdfSerializer()
 			.setQuoteChar('\'')
 			.setAddLiteralTypes(true)
-			.setUseIndentation(false)
+			.setUseWhitespace(false)
 			.setProperty(RDF_rdfxml_allowBadUris, true)
 			.setProperty(RDF_rdfxml_showDoctypeDeclaration, false)
 			.setProperty(RDF_rdfxml_showXmlDeclaration, false);
@@ -111,7 +111,7 @@ public class CommonParserTest {
 
 		s.setAddBeanTypeProperties(true);
 		in = strip(s.serialize(t1));
-		assertEquals("<rdf:Description><j:_type>A1</j:_type><jp:list><rdf:Seq><rdf:li rdf:parseType='Resource'><jp:name>name0</jp:name><jp:value>value0</jp:value></rdf:li><rdf:li rdf:parseType='Resource'><jp:name>name1</jp:name><jp:value>value1</jp:value></rdf:li></rdf:Seq></jp:list></rdf:Description>", in);
+		assertEquals("<rdf:Description><j:_type>A1</j:_type><jp:_type>A1</jp:_type><jp:list><rdf:Seq><rdf:li rdf:parseType='Resource'><jp:name>name0</jp:name><jp:value>value0</jp:value></rdf:li><rdf:li rdf:parseType='Resource'><jp:name>name1</jp:name><jp:value>value1</jp:value></rdf:li></rdf:Seq></jp:list></rdf:Description>", in);
 		in = wrap(in);
 		t1 = p.parse(in, A1.class);
 		assertEquals("value1", t1.list.get(1).value);

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/097b8103/juneau-core-test/src/test/java/org/apache/juneau/jena/CommonTest.java
----------------------------------------------------------------------
diff --git a/juneau-core-test/src/test/java/org/apache/juneau/jena/CommonTest.java b/juneau-core-test/src/test/java/org/apache/juneau/jena/CommonTest.java
index 1c603ae..63db46c 100755
--- a/juneau-core-test/src/test/java/org/apache/juneau/jena/CommonTest.java
+++ b/juneau-core-test/src/test/java/org/apache/juneau/jena/CommonTest.java
@@ -34,7 +34,7 @@ public class CommonTest {
 	private RdfSerializer getBasicSerializer() {
 		return new RdfSerializer()
 			.setQuoteChar('\'')
-			.setUseIndentation(false)
+			.setUseWhitespace(false)
 			.setProperty(RDF_rdfxml_allowBadUris, true)
 			.setProperty(RDF_rdfxml_showDoctypeDeclaration, false)
 			.setProperty(RDF_rdfxml_showXmlDeclaration, false);

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/097b8103/juneau-core-test/src/test/java/org/apache/juneau/jena/CommonXmlTest.java
----------------------------------------------------------------------
diff --git a/juneau-core-test/src/test/java/org/apache/juneau/jena/CommonXmlTest.java b/juneau-core-test/src/test/java/org/apache/juneau/jena/CommonXmlTest.java
index 81e43cb..bb5c8f0 100755
--- a/juneau-core-test/src/test/java/org/apache/juneau/jena/CommonXmlTest.java
+++ b/juneau-core-test/src/test/java/org/apache/juneau/jena/CommonXmlTest.java
@@ -28,7 +28,7 @@ public class CommonXmlTest {
 	private RdfSerializer getBasicSerializer() {
 		return new RdfSerializer()
 			.setQuoteChar('\'')
-			.setUseIndentation(false)
+			.setUseWhitespace(false)
 			.setProperty(RDF_rdfxml_allowBadUris, true)
 			.setProperty(RDF_rdfxml_showDoctypeDeclaration, false)
 			.setProperty(RDF_rdfxml_showXmlDeclaration, false);

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/097b8103/juneau-core-test/src/test/java/org/apache/juneau/json/JsonParserEdgeCasesTest.java
----------------------------------------------------------------------
diff --git a/juneau-core-test/src/test/java/org/apache/juneau/json/JsonParserEdgeCasesTest.java b/juneau-core-test/src/test/java/org/apache/juneau/json/JsonParserEdgeCasesTest.java
index 574b906..9068ed5 100644
--- a/juneau-core-test/src/test/java/org/apache/juneau/json/JsonParserEdgeCasesTest.java
+++ b/juneau-core-test/src/test/java/org/apache/juneau/json/JsonParserEdgeCasesTest.java
@@ -465,7 +465,7 @@ public class JsonParserEdgeCasesTest {
 				sb.append(java.text.MessageFormat.format(pattern, i++, fc.getName().replace(".json", ""), contents, errorText));
 			}
 		}
-		System.err.println(sb);
+		System.err.println(sb); // NOT DEBUG
 	}
 
 	public static final Map<String,String> specials = new HashMap<String,String>();

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/097b8103/juneau-core-test/src/test/java/org/apache/juneau/transforms/CalendarSwapTest.java
----------------------------------------------------------------------
diff --git a/juneau-core-test/src/test/java/org/apache/juneau/transforms/CalendarSwapTest.java b/juneau-core-test/src/test/java/org/apache/juneau/transforms/CalendarSwapTest.java
index fa1bdfb..4fe0dfa 100755
--- a/juneau-core-test/src/test/java/org/apache/juneau/transforms/CalendarSwapTest.java
+++ b/juneau-core-test/src/test/java/org/apache/juneau/transforms/CalendarSwapTest.java
@@ -54,7 +54,7 @@ public class CalendarSwapTest {
 	private RdfSerializer getRdfSerializer() {
 		return new RdfSerializer()
 			.setQuoteChar('\'')
-			.setUseIndentation(false)
+			.setUseWhitespace(false)
 			.setProperty(RdfCommonContext.RDF_rdfxml_allowBadUris, true)
 			.setProperty(RdfCommonContext.RDF_rdfxml_showDoctypeDeclaration, false)
 			.setProperty(RdfCommonContext.RDF_rdfxml_showXmlDeclaration, false);
@@ -186,7 +186,7 @@ public class CalendarSwapTest {
 		Class<?> f = CalendarSwap.ToString.class;
 		WriterSerializer s = new UonSerializer.Encoding().addPojoSwaps(f);
 		ReaderParser p = UonParser.DEFAULT_DECODING.clone().addPojoSwaps(f);
-		doTest(s, p, true, "Sun+Mar+03+10:11:12+PST+1901");
+		doTest(s, p, true, "'Sun+Mar+03+10:11:12+PST+1901'");
 	}
 
 	//====================================================================================================
@@ -197,7 +197,7 @@ public class CalendarSwapTest {
 		Class<?> f = CalendarSwap.ToString.class;
 		WriterSerializer s = new UrlEncodingSerializer().addPojoSwaps(f);
 		ReaderParser p = UrlEncodingParser.DEFAULT.clone().addPojoSwaps(f);
-		doTest(s, p, true, "_value=Sun+Mar+03+10:11:12+PST+1901");
+		doTest(s, p, true, "_value='Sun+Mar+03+10:11:12+PST+1901'");
 	}
 
 	//====================================================================================================
@@ -319,7 +319,7 @@ public class CalendarSwapTest {
 		Class<?> f = CalendarSwap.RFC2822DTZ.class;
 		WriterSerializer s = new UonSerializer.Encoding().addPojoSwaps(f);
 		ReaderParser p = UonParser.DEFAULT_DECODING.clone().addPojoSwaps(f);
-		doTest(s, p, true, "Sun,+03+Mar+1901+18:11:12+GMT");
+		doTest(s, p, true, "'Sun,+03+Mar+1901+18:11:12+GMT'");
 	}
 
 	//====================================================================================================
@@ -330,7 +330,7 @@ public class CalendarSwapTest {
 		Class<?> f = CalendarSwap.RFC2822DTZ.class;
 		WriterSerializer s = new UrlEncodingSerializer().addPojoSwaps(f);
 		ReaderParser p = UrlEncodingParser.DEFAULT.clone().addPojoSwaps(f);
-		doTest(s, p, true, "_value=Sun,+03+Mar+1901+18:11:12+GMT");
+		doTest(s, p, true, "_value='Sun,+03+Mar+1901+18:11:12+GMT'");
 	}
 
 	//====================================================================================================
@@ -383,7 +383,7 @@ public class CalendarSwapTest {
 	@Test
 	public void testDefaultLongUon() throws Exception {
 		Class<?> f = CalendarLongSwap.class;
-		WriterSerializer s = UonSerializer.DEFAULT_SIMPLE.clone().addPojoSwaps(f);
+		WriterSerializer s = UonSerializer.DEFAULT.clone().addPojoSwaps(f);
 		ReaderParser p = new UonParser().addPojoSwaps(f);
 		doTest(s, p, true, "-2172116928000");
 	}
@@ -394,7 +394,7 @@ public class CalendarSwapTest {
 	@Test
 	public void testDefaultLongUrlEncoding() throws Exception {
 		Class<?> f = CalendarLongSwap.class;
-		WriterSerializer s = UrlEncodingSerializer.DEFAULT_SIMPLE.clone().addPojoSwaps(f);
+		WriterSerializer s = UrlEncodingSerializer.DEFAULT.clone().addPojoSwaps(f);
 		ReaderParser p = new UrlEncodingParser().addPojoSwaps(f);
 		doTest(s, p, true, "_value=-2172116928000");
 	}
@@ -449,7 +449,7 @@ public class CalendarSwapTest {
 	@Test
 	public void testDefaultMapUon() throws Exception {
 		Class<?> f = CalendarMapSwap.class;
-		WriterSerializer s = UonSerializer.DEFAULT_SIMPLE.clone().addPojoSwaps(f);
+		WriterSerializer s = UonSerializer.DEFAULT.clone().addPojoSwaps(f);
 		ReaderParser p = new UonParser().addPojoSwaps(f);
 		doTest(s, p, true, "(time=-2172116928000,timeZone=PST)");
 	}
@@ -460,7 +460,7 @@ public class CalendarSwapTest {
 	@Test
 	public void testDefaultMapUrlEncoding() throws Exception {
 		Class<?> f = CalendarMapSwap.class;
-		WriterSerializer s = UrlEncodingSerializer.DEFAULT_SIMPLE.clone().addPojoSwaps(f);
+		WriterSerializer s = UrlEncodingSerializer.DEFAULT.clone().addPojoSwaps(f);
 		ReaderParser p = new UrlEncodingParser().addPojoSwaps(f);
 		doTest(s, p, true, "time=-2172116928000&timeZone=PST");
 	}
@@ -517,7 +517,7 @@ public class CalendarSwapTest {
 		Class<?> f = CalendarSwap.DateMedium.class;
 		WriterSerializer s = new UonSerializer.Encoding().addPojoSwaps(f);
 		ReaderParser p = UonParser.DEFAULT_DECODING.clone().addPojoSwaps(f);
-		doTest(s, p, false, "Mar+3,+1901");
+		doTest(s, p, false, "'Mar+3,+1901'");
 	}
 
 	//====================================================================================================
@@ -528,7 +528,7 @@ public class CalendarSwapTest {
 		Class<?> f = CalendarSwap.DateMedium.class;
 		WriterSerializer s = new UrlEncodingSerializer().addPojoSwaps(f);
 		ReaderParser p = UrlEncodingParser.DEFAULT.clone().addPojoSwaps(f);
-		doTest(s, p, false, "_value=Mar+3,+1901");
+		doTest(s, p, false, "_value='Mar+3,+1901'");
 	}
 
 	//====================================================================================================
@@ -601,14 +601,14 @@ public class CalendarSwapTest {
 	//====================================================================================================
 	@Test
 	public void testBeanProperyFilterUon() throws Exception {
-		WriterSerializer s = UonSerializer.DEFAULT_SIMPLE_ENCODING;
+		WriterSerializer s = UonSerializer.DEFAULT_ENCODING;
 		ReaderParser p = UonParser.DEFAULT;
 		ReaderParser pe = UonParser.DEFAULT_DECODING;
 
 		Calendar c = testDate;
 		A t = new A(c);
 		String url = s.serialize(t);
-		assertEquals("(d1=1901-03-03T18:11:12Z,d2=Sun~,+03+Mar+1901+18:11:12+GMT,d3=-2172116928000)", url);
+		assertEquals("(d1=1901-03-03T18:11:12Z,d2='Sun,+03+Mar+1901+18:11:12+GMT',d3=-2172116928000)", url);
 		t = pe.parse(url, A.class);
 		assertEquals(t.d1.getTime().getTime(), c.getTime().getTime());
 		assertEquals(t.getD2().getTime().getTime(), c.getTime().getTime());
@@ -625,13 +625,13 @@ public class CalendarSwapTest {
 	//====================================================================================================
 	@Test
 	public void testBeanProperyFilterUrlEncoding() throws Exception {
-		WriterSerializer s = UrlEncodingSerializer.DEFAULT_SIMPLE;
+		WriterSerializer s = UrlEncodingSerializer.DEFAULT;
 		ReaderParser p = UrlEncodingParser.DEFAULT;
 
 		Calendar c = testDate;
 		A t = new A(c);
 		String url = s.serialize(t);
-		assertEquals("d1=1901-03-03T18:11:12Z&d2=Sun,+03+Mar+1901+18:11:12+GMT&d3=-2172116928000", url);
+		assertEquals("d1=1901-03-03T18:11:12Z&d2='Sun,+03+Mar+1901+18:11:12+GMT'&d3=-2172116928000", url);
 		t = p.parse(url, A.class);
 		assertEquals(t.d1.getTime().getTime(), c.getTime().getTime());
 		assertEquals(t.getD2().getTime().getTime(), c.getTime().getTime());