http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/4fb01038/juneau-core/src/main/java/org/apache/juneau/html/dto/proto/Title.java
----------------------------------------------------------------------
diff --git 
a/juneau-core/src/main/java/org/apache/juneau/html/dto/proto/Title.java 
b/juneau-core/src/main/java/org/apache/juneau/html/dto/proto/Title.java
deleted file mode 100644
index ec91f06..0000000
--- a/juneau-core/src/main/java/org/apache/juneau/html/dto/proto/Title.java
+++ /dev/null
@@ -1,23 +0,0 @@
-// 
***************************************************************************************************************************
-// * Licensed to the Apache Software Foundation (ASF) under one or more 
contributor license agreements.  See the NOTICE file *
-// * distributed with this work for additional information regarding copyright 
ownership.  The ASF licenses this file        *
-// * to you under the Apache License, Version 2.0 (the "License"); you may not 
use this file except in compliance            *
-// * with the License.  You may obtain a copy of the License at                
                                              *
-// *                                                                           
                                              *
-// *  http://www.apache.org/licenses/LICENSE-2.0                               
                                              *
-// *                                                                           
                                              *
-// * Unless required by applicable law or agreed to in writing, software 
distributed under the License is distributed on an  *
-// * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either 
express or implied.  See the License for the        *
-// * specific language governing permissions and limitations under the 
License.                                              *
-// 
***************************************************************************************************************************
-package org.apache.juneau.html.dto.proto;
-
-import org.apache.juneau.annotation.*;
-
-/**
- * DTO for an HTML <a 
href='https://www.w3.org/TR/html5/document-metadata.html#the-title-element'>&lt;title&gt;</a>
 element.
- * <p>
- */
-@Bean(typeName="title")
-public class Title extends HtmlElement {
-}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/4fb01038/juneau-core/src/main/java/org/apache/juneau/html/dto/proto/Tr.java
----------------------------------------------------------------------
diff --git a/juneau-core/src/main/java/org/apache/juneau/html/dto/proto/Tr.java 
b/juneau-core/src/main/java/org/apache/juneau/html/dto/proto/Tr.java
deleted file mode 100644
index 35f356a..0000000
--- a/juneau-core/src/main/java/org/apache/juneau/html/dto/proto/Tr.java
+++ /dev/null
@@ -1,23 +0,0 @@
-// 
***************************************************************************************************************************
-// * Licensed to the Apache Software Foundation (ASF) under one or more 
contributor license agreements.  See the NOTICE file *
-// * distributed with this work for additional information regarding copyright 
ownership.  The ASF licenses this file        *
-// * to you under the Apache License, Version 2.0 (the "License"); you may not 
use this file except in compliance            *
-// * with the License.  You may obtain a copy of the License at                
                                              *
-// *                                                                           
                                              *
-// *  http://www.apache.org/licenses/LICENSE-2.0                               
                                              *
-// *                                                                           
                                              *
-// * Unless required by applicable law or agreed to in writing, software 
distributed under the License is distributed on an  *
-// * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either 
express or implied.  See the License for the        *
-// * specific language governing permissions and limitations under the 
License.                                              *
-// 
***************************************************************************************************************************
-package org.apache.juneau.html.dto.proto;
-
-import org.apache.juneau.annotation.*;
-
-/**
- * DTO for an HTML <a 
href='https://www.w3.org/TR/html5/tabular-data.html#the-tr-element'>&lt;tr&gt;</a>
 element.
- * <p>
- */
-@Bean(typeName="tr")
-public class Tr extends HtmlElement {
-}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/4fb01038/juneau-core/src/main/java/org/apache/juneau/html/dto/proto/Track.java
----------------------------------------------------------------------
diff --git 
a/juneau-core/src/main/java/org/apache/juneau/html/dto/proto/Track.java 
b/juneau-core/src/main/java/org/apache/juneau/html/dto/proto/Track.java
deleted file mode 100644
index de20de4..0000000
--- a/juneau-core/src/main/java/org/apache/juneau/html/dto/proto/Track.java
+++ /dev/null
@@ -1,23 +0,0 @@
-// 
***************************************************************************************************************************
-// * Licensed to the Apache Software Foundation (ASF) under one or more 
contributor license agreements.  See the NOTICE file *
-// * distributed with this work for additional information regarding copyright 
ownership.  The ASF licenses this file        *
-// * to you under the Apache License, Version 2.0 (the "License"); you may not 
use this file except in compliance            *
-// * with the License.  You may obtain a copy of the License at                
                                              *
-// *                                                                           
                                              *
-// *  http://www.apache.org/licenses/LICENSE-2.0                               
                                              *
-// *                                                                           
                                              *
-// * Unless required by applicable law or agreed to in writing, software 
distributed under the License is distributed on an  *
-// * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either 
express or implied.  See the License for the        *
-// * specific language governing permissions and limitations under the 
License.                                              *
-// 
***************************************************************************************************************************
-package org.apache.juneau.html.dto.proto;
-
-import org.apache.juneau.annotation.*;
-
-/**
- * DTO for an HTML <a 
href='https://www.w3.org/TR/html5/embedded-content-0.html#the-track-element'>&lt;track&gt;</a>
 element.
- * <p>
- */
-@Bean(typeName="track")
-public class Track extends HtmlElement {
-}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/4fb01038/juneau-core/src/main/java/org/apache/juneau/html/dto/proto/U.java
----------------------------------------------------------------------
diff --git a/juneau-core/src/main/java/org/apache/juneau/html/dto/proto/U.java 
b/juneau-core/src/main/java/org/apache/juneau/html/dto/proto/U.java
deleted file mode 100644
index 83a7919..0000000
--- a/juneau-core/src/main/java/org/apache/juneau/html/dto/proto/U.java
+++ /dev/null
@@ -1,23 +0,0 @@
-// 
***************************************************************************************************************************
-// * Licensed to the Apache Software Foundation (ASF) under one or more 
contributor license agreements.  See the NOTICE file *
-// * distributed with this work for additional information regarding copyright 
ownership.  The ASF licenses this file        *
-// * to you under the Apache License, Version 2.0 (the "License"); you may not 
use this file except in compliance            *
-// * with the License.  You may obtain a copy of the License at                
                                              *
-// *                                                                           
                                              *
-// *  http://www.apache.org/licenses/LICENSE-2.0                               
                                              *
-// *                                                                           
                                              *
-// * Unless required by applicable law or agreed to in writing, software 
distributed under the License is distributed on an  *
-// * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either 
express or implied.  See the License for the        *
-// * specific language governing permissions and limitations under the 
License.                                              *
-// 
***************************************************************************************************************************
-package org.apache.juneau.html.dto.proto;
-
-import org.apache.juneau.annotation.*;
-
-/**
- * DTO for an HTML <a 
href='https://www.w3.org/TR/html5/text-level-semantics.html#the-u-element'>&lt;u&gt;</a>
 element.
- * <p>
- */
-@Bean(typeName="u")
-public class U extends HtmlElement {
-}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/4fb01038/juneau-core/src/main/java/org/apache/juneau/html/dto/proto/Ul.java
----------------------------------------------------------------------
diff --git a/juneau-core/src/main/java/org/apache/juneau/html/dto/proto/Ul.java 
b/juneau-core/src/main/java/org/apache/juneau/html/dto/proto/Ul.java
deleted file mode 100644
index 1fe271e..0000000
--- a/juneau-core/src/main/java/org/apache/juneau/html/dto/proto/Ul.java
+++ /dev/null
@@ -1,23 +0,0 @@
-// 
***************************************************************************************************************************
-// * Licensed to the Apache Software Foundation (ASF) under one or more 
contributor license agreements.  See the NOTICE file *
-// * distributed with this work for additional information regarding copyright 
ownership.  The ASF licenses this file        *
-// * to you under the Apache License, Version 2.0 (the "License"); you may not 
use this file except in compliance            *
-// * with the License.  You may obtain a copy of the License at                
                                              *
-// *                                                                           
                                              *
-// *  http://www.apache.org/licenses/LICENSE-2.0                               
                                              *
-// *                                                                           
                                              *
-// * Unless required by applicable law or agreed to in writing, software 
distributed under the License is distributed on an  *
-// * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either 
express or implied.  See the License for the        *
-// * specific language governing permissions and limitations under the 
License.                                              *
-// 
***************************************************************************************************************************
-package org.apache.juneau.html.dto.proto;
-
-import org.apache.juneau.annotation.*;
-
-/**
- * DTO for an HTML <a 
href='https://www.w3.org/TR/html5/grouping-content.html#the-ul-element'>&lt;ul&gt;</a>
 element.
- * <p>
- */
-@Bean(typeName="ul")
-public class Ul extends HtmlElement {
-}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/4fb01038/juneau-core/src/main/java/org/apache/juneau/html/dto/proto/Var.java
----------------------------------------------------------------------
diff --git 
a/juneau-core/src/main/java/org/apache/juneau/html/dto/proto/Var.java 
b/juneau-core/src/main/java/org/apache/juneau/html/dto/proto/Var.java
deleted file mode 100644
index de7671f..0000000
--- a/juneau-core/src/main/java/org/apache/juneau/html/dto/proto/Var.java
+++ /dev/null
@@ -1,23 +0,0 @@
-// 
***************************************************************************************************************************
-// * Licensed to the Apache Software Foundation (ASF) under one or more 
contributor license agreements.  See the NOTICE file *
-// * distributed with this work for additional information regarding copyright 
ownership.  The ASF licenses this file        *
-// * to you under the Apache License, Version 2.0 (the "License"); you may not 
use this file except in compliance            *
-// * with the License.  You may obtain a copy of the License at                
                                              *
-// *                                                                           
                                              *
-// *  http://www.apache.org/licenses/LICENSE-2.0                               
                                              *
-// *                                                                           
                                              *
-// * Unless required by applicable law or agreed to in writing, software 
distributed under the License is distributed on an  *
-// * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either 
express or implied.  See the License for the        *
-// * specific language governing permissions and limitations under the 
License.                                              *
-// 
***************************************************************************************************************************
-package org.apache.juneau.html.dto.proto;
-
-import org.apache.juneau.annotation.*;
-
-/**
- * DTO for an HTML <a 
href='https://www.w3.org/TR/html5/text-level-semantics.html#the-var-element'>&lt;var&gt;</a>
 element.
- * <p>
- */
-@Bean(typeName="var")
-public class Var extends HtmlElement {
-}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/4fb01038/juneau-core/src/main/java/org/apache/juneau/html/dto/proto/Video.java
----------------------------------------------------------------------
diff --git 
a/juneau-core/src/main/java/org/apache/juneau/html/dto/proto/Video.java 
b/juneau-core/src/main/java/org/apache/juneau/html/dto/proto/Video.java
deleted file mode 100644
index b4471ec..0000000
--- a/juneau-core/src/main/java/org/apache/juneau/html/dto/proto/Video.java
+++ /dev/null
@@ -1,23 +0,0 @@
-// 
***************************************************************************************************************************
-// * Licensed to the Apache Software Foundation (ASF) under one or more 
contributor license agreements.  See the NOTICE file *
-// * distributed with this work for additional information regarding copyright 
ownership.  The ASF licenses this file        *
-// * to you under the Apache License, Version 2.0 (the "License"); you may not 
use this file except in compliance            *
-// * with the License.  You may obtain a copy of the License at                
                                              *
