diff --git a/src/Lunr/Vortex/GCM/GCMResponse.php b/src/Lunr/Vortex/GCM/GCMResponse.php
new file mode 100644
index 0000000000000000000000000000000000000000..ce4f354d0c6277a6a13f5506529ce358000d710b
--- /dev/null
+++ b/src/Lunr/Vortex/GCM/GCMResponse.php
@@ -0,0 +1,168 @@
+<?php
+
+/**
+ * This file contains an abstraction for the response from the GCM server.
+ *
+ * PHP Version 5.4
+ *
+ * @category   Response
+ * @package    Vortex
+ * @subpackage GCM
+ * @author     Dinos Theodorou <dinos@m2mobi.com>
+ * @copyright  2013, M2Mobi BV, Amsterdam, The Netherlands
+ * @license    http://lunr.nl/LICENSE MIT License
+ */
+
+namespace Lunr\Vortex\GCM;
+
+use Lunr\Vortex\PushNotificationStatus;
+
+/**
+ * Google Cloud Messaging Push Notification response wrapper.
+ *
+ * @category   Response
+ * @package    Vortex
+ * @subpackage GCM
+ * @author     Dinos Theodorou <dinos@m2mobi.com>
+ */
+class GCMResponse
+{
+
+    /**
+     * GCM Response multicast ID
+     * @var Integer
+     */
+    private $multicast_id;
+
+    /**
+     * HTTP status code.
+     * @var Integer
+     */
+    private $http_code;
+
+    /**
+     * Delivery status.
+     * @var Integer
+     */
+    private $status;
+
+    /**
+     * Constructor.
+     *
+     * @param CurlResponse    $response Curl Response object.
+     * @param LoggerInterface $logger   Shared instance of a Logger.
+     */
+    public function __construct($response, $logger)
+    {
+        $this->http_code = $response->http_code;
+
+        if ($response->get_network_error_number() !== 0)
+        {
+            $this->status = PushNotificationStatus::ERROR;
+
+            $context = [ 'error' => $response->get_network_error_message(), 'endpoint' => $response->url ];
+            $logger->error('Dispatching push notification to {endpoint} failed: {error}', $context);
+        }
+        else
+        {
+            $this->parse_headers($response->get_result(), $response->header_size);
+            $this->set_status($response->url, $logger);
+        }
+    }
+
+    /**
+     * Destructor.
+     */
+    public function __destruct()
+    {
+        unset($this->multicast_id);
+        unset($this->http_code);
+        unset($this->status);
+    }
+
+    /**
+     * Parse response header information for the multicast ID.
+     *
+     * @param String  $result      Response result
+     * @param Integer $header_size Size of the header
+     *
+     * @return void
+     */
+    private function parse_headers($result, $header_size)
+    {
+        $headers = json_decode($result, TRUE);
+
+        if(isset($headers['multicast_id']) && !empty($headers['multicast_id']))
+        {
+            $this->multicast_id = $headers['multicast_id'];
+        }
+    }
+
+    /**
+     * Set notification status information.
+     *
+     * @param String          $endpoint The notification endpoint that was used.
+     * @param LoggerInterface $logger   Shared instance of a Logger.
+     *
+     * @return void
+     */
+    private function set_status($endpoint, $logger)
+    {
+        switch ($this->http_code)
+        {
+            case 200:
+                $this->status = PushNotificationStatus::SUCCESS;
+                break;
+            case 400:
+                $this->status = PushNotificationStatus::INVALID_INPUT;
+                break;
+            case 401:
+                $this->status = PushNotificationStatus::INVALID_ENDPOINT;
+                break;
+            case 503:
+                $this->status = PushNotificationStatus::ERROR;
+                break;
+            default:
+                $this->status = PushNotificationStatus::UNKNOWN;
+                break;
+        }
+
+        if ($this->status !== PushNotificationStatus::SUCCESS)
+        {
+            $context = [
+                'endpoint' => $endpoint,
+                'status' => $this->status
+            ];
+
+            $message  = 'Push notification delivery status for endpoint {endpoint}: ';
+            $message .= 'failed with and error code: {status}';
+
+            $logger->warning($message, $context);
+        }
+    }
+
+    /**
+     * Get notification delivery status.
+     *
+     * @return PushNotificationStatus $status Delivery status
+     */
+    public function get_status()
+    {
+        return $this->status;
+    }
+
+    /**
+     * Get the GCM response multicast ID.
+     *
+     * Unique ID identifying the multicast message.
+     *
+     * @return Integer The response multicast ID
+     */
+    public function get_multicast_id()
+    {
+        return $this->multicast_id;
+    }
+
+}
+
+?>
diff --git a/src/Lunr/Vortex/GCM/Tests/GCMResponseErrorTest.php b/src/Lunr/Vortex/GCM/Tests/GCMResponseErrorTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..8518edd0aec77b33313877c93cb2b9761ecb58b4
--- /dev/null
+++ b/src/Lunr/Vortex/GCM/Tests/GCMResponseErrorTest.php
@@ -0,0 +1,68 @@
+<?php
+
+/**
+ * This file contains the GCMResponseErrorTest class.
+ *
+ * PHP Version 5.4
+ *
+ * @category   Tests
+ * @package    Vortex
+ * @subpackage GCM
+ * @author     Dinos Theodorou <dinos@m2mobi.com>
+ * @copyright  2013, M2Mobi BV, Amsterdam, The Netherlands
+ * @license    http://lunr.nl/LICENSE MIT License
+ */
+
+namespace Lunr\Vortex\GCM\Tests;
+
+use Lunr\Vortex\PushNotificationStatus;
+
+/**
+ * This class contains tests for failed GCM dispatches.
+ *
+ * @category   Tests
+ * @package    Vortex
+ * @subpackage GCM
+ * @author     Dinos Theodorou <dinos@m2mobi.com>
+ * @covers     Lunr\Vortex\GCM\GCMResponse
+ */
+class GCMResponseErrorTest extends GCMResponseTest
+{
+
+    /**
+     * Testcase Constructor.
+     */
+    public function setUp()
+    {
+        parent::setUpError();
+    }
+
+    /**
+     * Test that the status is set as error.
+     */
+    public function testStatusIsError()
+    {
+        $this->assertEquals(PushNotificationStatus::ERROR, $this->get_reflection_property_value('status'));
+    }
+
+    /**
+     * Test that the http code is set from the Response object.
+     */
+    public function testHttpCodeIsSetCorrectly()
+    {
+        $this->assertEquals(503, $this->get_reflection_property_value('http_code'));
+    }
+
+    /**
+     * Test that get_status() returns the dispatch status.
+     *
+     * @covers Lunr\Vortex\GCM\GCMResponse::get_status
+     */
+    public function testGetStatusReturnsStatus()
+    {
+        $this->assertEquals(PushNotificationStatus::ERROR, $this->class->get_status());
+    }
+
+}
+
+?>
diff --git a/src/Lunr/Vortex/GCM/Tests/GCMResponseSetTest.php b/src/Lunr/Vortex/GCM/Tests/GCMResponseSetTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..4ffbc7eb479d4d4d73b8764719ded67827ae976f
--- /dev/null
+++ b/src/Lunr/Vortex/GCM/Tests/GCMResponseSetTest.php
@@ -0,0 +1,109 @@
+<?php
+
+/**
+ * This file contains the GCMResponseSetTest class.
+ *
+ * PHP Version 5.4
+ *
+ * @category   Tests
+ * @package    Vortex
+ * @subpackage GCM
+ * @author     Dinos Theodorou <dinos@m2mobi.com>
+ * @copyright  2013, M2Mobi BV, Amsterdam, The Netherlands
+ * @license    http://lunr.nl/LICENSE MIT License
+ */
+
+namespace Lunr\Vortex\GCM\Tests;
+
+use Lunr\Vortex\PushNotificationStatus;
+
+/**
+ * This class contains tests for setting meta information about GCM dispatches.
+ *
+ * @category   Tests
+ * @package    Vortex
+ * @subpackage GCM
+ * @author     Dinos Theodorou <dinos@m2mobi.com>
+ * @covers     Lunr\Vortex\GCM\GCMResponse
+ */
+class GCMResponseSetTest extends GCMResponseTest
+{
+
+    /**
+     * Testcase Constructor.
+     */
+    public function setUp()
+    {
+        parent::setUpSuccess();
+    }
+
+    /**
+     * Test setting the multicast id.
+     *
+     * @covers Lunr\Vortex\GCM\GCMResponse::parse_headers
+     */
+    public function testParseHeadersSetsMulticastId()
+    {
+        $result = file_get_contents(TEST_STATICS . '/vortex/gcm_response.txt');
+
+        $this->set_reflection_property_value('http_code', 200);
+
+        $method = $this->get_accessible_reflection_method('parse_headers');
+        $method->invokeArgs($this->class, [$result, 176]);
+
+        $this->assertPropertyEquals('multicast_id', 108);
+    }
+
+    /**
+     * Test setting the status for a successful request.
+     *
+     * @covers Lunr\Vortex\GCM\GCMResponse::set_status
+     */
+    public function testStatusForSuccessRequestStatus()
+    {
+        $method = $this->get_accessible_reflection_method('set_status');
+        $method->invokeArgs($this->class, ['URL', $this->logger]);
+
+        $this->logger->expects($this->never())
+                     ->method('warning');
+
+        $this->assertEquals(PushNotificationStatus::SUCCESS, $this->get_reflection_property_value('status'));
+    }
+
+    /**
+     * Test setting the status for a failed request.
+     *
+     * @param Integer $code     Status code
+     * @param Integer $expected Expected push notification status
+     *
+     * @dataProvider failedRequestProvider
+     * @covers       Lunr\Vortex\GCM\GCMResponse::set_status
+     */
+    public function testSetStatusForNonSuccessRequestStatus($code, $expected)
+    {
+        $this->set_reflection_property_value('http_code', $code);
+
+        $context = [
+            'endpoint' => 'URL',
+            'status' => $expected
+        ];
+
+        $message  = 'Push notification delivery status for endpoint {endpoint}: ';
+        $message .= 'failed with and error code: {status}';
+
+        $this->logger->expects($this->once())
+                     ->method('warning')
+                     ->with(
+                         $this->equalTo($message),
+                         $this->equalTo($context)
+                     );
+
+        $method = $this->get_accessible_reflection_method('set_status');
+        $method->invokeArgs($this->class, ['URL', $this->logger]);
+
+        $this->assertEquals($expected, $this->get_reflection_property_value('status'));
+    }
+
+}
+
+?>
diff --git a/src/Lunr/Vortex/GCM/Tests/GCMResponseSuccessTest.php b/src/Lunr/Vortex/GCM/Tests/GCMResponseSuccessTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..8c18c5ac9a0668548fd0c10b4a5a55d3eaf05793
--- /dev/null
+++ b/src/Lunr/Vortex/GCM/Tests/GCMResponseSuccessTest.php
@@ -0,0 +1,68 @@
+<?php
+
+/**
+ * This file contains the GCMResponseSuccessTest class.
+ *
+ * PHP Version 5.4
+ *
+ * @category   Tests
+ * @package    Vortex
+ * @subpackage GCM
+ * @author     Dinos Theodorou <dinos@m2mobi.com>
+ * @copyright  2013, M2Mobi BV, Amsterdam, The Netherlands
+ * @license    http://lunr.nl/LICENSE MIT License
+ */
+
+namespace Lunr\Vortex\GCM\Tests;
+
+use Lunr\Vortex\PushNotificationStatus;
+
+/**
+ * This class contains tests for successful GCM dispatches.
+ *
+ * @category   Tests
+ * @package    Vortex
+ * @subpackage GCM
+ * @author     Dinos Theodorou <dinos@m2mobi.com>
+ * @covers     Lunr\Vortex\GCM\GCMResponse
+ */
+class GCMResponseSuccessTest extends GCMResponseTest
+{
+
+    /**
+     * Testcase Constructor.
+     */
+    public function setUp()
+    {
+        parent::setUpSuccess();
+    }
+
+    /**
+     * Test that the status is set as error.
+     */
+    public function testStatusIsError()
+    {
+        $this->assertEquals(PushNotificationStatus::SUCCESS, $this->get_reflection_property_value('status'));
+    }
+
+    /**
+     * Test that the http code is set from the Response object.
+     */
+    public function testHttpCodeIsSetCorrectly()
+    {
+        $this->assertEquals(200, $this->get_reflection_property_value('http_code'));
+    }
+
+    /**
+     * Test that get_multicast_id() returns the response multicast Id.
+     *
+     * @covers Lunr\Vortex\GCM\GCMResponse::get_multicast_id
+     */
+    public function testGetMulticastIdReturnsMulticastId()
+    {
+        $this->assertPropertyEquals('multicast_id', $this->class->get_multicast_id());
+    }
+
+}
+
+?>
diff --git a/src/Lunr/Vortex/GCM/Tests/GCMResponseTest.php b/src/Lunr/Vortex/GCM/Tests/GCMResponseTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..633eef58688d247c4ea63be4eb3f9fe979d0303b
--- /dev/null
+++ b/src/Lunr/Vortex/GCM/Tests/GCMResponseTest.php
@@ -0,0 +1,153 @@
+<?php
+
+/**
+ * This file contains the GCMResponseTest class.
+ *
+ * PHP Version 5.4
+ *
+ * @category   Tests
+ * @package    Vortex
+ * @subpackage GCM
+ * @author     Dinos Theodorou <dinos@m2mobi.com>
+ * @copyright  2013, M2Mobi BV, Amsterdam, The Netherlands
+ * @license    http://lunr.nl/LICENSE MIT License
+ */
+
+namespace Lunr\Vortex\GCM\Tests;
+
+use Lunr\Vortex\GCM\GCMResponse;
+use Lunr\Vortex\PushNotificationStatus;
+use Lunr\Halo\LunrBaseTest;
+use ReflectionClass;
+
+/**
+ * This class contains common setup routines, providers
+ * and shared attributes for testing the GCMResponse class.
+ *
+ * @category   Tests
+ * @package    Vortex
+ * @subpackage GCM
+ * @author     Dinos Theodorou <dinos@m2mobi.com>
+ * @covers     Lunr\Vortex\GCM\GCMResponse
+ */
+abstract class GCMResponseTest extends LunrBaseTest
+{
+
+    /**
+     * Mock instance of the Logger class.
+     * @var LoggerInterface
+     */
+    protected $logger;
+
+    /**
+     * Testcase Constructor.
+     *
+     * @return void
+     */
+    public function setUpError()
+    {
+        $this->logger = $this->getMock('Psr\Log\LoggerInterface');
+
+        $response = $this->getMockBuilder('Lunr\Network\CurlResponse')
+                         ->disableOriginalConstructor()
+                         ->getMock();
+
+        $response->expects($this->once())
+                 ->method('get_network_error_number')
+                 ->will($this->returnValue(-1));
+
+        $response->expects($this->once())
+                 ->method('get_network_error_message')
+                 ->will($this->returnValue('Error Message'));
+
+        $map = [ [ 'http_code', 503 ], [ 'url', 'http://localhost/' ] ];
+
+        $response->expects($this->exactly(2))
+                 ->method('__get')
+                 ->will($this->returnValueMap($map));
+
+        $this->logger->expects($this->once())
+                     ->method('error')
+                     ->with(
+                        $this->equalTo('Dispatching push notification to {endpoint} failed: {error}'),
+                        $this->equalTo(['error' => 'Error Message', 'endpoint' => 'http://localhost/'])
+                     );
+
+        $this->class      = new GCMResponse($response, $this->logger);
+        $this->reflection = new ReflectionClass('Lunr\Vortex\GCM\GCMResponse');
+    }
+
+    /**
+     * Testcase Constructor.
+     *
+     * @return void
+     */
+    public function setUpSuccess()
+    {
+        $this->logger = $this->getMock('Psr\Log\LoggerInterface');
+
+        $response = $this->getMockBuilder('Lunr\Network\CurlResponse')
+                         ->disableOriginalConstructor()
+                         ->getMock();
+
+        $response->expects($this->once())
+                 ->method('get_network_error_number')
+                 ->will($this->returnValue(0));
+
+        $file = TEST_STATICS . '/vortex/gcm_response.txt';
+        $map  = [ [ 'http_code', 200 ], [ 'header_size', 176 ], [ 'url', 'http://localhost/' ] ];
+
+        $response->expects($this->exactly(3))
+                 ->method('__get')
+                 ->will($this->returnValueMap($map));
+
+        $response->expects($this->once())
+                 ->method('get_result')
+                 ->will($this->returnValue(file_get_contents($file)));
+
+        $this->class      = new GCMResponse($response, $this->logger);
+        $this->reflection = new ReflectionClass('Lunr\Vortex\GCM\GCMResponse');
+    }
+
+    /**
+     * Testcase Destructor.
+     */
+    public function tearDown()
+    {
+        unset($this->logger);
+        unset($this->class);
+        unset($this->reflection);
+    }
+
+    /**
+     * Unit test data provider for special status codes.
+     *
+     * @return array $statuses Array of special statuses
+     */
+    public function specialStatusProvider()
+    {
+        $statuses   = [];
+        $statuses[] = [ 400 ];
+        $statuses[] = [ 401 ];
+        $statuses[] = [ 503 ];
+
+        return $statuses;
+    }
+
+    /**
+     * Unit test data provider for failed requests.
+     *
+     * @return array $requests Array of failed request info
+     */
+    public function failedRequestProvider()
+    {
+        $requests   = [];
+        $requests[] = [ 400, PushNotificationStatus::INVALID_INPUT ];
+        $requests[] = [ 401, PushNotificationStatus::INVALID_ENDPOINT ];
+        $requests[] = [ 503, PushNotificationStatus::ERROR ];
+        $requests[] = [ 500, PushNotificationStatus::UNKNOWN ];
+
+        return $requests;
+    }
+
+}
diff --git a/src/Lunr/Vortex/PushNotificationStatus.php b/src/Lunr/Vortex/PushNotificationStatus.php
index 5cd5ab5a3706a016a3f2b2fd4d62c9c9093ae5b2..0ab94ff78940c4794622929167fa2bfd69f643aa 100644
--- a/src/Lunr/Vortex/PushNotificationStatus.php
+++ b/src/Lunr/Vortex/PushNotificationStatus.php
@@ -62,6 +62,12 @@ class PushNotificationStatus
      */
     const ERROR = 5;
 
