diff --git a/src/Lunr/Vortex/GCM/GCMPayload.php b/src/Lunr/Vortex/GCM/GCMPayload.php
new file mode 100644
index 0000000000000000000000000000000000000000..78a2fe1b21e6e941fa999920b7c46a8d8b216af9
--- /dev/null
+++ b/src/Lunr/Vortex/GCM/GCMPayload.php
@@ -0,0 +1,119 @@
+<?php
+
+/**
+ * This file contains functionality to generate Google Cloud Messaging Push Notification payloads.
+ *
+ * PHP Version 5.4
+ *
+ * @category   Payload
+ * @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;
+
+/**
+ * Google Cloud Messaging Push Notification Payload Generator.
+ *
+ * @category   Payload
+ * @package    Vortex
+ * @subpackage GCM
+ * @author     Dinos Theodorou <dinos@m2mobi.com>
+ */
+class GCMPayload
+{
+
+    /**
+     * Array of Push Notification elements.
+     * @var array
+     */
+    protected $elements;
+
+    /**
+     * Constructor.
+     */
+    public function __construct()
+    {
+        $this->elements = [];
+    }
+
+    /**
+     * Destructor.
+     */
+    public function __destruct()
+    {
+        unset($this->elements);
+    }
+
+    /**
+     * Construct the payload for the push notification.
+     *
+     * @return String $return GCMPayload
+     */
+    public function get_payload()
+    {
+        return json_encode($this->elements);
+    }
+
+    /**
+     * Sets the payload key registration ids.
+     *
+     * @param array $ids An array with one, or more registration ids.
+     *
+     * @return GCMPayload $self Self Reference
+     */
+    public function set_registration_ids($ids)
+    {
+        $this->elements['registration_ids'] = $ids;
+
+        return $this;
+    }
+
+    /**
+     * Sets the payload key collapse_key.
+     *
+     * @param String $key The notification collapse key identifier
+     *
+     * @return GCMPayload $self Self Reference
+     */
+    public function set_collapse_key($key)
+    {
+        $this->elements['collapse_key'] = $key;
+
+        return $this;
+    }
+
+    /**
+     * Sets the payload key data.
+     *
+     * @param array $data The actuall notification information
+     *
+     * @return GCMPayload $self Self Reference
+     */
+    public function set_data($data)
+    {
+        $this->elements['data'] = $data;
+
+        return $this;
+    }
+
+    /**
+     * Sets the payload key time_to_live.
+     *
+     * @param integer $ttl The time in seconds for the notification to stay alive
+     *
+     * @return GCMPayload $self Self Reference
+     */
+    public function set_time_to_live($ttl)
+    {
+        $this->elements['time_to_live'] = $ttl;
+
+        return $this;
+    }
+
+}
+
+?>
diff --git a/src/Lunr/Vortex/GCM/Tests/GCMPayloadBaseTest.php b/src/Lunr/Vortex/GCM/Tests/GCMPayloadBaseTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..80dce6e74acc6fefb800320f61e1245039b54c29
--- /dev/null
+++ b/src/Lunr/Vortex/GCM/Tests/GCMPayloadBaseTest.php
@@ -0,0 +1,40 @@
+<?php
+
+/**
+ * This file contains the GCMPayloadBaseTest 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;
+
+/**
+ * This class contains the Base tests of the GCMPayload class.
+ *
+ * @category   Tests
+ * @package    Vortex
+ * @subpackage GCM
+ * @author     Dinos Theodorou <dinos@m2mobi.com>
+ * @covers     Lunr\Vortex\GCM\GCMPayload
+ */
+class GCMPayloadBaseTest extends GCMPayloadTest
+{
+
+    /**
+     * Test elements is initialized as an empty array.
+     */
+    public function testElementsIsInitializedAsEmptyArray()
+    {
+        $this->assertArrayEmpty($this->get_reflection_property_value('elements'));
+    }
+
+}
+
+?>
diff --git a/src/Lunr/Vortex/GCM/Tests/GCMPayloadGetTest.php b/src/Lunr/Vortex/GCM/Tests/GCMPayloadGetTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..89034a3dc4d88b21e1f57cff26381b6ca5209350
--- /dev/null
+++ b/src/Lunr/Vortex/GCM/Tests/GCMPayloadGetTest.php
@@ -0,0 +1,135 @@
+<?php
+
+/**
+ * This file contains the GCMPayloadGetTest 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;
+
+/**
+ * This class contains tests for the getters of the GCMPayload class.
+ *
+ * @category   Tests
+ * @package    Vortex
+ * @subpackage GCM
+ * @author     Dinos Theodorou <dinos@m2mobi.com>
+ * @covers     Lunr\Vortex\GCM\GCMPayload
+ */
+class GCMPayloadGetTest extends GCMPayloadTest
+{
+
+    /**
+     * Test get_payload() with registration ids being present.
+     *
+     * @covers Lunr\Vortex\GCM\GCMPayload::get_payload
+     */
+    public function testGetPayloadWithRegistrationIds()
+    {
+        $elements = [ 'registration_ids' => [ 'one', 'two', 'three' ] ];
+
+        $this->set_reflection_property_value('elements', $elements);
+
+        $payload = $this->class->get_payload();
+
+        $payload = json_decode($payload, TRUE);
+
+        $this->assertArrayHasKey('registration_ids', $payload);
+        $this->assertEquals($payload['registration_ids'], $elements['registration_ids']);
+    }
+
+    /**
+     * Test get_payload() with collapse_key being present.
+     *
+     * @covers Lunr\Vortex\GCM\GCMPayload::get_payload
+     */
+    public function testGetPayloadWithCollapseKey()
+    {
+        $elements = [ 'collapse_key' => 'test' ];
+
+        $this->set_reflection_property_value('elements', $elements);
+
+        $payload = $this->class->get_payload();
+
+        $payload = json_decode($payload, TRUE);
+
+        $this->assertArrayHasKey('collapse_key', $payload);
+        $this->assertEquals($payload['collapse_key'], $elements['collapse_key']);
+    }
+
+    /**
+     * Test get_payload() with data being present.
+     *
+     * @covers Lunr\Vortex\GCM\GCMPayload::get_payload
+     */
+    public function testGetPayloadWithData()
+    {
+        $elements = [
+            'data' => [
+                'key1' => 'value1',
+                'key2' => 'value2'
+            ]
+        ];
+
+        $this->set_reflection_property_value('elements', $elements);
+
+        $payload = $this->class->get_payload();
+
+        $payload = json_decode($payload, TRUE);
+
+        $this->assertArrayHasKey('data', $payload);
+        $this->assertEquals($payload['data'], $elements['data']);
+    }
+
+    /**
+     * Test get_payload() with time_to_live being present.
+     *
+     * @covers Lunr\Vortex\GCM\GCMPayload::get_payload
+     */
+    public function testGetPayloadWithTimeToLive()
+    {
+        $elements = [ 'time_to_live' => 10 ];
+
+        $this->set_reflection_property_value('elements', $elements);
+
+        $payload = $this->class->get_payload();
+
+        $payload = json_decode($payload, TRUE);
+
+        $this->assertArrayHasKey('time_to_live', $payload);
+        $this->assertEquals($payload['time_to_live'], $elements['time_to_live']);
+    }
+
+    /**
+     * Test get_payload() with everything being present.
+     *
+     * @covers Lunr\Vortex\GCM\GCMPayload::get_payload
+     */
+    public function testGetPayload()
+    {
+        $elements = [
+            'registration_ids' => [ 'one', 'two', 'three' ],
+            'collapse_key' => 'test',
+            'data' => [
+                'key1' => 'value1',
+                'key2' => 'value2'
+            ],
+            'time_to_live' => 10
+        ];
+
+        $this->set_reflection_property_value('elements', $elements);
+
+        $this->assertEquals($this->payload, $this->class->get_payload());
+    }
+
+}
+
+?>
diff --git a/src/Lunr/Vortex/GCM/Tests/GCMPayloadSetTest.php b/src/Lunr/Vortex/GCM/Tests/GCMPayloadSetTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..d5607fcb980806fe59ecfbd90f807b0a5bfb76be
--- /dev/null
+++ b/src/Lunr/Vortex/GCM/Tests/GCMPayloadSetTest.php
@@ -0,0 +1,132 @@
+<?php
+
+/**
+ * This file contains the GCMPayloadSetTest 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;
+
+/**
+ * This class contains tests for the setters of the GCMPayload class.
+ *
+ * @category   Tests
+ * @package    Vortex
+ * @subpackage GCM
+ * @author     Dinos Theodorou <dinos@m2mobi.com>
+ * @covers     Lunr\Vortex\GCM\GCMPayload
+ */
+class GCMPayloadSetTest extends GCMPayloadTest
+{
+
+    /**
+     * Test set_registration_ids() works correctly.
+     *
+     * @covers Lunr\Vortex\GCM\GCMPayload::set_registration_ids
+     */
+    public function testSetRegistrationIds()
+    {
+        $this->class->set_registration_ids([ 'one', 'two', 'three' ]);
+
+        $value = $this->get_reflection_property_value('elements');
+
+        $this->assertArrayHasKey('registration_ids', $value);
+        $this->assertEquals([ 'one', 'two', 'three' ], $value['registration_ids']);
+    }
+
+    /**
+     * Test fluid interface of set_registration_ids().
+     *
+     * @covers Lunr\Vortex\GCM\GCMPayload::set_registration_ids
+     */
+    public function testSetRegistrationIdsReturnsSelfReference()
+    {
+        $this->assertSame($this->class, $this->class->set_registration_ids('registration_ids'));
+    }
+
+    /**
+     * Test set_collapse_key() works correctly.
+     *
+     * @covers Lunr\Vortex\GCM\GCMPayload::set_collapse_key
+     */
+    public function testSetCollapseKey()
+    {
+        $this->class->set_collapse_key('test');
+
+        $value = $this->get_reflection_property_value('elements');
+
+        $this->assertArrayHasKey('collapse_key', $value);
+        $this->assertEquals('test', $value['collapse_key']);
+    }
+
+    /**
+     * Test fluid interface of set_collapse_key().
+     *
+     * @covers Lunr\Vortex\GCM\GCMPayload::set_collapse_key
+     */
+    public function testSetCollapseKeyReturnsSelfReference()
+    {
+        $this->assertSame($this->class, $this->class->set_collapse_key('collapse_key'));
+    }
+
+    /**
+     * Test set_data() works correctly.
+     *
+     * @covers Lunr\Vortex\GCM\GCMPayload::set_data
+     */
+    public function testSetData()
+    {
+        $this->class->set_data(['key' => 'value']);
+
+        $value = $this->get_reflection_property_value('elements');
+
+        $this->assertArrayHasKey('data', $value);
+        $this->assertEquals(['key' => 'value'], $value['data']);
+    }
+
+    /**
+     * Test fluid interface of set_data().
+     *
+     * @covers Lunr\Vortex\GCM\GCMPayload::set_data
+     */
+    public function testSetDataReturnsSelfReference()
+    {
+        $this->assertSame($this->class, $this->class->set_data('data'));
+    }
+
+    /**
+     * Test set_time_to_live() works correctly.
+     *
+     * @covers Lunr\Vortex\GCM\GCMPayload::set_time_to_live
+     */
+    public function testSetTimeToLive()
+    {
+        $this->class->set_time_to_live(5);
+
+        $value = $this->get_reflection_property_value('elements');
+
+        $this->assertArrayHasKey('time_to_live', $value);
+        $this->assertEquals(5, $value['time_to_live']);
+    }
+
+    /**
+     * Test fluid interface of set_time_to_live().
+     *
+     * @covers Lunr\Vortex\GCM\GCMPayload::set_time_to_live
+     */
+    public function testSetTimeToLiveReturnsSelfReference()
+    {
+        $this->assertSame($this->class, $this->class->set_time_to_live('time_to_live'));
+    }
+
+}
+
+?>
diff --git a/src/Lunr/Vortex/GCM/Tests/GCMPayloadTest.php b/src/Lunr/Vortex/GCM/Tests/GCMPayloadTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..b7bf490049bcf81ba6b119139b5af9661912b59d
--- /dev/null
+++ b/src/Lunr/Vortex/GCM/Tests/GCMPayloadTest.php
@@ -0,0 +1,75 @@
+<?php
+
+/**
+ * This file contains the GCMPayloadTest 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\Halo\LunrBaseTest;
+use ReflectionClass;
+
+/**
+ * This class contains common setup routines, providers
+ * and shared attributes for testing the GCMPayload class.
+ *
+ * @category   Tests
+ * @package    Vortex
+ * @subpackage GCM
+ * @author     Dinos Theodorou <dinos@m2mobi.com>
+ * @covers     Lunr\Vortex\GCM\GCMPayload
+ */
+class GCMPayloadTest extends LunrBaseTest
+{
+
+    /**
+     * Sample payload json
+     * @var string
+     */
+    protected $payload;
+
+    /**
+     * Testcase Constructor.
+     */
+    public function setUp()
+    {
+        $elements_array = [
+            'registration_ids' => [ 'one', 'two', 'three' ],
+            'collapse_key' => 'test',
+            'data' => [
+                'key1' => 'value1',
+                'key2' => 'value2'
+            ],
+            'time_to_live' => 10
+        ];
+
+        $this->payload = json_encode($elements_array);
+
+        $this->class = $this->getMockBuilder('Lunr\Vortex\GCM\GCMPayload')
+                            ->getMockForAbstractClass();
+
+        $this->reflection = new ReflectionClass('Lunr\Vortex\GCM\GCMPayload');
+    }
+
+    /**
+     * Testcase Destructor.
+     */
+    public function tearDown()
+    {
+        unset($this->payload);
+        unset($this->class);
+        unset($this->reflection);
+    }
+
+}
+
+?>
diff --git a/tests/phpunit.xml b/tests/phpunit.xml
index 1e797a6588592a0eab05f749c826680ef84fe324..38d6b6e6170ef64e91b65dab8c867a47c235f2dc 100644
--- a/tests/phpunit.xml
+++ b/tests/phpunit.xml
@@ -211,6 +211,9 @@
             <file>src/Lunr/Ticks/Tests/FileTimerStopTest.php</file>
         </testsuite>
         <testsuite name="Vortex">
+            <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/MPNS/Tests/MPNSPayloadTest.php</file>
             <file>src/Lunr/Vortex/MPNS/Tests/MPNSToastPayloadSetTest.php</file>
             <file>src/Lunr/Vortex/MPNS/Tests/MPNSToastPayloadGetTest.php</file>
