diff --git a/main/java/org/apache/sling/scripting/resolver/internal/BundledScriptContext.java b/main/java/org/apache/sling/scripting/resolver/internal/BundledScriptContext.java
index bc83af8..ac1184d 100644
--- a/main/java/org/apache/sling/scripting/resolver/internal/BundledScriptContext.java
+++ b/main/java/org/apache/sling/scripting/resolver/internal/BundledScriptContext.java
@@ -32,22 +32,26 @@
 
     private static final Integer[] SCOPES = {SlingScriptConstants.SLING_SCOPE, GLOBAL_SCOPE, ENGINE_SCOPE};
 
-    private Bindings globalScope;
-    private Bindings engineScope;
-
+    private Bindings globalScope = new SimpleBindings();
+    private Bindings engineScope = new SimpleBindings();
     private Bindings slingScope = new SimpleBindings();
 
     @Override
     public void setBindings(final Bindings bindings, final int scope) {
+        if (bindings == null) {
+            throw new NullPointerException("None of the ScriptContext scopes accepts null bindings.");
+        }
         switch (scope) {
-            case SlingScriptConstants.SLING_SCOPE : this.slingScope = bindings;
+            case SlingScriptConstants.SLING_SCOPE :
+                this.slingScope = bindings;
                 break;
-            case 100: if (bindings == null) throw new NullPointerException("Bindings for ENGINE scope is null");
+            case 100:
                 this.engineScope = bindings;
                 break;
-            case 200: this.globalScope = bindings;
+            case 200:
+                this.globalScope = bindings;
                 break;
-            default: throw new IllegalArgumentException("Invalid scope");
+            default: throw new IllegalArgumentException("Invalid scope.");
         }
     }
 
@@ -58,12 +62,12 @@
             case 100: return this.engineScope;
             case 200: return this.globalScope;
         }
