diff --git a/pom.xml b/pom.xml
index b49ff5b..3a84a32 100644
--- a/pom.xml
+++ b/pom.xml
@@ -53,7 +53,7 @@
             <plugin>
                 <groupId>org.apache.felix</groupId>
                 <artifactId>maven-bundle-plugin</artifactId>
-                <extensions>true</extensions>
+                <extensions>true</extensions> 
                 <configuration>
                     <instructions>
                         <Import-Package>
@@ -156,7 +156,7 @@
                 	<artifactId>
                 		org.apache.sling.servlet-helpers
                 	</artifactId>
-                	<version>1.1.5-SNAPSHOT</version>
+                	<version>1.1.6</version>
                 	<type>bundle</type>
                 	<scope>test</scope>
                 </dependency>
diff --git a/src/main/java/org/apache/sling/servlets/get/impl/DefaultGetServlet.java b/src/main/java/org/apache/sling/servlets/get/impl/DefaultGetServlet.java
index 50df111..778f763 100644
--- a/src/main/java/org/apache/sling/servlets/get/impl/DefaultGetServlet.java
+++ b/src/main/java/org/apache/sling/servlets/get/impl/DefaultGetServlet.java
@@ -129,7 +129,7 @@
                   "200.")
         int json_maximumresults() default 200;
         
-        @AttributeDefinition(name = "ECMA date Support", description="Enable deprecated ECMA formatting for JSON response")
+        @AttributeDefinition(name = "ECMA date support", description="Enable deprecated ECMA formatting for JSON response")
         boolean ecmaSuport() default false;
     }
 
diff --git a/src/main/java/org/apache/sling/servlets/get/impl/VersionInfoServlet.java b/src/main/java/org/apache/sling/servlets/get/impl/VersionInfoServlet.java
index 35b9fae..cdcfd67 100644
--- a/src/main/java/org/apache/sling/servlets/get/impl/VersionInfoServlet.java
+++ b/src/main/java/org/apache/sling/servlets/get/impl/VersionInfoServlet.java
@@ -81,7 +81,7 @@
         @AttributeDefinition(name = "Selector", description="List of selectors this servlet handles to display the versions")
         String[] sling_servlet_selectors() default "V";
         
-        @AttributeDefinition(name = "ECMA date Support", description="Enable deprecated ECMA formatting for JSON response")
+        @AttributeDefinition(name = "ECMA date support", description="Enable deprecated ECMA formatting for JSON response")
         boolean ecmaSuport() default false;
     }
     
diff --git a/src/main/java/org/apache/sling/servlets/get/impl/helpers/XMLRenderer.java b/src/main/java/org/apache/sling/servlets/get/impl/helpers/XMLRenderer.java
index cda2b78..4c94161 100644
--- a/src/main/java/org/apache/sling/servlets/get/impl/helpers/XMLRenderer.java
+++ b/src/main/java/org/apache/sling/servlets/get/impl/helpers/XMLRenderer.java
@@ -83,9 +83,7 @@
                     } else {
                         resp.sendError(HttpServletResponse.SC_NO_CONTENT); // NO Content
                     }
