juneau-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From jamesbog...@apache.org
Subject [juneau] 01/02: Move ArgsVar and ManifestFileVar to juneau-svl.
Date Fri, 02 Mar 2018 00:02:47 GMT
This is an automated email from the ASF dual-hosted git repository.

jamesbognar pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/juneau.git

commit 1b384bd48574ec8176ff929440d6e9889996fda9
Author: JamesBognar <jamesbognar@apache.org>
AuthorDate: Thu Mar 1 19:02:02 2018 -0500

    Move ArgsVar and ManifestFileVar to juneau-svl.
---
 .../java/org/apache/juneau/svl/VarResolver.java    |  20 +-
 .../org/apache/juneau/svl/VarResolverBuilder.java  |  15 +-
 .../java/org/apache/juneau/svl}/vars/ArgsVar.java  |  54 +-
 .../apache/juneau/svl}/vars/ManifestFileVar.java   |  34 +-
 juneau-doc/src/main/javadoc/overview.html          | 547 ++++++++++++---------
 .../src/main/javadoc/resources/juneau-doc.css      |   5 +
 .../juneau/examples/rest/AtomFeedResource.java     |   5 +-
 .../examples/rest/CodeFormatterResource.java       |   3 +-
 .../juneau/examples/rest/DirectoryResource.java    |   7 +-
 .../examples/rest/DockerRegistryResource.java      |   5 +-
 .../juneau/examples/rest/HelloWorldResource.java   |   4 +-
 .../juneau/examples/rest/JsonSchemaResource.java   |   2 +-
 .../examples/rest/MethodExampleResource.java       |   4 +-
 .../juneau/examples/rest/PetStoreResource.java     |   4 +-
 .../juneau/examples/rest/PhotosResource.java       |   4 +-
 .../examples/rest/PredefinedLabelsResource.java    |   4 +-
 .../juneau/examples/rest/RequestEchoResource.java  |   5 +-
 .../apache/juneau/examples/rest/RootResources.java |   2 +-
 .../juneau/examples/rest/SqlQueryResource.java     |   5 +-
 .../examples/rest/SystemPropertiesResource.java    |   5 +-
 .../juneau/examples/rest/TumblrParserResource.java |   6 +-
 .../examples/rest/UrlEncodedFormResource.java      |   3 +-
 .../rest/addressbook/AddressBookResource.java      |   2 +-
 .../apache/juneau/microservice/Microservice.java   |  81 ++-
 .../org/apache/juneau/microservice/Resource.java   |  65 ---
 .../apache/juneau/microservice/ResourceGroup.java  |  66 ---
 .../juneau/microservice/ResourceJenaGroup.java     |  90 ----
 ...sourceJena.java => RestServletJenaDefault.java} |  12 +-
 ...ResourceJena.java => RestServletJenaGroup.java} |  12 +-
 .../microservice/resources/ConfigResource.java     |   3 +-
 .../microservice/resources/DebugResource.java      |   2 +-
 .../microservice/resources/DirectoryResource.java  |   3 +-
 .../microservice/resources/LogsResource.java       |   3 +-
 .../microservice/resources/SampleRootResource.java |   4 +-
 .../microservice/resources/ShutdownResource.java   |   4 +-
 .../juneau/microservice/vars/package-info.java     |  18 -
 .../microservice/sample/HelloWorldResource.java    |   4 +-
 .../juneau/microservice/sample/RootResources.java  |   4 +-
 .../org/apache/juneau/rest/test/BpiResource.java   |   2 +-
 .../juneau/rest/test/ClientVersionResource.java    |   8 +-
 .../apache/juneau/rest/test/ConfigResource.java    |   3 +-
 .../juneau/rest/test/InterfaceProxyResource.java   |   2 +-
 .../juneau/rest/test/LargePojosResource.java       |   2 +-
 .../org/apache/juneau/rest/test/NlsResource.java   |   2 +-
 .../juneau/rest/test/RequestBeanProxyResource.java |   2 +-
 .../juneau/rest/test/ThirdPartyProxyResource.java  |   2 +-
 .../org/apache/juneau/rest/test/ConfigTest.java    |   2 +-
 .../org/apache/juneau/rest/RestContextBuilder.java |  10 +-
 ...vletGroupDefault.java => RestServletGroup.java} |   2 +-
 49 files changed, 508 insertions(+), 645 deletions(-)

