diff --git a/pom.xml b/pom.xml
index 7ece872..78a8b7f 100644
--- a/pom.xml
+++ b/pom.xml
@@ -137,9 +137,9 @@
             <artifactId>jcr</artifactId>
         </dependency>
         <dependency>
-            <groupId>rhino</groupId>
-            <artifactId>js</artifactId>
-            <version>1.6R6</version>
+            <groupId>org.mozilla</groupId>
+            <artifactId>rhino</artifactId>
+            <version>1.7R4</version>
         </dependency>
         <dependency>
             <groupId>org.slf4j</groupId>
diff --git a/src/main/java/org/apache/sling/scripting/javascript/wrapper/ScriptableCalendar.java b/src/main/java/org/apache/sling/scripting/javascript/wrapper/ScriptableCalendar.java
index 504d1e3..52fd22d 100644
--- a/src/main/java/org/apache/sling/scripting/javascript/wrapper/ScriptableCalendar.java
+++ b/src/main/java/org/apache/sling/scripting/javascript/wrapper/ScriptableCalendar.java
@@ -19,7 +19,6 @@
 import java.text.SimpleDateFormat;
 import java.util.Calendar;
 import java.util.GregorianCalendar;
-
 import org.apache.sling.scripting.javascript.SlingWrapper;
 import org.mozilla.javascript.ScriptRuntime;
 import org.mozilla.javascript.Scriptable;
@@ -31,12 +30,17 @@
 
 	public static final String CLASSNAME = "Calendar";
 	private SimpleDateFormat calendarFormat;
-	
+
 	/** Calendar is a class, not an interface - so we need to enumerate possible implementations here */
     public static final Class<?> [] WRAPPED_CLASSES = { Calendar.class, GregorianCalendar.class };
 
+    /**
+     * The wrapped Calendar. Will be {@code null} if the
+     * {@link #jsConstructor(Object)} method is not called, which particularly
+     * is the case for the Calendar host object prototype.
+     */
 	private Calendar calendar;
-	
+
     public Class<?>[] getWrappedClasses() {
 		return WRAPPED_CLASSES;
 	}
@@ -44,7 +48,7 @@
     public void jsConstructor(Object o) {
         this.calendar = (Calendar) o;
     }
-	
+
     @Override
     public Object get(String name, Scriptable start) {
 
@@ -57,14 +61,14 @@
         if(calendar == null) {
             return Undefined.instance;
         }
-        
+
         if("date".equals(name)) {
         	return ScriptRuntime.toObject(this, calendar.getTime());
         }
-        
+
         return getNative(name, start);
     }
-    
+
 	@Override
 	protected Class<?> getStaticType() {
 		return Calendar.class;
@@ -92,7 +96,7 @@
         }
         return calendarFormat.format(calendar.getTime());
 	}
-	
+
     public Object unwrap() {
         return calendar;
     }
diff --git a/src/main/java/org/apache/sling/scripting/javascript/wrapper/ScriptableItemMap.java b/src/main/java/org/apache/sling/scripting/javascript/wrapper/ScriptableItemMap.java
index bf618b0..8ac96e6 100644
--- a/src/main/java/org/apache/sling/scripting/javascript/wrapper/ScriptableItemMap.java
+++ b/src/main/java/org/apache/sling/scripting/javascript/wrapper/ScriptableItemMap.java
@@ -39,10 +39,7 @@
     /** default log */
     private final Logger log = LoggerFactory.getLogger(getClass());
 
