diff --git a/src/Lunr/Vortex/FCM/FCMPayload.php b/src/Lunr/Vortex/FCM/FCMPayload.php
index c486900246fdf550e1a53d322e4d95271a807816..a9bed876feba77d3d2af28baac2043082da9e73e 100644
--- a/src/Lunr/Vortex/FCM/FCMPayload.php
+++ b/src/Lunr/Vortex/FCM/FCMPayload.php
@@ -37,6 +37,26 @@ class FCMPayload extends GCMPayload
         parent::__destruct();
     }
 
+    /**
+     * Check whether a condition is set
+     *
+     * @return boolean $return TRUE if condition is present.
+     */
+    public function is_conditional()
+    {
+        return isset($this->elements['condition']);
+    }
+
+    /**
+     * Check whether a condition is set
+     *
+     * @return boolean $return TRUE if condition is present.
+     */
+    public function has_topic()
+    {
+        return isset($this->elements['topic']);
+    }
+
     /**
      * Sets the payload key data.
      *
@@ -53,6 +73,94 @@ class FCMPayload extends GCMPayload
         return $this;
     }
 
+    /**
+     * Sets the payload data specific to Android notifications.
+     *
+     * @param array $data Key-value pairs of payload data
+     *
+     * @return FCMPayload $self Self Reference
+     */
+    public function set_android($data)
+    {
+        $this->elements['android'] = $data;
+
+        return $this;
+    }
+
+    /**
+     * Sets the payload data specific to APNS notifications.
+     *
+     * @param array $data Key-value pairs of payload data
+     *
+     * @return FCMPayload $self Self Reference
+     */
+    public function set_apns($data)
+    {
+        $this->elements['apns'] = $data;
+
+        return $this;
+    }
+
+    /**
+     * Sets the payload data specific to in-browser notifications.
+     *
+     * @param array $data Key-value pairs of payload data
+     *
+     * @return FCMPayload $self Self Reference
+     */
+    public function set_webpush($data)
+    {
+        $this->elements['webpush'] = $data;
+
+        return $this;
+    }
+
+    /**
+     * Sets the registration token that identifies the recipient device.
+     *
+     * @param string $token The registration token of the recipient device
+     *
+     * @return FCMPayload $self Self Reference
+     */
+    public function set_token($token)
+    {
+        $this->elements['token'] = $token;
+
+        return $this;
+    }
+
+    /**
+     * Sets the topic name to send the message to.
+     *
+     * @param string $topic String of the topic name
+     *
+     * @return FCMPayload $self Self Reference
+     */
+    public function set_topic($topic)
+    {
+        $this->elements['topic'] = $topic;
+
+        return $this;
+    }
+
+    /**
+     * Sets the condition to send the message to. For example:
+     * 'TopicA' in topics && ('TopicB' in topics || 'TopicC' in topics)
+     *
+     * You can include up to five topics in your conditional expression.
+     * Conditions support the following operators: &&, ||, !
+     *
+     * @param string $condition Key-value pairs of payload data
+     *
+     * @return FCMPayload $self Self Reference
+     */
+    public function set_condition($condition)
+    {
+        $this->elements['condition'] = $condition;
+
+        return $this;
+    }
+
 }
 
 ?>
