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/01/21 22:25:03 UTC

[04/21] incubator-juneau git commit: HTML and XML serialization support improvements.

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/4fb01038/juneau-core/src/test/java/org/apache/juneau/html/CommonTest.java
----------------------------------------------------------------------
diff --git a/juneau-core/src/test/java/org/apache/juneau/html/CommonTest.java b/juneau-core/src/test/java/org/apache/juneau/html/CommonTest.java
index 1549dce..e5f316d 100755
--- a/juneau-core/src/test/java/org/apache/juneau/html/CommonTest.java
+++ b/juneau-core/src/test/java/org/apache/juneau/html/CommonTest.java
@@ -42,13 +42,13 @@ public class CommonTest {
 
 		s.setProperty(SERIALIZER_trimNullProperties, false);
 		String r = s.serialize(t1);
-		assertEquals("<table _type='object'><tr><th><string>key</string></th><th><string>value</string></th></tr><tr><td><string>s1</string></td><td><null/></td></tr><tr><td><string>s2</string></td><td><string>s2</string></td></tr></table>", r);
+		assertEquals("<table><tr><th>key</th><th>value</th></tr><tr><td>s1</td><td><null/></td></tr><tr><td>s2</td><td>s2</td></tr></table>", r);
 		t2 = p.parse(r, A.class);
 		assertEqualObjects(t1, t2);
 
 		s.setProperty(SERIALIZER_trimNullProperties, true);
 		r = s.serialize(t1);
-		assertEquals("<table _type='object'><tr><th><string>key</string></th><th><string>value</string></th></tr><tr><td><string>s2</string></td><td><string>s2</string></td></tr></table>", r);
+		assertEquals("<table><tr><th>key</th><th>value</th></tr><tr><td>s2</td><td>s2</td></tr></table>", r);
 		t2 = p.parse(r, A.class);
 		assertEqualObjects(t1, t2);
 	}
@@ -75,13 +75,13 @@ public class CommonTest {
 
 		s.setProperty(SERIALIZER_trimEmptyMaps, false);
 		r = s.serialize(t1);
-		assertEquals("<table _type='object'><tr><th><string>key</string></th><th><string>value</string></th></tr><tr><td><string>f1</string></td><td><table _type='object'><tr><th><string>key</string></th><th><string>value</string></th></tr></table></td></tr><tr><td><string>f2</string></td><td><table _type='object'><tr><th><string>key</string></th><th><string>value</string></th></tr><tr><td><string>f2a</string></td><td><null/></td></tr><tr><td><string>f2b</string></td><td><table _type='object'><tr><th><string>key</string></th><th><string>value</string></th></tr><tr><td><string>s2</string></td><td><string>s2</string></td></tr></table></td></tr></table></td></tr></table>", r);
+		assertEquals("<table><tr><th>key</th><th>value</th></tr><tr><td>f1</td><td><table><tr><th>key</th><th>value</th></tr></table></td></tr><tr><td>f2</td><td><table><tr><th>key</th><th>value</th></tr><tr><td>f2a</td><td><null/></td></tr><tr><td>f2b</td><td><table><tr><th>key</th><th>value</th></tr><tr><td>s2</td><td>s2</td></tr></table></td></tr></table></td></tr></table>", r);
 		t2 = p.parse(r, B.class);
 		assertEqualObjects(t1, t2);
 
 		s.setProperty(SERIALIZER_trimEmptyMaps, true);
 		r = s.serialize(t1);
-		assertEquals("<table _type='object'><tr><th><string>key</string></th><th><string>value</string></th></tr><tr><td><string>f2</string></td><td><table _type='object'><tr><th><string>key</string></th><th><string>value</string></th></tr><tr><td><string>f2a</string></td><td><null/></td></tr><tr><td><string>f2b</string></td><td><table _type='object'><tr><th><string>key</string></th><th><string>value</string></th></tr><tr><td><string>s2</string></td><td><string>s2</string></td></tr></table></td></tr></table></td></tr></table>", r);
+		assertEquals("<table><tr><th>key</th><th>value</th></tr><tr><td>f2</td><td><table><tr><th>key</th><th>value</th></tr><tr><td>f2a</td><td><null/></td></tr><tr><td>f2b</td><td><table><tr><th>key</th><th>value</th></tr><tr><td>s2</td><td>s2</td></tr></table></td></tr></table></td></tr></table>", r);
 		t2 = p.parse(r, B.class);
 		assertNull(t2.f1);
 	}
@@ -109,13 +109,13 @@ public class CommonTest {
 
 		s.setProperty(SERIALIZER_trimEmptyCollections, false);
 		r = s.serialize(t1);
-		assertEquals("<table _type='object'><tr><th><string>key</string></th><th><string>value</string></th></tr><tr><td><string>f1</string></td><td><ul></ul></td></tr><tr><td><string>f2</string></td><td><table _type='array'><tr><th>s2</th></tr><tr><null/></tr><tr><td><string>s2</string></td></tr></table></td></tr></table>", r);
+		assertEquals("<table><tr><th>key</th><th>value</th></tr><tr><td>f1</td><td><ul></ul></td></tr><tr><td>f2</td><td><table _type='array'><tr><th>s2</th></tr><tr><null/></tr><tr><td>s2</td></tr></table></td></tr></table>", r);
 		t2 = p.parse(r, C.class);
 		assertEqualObjects(t1, t2);
 
 		s.setProperty(SERIALIZER_trimEmptyCollections, true);
 		r = s.serialize(t1);
-		assertEquals("<table _type='object'><tr><th><string>key</string></th><th><string>value</string></th></tr><tr><td><string>f2</string></td><td><table _type='array'><tr><th>s2</th></tr><tr><null/></tr><tr><td><string>s2</string></td></tr></table></td></tr></table>", r);
+		assertEquals("<table><tr><th>key</th><th>value</th></tr><tr><td>f2</td><td><table _type='array'><tr><th>s2</th></tr><tr><null/></tr><tr><td>s2</td></tr></table></td></tr></table>", r);
 		t2 = p.parse(r, C.class);
 		assertNull(t2.f1);
 	}
@@ -143,13 +143,45 @@ public class CommonTest {
 
 		s.setProperty(SERIALIZER_trimEmptyCollections, false);
 		r = s.serialize(t1);
-		assertEquals("<table _type='object'><tr><th><string>key</string></th><th><string>value</string></th></tr><tr><td><string>f1</string></td><td><ul></ul></td></tr><tr><td><string>f2</string></td><td><table _type='array'><tr><th>s2</th></tr><tr><null/></tr><tr><td><string>s2</string></td></tr></table></td></tr></table>", r);
+		assertEquals(
+			"<table>"
+				+"<tr><th>key</th><th>value</th></tr>"
+				+"<tr>"
+					+"<td>f1</td>"
+					+"<td><ul></ul></td>"
+				+"</tr>"
+				+"<tr>"
+					+"<td>f2</td>"
+					+"<td>"
+						+"<table _type='array'>"
+							+"<tr><th>s2</th></tr>"
+							+"<tr><null/></tr>"
+							+"<tr><td>s2</td></tr>"
+						+"</table>"
+					+"</td>"
+				+"</tr>"
+			+"</table>",
+			r);
 		t2 = p.parse(r, D.class);
 		assertEqualObjects(t1, t2);
 
 		s.setProperty(SERIALIZER_trimEmptyCollections, true);
 		r = s.serialize(t1);
-		assertEquals("<table _type='object'><tr><th><string>key</string></th><th><string>value</string></th></tr><tr><td><string>f2</string></td><td><table _type='array'><tr><th>s2</th></tr><tr><null/></tr><tr><td><string>s2</string></td></tr></table></td></tr></table>", r);
+		assertEquals(
+			"<table>"
+				+"<tr><th>key</th><th>value</th></tr>"
+				+"<tr>"
+					+"<td>f2</td>"
+					+"<td>"
+						+"<table _type='array'>"
+							+"<tr><th>s2</th></tr>"
+							+"<tr><null/></tr>"
+							+"<tr><td>s2</td></tr>"
+						+"</table>"
+					+"</td>"
+				+"</tr>"
+			+"</table>",
+			r);
 		t2 = p.parse(r, D.class);
 		assertNull(t2.f1);
 	}