-// *                                                                           
                                              *
-// *  http://www.apache.org/licenses/LICENSE-2.0                               
                                              *
-// *                                                                           
                                              *
-// * Unless required by applicable law or agreed to in writing, software 
distributed under the License is distributed on an  *
-// * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either 
express or implied.  See the License for the        *
-// * specific language governing permissions and limitations under the 
License.                                              *
-// 
***************************************************************************************************************************
-package org.apache.juneau.html.dto.proto;
-
-import org.apache.juneau.annotation.*;
-
-/**
- * DTO for an HTML <a 
href='https://www.w3.org/TR/html5/embedded-content-0.html#the-video-element'>&lt;video&gt;</a>
 element.
- * <p>
- */
-@Bean(typeName="video")
-public class Video extends HtmlElement {
-}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/4fb01038/juneau-core/src/main/java/org/apache/juneau/html/dto/proto/Wbr.java
----------------------------------------------------------------------
diff --git 
a/juneau-core/src/main/java/org/apache/juneau/html/dto/proto/Wbr.java 
b/juneau-core/src/main/java/org/apache/juneau/html/dto/proto/Wbr.java
deleted file mode 100644
index 3a61a49..0000000
--- a/juneau-core/src/main/java/org/apache/juneau/html/dto/proto/Wbr.java
+++ /dev/null
@@ -1,23 +0,0 @@
-// 
***************************************************************************************************************************
-// * Licensed to the Apache Software Foundation (ASF) under one or more 
contributor license agreements.  See the NOTICE file *
-// * distributed with this work for additional information regarding copyright 
ownership.  The ASF licenses this file        *
-// * to you under the Apache License, Version 2.0 (the "License"); you may not 
use this file except in compliance            *
-// * with the License.  You may obtain a copy of the License at                
                                              *
-// *                                                                           
                                              *
-// *  http://www.apache.org/licenses/LICENSE-2.0                               
                                              *
-// *                                                                           
                                              *
-// * Unless required by applicable law or agreed to in writing, software 
distributed under the License is distributed on an  *
-// * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either 
express or implied.  See the License for the        *
-// * specific language governing permissions and limitations under the 
License.                                              *
-// 
***************************************************************************************************************************
-package org.apache.juneau.html.dto.proto;
-
-import org.apache.juneau.annotation.*;
-
-/**
- * DTO for an HTML <a 
href='https://www.w3.org/TR/html5/text-level-semantics.html#the-wbr-element'>&lt;wbr&gt;</a>
 element.
- * <p>
- */
-@Bean(typeName="wbr")
-public class Wbr extends HtmlElement {
-}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/4fb01038/juneau-core/src/main/java/org/apache/juneau/html/dto/proto/package.html
----------------------------------------------------------------------
diff --git 
a/juneau-core/src/main/java/org/apache/juneau/html/dto/proto/package.html 
b/juneau-core/src/main/java/org/apache/juneau/html/dto/proto/package.html
deleted file mode 100644
index a721d71..0000000
--- a/juneau-core/src/main/java/org/apache/juneau/html/dto/proto/package.html
+++ /dev/null
@@ -1,41 +0,0 @@
-<!DOCTYPE HTML>
-<!--
-/***************************************************************************************************************************
- * 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.
- *
- 
***************************************************************************************************************************/
- -->
-<html>
-<head>
-       <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-       <style type="text/css">
-               /* For viewing in Page Designer */
-               @IMPORT url("../../../../../../../javadoc.css");
-
-               /* For viewing in REST interface */
-               @IMPORT url("../htdocs/javadoc.css");
-               body { 
-                       margin: 20px; 
-               }       
-       </style>
-       <script>
-               /* Replace all @code and @link tags. */ 
-               window.onload = function() {
-                       document.body.innerHTML = 
document.body.innerHTML.replace(/\{\@code ([^\}]+)\}/g, '<code>$1</code>');
-                       document.body.innerHTML = 
document.body.innerHTML.replace(/\{\@link (([^\}]+)\.)?([^\.\}]+)\}/g, 
'<code>$3</code>');
-               }
-       </script>
-</head>
-<body>
-<p>HTML Data Transfer Objects</p>
-</body>
-</html>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/4fb01038/juneau-core/src/main/java/org/apache/juneau/html/dto/proto/temp.txt
----------------------------------------------------------------------
diff --git 
a/juneau-core/src/main/java/org/apache/juneau/html/dto/proto/temp.txt 
b/juneau-core/src/main/java/org/apache/juneau/html/dto/proto/temp.txt
deleted file mode 100644
index 78a05e0..0000000
--- a/juneau-core/src/main/java/org/apache/juneau/html/dto/proto/temp.txt
+++ /dev/null
@@ -1,154 +0,0 @@
-// 
***************************************************************************************************************************
-// * Licensed to the Apache Software Foundation (ASF) under one or more 
contributor license agreements.  See the NOTICE file *
-// * distributed with this work for additional information regarding copyright 
ownership.  The ASF licenses this file        *
-// * to you under the Apache License, Version 2.0 (the "License"); you may not 
use this file except in compliance            *
-// * with the License.  You may obtain a copy of the License at                
                                              *
-// *                                                                           
                                              *
-// *  http://www.apache.org/licenses/LICENSE-2.0                               
                                              *
-// *                                                                           
                                              *
-// * Unless required by applicable law or agreed to in writing, software 
distributed under the License is distributed on an  *
-// * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either 
express or implied.  See the License for the        *
-// * specific language governing permissions and limitations under the 
License.                                              *
-// 
***************************************************************************************************************************
-a – hyperlink CHANGED
-abbr – abbreviation
-address – contact information
-area – image-map hyperlink
-article – article NEW
-aside – tangential content NEW
-audio – audio stream NEW
-b – offset text conventionally styled in bold CHANGED
-base – base URL
-bdi – BiDi isolate NEW
-bdo – BiDi override
-blockquote – block quotation
-body – document body
-br – line break
-button – button
-button type=submit – submit button
-button type=reset – reset button
-button type=button – button with no additional semantics
-canvas – canvas for dynamic graphics NEW
-caption – table title
-cite – cited title of a work CHANGED
-code – code fragment
-col – table column
-colgroup – table column group
-command – command NEW
-command type=command – command with an associated action NEW
-command type=radio – selection of one item from a list of items NEW
-command type=checkbox – state or option that can be toggled NEW
-datalist – predefined options for other controls NEW
-dd – description or value
-del – deleted text
-details – control for additional on-demand information NEW
-dfn – defining instance
-div – generic flow container
-dl – description list
-dt – term or name
-em – emphatic stress
-embed – integration point for plugins NEW
-fieldset – set of related form controls
-figcaption – figure caption NEW
-figure – figure with optional caption NEW
-footer – footer NEW
-form – user-submittable form
-h1 – heading
-h2 – heading
-h3 – heading
-h4 – heading
-h5 – heading
-h6 – heading
-head – document metadata container
-header – header NEW
-hgroup – heading group NEW
-hr – thematic break CHANGED
-html – root element
-i – offset text conventionally styled in italic CHANGED
-iframe – nested browsing context (inline frame)
-img – image
-input – input control CHANGED
-input type=text – text-input field
-input type=password – password-input field
-input type=checkbox – checkbox
-input type=radio – radio button
-input type=button – button
-input type=submit – submit button
-input type=reset – reset button
-input type=file – file upload control
-input type=hidden – hidden input control
-input type=image – image-coordinates input control
-input type=datetime – global date-and-time input control NEW
-input type=datetime-local – local date-and-time input control NEW
-input type=date – date input control NEW
-input type=month – year-and-month input control NEW
-input type=time – time input control NEW
-input type=week – year-and-week input control NEW
-input type=number – number input control NEW
-input type=range – imprecise number-input control NEW
-input type=email – e-mail address input control NEW
-input type=url – URL input control NEW
-input type=search – search field NEW
-input type=tel – telephone-number-input field NEW
-input type=color – color-well control NEW
-ins – inserted text
-kbd – user input
-keygen – key-pair generator/input control NEW
-label – caption for a form control
-legend – title or explanatory caption
-li – list item
-link – inter-document relationship metadata
-map – image-map definition
-mark – marked (highlighted) text NEW
-menu – list of commands CHANGED
-meta – metadata CHANGED
-meta name – name-value metadata
-meta http-equiv=refresh – “refresh” pragma directive
-meta http-equiv=default-style – “preferred stylesheet” pragma directive
-meta charset – document character-encoding declaration NEW
-meta http-equiv=content-type – document character-encoding declaration
-meter – scalar gauge NEW
-nav – group of navigational links NEW
-noscript – fallback content for script
-object – generic external content
-ol – ordered list
-optgroup – group of options
-option – option
-output – result of a calculation in a form NEW
-p – paragraph
-param – initialization parameters for plugins
-pre – preformatted text
-progress – progress indicator NEW
-q – quoted text
-rp – ruby parenthesis NEW
-rt – ruby text NEW
-ruby – ruby annotation NEW
-s – struck text CHANGED
-samp – (sample) output
-script – embedded script
-section – section NEW
-select – option-selection form control
-small – small print CHANGED
-source – media source NEW
-span – generic span
-strong – strong importance
-style – style (presentation) information
-sub – subscript
-summary – summary, caption, or legend for a details control NEW
-sup – superscript
-table – table
-tbody – table row group
-td – table cell
-textarea – text input area
-tfoot – table footer row group
-th – table header cell
-thead – table heading group
-time – date and/or time NEW
-title – document title
-tr – table row
-track – supplementary media track NEW
-u – offset text conventionally styled with an underline CHANGED
-ul – unordered list
-var – variable or placeholder text
-video – video NEW
-wbr – line-break opportunity NEW
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/4fb01038/juneau-core/src/main/java/org/apache/juneau/html/package.html
----------------------------------------------------------------------
diff --git a/juneau-core/src/main/java/org/apache/juneau/html/package.html 
b/juneau-core/src/main/java/org/apache/juneau/html/package.html
index 371c8c4..c07f97a 100644
--- a/juneau-core/src/main/java/org/apache/juneau/html/package.html
+++ b/juneau-core/src/main/java/org/apache/juneau/html/package.html
@@ -65,14 +65,528 @@
 <a id="HtmlSerializer"></a>
 <h2 class='topic' onclick='toggle(this)'>1 - HTML serialization support</h2>
 <div class='topic'>