diff --git a/src/Lunr/Vortex/FCM/Tests/FCMPayloadHasTopicTest.php b/src/Lunr/Vortex/FCM/Tests/FCMPayloadHasTopicTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..e42f1bbcf4c654b020eb2270ba3840d8643abc96
--- /dev/null
+++ b/src/Lunr/Vortex/FCM/Tests/FCMPayloadHasTopicTest.php
@@ -0,0 +1,48 @@
+<?php
+
+/**
+ * This file contains the FCMPayloadHasTopicTest class.
+ *
+ * PHP Version 5.4
+ *
+ * @package    Lunr\Vortex\FCM
+ * @author     Koen Woortman <k.woortman@m2mobi.com>
+ * @copyright  2018, M2Mobi BV, Amsterdam, The Netherlands
+ * @license    http://lunr.nl/LICENSE MIT License
+ */
+
+namespace Lunr\Vortex\FCM\Tests;
+
+/**
+ * This class contains tests for the has_topic method of the FCMPayload class.
+ *
+ * @covers Lunr\Vortex\FCM\FCMPayload
+ */
+class FCMPayloadHasTopicTest extends FCMPayloadTest
+{
+
+    /**
+     * Test has_topic() returns FALSE when a topic is set.
+     *
+     * @covers Lunr\Vortex\FCM\FCMPayload::has_topic
+     */
+    public function testWhenNoTopicIsSet()
+    {
+        $this->assertFalse($this->class->has_topic());
+    }
+
+    /**
+     * Test if has_topic() returns TRUE when a topic is set.
+     *
+     * @covers Lunr\Vortex\FCM\FCMPayload::has_topic
+     */
+    public function testWhenTopicIsSetCorrectly()
+    {
+        $this->class->set_topic('news');
+
+        $this->assertTrue($this->class->has_topic());
+    }
+
+}
+
+?>
diff --git a/src/Lunr/Vortex/FCM/Tests/FCMPayloadIsConditionalTest.php b/src/Lunr/Vortex/FCM/Tests/FCMPayloadIsConditionalTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..89ac05ff48fe4f680c6af8ab09bfd9702f674a6c
--- /dev/null
+++ b/src/Lunr/Vortex/FCM/Tests/FCMPayloadIsConditionalTest.php
@@ -0,0 +1,48 @@
+<?php
+
+/**
+ * This file contains the FCMPayloadIsConditionalTest class.
+ *
+ * PHP Version 5.4
+ *
+ * @package    Lunr\Vortex\FCM
+ * @author     Koen Woortman <k.woortman@m2mobi.com>
+ * @copyright  2018, M2Mobi BV, Amsterdam, The Netherlands
+ * @license    http://lunr.nl/LICENSE MIT License
+ */
+
+namespace Lunr\Vortex\FCM\Tests;
+
+/**
+ * This class contains tests for the is_conditional method of the FCMPayload class.
+ *
+ * @covers Lunr\Vortex\FCM\FCMPayload
+ */
+class FCMPayloadIsConditionalTest extends FCMPayloadTest
+{
+
+    /**
+     * Test is_conditional() returns FALSE when no condition is set.
+     *
+     * @covers Lunr\Vortex\FCM\FCMPayload::is_conditional
+     */
+    public function testWhenNoConditionIsSet()
+    {
+        $this->assertFalse($this->class->is_conditional());
+    }
+
+    /**
+     * Test if is_conditional() returns TRUE when condition is set.
+     *
+     * @covers Lunr\Vortex\FCM\FCMPayload::is_conditional
+     */
+    public function testWhenConditionIsSetCorrectly()
+    {
+        $this->class->set_condition("'TopicA' in topics && 'TopicB' in topics");
+
+        $this->assertTrue($this->class->is_conditional());
+    }
+
+}
+
+?>
diff --git a/src/Lunr/Vortex/FCM/Tests/FCMPayloadSetTest.php b/src/Lunr/Vortex/FCM/Tests/FCMPayloadSetTest.php
index 185ce400e3acedd00c31509d32a0ba8db4c3cc5d..216cd46dcf84933976c155ebc3bbff7c134788ee 100644
--- a/src/Lunr/Vortex/FCM/Tests/FCMPayloadSetTest.php
+++ b/src/Lunr/Vortex/FCM/Tests/FCMPayloadSetTest.php
@@ -41,11 +41,161 @@ class FCMPayloadSetTest extends FCMPayloadTest
      *
      * @covers Lunr\Vortex\FCM\FCMPayload::set_notification
      */
-    public function testSetDataReturnsSelfReference()
+    public function testSetNotificationReturnsSelfReference()
     {
         $this->assertSame($this->class, $this->class->set_notification('data'));
     }
 