-    private Map<String, Item> items = new LinkedHashMap<String, Item>();
-
-    public ScriptableItemMap() {
-    }
+    private final Map<String, Item> items = new LinkedHashMap<String, Item>();
 
     public void jsConstructor(Object res) {
         if (res instanceof Iterator<?>) {
diff --git a/src/main/java/org/apache/sling/scripting/javascript/wrapper/ScriptableNode.java b/src/main/java/org/apache/sling/scripting/javascript/wrapper/ScriptableNode.java
index 624e13e..15ceb23 100644
--- a/src/main/java/org/apache/sling/scripting/javascript/wrapper/ScriptableNode.java
+++ b/src/main/java/org/apache/sling/scripting/javascript/wrapper/ScriptableNode.java
@@ -55,6 +55,11 @@
     /** default log */
     private final Logger log = LoggerFactory.getLogger(getClass());
 
+    /**
+     * The wrapped JCR Node instance. Will be {@code null} if the
+     * {@link #jsConstructor(Object)} method is not called, which particularly
+     * is the case for the Node host object prototype.
+     */
     private Node node;
 
     public void jsConstructor(Object res) {
@@ -68,7 +73,7 @@
     public Class<?> [] getWrappedClasses() {
         return WRAPPED_CLASSES;
     }
-    
+
     @Override
     protected Class<?> getStaticType() {
         return Node.class;
@@ -78,7 +83,7 @@
     protected Object getWrappedObject() {
         return node;
     }
-    
+
     public Object jsFunction_addNode(String path, String primaryType) throws RepositoryException {
         Node n = null;
         if(primaryType == null || "undefined".equals(primaryType)) {
@@ -118,7 +123,7 @@
             return toScriptableItemMap(null);
         }
     }
-    
+
     public Object jsFunction_getProperties() {
         try {
             return toScriptableItemMap(node.getProperties());
@@ -135,7 +140,7 @@
             return Undefined.instance;
         }
     }
-    
+
     public Object jsFunction_getProperty(String name) throws RepositoryException {
         Object[] args = { node.getProperty(name) };
         return ScriptRuntime.newObject(Context.getCurrentContext(), this,
@@ -253,7 +258,7 @@
             return node.toString();
         }
     }
-    
+
     public Object jsFunction_getParent() {
         try {
             return ScriptRuntime.toObject(this, node.getParent());
@@ -277,7 +282,7 @@
     public boolean jsFunction_getModified() {
         return node.isModified();
     }
-    
+
     public void jsFunction_remove() throws RepositoryException {
         node.remove();
     }
@@ -338,10 +343,10 @@
 
         if (items.size()==0) {
             return getNative(name, start);
-            
+
         } else if (items.size()==1 && !isMulti) {
             return items.iterator().next();
-            
+
         } else {
             NativeArray result = new NativeArray(items.toArray());
             ScriptRuntime.setObjectProtoAndParent(result, this);
@@ -392,34 +397,38 @@
     @SuppressWarnings("unchecked")
     @Override
     public Object getDefaultValue(Class typeHint) {
-        try {
-            return node.getPath();
-        } catch(Exception e) {
-            return null;
-        }
+        return toString();
     }
 
     @Override
     public boolean has(String name, Scriptable start) {
-        try {
-            // TODO should this take into account our jsFunction_ members?
-            return node.hasProperty(name) || node.hasNode(name);
-        } catch (RepositoryException e) {
-            return false;
+        if (node != null) {
+            try {
+                // TODO should this take into account our jsFunction_ members?
+                return node.hasProperty(name) || node.hasNode(name);
+            } catch (RepositoryException e) {
+                // does not matter
+            }
         }
+
+        return false;
     }
 
     public Class<?> jsGet_javascriptWrapperClass() {
         return getClass();
     }
-    
+
     @Override
     public String toString() {
-        try {
-            return node.getPath();
-        } catch (RepositoryException e) {
-            return node.toString();
+        if (node != null) {
+            try {
+                return node.getPath();
+            } catch (RepositoryException e) {
+                return node.toString();
+            }
         }
+
+        return String.valueOf((Object) null);
     }
 
     // ---------- Wrapper interface --------------------------------------------
@@ -428,9 +437,9 @@
     public Object unwrap() {
         return node;
     }
-    
+
     //---------- Helper -------------------------------------------------------
-    
+
     private Object toScriptableItemMap(Iterator<?> iter) {
         Object[] args = (iter != null) ? new Object[] { iter } : null;
         return ScriptRuntime.newObject(Context.getCurrentContext(), this,
diff --git a/src/main/java/org/apache/sling/scripting/javascript/wrapper/ScriptableProperty.java b/src/main/java/org/apache/sling/scripting/javascript/wrapper/ScriptableProperty.java
index ea0caf2..f078692 100644
--- a/src/main/java/org/apache/sling/scripting/javascript/wrapper/ScriptableProperty.java
+++ b/src/main/java/org/apache/sling/scripting/javascript/wrapper/ScriptableProperty.java
@@ -35,6 +35,11 @@
 
     public static final Class<?>[] WRAPPED_CLASSES = { Property.class };
 
+    /**
+     * The wrapped JCR Property instance. Will be {@code null} if the
+     * {@link #jsConstructor(Object)} method is not called, which particularly
+     * is the case for the Property host object prototype.
+     */
     private Property property;
 
     public ScriptableProperty() {
@@ -208,10 +213,10 @@
     public Class<?> jsGet_javascriptWrapperClass() {
         return getClass();
     }
-    
+
     public Object jsFunction_valueOf(String hint) {
         if ("undefined".equals(hint)) {
-            
+
             try {
                 switch (property.getType()) {
                     case PropertyType.BOOLEAN:
@@ -229,15 +234,15 @@
                 // don't care, just return the string value
                 return toString();
             }
-            
+
         } else if ("object".equals(hint)) {
             // return this as a Scriptable :-)
             return this;
-            
+
         } else if ("function".equals(hint)) {
             // cannot return this as a Function
             return Undefined.instance;
-            
+
         } else if ("boolean".equals(hint)) {
             // boolean value
             try {
@@ -245,7 +250,7 @@
             } catch (RepositoryException re) {
                 return false;
             }
-            
+
         } else if ("number".equals(hint)) {
             // numeric value
             try {
@@ -258,7 +263,7 @@
         // unknown hint or "string"
         return toString();
     }
-    
+
     @Override
     public Object get(String name, Scriptable start) {
         final Object fromSuperclass = super.get(name, start);
@@ -269,7 +274,7 @@
         if(property == null) {
             return Undefined.instance;
         }
-        
+
         return getNative(name, start);
     }
 
@@ -279,11 +284,15 @@
 
     @Override
     public String toString() {
-        try {
-            return property.getValue().getString();
-        } catch (RepositoryException e) {
-            return property.toString();
+        if (property != null) {
+            try {
+                return property.getValue().getString();
+            } catch (RepositoryException e) {
+                return property.toString();
+            }
         }
+
+        return String.valueOf((Object) null);
     }
 
     // ---------- Wrapper interface --------------------------------------------
diff --git a/src/main/java/org/apache/sling/scripting/javascript/wrapper/ScriptableResource.java b/src/main/java/org/apache/sling/scripting/javascript/wrapper/ScriptableResource.java
index 0366ab4..0e03df5 100644
--- a/src/main/java/org/apache/sling/scripting/javascript/wrapper/ScriptableResource.java
+++ b/src/main/java/org/apache/sling/scripting/javascript/wrapper/ScriptableResource.java
@@ -240,7 +240,11 @@
     @SuppressWarnings("unchecked")
     @Override
     public Object getDefaultValue(Class typeHint) {
-        return resource.getPath();
+        if (resource != null) {
+            return resource.getPath();
+        }
+
+        return String.valueOf((Object) null);
     }
 
     public void setResource(Resource entry) {