-       TODO
+       
+       <!-- 
========================================================================================================
 -->
+       <a id="Methodology"></a>
+       <h3 class='topic' onclick='toggle(this)'>1.1 - HTML support 
methodology</h3>
+       <div class='topic'>
+               <p>
+                       The following examples show how different data types 
are represented in HTML.
+                       They mirror how the data structures are represented in 
JSON.
+               </p>
+               <h6 class='topic'>Simple types</h6>
+               <p>
+                       The representation for simple types mirror those 
produced by the XML serializer.
+                       Tags are added to help differentiate data types when 
they cannot be inferred through reflection.
+                       These tags are ignored by browsers and treated as plain 
text.
+               </p>
+               <table class='styled' style='width:auto'>
+                       <tr>
+                               <th>Data type</th>
+                               <th>JSON example</th>
+                               <th>HTML</th>
+                       </tr>
+                       <tr>
+                               <td>string</td>
+                               <td class='code'><js>'foo'</js></td>
+                               <td 
class='code'><xt>&lt;string&gt;</xt>foo<xt>&lt;/string&gt;</xt></td>
+                       </tr>
+                       <tr>
+                               <td>boolean</td>
+                               <td class='code'><jk>true</jk></td>
+                               <td 
class='code'><xt>&lt;boolean&gt;</xt>true<xt>&lt;/boolean&gt;</xt></td>
+                       </tr>
+                       <tr>
+                               <td>integer</td>
+                               <td class='code'>123</td>
+                               <td 
class='code'><xt>&lt;number&gt;</xt>123<xt>&lt;/number&gt;</xt></td>
+                       </tr>
+                       <tr>
+                               <td>float</td>
+                               <td class='code'>1.23</td>
+                               <td 
class='code'><xt>&lt;number&gt;</xt>1.23<xt>&lt;/number&gt;</xt></td>
+                       </tr>
+                       <tr>
+                               <td>null</td>
+                               <td class='code'><jk>null</jk></td>
+                               <td class='code'><xt>&lt;null/&gt;</xt></td>
+                       </tr>
+               </table>
+               <h6 class='topic'>Maps</h6>
+               <p>
+                       Maps and beans are represented as tables.
+               </p>
+               <p>
+                       The <xa>_type</xa> attribute is added to differentiate 
between objects (maps/beans) and arrays (arrays/collections).
+               </p>
+               <table class='styled' style='width:auto'>
+                       <tr>
+                               <th>Data type</th>
+                               <th>JSON example</th>
+                               <th>HTML</th>
+                       </tr>
+                       <tr>
+                               <td class='code'>
+       Map&lt;String,String&gt;
+                               </td>
+                               <td class='code'>
+       {
+               k1: <js>'v1'</js>
+               k2: <jk>null</jk>
+       }
+                               </td>
+                               <td class='code'><xt>
+       &lt;table <xa>_type</xa>=<xs>'object'</xs>&gt;
+               &lt;tr&gt;
+                       &lt;td&gt;<xv>k1</xv>&lt;/td&gt;
+                       &lt;td&gt;<xv>v1</xv>&lt;/td&gt;
+               &lt;/tr&gt;
+               &lt;tr&gt;
+                       &lt;td&gt;<xv>k2</xv>&lt;/td&gt;
+                       &lt;td&gt;&lt;null/&gt;&lt;/td&gt;
+               &lt;/tr&gt;
+       &lt;/table&gt;
+                       </xt></td>
+                       </tr>
+                       <tr>
+                               <td class='code'>
+       Map&lt;String,Number&gt;
+                               </td>
+                               <td class='code'>
+       {
+               k1: 123,
+               k2: 1.23,
+               k3: <jk>null</jk>
+       }
+                               </td>
+                               <td class='code'><xt>
+       &lt;table <xa>_type</xa>=<xs>'object'</xs>&gt;
+               &lt;tr&gt;
+                       &lt;td&gt;<xv>k1</xv>&lt;/td&gt;
+                       &lt;td&gt;<xv>123</xv>&lt;/td&gt;
+               &lt;/tr&gt;
+               &lt;tr&gt;
+                       &lt;td&gt;<xv>k2</xv>&lt;/td&gt;
+                       &lt;td&gt;<xv>1.23</xv>&lt;/td&gt;
+               &lt;/tr&gt;
+               &lt;tr&gt;
+                       &lt;td&gt;<xv>k3</xv>&lt;/td&gt;
+                       &lt;td&gt;&lt;null/&gt;&lt;/td&gt;
+               &lt;/tr&gt;
+       &lt;/table&gt;
+                               </xt></td>
+                       </tr>
+                       <tr>
+                               <td class='code'>
+       Map&lt;String,Object&gt;
+                               </td>
+                               <td class='code'>
+       {
+               k1: <js>'v1'</js>
+               k2: 123,
+               k3: 1.23,
+               k4: <jk>true</jk>,
+               k5: <jk>null</jk>
+       }
+                               </td>
+                               <td class='code'><xt>
+       &lt;table <xa>_type</xa>=<xs>'object'</xs>&gt;
+               &lt;tr&gt;
+                       &lt;td&gt;<xv>k1</xv>&lt;/td&gt;
+                       &lt;td&gt;<xv>v1</xv>&lt;/td&gt;
+               &lt;/tr&gt;
+               &lt;tr&gt;
+                       &lt;td&gt;<xv>k2</xv>&lt;/td&gt;
+                       
&lt;td&gt;&lt;number&gt;<xv>123</xv>&lt;/number&gt;&lt;/td&gt;
+               &lt;/tr&gt;
+               &lt;tr&gt;
+                       &lt;td&gt;<xv>k3</xv>&lt;/td&gt;
+                       
&lt;td&gt;&lt;number&gt;<xv>1.23</xv>&lt;/number&gt;&lt;/td&gt;
+               &lt;/tr&gt;
+               &lt;tr&gt;
+                       &lt;td&gt;<xv>k4</xv>&lt;/td&gt;
+                       
&lt;td&gt;&lt;boolean&gt;<xv>true</xv>&lt;/boolean&gt;&lt;/td&gt;
+               &lt;/tr&gt;
+               &lt;tr&gt;
+                       &lt;td&gt;<xv>k5</xv>&lt;/td&gt;
+                       &lt;td&gt;&lt;null/&gt;&lt;/td&gt;
+               &lt;/tr&gt;
+       &lt;/table&gt;
+                               </xt></td>
+                       </tr>
+               </table>
+               
+               <h6 class='topic'>Arrays</h6>
+               <p>
+                       Collections and arrays are represented as ordered lists.
+               </p>
+               <table class='styled' style='width:auto'>
+                       <tr>
+                               <th>Data type</th>
+                               <th>JSON example</th>
+                               <th>HTML</th>
+                       </tr>
+                       <tr>
+                               <td class='code'>
+       String[]
+                               </td>
+                               <td class='code'>
+       [
+               <js>'foo'</js>
+               <jk>null</jk>
+       ]
+                               </td>
+                               <td class='code'><xt>
+       &lt;ul&gt;
+               &lt;li&gt;<xv>foo</xv>&lt;/li&gt;
+               &lt;li&gt;&lt;null/&gt;&lt;/li&gt;
+       &lt;/ul&gt;
+                               </xt></td>
+                       </tr>
+                       <tr>
+                               <td class='code'>
+       Number[]
+                               </td>
+                               <td class='code'>
+       [
+               123,
+               1.23,
+               <jk>null</jk>
+       ]
+                               </td>
+                               <td class='code'><xt>
+       &lt;ul&gt;
+               &lt;li&gt;<xv>123</xv>&lt;/li&gt;
+               &lt;li&gt;<xv>1.23</xv>&lt;/li&gt;
+               &lt;li&gt;&lt;null/&gt;&lt;/li&gt;
+       &lt;/ul&gt;
+                               </xt></td>
+                       </tr>
+                       <tr>
+                               <td class='code'>
+       Object[]
+                               </td>
+                               <td class='code'>
+       [
+               <js>'foo'</js>,
+               123,
+               1.23,
+               <jk>true</jk>,
+               <jk>null</jk>
+       ]
+                               </td>
+                               <td class='code'><xt>
+       &lt;ul&gt;
+               &lt;li&gt;<xv>foo</xv>&lt;/li&gt;
+               &lt;li&gt;&lt;number&gt;<xv>123</xv>&lt;/number&gt;&lt;/li&gt;
+               &lt;li&gt;&lt;number&gt;<xv>1.23</xv>&lt;/number&gt;&lt;/li&gt;
+               
&lt;li&gt;&lt;boolean&gt;<xv>true</xv>&lt;/boolean&gt;&lt;/li&gt;
+               &lt;li&gt;&lt;null/&gt;&lt;/li&gt;
+       &lt;/ul&gt;
+                               </xt></td>
+                       </tr>
+                       <tr>
+                               <td class='code'>
+       String[][]
+                               </td>
+                               <td class='code'>
+       [
+               [<js>'foo'</js>, <jk>null</jk>],
+               <jk>null</jk>,
+       ]
+                               </td>
+                               <td class='code'><xt>
+       &lt;ul&gt;
+               &lt;li&gt;
+                       &lt;ul&gt;
+                               &lt;li&gt;<xv>foo</xv>&lt;/li&gt;
+                               &lt;li&gt;&lt;null/&gt;&lt;/li&gt;
+                       &lt;/ul&gt;
+               &lt;/li&gt;
+               &lt;li&gt;&lt;null/&gt;&lt;/li&gt;
+       &lt;/ul&gt;
+                               </xt></td>
+                       </tr>
+                       <tr>
+                               <td class='code'>
+       <jk>int</jk>[]
+                               </td>
+                               <td class='code'>
+       [
+               123
+       ]
+                               </td>
+                               <td class='code'><xt>
+       &lt;ul&gt;
+               &lt;li&gt;<xv>123</xv>&lt;/li&gt;
+       &lt;/ul&gt;
+                               </xt></td>
+                       </tr>
+                       <tr>
+                               <td class='code'>
+       <jk>boolean</jk>[]
+                               </td>
+                               <td class='code'>
+       [
+               <jk>true</jk>
+       ]
+                               </td>
+                               <td class='code'><xt>
+       &lt;ul&gt;
+               &lt;li&gt;<xv>true</xv>&lt;/li&gt;
+       &lt;/ul&gt;
+                               </xt></td>
+                       </tr>
+               </table>
+               
+               <h6 class='topic'>Collections</h6>
+               <table class='styled' style='width:auto'>
+                       <tr>
+                               <th>Data type</th>
+                               <th>JSON example</th>
+                               <th>HTML</th>
+                       </tr>
+                       <tr>
+                               <td class='code'>
+       List&lt;String&gt;
+                               </td>
+                               <td class='code'>
+       [
+               <js>'foo'</js>
+               <jk>null</jk>
+       ]
+                               </td>
+                               <td class='code'><xt>
+       &lt;ul&gt;
+               &lt;li&gt;<xv>foo</xv>&lt;/li&gt;
+               &lt;li&gt;&lt;null/&gt;&lt;/li&gt;
+       &lt;/ul&gt;
+                               </xt></td>
+                       </tr>
+                       <tr>
+                               <td class='code'>
+       List&lt;Number&gt;
+                               </td>
+                               <td class='code'>
+       [
+               123,
+               1.23,
+               <jk>null</jk>
+       ]
+                               </td>
+                               <td class='code'><xt>
+       &lt;ul&gt;
+               &lt;li&gt;<xv>123</xv>&lt;/li&gt;
+               &lt;li&gt;<xv>1.23</xv>&lt;/li&gt;
+               &lt;li&gt;&lt;null/&gt;&lt;/li&gt;
+       &lt;/ul&gt;
+                               </xt></td>
+                       </tr>
+                       <tr>
+                               <td class='code'>
+       List&lt;Object&gt;
+                               </td>
+                               <td class='code'>
+       [
+               <js>'foo'</js>,
+               123,
+               1.23,
+               <jk>true</jk>,
+               <jk>null</jk>
+       ]
+                               </td>
+                               <td class='code'><xt>
+       &lt;ul&gt;
+               &lt;li&gt;<xv>foo</xv>&lt;/li&gt;
+               &lt;li&gt;&lt;number&gt;<xv>123</xv>&lt;/number&gt;&lt;/li&gt;
+               &lt;li&gt;&lt;number&gt;<xv>1.23</xv>&lt;/number&gt;&lt;/li&gt;
+               
&lt;li&gt;&lt;boolean&gt;<xv>true</xv>&lt;/boolean&gt;&lt;/li&gt;
+               &lt;li&gt;&lt;null/&gt;&lt;/li&gt;
+       &lt;/ul&gt;
+                               </xt></td>
+                       </tr>
+               </table>
+
+               <h6 class='topic'>Beans</h6>
+               <table class='styled' style='width:auto'>
+                       <tr>
+                               <th>Data type</th>
+                               <th>JSON example</th>
+                               <th>HTML</th>
+                       </tr>
+                       <tr>
+                               <td class='code'>
+       <jk>class</jk> MyBean {
+               <jk>public</jk> String a;
+               <jk>public</jk> <jk>int</jk> b;
+               <jk>public</jk> Object c;  <jc>// String value</jc>
+               <jk>public</jk> Object d;  <jc>// Integer value</jc>    
+               <jk>public</jk> MyBean2 e;  
+               <jk>public</jk> String[] f;  
+               <jk>public</jk> <jk>int</jk>[] g;       
+       }
+       <jk>class</jk> MyBean2 {
+               String h;  
+       }
+                               </td>
+                               <td class='code'>
+       {
+               a: <js>'foo'</js>,
+               b: 123,
+               c: <js>'bar'</js>,
+               d: 456,
+               e: {
+                       h: <js>'baz'</js>
+               }
+               f: [<js>'qux'</js>]
+               g: [789]
+       }
+                               </td>
+                               <td class='code'><xt>
+       &lt;table <xa>_type</xa>=<xs>'object'</xs>&gt;
+               &lt;tr&gt;
+                       &lt;td&gt;<xv>a</xv>&lt;/td&gt;
+                       &lt;td&gt;<xv>foo</xv>&lt;/td&gt;
+               &lt;/tr&gt;
+               &lt;tr&gt;
+                       &lt;td&gt;<xv>b</xv>&lt;/td&gt;
+                       &lt;td&gt;<xv>123</xv>&lt;/td&gt;
+               &lt;/tr&gt;
+               &lt;tr&gt;
+                       &lt;td&gt;<xv>c</xv>&lt;/td&gt;
+                       &lt;td&gt;<xv>bar</xv>&lt;/td&gt;
+               &lt;/tr&gt;
+               &lt;tr&gt;
+                       &lt;td&gt;<xv>d</xv>&lt;/td&gt;
+                       
&lt;td&gt;&lt;number&gt;<xv>456</xv>&lt;/number&gt;&lt;/td&gt;
+               &lt;/tr&gt;
+               &lt;tr&gt;
+                       &lt;td&gt;<xv>e</xv>&lt;/td&gt;
+                       &lt;td&gt;
+                               &lt;table <xa>_type</xa>=<xs>'object'</xs>&gt;
+                                       &lt;tr&gt;
+                                               &lt;td&gt;<xv>h</xv>&lt;/td&gt;
+                                               
&lt;td&gt;<xv>qux</xv>&lt;/td&gt;
+                                       &lt;/tr&gt;
+                               &lt;/table&gt;
+                       &lt;/td&gt;
+               &lt;/tr&gt;
+               &lt;tr&gt;
+                       &lt;td&gt;<xv>f</xv>&lt;/td&gt;
+                       &lt;td&gt;
+                               &lt;ul&gt;
+                                       &lt;li&gt;<xv>baz</xv>&lt;/li&gt;
+                               &lt;/ul&gt;
+                       &lt;/td&gt;
+               &lt;/tr&gt;
+               &lt;tr&gt;
+                       &lt;td&gt;<xv>g</xv>&lt;/td&gt;
+                       &lt;td&gt;
+                               &lt;ul&gt;
+                                       &lt;li&gt;<xv>789</xv>&lt;/li&gt;
+                               &lt;/ul&gt;
+                       &lt;/td&gt;
+               &lt;/tr&gt;
+       &lt;/table&gt;
+                               </xt></td>
+                       </tr>
+               </table>
+               <h6 class='topic'>Beans with Map properties</h6>
+               <table class='styled' style='width:auto'>
+                       <tr>
+                               <th>Data type</th>
+                               <th>JSON example</th>
+                               <th>HTML</th>
+                       </tr>
+                       <tr>
+                               <td class='code'>
+       <jk>class</jk> MyBean {
+               <jk>public</jk> Map&lt;String,String&gt; a;
+               <jk>public</jk> Map&lt;String,Number&gt; b;
+               <jk>public</jk> Map&lt;String,Object&gt; c; 
+       }
+                               </td>
+                               <td class='code'>
+       {
+               a: {
+                       k1: <js>'foo'</js>
+               },
+               b: {
+                       k2: 123
+               },
+               c: {
+                       k3: <js>'bar'</js>,
+                       k4: 456,
+                       k5: <jk>true</jk>,
+                       k6: <jk>null</jk>
+               }
+       }
+                               </td>
+                               <td class='code'><xt>
+       &lt;table <xa>_type</xa>=<xs>'object'</xs>&gt;
+               &lt;tr&gt;
+                       &lt;td&gt;<xv>a</xv>&lt;/td&gt;
+                       &lt;td&gt;
+                               &lt;table _type='object'&gt;
+                                       &lt;tr&gt;
+                                               &lt;td&gt;<xv>k1</xv>&lt;/td&gt;
+                                               
&lt;td&gt;<xv>foo</xv>&lt;/td&gt;
+                                       &lt;/tr&gt;
+                               &lt;/table&gt;
+                       &lt;/td&gt;
+               &lt;/tr&gt;
+               &lt;tr&gt;
+                       &lt;td&gt;<xv>b</xv>&lt;/td&gt;
+                       &lt;td&gt;
+                               &lt;table _type='object'&gt;
+                                       &lt;tr&gt;
+                                               &lt;td&gt;<xv>k2</xv>&lt;/td&gt;
+                                               
&lt;td&gt;<xv>123</xv>&lt;/td&gt;
+                                       &lt;/tr&gt;
+                               &lt;/table&gt;
+                       &lt;/td&gt;
+               &lt;/tr&gt;
+               &lt;tr&gt;
+                       &lt;td&gt;<xv>c</xv>&lt;/td&gt;
+                       &lt;td&gt;
+                               &lt;table <xa>_type</xa>=<xs>'object'</xs>&gt;
+                                       &lt;tr&gt;
+                                               &lt;td&gt;<xv>k3</xv>&lt;/td&gt;
+                                               
&lt;td&gt;<xv>bar</xv>&lt;/td&gt;
+                                       &lt;/tr&gt;
+                                       &lt;tr&gt;
+                                               &lt;td&gt;<xv>k4</xv>&lt;/td&gt;
+                                               
&lt;td&gt;&lt;number&gt;<xv>456</xv>&lt;/number&gt;&lt;/td&gt;
+                                       &lt;/tr&gt;
+                                       &lt;tr&gt;
+                                               &lt;td&gt;<xv>k5</xv>&lt;/td&gt;
+                                               
&lt;td&gt;&lt;boolean&gt;<xv>true</xv>&lt;/boolean&gt;&lt;/td&gt;
+                                       &lt;/tr&gt;
+                                       &lt;tr&gt;
+                                               &lt;td&gt;<xv>k6</xv>&lt;/td&gt;
+                                               
&lt;td&gt;&lt;null/&gt;&lt;/td&gt;
+                                       &lt;/tr&gt;
+                               &lt;/table&gt;
+                       &lt;/td&gt;
+               &lt;/tr&gt;
+       &lt;/table&gt;
+                               </xt></td>
+                       </tr>
+               </table>
+               
+               TODO - Special characters - \n\t\b\f
+               TODO BeanWithPropertiesWithTypeNames...
+               TODO 
+               
+       </div>
+       
 </div>
 
 <!-- 