+    /**
+     * Test set_android() works correctly.
+     *
+     * @covers Lunr\Vortex\FCM\FCMPayload::set_android
+     */
+    public function testSetAndroid()
+    {
+        $this->class->set_android([ 'key' => 'value' ]);
+
+        $value = $this->get_reflection_property_value('elements');
+
+        $this->assertArrayHasKey('android', $value);
+        $this->assertEquals(['key' => 'value' ], $value['android']);
+    }
+
+    /**
+     * Test fluid interface of set_android().
+     *
+     * @covers Lunr\Vortex\FCM\FCMPayload::set_android
+     */
+    public function testSetAndroidReturnsSelfReference()
+    {
+        $this->assertSame($this->class, $this->class->set_android('data'));
+    }
+
+    /**
+     * Test set_apns() works correctly.
+     *
+     * @covers Lunr\Vortex\FCM\FCMPayload::set_apns
+     */
+    public function testSetApns()
+    {
+        $this->class->set_apns([ 'key' => 'value' ]);
+
+        $value = $this->get_reflection_property_value('elements');
+
+        $this->assertArrayHasKey('apns', $value);
+        $this->assertEquals([ 'key' => 'value' ], $value['apns']);
+    }
+
+    /**
+     * Test fluid interface of set_apns().
+     *
+     * @covers Lunr\Vortex\FCM\FCMPayload::set_apns
+     */
+    public function testSetApnsReturnsSelfReference()
+    {
+        $this->assertSame($this->class, $this->class->set_apns('data'));
+    }
+
+    /**
+     * Test set_webpush() works correctly.
+     *
+     * @covers Lunr\Vortex\FCM\FCMPayload::set_webpush
+     */
+    public function testSetWebpush()
+    {
+        $this->class->set_webpush([ 'key' => 'value' ]);
+
+        $value = $this->get_reflection_property_value('elements');
+
+        $this->assertArrayHasKey('webpush', $value);
+        $this->assertEquals([ 'key' => 'value' ], $value['webpush']);
+    }
+
+    /**
+     * Test fluid interface of set_webpush().
+     *
+     * @covers Lunr\Vortex\FCM\FCMPayload::set_webpush
+     */
+    public function testSetWebpushReturnsSelfReference()
+    {
+        $this->assertSame($this->class, $this->class->set_webpush('data'));
+    }
+
+    /**
+     * Test set_token() works correctly.
+     *
+     * @covers Lunr\Vortex\FCM\FCMPayload::set_token
+     */
+    public function testSetToken()
+    {
+        $this->class->set_token([ 'key' => 'value' ]);
+
+        $value = $this->get_reflection_property_value('elements');
+
+        $this->assertArrayHasKey('token', $value);
+        $this->assertEquals([ 'key' => 'value' ], $value['token']);
+    }
+
+    /**
+     * Test fluid interface of set_token().
+     *
+     * @covers Lunr\Vortex\FCM\FCMPayload::set_token
+     */
+    public function testSetTokenReturnsSelfReference()
+    {
+        $this->assertSame($this->class, $this->class->set_token('data'));
+    }
+
+    /**
+     * Test set_topic() works correctly.
+     *
+     * @covers Lunr\Vortex\FCM\FCMPayload::set_topic
+     */
+    public function testSetTopic()
+    {
+        $this->class->set_topic('News');
+
+        $value = $this->get_reflection_property_value('elements');
+
+        $this->assertArrayHasKey('topic', $value);
+        $this->assertEquals('News', $value['topic']);
+    }
+
+    /**
+     * Test fluid interface of set_topic().
+     *
+     * @covers Lunr\Vortex\FCM\FCMPayload::set_topic
+     */
+    public function testSetTopicReturnsSelfReference()
+    {
+        $this->assertSame($this->class, $this->class->set_topic('data'));
+    }
+
+    /**
+     * Test set_condition() works correctly.
+     *
+     * @covers Lunr\Vortex\FCM\FCMPayload::set_condition
+     */
+    public function testSetCondition()
+    {
+        $this->class->set_condition("'TopicA' in topics && 'TopicB' in topics");
+
+        $value = $this->get_reflection_property_value('elements');
+
+        $this->assertArrayHasKey('condition', $value);
+        $this->assertEquals("'TopicA' in topics && 'TopicB' in topics", $value['condition']);
+    }
+
+    /**
+     * Test fluid interface of set_condition().
+     *
+     * @covers Lunr\Vortex\FCM\FCMPayload::set_condition
+     */
+    public function testSetConditionReturnsSelfReference()
+    {
+        $this->assertSame($this->class, $this->class->set_condition('data'));
+    }
+
 }
 
 ?>
diff --git a/tests/phpunit.xml b/tests/phpunit.xml
index 48bedd2a584e36724e9976813d8231696675e11c..d565bc1bc05d287347e1dda4063eed2890e8b8df 100644
--- a/tests/phpunit.xml
+++ b/tests/phpunit.xml
@@ -316,6 +316,8 @@
             <file>../src/Lunr/Vortex/GCM/Tests/GCMResponseAddBatchResponseTest.php</file>
             <file>../src/Lunr/Vortex/GCM/Tests/GCMResponseGetStatusTest.php</file>
             <file>../src/Lunr/Vortex/FCM/Tests/FCMPayloadBaseTest.php</file>
+            <file>../src/Lunr/Vortex/FCM/Tests/FCMPayloadHasTopicTest.php</file>
+            <file>../src/Lunr/Vortex/FCM/Tests/FCMPayloadIsConditionalTest.php</file>
             <file>../src/Lunr/Vortex/FCM/Tests/FCMPayloadSetTest.php</file>
             <file>../src/Lunr/Vortex/FCM/Tests/FCMBatchResponseBasePushErrorTest.php</file>
             <file>../src/Lunr/Vortex/FCM/Tests/FCMBatchResponseBasePushSuccessTest.php</file>
