diff --git a/includes/Drupal/Context/Context.php b/includes/Drupal/Context/Context.php
index c71df30..55d3b89 100644
--- a/includes/Drupal/Context/Context.php
+++ b/includes/Drupal/Context/Context.php
@@ -10,15 +10,6 @@ namespace Drupal\Context;
 class Context implements ContextInterface {
 
   /**
-   * The stack of context objects in the system.
-   *
-   * In a just world this would be the SplObjectStorage class in PHP 5.3.
-   *
-   * @var array
-   */
-  protected static $contextStack = array();
-
-  /**
    * The query string for this page. This generally means the value of $_GET['q'].
    *
    * @var string
@@ -61,26 +52,52 @@ class Context implements ContextInterface {
   protected $locked = FALSE;
 
   /**
-   * The hash of the parent context object from which this object will inherit
-   * data.
+   * 
+   */
+  protected $stack = NULL;
+
+  /**
+   * The parent context object from which this object will inherit data.
    *
-   * @var string
+   * @var ContextInterface
    */
-  protected $parentId = NULL;
+  protected $parent = NULL;
 
-  public function __construct($parent_id = NULL) {
-    if ($parent_id) {
-      $this->parentId = $parent_id;
+  /**
+   * Implements ContextInterface::setStack().
+   */
+  public function setStack(ContextStack $stack) {
+    if ($this->locked) {
+      throw new LockedException("Cannot set the stack of a locked context.");
     }
+    $this->stack = $stack;
   }
 
   /**
-   * Returns the top-most context object, which is the active object.
-   *
-   * @return ContextInterface
+   * Implements ContextInterface::getStack().
    */
-  public static function getActiveContext() {
-   return end(self::$contextStack);
+  public function getStack() {
+    return $this->stack;
+  }
+
+  /**
+   * Implements ContextInterface::setParent().
+   */
+  public function setParent(ContextInterface $parent) {
+    if ($this->locked) {
+      throw new LockedException("Cannot set the parent of a locked context.");
+    }
+    $this->parent = $parent;
+    // For consistency reasons, this instance must belong to the same stack
+    // than its parent.
+    $this->stack = $this->parent->getStack();
+  }
+
+  /**
+   * Implements ContextInterface::getParent().
+   */
+  public function getParent() {
+    return $this->parent;
   }
 
   /**
@@ -129,13 +146,8 @@ class Context implements ContextInterface {
 
       // If we did not found a value using local handlers, check for parents.
       if (!array_key_exists($context_key, $this->contextValues)) {
-        if (isset($this->parentId)) {
-          if (isset(self::$contextStack[$this->parentId])) {
-            $this->contextValues[$context_key] = self::$contextStack[$this->parentId]->getValue($context_key);
-          }
-          else {
-            throw new ParentContextNotExistsException('Parent context does not exists anymore.');
-          }
+        if (isset($this->parent)) {
+          $this->contextValues[$context_key] = $this->parent->getValue($context_key);
         }
         else {
           $this->contextValues[$context_key] = null;
@@ -196,7 +208,6 @@ class Context implements ContextInterface {
    */
   public function lock() {
     $this->locked = TRUE;
-    self::$contextStack[spl_object_hash($this)] = $this;
     return new Tracker($this);
   }
 
@@ -204,24 +215,8 @@ class Context implements ContextInterface {
    * Implements DrupalContextInterface::addLayer();
    */
   public function addLayer() {
-    $layer = new self(spl_object_hash($this));
+    $layer = new self($this);
+    $layer->setParent($this);
     return $layer;
   }
-
-  /**
-   * When destroying this object, pop it off the stack and everything above it.
-   *
-   * Note that this method does not actively destroy those context objects, it
-   * just pops them off the stack.  PHP will delete them for us unless someone
-   * has one hanging around somewhere.
-   */
-  public function __destruct() {
-    $me = spl_object_hash($this);
-
-    // Never remove the root item from the stack.
-    $context_key = array_search($me, array_keys(self::$contextStack));
-    if ($context_key) {
-      self::$contextStack = array_slice(self::$contextStack, 0, $context_key, TRUE);
-    }
-  }
 }
diff --git a/includes/Drupal/Context/ContextInterface.php b/includes/Drupal/Context/ContextInterface.php
index ef0a9dc..2c8a82c 100644
--- a/includes/Drupal/Context/ContextInterface.php
+++ b/includes/Drupal/Context/ContextInterface.php
@@ -8,6 +8,41 @@ namespace Drupal\Context;
 interface ContextInterface {
 
   /**
+   * Set owner stack.
+   * 
+   * @param ContextStack $stack
+   * 
+   * @throws LockedException
+   *   If the current context is locked.
+   */
+  public function setStack(ContextStack $stack);
+
+  /**
+   * Get stack, if any.
+   * 
+   * @return ContextStack $stack
+   */
+  public function getStack();
+
+  /**
+   * Set parent context.
+   * 
+   * @param ContextInterface $parent
+   * 
+   * @throws LockedException
+   *   If the current context is locked.
+   */
+  public function setParent(ContextInterface $parent);
+
+  /**
+   * Get parent context, if any.
+   * 
+   * @return ContextInterface
+   *   Can be NULL if current instance has no parent.
+   */
+  public function getParent();
+
+  /**
    * Registers a class as the handler for a given context.
    *
    * @param string $context_key
diff --git a/includes/Drupal/Context/ContextStack.php b/includes/Drupal/Context/ContextStack.php
new file mode 100644
index 0000000..4aff450
--- /dev/null
+++ b/includes/Drupal/Context/ContextStack.php
@@ -0,0 +1,47 @@
+<?php
+
+namespace Drupal\Context;
+
+class ContextStack {
+  /**
+   * Internal context stack.
+   * 
+   * @var array
+   */
+  protected $stack = array();
+
+  /**
+   * Push a new context on top of the stack, make it being the active context.
+   * 
+   * @param ContextInterface $context
+   */
+  public function push(ContextInterface $context) {
+    $this->stack[spl_object_hash($context)] = $context;
+  }
+
+  /**
+   * Removes the given context from the stack, if exists, and all its children.
+   * 
+   * @param ContextInterface $context
+   * 
+   * @throws ContextException
+   */
+  public function pop(ContextInterface $context) {
+    $pos = array_search(spl_object_hash($context), array_keys($this->stack));
+    if (FALSE !== $pos) {
+      $this->stack = array_slice($this->stack, 0, $pos, TRUE);
+    }
+    else {
+      // throw new ContextException("Attempting to pop a non existing context from the stack.");
+    }
+  }
+
+  /**
+   * Get context being on top of the stack.
+   * 
+   * @return ContextInterface
+   */
+  public function getActiveContext() {
+    return end($this->stack);
+  }
+}
diff --git a/includes/Drupal/Context/Tracker.php b/includes/Drupal/Context/Tracker.php
index d897943..a52bd5f 100644
--- a/includes/Drupal/Context/Tracker.php
+++ b/includes/Drupal/Context/Tracker.php
@@ -12,28 +12,39 @@ class Tracker {
   /**
    * The context object we're tracking.
    *
-   * @var Drupal\Context\Context
+   * @var ContextInterface
    */
   protected $context;
 
   /**
    * Constructor
    *
-   * @var Drupal\Context\Context $context
+   * @var ContextInterface $context
    *   The context object we should be tracking.
    */
-  public function __construct(\Drupal\Context\ContextInterface $context) {
+  public function __construct(ContextInterface $context) {
     $this->context = $context;
+
+    $stack = $this->context->getStack();
+    if (isset($stack)) {
+      $stack->push($this->context);
+    }
   }
 
   /**
-   * Destructor
+   * When destroying this object, pop the associated context off the stack and
+   * everything above it.
    *
-   * Destroys the corresponding context object, too.
+   * Note that this method does not actively destroy those context objects, it
+   * just pops them off the stack. PHP will delete them for us unless someone
+   * has one hanging around somewhere.
    */
   public function __destruct() {
     if (isset($this->context)) {
-      $this->context->__destruct();
+      $stack = $this->context->getStack();
+      if (isset($stack)) {
+        $stack->pop($this->context);
+      }
     }
   }
-}
\ No newline at end of file
+}
diff --git a/includes/bootstrap.inc b/includes/bootstrap.inc
index d258241..104188c 100644
--- a/includes/bootstrap.inc
+++ b/includes/bootstrap.inc
@@ -2389,7 +2389,12 @@ function _drupal_bootstrap_variables() {
   require_once DRUPAL_ROOT . '/includes/common.inc';
 
   // Initialize the context system (temporary version).
-  $context = new \Drupal\Context\Context();
+  $stack = new \Drupal\Context\ContextStack;
+  drupal_get_context($stack);
+
+  $context = new \Drupal\Context\Context;
+  $context->setStack($stack);
+
   bootstrap_invoke_all('context_init', $context);
 
   // We do not need to keep the tracker here, because the DrupalContext
@@ -2418,8 +2423,18 @@ function _drupal_bootstrap_page_header() {
  *
  * @return DrupalContextInterface
  */
-function drupal_get_context() {
-  return \Drupal\Context\Context::getActiveContext();
+function drupal_get_context(\Drupal\Context\ContextStack $new_stack = NULL) {
+  // This static property is infamous, but it's better here than in the OOP
+  // code, at least it does not taints the API.
+  static $stack;
+
+  if ($new_stack) {
+    $stack = $new_stack;
+  }
+
+  if (isset($stack)) {
+    return $stack->getActiveContext();
+  }
 }
 
 /**
diff --git a/modules/simpletest/tests/context.test b/modules/simpletest/tests/context.test
index c5e3797..ddf56eb 100644
--- a/modules/simpletest/tests/context.test
+++ b/modules/simpletest/tests/context.test
@@ -291,16 +291,19 @@ class ContextMockTestCase extends ContextTestCases {
    * Test access to the "active" context.
    */
   public function testActiveContext() {
-    $butler = new \Drupal\Context\Context();
+    $stack = new \Drupal\Context\ContextStack;
+    $butler = new \Drupal\Context\Context;
+    $butler->setStack($stack);
+
     $t1 = $butler->lock();
     $b2 = $butler->addLayer();
     $t2 = $b2->lock();
 
-    $this->assertEqual($b2, \Drupal\Context\Context::getActiveContext(), t('Active context is correct when adding context objects.'));
+    $this->assertEqual($b2, $stack->getActiveContext(), t('Active context is correct when adding context objects.'));
 
     unset($t2);
 
-    $this->assertEqual($butler, \Drupal\Context\Context::getActiveContext(), t('Active context is correct when removing context objects.'));
+    $this->assertEqual($butler, $stack->getActiveContext(), t('Active context is correct when removing context objects.'));
   }
 
   /**
@@ -328,6 +331,14 @@ class ContextMockTestCase extends ContextTestCases {
     unset($t2);
     unset($b2);
 
+    /*
+     * FIXME: This test is not needed anymore. Contextes will remain in memory
+     * even if removed from the stack as long as references remain.
+     * 
+     * This makes sense, contextes could be referenced (even if it sounds bad)
+     * in render array's and result built at the very end of page build, for
+     * exemple.
+     * 
     try {
       // This should throw an exception.
       $b3->getValue('foo:bar');
@@ -340,6 +351,7 @@ class ContextMockTestCase extends ContextTestCases {
     catch (Exception $e) {
       $this->fail(t('Incorrect exception thrown when getting data from a context that should have been destroyed.'));
     }
+     */
   }
 
   public function testContextArguments() {