diff --git a/juneau-core/juneau-svl/src/main/java/org/apache/juneau/svl/VarResolver.java b/juneau-core/juneau-svl/src/main/java/org/apache/juneau/svl/VarResolver.java
index c007a4c..a0b1af5 100644
--- a/juneau-core/juneau-svl/src/main/java/org/apache/juneau/svl/VarResolver.java
+++ b/juneau-core/juneau-svl/src/main/java/org/apache/juneau/svl/VarResolver.java
@@ -63,15 +63,17 @@ public class VarResolver {
 	 * Default string variable resolver with support for system properties and environment variables:
 	 * 
 	 * <ul>
-	 * 	<li><code>$S{key}</code>,<code>$S{key,default}</code> - {@link SystemPropertiesVar}
-	 * 	<li><code>$E{key}</code>,<code>$E{key,default}</code> - {@link EnvVariablesVar}
-	 * 	<li><code>$IF{booleanValue, thenValue[, elseValue]}</code> - {@link IfVar}
-	 * 	<li><code>$SW{stringValue, matchPattern:thenValue[, matchPattern:thenValue}</code> - {@link SwitchVar}
-	 * 	<li><code>$CO{arg1[,arg2...]}</code> - {@link CoalesceVar}
-	 * 	<li><code>$PM{stringValue,matchPattern}</code> - {@link PatternMatchVar}
-	 * 	<li><code>$UC{stringValue}</code> - {@link UpperCaseVar}
-	 * 	<li><code>$LC{stringValue}</code> - {@link LowerCaseVar}
-	 * 	<li><code>$NE{stringValue}</code> - {@link NotEmptyVar}
+	 * 	<li><code>$S{key[,default]}</code> - {@link SystemPropertiesVar}
+	 * 	<li><code>$E{key[,default]}</code> - {@link EnvVariablesVar}
+	 * 	<li><code>$A{key[,default]}</code> - {@link ArgsVar}
+	 * 	<li><code>$MF{key[,default]}</code> - {@link ManifestFileVar}
+	 * 	<li><code>$IF{arg,then[,else]}</code> - {@link IfVar}
+	 * 	<li><code>$SW{arg,pattern1:then1[,pattern2:then2...]}</code> - {@link SwitchVar}
+	 * 	<li><code>$CO{arg[,arg2...]}</code> - {@link CoalesceVar}
+	 * 	<li><code>$PM{arg,pattern}</code> - {@link PatternMatchVar}
+	 * 	<li><code>$UC{arg}</code> - {@link UpperCaseVar}
+	 * 	<li><code>$LC{arg}</code> - {@link LowerCaseVar}
+	 * 	<li><code>$NE{arg}</code> - {@link NotEmptyVar}
 	 * </ul>
 	 * 
 	 * @see SystemPropertiesVar
diff --git a/juneau-core/juneau-svl/src/main/java/org/apache/juneau/svl/VarResolverBuilder.java b/juneau-core/juneau-svl/src/main/java/org/apache/juneau/svl/VarResolverBuilder.java
index edea10e..18fde77 100644
--- a/juneau-core/juneau-svl/src/main/java/org/apache/juneau/svl/VarResolverBuilder.java
+++ b/juneau-core/juneau-svl/src/main/java/org/apache/juneau/svl/VarResolverBuilder.java
@@ -65,6 +65,8 @@ public class VarResolverBuilder {
 	 * <ul>
 	 * 	<li>{@link SystemPropertiesVar}
 	 * 	<li>{@link EnvVariablesVar}
+	 * 	<li>{@link ArgsVar}
+	 * 	<li>{@link ManifestFileVar}
 	 * 	<li>{@link SwitchVar}
 	 * 	<li>{@link IfVar}
 	 * 	<li>{@link CoalesceVar}
@@ -77,7 +79,18 @@ public class VarResolverBuilder {
 	 * @return This object (for method chaining).
 	 */
 	public VarResolverBuilder defaultVars() {
-		return vars(SystemPropertiesVar.class, EnvVariablesVar.class, SwitchVar.class, IfVar.class, CoalesceVar.class, PatternMatchVar.class, UpperCaseVar.class, LowerCaseVar.class, NotEmptyVar.class);
+		return vars(
+			SystemPropertiesVar.class, 
+			EnvVariablesVar.class, 
+			ManifestFileVar.class, 
+			ArgsVar.class,
+			SwitchVar.class, 
+			IfVar.class, 
+			CoalesceVar.class, 
+			PatternMatchVar.class, 
+			UpperCaseVar.class, 
+			LowerCaseVar.class, 
+			NotEmptyVar.class);
 	}
 
 	/**
diff --git a/juneau-microservice/juneau-microservice-server/src/main/java/org/apache/juneau/microservice/vars/ArgsVar.java b/juneau-core/juneau-svl/src/main/java/org/apache/juneau/svl/vars/ArgsVar.java
similarity index 69%
rename from juneau-microservice/juneau-microservice-server/src/main/java/org/apache/juneau/microservice/vars/ArgsVar.java
rename to juneau-core/juneau-svl/src/main/java/org/apache/juneau/svl/vars/ArgsVar.java
index d3cb8cb..b0b45f5 100644
--- a/juneau-microservice/juneau-microservice-server/src/main/java/org/apache/juneau/microservice/vars/ArgsVar.java
+++ b/juneau-core/juneau-svl/src/main/java/org/apache/juneau/svl/vars/ArgsVar.java
@@ -10,7 +10,9 @@
 // * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the License for the        *
 // * specific language governing permissions and limitations under the License.                                              *
 // ***************************************************************************************************************************
-package org.apache.juneau.microservice.vars;
+package org.apache.juneau.svl.vars;
+
+import static org.apache.juneau.internal.StringUtils.*;
 
 import org.apache.juneau.svl.*;
 import org.apache.juneau.utils.*;
@@ -19,23 +21,28 @@ import org.apache.juneau.utils.*;
  * JVM args variable resolver.
  * 
  * <p>
- * The format for this var is <js>"$ARG{argNameOrNum}"</js> or <js>"$ARG{argNameOrNum,defaultValue}"</js>
+ * The format for this var is <js>"$A{arg[,default]}"</js>.
  * 
  * <p>
- * This variable resolver requires that an {@link Args} object be set as a context object on the resolver or a
- * session object on the resolver session.
+ * This variable resolver requires that the command-line arguments be made available through any of the following:
+ * <ul class='spaced-list'>
+ * 	<li><js>"sun.java.command"</js> system property.
+ * 	<li><js>"juneau.args"</js> system property.
+ * 	<li>{@link #init(Args)} has been called.
+ * </ul>
  * 
  * <h5 class='section'>Example:</h5>
  * <p class='bcode'>
  * 	<jc>// Create an args object from the main(String[]) method.</jc>
  * 	Args args = new Args(argv);
  * 
- * 	<jc>// Create a variable resolver that resolves JVM arguments (e.g. "$ARG{1}")</jc>
- * 	VarResolver r = <jk>new</jk> VarResolver().addVars(ArgsVar.<js>class</js>)
- * 		.addContextObject(<jsf>SESSION_args</jsf>, args);
+ * 	ArgsVar.<jsm>init</jsm>(args);
+ * 
+ * 	<jc>// Create a variable resolver that resolves JVM arguments (e.g. "$A{1}")</jc>
+ * 	VarResolver r = <jk>new</jk> VarResolver().addVars(ArgsVar.<js>class</js>);
  * 
  * 	<jc>// Use it!</jc>
- * 	System.<jsf>out</jsf>.println(r.resolve(<js>"Arg #1 is set to $ARG{1}"</js>));
+ * 	System.<jsf>out</jsf>.println(r.resolve(<js>"Arg #1 is set to $A{1}"</js>));
  * </p>
  * 
  * <p>
@@ -47,23 +54,42 @@ import org.apache.juneau.utils.*;
  */
 public class ArgsVar extends DefaultingVar {
 
+	/** The name of this variable. */
+	public static final String NAME = "A";
+	
+	private static volatile Args ARGS;
+	
 	/**
-	 * The name of the session or context object that identifies the {@link Args} object.
+	 * Initialize the args for this variable.
+	 * 
+	 * @param args The parsed command-line arguments.
 	 */
-	public static final String SESSION_args = "args";
-
-	/** The name of this variable. */
-	public static final String NAME = "ARG";
+	public static void init(Args args) {
+		ARGS = args;
+	}
+	
+	private final Args args;
 
 	/**
 	 * Constructor.
 	 */
 	public ArgsVar() {
 		super(NAME);
+		if (ARGS != null)
+			this.args = ARGS;
+		else {
+			String s = System.getProperty("sun.java.command");
+			if (! isEmpty(s)) {
+				int i = s.indexOf(' ');
+				args = new Args(i == -1 ? "" : s.substring(i+1));
+			} else {
+				args = new Args(System.getProperty("juneau.args"));
+			}
+		}
 	}
 
 	@Override /* Var */
 	public String resolve(VarResolverSession session, String key) {
-		return session.getSessionObject(Args.class, SESSION_args).getArg(key);
+		return args.getArg(key);
 	}
 }
diff --git a/juneau-microservice/juneau-microservice-server/src/main/java/org/apache/juneau/microservice/vars/ManifestFileVar.java b/juneau-core/juneau-svl/src/main/java/org/apache/juneau/svl/vars/ManifestFileVar.java
similarity index 81%
rename from juneau-microservice/juneau-microservice-server/src/main/java/org/apache/juneau/microservice/vars/ManifestFileVar.java
rename to juneau-core/juneau-svl/src/main/java/org/apache/juneau/svl/vars/ManifestFileVar.java
index ae7d3a6..1740626 100644
--- a/juneau-microservice/juneau-microservice-server/src/main/java/org/apache/juneau/microservice/vars/ManifestFileVar.java
+++ b/juneau-core/juneau-svl/src/main/java/org/apache/juneau/svl/vars/ManifestFileVar.java
@@ -10,7 +10,7 @@
 // * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the License for the        *
 // * specific language governing permissions and limitations under the License.                                              *
 // ***************************************************************************************************************************
-package org.apache.juneau.microservice.vars;
+package org.apache.juneau.svl.vars;
 
 import org.apache.juneau.svl.*;
 import org.apache.juneau.utils.*;
@@ -19,20 +19,21 @@ import org.apache.juneau.utils.*;
  * Manifest file entries variable resolver.
  * 
  * <p>
- * The format for this var is <js>"$MF{key}"</js> or <js>"$MF{key,defaultValue}"</js>
+ * The format for this var is <js>"$MF{key[,default]}"</js>.
  * 
  * <p>
- * This variable resolver requires that a {@link ManifestFile} object be set as a context object on the resolver or a
- * session object on the resolver session.
+ * This variable resolver requires that a {@link ManifestFile} object be made available by calling 
+ * the {@link #init(ManifestFile)} method.
  * 
  * <h5 class='section'>Example:</h5>
  * <p class='bcode'>
  * 	<jc>// Create a ManifestFile object that contains the manifest of the jar file containing this class.</jc>
  * 	ManifestFile mf = <jk>new</jk> ManifestFile(<jk>this</jk>.getClass());
  * 
+ * 	ManifestFileVar.<jsm>init</jsm>(mf);
+ * 
  * 	<jc>// Create a variable resolver that resolves manifest file entries (e.g. "$MF{Main-Class}")</jc>
- * 	VarResolver r = <jk>new</jk> VarResolver().addVars(ManifestFile.<js>class</js>)
- * 		.addContextObject(<jsf>SESSION_manifest</jsf>, mf);
+ * 	VarResolver r = <jk>new</jk> VarResolver().addVars(ManifestFile.<js>class</js>);
  * 
  * 	<jc>// Use it!</jc>
  * 	System.<jsf>out</jsf>.println(r.resolve(<js>"The main class is $MF{Main-Class}"</js>));
@@ -47,23 +48,32 @@ import org.apache.juneau.utils.*;
  */
 public class ManifestFileVar extends DefaultingVar {
 
-	/**
-	 * The name of the session or context object that identifies the {@link ManifestFile} object.
-	 */
-	public static final String SESSION_manifest = "manifest";
-
 	/** The name of this variable. */
 	public static final String NAME = "MF";
 
+	private static volatile ManifestFile MANIFEST_FILE;
+	
+	/**
+	 * Initialize the manifest file for this variable.
+	 * 
+	 * @param manifestFile The parsed manifest file.
+	 */
+	public static void init(ManifestFile manifestFile) {
+		MANIFEST_FILE = manifestFile;
+	}
+	
+	private final ManifestFile manifestFile;
+	
 	/**
 	 * Constructor.
 	 */
 	public ManifestFileVar() {
 		super(NAME);
+		this.manifestFile = MANIFEST_FILE;
 	}
 
 	@Override /* Var */
 	public String resolve(VarResolverSession session, String key) {
-		return session.getSessionObject(ManifestFile.class, SESSION_manifest).getString(key);
+		return manifestFile == null ? "" : manifestFile.getString(key);
 	}
 }
diff --git a/juneau-doc/src/main/javadoc/overview.html b/juneau-doc/src/main/javadoc/overview.html
index 75106d4..1d42dc3 100644
--- a/juneau-doc/src/main/javadoc/overview.html
+++ b/juneau-doc/src/main/javadoc/overview.html
@@ -75,12 +75,12 @@
 
 <a id='TOC'></a><h5 class='toc'>Table of Contents</h5>
 <ol class='toc'>
-	<li><p><a class='doclink' href='#Intro'>Introduction</a></p>
+	<li><p class='toc2'><a class='doclink' href='#Intro'>Introduction</a></p>
 	<ol>
 		<li><p><a class='doclink' href='#Intro.Features'>Features</a></p>
 		<li><p><a class='doclink' href='#Intro.Components'>Components</a></p>
 	</ol>
-	<li><p><a class='doclink' href='#juneau-marshall'><i>juneau-marshall</i></a></p>
+	<li><p class='toc2'><a class='doclink' href='#juneau-marshall'><i>juneau-marshall</i></a></p>
 	<ol>
 		<li><p><a class='doclink' href='#juneau-marshall.Serializers'>Serializers</a></p>
 		<li><p><a class='doclink' href='#juneau-marshall.Parsers'>Parsers</a></p>
@@ -128,21 +128,21 @@
 			<li><p><a class='doclink' href='#juneau-marshall.AdditionalInfo.URLEncoding'>URL-Encoding</a></p>
 		</ol>
 	</ol>
-	<li><p><a class='doclink' href='#juneau-marshall-rdf'><i>juneau-marshall-rdf</i></a></p>
-	<li><p><a class='doclink' href='#juneau-dto'><i>juneau-dto</i></a></p>
+	<li><p class='toc2'><a class='doclink' href='#juneau-marshall-rdf'><i>juneau-marshall-rdf</i></a></p>
+	<li><p class='toc2'><a class='doclink' href='#juneau-dto'><i>juneau-dto</i></a></p>
 	<ol>
 		<li><p><a class='doclink' href='#juneau-dto.HTML5'>HTML5</a></p>
 		<li><p><a class='doclink' href='#juneau-dto.Atom'>Atom</a></p>
 		<li><p><a class='doclink' href='#juneau-dto.Swagger'>Swagger</a></p>
 	</ol>
-	<li><p><a class='doclink' href='#juneau-svl'><i>juneau-svl</i></a></p>
+	<li><p class='toc2'><a class='doclink' href='#juneau-svl'><i>juneau-svl</i></a></p>
 	<ol>
 		<li><p><a class='doclink' href='#juneau-svl.SimpleVarLanguage'>Simple Variable Language</a></p>
 		<li><p><a class='doclink' href='#juneau-svl.SvlVariables'>SVL Variables</a></p>
 		<li><p><a class='doclink' href='#juneau-svl.VarResolvers'>VarResolvers and VarResolverSessions</a></p>
 		<li><p><a class='doclink' href='#juneau-svl.OtherNotes'>Other Notes</a></p>
 	</ol>
-	<li><p><a class='doclink' href='#juneau-config'><i>juneau-config</i></a></p>
+	<li><p class='toc2'><a class='doclink' href='#juneau-config'><i>juneau-config</i></a></p>
 	<ol>
 		<li><p><a class='doclink' href='#juneau-config.Overview'>Overview</a></p>
 		<ol>
@@ -177,11 +177,12 @@
 			<li><p><a class='doclink' href='#juneau-config.ConfigMemoryStore'>ConfigMemoryStore</a></p>
 			<li><p><a class='doclink' href='#juneau-config.ConfigFileStore'>ConfigFileStore</a></p>
 			<li><p><a class='doclink' href='#juneau-config.CustomConfigStores"'>Custom ConfigStores</a></p>
+			<li><p><a class='doclink' href='#juneau-config.ConfigStoreListeners"'>ConfigStore Listeners</a></p>
 		</ol>
 		<li><p><a class='doclink' href='#juneau-config.ReadOnlyConfigs'>Read-only Configs</a></p>
 		<li><p><a class='doclink' href='#juneau-config.ClosingConfigs'>Closing Configs</a></p>
 	</ol>
-	<li><p><a class='doclink' href='#juneau-rest-server'><i>juneau-rest-server</i></a></p>
+	<li><p class='toc2'><a class='doclink' href='#juneau-rest-server'><i>juneau-rest-server</i></a></p>
 	<ol>
 		<li><p><a class='doclink' href='#juneau-rest-server.HelloWorldExample'>Hello World Example</a></p>
 		<li><p><a class='doclink' href='#juneau-rest-server.ClassHierarchy'>Class Hierarchy</a></p>
@@ -266,11 +267,11 @@
 		<li><p><a class='doclink' href='#juneau-rest-server.PredefinedLabelBeans'>Predefined Label Beans</a></p>
 		<li><p><a class='doclink' href='#juneau-rest-server.OtherNotes'>Other Notes</a></p>
 	</ol>
-	<li><p><a class='doclink' href='#juneau-rest-server-jaxrs'><i>juneau-rest-server-jaxrs</i></a></p>
+	<li><p class='toc2'><a class='doclink' href='#juneau-rest-server-jaxrs'><i>juneau-rest-server-jaxrs</i></a></p>
 	<ol>
 		<li><p><a class='doclink' href='#juneau-rest-server-jaxrs.BaseProvider'>Juneau JAX-RS Provider</a></p>
 	</ol>	
-	<li><p><a class='doclink' href='#juneau-rest-client'><i>juneau-rest-client</i></a></p>
+	<li><p class='toc2'><a class='doclink' href='#juneau-rest-client'><i>juneau-rest-client</i></a></p>
 	<ol>
 		<li><p><a class='doclink' href='#juneau-rest-client.3rdPartyProxies'>Interface Proxies Against 3rd-party REST Interfaces</a></p>
 		<li><p><a class='doclink' href='#juneau-rest-client.SSL'>SSL Support</a></p>
@@ -291,7 +292,7 @@
 		<li><p><a class='doclink' href='#juneau-rest-client.Remoteable'>Remoteable Proxies</a></p>
 		<li><p><a class='doclink' href='#juneau-rest-client.Other'>Other Useful Methods</a></p>
 	</ol>
-	<li><p><a class='doclink' href='#juneau-microservice-server'><i>juneau-microservice-server</i></a></p>
+	<li><p class='toc2'><a class='doclink' href='#juneau-microservice-server'><i>juneau-microservice-server</i></a></p>
 	<ol>
 		<li><p><a class='doclink' href='#juneau-microservice-server.Introduction'>Microservice Introduction</a></p>
 		<li><p><a class='doclink' href='#juneau-microservice-server.GettingStarted'>Getting Started</a></p>
@@ -315,8 +316,8 @@
 			<li><p><a class='doclink' href='#juneau-microservice-server.ExtendingRestMicroservice'>Extending RestMicroservice</a></p>
 		</ol>
 	</ol>
-	<li><p><a class='doclink' href='#juneau-examples-core'><i>juneau-examples-core</i></a></p>
-	<li><p><a class='doclink' href='#juneau-examples-rest'><i>juneau-examples-rest</i></a></p>
+	<li><p class='toc2'><a class='doclink' href='#juneau-examples-core'><i>juneau-examples-core</i></a></p>
+	<li><p class='toc2'><a class='doclink' href='#juneau-examples-rest'><i>juneau-examples-rest</i></a></p>
 	<ol>
 		<li><p><a class='doclink' href='#juneau-examples-rest.RootResources'>RootResources</a></p>
 		<li><p><a class='doclink' href='#juneau-examples-rest.HelloWorldResource'>HelloWorldResource</a></p>
@@ -344,8 +345,8 @@
 		<li><p><a class='doclink' href='#juneau-examples-rest.ConfigResource'>ConfigResource</a></p>
 		<li><p><a class='doclink' href='#juneau-examples-rest.LogsResource'>LogsResource</a></p>
 	</ol>
-	<li><p><a class='doclink' href='#Security'>Security Best-Practices</a></p>
-	<li><p><a class='doclink' href='#ReleaseNotes'>Release Notes</a></p>
+	<li><p class='toc2'><a class='doclink' href='#Security'>Security Best-Practices</a></p>
+	<li><p class='toc2'><a class='doclink' href='#ReleaseNotes'>Release Notes</a></p>
 </ol>
 
 <!-- =============================================================================================================== -->
@@ -393,18 +394,21 @@
 	<h3 class='topic' onclick='toggle(this)'>1.1 - Features</h3>
 	<div class='topic'>
 		<ul class='spaced-list'>
-			<li>
-				KISS is our mantra!  No auto-wiring.  No code generation.  No dependency injection (but still compatible with).  
-				Just add it to your classpath and use it.  Extremely simple unit testing! 
-			<li>
-				Extensive and extensible support for a large variety of POJOs, including structured data (beans) and 
-				unstructured data (<code>Maps</code> and <code>Collections</code>).
-			<li>
-				Sophisticated configurable serializers and parsers. 
-				<br>For example, the JSON serializers and parsers can handle strict or lax syntax, comments, 
-				concatenated strings, etc...
+			<li>KISS is our mantra!  No auto-wiring.  No code generation.  No dependency injection.  Just add it to your classpath and use it.  Extremely simple unit testing!
+			<li>Enjoyable to use
 			<li>Tiny - ~1MB
 			<li>Exhaustively tested
+			<li>Lots of up-to-date documentation and examples
+			<li>Minimal library dependencies: 
+				<ul>
+					<li><b>juneau-marshall</b>, <b>juneau-dto</b>, <b>juneau-svl</b>, <b>juneau-config</b> - No external dependencies.  Entirely self-contained.
+					<li><b>juneau-marshall-rdf</b> - Optional RDF support.  Requires Apache Jena 2.7.1+.
+					<li><b>juneau-rest-server</b> - Any Servlet 3.1.0+ container.
+					<li><b>juneau-rest-client</b> - Apache HttpClient 4.5+.
+					<li><b>juneau-microservice</b> - Eclipse Jetty.
+				</ul>
+			<li>Built on top of Servlet and Apache HttpClient APIs that allow you to use the newest HTTP/2 features
+				such as request/response multiplexing and server push.
 		</ul>
 	</div>
 		
@@ -1261,9 +1265,12 @@
 		<p>
 			Transforms are added to serializers and parsers (and REST clients) using the following configuration properties:
 		</p> 
-		<ul>
-			<li class='jm'>{@link org.apache.juneau.BeanContext#BEAN_beanFilters}
-			<li class='jm'>{@link org.apache.juneau.BeanContext#BEAN_pojoSwaps}
+		<ul class='doctree'>
+			<li class='jc'>{@link org.apache.juneau.BeanContext}
+			<ul>
+				<li class='jf'>{@link org.apache.juneau.BeanContext#BEAN_beanFilters BEAN_beanFilters}
+				<li class='jf'>{@link org.apache.juneau.BeanContext#BEAN_pojoSwaps BEAN_pojoSwaps}
+			</ul>
 		</ul>
 		<p>
 			Annotations are also provided for specifying transforms directly on classes and methods (all described in later sections):
@@ -4383,17 +4390,21 @@
 			<br>The {@link org.apache.juneau.svl.VarResolver#DEFAULT} resolver is a reusable instance of this class 
 			configured with the following basic variables:
 		</p>
-		<ul>
-			<li><code>$S{key}</code>,<code>$S{key,default}</code> - System properties.
-	 		<li><code>$E{key}</code>,<code>$E{key,default}</code> - Environment variables.
+		<ul class='doctree'>
+			<li class='jc'>{@link org.apache.juneau.svl.vars.SystemPropertiesVar} - <code>$S{key[,default]}</code>
+	 		<li class='jc'>{@link org.apache.juneau.svl.vars.EnvVariablesVar} - <code>$E{key[,default]}</code>
 		</ul>
 		<p>
 			The following logic variables are also provided:
 		</p>
-		<ul>
-	 		<li><code>$IF{booleanValue,thenValue[,elseValue]}</code> - If-else patterns.
-	 		<li><code>$SW{test,matchPattern:thenValue[,matchPattern:thenValue...][,elseValue]}</code> - Switch patterns.
-	 		<li><code>$CO{arg1[,arg2...]}</code> - Coalesce variable.
+		<ul class='doctree'>
+	 		<li class='jc'>{@link org.apache.juneau.svl.vars.IfVar} - <code>$IF{arg,then[,else]}</code>
+	 		<li class='jc'>{@link org.apache.juneau.svl.vars.SwitchVar} - <code>$SW{arg,pattern1:then1[,pattern2:then2...]}</code>
+	 		<li class='jc'>{@link org.apache.juneau.svl.vars.CoalesceVar} - <code>$CO{arg1[,arg2...]}</code>
+	 		<li class='jc'>{@link org.apache.juneau.svl.vars.PatternMatchVar} - <code>$PM{arg,pattern}</code> 
+	 		<li class='jc'>{@link org.apache.juneau.svl.vars.NotEmptyVar} - <code>$NE{arg}</code>
+	 		<li class='jc'>{@link org.apache.juneau.svl.vars.UpperCaseVar} - <code>$UC{arg}</code>
+	 		<li class='jc'>{@link org.apache.juneau.svl.vars.LowerCaseVar} - <code>$LC{arg}</code>
 		</ul>
 		<h5 class='figure'>Example:</h5>
 		<p class='bcode'>
@@ -4474,39 +4485,63 @@
 				<th>Module</th><th>Class</th><th>Pattern</th>
 			</tr>
 			<tr class='dark'>
-				<td rowspan="6" style='text-align:center;font-weight:bold;padding:20px;' class='code'>juneau-svl</td>
+				<td rowspan="9" style='text-align:center;font-weight:bold;padding:20px;' class='code'>juneau-svl</td>
 				<td>{@link org.apache.juneau.svl.vars.EnvVariablesVar}</td>
-				<td class='code'>$E{envVar[,defaultValue]}</td>
+				<td class='code'>$E{key[,default]}</td>
 			</tr>
 			<tr class='dark'>
 				<td>{@link org.apache.juneau.svl.vars.SystemPropertiesVar}</td>
-				<td class='code'>$S{systemProperty[,defaultValue]}</td>
+				<td class='code'>$S{key[,default]}</td>
 			</tr>
 			<tr class='dark'>
-				<td>{@link org.apache.juneau.svl.vars.CoalesceVar}</td>
-				<td class='code'>$CO{arg1[,arg2...]}</td>
+				<td>{@link org.apache.juneau.svl.vars.ArgsVar}</td>
+				<td class='code'>$A{key[,default]}</td>
+			</tr>
+			<tr class='dark'>
+				<td>{@link org.apache.juneau.svl.vars.ManifestFileVar}</td>
+				<td class='code'>$MF{key[,default]}</td>
 			</tr>
 			<tr class='dark'>
 				<td>{@link org.apache.juneau.svl.vars.IfVar}</td>
-				<td class='code'>$IF{booleanArg ? thenValue}<br>$IF{booleanArg ? thenValue : elseValue}</td>
+				<td class='code'>$IF{arg,then[,else]}</td>
 			</tr>
 			<tr class='dark dd'>
 				<td>{@link org.apache.juneau.svl.vars.SwitchVar}</td>
-				<td class='code'>$SW{stringArg ? pattern: value, pattern: value, ...}</td>
+				<td class='code'>$SW{arg,pattern1:then1[,pattern2:then2...]}</td>
+			</tr>
+			<tr class='dark'>
+				<td>{@link org.apache.juneau.svl.vars.CoalesceVar}</td>
+				<td class='code'>$CO{arg1[,arg2...]}</td>
+			</tr>
+			<tr class='dark'>
+				<td>{@link org.apache.juneau.svl.vars.PatternMatchVar}</td>
+				<td class='code'>$PM{arg,pattern}</td>
+			</tr>
+			<tr class='dark'>
+				<td>{@link org.apache.juneau.svl.vars.NotEmptyVar}</td>
+				<td class='code'>$NE{arg}</td>
+			</tr>
+			<tr class='dark'>
+				<td>{@link org.apache.juneau.svl.vars.UpperCaseVar}</td>
+				<td class='code'>$UC{arg}</td>
+			</tr>
+			<tr class='dark'>
+				<td>{@link org.apache.juneau.svl.vars.LowerCaseVar}</td>
+				<td class='code'>$LC{arg}</td>
 			</tr>
 			<tr class='light dd'>
 				<td rowspan="1" style='text-align:center;font-weight:bold;padding:20px;' class='code'>juneau-config</td>
 				<td>{@link org.apache.juneau.config.vars.ConfigVar}</td>
-				<td class='code'>$C{key[,defaultValue]}</td>
+				<td class='code'>$C{key[,default]}</td>
 			</tr>
 			<tr class='dark'>
 				<td rowspan="14" style='text-align:center;font-weight:bold;padding:20px;' class='code'>juneau-rest-server</td>
 				<td>{@link org.apache.juneau.rest.vars.FileVar}</td>
-				<td class='code'>$F{path[,defaultValue]}}</td>
+				<td class='code'>$F{path[,default]}}</td>
 			</tr>
 			<tr class='dark'>
 				<td>{@link org.apache.juneau.rest.vars.ServletInitParamVar}</td>
-				<td class='code'>$I{name[,defaultValue]}</td>
+				<td class='code'>$I{name[,default]}</td>
 			</tr>
 			<tr class='dark'>
 				<td>{@link org.apache.juneau.rest.vars.LocalizationVar}</td>
@@ -4542,7 +4577,7 @@
 			</tr>
 			<tr class='dark'>
 				<td>{@link org.apache.juneau.rest.vars.SerializedRequestAttrVar}</td>
-				<td class='code'>$SA{contentType,key[,defaultValue]}</td>
+				<td class='code'>$SA{contentType,key[,default]}</td>
 			</tr>
 			<tr class='dark'>
 				<td>{@link org.apache.juneau.rest.vars.UrlVar}</td>
@@ -4554,16 +4589,7 @@
 			</tr>
 			<tr class='dark dd'>
 				<td>{@link org.apache.juneau.rest.vars.WidgetVar}</td>
-				<td class='code'>$W{widgetName}</td>
-			</tr>
-			<tr class='light'>
-				<td rowspan="2" style='text-align:center;font-weight:bold;padding:20px;' class='code'>juneau-microservice-server</td>
-				<td>{@link org.apache.juneau.microservice.vars.ArgsVar}</td>
-				<td class='code'>$ARG{key[,defaultValue]}</td>
-			</tr>
-			<tr class='light dd'>
-				<td>{@link org.apache.juneau.microservice.vars.ManifestFileVar}</td>
-				<td class='code'>$MF{key[,defaultValue]}</td>
+				<td class='code'>$W{name}</td>
 			</tr>
 		</table>
 	</div>
@@ -4622,7 +4648,7 @@
 		
 		<h5 class='figure'>Example:</h5>
 		<p class='bcode'>
-	<jc>// Create a resolver that copies the default resolver and adds $C and $ARG vars.</jc>
+	<jc>// Create a resolver that copies the default resolver and adds $C and $A vars.</jc>
 	VarResolver myVarResolver = VarResolver.<jsf>DEFAULT</jsf>
 		.builder()
 		.vars(ConfigVar.<jk>class</jk>, ArgsVar.<jk>class</jk>)
@@ -5124,9 +5150,7 @@
 				<li><code>getObject(<js>"..."</js>, HashMap.<jk>class</jk>, Integer.<jk>class</jk>, ArrayList.<jk>class</jk>, MyBean[].<jk>class</jk>)</code>
 					<br>Produces: <code>LinkedHashMap&lt;Integer,ArrayList&lt;MyBean[]&gt;&gt;</code> 
 			</ul>
-			<p>
-				For example:
-			</p>
+			<h5 class='figure'>Example:</h5>
 			<p class='bcode'>
 	<ck>addresses</ck> = 
 		<cv>[
@@ -5256,10 +5280,10 @@
 			By default, <code>Configs</code> use the {@link org.apache.juneau.svl.VarResolver#DEFAULT} variable resolver
 			which provides support for the following variables and constructs:
 		</p>
-		<ul class='spaced-list'>
-			<li><code>$C{key}</code>, <code>$C{key,default}</code> - {@link org.apache.juneau.config.vars.ConfigVar}
-			<li><code>$S{key}</code>, <code>$S{key,default}</code> - {@link org.apache.juneau.svl.vars.SystemPropertiesVar}
-			<li><code>$E{key}</code>, <code>$E{key,default}</code> - {@link org.apache.juneau.svl.vars.EnvVariablesVar}
+		<ul class='doctree'>
+			<li class='jc'>{@link org.apache.juneau.svl.vars.SystemPropertiesVar} - <code>$S{key[,default]}</code>
+	 		<li class='jc'>{@link org.apache.juneau.svl.vars.EnvVariablesVar} - <code>$E{key[,default]}</code>
+	 		<li class='jc'>{@link org.apache.juneau.config.vars.ConfigVar} - <code>$C{key[,default]}</code>
 		</ul>
 		<p>
 			The variable resolver is controlled via the following setting:
@@ -5281,14 +5305,14 @@
 			<p>
 				The default variable resolver also provides the following logic variables for performing simple logical operations:
 			</p>
-			<ul class='spaced-list'>
-				<li><code>$IF{booleanValue, thenValue[, elseValue]}</code> - {@link org.apache.juneau.svl.vars.IfVar}
-				<li><code>$SW{stringValue, matchPattern:thenValue[ ,matchPattern:thenValue...]}</code> - {@link org.apache.juneau.svl.vars.SwitchVar}
-				<li><code>$CO{arg1[, arg2...]}</code> - {@link org.apache.juneau.svl.vars.CoalesceVar}
-				<li><code>$PM{stringValue, matchPattern}</code> - {@link org.apache.juneau.svl.vars.PatternMatchVar}
-				<li><code>$UC{stringValue}</code> - {@link org.apache.juneau.svl.vars.UpperCaseVar}
-				<li><code>$LC{stringValue}</code> - {@link org.apache.juneau.svl.vars.LowerCaseVar}
-				<li><code>$NE{stringValue}</code> - {@link org.apache.juneau.svl.vars.NotEmptyVar}
+			<ul class='doctree'>
+		 		<li class='jc'>{@link org.apache.juneau.svl.vars.IfVar} - <code>$IF{arg,then[,else]}</code>
+		 		<li class='jc'>{@link org.apache.juneau.svl.vars.SwitchVar} - <code>$SW{arg,pattern1:then1[,pattern2:then2...]}</code>
+		 		<li class='jc'>{@link org.apache.juneau.svl.vars.CoalesceVar} - <code>$CO{arg1[,arg2...]}</code>
+		 		<li class='jc'>{@link org.apache.juneau.svl.vars.PatternMatchVar} - <code>$PM{arg,pattern}</code> 
+		 		<li class='jc'>{@link org.apache.juneau.svl.vars.NotEmptyVar} - <code>$NE{arg}</code>
+		 		<li class='jc'>{@link org.apache.juneau.svl.vars.UpperCaseVar} - <code>$UC{arg}</code>
+		 		<li class='jc'>{@link org.apache.juneau.svl.vars.LowerCaseVar} - <code>$LC{arg}</code>
 			</ul>
 			<p>
 				The <code>$IF</code> variable can be used for simple if/else logic:
@@ -5458,9 +5482,9 @@
 		<p class='bcode'>
 	<jc>// Example bean</jc>
 	<jk>public class</jk> Address {
-		public String street, city;
-		public StateEnum state;
-		public int zip;
+		<jk>public</jk> String <jf>street</jf>, <jf>city</jf>;
+		<jk>public</jk> StateEnum <jf>state</jf>;
+		<jk>public int</jk> <jf>zip</jf>;
 	}
 
 	<jc>// Example usage</jc>
@@ -5785,13 +5809,17 @@
 		<ul class='doctree'>
 			<li class='jc'>{@link org.apache.juneau.config.Config}
 			<ul>
-				<li class='jm'>{@link org.apache.juneau.config.Config#writeTo(Writer)}
-				<li class='jm'>{@link org.apache.juneau.config.Config#toString()}
+				<li class='jm'>{@link org.apache.juneau.config.Config#writeTo(Writer) writeTo(Writer)}
+				<li class='jm'>{@link org.apache.juneau.config.Config#toString() toString()}
 			</ul>
 		</ul>
 		<p>
 			Both methods are thread safe.
 		</p>
+		<p>
+			The <code>Config</code> class implements the {@link org.apache.juneau.Writable} which means it can be 
+			returned as-is by REST methods to be serialized as INI text.
+		</p>
 	</div>
 
 	<!-- ======================================================================================================== -->
@@ -5825,10 +5853,14 @@
 		</p>
 		<p class='bcode'>
 	<jk>public</jk> String write(String name, String oldContents, String newContents) {
+	
 		<jc>// If the old contents match the current stored contents, the new contents will get stored, 
-		//	and the method returns null.
+		//	and the method returns null indicating success.
+	
 		// If the old contents DO NOT match the current stored contents (i.e. it was modified in some way), 
-		//	the new contents are NOT stored, and the method returns the current stored contents.</jc>
+		//	the new contents are NOT stored, and the method returns the current stored contents.
+	
+		// If the old contents are null, then just always write the new contents.</jc>
 	}
 		</p>
 		<p>
@@ -5840,30 +5872,6 @@
 	}
 		</p>
 		<p>
-			The <code>ConfigStore</code> class also has the following listener methods:
-		</p>
-		<ul class='doctree'>
-			<li class='jac'>{@link org.apache.juneau.config.store.ConfigStore}
-			<ul>
-				<li class='jm'>{@link org.apache.juneau.config.store.ConfigStore#register(String,ConfigStoreListener) register(String,ConfigStoreListener)} - Register a listener on the specified config name.
-				<li class='jm'>{@link org.apache.juneau.config.store.ConfigStore#unregister(String,ConfigStoreListener) unregister(String,ConfigStoreListener)} - Unregister a listener on the specified config name.
-			</ul>
-		</ul>
-		<p>
-			Note that this is a different listener than {@link org.apache.juneau.config.event.ConfigEventListener}.
-			<br>In this case, we're just listening for changed files:
-		</p>		
-		<ul class='doctree'>
-			<li class='jic'>{@link org.apache.juneau.config.store.ConfigStoreListener}
-			<ul>
-				<li class='jm'>{@link org.apache.juneau.config.store.ConfigStoreListener#onChange(String)} - Called when file changes.  New contents are passed in.
-			</ul>
-		</ul>
-		<p>
-			This listener is used by the <code>Config</code> class to listen for changes on the file system so that it can be
-			updated in real-time.
-		</p>
-		<p>
 			Two configuration stores are provided by default:
 		</p>
 		<ul>
@@ -5979,7 +5987,7 @@
 				The <code>ConfigStore</code> API has been written to allow easy development of custom configuration storage classes.
 			</p>
 			<p>
-				The example belows shows a starting point for an implementation based on a relational database.
+				The example below shows a starting point for an implementation based on polling a relational database.
 				<br>Completing it is left as an exercise:
 			</p>
 			<h5 class='figure'>Example Store Class:</h5>
@@ -5990,13 +5998,14 @@
 		<jk>static final</jk> String
 			<jsf>CONFIGSQLSTORE_jdbcUrl</jsf> = <js>"ConfigSqlStore.jdbcUrl.s"</js>,
 			<jsf>CONFIGSQLSTORE_tableName</jsf> = <js>"ConfigSqlStore.tableName.s"</js>,
-			<jsf>CONFIGSQLSTORE_nameColumn</jsf> = <js>"ConfigSqlStore.nameColumn.s"</js>;
-			<jsf>CONFIGSQLSTORE_valueColumn</jsf> = <js>"ConfigSqlStore.valueColumn.s"</js>;
+			<jsf>CONFIGSQLSTORE_nameColumn</jsf> = <js>"ConfigSqlStore.nameColumn.s"</js>,
+			<jsf>CONFIGSQLSTORE_valueColumn</jsf> = <js>"ConfigSqlStore.valueColumn.s"</js>,
+			<jsf>CONFIGSQLSTORE_pollInterval</jsf> = <js>"ConfigSqlStore.pollInterval.i"</js>;
 
 		<jc>// Instance fields</jc>
 		<jk>private final</jk> String <jf>jdbcUrl</jf>;
 		<jk>private final</jk> String <jf>tableName</jf>, <jf>nameColumn</jf>, <jf>valueColumn</jf>;
-		<jk>private final</jk> Thread <jf>watcherThread</jf>;
+		<jk>private final</jk> Timer <jf>watcher</jf>;
 		<jk>private final</jk> ConcurrentHashMap&lt;String,String&gt; <jf>cache</jf> = <jk>new</jk> ConcurrentHashMap&lt;&gt;();
 
 	
@@ -6008,17 +6017,21 @@
 			<jk>this</jk>.<jf>tableName</jf> = getStringProperty(<jsf>CONFIGSQLSTORE_tableName</jsf>);
 			<jk>this</jk>.<jf>nameColumn</jf> = getStringProperty(<jsf>CONFIGSQLSTORE_nameColumn</jsf>);
 			<jk>this</jk>.<jf>valueColumn</jf> = getStringProperty(<jsf>CONFIGSQLSTORE_valueColumn</jsf>);		
+
+			<jk>int</jk> pollInterval = getStringProperty(<jsf>CONFIGSQLSTORE_pollInterval</jsf>, 600);
 			
-			<jk>this</jk>.watcherThread = <jk>new</jk> Thread() {
-				<ja>@Override</ja> <jc>/* Thread */</jc>
+			TimerTask timerTask = <jk>new</jk> TimerTask() {
+				<ja>@Override</ja>
 				<jk>public void</jk> run() {
-					ConfigSqlStore.<jk>this</jk>.checkForUpdates();
+					ConfigSqlStore.<jk>this</jk>.poll();
 				}
-			};	
-			watcherThread.start();					
+			};
+
+			<jk>this</jk>.<jf>watcher</jf> = <jk>new</jk> Timer(<js>"MyTimer"</js>);
+			<jf>watcher</jf>.scheduleAtFixedRate(timerTask, 0, pollInterval * 10000);
 		}
 		
-		<jk>private synchronized void</jk> checkForUpdates() {
+		<jk>private synchronized void</jk> poll() {
 		
 			<jc>// Loop through all our entries and find the latest values.</jc>
 			<jk>for</jk> (Map.Entry&lt;String,String&gt; e : cache.entrySet()) {
@@ -6042,7 +6055,7 @@
 		<jk>public synchronized</jk> String read(String name) {
 			String contents = <jf>cache</jf>.get(name);
 			<jk>if</jk> (contents == <jk>null</jk>) {
-				contents = readDatabaseValue(name);
+				contents = getDatabaseValue(name);
 				update(name, contents);
 			}
 			<jk>return</jk> contents;
@@ -6077,7 +6090,7 @@
 		<ja>@Override</ja> <jc>/* Closeable */</jc>
 		<jk>public synchronized void</jk> close() {
 			<jk>if</jk> (watcher != <jk>null</jk>)
-				watcher.interrupt();
+				watcher.cancel();
 		}
 	}
 			</p>
@@ -6117,13 +6130,47 @@
 			<jk>return this</jk>;
 		}
 
+		<jk>public</jk> ConfigSqlStoreBuilder pollInterval(<jk>int</jk> value) {
+			<jk>super</jk>.set(<jsf>CONFIGSQLSTORE_pollInterval</jsf>, value);
+			<jk>return this</jk>;
+		}
+
 		<ja>@Override</ja> <jc>/* ContextBuilder */</jc>
 		<jk>public</jk> ConfigFileStore build() {
 			<jk>return new</jk> ConfigFileStore(getPropertyStore());
 		}
 	}
 		</div>
-	
+		
+		<!-- ======================================================================================================== -->
+		<a id="juneau-config.ConfigStoreListeners"></a>
+		<h4 class='topic' onclick='toggle(this)'>6.11.4 - ConfigStore Listeners</h4>
+		<div class='topic'>
+			<p>
+				The <code>ConfigStore</code> class has the following listener methods:
+			</p>
+			<ul class='doctree'>
+				<li class='jac'>{@link org.apache.juneau.config.store.ConfigStore}
+				<ul>
+					<li class='jm'>{@link org.apache.juneau.config.store.ConfigStore#register(String,ConfigStoreListener) register(String,ConfigStoreListener)} - Register a listener on the specified config name.
+					<li class='jm'>{@link org.apache.juneau.config.store.ConfigStore#unregister(String,ConfigStoreListener) unregister(String,ConfigStoreListener)} - Unregister a listener on the specified config name.
+				</ul>
+			</ul>
+			<p>
+				Note that this is a different listener than {@link org.apache.juneau.config.event.ConfigEventListener}.
+				<br>In this case, we're just listening for changed files:
+			</p>		
+			<ul class='doctree'>
+				<li class='jic'>{@link org.apache.juneau.config.store.ConfigStoreListener}
+				<ul>
+					<li class='jm'>{@link org.apache.juneau.config.store.ConfigStoreListener#onChange(String)} - Called when file changes.  New contents are passed in.
+				</ul>
+			</ul>
+			<p>
+				This listener is used by the <code>Config</code> class to listen for changes on the file system so that it can be
+				updated in real-time.
+			</p>
+		</div>	
 	</div>
 
 	<!-- ======================================================================================================== -->
@@ -6154,6 +6201,7 @@
 			In general, it's good practice to close Config if you're only creating them temporarily so that
 			their listeners get unregistered from the underlying storage APIs.
 		</p>
+		<h5 class='figure'>Example:</h5>
 		<p class='bcode'>
 	<jc>// Create a transient config.</jc>
 	Config c = Config.<jsm>create</jsm>(<js>"MyConfig.cfg"</js>).build();
@@ -6314,9 +6362,7 @@
 			Our servlet code is shown below:
 		</p>
 		<p class='bcode'>
-	<jd>/** 
-	 * Sample REST resource that prints out a simple "Hello world!" message.
-	 */</jd>
+	<jc>// Sample REST resource that prints out a simple "Hello world!" message.</jc>
 	<ja>@RestResource</ja>(
 		path=<js>"/helloWorld"</js>,
 		title=<js>"Hello World"</js>,
@@ -6377,18 +6423,9 @@
 						<ul>
 							<li class='jac'>{@link org.apache.juneau.rest.RestServletDefault org.apache.juneau.rest.RestServletDefault}
 								<br>Provides a default set of serializers, parsers, options page, stylesheet, and other common settings.
-								<br><b>Developers will typically subclass this when creating REST resources in JEE environments.</b> 
 								<ul>
-									<li class='jac'>{@link org.apache.juneau.microservice.Resource org.apache.juneau.microservice.Resource}
-										<br>Identical to <l>RestServletDefault</l> but provides support for <code>$ARGS</code> and <code>$MF</code> variables.
-										<br><b>Developers will typically subclass this when creating microservices.</b> 
-									<li class='jac'>{@link org.apache.juneau.rest.RestServletGroupDefault org.apache.juneau.rest.RestServletGroupDefault}
+									<li class='jac'>{@link org.apache.juneau.rest.RestServletGroup org.apache.juneau.rest.RestServletGroup}
 										<br>A default implementation for "router" pages.
-										<ul>
-											<li class='jac'>{@link org.apache.juneau.microservice.ResourceGroup org.apache.juneau.microservice.ResourceGroup}
-											<br>Identical to <l>RestServletGroupDefault</l> but provides support for <code>$ARGS</code> and <code>$MF</code> variables.
-											<br><b>Developers will typically subclass this when creating microservice groups.</b> 
-										</ul>
 									</li>
 								</ul>
 							</li>
@@ -6419,14 +6456,24 @@
 		<p>
 			REST resources are deployed in one of two ways:
 		</p>
-		<ul>
+		<ul class='spaced-list'>
 			<li>Deployed in a J2EE container as a servlet.
 			<li>Deployed as a child of another REST resource.
 		</ul>
 		<p>
 			When deployed in a J2EE container, you MUST extend from one of the servlet classes.
-			<br>When deployed as a child of another resource, you MAY extend from one of the servlet classes but it's 
-			not necessary.
+		</p>
+		<p>
+			<b>When deployed as a child of another resource, you MAY extend from one of the servlet classes but it's 
+			not necessary.</b>
+			<br>The only requirement is that the class be annotated with <ja>@RestResource</ja> and have one of the following constructors:
+		</p>
+		<ul>
+			<li class='jm'><code><jk>public</jk> T()</code>
+			<li class='jm'><code><jk>public</jk> T(RestContextBuilder)</code>
+		</ul>
+		<p>
+			And even that restriction is relaxed if you implement your own REST resource resolver (described later).
 		</p>
 
 		<!-- ======================================================================================================== -->
@@ -6538,12 +6585,7 @@
 	)
 	<jk>public abstract class</jk> RestServletDefault <jk>extends</jk> RestServlet {
 	
-		<jd>/**
-		 * [OPTIONS /*] - Show resource options.
-		 * 
-		 * @param req The HTTP request.
-		 * @return A bean containing the contents for the OPTIONS page.
-		 */</jd>
+		<jc>// Show resource options.</jc>
 		<ja>@RestMethod</ja>(name=<jsf>OPTIONS</jsf>, path=<js>"/*"</js>,
 			htmldoc=<ja>@HtmlDoc</ja>(
 				navlinks={
@@ -6615,7 +6657,7 @@
 		<h4 class='topic' onclick='toggle(this)'>7.3.4 - Router Pages</h4>
 		<div class='topic'>
 			<p>
-				The {@link org.apache.juneau.rest.RestServletGroupDefault} class provides a default "router" page for 
+				The {@link org.apache.juneau.rest.RestServletGroup} class provides a default "router" page for 
 				child resources when a parent resource is nothing more than a grouping of child resources.
 			</p>		
 			<p>
@@ -6650,7 +6692,7 @@
 			ShutdownResource.<jk>class</jk>
 		}
 	)
-	<jk>public class</jk> RootResources <jk>extends</jk> RestServletGroupDefault {
+	<jk>public class</jk> RootResources <jk>extends</jk> RestServletGroup {
 		<jc>// NO CODE!!!</jc>
 	}
 			</p>
@@ -6660,13 +6702,15 @@
 			</p>
 			<img class='bordered' src="doc-files/juneau-rest-server.RouterPages.1.png" style='width:800px;'/>
 			<p> 
-				The {@link org.apache.juneau.rest.RestServletGroupDefault} class is nothing more than a subclass of 
+				The {@link org.apache.juneau.rest.RestServletGroup} class is nothing more than a subclass of 
 				{@link org.apache.juneau.rest.RestServletDefault} with a <l>getChildren()</l> method mapped to the servlet 
 				root path.
 				<br>The method returns a POJO with is just a linked-list of beans with name/description properties.
 			</p>	
 			<p class='bcode'>
-	<jk>public class</jk> RestServletGroupDefault <jk>extends</jk> RestServletDefault {
+	<jc>// The entire contents of the RestServletGroup class.</jc>
+	
+	<jk>public class</jk> RestServletGroup <jk>extends</jk> RestServletDefault {
 	
 		<ja>@RestMethod</ja>(name=<jsf>GET</jsf>, path=<js>"/"</js>, description=<js>"Child resources"</js>)
 		<jk>public</jk> ChildResourceDescriptions getChildren(RestRequest req) {
@@ -6684,11 +6728,11 @@
 				to any class as long as it has one of the following constructors:
 			</p>
 			<ul>
-				<li><code><jk>public</jk> T(RestContextBuilder)</code>
-				<li><code><jk>public</jk> T()</code>
+				<li class='jm'><code><jk>public</jk> T()</code>
+				<li class='jm'><code><jk>public</jk> T(RestContextBuilder)</code>
 			</ul>
 				<p>
-				The former constructor can be used to get access to the {@link org.apache.juneau.rest.RestContextBuilder} object to make
+				The latter constructor can be used to get access to the {@link org.apache.juneau.rest.RestContextBuilder} object to make
 				any configurations to the resource before it's initialized.
 			</p>
 			<p>
@@ -7871,7 +7915,7 @@
 	<ja>@RestResource</ja>(
 		path=<js>"/urlEncodedForm"</js>
 	)
-	<jk>public class</jk> UrlEncodedFormResource <jk>extends</jk> Resource {
+	<jk>public class</jk> UrlEncodedFormResource <jk>extends</jk> RestServletDefault {
 
 		<jd>/** POST request handler */</jd>
 		<ja>@RestMethod</ja>(name=<jsf>POST</jsf>, path=<js>"/"</js>)
@@ -8064,7 +8108,7 @@
 	<h3 class='topic' onclick='toggle(this)'>7.10 - @Header</h3>
 	<div class='topic'>
 		<p>
-			The {@link org.apache.juneau.rest.annotation.Header @Header} is used to retrieve request headers.
+			The {@link org.apache.juneau.rest.annotation.Header @Header} annotation is used to retrieve request headers.
 		</p>
 		<h5 class='figure'>Example:</h5>
 		<p class='bcode'>
@@ -8743,11 +8787,11 @@
 		<p>
 			There are two distinct groups of variables:
 		</p>
-		<ul>
-			<li>Initialization-time variables.
+		<ul class='spaced-list'>
+			<li><l>Initialization-time variables</l>
 				<br>These are variables that can be used in many of the annotations in {@link org.apache.juneau.rest.annotation.RestResource @RestResource}. 
 				<br>The {@link org.apache.juneau.rest.RestContext#getVarResolver()} method returns initialization-time variables only.
-			<li>Request-time variables.
+			<li><l>Request-time variables</l>
 				<br>These are variables that are available during HTTP-requests and can be used on annotation such as {@link org.apache.juneau.rest.annotation.HtmlDoc @HtmlDoc}. 
 				<br>{@link org.apache.juneau.rest.RestRequest#getVarResolverSession()} method returns initialization and request-time variables.
 		</ul>
@@ -8761,53 +8805,89 @@
 				<th>Module</th><th>Class</th><th>Pattern</th><th>Initialization<br>time</th><th>Request<br>time</th>
 			</tr>
 			<tr class='dark'>
-				<td rowspan="6" style='text-align:center;font-weight:bold;padding:20px;' class='code'>juneau-svl</td>
+				<td rowspan="11" style='text-align:center;font-weight:bold;padding:20px;' class='code'>juneau-svl</td>
 				<td>{@link org.apache.juneau.svl.vars.EnvVariablesVar}</td>
-				<td class='code'>$E{envVar[,defaultValue]}</td>
+				<td class='code'>$E{key[,default]}</td>
 				<td style='text-align:center;font-weight:bold'>yes</td>
 				<td style='text-align:center;font-weight:bold'>yes</td>
 			</tr>
 			<tr class='dark'>
 				<td>{@link org.apache.juneau.svl.vars.SystemPropertiesVar}</td>
-				<td class='code'>$S{systemProperty[,defaultValue]}</td>
+				<td class='code'>$S{key[,default]}</td>
 				<td style='text-align:center;font-weight:bold'>yes</td>
 				<td style='text-align:center;font-weight:bold'>yes</td>
 			</tr>
 			<tr class='dark'>
-				<td>{@link org.apache.juneau.svl.vars.CoalesceVar}</td>
-				<td class='code'>$CO{arg1[,arg2...]}</td>
+				<td>{@link org.apache.juneau.svl.vars.ArgsVar}</td>
+				<td class='code'>$A{key[,default]}</td>
+				<td style='text-align:center;font-weight:bold'>yes</td>
+				<td style='text-align:center;font-weight:bold'>yes</td>
+			</tr>
+			<tr class='dark'>
+				<td>{@link org.apache.juneau.svl.vars.ManifestFileVar}</td>
+				<td class='code'>$MF{key[,default]}</td>
 				<td style='text-align:center;font-weight:bold'>yes</td>
 				<td style='text-align:center;font-weight:bold'>yes</td>
 			</tr>
 			<tr class='dark'>
 				<td>{@link org.apache.juneau.svl.vars.IfVar}</td>
-				<td class='code'>$IF{booleanArg,thenValue[,elseValue]}</td>
+				<td class='code'>$IF{arg,then[,else]}</td>
 				<td style='text-align:center;font-weight:bold'>yes</td>
 				<td style='text-align:center;font-weight:bold'>yes</td>
 			</tr>
 			<tr class='dark dd'>
 				<td>{@link org.apache.juneau.svl.vars.SwitchVar}</td>
-				<td class='code'>$SW{stringArg(,pattern,thenValue)+[,elseValue]}</td>
+				<td class='code'>$SW{arg,pattern1:then1[,pattern2:then2...]}</td>
+				<td style='text-align:center;font-weight:bold'>yes</td>
+				<td style='text-align:center;font-weight:bold'>yes</td>
+			</tr>
+			<tr class='dark'>
+				<td>{@link org.apache.juneau.svl.vars.CoalesceVar}</td>
+				<td class='code'>$CO{arg1[,arg2...]}</td>
+				<td style='text-align:center;font-weight:bold'>yes</td>
+				<td style='text-align:center;font-weight:bold'>yes</td>
+			</tr>
+			<tr class='dark'>
+				<td>{@link org.apache.juneau.svl.vars.PatternMatchVar}</td>
+				<td class='code'>$PM{arg,pattern}</td>
+				<td style='text-align:center;font-weight:bold'>yes</td>
+				<td style='text-align:center;font-weight:bold'>yes</td>
+			</tr>
+			<tr class='dark'>
+				<td>{@link org.apache.juneau.svl.vars.NotEmptyVar}</td>
+				<td class='code'>$NE{arg}</td>
+				<td style='text-align:center;font-weight:bold'>yes</td>
+				<td style='text-align:center;font-weight:bold'>yes</td>
+			</tr>
+			<tr class='dark'>
+				<td>{@link org.apache.juneau.svl.vars.UpperCaseVar}</td>
+				<td class='code'>$UC{arg}</td>
+				<td style='text-align:center;font-weight:bold'>yes</td>
+				<td style='text-align:center;font-weight:bold'>yes</td>
+			</tr>
+			<tr class='dark'>
+				<td>{@link org.apache.juneau.svl.vars.LowerCaseVar}</td>
+				<td class='code'>$LC{arg}</td>
 				<td style='text-align:center;font-weight:bold'>yes</td>
 				<td style='text-align:center;font-weight:bold'>yes</td>
 			</tr>
 			<tr class='light dd'>
 				<td rowspan="1" style='text-align:center;font-weight:bold;padding:20px;' class='code'>juneau-config</td>
 				<td>{@link org.apache.juneau.config.vars.ConfigVar}</td>
-				<td class='code'>$C{key[,defaultValue]}</td>
+				<td class='code'>$C{key[,default]}</td>
 				<td style='text-align:center;font-weight:bold'>yes</td>
 				<td style='text-align:center;font-weight:bold'>yes</td>
 			</tr>
 			<tr class='dark'>
 				<td rowspan="14" style='text-align:center;font-weight:bold;padding:20px;' class='code'>juneau-rest-server</td>
 				<td>{@link org.apache.juneau.rest.vars.FileVar}</td>
-				<td class='code'>$F{path[,defaultValue]}}</td>
+				<td class='code'>$F{path[,default]}}</td>
 				<td style='text-align:center;font-weight:bold'>no</td>
 				<td style='text-align:center;font-weight:bold'>yes</td>
 			</tr>
 			<tr class='dark'>
 				<td>{@link org.apache.juneau.rest.vars.ServletInitParamVar}</td>
-				<td class='code'>$I{name[,defaultValue]}</td>
+				<td class='code'>$I{name[,default]}</td>
 				<td style='text-align:center;font-weight:bold'>yes</td>
 				<td style='text-align:center;font-weight:bold'>yes</td>
 			</tr>
@@ -8861,7 +8941,7 @@
 			</tr>
 			<tr class='dark'>
 				<td>{@link org.apache.juneau.rest.vars.SerializedRequestAttrVar}</td>
-				<td class='code'>$SA{contentType,key[,defaultValue]}</td>
+				<td class='code'>$SA{contentType,key[,default]}</td>
 				<td style='text-align:center;font-weight:bold'>no</td>
 				<td style='text-align:center;font-weight:bold'>yes</td>
 			</tr>
@@ -8879,27 +8959,11 @@
 			</tr>
 			<tr class='dark dd'>
 				<td>{@link org.apache.juneau.rest.vars.WidgetVar}</td>
-				<td class='code'>$W{widgetName}</td>
+				<td class='code'>$W{name}</td>
 				<td style='text-align:center;font-weight:bold'>no</td>
 				<td style='text-align:center;font-weight:bold'>yes</td>
 			</tr>
-			<tr class='light'>
-				<td rowspan="2" style='text-align:center;font-weight:bold;padding:20px;' class='code'>juneau-microservice-server</td>
-				<td>{@link org.apache.juneau.microservice.vars.ArgsVar}</td>
-				<td class='code'>$ARG{key[,defaultValue]}</td>
-				<td style='text-align:center;font-weight:bold'>yes*</td>
-				<td style='text-align:center;font-weight:bold'>yes*</td>
-			</tr>
-			<tr class='light dd'>
-				<td>{@link org.apache.juneau.microservice.vars.ManifestFileVar}</td>
-				<td class='code'>$MF{key[,defaultValue]}</td>
-				<td style='text-align:center;font-weight:bold'>yes*</td>
-				<td style='text-align:center;font-weight:bold'>yes*</td>
-			</tr>
 		</table>
-		<p>
-			* = Only if extending from {@link org.apache.juneau.microservice.Resource}
-		<p>
 	</div>
 	
 	<!-- ======================================================================================================== -->
@@ -8951,7 +9015,7 @@
 		</p>
 		<p>
 			The annotation itself can contain string variables.  
-			<br>For example, the Microservice API {@link org.apache.juneau.microservice.Resource} class defines the 
+			<br>For example, the Microservice API {@link org.apache.juneau.rest.RestServletDefault} class defines the 
 			location of the config file as a system property <l>"juneau.configFile"</l>:
 		</p>
 		<p class='bcode'>
@@ -9698,7 +9762,7 @@
 		),
 		...
 	)
-	<jk>public class</jk> RootResources <jk>extends</jk> ResourceJenaGroup {...}
+	<jk>public class</jk> RootResources <jk>extends</jk> RestServletJenaGroup {...}
 			</p>			
 			<p>
 				The widget definition is shown below:
@@ -9808,7 +9872,7 @@
 				<js>"source: $C{Source/gitHub}/org/apache/juneau/examples/rest/$R{servletClassSimple}.java"</js>
 			},
 	)
-	<jk>public class</jk> RootResources <jk>extends</jk> ResourceJenaGroup {...}
+	<jk>public class</jk> RootResources <jk>extends</jk> RestServletJenaGroup {...}
 			</p>
 			<p>
 				The <l>StyleMenuItem</l> is a widget that extends from {@link org.apache.juneau.rest.widget.MenuItemWidget}, a
@@ -10822,7 +10886,7 @@
 			...
 		}
 	)
-	<jk>public class</jk> Root <jk>extends</jk> RestServletGroupDefault {
+	<jk>public class</jk> Root <jk>extends</jk> RestServletGroup {
 		
 		<jk>private final</jk> RestResourceResolver <jf>resolver</jf>;
 		
@@ -10888,7 +10952,7 @@
 			<br>The following examples is pulled from the REST examples:
 		</p>
 		<p class='bcode'>
-	<jk>public class</jk> PredefinedLabelsResource <jk>extends</jk> Resource {
+	<jk>public class</jk> PredefinedLabelsResource <jk>extends</jk> RestServletDefault {
 	
 		<ja>@RestMethod</ja>(name=<jsf>GET</jsf>, path=<js>"/"</js>)
 		<jk>public</jk> ResourceDescription[] getChildMethods() {
@@ -12220,14 +12284,6 @@
 						<br>Starts up an externally-configured Jetty server, registers servlets, and sets up 
 						other features such as logging.  
 				</ul>
-			<li class='jc'>
-				{@link org.apache.juneau.microservice.Resource} 
-				- A subclass of <code>RestServletDefault</code> with support for manfest-file and args variables
-				and configured to use the external INI file.
-			<li class='jc'>
-				{@link org.apache.juneau.microservice.ResourceGroup} 
-				- A subclass of <code>RestServletGroupDefault</code> with support for manfest-file and args variables
-				and configured to use the external INI file.
 		</ul>
 	</div>
 	
@@ -12288,7 +12344,7 @@
 			LogsResource.<jk>class</jk>
 		}
 	)
-	<jk>public class</jk> RootResources <jk>extends</jk> ResourceGroup {
+	<jk>public class</jk> RootResources <jk>extends</jk> RestServletJenaGroup {
 		<jc>// No code</jc>
 	}
 					</p>
@@ -12654,16 +12710,16 @@
 	<ck>sameAsAnInt</ck> = <cv>$C{MySection/anInt}</cv>
 	
 	<cc># A command-line argument in the form "myarg=foo"</cc>
-	<ck>myArg</ck> = <cv>$ARG{myarg}</cv>
+	<ck>myArg</ck> = <cv>$A{myarg}</cv>
 	
 	<cc># The first command-line argument</cc>
-	<ck>firstArg</ck> = <cv>$ARG{0}</cv>
+	<ck>firstArg</ck> = <cv>$A{0}</cv>
 
 	<cc># Look for system property, or env var if that doesn't exist, or command-line arg if that doesn't exist.</cc>
-	<ck>nested</ck> = <cv>$S{mySystemProperty,$E{MY_ENV_VAR,$ARG{0}}}</cv>
+	<ck>nested</ck> = <cv>$S{mySystemProperty,$E{MY_ENV_VAR,$A{0}}}</cv>
 
 	<cc># A POJO with embedded variables</cc>
-	<ck>aBean2</ck> = <cv>{foo:'$ARG{0}',baz:$C{MySection/anInt}}</cv>
+	<ck>aBean2</ck> = <cv>{foo:'$A{0}',baz:$C{MySection/anInt}}</cv>
 	
 	</p>
 	<p class='bcode'>
@@ -12693,9 +12749,9 @@
 			</p>
 			<ul class='doctree'>
 				<li class='jm'>{@link org.apache.juneau.microservice.Microservice#getConfig()} 
-					<br>Any <a class='doclink' href='#DefaultRestSvlVariables'>initialization-time variables</a> and <l>$ARG</l> and <l>$MF</l> variables can be used.
+					<br>Any <a class='doclink' href='#DefaultRestSvlVariables'>initialization-time variables</a> and <l>$A</l> and <l>$MF</l> variables can be used.
 				<li class='jm'>{@link org.apache.juneau.rest.RestContext#getConfig()} 
-					<br>Any <a class='doclink' href='#DefaultRestSvlVariables'>initialization-time variables</a> and <l>$ARG</l> and <l>$MF</l> variables can be used.
+					<br>Any <a class='doclink' href='#DefaultRestSvlVariables'>initialization-time variables</a> and <l>$A</l> and <l>$MF</l> variables can be used.
 					<h5 class='figure'>Example usage:</h5>
 					<p class='bcode'>
 	<cc>#-------------------------------</cc>
@@ -12706,7 +12762,7 @@
 				</p>
 				<p class='bcode'>
 	<ja>@RestResource</ja>(...)
-	<jk>public class</jk> MyHelloResource <jk>extends</jk> Resource {
+	<jk>public class</jk> MyHelloResource <jk>extends</jk> RestServletDefault {
 		<jc>// Access config file when initializing fields.</jc>
 		<jk>private</jk> String greeting = getConfig().getString(<js>"MyHelloResource/greeting"</js>); 
 		
@@ -12725,7 +12781,7 @@
 				<li class='jm'>
 					{@link org.apache.juneau.rest.RestRequest#getConfig()} 
 					- An instance method to access it from inside a REST method.
-					<br>Any <a class='doclink' href='#DefaultRestSvlVariables'>initialization-time or request-time variables</a> and <l>$ARG</l> and <l>$MF</l> variables can be used.
+					<br>Any <a class='doclink' href='#DefaultRestSvlVariables'>initialization-time or request-time variables</a> and <l>$A</l> and <l>$MF</l> variables can be used.
 					
 					<h5 class='figure'>Example usage:</h5>
 					<p class='bcode'>
@@ -12745,7 +12801,7 @@
 		messages=<js>"nls/Messages"</js>,
 		...
 	)
-	<jk>public class</jk> MyHelloResource <jk>extends</jk> Resource {
+	<jk>public class</jk> MyHelloResource <jk>extends</jk> RestServletDefault {
 
 		<jd>/** Standard hello message. */</jd>
 		<ja>@RestMethod</ja>(name=<jsf>GET</jsf>, path=<js>"/{person}"</js>)
@@ -12835,7 +12891,7 @@
 			LogsResource.<jk>class</jk>
 		}
 	)
-	<jk>public class</jk> RootResources <jk>extends</jk> ResourceGroup {
+	<jk>public class</jk> RootResources <jk>extends</jk> RestServletJenaGroup {
 		<jc>// No code! </jc>
 	}
 		</p>
@@ -12851,7 +12907,7 @@
 			<li>
 				The <l>children</l> annotation make up the list of child resources.
 				<br>These child resources can be anything that extends from <l>Servlet</l>, although usually
-				they will be subclasses of {@link org.apache.juneau.microservice.Resource} or other resource groups.
+				they will be subclasses of {@link org.apache.juneau.rest.RestServletDefault} or other resource groups.
 		</ul>
 		<p>
 			If you click the <l>helloWorld</l> link in your application, you'll get a simple hello world message:
@@ -12866,7 +12922,7 @@
 		title=<js>"Hello World example"</js>,
 		description=<js>"Simplest possible REST resource"</js>
 	)
-	<jk>public class</jk> HelloWorldResource <jk>extends</jk> Resource {
+	<jk>public class</jk> HelloWorldResource <jk>extends</jk> RestServletDefault {
 	
 		<ja>@RestMethod</ja>(name=<jsf>GET</jsf>, path=<js>"/*"</js>)
 		<jk>public</jk> String sayHello() {
@@ -12874,11 +12930,6 @@
 		}
 	}		
 		</p>
-		<p>
-			The {@link org.apache.juneau.microservice.Resource} and {@link org.apache.juneau.microservice.ResourceGroup} 
-			classes are powerful servlets designed specifically for creating REST APIs using nothing more than serialized 
-			and parsed POJOs.
-		</p>
 	</div>
 
 	<!-- =========================================================================================================== -->
@@ -13084,18 +13135,8 @@
 						<br>Defines default serializers and parsers, and OPTIONs page logic.
 						<ul>
 							<li class='jac'>
-								{@link org.apache.juneau.rest.RestServletGroupDefault org.apache.juneau.rest.RestServletGroupDefault}
+								{@link org.apache.juneau.rest.RestServletGroup org.apache.juneau.rest.RestServletGroup}
 								<br>Specialized subclass for grouping other resources
-								<ul>
-									<li class='jac'>
-										{@link org.apache.juneau.microservice.ResourceGroup org.apache.juneau.microservice.ResourceGroup}
-										<br>Specialized subclass when using the Microservice API.
-										<ul>
-											<li class='jc'>
-												<code>org.apache.juneau.rest.samples.RootResources</code>
-										</ul>
-									</li>
-								</ul>
 							</li>
 						</ul>
 					</li>
@@ -13159,7 +13200,7 @@
 			ShutdownResource.<jk>class</jk> 		
 		}
 	)
-	<jk>public class</jk> RootResources <jk>extends</jk> ResourceGroup {
+	<jk>public class</jk> RootResources <jk>extends</jk> RestServletJenaGroup {
 		<jk>private static final long</jk> <jsf>serialVersionUID</jsf> = 1L;
 	}
 		</p>
@@ -13194,7 +13235,7 @@
 		<h5 class='figure'>HelloWorldResource.java</h5>
 		<p class='bcode'>
 	<ja>@RestResource</ja>(messages=<js>"nls/HelloWorldResource"</js>, path=<js>"/helloWorld"</js>)
-	<jk>public class</jk> HelloWorldResource <jk>extends</jk> Resource {
+	<jk>public class</jk> HelloWorldResource <jk>extends</jk> RestServletDefault {
 		</p>
 		<p>
 			It should be noted that child resources do not need to be defined this way.  
@@ -13248,7 +13289,7 @@
 			}
 		)
 	) 
-	<jk>public class</jk> HelloWorldResource <jk>extends</jk> Resource { 
+	<jk>public class</jk> HelloWorldResource <jk>extends</jk> RestServletDefault { 
 		<jk>private static final long</jk> <jsf>serialVersionUID</jsf> = 1L; 
 		
 		<jd>/** GET request handler */</jd> 
@@ -13279,15 +13320,6 @@
 					<li class='jac'>
 						{@link org.apache.juneau.rest.RestServletDefault org.apache.juneau.rest.RestServletDefault}
 						<br>Defines default serializers and parsers, and OPTIONs page logic.
-						<ul>
-							<li class='jac'>
-								{@link org.apache.juneau.microservice.Resource org.apache.juneau.microservice.Resource}
-								<br>Specialized subclass when using the Microservice API.
-								<ul>
-									<li class='jc'><code>org.apache.juneau.rest.samples.HelloWorldResource</code>
-								</ul>
-							</li>
-						</ul>
 					</li>
 				</ul>
 			</li>
@@ -13341,7 +13373,7 @@
 			}
 		)
 	) 
-	<jk>public class</jk> MethodExampleResource <jk>extends</jk> Resource { 
+	<jk>public class</jk> MethodExampleResource <jk>extends</jk> RestServletDefault { 
 		<jk>private static final long</jk> <jsf>serialVersionUID</jsf> = 1L; 
 		
 		<jd>/** Example GET request that redirects to our example method */</jd> 
@@ -13646,7 +13678,7 @@
 		path=<js>"/urlEncodedForm"</js>, 
 		messages=<js>"nls/UrlEncodedFormResource"</js>
 	) 
-	<jk>public class</jk> UrlEncodedFormResource <jk>extends</jk> Resource { 
+	<jk>public class</jk> UrlEncodedFormResource <jk>extends</jk> RestServletDefault { 
 		<jk>private static final long</jk> <jsf>serialVersionUID</jsf> = 1L; 
 		
 		<jd>/** GET request handler */</jd> 
@@ -13870,7 +13902,7 @@
 			EnumerationSwap.<jk>class</jk>
 		}
 	)
-	<jk>public class</jk> RequestEchoResource <jk>extends</jk> Resource {
+	<jk>public class</jk> RequestEchoResource <jk>extends</jk> RestServletDefault {
 	
 		<jd>/** GET request handler */</jd>
 		<ja>@RestMethod</ja>(name=<jsf>GET</jsf>, path=<js>"/*"</js>, converters={Queryable.<jk>class</jk>,Traversable.<jk>class</jk>})
@@ -14420,7 +14452,7 @@
 			url:'http://juneau.apache.org'}}]"</js>,
 		externalDocs=<js>"{description:'Home page',url:'http://juneau.apache.org'}"</js>
 	) 
-	<jk>public class</jk> AddressBookResource <jk>extends</jk> ResourceJena { 
+	<jk>public class</jk> AddressBookResource <jk>extends</jk> RestServletJenaDefault { 
 		<jk>private static final long</jk> <jsf>serialVersionUID</jsf> = 1L; 
 		
 		<jc>// The in-memory address book</jc> 
@@ -15343,7 +15375,7 @@
 		}, 
 		encoders=GzipEncoder.<jk>class</jk> 
 	) 
-	<jk>public class</jk> AtomFeedResource <jk>extends</jk> ResourceJena { 
+	<jk>public class</jk> AtomFeedResource <jk>extends</jk> RestServletJenaDefault { 
 		<jk>private static final long</jk> <jsf>serialVersionUID</jsf> = 1L; 
 	
 		<jk>private</jk> Feed <jf>feed</jf>; <jc>// The root resource object</jc> 
@@ -15452,7 +15484,7 @@
 			}
 		)
 	) 
-	<jk>public class</jk> DockerRegistryResource <jk>extends</jk> Resource { 
+	<jk>public class</jk> DockerRegistryResource <jk>extends</jk> RestServletDefault { 
 		<jk>private static final long</jk> <jsf>serialVersionUID</jsf> = 1L; 
 		
 		<jc>// Get registry URL from examples.cfg file.</jc>
@@ -15537,7 +15569,7 @@
 			}
 		)
 	) 
-	<jk>public class</jk> TumblrParserResource <jk>extends</jk> Resource { 
+	<jk>public class</jk> TumblrParserResource <jk>extends</jk> RestServletDefault { 
 		<jk>private static final long</jk> <jsf>serialVersionUID</jsf> = 1L; 
 	
 		<ja>@RestMethod</ja>(name=<jsf>GET</jsf>, path=<js>"/"</js>) 
@@ -15774,7 +15806,7 @@
 			}
 		)
 	) 
-	<jk>public class</jk> JsonSchemaResource <jk>extends</jk> ResourceJena { 
+	<jk>public class</jk> JsonSchemaResource <jk>extends</jk> RestServletJenaDefault { 
 		<jk>private static final long</jk> <jsf>serialVersionUID</jsf> = 1L; 
 		
 		<jk>private</jk> Schema schema; <jc>// The schema document</jc> 
@@ -15865,7 +15897,7 @@
 			}
 		)
 	) 
-	<jk>public class</jk> SqlQueryResource <jk>extends</jk> Resource { 
+	<jk>public class</jk> SqlQueryResource <jk>extends</jk> RestServletDefault { 
 		<jk>private static final long</jk> <jsf>serialVersionUID</jsf> = 1L; 
 		
 		<jk>private</jk> Config <jf>cf</jf> = getConfig(); 
@@ -16060,7 +16092,7 @@
 			}
 		)
 	) 
-	<jk>public class</jk> ConfigResource <jk>extends</jk> Resource { 
+	<jk>public class</jk> ConfigResource <jk>extends</jk> RestServletDefault { 
 		<jk>private static final long</jk> <jsf>serialVersionUID</jsf> = 1L; 
 		
 		<jd>/** 
@@ -16521,6 +16553,12 @@
 					<li>{@link org.apache.juneau.svl.vars.UpperCaseVar}
 					<li>{@link org.apache.juneau.svl.vars.LowerCaseVar}
 				</ul>
+			<li>
+				Variables moved from <l>juneau-microservice</l>:
+				<ul>
+					<li>{@link org.apache.juneau.svl.vars.ArgsVar}
+					<li>{@link org.apache.juneau.svl.vars.ManifestFileVar}
+				</ul>
 		</ul>
 		
 		<h5 class='topic'>juneau-config</h5>
@@ -16530,6 +16568,23 @@
 			<li>
 				<code>Config.write(Reader,boolean)</code> method renamed to {@link org.apache.juneau.config.Config#load(Reader,boolean)}.
 		</ul>
+
+		<h5 class='topic'>juneau-rest-server</h5>
+		<ul class='spaced-list'>
+			<li>
+				<code>RestServletGroupDefault</code> renamed to {@link org.apache.juneau.rest.RestServletGroup}.
+		</ul>
+
+		<h5 class='topic'>juneau-microservice</h5>
+		<ul class='spaced-list'>
+			<li>
+				<code>Resource</code> and <code>ResourceGroup</code> classes removed.
+				<br>{@link org.apache.juneau.rest.RestServletDefault} and {@link org.apache.juneau.rest.RestServletGroup} can be used instead.
+			<li>
+				<code>ResourceJena</code> and <code>ResourceJenaGroup</code> classes rename to
+				{@link org.apache.juneau.microservice.RestServletJenaDefault} and {@link org.apache.juneau.microservice.RestServletJenaGroup} can be used instead.
+				
+		</ul>
 	</div>
 	
 	<!-- =========================================================================================================== -->
@@ -16912,7 +16967,7 @@
 				instead of <code>close()</code> on the stream.
 			<li>
 				Added the following annotations to the {@link org.apache.juneau.rest.RestServletDefault} class
-				(which were previously defined on the {@link org.apache.juneau.microservice.Resource} class):
+				(which were previously defined on the <code><del>Resource</del></code> class):
 				<p class='bcode'>
 	<ja>@RestResource</ja>(
 		htmldoc=<ja>@HtmlDoc</ja>(
@@ -19448,14 +19503,14 @@
 				</ul>
 			<li>Eliminated <code>org.apache.juneau.microservice.Main</code> class.  This is replaced by
 				the microservice classes defined above.
-			<li>{@link org.apache.juneau.microservice.Resource} and {@link org.apache.juneau.microservice.ResourceGroup}
+			<li><code><del>Resource</del></code> and <code><del>ResourceGroup</del></code>
 				classes now support the following new string variables:
 				<ul>
-					<li><js>"$ARG{key,default}""</js> - Command line arguments.
+					<li><js>"$A{key,default}""</js> - Command line arguments.
 					<li><js>"$MF{key,default}""</js> - Manifest file entries.
 				</ul> 
 			<li>CSS stylesheet now configurable through config file entry <js>"REST/stylesheet"</js>.
-			<li>New {@link org.apache.juneau.microservice.ResourceJena} class if you want your REST interface to support RDF.
+			<li>New {@link org.apache.juneau.microservice.RestServletJenaDefault} class if you want your REST interface to support RDF.
 			<li>Eliminated the following classes:
 				<ul>
 					<li><code>org.apache.juneau.microservice.RootResource</code>
@@ -19741,7 +19796,7 @@
 	<ja>@Property</ja>(name=<jsf>HTMLDOC_navlinks</jsf>, value=<js>"{back:'$R{servletURI}"</js>),
 	<ja>@Property</ja>(name=<jsf>HTMLDOC_description</jsf>, value=<js>"Resource options"</js>)
 				</p>
-			<li>New {@link org.apache.juneau.rest.RestServletGroupDefault} class.
+			<li>New {@link org.apache.juneau.rest.RestServletGroup} class.
 			<li>Removed <code>RestServletProperties.REST_trimTrailingUriSlashes</code> and <code>RestServletProperties.REST_pathInfoBlankForNull</code>. 
 			<li>New annotations for providing labels and descriptions.  Useful if you don't plan on having to support other languages, so you don't 
 				want to provide labels in resource bundles.
diff --git a/juneau-doc/src/main/javadoc/resources/juneau-doc.css b/juneau-doc/src/main/javadoc/resources/juneau-doc.css
index 30572bd..260eec2 100755
--- a/juneau-doc/src/main/javadoc/resources/juneau-doc.css
+++ b/juneau-doc/src/main/javadoc/resources/juneau-doc.css
@@ -202,6 +202,11 @@ ul.toc div,
 	padding-left: 5px;
 }
 
+p.toc2 {
+    background-color: #dee3e950;
+    border-radius: 0px 15px 15px 0px;
+}
+
 /* Linear gradients */
 
 /* Light-colored background headers */
diff --git a/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/AtomFeedResource.java b/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/AtomFeedResource.java
index a2f73f5..ce46f11 100644
--- a/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/AtomFeedResource.java
+++ b/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/AtomFeedResource.java
@@ -13,10 +13,9 @@
 package org.apache.juneau.examples.rest;
 
 import static org.apache.juneau.dto.atom.AtomBuilder.*;
-import static org.apache.juneau.html.HtmlDocSerializer.*;
+import static org.apache.juneau.http.HttpMethodName.*;
 import static org.apache.juneau.jena.RdfCommon.*;
 import static org.apache.juneau.jena.RdfSerializer.*;
-import static org.apache.juneau.http.HttpMethodName.*;
 
 import java.net.*;
 
@@ -53,7 +52,7 @@ import org.apache.juneau.rest.widget.*;
 	},
 	encoders=GzipEncoder.class
 )
-public class AtomFeedResource extends ResourceJena {
+public class AtomFeedResource extends RestServletJenaDefault {
 	private static final long serialVersionUID = 1L;
 
 	private Feed feed;     // The root resource object
diff --git a/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/CodeFormatterResource.java b/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/CodeFormatterResource.java
index 72b77e9..e784d22 100644
--- a/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/CodeFormatterResource.java
+++ b/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/CodeFormatterResource.java
@@ -16,7 +16,6 @@ import static org.apache.juneau.dto.html5.HtmlBuilder.*;
 import static org.apache.juneau.http.HttpMethodName.*;
 
 import org.apache.juneau.dto.html5.*;
-import org.apache.juneau.microservice.*;
 import org.apache.juneau.rest.*;
 import org.apache.juneau.rest.annotation.*;
 
@@ -45,7 +44,7 @@ import org.apache.juneau.rest.annotation.*;
 	)
 )
 @SuppressWarnings({"serial"})
-public class CodeFormatterResource extends Resource {
+public class CodeFormatterResource extends RestServletDefault {
 
 	/** [GET /] - Display query entry page. */
 	@RestMethod(name=GET, path="/")
diff --git a/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/DirectoryResource.java b/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/DirectoryResource.java
index 1a83c90..0f438c2 100644
--- a/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/DirectoryResource.java
+++ b/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/DirectoryResource.java
@@ -12,18 +12,17 @@
 // ***************************************************************************************************************************
 package org.apache.juneau.examples.rest;
 
-import static org.apache.juneau.rest.annotation.HookEvent.*;
 import static java.util.logging.Level.*;
 import static javax.servlet.http.HttpServletResponse.*;
-import static org.apache.juneau.html.HtmlDocSerializer.*;
+import static org.apache.juneau.html.HtmlSerializer.*;
 import static org.apache.juneau.http.HttpMethodName.*;
+import static org.apache.juneau.rest.annotation.HookEvent.*;
 
 import java.io.*;
 import java.net.*;
 import java.util.*;
 import java.util.logging.*;
 
-import org.apache.juneau.microservice.*;
 import org.apache.juneau.rest.*;
 import org.apache.juneau.rest.annotation.*;
 import org.apache.juneau.rest.converters.*;
@@ -57,7 +56,7 @@ import org.apache.juneau.utils.*;
 		@Property(name="allowPuts", value="false")
 	}
 )
-public class DirectoryResource extends Resource {
+public class DirectoryResource extends RestServletDefault {
 	private static final long serialVersionUID = 1L;
 
 	private File rootDir;     // The root directory
diff --git a/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/DockerRegistryResource.java b/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/DockerRegistryResource.java
index 8ba0892..41cf2ac 100644
--- a/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/DockerRegistryResource.java
+++ b/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/DockerRegistryResource.java
@@ -12,13 +12,12 @@
 // ***************************************************************************************************************************
 package org.apache.juneau.examples.rest;
 
-import static org.apache.juneau.rest.annotation.HookEvent.*;
 import static org.apache.juneau.http.HttpMethodName.*;
+import static org.apache.juneau.rest.annotation.HookEvent.*;
 
 import java.util.*;
 
 import org.apache.juneau.config.*;
-import org.apache.juneau.microservice.*;
 import org.apache.juneau.rest.*;
 import org.apache.juneau.rest.annotation.*;
 import org.apache.juneau.rest.client.*;
@@ -41,7 +40,7 @@ import org.apache.juneau.rest.labels.*;
 		aside="$F{resources/DockerRegistryResourceAside.html}"
 	)
 )
-public class DockerRegistryResource extends Resource {
+public class DockerRegistryResource extends RestServletDefault {
 	private static final long serialVersionUID = 1L;
 
 	// Get registry URL from examples.cfg file.
diff --git a/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/HelloWorldResource.java b/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/HelloWorldResource.java
index b34e505..fc2706d 100644
--- a/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/HelloWorldResource.java
+++ b/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/HelloWorldResource.java
@@ -14,7 +14,7 @@ package org.apache.juneau.examples.rest;
 
 import static org.apache.juneau.http.HttpMethodName.*;
 
-import org.apache.juneau.microservice.*;
+import org.apache.juneau.rest.*;
 import org.apache.juneau.rest.annotation.*;
 
 /**
@@ -38,7 +38,7 @@ import org.apache.juneau.rest.annotation.*;
 		}
 	)
 )
-public class HelloWorldResource extends Resource {
+public class HelloWorldResource extends RestServletDefault {
 
 	/** GET request handler */
 	@RestMethod(name=GET, path="/*", summary="Responds with \"Hello world!\"")
diff --git a/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/JsonSchemaResource.java b/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/JsonSchemaResource.java
index c6be826..808d674 100644
--- a/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/JsonSchemaResource.java
+++ b/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/JsonSchemaResource.java
@@ -46,7 +46,7 @@ import org.apache.juneau.rest.widget.*;
 		}
 	)
 )
-public class JsonSchemaResource extends ResourceJena {
+public class JsonSchemaResource extends RestServletJenaDefault {
 	private static final long serialVersionUID = 1L;
 
 	private Schema schema;     // The schema document
diff --git a/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/MethodExampleResource.java b/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/MethodExampleResource.java
index 28b5532..23d5bae 100644
--- a/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/MethodExampleResource.java
+++ b/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/MethodExampleResource.java
@@ -17,10 +17,8 @@ import static org.apache.juneau.http.HttpMethodName.*;
 import java.util.*;
 
 import org.apache.juneau.http.*;
-import org.apache.juneau.microservice.*;
 import org.apache.juneau.rest.*;
 import org.apache.juneau.rest.annotation.*;
-import org.apache.juneau.rest.annotation.Method;
 import org.apache.juneau.rest.labels.*;
 import org.apache.juneau.utils.*;
 
@@ -44,7 +42,7 @@ import org.apache.juneau.utils.*;
 		}
 	)
 )
-public class MethodExampleResource extends Resource {
+public class MethodExampleResource extends RestServletDefault {
 	private static final long serialVersionUID = 1L;
 
 	private static final UUID SAMPLE_UUID = UUID.fromString("aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee");
diff --git a/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/PetStoreResource.java b/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/PetStoreResource.java
index 7c355e7..8ff2d7d 100644
--- a/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/PetStoreResource.java
+++ b/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/PetStoreResource.java
@@ -13,8 +13,8 @@
 package org.apache.juneau.examples.rest;
 
 import static org.apache.juneau.dto.html5.HtmlBuilder.*;
-import static org.apache.juneau.rest.annotation.HookEvent.*;
 import static org.apache.juneau.http.HttpMethodName.*;
+import static org.apache.juneau.rest.annotation.HookEvent.*;
 
 import java.util.*;
 import java.util.Map;
@@ -68,7 +68,7 @@ import org.apache.juneau.transforms.*;
 	),
 	staticFiles={"htdocs:htdocs"}
 )
-public class PetStoreResource extends ResourceJena {
+public class PetStoreResource extends RestServletJenaDefault {
 	private static final long serialVersionUID = 1L;
 
 	// Our database.
diff --git a/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/PhotosResource.java b/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/PhotosResource.java
index 989ee65..817410f 100644
--- a/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/PhotosResource.java
+++ b/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/PhotosResource.java
@@ -19,13 +19,11 @@ import static org.apache.juneau.http.HttpMethodName.*;
 import java.awt.image.*;
 import java.io.*;
 import java.net.*;
-import java.net.URI;
 import java.util.*;
 
 import javax.imageio.*;
 
 import org.apache.juneau.*;
-import org.apache.juneau.microservice.*;
 import org.apache.juneau.parser.*;
 import org.apache.juneau.rest.*;
 import org.apache.juneau.rest.annotation.*;
@@ -57,7 +55,7 @@ import org.apache.juneau.serializer.*;
 		@Property(name=HTML_uriAnchorText, value="SERVLET_RELATIVE")
 	}
 )
-public class PhotosResource extends Resource {
+public class PhotosResource extends RestServletDefault {
 	private static final long serialVersionUID = 1L;
 
 	// Our cache of photos
diff --git a/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/PredefinedLabelsResource.java b/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/PredefinedLabelsResource.java
index e2c9548..752ecbc 100644
--- a/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/PredefinedLabelsResource.java
+++ b/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/PredefinedLabelsResource.java
@@ -16,7 +16,7 @@ import static org.apache.juneau.http.HttpMethodName.*;
 
 import org.apache.juneau.examples.addressbook.*;
 import org.apache.juneau.html.annotation.*;
-import org.apache.juneau.microservice.*;
+import org.apache.juneau.rest.*;
 import org.apache.juneau.rest.annotation.*;
 import org.apache.juneau.rest.labels.*;
 import org.apache.juneau.rest.widget.*;
@@ -42,7 +42,7 @@ import org.apache.juneau.rest.widget.*;
 		}
 	)
 )
-public class PredefinedLabelsResource extends Resource {
+public class PredefinedLabelsResource extends RestServletDefault {
 	private static final long serialVersionUID = 1L;
 
 	@RestMethod(name=GET, path="/")
diff --git a/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/RequestEchoResource.java b/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/RequestEchoResource.java
index 7a528a1..f163091 100644
--- a/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/RequestEchoResource.java
+++ b/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/RequestEchoResource.java
@@ -12,12 +12,11 @@
 // ***************************************************************************************************************************
 package org.apache.juneau.examples.rest;
 
-import static org.apache.juneau.html.HtmlDocSerializer.*;
+import static org.apache.juneau.serializer.Serializer.*;
 
 import javax.servlet.*;
 import javax.servlet.http.*;
 
-import org.apache.juneau.microservice.*;
 import org.apache.juneau.rest.*;
 import org.apache.juneau.rest.annotation.*;
 import org.apache.juneau.rest.converters.*;
@@ -64,7 +63,7 @@ import org.apache.juneau.transforms.*;
 		EnumerationSwap.class
 	}
 )
-public class RequestEchoResource extends Resource {
+public class RequestEchoResource extends RestServletDefault {
 	private static final long serialVersionUID = 1L;
 
 	/** GET request handler */
diff --git a/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/RootResources.java b/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/RootResources.java
index fcef063..1816511 100644
--- a/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/RootResources.java
+++ b/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/RootResources.java
@@ -81,7 +81,7 @@ import org.apache.juneau.rest.widget.*;
 		ShutdownResource.class
 	}
 )
-public class RootResources extends ResourceJenaGroup {
+public class RootResources extends RestServletJenaGroup {
 	// IMPORTANT!  If you don't need RDF support, change the parent class to ResourceGroup.
 	// It allows you to remove the Jena prerequisite.
 
diff --git a/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/SqlQueryResource.java b/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/SqlQueryResource.java
index bde41df..dfc97a0 100644
--- a/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/SqlQueryResource.java
+++ b/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/SqlQueryResource.java
@@ -14,9 +14,9 @@ package org.apache.juneau.examples.rest;
 
 import static javax.servlet.http.HttpServletResponse.*;
 import static org.apache.juneau.dto.html5.HtmlBuilder.*;
+import static org.apache.juneau.http.HttpMethodName.*;
 import static org.apache.juneau.internal.StringUtils.*;
 import static org.apache.juneau.rest.annotation.HookEvent.*;
-import static org.apache.juneau.http.HttpMethodName.*;
 
 import java.sql.*;
 import java.util.*;
@@ -24,7 +24,6 @@ import java.util.*;
 import org.apache.juneau.config.*;
 import org.apache.juneau.dto.*;
 import org.apache.juneau.dto.html5.*;
-import org.apache.juneau.microservice.*;
 import org.apache.juneau.rest.*;
 import org.apache.juneau.rest.annotation.*;
 import org.apache.juneau.rest.annotation.Body;
@@ -56,7 +55,7 @@ import org.apache.juneau.rest.widget.*;
 		}
 	)
 )
-public class SqlQueryResource extends Resource {
+public class SqlQueryResource extends RestServletDefault {
 	private static final long serialVersionUID = 1L;
 
 	private String driver, connectionUrl;
diff --git a/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/SystemPropertiesResource.java b/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/SystemPropertiesResource.java
index 2b8e8eb..a62f997 100644
--- a/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/SystemPropertiesResource.java
+++ b/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/SystemPropertiesResource.java
@@ -13,15 +13,14 @@
 package org.apache.juneau.examples.rest;
 
 import static org.apache.juneau.dto.html5.HtmlBuilder.*;
-import static org.apache.juneau.html.HtmlDocSerializer.*;
 import static org.apache.juneau.http.HttpMethodName.*;
+import static org.apache.juneau.serializer.Serializer.*;
 
 import java.util.*;
 import java.util.Map;
 
 import org.apache.juneau.dto.html5.*;
 import org.apache.juneau.encoders.*;
-import org.apache.juneau.microservice.*;
 import org.apache.juneau.rest.*;
 import org.apache.juneau.rest.annotation.*;
 import org.apache.juneau.rest.annotation.Body;
@@ -88,7 +87,7 @@ import org.apache.juneau.rest.widget.*;
 		externalDocs="{description:'Home page',url:'http://juneau.apache.org'}"
 	) 
 )
-public class SystemPropertiesResource extends Resource {
+public class SystemPropertiesResource extends RestServletDefault {
 	private static final long serialVersionUID = 1L;
 
 	@RestMethod(
diff --git a/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/TumblrParserResource.java b/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/TumblrParserResource.java
index bbbb80b..b05cba5 100644
--- a/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/TumblrParserResource.java
+++ b/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/TumblrParserResource.java
@@ -15,9 +15,9 @@ package org.apache.juneau.examples.rest;
 import static org.apache.juneau.http.HttpMethodName.*;
 
 import org.apache.juneau.*;
-import org.apache.juneau.dto.LinkString;
+import org.apache.juneau.dto.*;
 import org.apache.juneau.dto.html5.*;
-import org.apache.juneau.microservice.*;
+import org.apache.juneau.rest.*;
 import org.apache.juneau.rest.annotation.*;
 import org.apache.juneau.rest.client.*;
 
@@ -40,7 +40,7 @@ import org.apache.juneau.rest.client.*;
 		}
 	)
 )
-public class TumblrParserResource extends Resource {
+public class TumblrParserResource extends RestServletDefault {
 	private static final long serialVersionUID = 1L;
 
 	private static final int MAX_POSTS = 100;
diff --git a/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/UrlEncodedFormResource.java b/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/UrlEncodedFormResource.java
index 0544a24..3f6a5af 100644
--- a/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/UrlEncodedFormResource.java
+++ b/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/UrlEncodedFormResource.java
@@ -19,7 +19,6 @@ import java.util.*;
 
 import org.apache.juneau.annotation.*;
 import org.apache.juneau.dto.html5.*;
-import org.apache.juneau.microservice.*;
 import org.apache.juneau.rest.*;
 import org.apache.juneau.rest.annotation.*;
 import org.apache.juneau.rest.annotation.Body;
@@ -50,7 +49,7 @@ import org.apache.juneau.transforms.*;
 		}
 	)
 )
-public class UrlEncodedFormResource extends Resource {
+public class UrlEncodedFormResource extends RestServletDefault {
 	private static final long serialVersionUID = 1L;
 
 	/** GET request handler */
diff --git a/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/addressbook/AddressBookResource.java b/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/addressbook/AddressBookResource.java
index 8dd6cf2..bf67847 100644
--- a/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/addressbook/AddressBookResource.java
+++ b/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/addressbook/AddressBookResource.java
@@ -117,7 +117,7 @@ import org.apache.juneau.utils.*;
 		externalDocs="{description:'Home page',url:'http://juneau.apache.org'}"
 	)
 )
-public class AddressBookResource extends ResourceJena {
+public class AddressBookResource extends RestServletJenaDefault {
 	private static final long serialVersionUID = 1L;
 
 	// The in-memory address book
diff --git a/juneau-microservice/juneau-microservice-server/src/main/java/org/apache/juneau/microservice/Microservice.java b/juneau-microservice/juneau-microservice-server/src/main/java/org/apache/juneau/microservice/Microservice.java
index 993eb17..9d609bd 100755
--- a/juneau-microservice/juneau-microservice-server/src/main/java/org/apache/juneau/microservice/Microservice.java
+++ b/juneau-microservice/juneau-microservice-server/src/main/java/org/apache/juneau/microservice/Microservice.java
@@ -31,9 +31,9 @@ import org.apache.juneau.config.vars.*;
 import org.apache.juneau.internal.*;
 import org.apache.juneau.microservice.console.*;
 import org.apache.juneau.microservice.resources.*;
-import org.apache.juneau.microservice.vars.*;
 import org.apache.juneau.svl.*;
 import org.apache.juneau.svl.vars.*;
+import org.apache.juneau.svl.vars.ManifestFileVar;
 import org.apache.juneau.utils.*;
 
 /**
@@ -150,7 +150,8 @@ public abstract class Microservice implements ConfigEventListener {
 		Console c = System.console();
 		consoleReader = new Scanner(c == null ? new InputStreamReader(System.in) : c.reader());
 		consoleWriter = c == null ? new PrintWriter(System.out, true) : c.writer();
-		this.args = new Args(args);
+		setArgs(new Args(args));
+		setManifest(this.getClass());
 	}
 	
 	private static void setInstance(Microservice m) {
@@ -218,9 +219,22 @@ public abstract class Microservice implements ConfigEventListener {
 	 * </ol>
 	 * 
 	 * @param mf The manifest file of this microservice.
+	 * @return This object (for method chaining).
+	 */
+	public Microservice setManifest(ManifestFile mf) {
+		this.mf = mf;
+		ManifestFileVar.init(this.mf);
+		return this;
+	}
+
+	/**
+	 * Shortcut for calling <code>setManifest(<jk>new</jk> ManifestFile(mf))</code>.
+	 * 
+	 * @param mf The manifest file of this microservice.
+	 * @return This object (for method chaining).
 	 */
-	public void setManifest(Manifest mf) {
-		this.mf = new ManifestFile(mf);
+	public Microservice setManifest(Manifest mf) {
+		return setManifest(new ManifestFile(mf));
 	}
 
 	/**
@@ -232,18 +246,18 @@ public abstract class Microservice implements ConfigEventListener {
 	 */
 	public Microservice setManifestContents(String...contents) throws IOException {
 		String s = StringUtils.join(contents, "\n") + "\n";
-		this.mf = new ManifestFile(new Manifest(new ByteArrayInputStream(s.getBytes("UTF-8"))));
-		return this;
+		return setManifest(new ManifestFile(new Manifest(new ByteArrayInputStream(s.getBytes("UTF-8")))));
 	}
 
 	/**
 	 * Same as {@link #setManifest(Manifest)} except specified through a {@link File} object.
 	 * 
 	 * @param f The manifest file of this microservice.
+	 * @return This object (for method chaining).
 	 * @throws IOException If a problem occurred while trying to read the manifest file.
 	 */
-	public void setManifest(File f) throws IOException {
-		this.mf = new ManifestFile(f);
+	public Microservice setManifest(File f) throws IOException {
+		return setManifest(new ManifestFile(f));
 	}
 
 	/**
@@ -251,10 +265,11 @@ public abstract class Microservice implements ConfigEventListener {
 	 * specified class is contained within.
 	 * 
 	 * @param c The class whose jar file contains the manifest to use for this microservice.
+	 * @return This object (for method chaining).
 	 * @throws IOException If a problem occurred while trying to read the manifest file.
 	 */
-	public void setManifest(Class<?> c) throws IOException {
-		this.mf = new ManifestFile(c);
+	public Microservice setManifest(Class<?> c) throws IOException {
+		return setManifest(new ManifestFile(c));
 	}
 
 	/**
@@ -262,15 +277,19 @@ public abstract class Microservice implements ConfigEventListener {
 	 * 
 	 * <p>
 	 * The default implementation resolves the following variables:
-	 * <ul>
-	 * 	<li><code>$S{key}</code>, <code>$S{key,default}</code> - System properties.
-	 * 	<li><code>$E{key}</code>, <code>$E{key,default}</code> - Environment variables.
-	 * 	<li><code>$C{key}</code>, <code>$C{key,default}</code> - Config file entries.
-	 * 	<li><code>$MF{key}</code>, <code>$MF{key,default}</code> - Manifest file entries.
-	 * 	<li><code>$ARG{key}</code>, <code>$ARG{key,default}</code> - Command-line arguments.
-	 * 	<li><code>$IF{boolArg,thenValue}</code>, <code>$IF{boolArg,thenValue,elseValue}</code> - If-block logic.
-	 * 	<li><code>$SW{stringArg,pattern,thenVal...}</code>, 
-	 * 		<code>$SW{stringArg,pattern,thenVal,elseVal...}</code>  - Switch-block logic.
+	 * <ul class='doctree'>
+	 * 	<li class='jc'>{@link org.apache.juneau.svl.vars.SystemPropertiesVar} - <code>$S{key[,default]}</code>
+	 * 	<li class='jc'>{@link org.apache.juneau.svl.vars.EnvVariablesVar} - <code>$E{key[,default]}</code>
+	 * 	<li class='jc'>{@link org.apache.juneau.svl.vars.ArgsVar} - <code>$A{key[,default]}</code>
+	 * 	<li class='jc'>{@link org.apache.juneau.svl.vars.ManifestFileVar} - <code>$MF{key[,default]}</code>
+	 * 	<li class='jc'>{@link org.apache.juneau.svl.vars.IfVar} - <code>$IF{arg,then[,else]}</code>
+	 * 	<li class='jc'>{@link org.apache.juneau.svl.vars.SwitchVar} - <code>$SW{arg,pattern1:then1[,pattern2:then2...]}</code>
+	 * 	<li class='jc'>{@link org.apache.juneau.svl.vars.CoalesceVar} - <code>$CO{arg1[,arg2...]}</code>
+	 * 	<li class='jc'>{@link org.apache.juneau.svl.vars.PatternMatchVar} - <code>$PM{arg,pattern}</code> 
+	 * 	<li class='jc'>{@link org.apache.juneau.svl.vars.NotEmptyVar} - <code>$NE{arg}</code>
+	 * 	<li class='jc'>{@link org.apache.juneau.svl.vars.UpperCaseVar} - <code>$UC{arg}</code>
+	 * 	<li class='jc'>{@link org.apache.juneau.svl.vars.LowerCaseVar} - <code>$LC{arg}</code>
+	 * 	<li class='jc'>{@link org.apache.juneau.config.vars.ConfigVar} - <code>$C{key[,default]}</code>
 	 * </ul>
 	 * 
 	 * <p>
@@ -309,9 +328,7 @@ public abstract class Microservice implements ConfigEventListener {
 	protected VarResolverBuilder createVarResolver() {
 		VarResolverBuilder b = new VarResolverBuilder()
 			.defaultVars()
-			.vars(ConfigVar.class, ManifestFileVar.class, ArgsVar.class, SwitchVar.class, IfVar.class)
-			.contextObject(ManifestFileVar.SESSION_manifest, mf)
-			.contextObject(ArgsVar.SESSION_args, args);
+			.vars(ConfigVar.class, SwitchVar.class, IfVar.class);
 		if (cf != null)
 			b.contextObject(ConfigVar.SESSION_config, cf);
 		return b;
@@ -333,6 +350,18 @@ public abstract class Microservice implements ConfigEventListener {
 	}
 
 	/**
+	 * Sets the arguments for this microservice.
+	 * 
+	 * @param args The arguments for this microservice.
+	 * @return This object (for method chaining).
+	 */
+	public Microservice setArgs(Args args) {
+		this.args = args;
+		ArgsVar.init(args);
+		return this;
+	}
+
+	/**
 	 * Returns the external INI-style configuration file that can be used to configure your microservice.
 	 * 
 	 * <p>
@@ -394,16 +423,16 @@ public abstract class Microservice implements ConfigEventListener {
 	 * 	<ck>sameAsAnInt</ck> = $C{MySection/anInt}
 	 * 
 	 * 	<cc># A command-line argument in the form "myarg=foo"</cc>
-	 * 	<ck>myArg</ck> = $ARG{myarg}
+	 * 	<ck>myArg</ck> = $A{myarg}
 	 * 
 	 * 	<cc># The first command-line argument</cc>
-	 * 	<ck>firstArg</ck> = $ARG{0}
+	 * 	<ck>firstArg</ck> = $A{0}
 	 * 
 	 * 	<cc># Look for system property, or env var if that doesn't exist, or command-line arg if that doesn't exist.</cc>
-	 * 	<ck>nested</ck> = $S{mySystemProperty,$E{MY_ENV_VAR,$ARG{0}}}
+	 * 	<ck>nested</ck> = $S{mySystemProperty,$E{MY_ENV_VAR,$A{0}}}
 	 * 
 	 * 	<cc># A POJO with embedded variables</cc>
-	 * 	<ck>aBean2</ck> = {foo:'$ARG{0}',baz:$C{MySection/anInt}}
+	 * 	<ck>aBean2</ck> = {foo:'$A{0}',baz:$C{MySection/anInt}}
 	 * </p>
 	 * 
 	 * <p class='bcode'>
diff --git a/juneau-microservice/juneau-microservice-server/src/main/java/org/apache/juneau/microservice/Resource.java b/juneau-microservice/juneau-microservice-server/src/main/java/org/apache/juneau/microservice/Resource.java
deleted file mode 100755
index c0d7014..0000000
--- a/juneau-microservice/juneau-microservice-server/src/main/java/org/apache/juneau/microservice/Resource.java
+++ /dev/null
@@ -1,65 +0,0 @@
-// ***************************************************************************************************************************
-// * Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements.  See the NOTICE file *
-// * distributed with this work for additional information regarding copyright ownership.  The ASF licenses this file        *
-// * to you under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance            *
-// * with the License.  You may obtain a copy of the License at                                                              *
-// *                                                                                                                         *
-// *  http://www.apache.org/licenses/LICENSE-2.0                                                                             *
-// *                                                                                                                         *
-// * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an  *
-// * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the License for the        *
-// * specific language governing permissions and limitations under the License.                                              *
-// ***************************************************************************************************************************
-package org.apache.juneau.microservice;
-
-import static org.apache.juneau.rest.annotation.HookEvent.*;
-
-import org.apache.juneau.microservice.vars.*;
-import org.apache.juneau.rest.*;
-import org.apache.juneau.rest.annotation.*;
-
-/**
- * Superclass for all REST resources.
- * 
- * <p>
- * In additional to the functionality of the {@link RestServletDefault} group,
- * augments the {@link RestContext#getVarResolver()} method with the following additional variable types:
- * <ul class='spaced-list'>
- * 	<li>
- * 		<code class='snippet'>$ARG{...}</code> - Command line arguments pulled from {@link Microservice#getArgs()}.
- * 		
- * 		<h5 class='figure'>Example:</h5>
- * 		<p class='bcode'>
- * 	String firstArg = request.getVarResolver().resolve(<js>"$ARG{0}"</js>);  <jc>// First argument.</jc>
- * 	String namedArg = request.getVarResolver().resolve(<js>"$ARG{myarg}"</js>);  <jc>// Named argument (e.g. "myarg=foo"). </jc>
- * 		</p>
- * 	<li>
- * 		<code class='snippet'>$MF{...}</code> - Manifest file entries pulled from {@link Microservice#getManifest()}.
- * 		
- * 		<h5 class='figure'>Example:</h5>
- * 		<p class='bcode'>
- * 	String mainClass = request.getVarResolver().resolve(<js>"$MF{Main-Class}"</js>);  <jc>// Main class. </jc>
- * 		</p>
- * </ul>
- */
-@SuppressWarnings("serial")
-@RestResource
-public abstract class Resource extends RestServletDefault {
-
-	/**
-	 * Add <code>$ARGS</code> and <code>$MF</code> variable resolvers.
-	 * 
-	 * @param builder The resource config.
-	 * @throws Exception
-	 */
-	@RestHook(INIT) 
-	public void addConfigVars(RestContextBuilder builder) throws Exception {
-		Microservice m = Microservice.getInstance();
-		if (m != null) {
-			builder
-				.vars(ArgsVar.class, ManifestFileVar.class)
-				.varContextObject(ArgsVar.SESSION_args, m.getArgs())
-				.varContextObject(ManifestFileVar.SESSION_manifest, m.getManifest());
-		}
-	}
-}
diff --git a/juneau-microservice/juneau-microservice-server/src/main/java/org/apache/juneau/microservice/ResourceGroup.java b/juneau-microservice/juneau-microservice-server/src/main/java/org/apache/juneau/microservice/ResourceGroup.java
deleted file mode 100755
index 3b2da75..0000000
--- a/juneau-microservice/juneau-microservice-server/src/main/java/org/apache/juneau/microservice/ResourceGroup.java
+++ /dev/null
@@ -1,66 +0,0 @@
-// ***************************************************************************************************************************
-// * Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements.  See the NOTICE file *
-// * distributed with this work for additional information regarding copyright ownership.  The ASF licenses this file        *
-// * to you under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance            *
-// * with the License.  You may obtain a copy of the License at                                                              *
-// *                                                                                                                         *
-// *  http://www.apache.org/licenses/LICENSE-2.0                                                                             *
-// *                                                                                                                         *
-// * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an  *
-// * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the License for the        *
-// * specific language governing permissions and limitations under the License.                                              *
-// ***************************************************************************************************************************
-package org.apache.juneau.microservice;
-
-import static org.apache.juneau.rest.annotation.HookEvent.*;
-
-import org.apache.juneau.microservice.vars.*;
-import org.apache.juneau.rest.*;
-import org.apache.juneau.rest.annotation.*;
-
-/**
- * Superclass for all REST resource groups.
- * 
- * <p>
- * In additional to the functionality of the {@link RestServletGroupDefault} group,
- * augments the {@link RestContext#getVarResolver()} method with the following additional variable types:
- * <ul class='spaced-list'>
- * 	<li>
- * 		<jk>$ARG{...}</jk> - Command line arguments.
- * 		<br>Resolves values from {@link Microservice#getArgs()}.
- * 		
- * 		<h5>Example:</h5>
- * 		<p class='bcode'>
- * 	String firstArg = request.getVarResolver().resolve(<js>"$ARG{0}"</js>);  <jc>// First argument.</jc>
- * 	String namedArg = request.getVarResolver().resolve(<js>"$ARG{myarg}"</js>);  <jc>// Named argument (e.g. "myarg=foo"). </jc>
- * 		</p>
- * 	<li>
- * 		<jk>$MF{...}</jk> - Manifest file entries.
- * 		
- * 		<h5>Example:</h5>
- * 		<p class='bcode'>
- * 	String mainClass = request.getVarResolver().resolve(<js>"$MF{Main-Class}"</js>);  <jc>// Main class. </jc>
- * 		</p>
- * </ul>
- */
-@SuppressWarnings("serial")
-@RestResource
-public abstract class ResourceGroup extends RestServletGroupDefault {
-
-	/**
-	 * Initializes the registry URL and rest clent.
-	 * 
-	 * @param builder The resource config.
-	 * @throws Exception
-	 */
-	@RestHook(INIT) 
-	public void addConfigVars(RestContextBuilder builder) throws Exception {
-		Microservice m = Microservice.getInstance();
-		if (m != null) {
-			builder
-				.vars(ArgsVar.class, ManifestFileVar.class)
-				.varContextObject(ArgsVar.SESSION_args, m.getArgs())
-				.varContextObject(ManifestFileVar.SESSION_manifest, m.getManifest());
-		}
-	}
-}
diff --git a/juneau-microservice/juneau-microservice-server/src/main/java/org/apache/juneau/microservice/ResourceJenaGroup.java b/juneau-microservice/juneau-microservice-server/src/main/java/org/apache/juneau/microservice/ResourceJenaGroup.java
deleted file mode 100644
index 6b99e1e..0000000
--- a/juneau-microservice/juneau-microservice-server/src/main/java/org/apache/juneau/microservice/ResourceJenaGroup.java
+++ /dev/null
@@ -1,90 +0,0 @@
-// ***************************************************************************************************************************
-// * Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements.  See the NOTICE file *
-// * distributed with this work for additional information regarding copyright ownership.  The ASF licenses this file        *
-// * to you under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance            *
-// * with the License.  You may obtain a copy of the License at                                                              *
-// *                                                                                                                         *
-// *  http://www.apache.org/licenses/LICENSE-2.0                                                                             *
-// *                                                                                                                         *
-// * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an  *
-// * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the License for the        *
-// * specific language governing permissions and limitations under the License.                                              *
-// ***************************************************************************************************************************
-package org.apache.juneau.microservice;
-
-import static org.apache.juneau.rest.annotation.HookEvent.*;
-
-import org.apache.juneau.html.*;
-import org.apache.juneau.jena.*;
-import org.apache.juneau.microservice.vars.*;
-import org.apache.juneau.rest.*;
-import org.apache.juneau.rest.annotation.*;
-
-/**
- * Superclass for all REST resource groups.
- * 
- * <p>
- * In additional to the functionality of the {@link RestServletGroupDefault} group,
- * augments the {@link RestContext#getVarResolver()} method with the following additional variable types:
- * <ul class='spaced-list'>
- * 	<li>
- * 		<jk>$ARG{...}</jk> - Command line arguments.
- * 		<br>Resolves values from {@link Microservice#getArgs()}.
- * 		
- * 		<h5>Example:</h5>
- * 		<p class='bcode'>
- * 	String firstArg = request.getVarResolver().resolve(<js>"$ARG{0}"</js>);  <jc>// First argument.</jc>
- * 	String namedArg = request.getVarResolver().resolve(<js>"$ARG{myarg}"</js>);  <jc>// Named argument (e.g. "myarg=foo"). </jc>
- * 		</p>
- * 	<li>
- * 		<jk>$MF{...}</jk> - Manifest file entries.
- * 		
- * 		<h5>Example:</h5>
- * 		<p class='bcode'>
- * 	String mainClass = request.getVarResolver().resolve(<js>"$MF{Main-Class}"</js>);  <jc>// Main class. </jc>
- * 		</p>
- * </ul>
- */
-@SuppressWarnings("serial")
-@RestResource(
-	htmldoc=@HtmlDoc(
-		navlinks={
-			"up: request:/..",
-			"options: servlet:/?method=OPTIONS"
-		}
-	),
-	config="$S{juneau.configFile}",
-	serializers={
-		HtmlDocSerializer.class,  // HTML must be listed first because Internet Explore does not include text/html in their Accept header.
-		RdfSerializer.Xml.class,
-		RdfSerializer.XmlAbbrev.class,
-		RdfSerializer.Turtle.class,
-		RdfSerializer.NTriple.class,
-		RdfSerializer.N3.class
-	},
-	parsers={
-		RdfParser.Xml.class,
-		RdfParser.Turtle.class,
-		RdfParser.NTriple.class,
-		RdfParser.N3.class
-	}
-)
-public abstract class ResourceJenaGroup extends RestServletGroupDefault {
-
-	/**
-	 * Add <code>$ARGS</code> and <code>$MF</code> variable resolvers.
-	 * 
-	 * @param builder The resource config.
-	 * @throws Exception
-	 */
-	@RestHook(INIT) 
-	public void addConfigVars(RestContextBuilder builder) throws Exception {
-		Microservice m = Microservice.getInstance();
-		if (m != null) {
-			builder
-				.vars(ArgsVar.class, ManifestFileVar.class)
-				.varContextObject(ArgsVar.SESSION_args, m.getArgs())
-				.varContextObject(ManifestFileVar.SESSION_manifest, m.getManifest());
-		}
-	}
-}
diff --git a/juneau-microservice/juneau-microservice-server/src/main/java/org/apache/juneau/microservice/ResourceJena.java b/juneau-microservice/juneau-microservice-server/src/main/java/org/apache/juneau/microservice/RestServletJenaDefault.java
similarity index 85%
copy from juneau-microservice/juneau-microservice-server/src/main/java/org/apache/juneau/microservice/ResourceJena.java
copy to juneau-microservice/juneau-microservice-server/src/main/java/org/apache/juneau/microservice/RestServletJenaDefault.java
index 4b99105..2dd956f 100755
--- a/juneau-microservice/juneau-microservice-server/src/main/java/org/apache/juneau/microservice/ResourceJena.java
+++ b/juneau-microservice/juneau-microservice-server/src/main/java/org/apache/juneau/microservice/RestServletJenaDefault.java
@@ -18,18 +18,10 @@ import org.apache.juneau.rest.*;
 import org.apache.juneau.rest.annotation.*;
 
 /**
- * Superclass for all REST resources with RDF support.
+ * Resource servlet with additional RDF support.
  */
 @SuppressWarnings("serial")
 @RestResource(
-	htmldoc=@HtmlDoc(
-		navlinks={
-			"up: request:/..",
-			"options: servlet:/?method=OPTIONS"
-		},
-		stylesheet="$C{REST/stylesheet,servlet:/styles/devops.css}"
-	),
-	config="$S{juneau.configFile}",
 	serializers={
 		HtmlDocSerializer.class,  // HTML must be listed first because Internet Explore does not include text/html in their Accept header.
 		RdfSerializer.Xml.class,
@@ -45,4 +37,4 @@ import org.apache.juneau.rest.annotation.*;
 		RdfParser.N3.class
 	}
 )
-public abstract class ResourceJena extends RestServletDefault {}
+public abstract class RestServletJenaDefault extends RestServletDefault {}
diff --git a/juneau-microservice/juneau-microservice-server/src/main/java/org/apache/juneau/microservice/ResourceJena.java b/juneau-microservice/juneau-microservice-server/src/main/java/org/apache/juneau/microservice/RestServletJenaGroup.java
old mode 100755
new mode 100644
similarity index 85%
rename from juneau-microservice/juneau-microservice-server/src/main/java/org/apache/juneau/microservice/ResourceJena.java
rename to juneau-microservice/juneau-microservice-server/src/main/java/org/apache/juneau/microservice/RestServletJenaGroup.java
index 4b99105..3c1f2b1
--- a/juneau-microservice/juneau-microservice-server/src/main/java/org/apache/juneau/microservice/ResourceJena.java
+++ b/juneau-microservice/juneau-microservice-server/src/main/java/org/apache/juneau/microservice/RestServletJenaGroup.java
@@ -18,18 +18,10 @@ import org.apache.juneau.rest.*;
 import org.apache.juneau.rest.annotation.*;
 
 /**
- * Superclass for all REST resources with RDF support.
+ * Resource group with additional RDF support.
  */
 @SuppressWarnings("serial")
 @RestResource(
-	htmldoc=@HtmlDoc(
-		navlinks={
-			"up: request:/..",
-			"options: servlet:/?method=OPTIONS"
-		},
-		stylesheet="$C{REST/stylesheet,servlet:/styles/devops.css}"
-	),
-	config="$S{juneau.configFile}",
 	serializers={
 		HtmlDocSerializer.class,  // HTML must be listed first because Internet Explore does not include text/html in their Accept header.
 		RdfSerializer.Xml.class,
@@ -45,4 +37,4 @@ import org.apache.juneau.rest.annotation.*;
 		RdfParser.N3.class
 	}
 )
-public abstract class ResourceJena extends RestServletDefault {}
+public abstract class RestServletJenaGroup extends RestServletGroup {}
diff --git a/juneau-microservice/juneau-microservice-server/src/main/java/org/apache/juneau/microservice/resources/ConfigResource.java b/juneau-microservice/juneau-microservice-server/src/main/java/org/apache/juneau/microservice/resources/ConfigResource.java
index 1027513..b08020f 100755
--- a/juneau-microservice/juneau-microservice-server/src/main/java/org/apache/juneau/microservice/resources/ConfigResource.java
+++ b/juneau-microservice/juneau-microservice-server/src/main/java/org/apache/juneau/microservice/resources/ConfigResource.java
@@ -21,7 +21,6 @@ import java.util.Map;
 
 import org.apache.juneau.*;
 import org.apache.juneau.dto.html5.*;
-import org.apache.juneau.microservice.*;
 import org.apache.juneau.rest.*;
 import org.apache.juneau.rest.annotation.*;
 import org.apache.juneau.rest.annotation.Body;
@@ -41,7 +40,7 @@ import org.apache.juneau.rest.annotation.Body;
 		}
 	)
 )
-public class ConfigResource extends Resource {
+public class ConfigResource extends RestServletDefault {
 	private static final long serialVersionUID = 1L;
 
 	/**
diff --git a/juneau-microservice/juneau-microservice-server/src/main/java/org/apache/juneau/microservice/resources/DebugResource.java b/juneau-microservice/juneau-microservice-server/src/main/java/org/apache/juneau/microservice/resources/DebugResource.java
index 16738f5..983127c 100644
--- a/juneau-microservice/juneau-microservice-server/src/main/java/org/apache/juneau/microservice/resources/DebugResource.java
+++ b/juneau-microservice/juneau-microservice-server/src/main/java/org/apache/juneau/microservice/resources/DebugResource.java
@@ -39,7 +39,7 @@ import org.apache.juneau.rest.labels.*;
 	allowedMethodParams="OPTIONS,POST"
 )
 @SuppressWarnings("javadoc")
-public class DebugResource extends Resource {
+public class DebugResource extends RestServletDefault {
 	private static final long serialVersionUID = 1L;
 
 	/**
diff --git a/juneau-microservice/juneau-microservice-server/src/main/java/org/apache/juneau/microservice/resources/DirectoryResource.java b/juneau-microservice/juneau-microservice-server/src/main/java/org/apache/juneau/microservice/resources/DirectoryResource.java
index 9880aa2..94eeeb6 100755
--- a/juneau-microservice/juneau-microservice-server/src/main/java/org/apache/juneau/microservice/resources/DirectoryResource.java
+++ b/juneau-microservice/juneau-microservice-server/src/main/java/org/apache/juneau/microservice/resources/DirectoryResource.java
@@ -25,7 +25,6 @@ import java.util.logging.*;
 import javax.servlet.*;
 
 import org.apache.juneau.annotation.*;
-import org.apache.juneau.microservice.*;
 import org.apache.juneau.rest.*;
 import org.apache.juneau.rest.annotation.*;
 import org.apache.juneau.rest.converters.*;
@@ -74,7 +73,7 @@ import org.apache.juneau.utils.*;
 		@Property(name="DirectoryResource.rootDir", value="")
 	}
 )
-public class DirectoryResource extends Resource {
+public class DirectoryResource extends RestServletDefault {
 	private static final long serialVersionUID = 1L;
 
 	private File rootDir;     // The root directory
diff --git a/juneau-microservice/juneau-microservice-server/src/main/java/org/apache/juneau/microservice/resources/LogsResource.java b/juneau-microservice/juneau-microservice-server/src/main/java/org/apache/juneau/microservice/resources/LogsResource.java
index 16b578d..46129f7 100755
--- a/juneau-microservice/juneau-microservice-server/src/main/java/org/apache/juneau/microservice/resources/LogsResource.java
+++ b/juneau-microservice/juneau-microservice-server/src/main/java/org/apache/juneau/microservice/resources/LogsResource.java
@@ -26,7 +26,6 @@ import java.util.*;
 import org.apache.juneau.annotation.*;
 import org.apache.juneau.config.*;
 import org.apache.juneau.dto.LinkString;
-import org.apache.juneau.microservice.*;
 import org.apache.juneau.rest.*;
 import org.apache.juneau.rest.annotation.*;
 import org.apache.juneau.rest.converters.*;
@@ -48,7 +47,7 @@ import org.apache.juneau.transforms.*;
 		DateSwap.ISO8601DT.class  // Serialize Date objects as ISO8601 strings.
 	}
 )
-public class LogsResource extends Resource {
+public class LogsResource extends RestServletDefault {
 	private static final long serialVersionUID = 1L;
 
 	private File logDir;
diff --git a/juneau-microservice/juneau-microservice-server/src/main/java/org/apache/juneau/microservice/resources/SampleRootResource.java b/juneau-microservice/juneau-microservice-server/src/main/java/org/apache/juneau/microservice/resources/SampleRootResource.java
index 4122d6a..07d70e0 100755
--- a/juneau-microservice/juneau-microservice-server/src/main/java/org/apache/juneau/microservice/resources/SampleRootResource.java
+++ b/juneau-microservice/juneau-microservice-server/src/main/java/org/apache/juneau/microservice/resources/SampleRootResource.java
@@ -12,7 +12,7 @@
 // ***************************************************************************************************************************
 package org.apache.juneau.microservice.resources;
 
-import org.apache.juneau.microservice.*;
+import org.apache.juneau.rest.*;
 import org.apache.juneau.rest.annotation.*;
 
 /**
@@ -24,6 +24,6 @@ import org.apache.juneau.rest.annotation.*;
 	description="This is a sample router page",
 	children={ConfigResource.class,LogsResource.class}
 )
-public class SampleRootResource extends ResourceGroup {
+public class SampleRootResource extends RestServletGroup {
 	private static final long serialVersionUID = 1L;
 }
diff --git a/juneau-microservice/juneau-microservice-server/src/main/java/org/apache/juneau/microservice/resources/ShutdownResource.java b/juneau-microservice/juneau-microservice-server/src/main/java/org/apache/juneau/microservice/resources/ShutdownResource.java
index e950c15..dd33bfb 100755
--- a/juneau-microservice/juneau-microservice-server/src/main/java/org/apache/juneau/microservice/resources/ShutdownResource.java
+++ b/juneau-microservice/juneau-microservice-server/src/main/java/org/apache/juneau/microservice/resources/ShutdownResource.java
@@ -14,7 +14,7 @@ package org.apache.juneau.microservice.resources;
 
 import static org.apache.juneau.http.HttpMethodName.*;
 
-import org.apache.juneau.microservice.*;
+import org.apache.juneau.rest.*;
 import org.apache.juneau.rest.annotation.*;
 
 /**
@@ -24,7 +24,7 @@ import org.apache.juneau.rest.annotation.*;
 	path="/shutdown",
 	title="Shut down this resource"
 )
-public class ShutdownResource extends Resource {
+public class ShutdownResource extends RestServletDefault {
 
 	private static final long serialVersionUID = 1L;
 
diff --git a/juneau-microservice/juneau-microservice-server/src/main/java/org/apache/juneau/microservice/vars/package-info.java b/juneau-microservice/juneau-microservice-server/src/main/java/org/apache/juneau/microservice/vars/package-info.java
deleted file mode 100755
index 40b9863..0000000
--- a/juneau-microservice/juneau-microservice-server/src/main/java/org/apache/juneau/microservice/vars/package-info.java
+++ /dev/null
@@ -1,18 +0,0 @@
-// ***************************************************************************************************************************
-// * Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements.  See the NOTICE file *
-// * distributed with this work for additional information regarding copyright ownership.  The ASF licenses this file        *
-// * to you under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance            *
-// * with the License.  You may obtain a copy of the License at                                                              *
-// *                                                                                                                         *
-// *  http://www.apache.org/licenses/LICENSE-2.0                                                                             *
-// *                                                                                                                         *
-// * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an  *
-// * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the License for the        *
-// * specific language governing permissions and limitations under the License.                                              *
-// ***************************************************************************************************************************
-
-/**
- * Predefined SVL Variables
- */
-package org.apache.juneau.microservice.vars;
-
diff --git a/juneau-microservice/juneau-microservice-template/src/main/java/org/apache/juneau/microservice/sample/HelloWorldResource.java b/juneau-microservice/juneau-microservice-template/src/main/java/org/apache/juneau/microservice/sample/HelloWorldResource.java
index 8de3f04..371df39 100755
--- a/juneau-microservice/juneau-microservice-template/src/main/java/org/apache/juneau/microservice/sample/HelloWorldResource.java
+++ b/juneau-microservice/juneau-microservice-template/src/main/java/org/apache/juneau/microservice/sample/HelloWorldResource.java
@@ -14,7 +14,7 @@ package org.apache.juneau.microservice.sample;
 
 import static org.apache.juneau.http.HttpMethodName.*;
 
-import org.apache.juneau.microservice.Resource;
+import org.apache.juneau.rest.*;
 import org.apache.juneau.rest.annotation.RestMethod;
 import org.apache.juneau.rest.annotation.RestResource;
 
@@ -26,7 +26,7 @@ import org.apache.juneau.rest.annotation.RestResource;
 	path="/helloworld",
 	description="Simplest possible REST resource"
 )
-public class HelloWorldResource extends Resource {
+public class HelloWorldResource extends RestServletDefault {
 	private static final long serialVersionUID = 1L;
 
 	/** 
diff --git a/juneau-microservice/juneau-microservice-template/src/main/java/org/apache/juneau/microservice/sample/RootResources.java b/juneau-microservice/juneau-microservice-template/src/main/java/org/apache/juneau/microservice/sample/RootResources.java
index 41fa4fd..a9f94d7 100755
--- a/juneau-microservice/juneau-microservice-template/src/main/java/org/apache/juneau/microservice/sample/RootResources.java
+++ b/juneau-microservice/juneau-microservice-template/src/main/java/org/apache/juneau/microservice/sample/RootResources.java
@@ -12,9 +12,9 @@
 // ***************************************************************************************************************************
 package org.apache.juneau.microservice.sample;
 
-import org.apache.juneau.microservice.ResourceGroup;
 import org.apache.juneau.microservice.resources.ConfigResource;
 import org.apache.juneau.microservice.resources.LogsResource;
+import org.apache.juneau.rest.*;
 import org.apache.juneau.rest.annotation.HtmlDoc;
 import org.apache.juneau.rest.annotation.RestResource;
 import org.apache.juneau.rest.widget.ContentTypeMenuItem;
@@ -42,6 +42,6 @@ import org.apache.juneau.rest.widget.StyleMenuItem;
 		LogsResource.class
 	}
 )
-public class RootResources extends ResourceGroup {
+public class RootResources extends RestServletGroup {
 	private static final long serialVersionUID = 1L;
 }
diff --git a/juneau-microservice/juneau-microservice-test/src/main/java/org/apache/juneau/rest/test/BpiResource.java b/juneau-microservice/juneau-microservice-test/src/main/java/org/apache/juneau/rest/test/BpiResource.java
index aa86a79..e40ece7 100644
--- a/juneau-microservice/juneau-microservice-test/src/main/java/org/apache/juneau/rest/test/BpiResource.java
+++ b/juneau-microservice/juneau-microservice-test/src/main/java/org/apache/juneau/rest/test/BpiResource.java
@@ -24,7 +24,7 @@ import org.apache.juneau.rest.annotation.*;
 @RestResource(
 	path="/testBpi"
 )
-public class BpiResource extends ResourceJena {
+public class BpiResource extends RestServletJenaDefault {
 	private static final long serialVersionUID = 1L;
 
 	//====================================================================================================
diff --git a/juneau-microservice/juneau-microservice-test/src/main/java/org/apache/juneau/rest/test/ClientVersionResource.java b/juneau-microservice/juneau-microservice-test/src/main/java/org/apache/juneau/rest/test/ClientVersionResource.java
index 8e8d489..8ea723d 100644
--- a/juneau-microservice/juneau-microservice-test/src/main/java/org/apache/juneau/rest/test/ClientVersionResource.java
+++ b/juneau-microservice/juneau-microservice-test/src/main/java/org/apache/juneau/rest/test/ClientVersionResource.java
@@ -14,7 +14,7 @@ package org.apache.juneau.rest.test;
 
 import static org.apache.juneau.http.HttpMethodName.*;
 
-import org.apache.juneau.microservice.*;
+import org.apache.juneau.rest.*;
 import org.apache.juneau.rest.annotation.*;
 
 /**
@@ -28,12 +28,12 @@ import org.apache.juneau.rest.annotation.*;
 	}
 )
 @SuppressWarnings("serial")
-public class ClientVersionResource extends Resource {
+public class ClientVersionResource extends RestServletDefault {
 
 	@RestResource(
 		path="/defaultHeader"
 	)
-	public static class DefaultHeader extends Resource {
+	public static class DefaultHeader extends RestServletDefault {
 
 		@RestMethod(name=GET, path="/")
 		public String test0() {
@@ -65,7 +65,7 @@ public class ClientVersionResource extends Resource {
 		path="/customHeader",
 		clientVersionHeader="Custom-Client-Version"
 	)
-	public static class CustomHeader extends Resource {
+	public static class CustomHeader extends RestServletDefault {
 
 		@RestMethod(name=GET, path="/")
 		public String test0() {
diff --git a/juneau-microservice/juneau-microservice-test/src/main/java/org/apache/juneau/rest/test/ConfigResource.java b/juneau-microservice/juneau-microservice-test/src/main/java/org/apache/juneau/rest/test/ConfigResource.java
index da50e11..fe4b622 100644
--- a/juneau-microservice/juneau-microservice-test/src/main/java/org/apache/juneau/rest/test/ConfigResource.java
+++ b/juneau-microservice/juneau-microservice-test/src/main/java/org/apache/juneau/rest/test/ConfigResource.java
@@ -14,7 +14,6 @@ package org.apache.juneau.rest.test;
 
 import static org.apache.juneau.http.HttpMethodName.*;
 
-import org.apache.juneau.microservice.*;
 import org.apache.juneau.rest.*;
 import org.apache.juneau.rest.annotation.*;
 
@@ -25,7 +24,7 @@ import org.apache.juneau.rest.annotation.*;
 	path="/testConfig"
 )
 @SuppressWarnings("serial")
-public class ConfigResource extends Resource {
+public class ConfigResource extends RestServletDefault {
 
 	@RestMethod(name=GET, path="/")
 	public Object test1(RestRequest req) {
diff --git a/juneau-microservice/juneau-microservice-test/src/main/java/org/apache/juneau/rest/test/InterfaceProxyResource.java b/juneau-microservice/juneau-microservice-test/src/main/java/org/apache/juneau/rest/test/InterfaceProxyResource.java
index aa75846..4051202 100644
--- a/juneau-microservice/juneau-microservice-test/src/main/java/org/apache/juneau/rest/test/InterfaceProxyResource.java
+++ b/juneau-microservice/juneau-microservice-test/src/main/java/org/apache/juneau/rest/test/InterfaceProxyResource.java
@@ -31,7 +31,7 @@ import org.junit.*;
  */
 @RestResource(
 	path="/testInterfaceProxyResource")
-public class InterfaceProxyResource extends ResourceJena {
+public class InterfaceProxyResource extends RestServletJenaDefault {
 	private static final long serialVersionUID = 1L;
 
 	//====================================================================================================
diff --git a/juneau-microservice/juneau-microservice-test/src/main/java/org/apache/juneau/rest/test/LargePojosResource.java b/juneau-microservice/juneau-microservice-test/src/main/java/org/apache/juneau/rest/test/LargePojosResource.java
index 1e1759e..84d4854 100644
--- a/juneau-microservice/juneau-microservice-test/src/main/java/org/apache/juneau/rest/test/LargePojosResource.java
+++ b/juneau-microservice/juneau-microservice-test/src/main/java/org/apache/juneau/rest/test/LargePojosResource.java
@@ -23,7 +23,7 @@ import org.apache.juneau.rest.annotation.*;
 @RestResource(
 	path="/testLargePojos"
 )
-public class LargePojosResource extends ResourceJena {
+public class LargePojosResource extends RestServletJenaDefault {
 	private static final long serialVersionUID = 1L;
 
 	//====================================================================================================
diff --git a/juneau-microservice/juneau-microservice-test/src/main/java/org/apache/juneau/rest/test/NlsResource.java b/juneau-microservice/juneau-microservice-test/src/main/java/org/apache/juneau/rest/test/NlsResource.java
index e1fdf20..1703dd8 100644
--- a/juneau-microservice/juneau-microservice-test/src/main/java/org/apache/juneau/rest/test/NlsResource.java
+++ b/juneau-microservice/juneau-microservice-test/src/main/java/org/apache/juneau/rest/test/NlsResource.java
@@ -33,7 +33,7 @@ import org.apache.juneau.utils.*;
 	}
 )
 @SuppressWarnings({"serial"})
-public class NlsResource extends RestServletGroupDefault {
+public class NlsResource extends RestServletGroup {
 	private static final long serialVersionUID = 1L;
 
 	//====================================================================================================
diff --git a/juneau-microservice/juneau-microservice-test/src/main/java/org/apache/juneau/rest/test/RequestBeanProxyResource.java b/juneau-microservice/juneau-microservice-test/src/main/java/org/apache/juneau/rest/test/RequestBeanProxyResource.java
index da3b956..4928fb6 100644
--- a/juneau-microservice/juneau-microservice-test/src/main/java/org/apache/juneau/rest/test/RequestBeanProxyResource.java
+++ b/juneau-microservice/juneau-microservice-test/src/main/java/org/apache/juneau/rest/test/RequestBeanProxyResource.java
@@ -27,7 +27,7 @@ import org.apache.juneau.rest.annotation.*;
 	path="/testRequestBeanProxy"
 )
 @SuppressWarnings("serial")
-public class RequestBeanProxyResource extends ResourceJena {
+public class RequestBeanProxyResource extends RestServletJenaDefault {
 
 	@RestMethod(name=GET, path="/echoQuery")
 	public Reader echoQuery(RestRequest req) throws Exception {
diff --git a/juneau-microservice/juneau-microservice-test/src/main/java/org/apache/juneau/rest/test/ThirdPartyProxyResource.java b/juneau-microservice/juneau-microservice-test/src/main/java/org/apache/juneau/rest/test/ThirdPartyProxyResource.java
index 77e050f..ddc9fc5 100644
--- a/juneau-microservice/juneau-microservice-test/src/main/java/org/apache/juneau/rest/test/ThirdPartyProxyResource.java
+++ b/juneau-microservice/juneau-microservice-test/src/main/java/org/apache/juneau/rest/test/ThirdPartyProxyResource.java
@@ -36,7 +36,7 @@ import org.apache.juneau.utils.*;
 	path="/testThirdPartyProxy"
 )
 @SuppressWarnings("serial")
-public class ThirdPartyProxyResource extends ResourceJena {
+public class ThirdPartyProxyResource extends RestServletJenaDefault {
 
 	public static FileWriter logFile;
 	static {
diff --git a/juneau-microservice/juneau-microservice-test/src/test/java/org/apache/juneau/rest/test/ConfigTest.java b/juneau-microservice/juneau-microservice-test/src/test/java/org/apache/juneau/rest/test/ConfigTest.java
index 5f8b7fa..b6a475e 100644
--- a/juneau-microservice/juneau-microservice-test/src/test/java/org/apache/juneau/rest/test/ConfigTest.java
+++ b/juneau-microservice/juneau-microservice-test/src/test/java/org/apache/juneau/rest/test/ConfigTest.java
@@ -38,7 +38,7 @@ public class ConfigTest extends RestTestcase {
 
 		Config cf = Config.create().memStore().build().load(m);
 
-		assertObjectEquals("{int1:'1',int2:'[1,2,3]',int3:'1',int4:'1',int5:'-1',boolean1:'true',boolean2:'[true,true]',testManifestEntry:'$MF{Test-Entry}'}", cf.getSectionAsMap("Test"));
+		assertObjectEquals("{int1:'1',int2:'[1,2,3]',int3:'1',int4:'1',int5:'-1',boolean1:'true',boolean2:'[true,true]',testManifestEntry:'test-value'}", cf.getSectionAsMap("Test"));
 
 		assertEquals("'1'", c.doGet(URL + "/Test%2Fint1/" + getName(String.class)).getResponseAsString());
 		assertEquals("'[1,2,3]'", c.doGet(URL + "/Test%2Fint2/" + getName(String.class)).getResponseAsString());
diff --git a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestContextBuilder.java b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestContextBuilder.java
index fd4dbd1..fd90cdf 100644
--- a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestContextBuilder.java
+++ b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestContextBuilder.java
@@ -142,14 +142,8 @@ public class RestContextBuilder extends BeanContextBuilder implements ServletCon
 
 			htmlDocBuilder = new HtmlDocBuilder(properties);
 			varResolverBuilder = new VarResolverBuilder()
-				.vars(
-					SystemPropertiesVar.class,
-					EnvVariablesVar.class,
-					ConfigVar.class,
-					IfVar.class,
-					SwitchVar.class,
-					CoalesceVar.class
-				);
+				.defaultVars()
+				.vars(ConfigVar.class);
 
 			VarResolver vr = varResolverBuilder.build();
 
diff --git a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestServletGroupDefault.java b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestServletGroup.java
similarity index 95%
rename from juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestServletGroupDefault.java
rename to juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestServletGroup.java
index 191e6aa..8d0125f 100644
--- a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestServletGroupDefault.java
+++ b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestServletGroup.java
@@ -33,7 +33,7 @@ import org.apache.juneau.rest.labels.*;
  * </ul>
  */
 @RestResource
-public abstract class RestServletGroupDefault extends RestServletDefault {
+public class RestServletGroup extends RestServletDefault {
 	private static final long serialVersionUID = 1L;
 
 	/**

-- 
To stop receiving notification emails like this one, please contact
jamesbognar@apache.org.

Mime
View raw message