-        throw new IllegalArgumentException("Invalid scope");
+        throw new IllegalArgumentException("Invalid scope.");
     }
 
     @Override
     public void setAttribute(final String name, final Object value, final int scope) {
-        if (name == null) throw new IllegalArgumentException("Name is null");
+        if (name == null) throw new IllegalArgumentException("Name is null.");
         final Bindings bindings = getBindings(scope);
         if (bindings != null) {
             bindings.put(name, value);
@@ -71,26 +75,6 @@
     }
 
     @Override
-    public Object getAttribute(final String name, final int scope) {
-        if (name == null) throw new IllegalArgumentException("Name is null");
-        final Bindings bindings = getBindings(scope);
-        if (bindings != null) {
-            return bindings.get(name);
-        }
-        return null;
-    }
-
-    @Override
-    public Object removeAttribute(final String name, final int scope) {
-        if (name == null) throw new IllegalArgumentException("Name is null");
-        final Bindings bindings = getBindings(scope);
-        if (bindings != null) {
-            return bindings.remove(name);
-        }
-        return null;
-    }
-
-    @Override
     public Object getAttribute(String name) {
         if (name == null) throw new IllegalArgumentException("Name is null");
         for (final int scope : SCOPES) {
@@ -106,8 +90,28 @@
     }
 
     @Override
+    public Object getAttribute(final String name, final int scope) {
+        if (name == null) throw new IllegalArgumentException("Name is null.");
+        final Bindings bindings = getBindings(scope);
+        if (bindings != null) {
+            return bindings.get(name);
+        }
+        return null;
+    }
+
+    @Override
+    public Object removeAttribute(final String name, final int scope) {
+        if (name == null) throw new IllegalArgumentException("Name is null.");
+        final Bindings bindings = getBindings(scope);
+        if (bindings != null) {
+            return bindings.remove(name);
+        }
+        return null;
+    }
+
+    @Override
     public int getAttributesScope(String name) {
-        if (name == null) throw new IllegalArgumentException("Name is null");
+        if (name == null) throw new IllegalArgumentException("Name is null.");
         for (final int scope : SCOPES) {
             if ((getBindings(scope) != null) && (getBindings(scope).containsKey(name))) {
                 return scope;
diff --git a/test/java/org/apache/sling/scripting/resolver/internal/BundledScriptContextTest.java b/test/java/org/apache/sling/scripting/resolver/internal/BundledScriptContextTest.java
new file mode 100644
index 0000000..04ebdef
--- /dev/null
+++ b/test/java/org/apache/sling/scripting/resolver/internal/BundledScriptContextTest.java
@@ -0,0 +1,151 @@
+/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ ~ 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.sling.scripting.resolver.internal;
+
+import javax.script.Bindings;
+import javax.script.ScriptContext;
+import javax.script.SimpleBindings;
+
+import org.apache.sling.api.scripting.SlingScriptConstants;
+import org.junit.Test;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertTrue;
+
+public class BundledScriptContextTest {
+
+    @Test
+    public void testSetAndGetBindings() {
+        BundledScriptContext bundledScriptContext = new BundledScriptContext();
+        Bindings engineScope = new SimpleBindings();
+        Bindings globalScope = new SimpleBindings();
+        Bindings slingScope = new SimpleBindings();
+
+        bundledScriptContext.setBindings(slingScope, SlingScriptConstants.SLING_SCOPE);
+        bundledScriptContext.setBindings(globalScope, ScriptContext.GLOBAL_SCOPE);
+        bundledScriptContext.setBindings(engineScope, ScriptContext.ENGINE_SCOPE);
+
+        assertEquals(engineScope, bundledScriptContext.getBindings(ScriptContext.ENGINE_SCOPE));
+        assertEquals(globalScope, bundledScriptContext.getBindings(ScriptContext.GLOBAL_SCOPE));
+        assertEquals(slingScope, bundledScriptContext.getBindings(SlingScriptConstants.SLING_SCOPE));
+
+        boolean invalidScopeThrowsException;
+        try {
+            bundledScriptContext.getBindings(Integer.MIN_VALUE);
+            invalidScopeThrowsException = false;
+        } catch (Exception e) {
+            invalidScopeThrowsException = true;
+        }
+        assertTrue(BundledScriptContext.class.getName() + " should throw exceptions for invalid scopes.", invalidScopeThrowsException);
+
+        boolean acceptsAnyScope;
+        try {
+            bundledScriptContext.setBindings(new SimpleBindings(), Integer.MIN_VALUE);
+            acceptsAnyScope = true;
+        } catch (Exception e) {
+            acceptsAnyScope = false;
+        }
+        assertFalse(BundledScriptContext.class.getName() + " should not accept bindings for arbitrary scopes.", acceptsAnyScope);
+
+        boolean acceptsNullBindings;
+        try {
+            bundledScriptContext.setBindings(null, ScriptContext.ENGINE_SCOPE);
+            acceptsNullBindings = true;
+        } catch (Exception e) {
+            acceptsNullBindings = false;
+        }
+        assertFalse(BundledScriptContext.class.getName() + " should not accept null bindings.", acceptsNullBindings);
+    }
+
+    @Test
+    public void testSetAndGetAttribute() {
+        BundledScriptContext bundledScriptContext = new BundledScriptContext();
+        boolean acceptsSettingNullAttributeNames;
+        try {
+            bundledScriptContext.setAttribute(null, 0, ScriptContext.ENGINE_SCOPE);
+            acceptsSettingNullAttributeNames = true;
+        } catch (Exception e) {
+            acceptsSettingNullAttributeNames = false;
+        }
+        assertFalse(BundledScriptContext.class.getName() + " should not accept null attribute names.", acceptsSettingNullAttributeNames);
+
+        boolean acceptsRetrievingNullAttributeNamesFromScope;
+        try {
+            bundledScriptContext.getAttribute(null, ScriptContext.ENGINE_SCOPE);
+            acceptsRetrievingNullAttributeNamesFromScope = true;
+        } catch (Exception e) {
+            acceptsRetrievingNullAttributeNamesFromScope = false;
+        }
+        assertFalse(BundledScriptContext.class.getName() + " should not accept null attribute names.", acceptsRetrievingNullAttributeNamesFromScope);
+
+        boolean acceptsRetrievingNullAttributeNames;
+        try {
+            bundledScriptContext.getAttribute(null);
+            acceptsRetrievingNullAttributeNames = true;
+        } catch (Exception e) {
+            acceptsRetrievingNullAttributeNames = false;
+        }
+        assertFalse(BundledScriptContext.class.getName() + " should not accept null attribute names.", acceptsRetrievingNullAttributeNames);
+
+        bundledScriptContext.setAttribute("nothing", 0, ScriptContext.ENGINE_SCOPE);
+        assertEquals(0, bundledScriptContext.getAttribute("nothing"));
+        assertEquals(0, bundledScriptContext.getAttribute("nothing", ScriptContext.ENGINE_SCOPE));
+        assertNull(bundledScriptContext.getAttribute("nothing", ScriptContext.GLOBAL_SCOPE));
+    }
+
+    @Test
+    public void testRemoveAttribute() {
+        BundledScriptContext bundledScriptContext = new BundledScriptContext();
+        boolean acceptsNullAttributeNames;
+        try {
+            bundledScriptContext.removeAttribute(null, ScriptContext.ENGINE_SCOPE);
+            acceptsNullAttributeNames = true;
+        } catch (Exception e) {
+            acceptsNullAttributeNames = false;
+        }
+        assertFalse(BundledScriptContext.class.getName() + " should not accept null attribute names.", acceptsNullAttributeNames);
+
+        bundledScriptContext.setAttribute("nothing", 0, ScriptContext.ENGINE_SCOPE);
+        assertEquals(0, bundledScriptContext.removeAttribute("nothing", ScriptContext.ENGINE_SCOPE));
+        Bindings engineScope = bundledScriptContext.getBindings(ScriptContext.ENGINE_SCOPE);
+        assertTrue( engineScope != null && engineScope.size() == 0);
+        assertNull(bundledScriptContext.removeAttribute("nothing", ScriptContext.ENGINE_SCOPE));
+        assertNull(bundledScriptContext.removeAttribute("nothing", ScriptContext.GLOBAL_SCOPE));
+    }
+
+    @Test
+    public void testGetAttributesScope() {
+        BundledScriptContext bundledScriptContext = new BundledScriptContext();
+        boolean acceptsNullAttributeNames;
+        try {
+            bundledScriptContext.getAttributesScope(null);
+            acceptsNullAttributeNames = true;
+        } catch (Exception e) {
+            acceptsNullAttributeNames = false;
+        }
+        assertFalse(BundledScriptContext.class.getName() + " should not accept null attribute names.", acceptsNullAttributeNames);
+
+        bundledScriptContext.setAttribute("nothing", 0, SlingScriptConstants.SLING_SCOPE);
+        assertEquals(SlingScriptConstants.SLING_SCOPE, bundledScriptContext.getAttributesScope("nothing"));
+        assertEquals(-1, bundledScriptContext.getAttributesScope("nothing here"));
+    }
+
+}