-                } catch (RepositoryException e) {
-                    throw new ServletException("Unable to export resource as xml: " + r, e);
-                } catch (SAXException e) {
+                } catch (RepositoryException|SAXException e) {
                     throw new ServletException("Unable to export resource as xml: " + r, e);
                 }
             } else {
diff --git a/src/main/java/org/apache/sling/servlets/get/impl/util/JsonObjectCreator.java b/src/main/java/org/apache/sling/servlets/get/impl/util/JsonObjectCreator.java
index 6f587cd..5cf4d0a 100644
--- a/src/main/java/org/apache/sling/servlets/get/impl/util/JsonObjectCreator.java
+++ b/src/main/java/org/apache/sling/servlets/get/impl/util/JsonObjectCreator.java
@@ -39,6 +39,12 @@
 
 public class JsonObjectCreator {
 	
+    /** Used to format date values */
+    private static final String ECMA_DATE_FORMAT = "EEE MMM dd yyyy HH:mm:ss 'GMT'Z";
+
+    /** The Locale used to format date values */
+    static final Locale DATE_FORMAT_LOCALE = Locale.US;
+	
 	private Resource resource;
 	
 	private ValueMap valueMap;
@@ -50,53 +56,39 @@
 		this.valueMap = resource.getValueMap();
 		this.ecmaSupport = ecmaSupport;
 	}
+	
+	public JsonObjectBuilder create() {
+		final JsonObjectBuilder obj = Json.createObjectBuilder();
+		
+		ValueMap valueMap = resource.getValueMap();
+		if (valueMap.isEmpty()) {
+			final String value = resource.adaptTo(String.class);
+			if (value != null) {
+				obj.add(resource.getName(), value.toString());
+			}  else {
+				final String[] values = resource.adaptTo(String[].class);
+				if (values != null) {
+					JsonArrayBuilder builder = Json.createArrayBuilder();
+					for (String v : values) {
+						builder.add(v);
+					}
+					obj.add(resource.getName(), builder);
+				}
+			}
+			return obj;
+		} 
 
-    public JsonObjectBuilder create() {
+		final Iterator<Map.Entry<String, Object>> props = valueMap.entrySet().iterator();
 
-        final JsonObjectBuilder obj = Json.createObjectBuilder();
+		while (props.hasNext()) {
+			final Map.Entry<String, Object> prop = props.next();
+			if (prop.getValue() != null) {
+				createProperty(obj, prop.getKey(), prop.getValue());
+			}
+		}
 
-        if (valueMap.isEmpty()) {
-
-            // no map available, try string
-            final String value = resource.adaptTo(String.class);
-            if (value != null) {
-                obj.add(resource.getName(), value.toString());
-            } else {
-                // Try multi-value "property"
-                final String[] values = resource.adaptTo(String[].class);
-                if (values != null) {
-                    JsonArrayBuilder builder = Json.createArrayBuilder();
-                    for (String v : values)
-                    {
-                        builder.add(v);
-                    }
-                    obj.add(resource.getName(), builder);
-                }
-
-            }
-
-        } else {
-
-            final Iterator<Map.Entry<String,Object>> props = valueMap.entrySet().iterator();
-
-            // the node's actual properties
-            while (props.hasNext()) {
-                final Map.Entry<String,Object> prop = props.next();
-                if ( prop.getValue() != null ) {
-                    createProperty(obj, prop.getKey(), prop.getValue());
-                }
-            }
-        }
-
-        return obj;
-    }
-
-    /** Used to format date values */
-    private static final String ECMA_DATE_FORMAT = "EEE MMM dd yyyy HH:mm:ss 'GMT'Z";
-
-    /** The Locale used to format date values */
-    static final Locale DATE_FORMAT_LOCALE = Locale.US;
-
+		return obj;
+	}
     
     public static String formatEcma(final Calendar date) {
         DateFormat formatter = new SimpleDateFormat(ECMA_DATE_FORMAT, DATE_FORMAT_LOCALE);
@@ -121,8 +113,6 @@
             builder.add("entry", (Boolean) value);
         } else if ( value instanceof Long ) {
             builder.add("entry", (Long) value);
-        } else if ( value instanceof Integer ) {
-            builder.add("entry", (Integer) value);
         } else if ( value instanceof Double ) {
             builder.add("entry", (Double) value);
         } else if ( value != null ) {
@@ -161,7 +151,7 @@
             // (colon is not allowed as a JCR property name)
             // in the name, and the value should be the size of the binary data
             if (values == null) {
-                obj.add(":" + key, getLength(-1, key, (InputStream)value));
+                obj.add(":" + key, getLength(0, key, (InputStream)value));
             } else {
                 final JsonArrayBuilder result = Json.createArrayBuilder();
                 for (int i = 0; i < values.length; i++) {
@@ -191,14 +181,10 @@
         } catch (IOException ignore) {}
         long length = -1;
         if ( valueMap != null ) {
-            if ( index == -1 ) {
-                length = valueMap.get(key, length);
-            } else {
-                Long[] lengths = valueMap.get(key, Long[].class);
-                if ( lengths != null && lengths.length > index ) {
-                    length = lengths[index];
-                }
-            }
+        	 Long[] lengths = valueMap.get(key, Long[].class);
+             if ( lengths != null && lengths.length > index ) {
+                 length = lengths[index];
+             }
         }
         return length;
     }
diff --git a/src/test/java/org/apache/sling/servlets/get/impl/JsonRendererServletTest.java b/src/test/java/org/apache/sling/servlets/get/impl/JsonRendererServletTest.java
index a86cee0..99b7fa5 100644
--- a/src/test/java/org/apache/sling/servlets/get/impl/JsonRendererServletTest.java
+++ b/src/test/java/org/apache/sling/servlets/get/impl/JsonRendererServletTest.java
@@ -18,17 +18,14 @@
  */
 package org.apache.sling.servlets.get.impl;
 
-import org.apache.sling.api.SlingHttpServletRequest;
-import org.apache.sling.api.SlingHttpServletResponse;
+import static org.junit.Assert.assertEquals;
+
 import org.apache.sling.commons.testing.sling.MockResource;
 import org.apache.sling.commons.testing.sling.MockResourceResolver;
 import org.apache.sling.commons.testing.sling.MockSlingHttpServletRequest;
 import org.apache.sling.commons.testing.sling.MockSlingHttpServletResponse;
 import org.apache.sling.servlets.get.impl.helpers.JsonRenderer;
 
-import static org.junit.Assert.assertEquals;
-import junitx.util.PrivateAccessor;
-
 public class JsonRendererServletTest {
 
 	private static MockResourceResolver resolver;
@@ -79,10 +76,8 @@
 		request.setResource(resolver.getResource(path));
 
 		MockSlingHttpServletResponse response = new MockSlingHttpServletResponse();
-		JsonRenderer servlet = new JsonRenderer(1000,true);
-		PrivateAccessor.invoke(servlet, "render",
-				new Class[]{SlingHttpServletRequest.class, SlingHttpServletResponse.class},
-				new Object[]{request, response});
+		JsonRenderer renderer = new JsonRenderer(1000,true);
+		renderer.render(request, response);
 		return response.getOutput().toString();
 	}
 }
diff --git a/src/test/java/org/apache/sling/servlets/get/impl/helpers/JsonRendererTest.java b/src/test/java/org/apache/sling/servlets/get/impl/helpers/JsonRendererTest.java
index e6d971d..b28db92 100644
--- a/src/test/java/org/apache/sling/servlets/get/impl/helpers/JsonRendererTest.java
+++ b/src/test/java/org/apache/sling/servlets/get/impl/helpers/JsonRendererTest.java
@@ -28,7 +28,6 @@
 
 import javax.json.Json;
 import javax.json.JsonObject;
-import javax.json.JsonReader;
 
 import org.apache.jackrabbit.util.ISO8601;
 import org.apache.sling.testing.mock.sling.junit.SlingContext;
@@ -110,27 +109,44 @@
     @Test
     public void testISO8601() throws IOException {
     	context.requestPathInfo().setSelectorString("1");
-        jrs.render(request, response);
-        StringReader reader = new StringReader(response.getOutputAsString());
-        JsonObject job = Json.createReader(reader).readObject();
-        String created = job.getString("created");
+        String created = responseToJSON().getString("created");
         Calendar cal = ISO8601.parse(created);
         // at the time of the test the offset it not preserved
-        // if we did direct string comparison the time would be different based on the testers
-        // time zone
-        assertTrue(ISO8601.getYear(cal) == 2016);
+        // if we did direct string comparison the time would be different
+        // based on the testing environments time zone
+        assertTrue(cal != null && ISO8601.getYear(cal) == 2016);
     }
     
     @Test
     public void testECMA() throws IOException {
     	context.requestPathInfo().setSelectorString("1");
-    	jrs = new JsonRenderer(42,true);
-        jrs.render(request, response);
-        String out = response.getOutputAsString();
+    	JsonRenderer ecmajrs = new JsonRenderer(42,true);
+    	ecmajrs.render(request, response);
+    	String out = response.getOutputAsString();
         JsonObject job = Json.createReader(new StringReader(out)).readObject();
         String created = job.getString("created");
         assertTrue(created.startsWith("Mon Jan"));
     }
     
+    @Test
+    public void testBoolean() throws IOException {
+    	context.requestPathInfo().setSelectorString("1");
+        assertTrue(responseToJSON().getBoolean("active"));
+    }
+    
+    @Test
+     // JSON impl only support Integers, JCR only supports Long values.  
+    public void testNumber() throws IOException {
+    	context.requestPathInfo().setSelectorString("1");
+        assertTrue(responseToJSON().getInt("number") == 2);
+    }
+    
+    private JsonObject responseToJSON() throws IOException {
+        jrs.render(request, response);
+        String out = response.getOutputAsString();
+        JsonObject job = Json.createReader(new StringReader(out)).readObject();
+        return job;
+    }
+    
     
 }
\ No newline at end of file
diff --git a/src/test/resources/data.json b/src/test/resources/data.json
index 7619a4f..8f2baea 100644
--- a/src/test/resources/data.json
+++ b/src/test/resources/data.json
@@ -1,6 +1,8 @@
 {
   "resourceType":"page",
   "created" : "Mon Jan 18 2016 16:30:00 GMT+0200",
+  "active" : true,
+  "number" : 2,
   "one":
   {
     "resourceType":"one"
