http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/6dccf603/juneau-core/src/main/java/org/apache/juneau/BeanPropertyMeta.java
----------------------------------------------------------------------
diff --git a/juneau-core/src/main/java/org/apache/juneau/BeanPropertyMeta.java 
b/juneau-core/src/main/java/org/apache/juneau/BeanPropertyMeta.java
index c8af40e..fd0f8b9 100644
--- a/juneau-core/src/main/java/org/apache/juneau/BeanPropertyMeta.java
+++ b/juneau-core/src/main/java/org/apache/juneau/BeanPropertyMeta.java
@@ -521,7 +521,7 @@ public class BeanPropertyMeta {
 
                                        Map valueMap = (Map)value;
                                        Map propMap = (Map)r;
-                                               ClassMeta<?> valueType = 
rawTypeMeta.getValueType();
+                                       ClassMeta<?> valueType = 
rawTypeMeta.getValueType();
 
                                        // If the property type is abstract, 
then we either need to reuse the existing
                                        // map (if it's not null), or try to 
assign the value directly.
@@ -546,7 +546,6 @@ public class BeanPropertyMeta {
                                        } else {
                                                if (propMap == null) {
                                                        propMap = 
newInstance(Map.class, propertyClass);
-                                                       invokeSetter(bean, 
pName, propMap);
                                                } else {
                                                        propMap.clear();
                                                }
@@ -560,6 +559,8 @@ public class BeanPropertyMeta {
                                                        v = 
session.convertToType(v, valueType);
                                                propMap.put(k, v);
                                        }
+                                       if (setter != null || field != null)
+                                               invokeSetter(bean, pName, 
propMap);
 
                                } else if (isCollection) {
 

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/6dccf603/juneau-core/src/main/java/org/apache/juneau/dto/atom/AtomBuilder.java
----------------------------------------------------------------------
diff --git 
a/juneau-core/src/main/java/org/apache/juneau/dto/atom/AtomBuilder.java 
b/juneau-core/src/main/java/org/apache/juneau/dto/atom/AtomBuilder.java
index d1bccc3..512f64b 100644
--- a/juneau-core/src/main/java/org/apache/juneau/dto/atom/AtomBuilder.java
+++ b/juneau-core/src/main/java/org/apache/juneau/dto/atom/AtomBuilder.java
@@ -15,6 +15,8 @@ package org.apache.juneau.dto.atom;
 import java.net.*;
 import java.util.*;
 
+import org.apache.juneau.*;
+
 /**
  * Various useful static methods for creating ATOM elements.
  * <p>
@@ -130,22 +132,17 @@ public class AtomBuilder {
        }
 
        /**
-        * Creates an {@link Icon} element with the specified {@link 
Icon#uri(URI)} attribute.
-        *
-        * @param uri The {@link Icon#uri(URI)} attribute.
-        * @return The new element.
-        */
-       public static final Icon icon(String uri) {
-               return new Icon(uri);
-       }
-
-       /**
-        * Creates an {@link Icon} element with the specified {@link 
Icon#uri(URI)} attribute.
+        * Creates an {@link Icon} element with the specified {@link 
Icon#uri(Object)} attribute.
+        * <p>
+        * The value can be of any of the following types: {@link URI}, {@link 
URL}, {@link String}.
+        * Strings must be valid URIs.
+        * <p>
+        * URIs defined by {@link UriResolver} can be used for values.
         *
-        * @param uri The {@link Icon#uri(URI)} attribute.
+        * @param uri The {@link Icon#uri(Object)} attribute.
         * @return The new element.
         */
-       public static final Icon icon(URI uri) {
+       public static final Icon icon(Object uri) {
                return new Icon(uri);
        }
 
@@ -172,22 +169,17 @@ public class AtomBuilder {
        }
 
        /**
-        * Creates a {@link Logo} element with the specified {@link 
Logo#uri(URI)} attribute.
-        *
-        * @param uri The {@link Logo#uri(URI)} attribute.
-        * @return The new element.
-        */
-       public static final Logo logo(String uri) {
-               return new Logo(uri);
-       }
-
-       /**
-        * Creates a {@link Logo} element with the specified {@link 
Logo#uri(URI)} attribute.
+        * Creates a {@link Logo} element with the specified {@link 
Logo#uri(Object)} attribute.
+        * <p>
+        * The value can be of any of the following types: {@link URI}, {@link 
URL}, {@link String}.
+        * Strings must be valid URIs.
+        * <p>
+        * URIs defined by {@link UriResolver} can be used for values.
         *
-        * @param uri The {@link Logo#uri(URI)} attribute.
+        * @param uri The {@link Logo#uri(Object)} attribute.
         * @return The new element.
         */
-       public static final Logo logo(URI uri) {
+       public static final Logo logo(Object uri) {
                return new Logo(uri);
        }
 

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/6dccf603/juneau-core/src/main/java/org/apache/juneau/dto/atom/Category.java
----------------------------------------------------------------------
diff --git a/juneau-core/src/main/java/org/apache/juneau/dto/atom/Category.java 
b/juneau-core/src/main/java/org/apache/juneau/dto/atom/Category.java
index 58a77f2..4fd9b3c 100644
--- a/juneau-core/src/main/java/org/apache/juneau/dto/atom/Category.java
+++ b/juneau-core/src/main/java/org/apache/juneau/dto/atom/Category.java
@@ -12,10 +12,13 @@
 // 
***************************************************************************************************************************
 package org.apache.juneau.dto.atom;
 
+import static org.apache.juneau.internal.StringUtils.*;
 import static org.apache.juneau.xml.annotation.XmlFormat.*;
 
+import java.net.*;
 import java.net.URI;
 
+import org.apache.juneau.*;
 import org.apache.juneau.annotation.*;
 import org.apache.juneau.xml.annotation.*;
 
@@ -99,13 +102,18 @@ public class Category extends Common {
 
        /**
         * Sets the category scheme.
+        * <p>
+        * The value can be of any of the following types: {@link URI}, {@link 
URL}, {@link String}.
+        * Strings must be valid URIs.
+        * <p>
+        * URIs defined by {@link UriResolver} can be used for values.
         *
         * @param scheme The category scheme.
         * @return This object (for method chaining).
         */
        @BeanProperty("scheme")
-       public Category scheme(URI scheme) {
-               this.scheme = scheme;
+       public Category scheme(Object scheme) {
+               this.scheme = toURI(scheme);
                return this;
        }
 
@@ -137,7 +145,7 @@ public class Category extends Common {
        
//--------------------------------------------------------------------------------
 
        @Override /* Common */
-       public Category base(URI base) {
+       public Category base(Object base) {
                super.base(base);
                return this;
        }

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/6dccf603/juneau-core/src/main/java/org/apache/juneau/dto/atom/Common.java
----------------------------------------------------------------------
diff --git a/juneau-core/src/main/java/org/apache/juneau/dto/atom/Common.java 
b/juneau-core/src/main/java/org/apache/juneau/dto/atom/Common.java
index b9eea2b..08b510b 100644
--- a/juneau-core/src/main/java/org/apache/juneau/dto/atom/Common.java
+++ b/juneau-core/src/main/java/org/apache/juneau/dto/atom/Common.java
@@ -12,11 +12,13 @@
 // 
***************************************************************************************************************************
 package org.apache.juneau.dto.atom;
 
-import static org.apache.juneau.dto.atom.Utils.*;
+import static org.apache.juneau.internal.StringUtils.*;
 import static org.apache.juneau.xml.annotation.XmlFormat.*;
 
+import java.net.*;
 import java.net.URI;
 
+import org.apache.juneau.*;
 import org.apache.juneau.annotation.*;
 import org.apache.juneau.xml.annotation.*;
 
@@ -63,23 +65,17 @@ public abstract class Common {
 
        /**
         * Sets the URI base of this object.
+        * <p>
+        * The value can be of any of the following types: {@link URI}, {@link 
URL}, {@link String}.
+        * Strings must be valid URIs.
+        * <p>
+        * URIs defined by {@link UriResolver} can be used for values.
         *
         * @param base The URI base of this object.
         * @return This object (for method chaining).
         */
        @BeanProperty("base")
-       public Common base(URI base) {
-               this.base = base;
-               return this;
-       }
-
-       /**
-        * Sets the URI base of this object.
-        *
-        * @param base The URI base of this object.
-        * @return This object (for method chaining).
-        */
-       public Common base(String base) {
+       public Common base(Object base) {
                this.base = toURI(base);
                return this;
        }

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/6dccf603/juneau-core/src/main/java/org/apache/juneau/dto/atom/Content.java
----------------------------------------------------------------------
diff --git a/juneau-core/src/main/java/org/apache/juneau/dto/atom/Content.java 
b/juneau-core/src/main/java/org/apache/juneau/dto/atom/Content.java
index 4801b03..c8cd0f2 100644
--- a/juneau-core/src/main/java/org/apache/juneau/dto/atom/Content.java
+++ b/juneau-core/src/main/java/org/apache/juneau/dto/atom/Content.java
@@ -12,10 +12,13 @@
 // 
***************************************************************************************************************************
 package org.apache.juneau.dto.atom;
 
+import static org.apache.juneau.internal.StringUtils.*;
 import static org.apache.juneau.xml.annotation.XmlFormat.*;
 
+import java.net.*;
 import java.net.URI;
 
+import org.apache.juneau.*;
 import org.apache.juneau.annotation.*;
 import org.apache.juneau.xml.annotation.*;
 
@@ -108,13 +111,18 @@ public class Content extends Text {
 
        /**
         * Sets the source URI.
+        * <p>
+        * The value can be of any of the following types: {@link URI}, {@link 
URL}, {@link String}.
+        * Strings must be valid URIs.
+        * <p>
+        * URIs defined by {@link UriResolver} can be used for values.
         *
         * @param src The source URI.
         * @return This object (for method chaining).
         */
        @BeanProperty("src")
-       public Content src(URI src) {
-               this.src = src;
+       public Content src(Object src) {
+               this.src = toURI(src);
                return this;
        }
 
@@ -136,17 +144,10 @@ public class Content extends Text {
        }
 
        @Override /* Common */
-       public Content base(URI base) {
+       public Content base(Object base) {
                super.base(base);
                return this;
        }
-
-       @Override /* Common */
-       public Content base(String base) {
-               super.base(base);
-               return this;
-       }
-
        @Override /* Common */
        public Content lang(String lang) {
                super.lang(lang);

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/6dccf603/juneau-core/src/main/java/org/apache/juneau/dto/atom/Entry.java
----------------------------------------------------------------------
diff --git a/juneau-core/src/main/java/org/apache/juneau/dto/atom/Entry.java 
b/juneau-core/src/main/java/org/apache/juneau/dto/atom/Entry.java
index 211fa99..251a3d6 100644
--- a/juneau-core/src/main/java/org/apache/juneau/dto/atom/Entry.java
+++ b/juneau-core/src/main/java/org/apache/juneau/dto/atom/Entry.java
@@ -14,7 +14,6 @@ package org.apache.juneau.dto.atom;
 
 import static org.apache.juneau.dto.atom.Utils.*;
 
-import java.net.URI;
 import java.util.*;
 
 import org.apache.juneau.annotation.*;
@@ -273,7 +272,7 @@ public class Entry extends CommonEntry {
        }
 
        @Override /* Common */
-       public Entry base(URI base) {
+       public Entry base(Object base) {
                super.base(base);
                return this;
        }

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/6dccf603/juneau-core/src/main/java/org/apache/juneau/dto/atom/Feed.java
----------------------------------------------------------------------
diff --git a/juneau-core/src/main/java/org/apache/juneau/dto/atom/Feed.java 
b/juneau-core/src/main/java/org/apache/juneau/dto/atom/Feed.java
index 9c8614e..0adc465 100644
--- a/juneau-core/src/main/java/org/apache/juneau/dto/atom/Feed.java
+++ b/juneau-core/src/main/java/org/apache/juneau/dto/atom/Feed.java
@@ -14,7 +14,6 @@ package org.apache.juneau.dto.atom;
 
 import static org.apache.juneau.xml.annotation.XmlFormat.*;
 
-import java.net.URI;
 import java.util.*;
 
 import org.apache.juneau.annotation.*;
@@ -286,7 +285,7 @@ public class Feed extends CommonEntry {
        }
 
        @Override /* Common */
-       public Feed base(URI base) {
+       public Feed base(Object base) {
                super.base(base);
                return this;
        }

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/6dccf603/juneau-core/src/main/java/org/apache/juneau/dto/atom/Generator.java
----------------------------------------------------------------------
diff --git 
a/juneau-core/src/main/java/org/apache/juneau/dto/atom/Generator.java 
b/juneau-core/src/main/java/org/apache/juneau/dto/atom/Generator.java
index be879f3..0d16ff6 100644
--- a/juneau-core/src/main/java/org/apache/juneau/dto/atom/Generator.java
+++ b/juneau-core/src/main/java/org/apache/juneau/dto/atom/Generator.java
@@ -12,11 +12,13 @@
 // 
***************************************************************************************************************************
 package org.apache.juneau.dto.atom;
 
-import static org.apache.juneau.dto.atom.Utils.*;
+import static org.apache.juneau.internal.StringUtils.*;
 import static org.apache.juneau.xml.annotation.XmlFormat.*;
 
+import java.net.*;
 import java.net.URI;
 
+import org.apache.juneau.*;
 import org.apache.juneau.annotation.*;
 import org.apache.juneau.xml.annotation.*;
 
@@ -80,24 +82,17 @@ public class Generator extends Common {
 
        /**
         * Sets the URI of this generator statement.
+        * <p>
+        * The value can be of any of the following types: {@link URI}, {@link 
URL}, {@link String}.
+        * Strings must be valid URIs.
+        * <p>
+        * URIs defined by {@link UriResolver} can be used for values.
         *
         * @param uri The URI of this generator statement.
         * @return This object (for method chaining).
         */
        @BeanProperty("uri")
-       public Generator uri(URI uri) {
-               this.uri = uri;
-               return this;
-       }
-
-       /**
-        * Sets the URI of this generator statement.
-        *
-        * @param uri The URI of this generator statement.
-        * @return This object (for method chaining).
-        */
-       @BeanProperty("uri")
-       public Generator uri(String uri) {
+       public Generator uri(Object uri) {
                this.uri = toURI(uri);
                return this;
        }
@@ -152,7 +147,7 @@ public class Generator extends Common {
        
//--------------------------------------------------------------------------------
 
        @Override /* Common */
-       public Generator base(URI base) {
+       public Generator base(Object base) {
                super.base(base);
                return this;
        }

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/6dccf603/juneau-core/src/main/java/org/apache/juneau/dto/atom/Icon.java
----------------------------------------------------------------------
diff --git a/juneau-core/src/main/java/org/apache/juneau/dto/atom/Icon.java 
b/juneau-core/src/main/java/org/apache/juneau/dto/atom/Icon.java
index a537163..37f0f03 100644
--- a/juneau-core/src/main/java/org/apache/juneau/dto/atom/Icon.java
+++ b/juneau-core/src/main/java/org/apache/juneau/dto/atom/Icon.java
@@ -12,11 +12,13 @@
 // 
***************************************************************************************************************************
 package org.apache.juneau.dto.atom;
 
-import static org.apache.juneau.dto.atom.Utils.*;
+import static org.apache.juneau.internal.StringUtils.*;
 import static org.apache.juneau.xml.annotation.XmlFormat.*;
 
+import java.net.*;
 import java.net.URI;
 
+import org.apache.juneau.*;
 import org.apache.juneau.annotation.*;
 import org.apache.juneau.xml.annotation.*;
 
@@ -49,19 +51,15 @@ public class Icon extends Common {
 
        /**
         * Normal constructor.
+        * <p>
+        * The value can be of any of the following types: {@link URI}, {@link 
URL}, {@link String}.
+        * Strings must be valid URIs.
+        * <p>
+        * URIs defined by {@link UriResolver} can be used for values.
         *
         * @param uri The URI of the icon.
         */
-       public Icon(URI uri) {
-               uri(uri);
-       }
-
-       /**
-        * Normal constructor.
-        *
-        * @param uri The URI of the icon.
-        */
-       public Icon(String uri) {
+       public Icon(Object uri) {
                uri(uri);
        }
 
@@ -85,24 +83,17 @@ public class Icon extends Common {
 
        /**
         * Sets the URI of this icon.
+        * <p>
+        * The value can be of any of the following types: {@link URI}, {@link 
URL}, {@link String}.
+        * Strings must be valid URIs.
+        * <p>
+        * URIs defined by {@link UriResolver} can be used for values.
         *
         * @param uri The URI of this icon.
         * @return This object (for method chaining).
         */
        @BeanProperty("uri")
-       public Icon uri(URI uri) {
-               this.uri = uri;
-               return this;
-       }
-
-       /**
-        * Sets the URI of this icon.
-        *
-        * @param uri The URI of this icon.
-        * @return This object (for method chaining).
-        */
-       @BeanProperty("uri")
-       public Icon uri(String uri) {
+       public Icon uri(Object uri) {
                this.uri = toURI(uri);
                return this;
        }
@@ -113,7 +104,7 @@ public class Icon extends Common {
        
//--------------------------------------------------------------------------------
 
        @Override /* Common */
-       public Icon base(URI base) {
+       public Icon base(Object base) {
                super.base(base);
                return this;
        }

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/6dccf603/juneau-core/src/main/java/org/apache/juneau/dto/atom/Id.java
----------------------------------------------------------------------
diff --git a/juneau-core/src/main/java/org/apache/juneau/dto/atom/Id.java 
b/juneau-core/src/main/java/org/apache/juneau/dto/atom/Id.java
index 5cf4f30..ca64b85 100644
--- a/juneau-core/src/main/java/org/apache/juneau/dto/atom/Id.java
+++ b/juneau-core/src/main/java/org/apache/juneau/dto/atom/Id.java
@@ -14,8 +14,6 @@ package org.apache.juneau.dto.atom;
 
 import static org.apache.juneau.xml.annotation.XmlFormat.*;
 
-import java.net.URI;
-
 import org.apache.juneau.annotation.*;
 import org.apache.juneau.xml.annotation.*;
 
@@ -90,7 +88,7 @@ public class Id extends Common {
        
//--------------------------------------------------------------------------------
 
        @Override /* Common */
-       public Id base(URI base) {
+       public Id base(Object base) {
                super.base(base);
                return this;
        }

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/6dccf603/juneau-core/src/main/java/org/apache/juneau/dto/atom/Link.java
----------------------------------------------------------------------
diff --git a/juneau-core/src/main/java/org/apache/juneau/dto/atom/Link.java 
b/juneau-core/src/main/java/org/apache/juneau/dto/atom/Link.java
index df93a9c..6d80912 100644
--- a/juneau-core/src/main/java/org/apache/juneau/dto/atom/Link.java
+++ b/juneau-core/src/main/java/org/apache/juneau/dto/atom/Link.java
@@ -14,8 +14,6 @@ package org.apache.juneau.dto.atom;
 
 import static org.apache.juneau.xml.annotation.XmlFormat.*;
 
-import java.net.URI;
-
 import org.apache.juneau.annotation.*;
 import org.apache.juneau.xml.annotation.*;
 
@@ -223,7 +221,7 @@ public class Link extends Common {
        
//--------------------------------------------------------------------------------
 
        @Override /* Common */
-       public Link base(URI base) {
+       public Link base(Object base) {
                super.base(base);
                return this;
        }

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/6dccf603/juneau-core/src/main/java/org/apache/juneau/dto/atom/Logo.java
----------------------------------------------------------------------
diff --git a/juneau-core/src/main/java/org/apache/juneau/dto/atom/Logo.java 
b/juneau-core/src/main/java/org/apache/juneau/dto/atom/Logo.java
index fe61a62..8f648cc 100644
--- a/juneau-core/src/main/java/org/apache/juneau/dto/atom/Logo.java
+++ b/juneau-core/src/main/java/org/apache/juneau/dto/atom/Logo.java
@@ -12,11 +12,13 @@
 // 
***************************************************************************************************************************
 package org.apache.juneau.dto.atom;
 
-import static org.apache.juneau.dto.atom.Utils.*;
+import static org.apache.juneau.internal.StringUtils.*;
 import static org.apache.juneau.xml.annotation.XmlFormat.*;
 
+import java.net.*;
 import java.net.URI;
 
+import org.apache.juneau.*;
 import org.apache.juneau.annotation.*;
 import org.apache.juneau.xml.annotation.*;
 
@@ -49,19 +51,15 @@ public class Logo extends Common {
 
        /**
         * Normal constructor.
+        * <p>
+        * The value can be of any of the following types: {@link URI}, {@link 
URL}, {@link String}.
+        * Strings must be valid URIs.
+        * <p>
+        * URIs defined by {@link UriResolver} can be used for values.
         *
         * @param uri The URI of the logo.
         */
-       public Logo(URI uri) {
-               uri(uri);
-       }
-
-       /**
-        * Normal constructor.
-        *
-        * @param uri The URI of the logo.
-        */
-       public Logo(String uri) {
+       public Logo(Object uri) {
                uri(uri);
        }
 
@@ -85,24 +83,17 @@ public class Logo extends Common {
 
        /**
         * Sets the URI of the logo.
+        * <p>
+        * The value can be of any of the following types: {@link URI}, {@link 
URL}, {@link String}.
+        * Strings must be valid URIs.
+        * <p>
+        * URIs defined by {@link UriResolver} can be used for values.
         *
         * @param uri The URI of the logo.
         * @return This object (for method chaining).
         */
        @BeanProperty("uri")
-       public Logo uri(URI uri) {
-               this.uri = uri;
-               return this;
-       }
-
-       /**
-        * Sets the URI of the logo.
-        *
-        * @param uri The URI of the logo.
-        * @return This object (for method chaining).
-        */
-       @BeanProperty("uri")
-       public Logo uri(String uri) {
+       public Logo uri(Object uri) {
                this.uri = toURI(uri);
                return this;
        }
@@ -113,7 +104,7 @@ public class Logo extends Common {
        
//--------------------------------------------------------------------------------
 
        @Override /* Common */
-       public Logo base(URI base) {
+       public Logo base(Object base) {
                super.base(base);
                return this;
        }

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/6dccf603/juneau-core/src/main/java/org/apache/juneau/dto/atom/Person.java
----------------------------------------------------------------------
diff --git a/juneau-core/src/main/java/org/apache/juneau/dto/atom/Person.java 
b/juneau-core/src/main/java/org/apache/juneau/dto/atom/Person.java
index 34d28e3..aa5c336 100644
--- a/juneau-core/src/main/java/org/apache/juneau/dto/atom/Person.java
+++ b/juneau-core/src/main/java/org/apache/juneau/dto/atom/Person.java
@@ -12,10 +12,13 @@
 // 
***************************************************************************************************************************
 package org.apache.juneau.dto.atom;
 
-import static org.apache.juneau.dto.atom.Utils.*;
+import static org.apache.juneau.internal.StringUtils.*;
 
+import java.net.*;
 import java.net.URI;
 
+import org.apache.juneau.*;
+
 import org.apache.juneau.annotation.*;
 
 /**
@@ -97,24 +100,17 @@ public class Person extends Common {
 
        /**
         * Sets the URI of the person.
+        * <p>
+        * The value can be of any of the following types: {@link URI}, {@link 
URL}, {@link String}.
+        * Strings must be valid URIs.
+        * <p>
+        * URIs defined by {@link UriResolver} can be used for values.
         *
         * @param uri The URI of the person.
         * @return This object (for method chaining).
         */
        @BeanProperty("uri")
-       public Person uri(URI uri) {
-               this.uri = uri;
-               return this;
-       }
-
-       /**
-        * Sets the URI of the person.
-        *
-        * @param uri The URI of the person.
-        * @return This object (for method chaining).
-        */
-       @BeanProperty("uri")
-       public Person uri(String uri) {
+       public Person uri(Object uri) {
                this.uri = toURI(uri);
                return this;
        }
@@ -146,7 +142,7 @@ public class Person extends Common {
        
//--------------------------------------------------------------------------------
 
        @Override /* Common */
-       public Person base(URI base) {
+       public Person base(Object base) {
                super.base(base);
                return this;
        }

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/6dccf603/juneau-core/src/main/java/org/apache/juneau/dto/atom/Source.java
----------------------------------------------------------------------
diff --git a/juneau-core/src/main/java/org/apache/juneau/dto/atom/Source.java 
b/juneau-core/src/main/java/org/apache/juneau/dto/atom/Source.java
index 187f0b0..901be93 100644
--- a/juneau-core/src/main/java/org/apache/juneau/dto/atom/Source.java
+++ b/juneau-core/src/main/java/org/apache/juneau/dto/atom/Source.java
@@ -12,7 +12,6 @@
 // 
***************************************************************************************************************************
 package org.apache.juneau.dto.atom;
 
-import java.net.URI;
 import java.util.*;
 
 import org.apache.juneau.annotation.*;
@@ -231,7 +230,7 @@ public class Source extends CommonEntry {
        }
 
        @Override /* Common */
-       public Source base(URI base) {
+       public Source base(Object base) {
                super.base(base);
                return this;
        }

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/6dccf603/juneau-core/src/main/java/org/apache/juneau/dto/atom/Text.java
----------------------------------------------------------------------
diff --git a/juneau-core/src/main/java/org/apache/juneau/dto/atom/Text.java 
b/juneau-core/src/main/java/org/apache/juneau/dto/atom/Text.java
index 40957e0..d38c823 100644
--- a/juneau-core/src/main/java/org/apache/juneau/dto/atom/Text.java
+++ b/juneau-core/src/main/java/org/apache/juneau/dto/atom/Text.java
@@ -14,8 +14,6 @@ package org.apache.juneau.dto.atom;
 
 import static org.apache.juneau.xml.annotation.XmlFormat.*;
 
-import java.net.URI;
-
 import org.apache.juneau.annotation.*;
 import org.apache.juneau.xml.annotation.*;
 
@@ -133,13 +131,7 @@ public class Text extends Common {
        
//--------------------------------------------------------------------------------
 
        @Override /* Common */
-       public Text base(URI base) {
-               super.base(base);
-               return this;
-       }
-
-       @Override /* Common */
-       public Text base(String base) {
+       public Text base(Object base) {
                super.base(base);
                return this;
        }

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/6dccf603/juneau-core/src/main/java/org/apache/juneau/dto/atom/Utils.java
----------------------------------------------------------------------
diff --git a/juneau-core/src/main/java/org/apache/juneau/dto/atom/Utils.java 
b/juneau-core/src/main/java/org/apache/juneau/dto/atom/Utils.java
index 80f80a6..6bedd91 100644
--- a/juneau-core/src/main/java/org/apache/juneau/dto/atom/Utils.java
+++ b/juneau-core/src/main/java/org/apache/juneau/dto/atom/Utils.java
@@ -12,7 +12,6 @@
 // 
***************************************************************************************************************************
 package org.apache.juneau.dto.atom;
 
-import java.net.*;
 import java.util.*;
 
 import javax.xml.bind.*;
@@ -32,20 +31,6 @@ import javax.xml.bind.*;
 class Utils {
 
        /**
-        * Converts a string to a URI without a {@link URISyntaxException}
-        *
-        * @param uri The URI string to convert.
-        * @return A new URI object.
-        */
-       static final URI toURI(String uri) {
-               try {
-                       return new URI(uri);
-               } catch (URISyntaxException e) {
-                       throw new RuntimeException(e);
-               }
-       }
-
-       /**
         * Converts an ISO8601 date-time string to a {@link Calendar}.
         *
         * @param lexicalXSDDateTime The ISO8601 date-time string.

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/6dccf603/juneau-core/src/main/java/org/apache/juneau/dto/html5/A.java
----------------------------------------------------------------------
diff --git a/juneau-core/src/main/java/org/apache/juneau/dto/html5/A.java 
b/juneau-core/src/main/java/org/apache/juneau/dto/html5/A.java
index 795f256..07a4a00 100644
--- a/juneau-core/src/main/java/org/apache/juneau/dto/html5/A.java
+++ b/juneau-core/src/main/java/org/apache/juneau/dto/html5/A.java
@@ -14,7 +14,9 @@ package org.apache.juneau.dto.html5;
 
 
 import java.net.*;
+import java.net.URI;
 
+import org.apache.juneau.*;
 import org.apache.juneau.annotation.*;
 
 /**
@@ -46,12 +48,18 @@ public class A extends HtmlElementMixed {
        /**
         * <a class="doclink" 
href="https://www.w3.org/TR/html5/links.html#attr-hyperlink-href";>href</a> 
attribute.
         * Address of the hyperlink.
+        * <p>
+        * The value can be of any of the following types: {@link URI}, {@link 
URL}, {@link String}.
+        * Strings must be valid URIs.
+        * <p>
+        * URIs defined by {@link UriResolver} can be used for values.
+        *
         * @param href The new value for this attribute.
         * Typically a {@link URL} or {@link String}.
         * @return This object (for method chaining).
         */
        public final A href(Object href) {
-               attr("href", href);
+               attrUri("href", href);
                return this;
        }
 

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/6dccf603/juneau-core/src/main/java/org/apache/juneau/dto/html5/Area.java
----------------------------------------------------------------------
diff --git a/juneau-core/src/main/java/org/apache/juneau/dto/html5/Area.java 
b/juneau-core/src/main/java/org/apache/juneau/dto/html5/Area.java
index 2ab1eef..ad6f335 100644
--- a/juneau-core/src/main/java/org/apache/juneau/dto/html5/Area.java
+++ b/juneau-core/src/main/java/org/apache/juneau/dto/html5/Area.java
@@ -13,7 +13,9 @@
 package org.apache.juneau.dto.html5;
 
 import java.net.*;
+import java.net.URI;
 
+import org.apache.juneau.*;
 import org.apache.juneau.annotation.*;
 
 /**
@@ -68,12 +70,18 @@ public class Area extends HtmlElementVoid {
        /**
         * <a class="doclink" 
href="https://www.w3.org/TR/html5/links.html#attr-hyperlink-href";>href</a> 
attribute.
         * Address of the hyperlink.
+        * <p>
+        * The value can be of any of the following types: {@link URI}, {@link 
URL}, {@link String}.
+        * Strings must be valid URIs.
+        * <p>
+        * URIs defined by {@link UriResolver} can be used for values.
+        *
         * @param href The new value for this attribute.
         * Typically a {@link URL} or {@link String}.
         * @return This object (for method chaining).
         */
        public final Area href(Object href) {
-               attr("href", href);
+               attrUri("href", href);
                return this;
        }
 

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/6dccf603/juneau-core/src/main/java/org/apache/juneau/dto/html5/Audio.java
----------------------------------------------------------------------
diff --git a/juneau-core/src/main/java/org/apache/juneau/dto/html5/Audio.java 
b/juneau-core/src/main/java/org/apache/juneau/dto/html5/Audio.java
index 3caa1b7..b5fef05 100644
--- a/juneau-core/src/main/java/org/apache/juneau/dto/html5/Audio.java
+++ b/juneau-core/src/main/java/org/apache/juneau/dto/html5/Audio.java
@@ -13,7 +13,9 @@
 package org.apache.juneau.dto.html5;
 
 import java.net.*;
+import java.net.URI;
 
+import org.apache.juneau.*;
 import org.apache.juneau.annotation.*;
 
 /**
@@ -115,12 +117,18 @@ public class Audio extends HtmlElementContainer {
        /**
         * <a class="doclink" 
href="https://www.w3.org/TR/html5/embedded-content-0.html#attr-media-src";>src</a>
 attribute.
         * Address of the resource.
+        * <p>
+        * The value can be of any of the following types: {@link URI}, {@link 
URL}, {@link String}.
+        * Strings must be valid URIs.
+        * <p>
+        * URIs defined by {@link UriResolver} can be used for values.
+        *
         * @param src The new value for this attribute.
         * Typically a {@link URL} or {@link String}.
         * @return This object (for method chaining).
         */
        public final Audio src(Object src) {
-               attr("src", src);
+               attrUri("src", src);
                return this;
        }
 

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/6dccf603/juneau-core/src/main/java/org/apache/juneau/dto/html5/Base.java
----------------------------------------------------------------------
diff --git a/juneau-core/src/main/java/org/apache/juneau/dto/html5/Base.java 
b/juneau-core/src/main/java/org/apache/juneau/dto/html5/Base.java
index 2dc1314..1618c86 100644
--- a/juneau-core/src/main/java/org/apache/juneau/dto/html5/Base.java
+++ b/juneau-core/src/main/java/org/apache/juneau/dto/html5/Base.java
@@ -13,7 +13,9 @@
 package org.apache.juneau.dto.html5;
 
 import java.net.*;
+import java.net.URI;
 
+import org.apache.juneau.*;
 import org.apache.juneau.annotation.*;
 
 /**
@@ -34,12 +36,18 @@ public class Base extends HtmlElementVoid {
        /**
         * <a class="doclink" 
href="https://www.w3.org/TR/html5/document-metadata.html#attr-base-href";>href</a>
 attribute.
         * Document base URL.
+        * <p>
+        * The value can be of any of the following types: {@link URI}, {@link 
URL}, {@link String}.
+        * Strings must be valid URIs.
+        * <p>
+        * URIs defined by {@link UriResolver} can be used for values.
+        *
         * @param href The new value for this attribute.
         * Typically a {@link URL} or {@link String}.
         * @return This object (for method chaining).
         */
        public final Base href(Object href) {
-               attr("href", href);
+               attrUri("href", href);
                return this;
        }
 

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/6dccf603/juneau-core/src/main/java/org/apache/juneau/dto/html5/Button.java
----------------------------------------------------------------------
diff --git a/juneau-core/src/main/java/org/apache/juneau/dto/html5/Button.java 
b/juneau-core/src/main/java/org/apache/juneau/dto/html5/Button.java
index b122243..11fa930 100644
--- a/juneau-core/src/main/java/org/apache/juneau/dto/html5/Button.java
+++ b/juneau-core/src/main/java/org/apache/juneau/dto/html5/Button.java
@@ -12,6 +12,10 @@
 // 
***************************************************************************************************************************
 package org.apache.juneau.dto.html5;
 
+import java.net.*;
+import java.net.URI;
+
+import org.apache.juneau.*;
 import org.apache.juneau.annotation.*;
 
 /**
@@ -67,11 +71,17 @@ public class Button extends HtmlElementMixed {
        /**
         * <a class="doclink" 
href="https://www.w3.org/TR/html5/forms.html#attr-fs-formaction";>formaction</a> 
attribute.
         * URL to use for form submission.
+        * <p>
+        * The value can be of any of the following types: {@link URI}, {@link 
URL}, {@link String}.
+        * Strings must be valid URIs.
+        * <p>
+        * URIs defined by {@link UriResolver} can be used for values.
+        *
         * @param formaction The new value for this attribute.
         * @return This object (for method chaining).
         */
        public final Button formaction(String formaction) {
-               attr("formaction", formaction);
+               attrUri("formaction", formaction);
                return this;
        }
 

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/6dccf603/juneau-core/src/main/java/org/apache/juneau/dto/html5/Embed.java
----------------------------------------------------------------------
diff --git a/juneau-core/src/main/java/org/apache/juneau/dto/html5/Embed.java 
b/juneau-core/src/main/java/org/apache/juneau/dto/html5/Embed.java
index 18a1e26..1e1e6fa 100644
--- a/juneau-core/src/main/java/org/apache/juneau/dto/html5/Embed.java
+++ b/juneau-core/src/main/java/org/apache/juneau/dto/html5/Embed.java
@@ -13,7 +13,9 @@
 package org.apache.juneau.dto.html5;
 
 import java.net.*;
+import java.net.URI;
 
+import org.apache.juneau.*;
 import org.apache.juneau.annotation.*;
 
 /**
@@ -46,12 +48,18 @@ public class Embed extends HtmlElementVoid {
        /**
         * <a class="doclink" 
href="https://www.w3.org/TR/html5/embedded-content-0.html#attr-embed-src";>src</a>
 attribute.
         * Address of the resource.
+        * <p>
+        * The value can be of any of the following types: {@link URI}, {@link 
URL}, {@link String}.
+        * Strings must be valid URIs.
+        * <p>
+        * URIs defined by {@link UriResolver} can be used for values.
+        *
         * @param src The new value for this attribute.
         * Typically a {@link URL} or {@link String}.
         * @return This object (for method chaining).
         */
        public final Embed src(Object src) {
-               attr("src", src);
+               attrUri("src", src);
                return this;
        }
 

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/6dccf603/juneau-core/src/main/java/org/apache/juneau/dto/html5/Form.java
----------------------------------------------------------------------
diff --git a/juneau-core/src/main/java/org/apache/juneau/dto/html5/Form.java 
b/juneau-core/src/main/java/org/apache/juneau/dto/html5/Form.java
index dddd0e9..e8b517a 100644
--- a/juneau-core/src/main/java/org/apache/juneau/dto/html5/Form.java
+++ b/juneau-core/src/main/java/org/apache/juneau/dto/html5/Form.java
@@ -12,6 +12,10 @@
 // 
***************************************************************************************************************************
 package org.apache.juneau.dto.html5;
 
+import java.net.*;
+import java.net.URI;
+
+import org.apache.juneau.*;
 import org.apache.juneau.annotation.*;
 
 /**
@@ -43,11 +47,17 @@ public class Form extends HtmlElementMixed {
        /**
         * <a class="doclink" 
href="https://www.w3.org/TR/html5/forms.html#attr-fs-action";>action</a> 
attribute.
         * URL to use for form submission.
+        * <p>
+        * The value can be of any of the following types: {@link URI}, {@link 
URL}, {@link String}.
+        * Strings must be valid URIs.
+        * <p>
+        * URIs defined by {@link UriResolver} can be used for values.
+        *
         * @param action The new value for this attribute.
         * @return This object (for method chaining).
         */
        public final Form action(String action) {
-               attr("action", action);
+               attrUri("action", action);
                return this;
        }
 

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/6dccf603/juneau-core/src/main/java/org/apache/juneau/dto/html5/HtmlElement.java
----------------------------------------------------------------------
diff --git 
a/juneau-core/src/main/java/org/apache/juneau/dto/html5/HtmlElement.java 
b/juneau-core/src/main/java/org/apache/juneau/dto/html5/HtmlElement.java
index 8c21a03..831db27 100644
--- a/juneau-core/src/main/java/org/apache/juneau/dto/html5/HtmlElement.java
+++ b/juneau-core/src/main/java/org/apache/juneau/dto/html5/HtmlElement.java
@@ -14,11 +14,16 @@ package org.apache.juneau.dto.html5;
 
 import static org.apache.juneau.xml.annotation.XmlFormat.*;
 
+import java.net.*;
+import java.net.URI;
 import java.util.*;
+import java.util.Map.*;
 
+import org.apache.juneau.*;
 import org.apache.juneau.annotation.*;
 import org.apache.juneau.html.*;
-import org.apache.juneau.utils.*;
+import org.apache.juneau.internal.*;
+import org.apache.juneau.utils.ObjectUtils;
 import org.apache.juneau.xml.annotation.*;
 
 /**
@@ -56,6 +61,11 @@ public abstract class HtmlElement {
         */
        @BeanProperty("a")
        public HtmlElement setAttrs(LinkedHashMap<String,Object> attrs) {
+               for (Entry<String,Object> e : attrs.entrySet()) {
+                       String key = e.getKey();
+                       if ("url".equals(key) || "href".equals(key) || 
key.endsWith("action"))
+                               e.setValue(StringUtils.toURI(e.getValue()));
+               }
                this.attrs = attrs;
                return this;
        }
@@ -70,11 +80,35 @@ public abstract class HtmlElement {
        public HtmlElement attr(String key, Object val) {
                if (this.attrs == null)
                        this.attrs = new LinkedHashMap<String,Object>();
+               if ("url".equals(key) || "href".equals(key) || 
key.endsWith("action"))
+                       val = StringUtils.toURI(val);
                this.attrs.put(key, val);
                return this;
        }
 
        /**
+        * Adds an arbitrary URI attribute to this element.
+        * <p>
+        * Same as {@link #attr(String, Object)}, except if the value is
+        * a string that appears to be a URI (e.g. <js>"servlet:/xxx"</js>).
+        * <p>
+        * The value can be of any of the following types: {@link URI}, {@link 
URL}, {@link String}.
+        * Strings must be valid URIs.
+        * <p>
+        * URIs defined by {@link UriResolver} can be used for values.
+        *
+        * @param key The attribute name.
+        * @param val The attribute value.
+        * @return This object (for method chaining).
+        */
+       public HtmlElement attrUri(String key, Object val) {
+               if (this.attrs == null)
+                       this.attrs = new LinkedHashMap<String,Object>();
+               this.attrs.put(key, StringUtils.toURI(val));
+               return this;
+       }
+
+       /**
         * Returns the attribute with the specified name.
         *
         * @param key The attribute name.

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/6dccf603/juneau-core/src/main/java/org/apache/juneau/dto/html5/Iframe.java
----------------------------------------------------------------------
diff --git a/juneau-core/src/main/java/org/apache/juneau/dto/html5/Iframe.java 
b/juneau-core/src/main/java/org/apache/juneau/dto/html5/Iframe.java
index 0ebf8d3..70757a4 100644
--- a/juneau-core/src/main/java/org/apache/juneau/dto/html5/Iframe.java
+++ b/juneau-core/src/main/java/org/apache/juneau/dto/html5/Iframe.java
@@ -13,7 +13,9 @@
 package org.apache.juneau.dto.html5;
 
 import java.net.*;
+import java.net.URI;
 
+import org.apache.juneau.*;
 import org.apache.juneau.annotation.*;
 
 /**
@@ -68,12 +70,18 @@ public class Iframe extends HtmlElementMixed {
        /**
         * <a class="doclink" 
href="https://www.w3.org/TR/html5/embedded-content-0.html#attr-iframe-src";>src</a>
 attribute.
         * Address of the resource.
+        * <p>
+        * The value can be of any of the following types: {@link URI}, {@link 
URL}, {@link String}.
+        * Strings must be valid URIs.
+        * <p>
+        * URIs defined by {@link UriResolver} can be used for values.
+        *
         * @param src The new value for this attribute.
         * Typically a {@link URL} or {@link String}.
         * @return This object (for method chaining).
         */
        public final Iframe src(Object src) {
-               attr("src", src);
+               attrUri("src", src);
                return this;
        }
 

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/6dccf603/juneau-core/src/main/java/org/apache/juneau/dto/html5/Img.java
----------------------------------------------------------------------
diff --git a/juneau-core/src/main/java/org/apache/juneau/dto/html5/Img.java 
b/juneau-core/src/main/java/org/apache/juneau/dto/html5/Img.java
index b9a8a8c..ab8ea60 100644
--- a/juneau-core/src/main/java/org/apache/juneau/dto/html5/Img.java
+++ b/juneau-core/src/main/java/org/apache/juneau/dto/html5/Img.java
@@ -13,7 +13,9 @@
 package org.apache.juneau.dto.html5;
 
 import java.net.*;
+import java.net.URI;
 
+import org.apache.juneau.*;
 import org.apache.juneau.annotation.*;
 
 /**
@@ -79,12 +81,18 @@ public class Img extends HtmlElementVoid {
        /**
         * <a class="doclink" 
href="https://www.w3.org/TR/html5/embedded-content-0.html#attr-img-src";>src</a> 
attribute.
         * Address of the resource.
+        * <p>
+        * The value can be of any of the following types: {@link URI}, {@link 
URL}, {@link String}.
+        * Strings must be valid URIs.
+        * <p>
+        * URIs defined by {@link UriResolver} can be used for values.
+        *
         * @param src The new value for this attribute.
         * Typically a {@link URL} or {@link String}.
         * @return This object (for method chaining).
         */
        public final Img src(Object src) {
-               attr("src", src);
+               attrUri("src", src);
                return this;
        }
 

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/6dccf603/juneau-core/src/main/java/org/apache/juneau/dto/html5/Link.java
----------------------------------------------------------------------
diff --git a/juneau-core/src/main/java/org/apache/juneau/dto/html5/Link.java 
b/juneau-core/src/main/java/org/apache/juneau/dto/html5/Link.java
index 2d1f223..c06c501 100644
--- a/juneau-core/src/main/java/org/apache/juneau/dto/html5/Link.java
+++ b/juneau-core/src/main/java/org/apache/juneau/dto/html5/Link.java
@@ -13,7 +13,9 @@
 package org.apache.juneau.dto.html5;
 
 import java.net.*;
+import java.net.URI;
 
+import org.apache.juneau.*;
 import org.apache.juneau.annotation.*;
 
 /**
@@ -45,12 +47,18 @@ public class Link extends HtmlElementVoid {
        /**
         * <a class="doclink" 
href="https://www.w3.org/TR/html5/document-metadata.html#attr-link-href";>href</a>
 attribute.
         * Address of the hyperlink.
+        * <p>
+        * The value can be of any of the following types: {@link URI}, {@link 
URL}, {@link String}.
+        * Strings must be valid URIs.
+        * <p>
+        * URIs defined by {@link UriResolver} can be used for values.
+        *
         * @param href The new value for this attribute.
         * Typically a {@link URL} or {@link String}.
         * @return This object (for method chaining).
         */
        public final Link href(Object href) {
-               attr("href", href);
+               attrUri("href", href);
                return this;
        }
 

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/6dccf603/juneau-core/src/main/java/org/apache/juneau/dto/html5/Script.java
----------------------------------------------------------------------
diff --git a/juneau-core/src/main/java/org/apache/juneau/dto/html5/Script.java 
b/juneau-core/src/main/java/org/apache/juneau/dto/html5/Script.java
index aa51cd0..872545b 100644
--- a/juneau-core/src/main/java/org/apache/juneau/dto/html5/Script.java
+++ b/juneau-core/src/main/java/org/apache/juneau/dto/html5/Script.java
@@ -13,7 +13,9 @@
 package org.apache.juneau.dto.html5;
 
 import java.net.*;
+import java.net.URI;
 
+import org.apache.juneau.*;
 import org.apache.juneau.annotation.*;
 
 /**
@@ -80,12 +82,18 @@ public class Script extends HtmlElementRawText {
        /**
         * <a class="doclink" 
href="https://www.w3.org/TR/html5/scripting-1.html#attr-script-src";>src</a> 
attribute.
         * Address of the resource.
+        * <p>
+        * The value can be of any of the following types: {@link URI}, {@link 
URL}, {@link String}.
+        * Strings must be valid URIs.
+        * <p>
+        * URIs defined by {@link UriResolver} can be used for values.
+        *
         * @param src The new value for this attribute.
         * Typically a {@link URL} or {@link String}.
         * @return This object (for method chaining).
         */
        public final Script src(Object src) {
-               attr("src", src);
+               attrUri("src", src);
                return this;
        }
 

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/6dccf603/juneau-core/src/main/java/org/apache/juneau/dto/html5/Source.java
----------------------------------------------------------------------
diff --git a/juneau-core/src/main/java/org/apache/juneau/dto/html5/Source.java 
b/juneau-core/src/main/java/org/apache/juneau/dto/html5/Source.java
index 9286729..c820690 100644
--- a/juneau-core/src/main/java/org/apache/juneau/dto/html5/Source.java
+++ b/juneau-core/src/main/java/org/apache/juneau/dto/html5/Source.java
@@ -13,7 +13,9 @@
 package org.apache.juneau.dto.html5;
 
 import java.net.*;
+import java.net.URI;
 
+import org.apache.juneau.*;
 import org.apache.juneau.annotation.*;
 
 /**
@@ -34,12 +36,18 @@ public class Source extends HtmlElementVoid {
        /**
         * <a class="doclink" 
href="https://www.w3.org/TR/html5/embedded-content-0.html#attr-source-src";>src</a>
 attribute.
         * Address of the resource.
+        * <p>
+        * The value can be of any of the following types: {@link URI}, {@link 
URL}, {@link String}.
+        * Strings must be valid URIs.
+        * <p>
+        * URIs defined by {@link UriResolver} can be used for values.
+        *
         * @param src The new value for this attribute.
         * Typically a {@link URL} or {@link String}.
         * @return This object (for method chaining).
         */
        public final Source src(Object src) {
-               attr("src", src);
+               attrUri("src", src);
                return this;
        }
 

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/6dccf603/juneau-core/src/main/java/org/apache/juneau/dto/html5/Track.java
----------------------------------------------------------------------
diff --git a/juneau-core/src/main/java/org/apache/juneau/dto/html5/Track.java 
b/juneau-core/src/main/java/org/apache/juneau/dto/html5/Track.java
index 3ae27f7..09c7d57 100644
--- a/juneau-core/src/main/java/org/apache/juneau/dto/html5/Track.java
+++ b/juneau-core/src/main/java/org/apache/juneau/dto/html5/Track.java
@@ -13,7 +13,9 @@
 package org.apache.juneau.dto.html5;
 
 import java.net.*;
+import java.net.URI;
 
+import org.apache.juneau.*;
 import org.apache.juneau.annotation.*;
 
 /**
@@ -67,12 +69,18 @@ public class Track extends HtmlElementVoid {
        /**
         * <a class="doclink" 
href="https://www.w3.org/TR/html5/embedded-content-0.html#attr-track-src";>src</a>
 attribute.
         * Address of the resource.
+        * <p>
+        * The value can be of any of the following types: {@link URI}, {@link 
URL}, {@link String}.
+        * Strings must be valid URIs.
+        * <p>
+        * URIs defined by {@link UriResolver} can be used for values.
+        *
         * @param src The new value for this attribute.
         * Typically a {@link URL} or {@link String}.
         * @return This object (for method chaining).
         */
        public final Track src(Object src) {
-               attr("src", src);
+               attrUri("src", src);
                return this;
        }
 

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/6dccf603/juneau-core/src/main/java/org/apache/juneau/dto/html5/Video.java
----------------------------------------------------------------------
diff --git a/juneau-core/src/main/java/org/apache/juneau/dto/html5/Video.java 
b/juneau-core/src/main/java/org/apache/juneau/dto/html5/Video.java
index 6616884..7e4c6a2 100644
--- a/juneau-core/src/main/java/org/apache/juneau/dto/html5/Video.java
+++ b/juneau-core/src/main/java/org/apache/juneau/dto/html5/Video.java
@@ -13,7 +13,9 @@
 package org.apache.juneau.dto.html5;
 
 import java.net.*;
+import java.net.URI;
 
+import org.apache.juneau.*;
 import org.apache.juneau.annotation.*;
 
 /**
@@ -138,12 +140,18 @@ public class Video extends HtmlElementContainer {
        /**
         * <a class="doclink" 
href="https://www.w3.org/TR/html5/embedded-content-0.html#attr-media-src";>src</a>
 attribute.
         * Address of the resource.
+        * <p>
+        * The value can be of any of the following types: {@link URI}, {@link 
URL}, {@link String}.
+        * Strings must be valid URIs.
+        * <p>
+        * URIs defined by {@link UriResolver} can be used for values.
+        *
         * @param src The new value for this attribute.
         * Typically a {@link URL} or {@link String}.
         * @return This object (for method chaining).
         */
        public final Video src(Object src) {
-               attr("src", src);
+               attrUri("src", src);
                return this;
        }
 

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/6dccf603/juneau-core/src/main/java/org/apache/juneau/dto/jsonschema/Schema.java
----------------------------------------------------------------------
diff --git 
a/juneau-core/src/main/java/org/apache/juneau/dto/jsonschema/Schema.java 
b/juneau-core/src/main/java/org/apache/juneau/dto/jsonschema/Schema.java
index d92bec3..550a0b2 100644
--- a/juneau-core/src/main/java/org/apache/juneau/dto/jsonschema/Schema.java
+++ b/juneau-core/src/main/java/org/apache/juneau/dto/jsonschema/Schema.java
@@ -12,6 +12,9 @@
 // 
***************************************************************************************************************************
 package org.apache.juneau.dto.jsonschema;
 
+import static org.apache.juneau.internal.StringUtils.*;
+
+import java.net.*;
 import java.net.URI;
 import java.util.*;
 
@@ -126,27 +129,21 @@ public class Schema {
 
        /**
         * Bean property setter:  <property>id</property>.
+        * <p>
+        * The value can be of any of the following types: {@link URI}, {@link 
URL}, {@link String}.
+        * Strings must be valid URIs.
+        * <p>
+        * URIs defined by {@link UriResolver} can be used for values.
         *
         * @param id The new value for the <property>id</property> property on 
this bean.
         * @return This object (for method chaining).
         */
-       public Schema setId(URI id) {
-               this.id = id;
+       public Schema setId(Object id) {
+               this.id = toURI(id);
                return this;
        }
 
        /**
-        * Bean property setter:  <property>id</property>.
-        *
-        * @param id The new value for the <property>id</property> property on 
this bean.
-        * The parameter must be a valid URI.  It can be <jk>null</jk>.
-        * @return This object (for method chaining).
-        */
-       public Schema setId(String id) {
-               return setId(id == null ? null : URI.create(id));
-       }
-
-       /**
         * Bean property getter:  <property>$schema</property>.
         *
         * @return The value of the <property>$schema</property> property on 
this bean, or <jk>null</jk> if it is not set.
@@ -158,28 +155,22 @@ public class Schema {
 
        /**
         * Bean property setter:  <property>$schema</property>.
+        * <p>
+        * The value can be of any of the following types: {@link URI}, {@link 
URL}, {@link String}.
+        * Strings must be valid URIs.
+        * <p>
+        * URIs defined by {@link UriResolver} can be used for values.
         *
         * @param schemaVersion The new value for the 
<property>schemaVersion</property> property on this bean.
         * @return This object (for method chaining).
         */
        @BeanProperty("$schema")
-       public Schema setSchemaVersionUri(URI schemaVersion) {
-               this.schemaVersion = schemaVersion;
+       public Schema setSchemaVersionUri(Object schemaVersion) {
+               this.schemaVersion = toURI(schemaVersion);
                return this;
        }
 
        /**
-        * Bean property setter:  <property>schemaVersion</property>.
-        *
-        * @param schemaVersion The new value for the 
<property>schemaVersion</property> property on this bean.
-        * The parameter must be a valid URI.  It can be <jk>null</jk>.
-        * @return This object (for method chaining).
-        */
-       public Schema setSchemaVersionUri(String schemaVersion) {
-               return setSchemaVersionUri(schemaVersion == null ? null : 
URI.create(schemaVersion));
-       }
-
-       /**
         * Bean property getter:  <property>title</property>.
         *
         * @return The value of the <property>title</property> property, or 
<jk>null</jk> if it is not set.
@@ -1287,13 +1278,18 @@ public class Schema {
 
        /**
         * Bean property setter:  <property>$ref</property>.
+        * <p>
+        * The value can be of any of the following types: {@link URI}, {@link 
URL}, {@link String}.
+        * Strings must be valid URIs.
+        * <p>
+        * URIs defined by {@link UriResolver} can be used for values.
         *
         * @param ref The new value for the <property>$ref</property> property 
on this bean.
         * @return This object (for method chaining).
         */
        @BeanProperty("$ref")
-       public Schema setRef(URI ref) {
-               this.ref = ref;
+       public Schema setRef(Object ref) {
+               this.ref = toURI(ref);
                return this;
        }
 
@@ -1364,19 +1360,6 @@ public class Schema {
                if (not != null)
                        not.setMaster(master);
        }
-
-
-       /**
-        * Bean property setter:  <property>$ref</property>.
-        *
-        * @param ref The new value for the <property>$ref</property> property 
on this bean.
-        * The parameter must be a valid URI.  It can be <jk>null</jk>.
-        * @return This object (for method chaining).
-        */
-       public Schema setRef(String ref) {
-               return setRef(ref == null ? null : URI.create(ref));
-       }
-
        /**
         * If this schema is a reference to another schema (i.e. has its 
<property>$ref</property> property set),
         *      this method will retrieve the referenced schema from the schema 
map registered with this schema.

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/6dccf603/juneau-core/src/main/java/org/apache/juneau/dto/jsonschema/SchemaMap.java
----------------------------------------------------------------------
diff --git 
a/juneau-core/src/main/java/org/apache/juneau/dto/jsonschema/SchemaMap.java 
b/juneau-core/src/main/java/org/apache/juneau/dto/jsonschema/SchemaMap.java
index 2b12e0a..98a06f5 100644
--- a/juneau-core/src/main/java/org/apache/juneau/dto/jsonschema/SchemaMap.java
+++ b/juneau-core/src/main/java/org/apache/juneau/dto/jsonschema/SchemaMap.java
@@ -12,10 +12,12 @@
 // 
***************************************************************************************************************************
 package org.apache.juneau.dto.jsonschema;
 
+import static org.apache.juneau.internal.StringUtils.*;
 import java.io.*;
 import java.net.*;
 import java.util.concurrent.*;
 
+import org.apache.juneau.*;
 import org.apache.juneau.json.*;
 
 /**
@@ -40,30 +42,30 @@ public abstract class SchemaMap extends 
ConcurrentHashMap<URI,Schema> {
 
        private static final long serialVersionUID = 1L;
 
-       @Override /* Map */
-       public Schema get(Object uri) {
-               if (uri == null)
-                       return null;
-               return get(URI.create(uri.toString()));
-       }
-
        /**
         * Return the {@link Schema} object at the specified URI.
         * If this schema object has not been loaded yet, calls {@link 
#load(URI)}.
+        * <p>
+        * The value can be of any of the following types: {@link URI}, {@link 
URL}, {@link String}.
+        * Strings must be valid URIs.
+        * <p>
+        * URIs defined by {@link UriResolver} can be used for values.
         *
         * @param uri The URI of the schema to retrieve.
         * @return The Schema, or <jk>null</jk> if schema was not located and 
could not be loaded.
         */
-       public Schema get(URI uri) {
-               Schema s = super.get(uri);
+       @Override /* Map */
+       public Schema get(Object uri) {
+               URI u = toURI(uri);
+               Schema s = super.get(u);
                if (s != null)
                        return s;
                synchronized(this) {
-                       s = load(uri);
+                       s = load(u);
                        if (s != null) {
                                // Note:  Can't use add(Schema...) since the ID 
property may not be set.
                                s.setSchemaMap(this);
-                               put(uri, s);
+                               put(u, s);
                        }
                        return s;
                }

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/6dccf603/juneau-core/src/main/java/org/apache/juneau/dto/jsonschema/SchemaRef.java
----------------------------------------------------------------------
diff --git 
a/juneau-core/src/main/java/org/apache/juneau/dto/jsonschema/SchemaRef.java 
b/juneau-core/src/main/java/org/apache/juneau/dto/jsonschema/SchemaRef.java
index 7b59186..ef1a8e1 100644
--- a/juneau-core/src/main/java/org/apache/juneau/dto/jsonschema/SchemaRef.java
+++ b/juneau-core/src/main/java/org/apache/juneau/dto/jsonschema/SchemaRef.java
@@ -14,6 +14,8 @@ package org.apache.juneau.dto.jsonschema;
 
 import java.net.*;
 
+import org.apache.juneau.*;
+
 /**
  * Convenience class for representing a schema reference such as 
<js>"{'$ref':'/url/to/ref'}"</js>.
  * <p>
@@ -36,10 +38,15 @@ public class SchemaRef extends Schema {
 
        /**
         * Constructor.
+        * <p>
+        * The value can be of any of the following types: {@link URI}, {@link 
URL}, {@link String}.
+        * Strings must be valid URIs.
+        * <p>
+        * URIs defined by {@link UriResolver} can be used for values.
         *
         * @param uri The URI of the target reference.  Can be <jk>null</jk>.
         */
-       public SchemaRef(String uri) {
-               this.setRef(uri == null ? null : URI.create(uri));
+       public SchemaRef(Object uri) {
+               this.setRef(uri);
        }
 }

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/6dccf603/juneau-core/src/main/java/org/apache/juneau/dto/swagger/Contact.java
----------------------------------------------------------------------
diff --git 
a/juneau-core/src/main/java/org/apache/juneau/dto/swagger/Contact.java 
b/juneau-core/src/main/java/org/apache/juneau/dto/swagger/Contact.java
index 6b55535..54102a8 100644
--- a/juneau-core/src/main/java/org/apache/juneau/dto/swagger/Contact.java
+++ b/juneau-core/src/main/java/org/apache/juneau/dto/swagger/Contact.java
@@ -12,6 +12,12 @@
 // 
***************************************************************************************************************************
 package org.apache.juneau.dto.swagger;
 
+import static org.apache.juneau.internal.StringUtils.*;
+
+import java.net.*;
+import java.net.URI;
+
+import org.apache.juneau.*;
 import org.apache.juneau.annotation.*;
 
 /**
@@ -40,7 +46,7 @@ import org.apache.juneau.annotation.*;
 public class Contact extends SwaggerElement {
 
        private String name;
-       private String url;
+       private URI url;
        private String email;
 
        /**
@@ -84,31 +90,34 @@ public class Contact extends SwaggerElement {
         *
         * @return The value of the <property>url</property> property on this 
bean, or <jk>null</jk> if it is not set.
         */
-       public String getUrl() {
+       public URI getUrl() {
                return url;
        }
 
        /**
         * Bean property setter:  <property>url</property>.
         * <p>
-        * The URL pointing to the contact information. MUST be in the format 
of a URL.
+        * The value can be of any of the following types: {@link URI}, {@link 
URL}, {@link String}.
+        * Strings must be valid URIs.
+        * <p>
+        * URIs defined by {@link UriResolver} can be used for values.
         *
         * @param url The new value for the <property>url</property> property 
on this bean.
         * @return This object (for method chaining).
         */
-       public Contact setUrl(String url) {
-               this.url = url;
+       public Contact setUrl(Object url) {
+               this.url = toURI(url);
                return this;
        }
 
        /**
-        * Synonym for {@link #setUrl(String)}.
+        * Synonym for {@link #setUrl(Object)}.
         *
         * @param url The new value for the <property>url</property> property 
on this bean.
         * @return This object (for method chaining).
         */
-       public Contact url(String url) {
-               return setName(url);
+       public Contact url(Object url) {
+               return setUrl(url);
        }
 
        /**

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/6dccf603/juneau-core/src/main/java/org/apache/juneau/dto/swagger/ExternalDocumentation.java
----------------------------------------------------------------------
diff --git 
a/juneau-core/src/main/java/org/apache/juneau/dto/swagger/ExternalDocumentation.java
 
b/juneau-core/src/main/java/org/apache/juneau/dto/swagger/ExternalDocumentation.java
index 3882f43..2679755 100644
--- 
a/juneau-core/src/main/java/org/apache/juneau/dto/swagger/ExternalDocumentation.java
+++ 
b/juneau-core/src/main/java/org/apache/juneau/dto/swagger/ExternalDocumentation.java
@@ -12,6 +12,12 @@
 // 
***************************************************************************************************************************
 package org.apache.juneau.dto.swagger;
 
+import static org.apache.juneau.internal.StringUtils.*;
+
+import java.net.*;
+import java.net.URI;
+
+import org.apache.juneau.*;
 import org.apache.juneau.annotation.*;
 
 /**
@@ -39,7 +45,7 @@ import org.apache.juneau.annotation.*;
 public class ExternalDocumentation extends SwaggerElement {
 
        private String description;
-       private String url;
+       private URI url;
 
        /**
         * Bean property getter:  <property>description</property>.
@@ -78,34 +84,42 @@ public class ExternalDocumentation extends SwaggerElement {
        /**
         * Bean property getter:  <property>url</property>.
         * <p>
-        * Required. The URL for the target documentation. Value MUST be in the 
format of a URL.
+        * Required. The URL for the target documentation.
+        * <p>
+        * The value can be of any of the following types: {@link URI}, {@link 
URL}, {@link String}.
+        * Strings must be valid URIs.
+        * <p>
+        * URIs defined by {@link UriResolver} can be used for values.
         *
         * @return The value of the <property>url</property> property on this 
bean, or <jk>null</jk> if it is not set.
         */
-       public String getUrl() {
+       public URI getUrl() {
                return url;
        }
 
        /**
         * Bean property setter:  <property>url</property>.
         * <p>
-        * Required. The URL for the target documentation. Value MUST be in the 
format of a URL.
+        * The value can be of any of the following types: {@link URI}, {@link 
URL}, {@link String}.
+        * Strings must be valid URIs.
+        * <p>
+        * URIs defined by {@link UriResolver} can be used for values.
         *
         * @param url The new value for the <property>url</property> property 
on this bean.
         * @return This object (for method chaining).
         */
-       public ExternalDocumentation setUrl(String url) {
-               this.url = url;
+       public ExternalDocumentation setUrl(Object url) {
+               this.url = toURI(url);
                return this;
        }
 
        /**
-        * Synonym for {@link #setUrl(String)}.
+        * Synonym for {@link #setUrl(Object)}.
         *
         * @param url The new value for the <property>url</property> property 
on this bean.
         * @return This object (for method chaining).
         */
-       public ExternalDocumentation url(String url) {
+       public ExternalDocumentation url(Object url) {
                return setUrl(url);
        }
 }

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/6dccf603/juneau-core/src/main/java/org/apache/juneau/dto/swagger/License.java
----------------------------------------------------------------------
diff --git 
a/juneau-core/src/main/java/org/apache/juneau/dto/swagger/License.java 
b/juneau-core/src/main/java/org/apache/juneau/dto/swagger/License.java
index 3c720d7..13cef34 100644
--- a/juneau-core/src/main/java/org/apache/juneau/dto/swagger/License.java
+++ b/juneau-core/src/main/java/org/apache/juneau/dto/swagger/License.java
@@ -12,6 +12,12 @@
 // 
***************************************************************************************************************************
 package org.apache.juneau.dto.swagger;
 
+import static org.apache.juneau.internal.StringUtils.*;
+
+import java.net.*;
+import java.net.URI;
+
+import org.apache.juneau.*;
 import org.apache.juneau.annotation.*;
 
 /**
@@ -39,7 +45,7 @@ import org.apache.juneau.annotation.*;
 public class License extends SwaggerElement {
 
        private String name;
-       private String url;
+       private URI url;
 
        /**
         * Bean property getter:  <property>name</property>.
@@ -78,34 +84,42 @@ public class License extends SwaggerElement {
        /**
         * Bean property getter:  <property>url</property>.
         * <p>
-        * A URL to the license used for the API. MUST be in the format of a 
URL.
+        * A URL to the license used for the API.
+        * <p>
+        * The value can be of any of the following types: {@link URI}, {@link 
URL}, {@link String}.
+        * Strings must be valid URIs.
+        * <p>
+        * URIs defined by {@link UriResolver} can be used for values.
         *
         * @return The value of the <property>url</property> property on this 
bean, or <jk>null</jk> if it is not set.
         */
-       public String getUrl() {
+       public URI getUrl() {
                return url;
        }
 
        /**
         * Bean property setter:  <property>url</property>.
         * <p>
-        * A URL to the license used for the API. MUST be in the format of a 
URL.
+        * The value can be of any of the following types: {@link URI}, {@link 
URL}, {@link String}.
+        * Strings must be valid URIs.
+        * <p>
+        * URIs defined by {@link UriResolver} can be used for values.
         *
         * @param url The new value for the <property>url</property> property 
on this bean.
         * @return This object (for method chaining).
         */
-       public License setUrl(String url) {
-               this.url = url;
+       public License setUrl(Object url) {
+               this.url = toURI(url);
                return this;
        }
 
        /**
-        * Synonym for {@link #setUrl(String)}.
+        * Synonym for {@link #setUrl(Object)}.
         *
         * @param url The new value for the <property>url</property> property 
on this bean.
         * @return This object (for method chaining).
         */
-       public License url(String url) {
+       public License url(Object url) {
                return setUrl(url);
        }
 }

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/6dccf603/juneau-core/src/main/java/org/apache/juneau/dto/swagger/SwaggerBuilder.java
----------------------------------------------------------------------
diff --git 
a/juneau-core/src/main/java/org/apache/juneau/dto/swagger/SwaggerBuilder.java 
b/juneau-core/src/main/java/org/apache/juneau/dto/swagger/SwaggerBuilder.java
index f49263d..aa71038 100644
--- 
a/juneau-core/src/main/java/org/apache/juneau/dto/swagger/SwaggerBuilder.java
+++ 
b/juneau-core/src/main/java/org/apache/juneau/dto/swagger/SwaggerBuilder.java
@@ -12,6 +12,10 @@
 // 
***************************************************************************************************************************
 package org.apache.juneau.dto.swagger;
 
+import java.net.*;
+
+import org.apache.juneau.*;
+
 /**
  * Various useful static methods for creating Swagger elements.
  *
@@ -44,13 +48,16 @@ public class SwaggerBuilder {
        }
 
        /**
-        * Creates an {@link Contact} element with the specified {@link 
Contact#name(String)}, {@link Contact#url(String)}, and {@link 
Contact#email(String)}, attributes.
+        * Creates an {@link Contact} element with the specified {@link 
Contact#name(String)}, {@link Contact#url(Object)}, and {@link 
Contact#email(String)}, attributes.
         * @param name The {@link Contact#name(String)} attribute.
-        * @param url The {@link Contact#url(String)} attribute.
+        * @param url The {@link Contact#url(Object)} attribute.
+        *      The value can be of any of the following types: {@link URI}, 
{@link URL}, {@link String}.
+        *      <br>Strings must be valid URIs.
+        *      <br>URIs defined by {@link UriResolver} can be used for values.
         * @param email The {@link Contact#email(String)} attribute.
         * @return The new element.
         */
-       public static final Contact contact(String name, String url, String 
email) {
+       public static final Contact contact(String name, Object url, String 
email) {
                return contact().name(name).url(url).email(email);
        }
 
@@ -63,21 +70,27 @@ public class SwaggerBuilder {
        }
 
        /**
-        * Creates an {@link ExternalDocumentation} element with the specified 
{@link ExternalDocumentation#url(String)} attribute.
-        * @param url The {@link ExternalDocumentation#url(String)} attribute.
+        * Creates an {@link ExternalDocumentation} element with the specified 
{@link ExternalDocumentation#url(Object)} attribute.
+        * @param url The {@link ExternalDocumentation#url(Object)} attribute.
+        *      The value can be of any of the following types: {@link URI}, 
{@link URL}, {@link String}.
+        *      <br>Strings must be valid URIs.
+        *      <br>URIs defined by {@link UriResolver} can be used for values.
         * @return The new element.
         */
-       public static final ExternalDocumentation externalDocumentation(String 
url) {
+       public static final ExternalDocumentation externalDocumentation(Object 
url) {
                return externalDocumentation().url(url);
        }
 
        /**
-        * Creates an {@link ExternalDocumentation} element with the specified 
{@link ExternalDocumentation#url(String)} and {@link 
ExternalDocumentation#description(String)} attributes.
-        * @param url The {@link ExternalDocumentation#url(String)} attribute.
+        * Creates an {@link ExternalDocumentation} element with the specified 
{@link ExternalDocumentation#url(Object)} and {@link 
ExternalDocumentation#description(String)} attributes.
+        * @param url The {@link ExternalDocumentation#url(Object)} attribute.
+        *      The value can be of any of the following types: {@link URI}, 
{@link URL}, {@link String}.
+        *      <br>Strings must be valid URIs.
+        *      <br>URIs defined by {@link UriResolver} can be used for values.
         * @param description The {@link 
ExternalDocumentation#description(String)} attribute.
         * @return The new element.
         */
-       public static final ExternalDocumentation externalDocumentation(String 
url, String description) {
+       public static final ExternalDocumentation externalDocumentation(Object 
url, String description) {
                return 
externalDocumentation().url(url).description(description);
        }
 

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/6dccf603/juneau-core/src/main/java/org/apache/juneau/html/HtmlDocSerializerContext.java
----------------------------------------------------------------------
diff --git 
a/juneau-core/src/main/java/org/apache/juneau/html/HtmlDocSerializerContext.java
 
b/juneau-core/src/main/java/org/apache/juneau/html/HtmlDocSerializerContext.java
index b8f5ddf..ebea8a3 100644
--- 
a/juneau-core/src/main/java/org/apache/juneau/html/HtmlDocSerializerContext.java
+++ 
b/juneau-core/src/main/java/org/apache/juneau/html/HtmlDocSerializerContext.java
@@ -75,6 +75,8 @@ public final class HtmlDocSerializerContext extends 
HtmlSerializerContext {
         *      <li><b>Session-overridable:</b> <jk>true</jk>
         * </ul>
         * <p>
+        * Specifies the text for the title that shows up in the header section 
of the page generated by the basic template.
+        * <p>
         *
         * <h5 class='section'>Example:</h5>
         * <p>
@@ -132,6 +134,8 @@ public final class HtmlDocSerializerContext extends 
HtmlSerializerContext {
         *      <li><b>Session-overridable:</b> <jk>true</jk>
         * </ul>
         * <p>
+        * Specifies the text for the subtitle that shows up in the header 
section of the page generated by the basic template.
+        * <p>
         *
         * <h5 class='section'>Example:</h5>
         * <p>
@@ -180,6 +184,23 @@ public final class HtmlDocSerializerContext extends 
HtmlSerializerContext {
        public static final String HTMLDOC_description = 
"HtmlSerializer.description";
 
        /**
+        * <b>Configuration property:</b>  Page branding.
+        * <p>
+        * <ul>
+        *      <li><b>Name:</b> <js>"HtmlSerializer.branding"</js>
+        *      <li><b>Data type:</b> <code>String</code>
+        *      <li><b>Default:</b> <jk>null</jk>
+        *      <li><b>Session-overridable:</b> <jk>true</jk>
+        * </ul>
+        * <p>
+        * Specifies arbitrary HTML for the header that can be used for adding 
custom branding to the page generated by the
+        *      basic template.
+        * <p>
+        * A value of <js>"NONE"</js> can be used to represent no value to 
differentiate it from an empty string.
+        */
+       public static final String HTMLDOC_branding = "HtmlSerializer.branding";
+
+       /**
         * <b>Configuration property:</b>  Header section contents.
         * <p>
         * <ul>
@@ -476,7 +497,7 @@ public final class HtmlDocSerializerContext extends 
HtmlSerializerContext {
 
        final String[] css;
        final Map<String,String> links;
-       final String title, description, header, nav, aside, footer, cssUrl, 
noResultsMessage;
+       final String title, description, branding, header, nav, aside, footer, 
cssUrl, noResultsMessage;
        final boolean nowrap;
        final HtmlDocTemplate template;
 
@@ -492,6 +513,7 @@ public final class HtmlDocSerializerContext extends 
HtmlSerializerContext {
                css = ps.getProperty(HTMLDOC_css, String[].class, new 
String[0]);
                title = ps.getProperty(HTMLDOC_title, String.class, null);
                description = ps.getProperty(HTMLDOC_description, String.class, 
null);
+               branding = ps.getProperty(HTMLDOC_branding, String.class, null);
                header = ps.getProperty(HTMLDOC_header, String.class, null);
                nav = ps.getProperty(HTMLDOC_nav, String.class, null);
                aside = ps.getProperty(HTMLDOC_aside, String.class, null);
@@ -510,6 +532,7 @@ public final class HtmlDocSerializerContext extends 
HtmlSerializerContext {
                                .append("cssImports", css)
                                .append("title", title)
                                .append("text", description)
+                               .append("branding", branding)
                                .append("header", header)
                                .append("nav", nav)
                                .append("links", links)

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/6dccf603/juneau-core/src/main/java/org/apache/juneau/html/HtmlDocSerializerSession.java
----------------------------------------------------------------------
diff --git 
a/juneau-core/src/main/java/org/apache/juneau/html/HtmlDocSerializerSession.java
 
b/juneau-core/src/main/java/org/apache/juneau/html/HtmlDocSerializerSession.java
index 5cb8d91..15fff6b 100644
--- 
a/juneau-core/src/main/java/org/apache/juneau/html/HtmlDocSerializerSession.java
+++ 
b/juneau-core/src/main/java/org/apache/juneau/html/HtmlDocSerializerSession.java
@@ -33,7 +33,7 @@ import org.apache.juneau.serializer.*;
  */
 public final class HtmlDocSerializerSession extends HtmlSerializerSession {
 
-       private final String title, description, header, nav, aside, footer, 
cssUrl, noResultsMessage;
+       private final String title, description, branding, header, nav, aside, 
footer, cssUrl, noResultsMessage;
        private final String[] css;
        private final Map<String,String> links;
        private final boolean nowrap;
@@ -62,6 +62,7 @@ public final class HtmlDocSerializerSession extends 
HtmlSerializerSession {
                if (op == null || op.isEmpty()) {
                        title = ctx.title;
                        description = ctx.description;
+                       branding = ctx.branding;
                        header = ctx.header;
                        nav = ctx.nav;
                        aside = ctx.aside;
@@ -75,6 +76,7 @@ public final class HtmlDocSerializerSession extends 
HtmlSerializerSession {
                } else {
                        title = op.getString(HTMLDOC_title, ctx.title);
                        description = op.getString(HTMLDOC_description, 
ctx.description);
+                       branding = op.getString(HTMLDOC_branding, ctx.branding);
                        header = op.getString(HTMLDOC_header, ctx.nav);
                        nav = op.getString(HTMLDOC_nav, ctx.nav);
                        aside = op.getString(HTMLDOC_aside, ctx.aside);
@@ -134,6 +136,15 @@ public final class HtmlDocSerializerSession extends 
HtmlSerializerSession {
        }
 
        /**
+        * Returns the {@link HtmlDocSerializerContext#HTMLDOC_branding} 
setting value in this context.
+        * @return The {@link HtmlDocSerializerContext#HTMLDOC_branding} 
setting value in this context.
+        *      <jk>null</jk> if not specified.  Never an empty string.
+        */
+       public final String getBranding() {
+               return branding;
+       }
+
+       /**
         * Returns the {@link HtmlDocSerializerContext#HTMLDOC_header} setting 
value in this context.
         * @return The {@link HtmlDocSerializerContext#HTMLDOC_header} setting 
value in this context.
         *      <jk>null</jk> if not specified.  Never an empty string.

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/6dccf603/juneau-core/src/main/java/org/apache/juneau/html/HtmlDocTemplateBasic.java
----------------------------------------------------------------------
diff --git 
a/juneau-core/src/main/java/org/apache/juneau/html/HtmlDocTemplateBasic.java 
b/juneau-core/src/main/java/org/apache/juneau/html/HtmlDocTemplateBasic.java
index 6553fdb..05f9705 100644
--- a/juneau-core/src/main/java/org/apache/juneau/html/HtmlDocTemplateBasic.java
+++ b/juneau-core/src/main/java/org/apache/juneau/html/HtmlDocTemplateBasic.java
@@ -94,10 +94,13 @@ public class HtmlDocTemplateBasic implements 
HtmlDocTemplate {
                } else {
                        String title = session.getTitle();
                        String description = session.getDescription();
+                       String branding = session.getBranding();
                        if (exists(title))
                                w.oTag(1, "h3").attr("class", 
"title").append('>').text(title).eTag("h3").nl();
                        if (exists(description))
                                w.oTag(1, "h5").attr("class", 
"description").append('>').text(description).eTag("h5").nl();
+                       if (exists(branding))
+                               w.append(branding).nl();
                }
        }
 

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/6dccf603/juneau-core/src/main/java/org/apache/juneau/internal/StringUtils.java
----------------------------------------------------------------------
diff --git 
a/juneau-core/src/main/java/org/apache/juneau/internal/StringUtils.java 
b/juneau-core/src/main/java/org/apache/juneau/internal/StringUtils.java
index c4bf1db..61bacb0 100644
--- a/juneau-core/src/main/java/org/apache/juneau/internal/StringUtils.java
+++ b/juneau-core/src/main/java/org/apache/juneau/internal/StringUtils.java
@@ -1395,6 +1395,56 @@ public final class StringUtils {
        }
 
        /**
+        * Efficiently determines whether a URL is of the pattern "xxx:/xxx".
+        * <p>
+        * The pattern matched is: <code>[a-z]{2,}\:\/.*</code>
+        * <p>
+        * Note that this excludes filesystem paths such as <js>"C:/temp"</js>.
+        *
+        * @param s The string to test.
+        * @return <jk>true</jk> if it's an absolute path.
+        */
+       public static boolean isUri(String s) {
+
+               if (isEmpty(s))
+                       return false;
+
+               // Use a state machine for maximum performance.
+
+               int S1 = 1;  // Looking for protocol char 1
+               int S2 = 2;  // Found protocol char 1, looking for protocol 
char 2
+               int S3 = 3;  // Found protocol char 2, looking for :
+               int S4 = 4;  // Found :, looking for /
+
+
+               int state = S1;
+               for (int i = 0; i < s.length(); i++) {
+                       char c = s.charAt(i);
+                       if (state == S1) {
+                               if (c >= 'a' && c <= 'z')
+                                       state = S2;
+                               else
+                                       return false;
+                       } else if (state == S2) {
+                               if (c >= 'a' && c <= 'z')
+                                       state = S3;
+                               else
+                                       return false;
+                       } else if (state == S3) {
+                               if (c == ':')
+                                       state = S4;
+                               else if (c < 'a' || c > 'z')
+                                       return false;
+                       } else if (state == S4) {
+                               if (c == '/')
+                                       return true;
+                               return false;
+                       }
+               }
+               return false;
+       }
+
+       /**
         * Given an absolute URI, returns just the authority portion (e.g. 
<js>"http://hostname:port";</js>)
         *
         * @param s The URI string.
@@ -1446,4 +1496,20 @@ public final class StringUtils {
                }
                return s;
        }
+
+       /**
+        * Converts the specified object to a URI.
+        *
+        * @param o The object to convert to a URI.
+        * @return A new URI, or the same object if the object was already a 
URI, or
+        */
+       public static URI toURI(Object o) {
+               if (o == null || o instanceof URI)
+                       return (URI)o;
+               try {
+                       return new URI(o.toString());
+               } catch (URISyntaxException e) {
+                       throw new RuntimeException(e);
+               }
+       }
 }

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/6dccf603/juneau-core/src/main/java/org/apache/juneau/serializer/SerializerContext.java
----------------------------------------------------------------------
diff --git 
a/juneau-core/src/main/java/org/apache/juneau/serializer/SerializerContext.java 
b/juneau-core/src/main/java/org/apache/juneau/serializer/SerializerContext.java
index 1381972..ac65ab2 100644
--- 
a/juneau-core/src/main/java/org/apache/juneau/serializer/SerializerContext.java
+++ 
b/juneau-core/src/main/java/org/apache/juneau/serializer/SerializerContext.java
@@ -238,7 +238,7 @@ public class SerializerContext extends BeanContext {
         * <ul>
         *      <li><b>Name:</b> <js>"Serializer.uriResolution"</js>
         *      <li><b>Data type:</b> {@link UriResolution}
-        *      <li><b>Default:</b> {@link UriResolution#ROOT_RELATIVE}
+        *      <li><b>Default:</b> {@link UriResolution#NONE}
         *      <li><b>Session-overridable:</b> <jk>true</jk>
         * </ul>
         * <p>
@@ -392,7 +392,7 @@ public class SerializerContext extends BeanContext {
                abridged = ps.getProperty(SERIALIZER_abridged, boolean.class, 
false);
                quoteChar = ps.getProperty(SERIALIZER_quoteChar, String.class, 
"\"").charAt(0);
                uriContext = ps.getProperty(SERIALIZER_uriContext, 
UriContext.class, UriContext.DEFAULT);
-               uriResolution = ps.getProperty(SERIALIZER_uriResolution, 
UriResolution.class, UriResolution.ROOT_RELATIVE);
+               uriResolution = ps.getProperty(SERIALIZER_uriResolution, 
UriResolution.class, UriResolution.NONE);
                uriRelativity = ps.getProperty(SERIALIZER_uriRelativity, 
UriRelativity.class, UriRelativity.RESOURCE);
                listener = ps.getProperty(SERIALIZER_listener, Class.class, 
null);
        }

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/6dccf603/juneau-core/src/main/javadoc/overview.html
----------------------------------------------------------------------
diff --git a/juneau-core/src/main/javadoc/overview.html 
b/juneau-core/src/main/javadoc/overview.html
index 9f7d54f..9d4a49e 100644
--- a/juneau-core/src/main/javadoc/overview.html
+++ b/juneau-core/src/main/javadoc/overview.html
@@ -6294,6 +6294,7 @@
                                                <ul>
                                                        <li>{@link 
org.apache.juneau.html.HtmlDocSerializerContext#HTMLDOC_title}
                                                        <li>{@link 
org.apache.juneau.html.HtmlDocSerializerContext#HTMLDOC_description}
+                                                       <li>{@link 
org.apache.juneau.html.HtmlDocSerializerContext#HTMLDOC_branding}
                                                        <li>{@link 
org.apache.juneau.html.HtmlDocSerializerContext#HTMLDOC_header}
                                                        <li>{@link 
org.apache.juneau.html.HtmlDocSerializerContext#HTMLDOC_nav}
                                                        <li>{@link 
org.apache.juneau.html.HtmlDocSerializerContext#HTMLDOC_aside}
@@ -6456,6 +6457,7 @@
                                <ul>
                                        <li>{@link 
org.apache.juneau.rest.RestConfig#setHtmlTitle(String) setHtmlTitle(String)}
                                        <li>{@link 
org.apache.juneau.rest.RestConfig#setHtmlDescription(String) 
setHtmlDescription(String)}
+                                       <li>{@link 
org.apache.juneau.rest.RestConfig#setHtmlBranding(String) 
setHtmlBranding(String)}
                                        <li>{@link 
org.apache.juneau.rest.RestConfig#setHtmlHeader(String) setHtmlHeader(String)}
                                        <li>{@link 
org.apache.juneau.rest.RestConfig#setHtmlLinks(String) setHtmlLinks(String)}
                                        <li>{@link 
org.apache.juneau.rest.RestConfig#setHtmlNav(String) setHtmlNav(String)}
@@ -6473,6 +6475,7 @@
                                <ul>
                                        <li>{@link 
org.apache.juneau.rest.RestResponse#setHtmlTitle(Object) setHtmlTitle(Object)}
                                        <li>{@link 
org.apache.juneau.rest.RestResponse#setHtmlDescription(Object) 
setHtmlDescription(Object)}
+                                       <li>{@link 
org.apache.juneau.rest.RestResponse#setHtmlBranding(Object) 
setHtmlBranding(Object)}
                                        <li>{@link 
org.apache.juneau.rest.RestResponse#setHtmlHeader(Object) setHtmlHeader(Object)}
                                        <li>{@link 
org.apache.juneau.rest.RestResponse#setHtmlLinks(Object) setHtmlLinks(Object)}
                                        <li>{@link 
org.apache.juneau.rest.RestResponse#setHtmlNav(Object) setHtmlNav(Object)}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/6dccf603/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/RootResources.java
----------------------------------------------------------------------
diff --git 
a/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/RootResources.java
 
b/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/RootResources.java
index 2637411..3f572e6 100644
--- 
a/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/RootResources.java
+++ 
b/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/RootResources.java
@@ -36,10 +36,11 @@ import org.apache.juneau.rest.widget.*;
                        + "     <p>All content on pages in the UI are 
serialized POJOs.  In this case, it's a serialized array of beans with 2 
properties.</p>"
                        + "     <p>Other features (such as this aside) are 
added through annotations.</p>"
                        + "</div>",
-               footer="$W{poweredByJuneau}"
+               footer="$W{poweredByApache}"
        ),
        widgets={
                PoweredByJuneauWidget.class,
+               PoweredByApacheWidget.class,
                ContentTypeLinksWidget.class
        },
        children={

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/6dccf603/juneau-rest/src/main/java/org/apache/juneau/rest/CallMethod.java
----------------------------------------------------------------------
diff --git a/juneau-rest/src/main/java/org/apache/juneau/rest/CallMethod.java 
b/juneau-rest/src/main/java/org/apache/juneau/rest/CallMethod.java
index 69d6814..f6753e5 100644
--- a/juneau-rest/src/main/java/org/apache/juneau/rest/CallMethod.java
+++ b/juneau-rest/src/main/java/org/apache/juneau/rest/CallMethod.java
@@ -66,8 +66,8 @@ class CallMethod implements Comparable<CallMethod>  {
        private final org.apache.juneau.rest.annotation.Parameter[] parameters;
        private final Response[] responses;
        private final RestContext context;
-       private final String htmlTitle, htmlDescription, htmlHeader, htmlLinks, 
htmlNav, htmlAside, htmlFooter, htmlCss,
-               htmlCssUrl, htmlNoResultsMessage;
+       private final String htmlTitle, htmlDescription, htmlBranding, 
htmlHeader, htmlLinks, htmlNav, htmlAside,
+               htmlFooter, htmlCss, htmlCssUrl, htmlNoResultsMessage;
        private final boolean htmlNoWrap;
        private final HtmlDocTemplate htmlTemplate;
        private final Map<String,Widget> widgets;
@@ -103,6 +103,7 @@ class CallMethod implements Comparable<CallMethod>  {
                this.responses = b.responses;
                this.htmlTitle = b.htmlTitle;
                this.htmlDescription = b.htmlDescription;
+               this.htmlBranding = b.htmlBranding;
                this.htmlHeader = b.htmlHeader;
                this.htmlLinks = b.htmlLinks;
                this.htmlNav = b.htmlNav;
@@ -118,7 +119,7 @@ class CallMethod implements Comparable<CallMethod>  {
 
        private static class Builder  {
                private String httpMethod, defaultCharset, description, tags, 
summary, externalDocs, htmlTitle, htmlDescription,
-                       htmlLinks, htmlNav, htmlAside, htmlFooter, htmlCssUrl, 
htmlCss, htmlHeader, htmlNoResultsMessage;
+                       htmlBranding, htmlLinks, htmlNav, htmlAside, 
htmlFooter, htmlCssUrl, htmlCss, htmlHeader, htmlNoResultsMessage;
                private boolean htmlNoWrap;
                private HtmlDocTemplate htmlTemplate;
                private UrlPathPattern pathPattern;
@@ -173,6 +174,7 @@ class CallMethod implements Comparable<CallMethod>  {
                                HtmlDoc hd = m.htmldoc();
                                htmlTitle = hd.title().isEmpty() ? 
context.getHtmlTitle() : hd.title();
                                htmlDescription = hd.description().isEmpty() ? 
context.getHtmlDescription() : hd.description();
+                               htmlBranding = hd.branding().isEmpty() ? 
context.getHtmlBranding() : hd.branding();
                                htmlHeader = hd.header().isEmpty() ? 
context.getHtmlHeader() : hd.header();
                                htmlLinks = hd.links().isEmpty() ? 
context.getHtmlLinks() : hd.links();
                                htmlNav = hd.nav().isEmpty() ? 
context.getHtmlNav() : hd.nav();
@@ -875,6 +877,8 @@ class CallMethod implements Comparable<CallMethod>  {
                                        }
                                        if (k.equals(HTMLDOC_header))
                                                return htmlHeader == null ? 
null : req.resolveVars(htmlHeader);
+                                       if (k.equals(HTMLDOC_branding))
+                                               return htmlBranding == null ? 
null : req.resolveVars(htmlBranding);
                                        if (k.equals(HTMLDOC_links))
                                                return htmlLinks == null ? null 
: req.resolveVars(htmlLinks);
                                        if (k.equals(HTMLDOC_nav))

Reply via email to