@@ -175,7 +207,68 @@ public class CommonTest {
 		String r;
 
 		r = s.serialize(t);
-		assertEquals("<table _type='object'><tr><th><string>key</string></th><th><string>value</string></th></tr><tr><td><string>x1</string></td><td><table _type='object'><tr><th><string>key</string></th><th><string>value</string></th></tr><tr><td><string>f1</string></td><td><number>1</number></td></tr></table></td></tr><tr><td><string>x2</string></td><td><table _type='object'><tr><th><string>key</string></th><th><string>value</string></th></tr><tr><td><string>f1</string></td><td><number>1</number></td></tr></table></td></tr><tr><td><string>x3</string></td><td><table _type='array'><tr><th>f1</th></tr><tr><td><number>1</number></td></tr></table></td></tr><tr><td><string>x4</string></td><td><table _type='array'><tr><th>f1</th></tr><tr><td><number>1</number></td></tr></table></td></tr><tr><td><string>x5</string></td><td><table _type='array'><tr><th>f1</th></tr><tr><td><number>1</number></td></tr></table></td></tr><tr><td><string>x6</string></td><td><table _type='array'><tr><th>f1</th></tr><t
 r><td><number>1</number></td></tr></table></td></tr></table>", r);
+		assertEquals(
+			"<table>"
+				+"<tr>"
+					+"<th>key</th>"
+					+"<th>value</th>"
+				+"</tr>"
+				+"<tr>"
+					+"<td>x1</td>"
+					+"<td>"
+						+"<table>"
+							+"<tr><th>key</th><th>value</th></tr>"
+							+"<tr><td>f1</td><td>1</td></tr>"
+						+"</table>"
+					+"</td>"
+				+"</tr>"
+				+"<tr>"
+					+"<td>x2</td>"
+					+"<td>"
+						+"<table>"
+							+"<tr><th>key</th><th>value</th></tr>"
+							+"<tr><td>f1</td><td>3</td></tr>"
+						+"</table>"
+					+"</td>"
+				+"</tr>"
+				+"<tr>"
+					+"<td>x3</td>"
+					+"<td>"
+						+"<table _type='array'>"
+							+"<tr><th>f1</th></tr>"
+							+"<tr><td>1</td></tr>"
+						+"</table>"
+					+"</td>"
+				+"</tr>"
+				+"<tr>"
+					+"<td>x4</td>"
+					+"<td>"
+						+"<table _type='array'>"
+							+"<tr><th>f1</th></tr>"
+							+"<tr><td>1</td></tr>"
+						+"</table>"
+					+"</td>"
+				+"</tr>"
+				+"<tr>"
+					+"<td>x5</td>"
+					+"<td>"
+						+"<table _type='array'>"
+							+"<tr><th>f1</th></tr>"
+							+"<tr><td><number>5</number></td></tr>"
+						+"</table>"
+					+"</td>"
+				+"</tr>"
+				+"<tr>"
+					+"<td>x6</td>"
+					+"<td>"
+						+"<table _type='array'>"
+							+"<tr><th>f1</th></tr>"
+							+"<tr><td><number>7</number></td></tr>"
+						+"</table>"
+					+"</td>"
+				+"</tr>"
+			+"</table>",
+		r);
 		r = s.getSchemaSerializer().serialize(new E1());
 		assertTrue(r.indexOf("f2") == -1);
 	}
@@ -183,15 +276,15 @@ public class CommonTest {
 	public static class E1 {
 		@BeanProperty(properties="f1") public E2 x1 = new E2();
 		@BeanProperty(properties="f1") public Map<String,Integer> x2 = new LinkedHashMap<String,Integer>() {{
-			put("f1",1); put("f2",2);
+			put("f1",3); put("f2",4);
 		}};
 		@BeanProperty(properties="f1") public E2[] x3 = {new E2()};
 		@BeanProperty(properties="f1") public List<E2> x4 = new LinkedList<E2>() {{
 			add(new E2());
 		}};
-		@BeanProperty(properties="f1") public ObjectMap[] x5 = {new ObjectMap().append("f1",1).append("f2",2)};
+		@BeanProperty(properties="f1") public ObjectMap[] x5 = {new ObjectMap().append("f1",5).append("f2",6)};
 		@BeanProperty(properties="f1") public List<ObjectMap> x6 = new LinkedList<ObjectMap>() {{
-			add(new ObjectMap().append("f1",1).append("f2",2));
+			add(new ObjectMap().append("f1",7).append("f2",8));
 		}};
 	}
 
@@ -211,7 +304,19 @@ public class CommonTest {
 		t.x1.add(new F());
 		l.add(t);
 		String html = s.serialize(l);
-		assertEquals("<table _type='array'><tr><th>x1</th><th>x2</th></tr><tr><td><table _type='array'><tr><th>x2</th></tr><tr><td><number>2</number></td></tr></table></td><td><number>2</number></td></tr></table>", html);
+		assertEquals(
+			"<table _type='array'>"
+				+"<tr><th>x1</th><th>x2</th></tr>"
+				+"<tr>"
+					+"<td>"
+						+"<table _type='array'>"
+							+"<tr><th>x2</th></tr>"
+							+"<tr><td>2</td></tr>"
+						+"</table>"
+					+"</td>"
+					+"<td>2</td>"
+				+"</tr>"
+			+"</table>", html);
 	}
 
 	public static class F {
@@ -428,10 +533,10 @@ public class CommonTest {
 
 	private String strip(String html) {
 		return html
-			.replace("<table _type='object'><tr><th><string>key</string></th><th><string>value</string></th></tr>", "")
+			.replace("<table><tr><th>key</th><th>value</th></tr>", "")
 			.replace("</table>", "")
-			.replace("<tr><td><string>", "\n[")
-			.replace("</string></td><td>", "]=")
+			.replace("<tr><td>", "\n[")
+			.replace("</td><td>", "]=")
 			.replace("</td></tr>", "");
 	}
 
@@ -492,7 +597,7 @@ public class CommonTest {
 		}
 
 		s.setProperty(SERIALIZER_ignoreRecursions, true);
-		assertEquals("<table _type='object'><tr><th><string>key</string></th><th><string>value</string></th></tr><tr><td><string>name</string></td><td><string>foo</string></td></tr><tr><td><string>r2</string></td><td><table _type='object'><tr><th><string>key</string></th><th><string>value</string></th></tr><tr><td><string>name</string></td><td><string>bar</string></td></tr><tr><td><string>r3</string></td><td><table _type='object'><tr><th><string>key</string></th><th><string>value</string></th></tr><tr><td><string>name</string></td><td><string>baz</string></td></tr></table></td></tr></table></td></tr></table>",
+		assertEquals("<table><tr><th>key</th><th>value</th></tr><tr><td>name</td><td>foo</td></tr><tr><td>r2</td><td><table><tr><th>key</th><th>value</th></tr><tr><td>name</td><td>bar</td></tr><tr><td>r3</td><td><table><tr><th>key</th><th>value</th></tr><tr><td>name</td><td>baz</td></tr></table></td></tr></table></td></tr></table>",
 			s.serialize(r1));
 
 		// Make sure this doesn't blow up.
@@ -523,7 +628,14 @@ public class CommonTest {
 		a.setF1("J");
 		a.setF2(100);
 		a.setF3(true);
-		assertEquals("<table _type='object'><tr><th><string>key</string></th><th><string>value</string></th></tr><tr><td><string>f1</string></td><td><string>J</string></td></tr><tr><td><string>f2</string></td><td><number>100</number></td></tr><tr><td><string>f3</string></td><td><boolean>true</boolean></td></tr></table>", s.serialize(a));
+		assertEquals(
+			"<table>"
+				+"<tr><th>key</th><th>value</th></tr>"
+				+"<tr><td>f1</td><td>J</td></tr>"
+				+"<tr><td>f2</td><td>100</td></tr>"
+				+"<tr><td>f3</td><td>true</td></tr>"
+			+"</table>",
+			s.serialize(a));
 	}
 
 	public static class J {

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/4fb01038/juneau-core/src/test/java/org/apache/juneau/html/HtmlTest.java
----------------------------------------------------------------------
diff --git a/juneau-core/src/test/java/org/apache/juneau/html/HtmlTest.java b/juneau-core/src/test/java/org/apache/juneau/html/HtmlTest.java
index d9ee860..435f85f 100755
--- a/juneau-core/src/test/java/org/apache/juneau/html/HtmlTest.java
+++ b/juneau-core/src/test/java/org/apache/juneau/html/HtmlTest.java
@@ -36,7 +36,7 @@ public class HtmlTest {
 
 		t = new Object[] {new A1(), new A1()};
 		html = s.serialize(t);
-		assertEquals("<table _type='array'><tr><th>f1</th></tr><tr><td><string>f1</string></td></tr><tr><td><string>f1</string></td></tr></table>", html);
+		assertEquals("<table _type='array'><tr><th>f1</th></tr><tr><td>f1</td></tr><tr><td>f1</td></tr></table>", html);
 
 	}
 
@@ -189,11 +189,11 @@ public class HtmlTest {
 			+"\n[f7]=<a href='http://www.apache.org/f7/x7'>http://www.apache.org/f7/x7</a>"
 			+"\n[f8]=<a href='/cr/f8/x8'>f8/x8</a>"
 			+"\n[f9]=<a href='/cr/f9/x9'>f9/x9</a>"
-			+"\n[fa]=<string>http://www.apache.org/fa/xa#MY_LABEL</string>"
-			+"\n[fb]=<string>http://www.apache.org/fb/xb?label=MY_LABEL&amp;foo=bar</string>"
-			+"\n[fc]=<string>http://www.apache.org/fc/xc?foo=bar&amp;label=MY_LABEL</string>"
-			+"\n[fd]=<string>http://www.apache.org/fd/xd?label2=MY_LABEL&amp;foo=bar</string>"
-			+"\n[fe]=<string>http://www.apache.org/fe/xe?foo=bar&amp;label2=MY_LABEL</string>";
+			+"\n[fa]=http://www.apache.org/fa/xa#MY_LABEL"
+			+"\n[fb]=http://www.apache.org/fb/xb?label=MY_LABEL&amp;foo=bar"
+			+"\n[fc]=http://www.apache.org/fc/xc?foo=bar&amp;label=MY_LABEL"
+			+"\n[fd]=http://www.apache.org/fd/xd?label2=MY_LABEL&amp;foo=bar"
+			+"\n[fe]=http://www.apache.org/fe/xe?foo=bar&amp;label2=MY_LABEL";
 			assertEquals(expected, r);
 
 			s.setProperty(HTML_detectLinksInStrings, true);
@@ -220,10 +220,10 @@ public class HtmlTest {
 
 	private String strip(String html) {
 		return html
-			.replace("<table _type='object'><tr><th><string>key</string></th><th><string>value</string></th></tr>", "")
+			.replace("<table><tr><th>key</th><th>value</th></tr>", "")
 			.replace("</table>", "")
-			.replace("<tr><td><string>", "\n[")
-			.replace("</string></td><td>", "]=")
+			.replace("<tr><td>", "\n[")
+			.replace("</td><td>", "]=")
 			.replace("</td></tr>", "");
 	}
 
@@ -242,7 +242,7 @@ public class HtmlTest {
 
 		o = new B2();
 		r = s.serialize(o);
-		assertEquals("<table _type='object'><tr><th><string>key</string></th><th><string>value</string></th></tr><tr><td><string>f1</string></td><td><f1></td></tr></table>", r);
+		assertEquals("<table><tr><th>key</th><th>value</th></tr><tr><td>f1</td><td><f1></td></tr></table>", r);
 	}
 
 	@Html(asPlainText=true)
@@ -274,7 +274,7 @@ public class HtmlTest {
 
 		o = new C2();
 		r = s.serialize(o);
-		assertEquals("<table _type='object'><tr><th><string>key</string></th><th><string>value</string></th></tr><tr><td><string>f1</string></td><td><string>&lt;f1&gt;</string></td></tr></table>", r);
+		assertEquals("<table><tr><th>key</th><th>value</th></tr><tr><td>f1</td><td>&lt;f1&gt;</td></tr></table>", r);
 	}
 
 	@Html(asXml=true)
@@ -300,7 +300,7 @@ public class HtmlTest {
 		m.put("foo", "bar");
 		o = new ObjectList().append(m);
 		r = s.serialize(o);
-		assertEquals("<ul><li><table _type='object'><tr><td><string>foo</string></td><td><string>bar</string></td></tr></table></li></ul>", r);
+		assertEquals("<ul><li><table><tr><td>foo</td><td>bar</td></tr></table></li></ul>", r);
 	}
 
 	@Html(noTables=true, noTableHeaders=true)

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/4fb01038/juneau-core/src/test/java/org/apache/juneau/json/JsonParserTest.java
----------------------------------------------------------------------
diff --git a/juneau-core/src/test/java/org/apache/juneau/json/JsonParserTest.java b/juneau-core/src/test/java/org/apache/juneau/json/JsonParserTest.java
index 19eee59..49b359c 100755
--- a/juneau-core/src/test/java/org/apache/juneau/json/JsonParserTest.java
+++ b/juneau-core/src/test/java/org/apache/juneau/json/JsonParserTest.java
@@ -108,12 +108,6 @@ public class JsonParserTest {
 	}
 
 	@Test
-	public void testCognosJson() throws Exception {
-		String json = TestUtils.readFile(getClass().getResource("/json/BrokenCognosOutput.json").getPath());
-		p.parse(json, ObjectMap.class);
-	}
-
-	@Test
 	public void testStrictMode() throws Exception {
 		JsonParser p = sp;
 

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/4fb01038/juneau-core/src/test/java/org/apache/juneau/transforms/BeanMapTest.java
----------------------------------------------------------------------
diff --git a/juneau-core/src/test/java/org/apache/juneau/transforms/BeanMapTest.java b/juneau-core/src/test/java/org/apache/juneau/transforms/BeanMapTest.java
index 893bf3f..0f44984 100755
--- a/juneau-core/src/test/java/org/apache/juneau/transforms/BeanMapTest.java
+++ b/juneau-core/src/test/java/org/apache/juneau/transforms/BeanMapTest.java
@@ -81,14 +81,14 @@ public class BeanMapTest {
 		public String f2;
 	}
 
-	public static class B1Swap extends PojoSwap<B1,ObjectMap> {
+	public static class B1Swap extends MapSwap<B1> {
 		@Override /* PojoSwap */
 		public ObjectMap swap(BeanSession session, B1 b1) {
 			return new ObjectMap().append("type", "b1").append("f1", b1.f1);
 		}
 	}
 
-	public static class B2Swap extends PojoSwap<B2,ObjectMap> {
+	public static class B2Swap extends MapSwap<B2> {
 		@Override /* PojoSwap */
 		public ObjectMap swap(BeanSession session, B2 b2) {
 			return new ObjectMap().append("type", "b2").append("f1", b2.f1);

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/4fb01038/juneau-core/src/test/java/org/apache/juneau/transforms/CalendarSwapTest.java
----------------------------------------------------------------------
diff --git a/juneau-core/src/test/java/org/apache/juneau/transforms/CalendarSwapTest.java b/juneau-core/src/test/java/org/apache/juneau/transforms/CalendarSwapTest.java
index 72889ef..16a79c8 100755
--- a/juneau-core/src/test/java/org/apache/juneau/transforms/CalendarSwapTest.java
+++ b/juneau-core/src/test/java/org/apache/juneau/transforms/CalendarSwapTest.java
@@ -164,7 +164,7 @@ public class CalendarSwapTest {
 	@Test
 	public void testDefaultStringXml() throws Exception {
 		Class<?> f = CalendarSwap.ToString.class;
-		WriterSerializer s = new XmlSerializer.SimpleSq().addPojoSwaps(f);
+		WriterSerializer s = new XmlSerializer.Sq().addPojoSwaps(f);
 		ReaderParser p = new XmlParser().addPojoSwaps(f);
 		doTest(s, p, true, "<string>Sun Mar 03 10:11:12 PST 1901</string>");
 	}
@@ -231,7 +231,7 @@ public class CalendarSwapTest {
 	@Test
 	public void testISO8601DTXml() throws Exception {
 		Class<?> f = CalendarSwap.ISO8601DT.class;
-		WriterSerializer s = new XmlSerializer.SimpleSq().addPojoSwaps(f);
+		WriterSerializer s = new XmlSerializer.Sq().addPojoSwaps(f);
 		ReaderParser p = new XmlParser().addPojoSwaps(f);
 		doTest(s, p, true, "<string>1901-03-03T10:11:12-08:00</string>");
 	}
@@ -297,7 +297,7 @@ public class CalendarSwapTest {
 	@Test
 	public void testRFC2822DTXml() throws Exception {
 		Class<?> f = CalendarSwap.RFC2822DTZ.class;
-		WriterSerializer s = new XmlSerializer.SimpleSq().addPojoSwaps(f);
+		WriterSerializer s = new XmlSerializer.Sq().addPojoSwaps(f);
 		ReaderParser p = new XmlParser().addPojoSwaps(f);
 		doTest(s, p, true, "<string>Sun, 03 Mar 1901 18:11:12 GMT</string>");
 	}
@@ -363,7 +363,7 @@ public class CalendarSwapTest {
 	@Test
 	public void testDefaultLongXml() throws Exception {
 		Class<?> f = CalendarLongSwap.class;
-		WriterSerializer s = new XmlSerializer.SimpleSq().addPojoSwaps(f);
+		WriterSerializer s = new XmlSerializer.Sq().addPojoSwaps(f);
 		ReaderParser p = new XmlParser().addPojoSwaps(f);
 		doTest(s, p, true, "<number>-2172116928000</number>");
 	}
@@ -429,7 +429,7 @@ public class CalendarSwapTest {
 	@Test
 	public void testDefaultMapXml() throws Exception {
 		Class<?> f = CalendarMapSwap.class;
-		WriterSerializer s = new XmlSerializer.SimpleXmlJsonSq().addPojoSwaps(f);
+		WriterSerializer s = new XmlSerializer.Sq().addPojoSwaps(f);
 		ReaderParser p = new XmlParser().addPojoSwaps(f);
 		doTest(s, p, true, "<object><time _type='number'>-2172116928000</time><timeZone>PST</timeZone></object>");
 	}
@@ -442,7 +442,7 @@ public class CalendarSwapTest {
 		Class<?> f = CalendarMapSwap.class;
 		WriterSerializer s = new HtmlSerializer.Sq().addPojoSwaps(f).setProperty(HTML_addKeyValueTableHeaders, true);
 		ReaderParser p = new HtmlParser().addPojoSwaps(f);
-		doTest(s, p, true, "<table _type='object'><tr><th><string>key</string></th><th><string>value</string></th></tr><tr><td><string>time</string></td><td><number>-2172116928000</number></td></tr><tr><td><string>timeZone</string></td><td><string>PST</string></td></tr></table>");
+		doTest(s, p, true, "<table><tr><th>key</th><th>value</th></tr><tr><td>time</td><td><number>-2172116928000</number></td></tr><tr><td>timeZone</td><td>PST</td></tr></table>");
 	}
 
 	//====================================================================================================
@@ -495,7 +495,7 @@ public class CalendarSwapTest {
 	@Test
 	public void testDefaultMediumXml() throws Exception {
 		Class<?> f = CalendarSwap.DateMedium.class;
-		WriterSerializer s = new XmlSerializer.SimpleSq().addPojoSwaps(f);
+		WriterSerializer s = new XmlSerializer.Sq().addPojoSwaps(f);
 		ReaderParser p = new XmlParser().addPojoSwaps(f);
 		doTest(s, p, false, "<string>Mar 3, 1901</string>");
 	}
@@ -567,7 +567,7 @@ public class CalendarSwapTest {
 	//====================================================================================================
 	@Test
 	public void testBeanProperyFilterXml() throws Exception {
-		WriterSerializer s = XmlSerializer.DEFAULT_SIMPLE_SQ;
+		WriterSerializer s = XmlSerializer.DEFAULT_SQ;
 		ReaderParser p = XmlParser.DEFAULT;
 
 		Calendar c = testDate;
@@ -591,7 +591,7 @@ public class CalendarSwapTest {
 		Calendar c = testDate;
 		A t = new A(c);
 		String html = s.serialize(t);
-		assertEquals("<table _type='object'><tr><th><string>key</string></th><th><string>value</string></th></tr><tr><td><string>d1</string></td><td><string>1901-03-03T18:11:12Z</string></td></tr><tr><td><string>d2</string></td><td><string>Sun, 03 Mar 1901 18:11:12 GMT</string></td></tr><tr><td><string>d3</string></td><td><number>-2172116928000</number></td></tr></table>", html);
+		assertEquals("<table><tr><th>key</th><th>value</th></tr><tr><td>d1</td><td>1901-03-03T18:11:12Z</td></tr><tr><td>d2</td><td>Sun, 03 Mar 1901 18:11:12 GMT</td></tr><tr><td>d3</td><td>-2172116928000</td></tr></table>", html);
 		t = p.parse(html, A.class);
 		assertEquals(t.d1.getTime().getTime(), c.getTime().getTime());
 		assertEquals(t.getD2().getTime().getTime(), c.getTime().getTime());

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/4fb01038/juneau-core/src/test/java/org/apache/juneau/utils/FilteredMapTest.java
----------------------------------------------------------------------
diff --git a/juneau-core/src/test/java/org/apache/juneau/utils/FilteredMapTest.java b/juneau-core/src/test/java/org/apache/juneau/utils/FilteredMapTest.java
index 48949da..ec75da3 100755
--- a/juneau-core/src/test/java/org/apache/juneau/utils/FilteredMapTest.java
+++ b/juneau-core/src/test/java/org/apache/juneau/utils/FilteredMapTest.java
@@ -30,16 +30,21 @@ public class FilteredMapTest {
 	// testBasic
 	//====================================================================================================
 	@Test
+	@SuppressWarnings("unchecked")
 	public void testBasic() throws Exception {
 		ObjectMap m = new ObjectMap("{a:'1',b:'2'}");
-		FilteredMap<String,Object> m2 = new FilteredMap<String,Object>(m, new String[]{"a"});
+
+		ClassMeta<Map<String,Object>> cm = BeanContext.DEFAULT.getMapClassMeta(Map.class, String.class, Object.class);
+		ClassMeta<Map<String,String>> cm2 = BeanContext.DEFAULT.getMapClassMeta(Map.class, String.class, String.class);
+
+		FilteredMap<String,Object> m2 = new FilteredMap<String,Object>(cm, m, new String[]{"a"});
 
 		assertObjectEquals("{a:'1'}", m2);
 
 		m2.entrySet().iterator().next().setValue("3");
 		assertObjectEquals("{a:'3'}", m2);
 
-		try { m3 = new FilteredMap<String,String>(null, new String[0]); fail(); } catch (IllegalArgumentException e) {}
-		try { m3 = new FilteredMap<String,Object>(m, null); fail(); } catch (IllegalArgumentException e) {}
+		try { m3 = new FilteredMap<String,String>(cm2, null, new String[0]); fail(); } catch (IllegalArgumentException e) {}
+		try { m3 = new FilteredMap<String,Object>(cm, m, null); fail(); } catch (IllegalArgumentException e) {}
 	}
 }

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/4fb01038/juneau-core/src/test/java/org/apache/juneau/xml/BasicXmlTest.java
----------------------------------------------------------------------
diff --git a/juneau-core/src/test/java/org/apache/juneau/xml/BasicXmlTest.java b/juneau-core/src/test/java/org/apache/juneau/xml/BasicXmlTest.java
new file mode 100644
index 0000000..182ffdd
--- /dev/null
+++ b/juneau-core/src/test/java/org/apache/juneau/xml/BasicXmlTest.java
@@ -0,0 +1,1505 @@
+// ***************************************************************************************************************************
+// * 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.xml;
+
+import static org.junit.Assert.*;
+
+import java.util.*;
+
+import org.apache.juneau.*;
+import org.apache.juneau.annotation.*;
+import org.apache.juneau.xml.annotation.*;
+import org.junit.*;
+import org.junit.runner.*;
+import org.junit.runners.*;
+
+@RunWith(Parameterized.class)
+@SuppressWarnings({"javadoc","serial"})
+public class BasicXmlTest {
+
+	private static final XmlSerializer
+		s1 = XmlSerializer.DEFAULT_SQ,
+		s2 = XmlSerializer.DEFAULT_SQ_READABLE,
+		s3 = XmlSerializer.DEFAULT_NS_SQ;
+	private static final XmlParser parser = XmlParser.DEFAULT;
+
+	@Parameterized.Parameters
+	public static Collection<Object[]> getParameters() {
+		return Arrays.asList(new Object[][] {
+
+			{
+				"SimpleTypes-1",
+				"foo",
+				"<string>foo</string>",
+				"<string>foo</string>\n",
+				"<string>foo</string>",
+			},
+			{
+				"SimpleTypes-2",
+				true,
+				"<boolean>true</boolean>",
+				"<boolean>true</boolean>\n",
+				"<boolean>true</boolean>",
+			},
+			{
+				"SimpleTypes-3",
+				123,
+				"<number>123</number>",
+				"<number>123</number>\n",
+				"<number>123</number>",
+			},
+			{
+				"SimpleTypes-4",
+				1.23f,
+				"<number>1.23</number>",
+				"<number>1.23</number>\n",
+				"<number>1.23</number>",
+			},
+			{
+				"SimpleTypes-5",
+				null,
+				"<null/>",
+				"<null/>\n",
+				"<null/>",
+			},
+			{
+				"Arrays-1",
+				new String[]{"foo"},
+				"<array><string>foo</string></array>",
+				"<array>\n\t<string>foo</string>\n</array>\n",
+				"<array><string>foo</string></array>",
+			},
+			{
+				"Arrays-2",
+				new String[]{null},
+				"<array><null/></array>",
+				"<array>\n\t<null/>\n</array>\n",
+				"<array><null/></array>",
+			},
+			{
+				"Arrays-3",
+				new Object[]{"foo"},
+				"<array><string>foo</string></array>",
+				"<array>\n\t<string>foo</string>\n</array>\n",
+				"<array><string>foo</string></array>",
+			},
+			{
+				"Arrays-4",
+				new int[]{123},
+				"<array><number>123</number></array>",
+				"<array>\n\t<number>123</number>\n</array>\n",
+				"<array><number>123</number></array>",
+			},
+			{
+				"Arrays-5",
+				new boolean[]{true},
+				"<array><boolean>true</boolean></array>",
+				"<array>\n\t<boolean>true</boolean>\n</array>\n",
+				"<array><boolean>true</boolean></array>",
+			},
+			{
+				"Arrays-6",
+				new String[][]{{"foo"}},
+				"<array><array><string>foo</string></array></array>",
+				"<array>\n\t<array>\n\t\t<string>foo</string>\n\t</array>\n</array>\n",
+				"<array><array><string>foo</string></array></array>",
+			},
+			{
+				"MapWithStrings",
+				new MapWithStrings().append("k1", "v1").append("k2", null),
+				"<object><k1>v1</k1><k2 _type='null'/></object>",
+				"<object>\n\t<k1>v1</k1>\n\t<k2 _type='null'/>\n</object>\n",
+				"<object><k1>v1</k1><k2 _type='null'/></object>",
+			},
+			{
+				"MapsWithNumbers",
+				new MapWithNumbers().append("k1", 123).append("k2", 1.23).append("k3", null),
+				"<object><k1>123</k1><k2>1.23</k2><k3 _type='null'/></object>",
+				"<object>\n\t<k1>123</k1>\n\t<k2>1.23</k2>\n\t<k3 _type='null'/>\n</object>\n",
+				"<object><k1>123</k1><k2>1.23</k2><k3 _type='null'/></object>",
+			},
+			{
+				"MapWithObjects",
+				new MapWithObjects().append("k1", "v1").append("k2", 123).append("k3", 1.23).append("k4", true).append("k5", null),
+				"<object><k1>v1</k1><k2 _type='number'>123</k2><k3 _type='number'>1.23</k3><k4 _type='boolean'>true</k4><k5 _type='null'/></object>",
+				"<object>\n\t<k1>v1</k1>\n\t<k2 _type='number'>123</k2>\n\t<k3 _type='number'>1.23</k3>\n\t<k4 _type='boolean'>true</k4>\n\t<k5 _type='null'/>\n</object>\n",
+				"<object><k1>v1</k1><k2 _type='number'>123</k2><k3 _type='number'>1.23</k3><k4 _type='boolean'>true</k4><k5 _type='null'/></object>",
+			},
+			{
+				"ListWithStrings",
+				new ListWithStrings().append("foo").append(null),
+				"<array><string>foo</string><null/></array>",
+				"<array>\n\t<string>foo</string>\n\t<null/>\n</array>\n",
+				"<array><string>foo</string><null/></array>",
+			},
+			{
+				"ListWithNumbers",
+				new ListWithNumbers().append(123).append(1.23).append(null),
+				"<array><number>123</number><number>1.23</number><null/></array>",
+				"<array>\n\t<number>123</number>\n\t<number>1.23</number>\n\t<null/>\n</array>\n",
+				"<array><number>123</number><number>1.23</number><null/></array>",
+			},
+			{
+				"ListWithObjects",
+				new ListWithObjects().append("foo").append(123).append(1.23).append(true).append(null),
+				"<array><string>foo</string><number>123</number><number>1.23</number><boolean>true</boolean><null/></array>",
+				"<array>\n\t<string>foo</string>\n\t<number>123</number>\n\t<number>1.23</number>\n\t<boolean>true</boolean>\n\t<null/>\n</array>\n",
+				"<array><string>foo</string><number>123</number><number>1.23</number><boolean>true</boolean><null/></array>",
+			},
+			{
+				"BeanWithNormalProperties",
+				new BeanWithNormalProperties().init(),
+				"<object>"
+					+"<a>foo</a>"
+					+"<b>123</b>"
+					+"<c>bar</c>"
+					+"<d _type='number'>456</d>"
+					+"<e>"
+						+"<h>qux</h>"
+					+"</e>"
+					+"<f>"
+						+"<string>baz</string>"
+					+"</f>"
+					+"<g>"
+						+"<number>789</number>"
+					+"</g>"
+				+"</object>",
+				"<object>"
+					+"\n\t<a>foo</a>"
+					+"\n\t<b>123</b>"
+					+"\n\t<c>bar</c>"
+					+"\n\t<d _type='number'>456</d>"
+					+"\n\t<e>"
+						+"\n\t\t<h>qux</h>"
+					+"\n\t</e>"
+					+"\n\t<f>"
+						+"\n\t\t<string>baz</string>"
+					+"\n\t</f>"
+					+"\n\t<g>"
+						+"\n\t\t<number>789</number>"
+					+"\n\t</g>"
+				+"\n</object>\n",
+				"<object>"
+					+"<a>foo</a>"
+					+"<b>123</b>"
+					+"<c>bar</c>"
+					+"<d _type='number'>456</d>"
+					+"<e>"
+						+"<h>qux</h>"
+					+"</e>"
+					+"<f>"
+						+"<string>baz</string>"
+					+"</f>"
+					+"<g>"
+						+"<number>789</number>"
+					+"</g>"
+				+"</object>",
+			},
+			{
+				"BeanWithMapProperties",
+				new BeanWithMapProperties().init(),
+				"<object>"
+					+"<a>"
+						+"<k1>foo</k1>"
+					+"</a>"
+					+"<b>"
+						+"<k2>123</k2>"
+					+"</b>"
+					+"<c>"
+						+"<k3>bar</k3>"
+						+"<k4 _type='number'>456</k4>"
+						+"<k5 _type='boolean'>true</k5>"
+						+"<k6 _type='null'/>"
+					+"</c>"
+				+"</object>",
+				"<object>"
+					+"\n\t<a>"
+						+"\n\t\t<k1>foo</k1>"
+					+"\n\t</a>"
+					+"\n\t<b>"
+						+"\n\t\t<k2>123</k2>"
+					+"\n\t</b>"
+					+"\n\t<c>"
+						+"\n\t\t<k3>bar</k3>"
+						+"\n\t\t<k4 _type='number'>456</k4>"
+						+"\n\t\t<k5 _type='boolean'>true</k5>"
+						+"\n\t\t<k6 _type='null'/>"
+					+"\n\t</c>"
+				+"\n</object>\n",
+				"<object>"
+					+"<a>"
+						+"<k1>foo</k1>"
+					+"</a>"
+					+"<b>"
+						+"<k2>123</k2>"
+					+"</b>"
+					+"<c>"
+						+"<k3>bar</k3>"
+						+"<k4 _type='number'>456</k4>"
+						+"<k5 _type='boolean'>true</k5>"
+						+"<k6 _type='null'/>"
+					+"</c>"
+				+"</object>",
+		   },
+			{
+				"BeanWithTypeName",
+				new BeanWithTypeName().init(),
+				"<X><a>123</a><b>foo</b></X>",
+				"<X>\n\t<a>123</a>\n\t<b>foo</b>\n</X>\n",
+				"<X><a>123</a><b>foo</b></X>",
+			},
+			{
+				"BeanWithPropertiesWithTypeNames",
+				new BeanWithPropertiesWithTypeNames().init(),
+				"<object><b1><b>foo</b></b1><b2 _type='B'><b>foo</b></b2></object>",
+				"<object>\n\t<b1>\n\t\t<b>foo</b>\n\t</b1>\n\t<b2 _type='B'>\n\t\t<b>foo</b>\n\t</b2>\n</object>\n",
+				"<object><b1><b>foo</b></b1><b2 _type='B'><b>foo</b></b2></object>"
+			},
+			{
+				"BeanWithPropertiesWithArrayTypeNames",
+				new BeanWithPropertiesWithArrayTypeNames().init(),
+				"<object>"
+					+"<b1>"
+						+"<B>"
+							+"<b>foo</b>"
+						+"</B>"
+					+"</b1>"
+					+"<b2 _type='B^'>"
+						+"<B>"
+							+"<b>foo</b>"
+						+"</B>"
+					+"</b2>"
+					+"<b3>"
+						+"<B>"
+							+"<b>foo</b>"
+						+"</B>"
+					+"</b3>"
+				+"</object>",
+				"<object>\n"
+					+"\t<b1>\n"
+						+"\t\t<B>\n"
+							+"\t\t\t<b>foo</b>\n"
+						+"\t\t</B>\n"
+					+"\t</b1>\n"
+					+"\t<b2 _type='B^'>\n"
+						+"\t\t<B>\n"
+							+"\t\t\t<b>foo</b>\n"
+						+"\t\t</B>\n"
+					+"\t</b2>\n"
+					+"\t<b3>\n"
+						+"\t\t<B>\n"
+							+"\t\t\t<b>foo</b>\n"
+						+"\t\t</B>\n"
+					+"\t</b3>\n"
+				+"</object>\n",
+				"<object>"
+					+"<b1>"
+						+"<B>"
+							+"<b>foo</b>"
+						+"</B>"
+					+"</b1>"
+					+"<b2 _type='B^'>"
+						+"<B>"
+							+"<b>foo</b>"
+						+"</B>"
+					+"</b2>"
+					+"<b3>"
+						+"<B>"
+							+"<b>foo</b>"
+						+"</B>"
+					+"</b3>"
+				+"</object>",
+			},
+			{
+				"BeanWithPropertiesWithArray2dTypeNames",
+				new BeanWithPropertiesWith2dArrayTypeNames().init(),
+				"<object>"
+					+"<b1>"
+						+"<array>"
+							+"<B>"
+								+"<b>foo</b>"
+							+"</B>"
+						+"</array>"
+					+"</b1>"
+					+"<b2 _type='B^^'>"
+						+"<array>"
+							+"<B>"
+								+"<b>foo</b>"
+							+"</B>"
+						+"</array>"
+					+"</b2>"
+					+"<b3>"
+						+"<array>"
+							+"<B>"
+								+"<b>foo</b>"
+							+"</B>"
+						+"</array>"
+					+"</b3>"
+				+"</object>",
+				"<object>\n"
+					+"\t<b1>\n"
+						+"\t\t<array>\n"
+							+"\t\t\t<B>\n"
+								+"\t\t\t\t<b>foo</b>\n"
+							+"\t\t\t</B>\n"
+						+"\t\t</array>\n"
+					+"\t</b1>\n"
+					+"\t<b2 _type='B^^'>\n"
+						+"\t\t<array>\n"
+							+"\t\t\t<B>\n"
+								+"\t\t\t\t<b>foo</b>\n"
+							+"\t\t\t</B>\n"
+						+"\t\t</array>\n"
+					+"\t</b2>\n"
+					+"\t<b3>\n"
+						+"\t\t<array>\n"
+							+"\t\t\t<B>\n"
+								+"\t\t\t\t<b>foo</b>\n"
+							+"\t\t\t</B>\n"
+						+"\t\t</array>\n"
+					+"\t</b3>\n"
+				+"</object>\n",
+				"<object>"
+					+"<b1>"
+						+"<array>"
+							+"<B>"
+								+"<b>foo</b>"
+							+"</B>"
+						+"</array>"
+					+"</b1>"
+					+"<b2 _type='B^^'>"
+						+"<array>"
+							+"<B>"
+								+"<b>foo</b>"
+							+"</B>"
+						+"</array>"
+					+"</b2>"
+					+"<b3>"
+						+"<array>"
+							+"<B>"
+								+"<b>foo</b>"
+							+"</B>"
+						+"</array>"
+					+"</b3>"
+				+"</object>",
+			},
+			{
+				"BeanWithPropertiesWithMapTypeNames",
+				new BeanWithPropertiesWithMapTypeNames().init(),
+				"<object>"
+					+"<b1>"
+						+"<k1>"
+							+"<b>foo</b>"
+						+"</k1>"
+					+"</b1>"
+					+"<b2>"
+						+"<k2 _type='B'>"
+							+"<b>foo</b>"
+						+"</k2>"
+					+"</b2>"
+				+"</object>",
+				"<object>\n"
+					+"\t<b1>\n"
+						+"\t\t<k1>\n"
+							+"\t\t\t<b>foo</b>\n"
+						+"\t\t</k1>\n"
+					+"\t</b1>\n"
+					+"\t<b2>\n"
+						+"\t\t<k2 _type='B'>\n"
+							+"\t\t\t<b>foo</b>\n"
+						+"\t\t</k2>\n"
+					+"\t</b2>\n"
+				+"</object>\n",
+				"<object>"
+					+"<b1>"
+						+"<k1>"
+							+"<b>foo</b>"
+						+"</k1>"
+					+"</b1>"
+					+"<b2>"
+						+"<k2 _type='B'>"
+							+"<b>foo</b>"
+						+"</k2>"
+					+"</b2>"
+				+"</object>",
+			},
+			{
+				"BeanWithChildTypeNames",
+				new BeanWithChildTypeNames().init(),
+				"<object>"
+					+"<a>"
+						+"<fx>fx1</fx>"
+					+"</a>"
+					+"<b _type='X'>"
+						+"<fx>fx1</fx>"
+					+"</b>"
+					+"<c>"
+						+"<X>"
+							+"<fx>fx1</fx>"
+						+"</X>"
+					+"</c>"
+					+"<d>"
+						+"<X>"
+							+"<fx>fx1</fx>"
+						+"</X>"
+					+"</d>"
+				+"</object>",
+				"<object>"
+					+"\n\t<a>"
+						+"\n\t\t<fx>fx1</fx>"
+					+"\n\t</a>"
+					+"\n\t<b _type='X'>"
+						+"\n\t\t<fx>fx1</fx>"
+					+"\n\t</b>"
+					+"\n\t<c>"
+						+"\n\t\t<X>"
+							+"\n\t\t\t<fx>fx1</fx>"
+						+"\n\t\t</X>"
+					+"\n\t</c>"
+					+"\n\t<d>"
+						+"\n\t\t<X>"
+							+"\n\t\t\t<fx>fx1</fx>"
+						+"\n\t\t</X>"
+					+"\n\t</d>"
+				+"\n</object>\n",
+				"<object>"
+					+"<a>"
+						+"<fx>fx1</fx>"
+					+"</a>"
+					+"<b _type='X'>"
+						+"<fx>fx1</fx>"
+					+"</b>"
+					+"<c>"
+						+"<X>"
+							+"<fx>fx1</fx>"
+						+"</X>"
+					+"</c>"
+					+"<d>"
+						+"<X>"
+							+"<fx>fx1</fx>"
+						+"</X>"
+					+"</d>"
+				+"</object>",
+			},
+			{
+				"BeanWithChildName",
+				new BeanWithChildName().init(),
+				"<object><a><X>foo</X><X>bar</X></a><b><Y>123</Y><Y>456</Y></b></object>",
+				"<object>\n\t<a>\n\t\t<X>foo</X>\n\t\t<X>bar</X>\n\t</a>\n\t<b>\n\t\t<Y>123</Y>\n\t\t<Y>456</Y>\n\t</b>\n</object>\n",
+				"<object><a><X>foo</X><X>bar</X></a><b><Y>123</Y><Y>456</Y></b></object>",
+			},
+			{
+				"BeanWithXmlFormatAttrProperty",
+				new BeanWithXmlFormatAttrProperty().init(),
+         	"<object a='foo' b='123'/>",
+         	"<object a='foo' b='123'/>\n",
+         	"<object a='foo' b='123'/>",
+			},
+			{
+				"BeanWithXmlFormatAttrs",
+				new BeanWithXmlFormatAttrs().init(),
+         	"<object a='foo' b='123'/>",
+         	"<object a='foo' b='123'/>\n",
+         	"<object a='foo' b='123'/>",
+			},
+			{
+				"BeanWithXmlFormatElementProperty",
+				new BeanWithXmlFormatElementProperty().init(),
+				"<object a='foo'><b>123</b></object>",
+				"<object a='foo'>\n\t<b>123</b>\n</object>\n",
+				"<object a='foo'><b>123</b></object>",
+			},
+			{
+				"BeanWithXmlFormatAttrsProperty",
+				new BeanWithXmlFormatAttrsProperty().init(),
+				"<object k1='foo' k2='123' b='456'/>",
+				"<object k1='foo' k2='123' b='456'/>\n",
+				"<object k1='foo' k2='123' b='456'/>",
+			},
+			{
+				"BeanWithXmlFormatCollapsedProperty",
+				new BeanWithXmlFormatCollapsedProperty().init(),
+				"<object><A>foo</A><A>bar</A><B>123</B><B>456</B></object>",
+				"<object>\n\t<A>foo</A>\n\t<A>bar</A>\n\t<B>123</B>\n\t<B>456</B>\n</object>\n",
+				"<object><A>foo</A><A>bar</A><B>123</B><B>456</B></object>",
+			},
+			{
+				"BeanWithXmlFormatTextProperty",
+				new BeanWithXmlFormatTextProperty().init(),
+				"<object a='foo'>bar</object>",
+				"<object a='foo'>bar</object>\n",
+				"<object a='foo'>bar</object>",
+			},
+			{
+				"BeanWithXmlFormatXmlTextProperty",
+				new BeanWithXmlFormatXmlTextProperty().init(),
+				"<object a='foo'>bar<b>baz</b>qux</object>",
+				"<object a='foo'>bar<b>baz</b>qux</object>\n",
+				"<object a='foo'>bar<b>baz</b>qux</object>",
+			},
+			{
+				"BeanWithXmlFormatElementsPropertyCollection",
+				new BeanWithXmlFormatElementsPropertyCollection().init(),
+				"<object a='foo'><string>bar</string><string>baz</string><number>123</number><boolean>true</boolean><null/></object>",
+				"<object a='foo'>\n\t<string>bar</string>\n\t<string>baz</string>\n\t<number>123</number>\n\t<boolean>true</boolean>\n\t<null/>\n</object>\n",
+				"<object a='foo'><string>bar</string><string>baz</string><number>123</number><boolean>true</boolean><null/></object>",
+			},
+			{
+				"BeanWithMixedContent",
+				new BeanWithMixedContent().init(),
+				"<object>foo<X fx='fx1'/>bar<Y fy='fy1'/>baz</object>",
+				"<object>foo<X fx='fx1'/>bar<Y fy='fy1'/>baz</object>\n",  // Mixed content doesn't use whitespace!
+				"<object>foo<X fx='fx1'/>bar<Y fy='fy1'/>baz</object>",
+			},
+			{
+				"BeanWithSpecialCharacters",
+				new BeanWithSpecialCharacters().init(),
+				"<object><a>_x000A__x0008__x000C__x0009_</a></object>",
+				"<object>\n\t<a>_x000A__x0008__x000C__x0009_</a>\n</object>\n",
+				"<object><a>_x000A__x0008__x000C__x0009_</a></object>"
+			},
+			{
+				"BeanWithSpecialCharacters2",
+				new BeanWithSpecialCharacters2().init(),
+				"<_x0024__x0023__x0021_><_x002A__x0028__x0029_>_x000A__x0008__x000C__x0009_</_x002A__x0028__x0029_></_x0024__x0023__x0021_>",
+				"<_x0024__x0023__x0021_>\n\t<_x002A__x0028__x0029_>_x000A__x0008__x000C__x0009_</_x002A__x0028__x0029_>\n</_x0024__x0023__x0021_>\n",
+				"<_x0024__x0023__x0021_><_x002A__x0028__x0029_>_x000A__x0008__x000C__x0009_</_x002A__x0028__x0029_></_x0024__x0023__x0021_>"
+			},
+			{
+				"BeanWithNullProperties",
+				new BeanWithNullProperties(),
+				"<object/>",
+				"<object/>\n",
+				"<object/>"
+			},
+			{
+				"BeanWithAbstractFields",
+				new BeanWithAbstractFields().init(),
+				"<object>"
+					+"<a>"
+						+"<a>foo</a>"
+					+"</a>"
+					+"<ia _type='A'>"
+						+"<a>foo</a>"
+					+"</ia>"
+					+"<aa _type='A'>"
+						+"<a>foo</a>"
+					+"</aa>"
+					+"<o _type='A'>"
+						+"<a>foo</a>"
+					+"</o>"
+				+"</object>",
+				"<object>\n"
+					+"\t<a>\n"
+						+"\t\t<a>foo</a>\n"
+					+"\t</a>\n"
+					+"\t<ia _type='A'>\n"
+						+"\t\t<a>foo</a>\n"
+					+"\t</ia>\n"
+					+"\t<aa _type='A'>\n"
+						+"\t\t<a>foo</a>\n"
+					+"\t</aa>\n"
+					+"\t<o _type='A'>\n"
+						+"\t\t<a>foo</a>\n"
+					+"\t</o>\n"
+				+"</object>\n",
+				"<object>"
+					+"<a>"
+						+"<a>foo</a>"
+					+"</a>"
+					+"<ia _type='A'>"
+						+"<a>foo</a>"
+					+"</ia>"
+					+"<aa _type='A'>"
+						+"<a>foo</a>"
+					+"</aa>"
+					+"<o _type='A'>"
+						+"<a>foo</a>"
+					+"</o>"
+				+"</object>",
+			},
+			{
+				"BeanWithAbstractArrayFields",
+				new BeanWithAbstractArrayFields().init(),
+				"<object>"
+					+"<a>"
+						+"<A>"
+							+"<a>foo</a>"
+						+"</A>"
+					+"</a>"
+					+"<ia1 _type='A^'>"
+						+"<A>"
+							+"<a>foo</a>"
+						+"</A>"
+					+"</ia1>"
+					+"<ia2>"
+						+"<A>"
+							+"<a>foo</a>"
+						+"</A>"
+					+"</ia2>"
+					+"<aa1 _type='A^'>"
+						+"<A>"
+							+"<a>foo</a>"
+						+"</A>"
+					+"</aa1>"
+					+"<aa2>"
+						+"<A>"
+							+"<a>foo</a>"
+						+"</A>"
+					+"</aa2>"
+					+"<o1 _type='A^'>"
+						+"<A>"
+							+"<a>foo</a>"
+						+"</A>"
+					+"</o1>"
+					+"<o2>"
+						+"<A>"
+							+"<a>foo</a>"
+						+"</A>"
+					+"</o2>"
+				+"</object>",
+				"<object>\n"
+					+"\t<a>\n"
+						+"\t\t<A>\n"
+							+"\t\t\t<a>foo</a>\n"
+						+"\t\t</A>\n"
+					+"\t</a>\n"
+					+"\t<ia1 _type='A^'>\n"
+						+"\t\t<A>\n"
+							+"\t\t\t<a>foo</a>\n"
+						+"\t\t</A>\n"
+					+"\t</ia1>\n"
+					+"\t<ia2>\n"
+						+"\t\t<A>\n"
+							+"\t\t\t<a>foo</a>\n"
+						+"\t\t</A>\n"
+					+"\t</ia2>\n"
+					+"\t<aa1 _type='A^'>\n"
+						+"\t\t<A>\n"
+							+"\t\t\t<a>foo</a>\n"
+						+"\t\t</A>\n"
+					+"\t</aa1>\n"
+					+"\t<aa2>\n"
+						+"\t\t<A>\n"
+							+"\t\t\t<a>foo</a>\n"
+						+"\t\t</A>\n"
+					+"\t</aa2>\n"
+					+"\t<o1 _type='A^'>\n"
+						+"\t\t<A>\n"
+							+"\t\t\t<a>foo</a>\n"
+						+"\t\t</A>\n"
+					+"\t</o1>\n"
+					+"\t<o2>\n"
+						+"\t\t<A>\n"
+							+"\t\t\t<a>foo</a>\n"
+						+"\t\t</A>\n"
+					+"\t</o2>\n"
+				+"</object>\n",
+				"<object>"
+					+"<a>"
+						+"<A>"
+							+"<a>foo</a>"
+						+"</A>"
+					+"</a>"
+					+"<ia1 _type='A^'>"
+						+"<A>"
+							+"<a>foo</a>"
+						+"</A>"
+					+"</ia1>"
+					+"<ia2>"
+						+"<A>"
+							+"<a>foo</a>"
+						+"</A>"
+					+"</ia2>"
+					+"<aa1 _type='A^'>"
+						+"<A>"
+							+"<a>foo</a>"
+						+"</A>"
+					+"</aa1>"
+					+"<aa2>"
+						+"<A>"
+							+"<a>foo</a>"
+						+"</A>"
+					+"</aa2>"
+					+"<o1 _type='A^'>"
+						+"<A>"
+							+"<a>foo</a>"
+						+"</A>"
+					+"</o1>"
+					+"<o2>"
+						+"<A>"
+							+"<a>foo</a>"
+						+"</A>"
+					+"</o2>"
+				+"</object>",
+			},
+			{
+				"BeanWithAbstractMapFields",
+				new BeanWithAbstractMapFields().init(),
+				"<object>"
+					+"<a>"
+						+"<k1>"
+							+"<a>foo</a>"
+						+"</k1>"
+					+"</a>"
+					+"<b>"
+						+"<k2 _type='A'>"
+							+"<a>foo</a>"
+						+"</k2>"
+					+"</b>"
+					+"<c>"
+						+"<k3 _type='A'>"
+							+"<a>foo</a>"
+						+"</k3>"
+					+"</c>"
+				+"</object>",
+				"<object>\n"
+					+"\t<a>\n"
+						+"\t\t<k1>\n"
+							+"\t\t\t<a>foo</a>\n"
+						+"\t\t</k1>\n"
+					+"\t</a>\n"
+					+"\t<b>\n"
+						+"\t\t<k2 _type='A'>\n"
+							+"\t\t\t<a>foo</a>\n"
+						+"\t\t</k2>\n"
+					+"\t</b>\n"
+					+"\t<c>\n"
+						+"\t\t<k3 _type='A'>\n"
+							+"\t\t\t<a>foo</a>\n"
+						+"\t\t</k3>\n"
+					+"\t</c>\n"
+				+"</object>\n",
+				"<object>"
+					+"<a>"
+						+"<k1>"
+							+"<a>foo</a>"
+						+"</k1>"
+					+"</a>"
+					+"<b>"
+						+"<k2 _type='A'>"
+							+"<a>foo</a>"
+						+"</k2>"
+					+"</b>"
+					+"<c>"
+						+"<k3 _type='A'>"
+							+"<a>foo</a>"
+						+"</k3>"
+					+"</c>"
+				+"</object>",
+			},
+			{
+				"BeanWithAbstractMapArrayFields",
+				new BeanWithAbstractMapArrayFields().init(),
+				"<object>"
+					+"<a>"
+						+"<a1>"
+							+"<A>"
+								+"<a>foo</a>"
+							+"</A>"
+						+"</a1>"
+					+"</a>"
+					+"<ia>"
+						+"<ia1 _type='A^'>"
+							+"<A>"
+								+"<a>foo</a>"
+							+"</A>"
+						+"</ia1>"
+						+"<ia2>"
+							+"<A>"
+								+"<a>foo</a>"
+							+"</A>"
+						+"</ia2>"
+					+"</ia>"
+					+"<aa>"
+						+"<aa1 _type='A^'>"
+							+"<A>"
+								+"<a>foo</a>"
+							+"</A>"
+						+"</aa1>"
+						+"<aa2>"
+							+"<A>"
+								+"<a>foo</a>"
+							+"</A>"
+						+"</aa2>"
+					+"</aa>"
+					+"<o>"
+						+"<o1 _type='A^'>"
+							+"<A>"
+								+"<a>foo</a>"
+							+"</A>"
+						+"</o1>"
+						+"<o2>"
+							+"<A>"
+								+"<a>foo</a>"
+							+"</A>"
+						+"</o2>"
+					+"</o>"
+				+"</object>",
+				"<object>\n"
+					+"\t<a>\n"
+						+"\t\t<a1>\n"
+							+"\t\t\t<A>\n"
+								+"\t\t\t\t<a>foo</a>\n"
+							+"\t\t\t</A>\n"
+						+"\t\t</a1>\n"
+					+"\t</a>\n"
+					+"\t<ia>\n"
+						+"\t\t<ia1 _type='A^'>\n"
+							+"\t\t\t<A>\n"
+								+"\t\t\t\t<a>foo</a>\n"
+							+"\t\t\t</A>\n"
+						+"\t\t</ia1>\n"
+						+"\t\t<ia2>\n"
+							+"\t\t\t<A>\n"
+								+"\t\t\t\t<a>foo</a>\n"
+							+"\t\t\t</A>\n"
+						+"\t\t</ia2>\n"
+					+"\t</ia>\n"
+					+"\t<aa>\n"
+						+"\t\t<aa1 _type='A^'>\n"
+							+"\t\t\t<A>\n"
+								+"\t\t\t\t<a>foo</a>\n"
+							+"\t\t\t</A>\n"
+						+"\t\t</aa1>\n"
+						+"\t\t<aa2>\n"
+							+"\t\t\t<A>\n"
+								+"\t\t\t\t<a>foo</a>\n"
+							+"\t\t\t</A>\n"
+						+"\t\t</aa2>\n"
+					+"\t</aa>\n"
+					+"\t<o>\n"
+						+"\t\t<o1 _type='A^'>\n"
+							+"\t\t\t<A>\n"
+								+"\t\t\t\t<a>foo</a>\n"
+							+"\t\t\t</A>\n"
+						+"\t\t</o1>\n"
+						+"\t\t<o2>\n"
+							+"\t\t\t<A>\n"
+								+"\t\t\t\t<a>foo</a>\n"
+							+"\t\t\t</A>\n"
+						+"\t\t</o2>\n"
+					+"\t</o>\n"
+				+"</object>\n",
+				"<object>"
+					+"<a>"
+						+"<a1>"
+							+"<A>"
+								+"<a>foo</a>"
+							+"</A>"
+						+"</a1>"
+					+"</a>"
+					+"<ia>"
+						+"<ia1 _type='A^'>"
+							+"<A>"
+								+"<a>foo</a>"
+							+"</A>"
+						+"</ia1>"
+						+"<ia2>"
+							+"<A>"
+								+"<a>foo</a>"
+							+"</A>"
+						+"</ia2>"
+					+"</ia>"
+					+"<aa>"
+						+"<aa1 _type='A^'>"
+							+"<A>"
+								+"<a>foo</a>"
+							+"</A>"
+						+"</aa1>"
+						+"<aa2>"
+							+"<A>"
+								+"<a>foo</a>"
+							+"</A>"
+						+"</aa2>"
+					+"</aa>"
+					+"<o>"
+						+"<o1 _type='A^'>"
+							+"<A>"
+								+"<a>foo</a>"
+							+"</A>"
+						+"</o1>"
+						+"<o2>"
+							+"<A>"
+								+"<a>foo</a>"
+							+"</A>"
+						+"</o2>"
+					+"</o>"
+				+"</object>",
+			}
+		});
+	}
+
+	private String label, e1, e2, e3;
+	private Object in;
+
+	public BasicXmlTest(String label, Object in, String e1, String e2, String e3) throws Exception {
+		this.label = label;
+		this.in = in;
+		this.e1 = e1;
+		this.e2 = e2;
+		this.e3 = e3;
+	}
+
+	@Test
+	public void serializeNormal() {
+		try {
+			String r = s1.serialize(in);
+			assertEquals(label + " serialize-normal failed", e1, r);
+		} catch (AssertionError e) {
+			throw e;
+		} catch (Throwable e) {
+			throw new RuntimeException(label + " test failed", e);
+		}
+	}
+
+	@Test
+	public void parseNormal() {
+		try {
+			String r = s1.serialize(in);
+			Object o = parser.parse(r, in == null ? Object.class : in.getClass());
+			r = s1.serialize(o);
+			assertEquals(label + " parse-normal failed", e1, r);
+		} catch (AssertionError e) {
+			throw e;
+		} catch (Throwable e) {
+			throw new RuntimeException(label + " test failed", e);
+		}
+	}
+
+	@Test
+	public void serializeReadable() {
+		try {
+			String r = s2.serialize(in);
+			assertEquals(label + " serialize-readable failed", e2, r);
+		} catch (AssertionError e) {
+			throw e;
+		} catch (Throwable e) {
+			throw new RuntimeException(label + " test failed", e);
+		}
+	}
+
+	@Test
+	public void parseReadable() {
+		try {
+			String r = s2.serialize(in);
+			Object o = parser.parse(r, in == null ? Object.class : in.getClass());
+			r = s2.serialize(o);
+			assertEquals(label + " parse-readable failed", e2, r);
+		} catch (AssertionError e) {
+			throw e;
+		} catch (Throwable e) {
+			throw new RuntimeException(label + " test failed", e);
+		}
+	}
+
+	@Test
+	public void serializeNsEnabled() {
+		try {
+			String r = s3.serialize(in);
+			assertEquals(label + " serialize-ns-enabled failed", e3, r);
+		} catch (AssertionError e) {
+			throw e;
+		} catch (Throwable e) {
+			throw new RuntimeException(label + " test failed", e);
+		}
+	}
+
+	@Test
+	public void parseNsEnabled() {
+		try {
+			String r = s3.serialize(in);
+			Object o = parser.parse(r, in == null ? Object.class : in.getClass());
+			r = s3.serialize(o);
+			assertEquals(label + " parse-ns-enabled failed", e3, r);
+		} catch (AssertionError e) {
+			throw e;
+		} catch (Throwable e) {
+			throw new RuntimeException(label + " test failed", e);
+		}
+	}
+
+
+	//--------------------------------------------------------------------------------
+	// Test beans
+	//--------------------------------------------------------------------------------
+
+	public static class MapWithStrings extends LinkedHashMap<String,String> {
+		public MapWithStrings append(String key, String value) {
+			put(key, value);
+			return this;
+		}
+	}
+
+	public static class MapWithNumbers extends LinkedHashMap<String,Number> {
+		public MapWithNumbers append(String key, Number value) {
+			put(key, value);
+			return this;
+		}
+	}
+
+	public static class MapWithObjects extends LinkedHashMap<String,Object> {
+		public MapWithObjects append(String key, Object value) {
+			put(key, value);
+			return this;
+		}
+	}
+
+	public static class ListWithStrings extends ArrayList<String> {
+		public ListWithStrings append(String value) {
+			this.add(value);
+			return this;
+		}
+	}
+
+	public static class ListWithNumbers extends ArrayList<Number> {
+		public ListWithNumbers append(Number value) {
+			this.add(value);
+			return this;
+		}
+	}
+
+	public static class ListWithObjects extends ArrayList<Object> {
+		public ListWithObjects append(Object value) {
+			this.add(value);
+			return this;
+		}
+	}
+
+	public static class BeanWithNormalProperties {
+		public String a;
+		public int b;
+		public Object c;
+		public Object d;
+		public Bean1a e;
+		public String[] f;
+		public int[] g;
+
+		BeanWithNormalProperties init() {
+			a = "foo";
+			b = 123;
+			c = "bar";
+			d = 456;
+			e = new Bean1a().init();
+			f = new String[]{ "baz" };
+			g = new int[]{ 789 };
+			return this;
+		}
+	}
+
+	public static class Bean1a {
+		public String h;
+
+		Bean1a init() {
+			h = "qux";
+			return this;
+		}
+	}
+
+	public static class BeanWithMapProperties {
+		@BeanProperty(type=MapWithStrings.class)
+		public Map<String,String> a;
+		@BeanProperty(type=MapWithNumbers.class)
+		public Map<String,Number> b;
+		@BeanProperty(type=MapWithObjects.class)
+		public Map<String,Object> c;
+
+		BeanWithMapProperties init() {
+			a = new MapWithStrings().append("k1","foo");
+			b = new MapWithNumbers().append("k2",123);
+			c = new MapWithObjects().append("k3","bar").append("k4",456).append("k5",true).append("k6",null);
+			return this;
+		}
+	}
+
+	@Bean(typeName="X")
+	public static class BeanWithTypeName {
+		public int a;
+		public String b;
+
+		BeanWithTypeName init() {
+			a = 123;
+			b = "foo";
+			return this;
+		}
+	}
+
+	@Bean(beanDictionary={B.class})
+	public static class BeanWithPropertiesWithTypeNames {
+		public B b1;
+		public Object b2;
+
+		BeanWithPropertiesWithTypeNames init() {
+			b1 = new B().init();
+			b2 = new B().init();
+			return this;
+		}
+	}
+
+	@Bean(beanDictionary={B.class})
+	public static class BeanWithPropertiesWithArrayTypeNames {
+		public B[] b1;
+		public Object[] b2;
+		public Object[] b3;
+
+		BeanWithPropertiesWithArrayTypeNames init() {
+			b1 = new B[]{new B().init()};
+			b2 = new B[]{new B().init()};
+			b3 = new Object[]{new B().init()};
+			return this;
+		}
+	}
+
+	@Bean(beanDictionary={B.class})
+	public static class BeanWithPropertiesWith2dArrayTypeNames {
+		public B[][] b1;
+		public Object[][] b2;
+		public Object[][] b3;
+
+		BeanWithPropertiesWith2dArrayTypeNames init() {
+			b1 = new B[][]{{new B().init()}};
+			b2 = new B[][]{{new B().init()}};
+			b3 = new Object[][]{{new B().init()}};
+			return this;
+		}
+	}
+
+	@Bean(beanDictionary={B.class})
+	public static class BeanWithPropertiesWithMapTypeNames {
+		public Map<String,B> b1;
+		public Map<String,Object> b2;
+
+		BeanWithPropertiesWithMapTypeNames init() {
+			b1 = new HashMap<String,B>();
+			b1.put("k1", new B().init());
+			b2 = new HashMap<String,Object>();
+			b2.put("k2", new B().init());
+			return this;
+		}
+	}
+
+	@Bean(typeName="B")
+	public static class B {
+		public String b;
+
+		B init() {
+			b = "foo";
+			return this;
+		}
+	}
+
+	public static class BeanWithChildTypeNames {
+		public BeanX a;
+		@BeanProperty(beanDictionary=BeanX.class)
+		public Object b;
+		public BeanX[] c;
+		@BeanProperty(beanDictionary=BeanX.class)
+		public Object[] d;
+		BeanWithChildTypeNames init() {
+			a = new BeanX().init();
+			b = new BeanX().init();
+			c = new BeanX[]{new BeanX().init()};
+			d = new Object[]{new BeanX().init()};
+			return this;
+		}
+	}
+
+	public static class BeanWithChildName {
+		@Xml(childName = "X")
+		public String[] a;
+		@Xml(childName = "Y")
+		public int[] b;
+		BeanWithChildName init() {
+			a = new String[] { "foo", "bar" };
+			b = new int[] { 123, 456 };
+			return this;
+		}
+	}
+
+	public static class BeanWithXmlFormatAttrProperty {
+		@Xml(format=XmlFormat.ATTR)
+		public String a;
+		@Xml(format=XmlFormat.ATTR)
+		public int b;
+		BeanWithXmlFormatAttrProperty init() {
+			a = "foo";
+			b = 123;
+			return this;
+		}
+	}
+
+	@Xml(format=XmlFormat.ATTRS)
+	public static class BeanWithXmlFormatAttrs {
+		public String a;
+		public int b;
+		BeanWithXmlFormatAttrs init() {
+			a = "foo";
+			b = 123;
+			return this;
+		}
+	}
+
+	@Xml(format=XmlFormat.ATTRS)
+	public static class BeanWithXmlFormatElementProperty {
+		public String a;
+		@Xml(format=XmlFormat.ELEMENT)
+		public int b;
+		BeanWithXmlFormatElementProperty init() {
+			a = "foo";
+			b = 123;
+			return this;
+		}
+	}
+
+	public static class BeanWithXmlFormatAttrsProperty {
+		@Xml(format=XmlFormat.ATTRS)
+		public Map<String,Object> a;
+		@Xml(format=XmlFormat.ATTR)
+		public int b;
+		BeanWithXmlFormatAttrsProperty init() {
+			a = new ObjectMap().append("k1", "foo").append("k2", 123);
+			b = 456;
+			return this;
+		}
+	}
+
+	public static class BeanWithXmlFormatCollapsedProperty {
+		@Xml(childName="A",format=XmlFormat.COLLAPSED)
+		public String[] a;
+		@Xml(childName="B",format=XmlFormat.COLLAPSED)
+		public int[] b;
+		BeanWithXmlFormatCollapsedProperty init() {
+			a = new String[]{"foo","bar"};
+			b = new int[]{123,456};
+			return this;
+		}
+	}
+
+	public static class BeanWithXmlFormatTextProperty {
+		@Xml(format=XmlFormat.ATTR)
+		public String a;
+		@Xml(format=XmlFormat.TEXT)
+		public String b;
+		BeanWithXmlFormatTextProperty init() {
+			a = "foo";
+			b = "bar";
+			return this;
+		}
+	}
+
+	public static class BeanWithXmlFormatXmlTextProperty {
+		@Xml(format=XmlFormat.ATTR)
+		public String a;
+		@Xml(format=XmlFormat.XMLTEXT)
+		public String b;
+		BeanWithXmlFormatXmlTextProperty init() {
+			a = "foo";
+			b = "bar<b>baz</b>qux";
+			return this;
+		}
+	}
+
+	public static class BeanWithXmlFormatElementsPropertyCollection {
+		@Xml(format=XmlFormat.ATTR)
+		public String a;
+		@Xml(format=XmlFormat.ELEMENTS)
+		public Object[] b;
+		BeanWithXmlFormatElementsPropertyCollection init() {
+			a = "foo";
+			b = new Object[]{"bar","baz",123,true,null};
+			return this;
+		}
+	}
+
+	public static class BeanWithMixedContent {
+		@Xml(format=XmlFormat.MIXED)
+		@BeanProperty(beanDictionary={BeanXSimple.class, BeanYSimple.class})
+		public Object[] a;
+		BeanWithMixedContent init() {
+			a = new Object[]{
+				"foo",
+				new BeanXSimple().init(),
+				"bar",
+				new BeanYSimple().init(),
+				"baz"
+			};
+			return this;
+		}
+	}
+
+	@Bean(typeName="X")
+	public static class BeanX {
+		public String fx;
+		BeanX init() {
+			fx = "fx1";
+			return this;
+		}
+	}
+
+	@Bean(typeName="X")
+	public static class BeanXSimple {
+		@Xml(format=XmlFormat.ATTR)
+		public String fx;
+		BeanXSimple init() {
+			fx = "fx1";
+			return this;
+		}
+	}
+
+	@Bean(typeName="Y")
+	public static class BeanY {
+		public String fy;
+		BeanY init() {
+			fy = "fy1";
+			return this;
+		}
+	}
+
+	@Bean(typeName="Y")
+	public static class BeanYSimple {
+		@Xml(format=XmlFormat.ATTR)
+		public String fy;
+		BeanYSimple init() {
+			fy = "fy1";
+			return this;
+		}
+	}
+
+	public static class BeanWithSpecialCharacters {
+		public String a;
+
+		BeanWithSpecialCharacters init() {
+			a = "\n\b\f\t";
+			return this;
+		}
+	}
+
+	@Bean(typeName="$#!")
+	public static class BeanWithSpecialCharacters2 {
+
+		@BeanProperty(name="*()")
+		public String a;
+
+		BeanWithSpecialCharacters2 init() {
+			a = "\n\b\f\t";
+			return this;
+		}
+	}
+
+	public static class BeanWithNullProperties {
+		public String a;
+		public String[] b;
+	}
+
+	@Bean(beanDictionary={A.class})
+	public static class BeanWithAbstractFields {
+		public A a;
+		public IA ia;
+		public AA aa;
+		public Object o;
+
+		BeanWithAbstractFields init() {
+			ia = new A().init();
+			aa = new A().init();
+			a = new A().init();
+			o = new A().init();
+			return this;
+		}
+	}
+
+	@Bean(beanDictionary={A.class})
+	public static class BeanWithAbstractArrayFields {
+		public A[] a;
+		public IA[] ia1, ia2;
+		public AA[] aa1, aa2;
+		public Object[] o1, o2;
+
+		BeanWithAbstractArrayFields init() {
+			a = new A[]{new A().init()};
+			ia1 = new A[]{new A().init()};
+			aa1 = new A[]{new A().init()};
+			o1 = new A[]{new A().init()};
+			ia2 = new IA[]{new A().init()};
+			aa2 = new AA[]{new A().init()};
+			o2 = new Object[]{new A().init()};
+			return this;
+		}
+	}
+
+	@Bean(beanDictionary={A.class})
+	public static class BeanWithAbstractMapFields {
+		public Map<String,A> a;
+		public Map<String,AA> b;
+		public Map<String,Object> c;
+
+		BeanWithAbstractMapFields init() {
+			a = new HashMap<String,A>();
+			b = new HashMap<String,AA>();
+			c = new HashMap<String,Object>();
+			a.put("k1", new A().init());
+			b.put("k2", new A().init());
+			c.put("k3", new A().init());
+			return this;
+		}
+	}
+
+	@Bean(beanDictionary={A.class})
+	public static class BeanWithAbstractMapArrayFields {
+		public Map<String,A[]> a;
+		public Map<String,IA[]> ia;
+		public Map<String,AA[]> aa;
+		public Map<String,Object[]> o;
+
+		BeanWithAbstractMapArrayFields init() {
+			a = new LinkedHashMap<String,A[]>();
+			ia = new LinkedHashMap<String,IA[]>();
+			aa = new LinkedHashMap<String,AA[]>();
+			o = new LinkedHashMap<String,Object[]>();
+			a.put("a1", new A[]{new A().init()});
+			ia.put("ia1", new A[]{new A().init()});
+			ia.put("ia2", new IA[]{new A().init()});
+			aa.put("aa1", new A[]{new A().init()});
+			aa.put("aa2", new AA[]{new A().init()});
+			o.put("o1", new A[]{new A().init()});
+			o.put("o2", new Object[]{new A().init()});
+			return this;
+		}
+	}
+
+	public static interface IA {
+		public String getA();
+		public void setA(String a);
+	}
+
+	public static abstract class AA implements IA {}
+
+	@Bean(typeName="A")
+	public static class A extends AA {
+		private String a;
+
+		@Override
+		public String getA() {
+			return a;
+		}
+
+		@Override
+		public void setA(String a) {
+			this.a = a;
+		}
+
+		A init() {
+			this.a = "foo";
+			return this;
+		}
+	}
+}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/4fb01038/juneau-core/src/test/java/org/apache/juneau/xml/CommonParserTest.java
----------------------------------------------------------------------
diff --git a/juneau-core/src/test/java/org/apache/juneau/xml/CommonParserTest.java b/juneau-core/src/test/java/org/apache/juneau/xml/CommonParserTest.java
index 7081e83..481cfb7 100755
--- a/juneau-core/src/test/java/org/apache/juneau/xml/CommonParserTest.java
+++ b/juneau-core/src/test/java/org/apache/juneau/xml/CommonParserTest.java
@@ -74,11 +74,11 @@ public class CommonParserTest {
 		t2.add(new A3("name0","value0"));
 		t2.add(new A3("name1","value1"));
 		t1.list = t2;
-		String r = XmlSerializer.DEFAULT.serialize(t1);
+		String r = XmlSerializer.DEFAULT_NS.serialize(t1);
 		t1 = p.parse(r, A1.class);
 		assertEquals("value1", t1.list.get(1).value);
 
-		r = XmlSerializer.DEFAULT.serialize(t1);
+		r = XmlSerializer.DEFAULT_NS.serialize(t1);
 		t1 = p.parse(r, A1.class);
 		assertEquals("value1", t1.list.get(1).value);
 	}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/4fb01038/juneau-core/src/test/java/org/apache/juneau/xml/CommonTest.java
----------------------------------------------------------------------
diff --git a/juneau-core/src/test/java/org/apache/juneau/xml/CommonTest.java b/juneau-core/src/test/java/org/apache/juneau/xml/CommonTest.java
index f6cb225..7ef01fd 100755
--- a/juneau-core/src/test/java/org/apache/juneau/xml/CommonTest.java
+++ b/juneau-core/src/test/java/org/apache/juneau/xml/CommonTest.java
@@ -38,13 +38,13 @@ public class CommonTest {
 	//====================================================================================================
 	@Test
 	public void testTrimNullsFromBeans() throws Exception {
-		XmlSerializer s = new XmlSerializer.SimpleSq();
+		XmlSerializer s = new XmlSerializer.Sq();
 		XmlParser p = new XmlParser();
 		A t1 = A.create(), t2;
 
 		s.setProperty(SERIALIZER_trimNullProperties, false);
 		String r = s.serialize(t1);
-		assertEquals("<object><s1 nil='true'/><s2>s2</s2></object>", r);
+		assertEquals("<object><s1 _type='null'/><s2>s2</s2></object>", r);
 		t2 = p.parse(r, A.class);
 		assertEqualObjects(t1, t2);
 
@@ -70,20 +70,20 @@ public class CommonTest {
 	//====================================================================================================
 	@Test
 	public void testTrimEmptyMaps() throws Exception {
-		XmlSerializer s = new XmlSerializer.SimpleSq();
+		XmlSerializer s = new XmlSerializer.Sq();
 		XmlParser p = XmlParser.DEFAULT;
 		B t1 = B.create(), t2;
 		String r;
 
 		s.setProperty(SERIALIZER_trimEmptyMaps, false);
 		r = s.serialize(t1);
-		assertEquals("<object><f1/><f2><f2a nil='true'/><f2b><s2>s2</s2></f2b></f2></object>", r);
+		assertEquals("<object><f1/><f2><f2a _type='null'/><f2b><s2>s2</s2></f2b></f2></object>", r);
 		t2 = p.parse(r, B.class);
 		assertEqualObjects(t1, t2);
 
 		s.setProperty(SERIALIZER_trimEmptyMaps, true);
 		r = s.serialize(t1);
-		assertEquals("<object><f2><f2a nil='true'/><f2b><s2>s2</s2></f2b></f2></object>", r);
+		assertEquals("<object><f2><f2a _type='null'/><f2b><s2>s2</s2></f2b></f2></object>", r);
 		t2 = p.parse(r, B.class);
 		assertNull(t2.f1);
 	}
@@ -104,7 +104,7 @@ public class CommonTest {
 	//====================================================================================================
 	@Test
 	public void testTrimEmptyLists() throws Exception {
-		XmlSerializer s = new XmlSerializer.SimpleSq();
+		XmlSerializer s = new XmlSerializer.Sq();
 		XmlParser p = XmlParser.DEFAULT;
 		C t1 = C.create(), t2;
 		String r;
@@ -138,7 +138,7 @@ public class CommonTest {
 	//====================================================================================================
 	@Test
 	public void testTrimEmptyArrays() throws Exception {
-		XmlSerializer s = new XmlSerializer.SimpleSq();
+		XmlSerializer s = new XmlSerializer.Sq();
 		XmlParser p = XmlParser.DEFAULT;
 		D t1 = D.create(), t2;
 		String r;
@@ -172,10 +172,19 @@ public class CommonTest {
 	//====================================================================================================
 	@Test
 	public void testBeanPropertyProperties() throws Exception {
-		XmlSerializer s = XmlSerializer.DEFAULT_SIMPLE_SQ;
+		XmlSerializer s = XmlSerializer.DEFAULT_SQ;
 		E1 t = new E1();
 		String r = s.serialize(t);
-		assertEquals("<object><x1 f2='2'><f1>1</f1></x1><x2><f1>1</f1></x2><x3><object f2='2'><f1>1</f1></object></x3><x4><object f2='2'><f1>1</f1></object></x4><x5><object><f1>1</f1></object></x5><x6><object><f1>1</f1></object></x6></object>", r);
+		assertEquals(
+			"<object>"
+				+"<x1 f2='2'><f1>1</f1></x1>"
+				+"<x2><f1>1</f1></x2>"
+				+"<x3><object f2='2'><f1>1</f1></object></x3>"
+				+"<x4><object f2='2'><f1>1</f1></object></x4>"
+				+"<x5><object><f1 _type='number'>1</f1></object></x5>"
+				+"<x6><object><f1 _type='number'>1</f1></object></x6>"
+			+"</object>",
+			r);
 		TestUtils.validateXml(t);
 	}
 
@@ -206,7 +215,7 @@ public class CommonTest {
 	//====================================================================================================
 	@Test
 	public void testBeanPropertyPropertiesOnListOfBeans() throws Exception {
-		XmlSerializer s = XmlSerializer.DEFAULT_SIMPLE_SQ;
+		XmlSerializer s = XmlSerializer.DEFAULT_SQ;
 		List<Test7b> l = new LinkedList<Test7b>();
 		Test7b t = new Test7b();
 		t.x1.add(new Test7b());
@@ -225,7 +234,7 @@ public class CommonTest {
 	//====================================================================================================
 	@Test
 	public void testURIAttr() throws Exception {
-		XmlSerializer s = XmlSerializer.DEFAULT_SIMPLE_SQ;
+		XmlSerializer s = XmlSerializer.DEFAULT_SQ;
 		XmlParser p = XmlParser.DEFAULT;
 
 		G t = new G();
@@ -251,7 +260,7 @@ public class CommonTest {
 	//====================================================================================================
 	@Test
 	public void testUris() throws Exception {
-		WriterSerializer s = new XmlSerializer.SimpleSq();
+		WriterSerializer s = new XmlSerializer.Sq();
 		TestURI t = new TestURI();
 		String r;
 		String expected;

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/4fb01038/juneau-core/src/test/java/org/apache/juneau/xml/CommonXmlTest.java
----------------------------------------------------------------------
diff --git a/juneau-core/src/test/java/org/apache/juneau/xml/CommonXmlTest.java b/juneau-core/src/test/java/org/apache/juneau/xml/CommonXmlTest.java
index 848d76a..e2fd383 100755
--- a/juneau-core/src/test/java/org/apache/juneau/xml/CommonXmlTest.java
+++ b/juneau-core/src/test/java/org/apache/juneau/xml/CommonXmlTest.java
@@ -31,7 +31,7 @@ public class CommonXmlTest {
 	@Test
 	public void testBeanUriAnnotation() throws Exception {
 		XmlParser p = XmlParser.DEFAULT;
-		XmlSerializer s = XmlSerializer.DEFAULT_SIMPLE_SQ;
+		XmlSerializer s = XmlSerializer.DEFAULT_SQ;
 
 		A t = new A("http://foo", 123, "bar");
 		String xml = s.serialize(t);

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/4fb01038/juneau-core/src/test/java/org/apache/juneau/xml/InvalidXmlBeansTest.java
----------------------------------------------------------------------
diff --git a/juneau-core/src/test/java/org/apache/juneau/xml/InvalidXmlBeansTest.java b/juneau-core/src/test/java/org/apache/juneau/xml/InvalidXmlBeansTest.java
new file mode 100644
index 0000000..1bfec26
--- /dev/null
+++ b/juneau-core/src/test/java/org/apache/juneau/xml/InvalidXmlBeansTest.java
@@ -0,0 +1,230 @@
+// ***************************************************************************************************************************
+// * 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.xml;
+
+import static org.junit.Assert.*;
+
+import java.util.*;
+
+import org.apache.juneau.*;
+import org.apache.juneau.xml.annotation.*;
+import org.junit.*;
+import org.junit.runner.*;
+import org.junit.runners.*;
+
+/**
+ * Verifies that the correct error messages are displayed when you do something wrong with the @Xml annotation.
+ */
+@RunWith(Parameterized.class)
+@SuppressWarnings({"javadoc"})
+public class InvalidXmlBeansTest {
+
+	private static final XmlSerializer
+		s1 = XmlSerializer.DEFAULT_SQ;
+
+	@Parameterized.Parameters
+	public static Collection<Object[]> getParameters() {
+		return Arrays.asList(new Object[][] {
+
+			{
+				"BeanWithAttrFormat",
+				new BeanWithAttrFormat(),
+				"org.apache.juneau.xml.InvalidXmlBeansTest$BeanWithAttrFormat: Invalid format specified in @Xml annotation on bean: ATTR.  Must be one of the following: DEFAULT,ATTRS,ELEMENTS",
+			},
+			{
+				"BeanWithElementFormat",
+				new BeanWithElementFormat(),
+				"org.apache.juneau.xml.InvalidXmlBeansTest$BeanWithElementFormat: Invalid format specified in @Xml annotation on bean: ELEMENT.  Must be one of the following: DEFAULT,ATTRS,ELEMENTS",
+			},
+			{
+				"BeanWithCollapsedFormat",
+				new BeanWithCollapsedFormat(),
+				"org.apache.juneau.xml.InvalidXmlBeansTest$BeanWithCollapsedFormat: Invalid format specified in @Xml annotation on bean: COLLAPSED.  Must be one of the following: DEFAULT,ATTRS,ELEMENTS",
+			},
+			{
+				"BeanWithMixedFormat",
+				new BeanWithMixedFormat(),
+				"org.apache.juneau.xml.InvalidXmlBeansTest$BeanWithMixedFormat: Invalid format specified in @Xml annotation on bean: MIXED.  Must be one of the following: DEFAULT,ATTRS,ELEMENTS",
+			},
+			{
+				"BeanWithMultipleAttrs",
+				new BeanWithMultipleAttrs(),
+				"org.apache.juneau.xml.InvalidXmlBeansTest$BeanWithMultipleAttrs: Multiple instances of ATTRS properties defined on class.  Only one property can be designated as such.",
+			},
+			{
+				"BeanWithWrongAttrsType",
+				new BeanWithWrongAttrsType(),
+				"org.apache.juneau.xml.InvalidXmlBeansTest$BeanWithWrongAttrsType: Invalid type for ATTRS property.  Only properties of type Map and bean can be used.",
+			},
+			{
+				"BeanWithMulipleElements",
+				new BeanWithMulipleElements(),
+				"org.apache.juneau.xml.InvalidXmlBeansTest$BeanWithMulipleElements: Multiple instances of ELEMENTS properties defined on class.  Only one property can be designated as such.",
+			},
+			{
+				"BeanWithWrongElementsType",
+				new BeanWithWrongElementsType(),
+				"org.apache.juneau.xml.InvalidXmlBeansTest$BeanWithWrongElementsType: Invalid type for ELEMENTS property.  Only properties of type Collection and array can be used.",
+			},
+			{
+				"BeanWithMulipleMixed",
+				new BeanWithMulipleMixed(),
+				"org.apache.juneau.xml.InvalidXmlBeansTest$BeanWithMulipleMixed: Multiple instances of MIXED properties defined on class.  Only one property can be designated as such.",
+			},
+			{
+				"BeanWithConflictingChildNames",
+				new BeanWithConflictingChildNames(),
+				"org.apache.juneau.xml.InvalidXmlBeansTest$BeanWithConflictingChildNames: Multiple properties found with the child name 'X'.",
+			},
+			{
+				"BeanWithElementsAndMixed",
+				new BeanWithElementsAndMixed(),
+				"org.apache.juneau.xml.InvalidXmlBeansTest$BeanWithElementsAndMixed: ELEMENTS and MIXED properties found on the same bean.  Only one property can be designated as such.",
+			},
+			{
+				"BeanWithElementsAndElement",
+				new BeanWithElementsAndElement(),
+				"org.apache.juneau.xml.InvalidXmlBeansTest$BeanWithElementsAndElement: ELEMENTS and ELEMENT properties found on the same bean.  These cannot be mixed.",
+			},
+			{
+				"BeanWithElementsAndDefault",
+				new BeanWithElementsAndDefault(),
+				"org.apache.juneau.xml.InvalidXmlBeansTest$BeanWithElementsAndDefault: ELEMENTS and ELEMENT properties found on the same bean.  These cannot be mixed.",
+			},
+			{
+				"BeanWithElementsAndCollapsed",
+				new BeanWithElementsAndCollapsed(),
+				"org.apache.juneau.xml.InvalidXmlBeansTest$BeanWithElementsAndCollapsed: ELEMENTS and COLLAPSED properties found on the same bean.  These cannot be mixed.",
+			},
+			{
+				"BeanWithChildAndPropNameConflict",
+				new BeanWithChildAndPropNameConflict(),
+				"org.apache.juneau.xml.InvalidXmlBeansTest$BeanWithChildAndPropNameConflict: Child element name conflicts found with another property.",
+			},
+		});
+	}
+
+	private String label, expected;
+	private Object in;
+
+	public InvalidXmlBeansTest(String label, Object in, String expected) throws Exception {
+		this.label = label;
+		this.in = in;
+		this.expected = expected;
+	}
+
+	@Test
+	public void test() {
+		try {
+			s1.serialize(in);
+			fail(label + ":  Expected exception didn't occur.");
+		} catch (Exception e) {
+			assertEquals(label + ":  Wrong error message.", expected, e.getLocalizedMessage());
+		}
+	}
+
+	//--------------------------------------------------------------------------------
+	// Test beans
+	//--------------------------------------------------------------------------------
+
+	@Xml(format=XmlFormat.ATTR)
+	public static class BeanWithAttrFormat {
+		public int f1;
+	}
+
+	@Xml(format=XmlFormat.ELEMENT)
+	public static class BeanWithElementFormat {
+		public int f1;
+	}
+
+	@Xml(format=XmlFormat.COLLAPSED)
+	public static class BeanWithCollapsedFormat {
+		public int f1;
+	}
+
+	@Xml(format=XmlFormat.MIXED)
+	public static class BeanWithMixedFormat {
+		public int f1;
+	}
+
+	public static class BeanWithMultipleAttrs {
+		@Xml(format=XmlFormat.ATTRS)
+		public ObjectMap f1;
+		@Xml(format=XmlFormat.ATTRS)
+		public ObjectMap f2;
+	}
+
+	public static class BeanWithWrongAttrsType {
+		@Xml(format=XmlFormat.ATTRS)
+		public ObjectList f1;
+	}
+
+	public static class BeanWithMulipleElements {
+		@Xml(format=XmlFormat.ELEMENTS)
+		public ObjectList f1;
+		@Xml(format=XmlFormat.ELEMENTS)
+		public ObjectList f2;
+	}
+
+	public static class BeanWithWrongElementsType {
+		@Xml(format=XmlFormat.ELEMENTS)
+		public ObjectMap f1;
+	}
+
+	public static class BeanWithMulipleMixed {
+		@Xml(format=XmlFormat.MIXED)
+		public ObjectList f1;
+		@Xml(format=XmlFormat.MIXED)
+		public ObjectList f2;
+	}
+
+	public static class BeanWithConflictingChildNames {
+		@Xml(format=XmlFormat.COLLAPSED, childName="X")
+		public ObjectList f1;
+		@Xml(format=XmlFormat.COLLAPSED, childName="X")
+		public ObjectList f2;
+	}
+
+	public static class BeanWithElementsAndMixed {
+		@Xml(format=XmlFormat.ELEMENTS)
+		public ObjectList f1;
+		@Xml(format=XmlFormat.MIXED)
+		public ObjectList f2;
+	}
+
+	public static class BeanWithElementsAndElement {
+		@Xml(format=XmlFormat.ELEMENTS)
+		public ObjectList f1;
+		@Xml(format=XmlFormat.ELEMENT)
+		public ObjectList f2;
+	}
+
+	public static class BeanWithElementsAndDefault {
+		@Xml(format=XmlFormat.ELEMENTS)
+		public ObjectList f1;
+		public ObjectList f2;
+	}
+
+	public static class BeanWithElementsAndCollapsed {
+		@Xml(format=XmlFormat.ELEMENTS)
+		public ObjectList f1;
+		@Xml(format=XmlFormat.COLLAPSED)
+		public ObjectList f2;
+	}
+
+	public static class BeanWithChildAndPropNameConflict {
+		@Xml(format=XmlFormat.COLLAPSED, childName="f2")
+		public ObjectList f1;
+		public ObjectList f2;
+	}
+}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/4fb01038/juneau-core/src/test/java/org/apache/juneau/xml/XmlCollapsedTest.java
----------------------------------------------------------------------
diff --git a/juneau-core/src/test/java/org/apache/juneau/xml/XmlCollapsedTest.java b/juneau-core/src/test/java/org/apache/juneau/xml/XmlCollapsedTest.java
index c7d1417..1baf835 100755
--- a/juneau-core/src/test/java/org/apache/juneau/xml/XmlCollapsedTest.java
+++ b/juneau-core/src/test/java/org/apache/juneau/xml/XmlCollapsedTest.java
@@ -19,7 +19,6 @@ import static org.junit.Assert.*;
 import java.util.*;
 
 import org.apache.juneau.annotation.*;
-import org.apache.juneau.serializer.*;
 import org.apache.juneau.xml.annotation.*;
 import org.junit.*;
 
@@ -31,7 +30,7 @@ public class XmlCollapsedTest {
 	//====================================================================================================
 	@Test
 	public void testBasic() throws Exception {
-		XmlSerializer s = XmlSerializer.DEFAULT_SIMPLE_SQ;
+		XmlSerializer s = XmlSerializer.DEFAULT_SQ;
 		XmlParser p = XmlParser.DEFAULT;
 		A t = new A();
 
@@ -71,7 +70,7 @@ public class XmlCollapsedTest {
 	//====================================================================================================
 	@Test
 	public void testUninitializedFields() throws Exception {
-		XmlSerializer s = XmlSerializer.DEFAULT_SIMPLE_SQ;
+		XmlSerializer s = XmlSerializer.DEFAULT_SQ;
 		XmlParser p = XmlParser.DEFAULT;
 		B t = new B();
 
@@ -111,7 +110,7 @@ public class XmlCollapsedTest {
 	//====================================================================================================
 	@Test
 	public void testInitializedFields() throws Exception {
-		XmlSerializer s = XmlSerializer.DEFAULT_SIMPLE_SQ;
+		XmlSerializer s = XmlSerializer.DEFAULT_SQ;
 		XmlParser p = XmlParser.DEFAULT;
 		C t = new C();
 
@@ -158,7 +157,7 @@ public class XmlCollapsedTest {
 	@Test
 	@SuppressWarnings("synthetic-access")
 	public void testGetters() throws Exception {
-		XmlSerializer s = XmlSerializer.DEFAULT_SIMPLE_SQ;
+		XmlSerializer s = XmlSerializer.DEFAULT_SQ;
 		XmlParser p = XmlParser.DEFAULT;
 		D t = new D();
 
@@ -219,7 +218,7 @@ public class XmlCollapsedTest {
 	@Test
 	@SuppressWarnings("synthetic-access")
 	public void testNullConstructibleCollectionFields() throws Exception {
-		XmlSerializer s = XmlSerializer.DEFAULT_SIMPLE_SQ;
+		XmlSerializer s = XmlSerializer.DEFAULT_SQ;
 		XmlParser p = XmlParser.DEFAULT;
 		E t = new E();
 
@@ -265,7 +264,7 @@ public class XmlCollapsedTest {
 	//====================================================================================================
 	@Test
 	public void testElementNameOnElementClass() throws Exception {
-		XmlSerializer s = XmlSerializer.DEFAULT_SIMPLE_SQ;
+		XmlSerializer s = XmlSerializer.DEFAULT_SQ;
 		XmlParser p = XmlParser.DEFAULT;
 		Object t1 = FA.newInstance(), t2;
 		String r;
@@ -282,14 +281,6 @@ public class XmlCollapsedTest {
 		t2 = p.parse(r, FB.class);
 		assertEqualObjects(t1, t2);
 		validateXml(t1, s);
-
-		t1 = FC.newInstance();
-		try {
-			r = s.serialize(t1);
-			fail("Exception expected.");
-		} catch (SerializeException e) {
-			assertEquals("org.apache.juneau.xml.XmlCollapsedTest$FC: Multiple properties found with the name 'xf1'.", e.getLocalizedMessage());
-		}
 	}
 
 	public static class FA {
@@ -320,25 +311,10 @@ public class XmlCollapsedTest {
 		}
 	}
 
-	// Should cause name collision.
-	public static class FC {
-
-		@Xml(format=COLLAPSED)
-		public List<F1> f1;
-
-		@Xml(format=COLLAPSED)
-		public F1[] f2;
-
-		public static FC newInstance() {
-			FC t = new FC();
-			return t;
-		}
-	}
-
 	@Bean(typeName="xf1")
 	public static class F1 {
 
-		@Xml(format=CONTENT)
+		@Xml(format=TEXT)
 		public String text;
 
 		public static F1 newInstance(String text) {
@@ -355,7 +331,7 @@ public class XmlCollapsedTest {
 	//====================================================================================================
 	@Test
 	public void testElementNameOnElementClassOverridden() throws Exception {
-		XmlSerializer s = XmlSerializer.DEFAULT_SIMPLE_SQ;
+		XmlSerializer s = XmlSerializer.DEFAULT_SQ;
 		XmlParser p = XmlParser.DEFAULT;
 		G t = G.newInstance(), t2;
 
@@ -389,7 +365,7 @@ public class XmlCollapsedTest {
 	//====================================================================================================
 	@Test
 	public void testElementNameOnCollectionClass() throws Exception {
-		XmlSerializer s = XmlSerializer.DEFAULT_SIMPLE_SQ;
+		XmlSerializer s = XmlSerializer.DEFAULT_SQ;
 		XmlParser p = XmlParser.DEFAULT;
 		H t = H.newInstance(), t2;
 
@@ -428,7 +404,7 @@ public class XmlCollapsedTest {
 	//====================================================================================================
 	@Test
 	public void testElementNameOnCollectionClassOverridden() throws Exception {
-		XmlSerializer s = XmlSerializer.DEFAULT_SIMPLE_SQ;
+		XmlSerializer s = XmlSerializer.DEFAULT_SQ;
 		XmlParser p = XmlParser.DEFAULT;
 		G t = G.newInstance(), t2;