========================================================================================================
 -->
 <a id="HtmlParser"></a>
 <h2 class='topic' onclick='toggle(this)'>2 - HTML parsing support</h2>
 <div class='topic'>
-       TODO
+       The parser will handle anything produced by the serializer.
 </div>
 
 </body>

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/4fb01038/juneau-core/src/main/java/org/apache/juneau/internal/ClassUtils.java
----------------------------------------------------------------------
diff --git 
a/juneau-core/src/main/java/org/apache/juneau/internal/ClassUtils.java 
b/juneau-core/src/main/java/org/apache/juneau/internal/ClassUtils.java
index 6585dd3..49c1083 100644
--- a/juneau-core/src/main/java/org/apache/juneau/internal/ClassUtils.java
+++ b/juneau-core/src/main/java/org/apache/juneau/internal/ClassUtils.java
@@ -315,4 +315,92 @@ public final class ClassUtils {
        public static boolean isPublic(Constructor<?> c) {
                return Modifier.isPublic(c.getModifiers());
        }
+
+       /**
+        * Finds the real parameter type of the specified class.
+        *
+        * @param c The class containing the parameters (e.g. PojoSwap<T,S>)
+        * @param index The zero-based index of the parameter to resolve.
+        * @param o The object we're trying to resolve the parameter type for.
+        * @return The resolved real class.
+        */
+       public static Class<?> resolveParameterType(Class<?> c, int index, 
Object o) {
+
+               // We need to make up a mapping of type names.
+               Map<Type,Type> typeMap = new HashMap<Type,Type>();
+               Class<?> oc = o.getClass();
+               while (c != oc.getSuperclass()) {
+                       extractTypes(typeMap, oc);
+                       oc = oc.getSuperclass();
+               }
+
+               ParameterizedType opt = 
(ParameterizedType)oc.getGenericSuperclass();
+               Type actualType = opt.getActualTypeArguments()[index];
+
+               if (typeMap.containsKey(actualType))
+                       actualType = typeMap.get(actualType);
+
+               if (actualType instanceof Class) {
+                       return (Class<?>)actualType;
+
+               } else if (actualType instanceof GenericArrayType) {
+                       Class<?> cmpntType = 
(Class<?>)((GenericArrayType)actualType).getGenericComponentType();
+                       return Array.newInstance(cmpntType, 0).getClass();
+
+               } else if (actualType instanceof TypeVariable) {
+                       TypeVariable<?> typeVariable = 
(TypeVariable<?>)actualType;
+                       List<Class<?>> nestedOuterTypes = new 
LinkedList<Class<?>>();
+                       for (Class<?> ec = oc.getEnclosingClass(); ec != null; 
ec = ec.getEnclosingClass()) {
+                               try {
+                                       Field this$0 = 
oc.getDeclaredField("this$0");
+                                       Object outerInstance = this$0.get(o);
+                                       Class<?> outerClass = 
outerInstance.getClass();
+                                       nestedOuterTypes.add(outerClass);
+                                       Map<Type,Type> outerTypeMap = new 
HashMap<Type,Type>();
+                                       extractTypes(outerTypeMap, outerClass);
+                                       for (Map.Entry<Type,Type> entry : 
outerTypeMap.entrySet()) {
+                                               Type key = entry.getKey(), 
value = entry.getValue();
+                                               if (key instanceof 
TypeVariable) {
+                                                       TypeVariable<?> keyType 
= (TypeVariable<?>)key;
+                                                       if 
(keyType.getName().equals(typeVariable.getName()) && 
isInnerClass(keyType.getGenericDeclaration(), 
typeVariable.getGenericDeclaration())) {
+                                                               if (value 
instanceof Class)
+                                                                       return 
(Class<?>)value;
+                                                               typeVariable = 
(TypeVariable<?>)entry.getValue();
+                                                       }
+                                               }
+                                       }
+                               } catch (Exception e) {
+                                       throw new RuntimeException(e);
+                               }
+                       }
+                       throw new RuntimeException("Could not resolve type: " + 
actualType);
+               } else {
+                       throw new RuntimeException("Invalid type found in 
resolveParameterType: " + actualType);
+               }
+       }
+
+       private static boolean isInnerClass(GenericDeclaration od, 
GenericDeclaration id) {
+               if (od instanceof Class && id instanceof Class) {
+                       Class<?> oc = (Class<?>)od;
+                       Class<?> ic = (Class<?>)id;
+                       while ((ic = ic.getEnclosingClass()) != null)
+                               if (ic == oc)
+                                       return true;
+               }
+               return false;
+       }
+
+       private static void extractTypes(Map<Type,Type> typeMap, Class<?> c) {
+               Type gs = c.getGenericSuperclass();
+               if (gs instanceof ParameterizedType) {
+                       ParameterizedType pt = (ParameterizedType)gs;
+                       Type[] typeParameters = 
((Class<?>)pt.getRawType()).getTypeParameters();
+                       Type[] actualTypeArguments = 
pt.getActualTypeArguments();
+                       for (int i = 0; i < typeParameters.length; i++) {
+                               if (typeMap.containsKey(actualTypeArguments[i]))
+                                       actualTypeArguments[i] = 
typeMap.get(actualTypeArguments[i]);
+                               typeMap.put(typeParameters[i], 
actualTypeArguments[i]);
+                       }
+               }
+       }
 }

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/4fb01038/juneau-core/src/main/java/org/apache/juneau/internal/DelegateList.java
----------------------------------------------------------------------
diff --git 
a/juneau-core/src/main/java/org/apache/juneau/internal/DelegateList.java 
b/juneau-core/src/main/java/org/apache/juneau/internal/DelegateList.java
index 7923299..35e6b11 100644
--- a/juneau-core/src/main/java/org/apache/juneau/internal/DelegateList.java
+++ b/juneau-core/src/main/java/org/apache/juneau/internal/DelegateList.java
@@ -25,14 +25,17 @@ import org.apache.juneau.*;
 public class DelegateList<T extends Collection<?>> extends ObjectList 
implements Delegate<T> {
        private static final long serialVersionUID = 1L;
 
-       private transient ClassMeta<T> classMeta;
+       private final ClassMeta<T> classMeta;
 
        /**
         * Constructor.
         *
-        * @param classMeta The metadata object that created this delegate list.
+        * @param classMeta The data type represented by this delegate.
         */
+       @SuppressWarnings("unchecked")
        public DelegateList(ClassMeta<T> classMeta) {
+               if (classMeta.isArray())
+                       classMeta = 
classMeta.getBeanContext().getCollectionClassMeta(List.class, 
classMeta.getElementType());
                this.classMeta = classMeta;
        }
 

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/4fb01038/juneau-core/src/main/java/org/apache/juneau/internal/FilteredMap.java
----------------------------------------------------------------------
diff --git 
a/juneau-core/src/main/java/org/apache/juneau/internal/FilteredMap.java 
b/juneau-core/src/main/java/org/apache/juneau/internal/FilteredMap.java
index 49c45ae..5783227 100644
--- a/juneau-core/src/main/java/org/apache/juneau/internal/FilteredMap.java
+++ b/juneau-core/src/main/java/org/apache/juneau/internal/FilteredMap.java
@@ -16,27 +16,32 @@ import static org.apache.juneau.internal.ThrowableUtils.*;
 
 import java.util.*;
 
+import org.apache.juneau.*;
+
 /**
  * Wrapper around a map where the key names are overridden.
  *
  * @param <K> The key class type.
  * @param <V> The value class type.
  */
-public final class FilteredMap<K,V> extends AbstractMap<K,V> {
+public final class FilteredMap<K,V> extends AbstractMap<K,V> implements 
Delegate<Map<K,V>> {
 
        private Map<K,V> innerMap;
        private Set<Map.Entry<K,V>> entries;
+       private final ClassMeta<Map<K,V>> classMeta;
 
        /**
         * Constructor.
-        *
+        * 
+        * @param classMeta The class type of the map being wrapped. 
         * @param innerMap The map being wrapped.  Must not be <jk>null</jk>.
         * @param keys The keys in the new map.  Must not be <jk>null</jk>.
         */
-       public FilteredMap(Map<K,V> innerMap, K[] keys) {
+       public FilteredMap(ClassMeta<Map<K,V>> classMeta, Map<K,V> innerMap, 
K[] keys) {
                assertFieldNotNull(innerMap, "innerMap");
                assertFieldNotNull(keys, "keys");
 
+               this.classMeta = classMeta;
                this.innerMap = innerMap;
                        List<Map.Entry<K,V>> l = new 
ArrayList<Map.Entry<K,V>>(keys.length);
                        for (K k : keys)
@@ -92,4 +97,9 @@ public final class FilteredMap<K,V> extends AbstractMap<K,V> {
                        return entries.size();
                }
        }
+
+       @Override /* Delegate */
+       public ClassMeta<Map<K,V>> getClassMeta() {
+               return classMeta;
+       }
 }

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/4fb01038/juneau-core/src/main/java/org/apache/juneau/jena/RdfParser.java
----------------------------------------------------------------------
diff --git a/juneau-core/src/main/java/org/apache/juneau/jena/RdfParser.java 
b/juneau-core/src/main/java/org/apache/juneau/jena/RdfParser.java
index 0d5446c..604d98a 100644
--- a/juneau-core/src/main/java/org/apache/juneau/jena/RdfParser.java
+++ b/juneau-core/src/main/java/org/apache/juneau/jena/RdfParser.java
@@ -117,7 +117,7 @@ public class RdfParser extends ReaderParser {
                List<Resource> roots = getRoots(s, model);
 
                // Special case where we're parsing a loose collection of 
resources.
-               if (s.isLooseCollections() && (type.isCollection() || 
type.isArray())) {
+               if (s.isLooseCollections() && type.isCollectionOrArray()) {
                        Collection c = null;
                        if (type.isArray())
                                c = new ArrayList();
@@ -200,7 +200,7 @@ public class RdfParser extends ReaderParser {
                        if (pMeta != null) {
                                RDFNode o = st.getObject();
                                ClassMeta<?> cm = pMeta.getClassMeta();
-                               if ((cm.isArray() || cm.isCollection()) && 
isMultiValuedCollections(session, pMeta)) {
+                               if (cm.isCollectionOrArray() && 
isMultiValuedCollections(session, pMeta)) {
                                        ClassMeta<?> et = cm.getElementType();
                                        Object value = parseAnything(session, 
et, o, m.getBean(false));
                                        setName(et, value, key);
@@ -302,7 +302,7 @@ public class RdfParser extends ReaderParser {
                                return null;
                        Map m = (sType.canCreateNewInstance(outer) ? 
(Map)sType.newInstance(outer) : new ObjectMap(session));
                        o = parseIntoMap(session, r, m, eType.getKeyType(), 
eType.getValueType());
-               } else if (sType.isCollection() || sType.isArray()) {
+               } else if (sType.isCollectionOrArray()) {
                        if (sType.isArray())
                                o = new ArrayList();
                        else

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/4fb01038/juneau-core/src/main/java/org/apache/juneau/jena/RdfParserSession.java
----------------------------------------------------------------------
diff --git 
a/juneau-core/src/main/java/org/apache/juneau/jena/RdfParserSession.java 
b/juneau-core/src/main/java/org/apache/juneau/jena/RdfParserSession.java
index 017e45e..2c73a00 100644
--- a/juneau-core/src/main/java/org/apache/juneau/jena/RdfParserSession.java
+++ b/juneau-core/src/main/java/org/apache/juneau/jena/RdfParserSession.java
@@ -226,7 +226,7 @@ public class RdfParserSession extends ParserSession {
                        return s;
                if (trimWhitespace)
                        s = s.trim();
-               s = XmlUtils.decode(s);
+               s = XmlUtils.decode(s, null);
                if (isTrimStrings())
                        s = s.trim();
                return s;

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/4fb01038/juneau-core/src/main/java/org/apache/juneau/jena/RdfSerializer.java
----------------------------------------------------------------------
diff --git 
a/juneau-core/src/main/java/org/apache/juneau/jena/RdfSerializer.java 
b/juneau-core/src/main/java/org/apache/juneau/jena/RdfSerializer.java
index fcd522d..0728b39 100644
--- a/juneau-core/src/main/java/org/apache/juneau/jena/RdfSerializer.java
+++ b/juneau-core/src/main/java/org/apache/juneau/jena/RdfSerializer.java
@@ -125,7 +125,7 @@ public class RdfSerializer extends WriterSerializer {
                Resource r = null;
 
                ClassMeta<?> cm = session.getClassMetaForObject(o);
-               if (s.isLooseCollections() && cm != null && (cm.isCollection() 
|| cm.isArray())) {
+               if (s.isLooseCollections() && cm != null && 
cm.isCollectionOrArray()) {
                        Collection c = s.sort(cm.isCollection() ? (Collection)o 
: toList(cm.getInnerClass(), o));
                        for (Object o2 : c)
                                serializeAnything(s, o2, false, object(), 
"root", null, null);
@@ -240,7 +240,7 @@ public class RdfSerializer extends WriterSerializer {
                        n = m.createResource(uri2);
                        serializeBeanMap(session, bm, (Resource)n);
 
-               } else if (sType.isCollection() || sType.isArray() || (wType != 
null && wType.isCollection())) {
+               } else if (sType.isCollectionOrArray() || (wType != null && 
wType.isCollection())) {
                        Collection c = session.sort(sType.isCollection() ? 
(Collection)o : toList(sType.getInnerClass(), o));
                        RdfCollectionFormat f = session.getCollectionFormat();
                        RdfClassMeta rcm = 
sType.getExtendedMeta(RdfClassMeta.class);

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/4fb01038/juneau-core/src/main/java/org/apache/juneau/jena/package.html
----------------------------------------------------------------------
diff --git a/juneau-core/src/main/java/org/apache/juneau/jena/package.html 
b/juneau-core/src/main/java/org/apache/juneau/jena/package.html
index 788b25d..6036583 100644
--- a/juneau-core/src/main/java/org/apache/juneau/jena/package.html
+++ b/juneau-core/src/main/java/org/apache/juneau/jena/package.html
@@ -125,7 +125,7 @@
                These  can be associated with serializers/parsers, or can be 
associated with classes or bean properties through type and method annotations.
        </p>
        <p>
-               Refer to <a href='../package-summary.html#PojoCategories' 
class='doclink'>POJO Categories</a> for a complete definition of supported 
POJOs.
+               Refer to <a 
href='../../../../overview-summary.html#Core.PojoCategories' 
class='doclink'>POJO Categories</a> for a complete definition of supported 
POJOs.
        </p>
        <h6 class='topic'>Prerequisites</h6>
        <p>

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/4fb01038/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 5a5d098..be41f20 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
@@ -103,7 +103,7 @@ public final class JsonParser extends ReaderParser {
                ClassMeta<?> sType = eType.getSerializedClassMeta();
                session.setCurrentClass(sType);
                String wrapperAttr = 
sType.getExtendedMeta(JsonClassMeta.class).getWrapperAttr();
-               BeanDictionary bd = pMeta == null ? session.getBeanDictionary() 
: pMeta.getBeanDictionary();
+               BeanRegistry breg = pMeta == null ? session.getBeanRegistry() : 
pMeta.getBeanRegistry();
 
                Object o = null;
 
@@ -126,7 +126,7 @@ public final class JsonParser extends ReaderParser {
                        if (c == '{') {
                                ObjectMap m2 = new ObjectMap(session);
                                parseIntoMap2(session, r, m2, string(), 
object(), pMeta);
-                               o = bd.cast(m2);
+                               o = breg.cast(m2);
                        } else if (c == '[') {
                                o = parseIntoCollection2(session, r, new 
ObjectList(session), object(), pMeta);
                        } else if (c == '\'' || c == '"') {
@@ -157,7 +157,7 @@ public final class JsonParser extends ReaderParser {
                        if (c == '{') {
                                ObjectMap m = new ObjectMap(session);
                                parseIntoMap2(session, r, m, string(), 
object(), pMeta);
-                               o = bd.cast(m);
+                               o = breg.cast(m);
                        } else {
                                Collection l = 
(sType.canCreateNewInstance(outer) ? (Collection)sType.newInstance() : new 
ObjectList(session));
                                o = parseIntoCollection2(session, r, l, 
sType.getElementType(), pMeta);
@@ -177,7 +177,7 @@ public final class JsonParser extends ReaderParser {
                        if (c == '{') {
                                ObjectMap m = new ObjectMap(session);
                                parseIntoMap2(session, r, m, string(), 
object(), pMeta);
-                               o = bd.cast(m);
+                               o = breg.cast(m);
                        } else {
                                ArrayList l = 
(ArrayList)parseIntoCollection2(session, r, new ArrayList(), 
sType.getElementType(), pMeta);
                                o = session.toArray(sType, l);
@@ -186,7 +186,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 = bd.cast((ObjectMap)m);
+                               o = breg.cast((ObjectMap)m);
                        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()) {

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/4fb01038/juneau-core/src/main/java/org/apache/juneau/json/JsonSchemaSerializer.java
----------------------------------------------------------------------
diff --git 
a/juneau-core/src/main/java/org/apache/juneau/json/JsonSchemaSerializer.java 
b/juneau-core/src/main/java/org/apache/juneau/json/JsonSchemaSerializer.java
index 3740adb..4b2b6d1 100644
--- a/juneau-core/src/main/java/org/apache/juneau/json/JsonSchemaSerializer.java
+++ b/juneau-core/src/main/java/org/apache/juneau/json/JsonSchemaSerializer.java
@@ -98,9 +98,9 @@ public final class JsonSchemaSerializer extends 
JsonSerializer {
                        type = "number";
                else if (sType.isBoolean())
                        type = "boolean";
-               else if (sType.isBean() || sType.isMap())
+               else if (sType.isMapOrBean())
                        type = "object";
-               else if (sType.isCollection() || sType.isArray())
+               else if (sType.isCollectionOrArray())
                        type = "array";
                else
                        type = "any";
@@ -114,7 +114,7 @@ public final class JsonSchemaSerializer extends 
JsonSerializer {
                if (aType != null) {
                        if (sType.isEnum())
                                out.put("enum", 
getEnumStrings((Class<Enum<?>>)sType.getInnerClass()));
-                       else if (sType.isCollection() || sType.isArray()) {
+                       else if (sType.isCollectionOrArray()) {
                                ClassMeta componentType = 
sType.getElementType();
                                if (sType.isCollection() && 
isParentClass(Set.class, sType.getInnerClass()))
                                        out.put("uniqueItems", true);

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/4fb01038/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 55693a5..ed87019 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
@@ -162,7 +162,7 @@ public class JsonSerializer extends WriterSerializer {
                if (eType == null)
                        eType = object();
 
-               boolean addTypeProperty;                // Add "_type" 
attribute to element?
+               boolean addTypeProperty;    // Add "_type" attribute to element?
                ClassMeta<?> aType;                     // The actual type
                ClassMeta<?> sType;                     // The serialized type
 

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/4fb01038/juneau-core/src/main/java/org/apache/juneau/json/package.html
----------------------------------------------------------------------
diff --git a/juneau-core/src/main/java/org/apache/juneau/json/package.html 
b/juneau-core/src/main/java/org/apache/juneau/json/package.html
index 13ae665..6c238cd 100644
--- a/juneau-core/src/main/java/org/apache/juneau/json/package.html
+++ b/juneau-core/src/main/java/org/apache/juneau/json/package.html
@@ -110,7 +110,7 @@
                <li>Non-serializable classes and properties with associated 
<code>PojoSwaps</code> that convert them to serializable forms.
        </ul>
        <p>
-               Refer to <a href='../package-summary.html#PojoCategories' 
class='doclink'>POJO Categories</a> for a complete definition of supported 
POJOs.
+               Refer to <a 
href='../../../../overview-summary.html#Core.PojoCategories' 
class='doclink'>POJO Categories</a> for a complete definition of supported 
POJOs.
        </p>
        <h6 class='topic'>Prerequisites</h6>
        <p>

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/4fb01038/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 fff316c..2d1c764 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,7 @@ public final class MsgPackParser extends InputStreamParser {
                PojoSwap<T,Object> transform = 
(PojoSwap<T,Object>)eType.getPojoSwap();
                ClassMeta<?> sType = eType.getSerializedClassMeta();
                session.setCurrentClass(sType);
-               BeanDictionary bd = (pMeta == null ? 
session.getBeanDictionary() : pMeta.getBeanDictionary());
+               BeanRegistry breg = (pMeta == null ? session.getBeanRegistry() 
: pMeta.getBeanRegistry());
 
                Object o = null;
                DataType dt = is.readDataType();
@@ -83,7 +83,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 = bd.cast(om);
+                               o = breg.cast(om);
                        }
 
                        if (sType.isObject()) {
@@ -140,7 +140,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 = bd.cast(m);
+                                       o = breg.cast(m);
                                } else if (dt == ARRAY) {
                                        Collection l = 
(sType.canCreateNewInstance(outer) ? (Collection)sType.newInstance() : new 
ObjectList(session));
                                        for (int i = 0; i < length; i++)
@@ -154,7 +154,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 = bd.cast(m);
+                                       o = breg.cast(m);
                                } else if (dt == ARRAY) {
                                        Collection l = (sType.isCollection() && 
sType.canCreateNewInstance(outer) ? (Collection)sType.newInstance() : new 
ObjectList(session));
                                        for (int i = 0; i < length; i++)
@@ -168,7 +168,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 = bd.cast(m);
+                                       o = breg.cast(m);
                                else
                                        throw new ParseException(session, 
"Class ''{0}'' could not be instantiated.  Reason: ''{1}''", 
sType.getInnerClass().getName(), sType.getNotABeanReason());
                        } else {

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/4fb01038/juneau-core/src/main/java/org/apache/juneau/package.html
----------------------------------------------------------------------
diff --git a/juneau-core/src/main/java/org/apache/juneau/package.html 
b/juneau-core/src/main/java/org/apache/juneau/package.html
index ac78fda..8f80569 100644
--- a/juneau-core/src/main/java/org/apache/juneau/package.html
+++ b/juneau-core/src/main/java/org/apache/juneau/package.html
@@ -64,8 +64,6 @@
                <li><p><a class='doclink' href='#BeanContext'>The BeanContext 
class</a></p>
                <li><p><a class='doclink' href='#Bean'>Bean annotations</a></p>
        </ol>
-       <li><p><a class='doclink' href='#ObjectMap_ObjectList'>ObjectMap and 
ObjectList APIs</a></p>
-       <li><p><a class='doclink' href='#PojoCategories'>POJO Categories</a></p>
 </ol>
 
 <!-- 
========================================================================================================
 -->

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/4fb01038/juneau-core/src/main/java/org/apache/juneau/parser/Parser.java
----------------------------------------------------------------------
diff --git a/juneau-core/src/main/java/org/apache/juneau/parser/Parser.java 
b/juneau-core/src/main/java/org/apache/juneau/parser/Parser.java
index 8178ea4..8256a74 100644
--- a/juneau-core/src/main/java/org/apache/juneau/parser/Parser.java
+++ b/juneau-core/src/main/java/org/apache/juneau/parser/Parser.java
@@ -36,7 +36,7 @@ import org.apache.juneau.utils.*;
  *     However, the media types can also be specified programmatically by 
overriding the {@link #getMediaTypes()} method.
  *
  * <a id='ValidDataConversions'></a><h6 class='topic'>Valid data 
conversions</h6>
- *     Parsers can parse any parsable POJO types, as specified in the <a 
class='doclink' href='../package-summary.html#PojoCategories'>POJO 
Categories</a>.
+ *     Parsers can parse any parsable POJO types, as specified in the <a 
class='doclink' 
href='../../../../overview-summary.html#Core.PojoCategories'>POJO 
Categories</a>.
  * <p>
  *     Some examples of conversions are shown below...
  * </p>

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/4fb01038/juneau-core/src/main/java/org/apache/juneau/plaintext/PlainTextParser.java
----------------------------------------------------------------------
diff --git 
a/juneau-core/src/main/java/org/apache/juneau/plaintext/PlainTextParser.java 
b/juneau-core/src/main/java/org/apache/juneau/plaintext/PlainTextParser.java
index 7d6b30f..4a8cc65 100644
--- a/juneau-core/src/main/java/org/apache/juneau/plaintext/PlainTextParser.java
+++ b/juneau-core/src/main/java/org/apache/juneau/plaintext/PlainTextParser.java
@@ -19,7 +19,7 @@ import org.apache.juneau.parser.*;
 import org.apache.juneau.transform.*;
 
 /**
- * Parsers HTTP plain text request bodies into <a 
href='../package-summary.html#PojoCategories'>Group 5</a> POJOs.
+ * Parsers HTTP plain text request bodies into <a 
href='../../../../overview-summary.html#Core.PojoCategories'>Group 5</a> POJOs.
  *
  * <h6 class='topic'>Media types</h6>
  * <p>

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/4fb01038/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 d64efb8..d0f72f9 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
@@ -569,12 +569,7 @@ public class SerializerSession extends BeanSession {
        public String resolveUri(String uri) {
                if (uri.indexOf("://") != -1 || (absolutePathUriBase == null && 
relativeUriBase == null))
                        return uri;
-               StringBuilder sb = new StringBuilder(
-                       uri.length()
-                       + (absolutePathUriBase == null ? 0 : 
absolutePathUriBase.length())
-                       + 1
-                       + (relativeUriBase == null ? 0 : 
relativeUriBase.length())
-               );
+               StringBuilder sb = getStringBuilder();
                if (StringUtils.startsWith(uri, '/')) {
                        if (absolutePathUriBase != null)
                                sb.append(absolutePathUriBase);
@@ -586,7 +581,9 @@ public class SerializerSession extends BeanSession {
                        }
                }
                sb.append(uri);
-               return sb.toString();
+               String s = sb.toString();
+               returnStringBuilder(sb);
+               return s;
        }
 
        /**

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/4fb01038/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 fb86ef0..2460e88 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
@@ -235,6 +235,19 @@ public class SerializerWriter extends Writer {
        }
 
        /**
+        * Writes a newline to the writer if the {@code useIndentation} 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)
+                       out.write('\n');
+               return this;
+       }
+
+       /**
         * Writes the specified text to the writer.
         *
         * @param text The text to write.

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/4fb01038/juneau-core/src/main/java/org/apache/juneau/transform/MapSwap.java
----------------------------------------------------------------------
diff --git a/juneau-core/src/main/java/org/apache/juneau/transform/MapSwap.java 
b/juneau-core/src/main/java/org/apache/juneau/transform/MapSwap.java
new file mode 100644
index 0000000..f0713f6
--- /dev/null
+++ b/juneau-core/src/main/java/org/apache/juneau/transform/MapSwap.java
@@ -0,0 +1,35 @@
+// 
***************************************************************************************************************************
+// * 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.transform;
+
+import org.apache.juneau.*;
+import org.apache.juneau.parser.*;
+import org.apache.juneau.serializer.*;
+
+/**
+ * Abstract subclass for POJO swaps that swap objects for object maps.
+ *
+ * @param <T> The normal form of the class.
+ */
+public abstract class MapSwap<T> extends PojoSwap<T,ObjectMap> {
+
+       @Override /* PojoSwap */
+       public ObjectMap swap(BeanSession session, T o) throws 
SerializeException {
+               return super.swap(session, o);
+       }
+
+       @Override /* PojoSwap */
+       public T unswap(BeanSession session, ObjectMap f, ClassMeta<?> hint) 
throws ParseException {
+               return super.unswap(session, f, hint);
+       }
+}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/4fb01038/juneau-core/src/main/java/org/apache/juneau/transform/PojoSwap.java
----------------------------------------------------------------------
diff --git 
a/juneau-core/src/main/java/org/apache/juneau/transform/PojoSwap.java 
b/juneau-core/src/main/java/org/apache/juneau/transform/PojoSwap.java
index d49d00a..e1239b3 100644
--- a/juneau-core/src/main/java/org/apache/juneau/transform/PojoSwap.java
+++ b/juneau-core/src/main/java/org/apache/juneau/transform/PojoSwap.java
@@ -12,7 +12,6 @@
 // 
***************************************************************************************************************************
 package org.apache.juneau.transform;
 
-import java.lang.reflect.*;
 import java.util.*;
 
 import org.apache.juneau.*;
@@ -47,6 +46,14 @@ import org.apache.juneau.serializer.*;
  *     {@link Serializer Serializers} use swaps to convert objects of type T 
into objects of type S, and on calls to {@link BeanMap#get(Object)}.<br>
  *     {@link Parser Parsers} use swaps to convert objects of type S into 
objects of type T, and on calls to {@link BeanMap#put(String,Object)}.
  *
+ * <h6 class='topic'>Subtypes</h6>
+ * <p>
+ *     The following abstract subclasses are provided for common swap types:
+ *     <ol>
+ *             <li>{@link StringSwap} - Objects swapped with strings.
+ *             <li>{@link MapSwap} - Objects swapped with {@link ObjectMap 
ObjectMaps}.
+ *     </ol>
+ *
  * <h6 class='topic'>Localization</h6>
  * <p>
  *     Swaps have access to the session locale and timezone through the {@link 
BeanSession#getLocale()} and {@link BeanSession#getTimeZone()}
@@ -100,48 +107,8 @@ public abstract class PojoSwap<T,S> {
         */
        @SuppressWarnings("unchecked")
        protected PojoSwap() {
-
-               Class<?> t_normalClass = null, t_swapClass = null;
-
-               Class<?> c = this.getClass().getSuperclass();
-               Type t = this.getClass().getGenericSuperclass();
-               while (c != PojoSwap.class) {
-                       t = c.getGenericSuperclass();
-                       c = c.getSuperclass();
-               }
-
-               // Attempt to determine the T and G classes using reflection.
-               if (t instanceof ParameterizedType) {
-                       ParameterizedType pt = (ParameterizedType)t;
-                       Type[] pta = pt.getActualTypeArguments();
-                       if (pta.length == 2) {
-                               Type nType = pta[0];
-                               if (nType instanceof Class) {
-                                       t_normalClass = (Class<T>)nType;
-
-                               // <byte[],x> ends up containing a 
GenericArrayType, so it has to
-                               // be handled as a special case.
-                               } else if (nType instanceof GenericArrayType) {
-                                       Class<?> cmpntType = 
(Class<?>)((GenericArrayType)nType).getGenericComponentType();
-                                       t_normalClass = 
Array.newInstance(cmpntType, 0).getClass();
-
-                               // <Class<?>,x> ends up containing a 
ParameterizedType, so just use the raw type.
-                               } else if (nType instanceof ParameterizedType) {
-                                       t_normalClass = 
(Class<T>)((ParameterizedType)nType).getRawType();
-
-                               } else
-                                       throw new RuntimeException("Unsupported 
parameter type: " + nType);
-                               if (pta[1] instanceof Class)
-                                       t_swapClass = (Class<S>)pta[1];
-                               else if (pta[1] instanceof ParameterizedType)
-                                       t_swapClass = 
(Class<S>)((ParameterizedType)pta[1]).getRawType();
-                               else
-                                       throw new RuntimeException("Unexpected 
transformed class type: " + pta[1].getClass().getName());
-                       }
-               }
-
-               this.normalClass = (Class<T>)t_normalClass;
-               this.swapClass = (Class<S>)t_swapClass;
+               normalClass = 
(Class<T>)ClassUtils.resolveParameterType(PojoSwap.class, 0, this);
+               swapClass = 
(Class<S>)ClassUtils.resolveParameterType(PojoSwap.class, 1, this);
        }
 
        /**

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/4fb01038/juneau-core/src/main/java/org/apache/juneau/transform/StringSwap.java
----------------------------------------------------------------------
diff --git 
a/juneau-core/src/main/java/org/apache/juneau/transform/StringSwap.java 
b/juneau-core/src/main/java/org/apache/juneau/transform/StringSwap.java
new file mode 100644
index 0000000..0d9b47d
--- /dev/null
+++ b/juneau-core/src/main/java/org/apache/juneau/transform/StringSwap.java
@@ -0,0 +1,35 @@
+// 
***************************************************************************************************************************
+// * 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.transform;
+
+import org.apache.juneau.*;
+import org.apache.juneau.parser.*;
+import org.apache.juneau.serializer.*;
+
+/**
+ * Abstract subclass for POJO swaps that swap objects for strings.
+ *
+ * @param <T> The normal form of the class.
+ */
+public abstract class StringSwap<T> extends PojoSwap<T,String> {
+
+       @Override /* PojoSwap */
+       public String swap(BeanSession session, T o) throws SerializeException {
+               return super.swap(session, o);
+       }
+
+       @Override /* PojoSwap */
+       public T unswap(BeanSession session, String f, ClassMeta<?> hint) 
throws ParseException {
+               return super.unswap(session, f, hint);
+       }
+}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/4fb01038/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 ad7c412..063f3c4 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
@@ -82,6 +82,11 @@
                <li>{@link org.apache.juneau.transform.BeanFilter} - Transforms 
that alter the way beans are handled.
                <li>{@link org.apache.juneau.transform.PojoSwap} - Transforms 
that swap non-serializable POJOs with serializable POJOs during serialization 
                        (and optionally vis-versa during parsing).
+                       <ol>
+                               <li>{@link 
org.apache.juneau.transform.StringSwap} - Convenience subclass for swaps that 
convert objects to strings.
+                               <li>{@link org.apache.juneau.transform.MapSwap} 
- Convenience subclass for swaps that convert objects to maps.
+                       </ol>
+               </li>
        </ul>
        <p>
                Transforms are added to serializers and parsers in a variety of 
ways:
@@ -426,7 +431,7 @@
                </p>
                <p class='bcode'>
        <jc>// Sample swap for converting Dates to ISO8601 strings.</jc>
-       <jk>public class</jk> MyDateSwap <jk>extends</jk> 
PojoSwap&lt;Date,String&gt; {
+       <jk>public class</jk> MyDateSwap <jk>extends</jk> 
StringSwap&lt;Date&gt; {
                
                <jc>// ISO8601 formatter.</jc>
                <jk>private</jk> DateFormat <jf>format</jf> = <jk>new</jk> 
SimpleDateFormat(<js>"yyyy-MM-dd'T'HH:mm:ssZ"</js>);
@@ -492,7 +497,7 @@
                        Another example of a <code>PojoSwap</code> is one that 
converts <code><jk>byte</jk>[]</code> arrays to BASE64-encoded strings:
                </p>
                <p class='bcode'>
-       <jk>public class</jk> ByteArrayBase64Swap <jk>extends</jk> 
PojoSwap&lt;<jk>byte</jk>[],String&gt; {
+       <jk>public class</jk> ByteArrayBase64Swap <jk>extends</jk> 
StringSwap&lt;<jk>byte</jk>[]&gt; {
        
                <ja>@Override</ja>
                <jk>public</jk> String swap(<jk>byte</jk>[] b) <jk>throws</jk> 
SerializeException {
@@ -556,7 +561,7 @@
                
                <h6 class='topic'>Valid swapped class types</h6>
                <p>
-                       The swapped class type can be any serializable class 
type as defined in the <a href='../package-summary.html#PojoCategories'>POJO 
categories</a> table.
+                       The swapped class type can be any serializable class 
type as defined in the <a 
href='../../../../overview-summary.html#Core.PojoCategories'>POJO 
categories</a> table.
                </p>
        </div>
        

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/4fb01038/juneau-core/src/main/java/org/apache/juneau/transforms/BeanStringSwap.java
----------------------------------------------------------------------
diff --git 
a/juneau-core/src/main/java/org/apache/juneau/transforms/BeanStringSwap.java 
b/juneau-core/src/main/java/org/apache/juneau/transforms/BeanStringSwap.java
index 68a68e0..f6d38f7 100644
--- a/juneau-core/src/main/java/org/apache/juneau/transforms/BeanStringSwap.java
+++ b/juneau-core/src/main/java/org/apache/juneau/transforms/BeanStringSwap.java
@@ -22,11 +22,11 @@ import org.apache.juneau.transform.*;
  *     being turned into Maps by the {@link BeanContext} (or worse, throwing 
{@link BeanRuntimeException BeanRuntimeExceptions}).
  * <p>
  *     This is usually a one-way transform.
- *     Beans serialized as strings cannot be reconstituted using a parser 
unless it is a <a class='doclink' 
href='../package-summary.html#PojoCategories'>Type 5 POJO</a>.
+ *     Beans serialized as strings cannot be reconstituted using a parser 
unless it is a <a class='doclink' 
href='../../../../overview-summary.html#Core.PojoCategories'>Type 5 POJO</a>.
  *
  * @param <T> The class type of the bean.
  */
-public class BeanStringSwap<T> extends PojoSwap<T,String> {
+public class BeanStringSwap<T> extends StringSwap<T> {
 
        /**
         * Converts the specified bean to a {@link String}.

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/4fb01038/juneau-core/src/main/java/org/apache/juneau/transforms/ByteArrayBase64Swap.java
----------------------------------------------------------------------
diff --git 
a/juneau-core/src/main/java/org/apache/juneau/transforms/ByteArrayBase64Swap.java
 
b/juneau-core/src/main/java/org/apache/juneau/transforms/ByteArrayBase64Swap.java
index 6f50488..2eea048 100644
--- 
a/juneau-core/src/main/java/org/apache/juneau/transforms/ByteArrayBase64Swap.java
+++ 
b/juneau-core/src/main/java/org/apache/juneau/transforms/ByteArrayBase64Swap.java
@@ -21,7 +21,7 @@ import org.apache.juneau.transform.*;
 /**
  * Transforms <code><jk>byte</jk>[]</code> arrays to BASE-64 encoded {@link 
String Strings}.
  */
-public class ByteArrayBase64Swap extends PojoSwap<byte[],String> {
+public class ByteArrayBase64Swap extends StringSwap<byte[]> {
 
        /**
         * Converts the specified <code><jk>byte</jk>[]</code> to a {@link 
String}.

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/4fb01038/juneau-core/src/main/java/org/apache/juneau/transforms/CalendarSwap.java
----------------------------------------------------------------------
diff --git 
a/juneau-core/src/main/java/org/apache/juneau/transforms/CalendarSwap.java 
b/juneau-core/src/main/java/org/apache/juneau/transforms/CalendarSwap.java
index 1d6a917..f6b1f3e 100644
--- a/juneau-core/src/main/java/org/apache/juneau/transforms/CalendarSwap.java
+++ b/juneau-core/src/main/java/org/apache/juneau/transforms/CalendarSwap.java
@@ -54,7 +54,7 @@ import org.apache.juneau.transform.*;
  *     <li>{@link DateTimeShort} - To {@link DateFormat#SHORT} date-time 
strings.
  * </ul>
  */
-public class CalendarSwap extends PojoSwap<Calendar,String> {
+public class CalendarSwap extends StringSwap<Calendar> {
 
        private static final TimeZone GMT = TimeZone.getTimeZone("GMT");
        private final int dateStyle, timeStyle;

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/4fb01038/juneau-core/src/main/java/org/apache/juneau/transforms/DateSwap.java
----------------------------------------------------------------------
diff --git 
a/juneau-core/src/main/java/org/apache/juneau/transforms/DateSwap.java 
b/juneau-core/src/main/java/org/apache/juneau/transforms/DateSwap.java
index 48fc66f..95673df 100644
--- a/juneau-core/src/main/java/org/apache/juneau/transforms/DateSwap.java
+++ b/juneau-core/src/main/java/org/apache/juneau/transforms/DateSwap.java
@@ -54,7 +54,7 @@ import org.apache.juneau.transform.*;
  *     <li>{@link DateTimeShort} - To {@link DateFormat#SHORT} date-time 
strings.
  * </ul>
  */
-public class DateSwap extends PojoSwap<Date,String> {
+public class DateSwap extends StringSwap<Date> {
 
        private static final TimeZone GMT = TimeZone.getTimeZone("GMT");
        private final int dateStyle, timeStyle;

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/4fb01038/juneau-core/src/main/java/org/apache/juneau/transforms/XMLGregorianCalendarSwap.java
----------------------------------------------------------------------
diff --git 
a/juneau-core/src/main/java/org/apache/juneau/transforms/XMLGregorianCalendarSwap.java
 
b/juneau-core/src/main/java/org/apache/juneau/transforms/XMLGregorianCalendarSwap.java
index 99a17b0..d29327e 100644
--- 
a/juneau-core/src/main/java/org/apache/juneau/transforms/XMLGregorianCalendarSwap.java
+++ 
b/juneau-core/src/main/java/org/apache/juneau/transforms/XMLGregorianCalendarSwap.java
@@ -27,7 +27,7 @@ import org.apache.juneau.transform.*;
  * <p>
  *     Strings are converted to objects using {@link 
DatatypeFactory#newXMLGregorianCalendar(String)}.
  */
-public class XMLGregorianCalendarSwap extends 
PojoSwap<XMLGregorianCalendar,String> {
+public class XMLGregorianCalendarSwap extends StringSwap<XMLGregorianCalendar> 
{
 
        private DatatypeFactory dtf;
 

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/4fb01038/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 28ba828..42d4ee8 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
@@ -89,7 +89,7 @@ public class UonParser extends ReaderParser {
                        eType = (ClassMeta<T>)object();
                PojoSwap<T,Object> transform = 
(PojoSwap<T,Object>)eType.getPojoSwap();
                ClassMeta<?> sType = eType.getSerializedClassMeta();
-               BeanDictionary bd = (pMeta == null ? 
session.getBeanDictionary() : pMeta.getBeanDictionary());
+               BeanRegistry breg = (pMeta == null ? session.getBeanRegistry() 
: pMeta.getBeanRegistry());
 
                Object o = null;
 
@@ -100,7 +100,7 @@ public class UonParser extends ReaderParser {
 
                if (c == -1 || c == AMP) {
                        // If parameter is blank and it's an array or 
collection, return an empty list.
-                       if (sType.isArray() || sType.isCollection())
+                       if (sType.isCollectionOrArray())
                                o = sType.newInstance();
                        else if (sType.isString() || sType.isObject())
                                o = "";
@@ -117,7 +117,7 @@ public class UonParser extends ReaderParser {
                        } else if (flag == 'o') {
                                ObjectMap m = new ObjectMap(session);
                                parseIntoMap(session, r, m, string(), object(), 
pMeta);
-                               o = bd.cast(m);
+                               o = breg.cast(m);
                        } else if (flag == 'a') {
                                Collection l = new ObjectList(session);
                                o = parseIntoCollection(session, r, l, 
sType.getElementType(), isUrlParamValue, pMeta);
@@ -142,7 +142,7 @@ public class UonParser extends ReaderParser {
                                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 = bd.cast(m);
+                                       o = breg.cast(m);
                                // 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));
@@ -173,7 +173,7 @@ public class UonParser extends ReaderParser {
                                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 = bd.cast(m);
+                                       o = breg.cast(m);
                                // Handle case where it's an array, but only a 
single value was specified.
                                else {
                                        ArrayList l = new ArrayList(1);
@@ -189,7 +189,7 @@ public class UonParser extends ReaderParser {
                        ObjectMap m = new ObjectMap(session);
                        parseIntoMap(session, r, m, string(), object(), pMeta);
                        if (m.containsKey(session.getBeanTypePropertyName()))
-                               o = bd.cast(m);
+                               o = breg.cast(m);
                        else
                                throw new ParseException(session, "Class 
''{0}'' could not be instantiated.  Reason: ''{1}''", 
sType.getInnerClass().getName(), sType.getNotABeanReason());
                } else {

Reply via email to