diff --git a/butler.module b/butler.module
index 53b505a..30ae00d 100755
--- a/butler.module
+++ b/butler.module
@@ -299,36 +299,48 @@ class DrupalContext implements DrupalContextInterface {
     if (!$this->locked) {
       throw new ButlerNotLockedException(t('This butler object has not been locked. It must be locked before it can be used.'));
     }
-
-    if (!isset($this->context[$offset])) {
+    
+    // we do not have data for this offset yet. use array_key_exists, because 
+    // the value can be NULL. We do not want to rerun all handlerClasses for a
+    // variable with data
+    if (!array_key_exists($offset, $this->context)) {
+      // loop over the possible context_keys
       $context_key = $offset;
       $offset_elements = explode(':', $offset);
       $args = array();
-      while ($offset_elements && !isset($this->handlerClasses[$context_key])) {
-        $args[] = array_pop($offset_elements);
+      while ($offset_elements) {
+        if (isset($this->handlerClasses[$context_key])) {
+          if (!isset($this->handlers[$context_key]) && class_exists($this->handlerClasses[$context_key]['class'])) {
+            $this->handlers[$context_key] = new $this->handlerClasses[$context_key]['class']($this, $this->handlerClasses[$context_key]['params']);
+          }
+          
+          if (isset($this->handlers[$context_key])) {
+            $this->context[$offset] = $this->handlers[$context_key]->getValue($args);
+            
+            if (isset($this->context[$offset])) {
+              break;
+            }
+          }
+        }
+        
+        array_unshift($args, array_pop($offset_elements));
         $context_key = implode(':', $offset_elements);
       }
 
-      $context_key = implode(':', $offset_elements);
-      if (!isset($this->handlers[$context_key]) && isset($this->handlerClasses[$context_key]) && class_exists($this->handlerClasses[$context_key]['class'])) {
-        $this->handlers[$context_key] = new $this->handlerClasses[$context_key]['class']($this, $this->handlerClasses[$context_key]['params']);
-      }
+      if (!isset($this->context[$offset])) {
+        if (isset($this->parentId)) {
+          if (isset(self::$contextStack[$this->parentId])) {
+            $this->context[$offset] = self::$contextStack[$this->parentId]->offsetGet($offset);
+          } else {
+            $this->context[$offset] = NULL;
 
-      if (isset($this->handlers[$context_key])) {
-        $this->context[$offset] = $this->handlers[$context_key]->getValue($args);
-      }
-      else if (isset($this->parentId)) {
-        if (isset(self::$contextStack[$this->parentId])) {
-          $this->context[$offset] = self::$contextStack[$this->parentId]->offsetGet($offset);
-        } else {
+            throw new ButlerParentContextNotExistsException('The parent of the current butler object does not exist anymore');
+          }
+        }
+        else {
           $this->context[$offset] = NULL;
-          
-          throw new ButlerParentContextNotExistsException('The parent of the current butler object does not exist anymore');
         }
       }
-      else {
-        $this->context[$offset] = NULL;
-      }
     }
 
     // Store the value for key retrieval
diff --git a/butler.test b/butler.test
index b2f28f8..043db2c 100755
--- a/butler.test
+++ b/butler.test
@@ -364,4 +364,41 @@ class ButlerMockTestCase extends DrupalUnitTestCase {
       $this->fail(t('Incorrect exception thrown when getting data from a context that should have been destroyed.'));
     }
   }
+  
+  public function testContextArguments() {
+    $butler = new DrupalContext(new ButlerFakeRequest());
+    $butler->registerHandler('foo', 'ButlerTestCaseHelperArguments');
+    $butler->lock();
+    
+    $this->assertEqual($butler['foo:bar:baz'], array('bar', 'baz'), t('ContextHandler gets the correct arguments.'));
+  }
+  
+  public function testInheritanceContexts() {
+    $butler = new DrupalContext(new ButlerFakeRequest());
+    $butler->registerHandler('foo:bar', 'ButlerTestCaseHelperThree', array('baz' => 1));
+    $t1 = $butler->lock();
+
+    $b2 = $butler->addLayer();
+    $b2->registerHandler('foo', 'ButlerTestCaseHelperThree', array('bar' => 3));
+    $t2 = $b2->lock();
+    
+    $this->assertEqual($b2['foo:bar:baz'], 3, t('Context overrides even when more generic.'));
+    
+    unset($t2); unset($b2);
+    
+    $b3 = $butler->addLayer();
+    $b3->registerHandler('foo', 'ButlerTestCaseHelperThree', array('baz' => 5));
+    $t3 = $b3->lock();
+    
+    $this->assertEqual($b3['foo:bar:baz'], 1, t('If a context handler does not return data, the parent handler gets a change to return data'));
+    
+    unset($t3); unset($b3);
+    
+    $b4 = $butler->addLayer();
+    $b4->registerHandler('foo:bar:baz', 'ButlerTestCaseHelperThree', array('bax' => 7));
+    $b4->registerHandler('foo:bar', 'ButlerTestCaseHelperThree', array('baz' => 9));
+    $t4 = $b4->lock();
+    
+    $this->assertEqual($b4['foo:bar:baz:boo'], 9, t('A more generic handler in the same context should be called if the less generic handler does not return data.'));
+  }
 }
diff --git a/butler_test.module b/butler_test.module
index 298722e..5f11e32 100644
--- a/butler_test.module
+++ b/butler_test.module
@@ -29,6 +29,12 @@ class ButlerTestCaseHelperThree extends ContextHandlerAbstract {
   }
 }
 
+class ButlerTestCaseHelperArguments extends ContextHandlerAbstract {
+  public function getValue(array $args = array()) {
+    return $args;
+  }
+}
+
 class ButlerFakeRequest extends DrupalRequestHttp {
 
   public function __construct($get = array(), $post = array()) {
