diff --git a/includes/Drupal/Context/Handler/HandlerHttp.php b/includes/Drupal/Context/Handler/HandlerHttp.php
new file mode 100644
index 0000000..6fde1c3
--- /dev/null
+++ b/includes/Drupal/Context/Handler/HandlerHttp.php
@@ -0,0 +1,127 @@
+<?php
+
+namespace Drupal\Context\Handler;
+
+use \Drupal\Context\ContextInterface;
+use \Symfony\Component\HttpFoundation\Request;
+use \Drupal\Context\Handler;
+
+/**
+ * HTTP Context Handler implementation.
+ */
+class HandlerHttp extends HandlerAbstract {
+
+  /**
+   * Symfony Request object.
+   *
+   * @var \Symfony\Component\HttpFoundation\Request
+   */
+  protected $request = NULL;
+
+  /**
+   * List of stored HTTP properties.
+   *
+   * @var array
+   */
+  static protected $httpProperties = array(
+    'method', 'url', 'accept_types', 'domain', 'request_args', 'query_args',
+    'languages', 'files', 'cookies', 'headers', 'server', 'request_body'
+  );
+
+  public function __construct($params = array()) {
+    // Init Symfony Request.
+    if (isset($params['values'])) {
+      // Set default values.
+      $params['values'] += array(
+        'uri' => 'http://localhost',
+        'method' => 'GET',
+        'parameters' => array(),
+        'cookies' => array(),
+        'files' => array(),
+        'server' => array(),
+        'content' => NULL,
+      );
+
+      $values = $params['values'];
+      $this->request = Request::create($values['uri'], $values['method'], $values['parameters'], $values['cookies'], $values['files'], $values['server'], $values['content']);
+    }
+    else {
+      $this->request = Request::createFromGlobals();
+    }
+  }
+
+  public function getValue(array $args = array(), ContextInterface $context = null) {
+    $property = $args[0];
+
+    // Check whether requested property is known.
+    if (!in_array($property, self::$httpProperties)) {
+      return;
+    }
+
+    // Populate HTTP property if it is not set.
+    if (!isset($this->params[$property])) {
+      switch ($property) {
+        case 'method':
+          $this->params[$property] = $this->request->getMethod();
+          break;
+        case 'url':
+          $this->params[$property] = $this->request->getUri();
+          break;
+        case 'accept_types':
+          $this->params[$property] = $this->request->getAcceptableContentTypes();
+          break;
+        case 'domain':
+          $this->params[$property] = $this->request->getHost();
+          break;
+        case 'request_args':
+          $this->params[$property] = $this->request->request->all();
+          break;
+        case 'query_args':
+          $this->params[$property] = $this->request->query->all();
+          break;
+        case 'languages':
+          $this->params[$property] = $this->request->splitHttpAcceptHeader($this->request->headers->get('Accept-Language'));
+          break;
+        case 'files':
+          $this->params[$property] = $this->request->files->all();
+          break;
+        case 'cookies':
+          $this->params[$property] = $this->request->cookies->all();
+          break;
+        case 'headers':
+          $this->params[$property] = $this->request->headers->all();
+          // Cleanup from not necessary nesting level.
+          foreach ($this->params[$property] as &$item) {
+            if (is_array($item)) {
+              $item = current($item);
+            }
+          }
+          break;
+        case 'server':
+          $this->params[$property] = $this->request->server->all();
+          break;
+        case 'request_body':
+          $this->params[$property] = $this->request->getContent();
+          break;
+      }
+    }
+
+    // We support only two levels of nexting.
+    // Return first level value if it is not array or only first level
+    // requested (second nesting level key does not exist)
+    if (!is_array($this->params[$property]) || !isset($args[1])) {
+      return $this->params[$property];
+    }
+    else {
+      // Return second nesting level value if it exists.
+      if (!empty($args[1]) && isset($this->params[$property][$args[1]])) {
+        return $this->params[$property][$args[1]];
+      }
+      else {
+        // We return empty string if there is no
+        // second argument key in $this->params[$property].
+        return '';
+      }
+    }
+  }
+}
diff --git a/modules/simpletest/tests/context.test b/modules/simpletest/tests/context.test
index c5e3797..6bda880 100644
--- a/modules/simpletest/tests/context.test
+++ b/modules/simpletest/tests/context.test
@@ -425,3 +425,66 @@ class ContextMockTestCase extends ContextTestCases {
     unset($t2, $tutler);
   }
 }
+
+/**
+ * Test class for the HTTP Handler.
+ */
+class ContextHTTPTestCase extends ContextTestCases {
+  public static function getInfo() {
+    return array(
+      'name' => 'Context HTTP Handler',
+      'description' => 'Test the HTTP Handler.',
+      'group' => 'Context',
+    );
+  }
+
+  /**
+   * Get method HTTP property.
+   */
+  function testGetHttpProperty() {
+    $butler = new \Drupal\Context\Context();
+
+    $butler->setHandler('http', '\Drupal\Context\Handler\HandlerHttp');
+    $butler->lock();
+
+    $this->assertEqual($butler->getValue('http:method'), 'POST', t('Correct Http method property found.'));
+
+    // Test headers and server properties.
+    $this->assertEqual($butler->getValue('http:headers:host'), $_SERVER['HTTP_HOST'], t('Host header fetched successfully.'));
+    $this->assertEqual($butler->getValue('http:server:HTTP_USER_AGENT'), $_SERVER['HTTP_USER_AGENT'], t('User agent server variable fetched successfully'));
+  }
+
+  /**
+   * Mock HTTP property.
+   */
+  function testMockHttpProperty() {
+    $butler = new \Drupal\Context\Context();
+
+    $params = array('values' => array('method' => 'PUT'));
+
+    $butler->setHandler('http', '\Drupal\Context\Handler\HandlerHttp', $params);
+    $butler->lock();
+
+    $this->assertEqual($butler->getValue('http:method'), $params['values']['method'], t('Http method property mocked successfully.'));
+  }
+
+  /**
+   * Access array property.
+   */
+  function testArrayHttpProperty() {
+    $butler = new \Drupal\Context\Context();
+
+    // Mock arguments as nested array.
+    $params = array('values' => array('parameters' => array('foo' => array('bar' => 'baz'))));
+
+    $butler->setHandler('http', '\Drupal\Context\Handler\HandlerHttp', $params);
+    $butler->lock();
+
+    // Different nesting level values.
+    $this->assertEqual($butler->getValue('http:query_args'), $params['values']['parameters'], t('Query args fetched successfully.'));
+    $this->assertEqual($butler->getValue('http:query_args:foo'), $params['values']['parameters']['foo'], t('First level value from query_args fetched successfully.'));
+
+    // Non existing value.
+    $this->assertEqual($butler->getValue('http:query_args:baz'), '', t('Non existent value fetched as empty string'));
+  }
+}