+    /**
+     * Push notification not delivered because of invalid input.
+     * @var Integer;
+     */
+    const INVALID_INPUT = 6;
+
 }
 
 ?>
diff --git a/tests/phpunit.xml b/tests/phpunit.xml
index 38d6b6e6170ef64e91b65dab8c867a47c235f2dc..9c7b9003b38d0bfaae8ffb9084829de67bf00942 100644
--- a/tests/phpunit.xml
+++ b/tests/phpunit.xml
@@ -214,6 +214,9 @@
             <file>src/Lunr/Vortex/GCM/Tests/GCMPayloadBaseTest.php</file>
             <file>src/Lunr/Vortex/GCM/Tests/GCMPayloadGetTest.php</file>
             <file>src/Lunr/Vortex/GCM/Tests/GCMPayloadSetTest.php</file>
+            <file>src/Lunr/Vortex/GCM/Tests/GCMResponseErrorTest.php</file>
+            <file>src/Lunr/Vortex/GCM/Tests/GCMResponseSetTest.php</file>
+            <file>src/Lunr/Vortex/GCM/Tests/GCMResponseSuccessTest.php</file>
             <file>src/Lunr/Vortex/MPNS/Tests/MPNSPayloadTest.php</file>
             <file>src/Lunr/Vortex/MPNS/Tests/MPNSToastPayloadSetTest.php</file>
             <file>src/Lunr/Vortex/MPNS/Tests/MPNSToastPayloadGetTest.php</file>
@@ -251,6 +254,7 @@
                 <directory>../src/Lunr/Surface/Tests/</directory>
                 <directory>../src/Lunr/Ticks/Tests/</directory>
                 <directory>../src/Lunr/Vortex/Tests/</directory>
+                <directory>../src/Lunr/Vortex/GCM/Tests/</directory>
                 <directory>../src/Lunr/Vortex/MPNS/Tests/</directory>
             </exclude>
         </whitelist>
diff --git a/tests/statics/vortex/gcm_response.txt b/tests/statics/vortex/gcm_response.txt
new file mode 100644
index 0000000000000000000000000000000000000000..bc737d31074d056d4d5466c2a37268f6f8bd027d
--- /dev/null
+++ b/tests/statics/vortex/gcm_response.txt
@@ -0,0 +1,9 @@
+{
+    "multicast_id": 108,
+        "success": 1,
+        "failure": 0,
+        "canonical_ids": 0,
+        "results": [
+            { "message_id": "1:08" }
+        ]
+}
\ No newline at end of file
