diff --git a/src/Lunr/Vortex/FCM/FCMDispatcher.php b/src/Lunr/Vortex/FCM/FCMDispatcher.php
index 79ab9caf3dcb5a6cc50691cd931df481aa8b6ca8..6a4e6cb4fa01d25fc0abc65d33850e56d88e4c2a 100644
--- a/src/Lunr/Vortex/FCM/FCMDispatcher.php
+++ b/src/Lunr/Vortex/FCM/FCMDispatcher.php
@@ -129,7 +129,9 @@ class FCMDispatcher implements PushNotificationDispatcherInterface
         {
             $this->logger->warning('Tried to push FCM notification to {endpoint} but wasn\'t authenticated.', [ 'endpoint' => $endpoints[0] ]);
 
-            return $this->get_response($this->get_new_response_object_for_failed_request(401), $this->logger, $endpoints[0], $payload->get_payload());
+            $response = $this->get_new_response_object_for_failed_request(401);
+
+            return $this->get_response($response, $this->logger, $endpoints[0], $payload->get_json_payload());
         }
 
         $headers = [
@@ -137,11 +139,8 @@ class FCMDispatcher implements PushNotificationDispatcherInterface
             'Authorization' => 'Bearer ' . $this->oauth_token,
         ];
 
-        $tmp_payload = json_decode($payload->get_payload(), TRUE);
-
-        $tmp_payload['to'] = $endpoints[0];
-
-        $json_payload = json_encode($tmp_payload, JSON_UNESCAPED_UNICODE);
+        $json_payload = $payload->set_token($endpoints[0])
+                                ->get_json_payload(JSON_UNESCAPED_UNICODE);
 
         try
         {
@@ -150,7 +149,9 @@ class FCMDispatcher implements PushNotificationDispatcherInterface
                 'connect_timeout' => 15 // timeout in seconds
             ];
 
-            $http_response = $this->http->post(self::GOOGLE_SEND_URL . $this->project_id . '/messages:send', $headers, $json_payload, $options);
+            $url = self::GOOGLE_SEND_URL . $this->project_id . '/messages:send';
+
+            $http_response = $this->http->post($url, $headers, $json_payload, $options);
         }
         catch (RequestsException $e)
         {
diff --git a/src/Lunr/Vortex/FCM/FCMPayload.php b/src/Lunr/Vortex/FCM/FCMPayload.php
index 6924a9dd7c24ac73ebfe3b8639126fc6b8b5ce3d..a9964f9d91017e2a9f8fd9a990d6951d3b9927df 100644
--- a/src/Lunr/Vortex/FCM/FCMPayload.php
+++ b/src/Lunr/Vortex/FCM/FCMPayload.php
@@ -10,6 +10,7 @@
 
 namespace Lunr\Vortex\FCM;
 
+use Lunr\Vortex\APNS\APNSPriority;
 use ReflectionClass;
 
 /**
@@ -31,7 +32,8 @@ class FCMPayload
     {
         $this->elements = [];
 
-        $this->elements['priority'] = FCMPriority::HIGH;
+        $this->elements['android']['priority']              = FCMAndroidPriority::HIGH;
+        $this->elements['apns']['headers']['apns-priority'] = APNSPriority::HIGH;
     }
 
     /**
@@ -45,11 +47,13 @@ class FCMPayload
     /**
      * Construct the payload for the push notification.
      *
-     * @return string FCMPayload
+     * @param int $flag The flag to encode the payload with
+     *
+     * @return string|false FCMPayload
      */
-    public function get_payload(): string
+    public function get_json_payload(int $flag = 0): string|false
     {
-        return json_encode($this->elements);
+        return json_encode($this->elements, $flag);
     }
 
     /**
@@ -64,7 +68,8 @@ class FCMPayload
      */
     public function set_collapse_key(string $key): self
     {
-        $this->elements['collapse_key'] = $key;
+        $this->elements['android']['collapse_key']             = $key;
+        $this->elements['apns']['headers']['apns-collapse-id'] = $key;
 
         return $this;
     }
@@ -86,9 +91,9 @@ class FCMPayload
     }
 
     /**
-     * Sets the payload key time_to_live.
+     * Sets the payload key ttl for android devices.
      *
-     * It defines how long (in seconds) the message should be kept on FCM storage,
+     * It defines how long (in seconds) the message should be kept on the Android storage,
      * if the device is offline.
      *
      * @param int $ttl The time in seconds for the notification to stay alive
@@ -97,7 +102,7 @@ class FCMPayload
      */
     public function set_time_to_live(int $ttl): self
     {
-        $this->elements['time_to_live'] = $ttl;
+        $this->elements['android']['ttl'] = (string) $ttl . 's';
 
         return $this;
     }
@@ -147,7 +152,7 @@ class FCMPayload
      */
     public function set_content_available(bool $val): self
     {
-        $this->elements['content_available'] = $val;
+        $this->elements['apns']['payload']['aps']['content-available'] = (int) $val;
 
         return $this;
     }
@@ -193,7 +198,7 @@ class FCMPayload
      */
     public function set_mutable_content(bool $mutable): self
     {
-        $this->elements['mutable_content'] = $mutable;
+        $this->elements['apns']['payload']['aps']['mutable-content'] = (int) $mutable;
 
         return $this;
     }
@@ -207,11 +212,20 @@ class FCMPayload
      */
     public function set_priority(string $priority): self
     {
-        $priority       = strtolower($priority);
-        $priority_class = new ReflectionClass('\Lunr\Vortex\FCM\FCMPriority');
-        if (in_array($priority, array_values($priority_class->getConstants())))
+        $priority = strtoupper($priority);
+
+        $priority_class = new ReflectionClass(FCMAndroidPriority::class);
+        $priorities     = $priority_class->getConstants();
+        if (in_array($priority, array_keys($priorities)))
+        {
+            $this->elements['android']['priority'] = $priorities[$priority];
+        }
+
+        $priority_class = new ReflectionClass(APNSPriority::class);
+        $priorities     = $priority_class->getConstants();
+        if (in_array($priority, array_keys($priorities)))
         {
-            $this->elements['priority'] = $priority;
+            $this->elements['apns']['headers']['apns-priority'] = $priorities[$priority];
         }
 
         return $this;
@@ -232,6 +246,92 @@ class FCMPayload
         return $this;
     }
 
+    /**
+     * Set the token of the target for the notification.
+     *
+     * @param string $token Token of the target for the notification.
+     *
+     * @return FCMPayload Self Reference
+     */
+    public function set_token(string $token): self
+    {
+        $this->elements['token'] = $token;
+
+        return $this;
+    }
+
+    /**
+     * Sets the payload category.
+     *
+     * @param string $category The category to set it to
+     *
+     * @return FCMPayload Self Reference
+     */
+    public function set_category(string $category): self
+    {
+        $this->elements['android']['notification']['click_action'] = $category;
+        $this->elements['apns']['payload']['aps']['category']      = $category;
+
+        return $this;
+    }
+
+    /**
+     * Sets the tag of the notification for android notifications.
+     *
+     * @param string $tag The tag to set it to
+     *
+     * @return FCMPayload Self Reference
+     */
+    public function set_tag(string $tag): self
+    {
+        $this->elements['android']['notification']['tag'] = $tag;
+
+        return $this;
+    }
+
+    /**
+     * Sets the color of the notification for android notifications.
+     *
+     * @param string $color The color to set it to
+     *
+     * @return FCMPayload Self Reference
+     */
+    public function set_color(string $color): self
+    {
+        $this->elements['android']['notification']['color'] = $color;
+
+        return $this;
+    }
+
+    /**
+     * Sets the icon of the notification for android notifications.
+     *
+     * @param string $icon The icon to set it to
+     *
+     * @return FCMPayload Self Reference
+     */
+    public function set_icon(string $icon): self
+    {
+        $this->elements['android']['notification']['icon'] = $icon;
+
+        return $this;
+    }
+
+    /**
+     * Sets the notification sound.
+     *
+     * @param string $sound The sound to set it to
+     *
+     * @return FCMPayload Self Reference
+     */
+    public function set_sound(string $sound): self
+    {
+        $this->elements['android']['notification']['sound'] = $sound;
+        $this->elements['apns']['payload']['aps']['sound']  = $sound;
+
+        return $this;
+    }
+
 }
 
 ?>
diff --git a/src/Lunr/Vortex/FCM/FCMPriority.php b/src/Lunr/Vortex/FCM/FCMAndroidPriority.php
similarity index 76%
rename from src/Lunr/Vortex/FCM/FCMPriority.php
rename to src/Lunr/Vortex/FCM/FCMAndroidPriority.php
index abad74d86cc99554ef5c515036481dca8afcabf2..67eabc99c620bd730671de81529c199ff06ac30b 100644
--- a/src/Lunr/Vortex/FCM/FCMPriority.php
+++ b/src/Lunr/Vortex/FCM/FCMAndroidPriority.php
@@ -11,22 +11,22 @@
 namespace Lunr\Vortex\FCM;
 
 /**
- * Firebase Cloud Messaging Notification Priority Types.
+ * Firebase Cloud Messaging Notification Priority Types for Android.
  */
-class FCMPriority
+class FCMAndroidPriority
 {
 
     /**
      * Deliver notification immediately.
      * @var string
      */
-    public const HIGH = 'high';
+    public const HIGH = 'HIGH';
 
     /**
      * Deliver notification with normal priority.
      * @var string
      */
-    public const NORMAL = 'normal';
+    public const NORMAL = 'NORMAL';
 
 }
 
diff --git a/src/Lunr/Vortex/FCM/Tests/FCMDispatcherPushTest.php b/src/Lunr/Vortex/FCM/Tests/FCMDispatcherPushTest.php
index 3f6462a64adb3be2e2491941b7b3558ef92f9c86..33c52df51adc6f82491146181b3d5e246c578971 100644
--- a/src/Lunr/Vortex/FCM/Tests/FCMDispatcherPushTest.php
+++ b/src/Lunr/Vortex/FCM/Tests/FCMDispatcherPushTest.php
@@ -84,7 +84,7 @@ class FCMDispatcherPushTest extends FCMDispatcherTest
         $endpoints = [ 'endpoint' ];
 
         $this->payload->expects($this->once())
-                      ->method('get_payload')
+                      ->method('get_json_payload')
                       ->willReturn('{"collapse_key":"abcde-12345"}');
 
         $this->set_reflection_property_value('oauth_token', NULL);
@@ -117,7 +117,12 @@ class FCMDispatcherPushTest extends FCMDispatcherTest
         $endpoints = [ 'endpoint' ];
 
         $this->payload->expects($this->once())
-                      ->method('get_payload')
+                      ->method('set_token')
+                      ->with('endpoint')
+                      ->willReturnSelf();
+
+        $this->payload->expects($this->once())
+                      ->method('get_json_payload')
                       ->willReturn('{"collapse_key":"abcde-12345"}');
 
         $this->set_reflection_property_value('oauth_token', 'oauth_token');
@@ -152,17 +157,25 @@ class FCMDispatcherPushTest extends FCMDispatcherTest
             'Authorization' => 'Bearer oauth_token',
         ];
 
-        $url  = 'https://fcm.googleapis.com/v1/projects/fcm-project/messages:send';
-        $post = '{"to":"endpoint"}';
+        $url = 'https://fcm.googleapis.com/v1/projects/fcm-project/messages:send';
 
         $options = [
             'timeout'         => 15,
             'connect_timeout' => 15
         ];
 
+        $this->payload->expects($this->once())
+                      ->method('set_token')
+                      ->with('endpoint')
+                      ->willReturnSelf();
+
+        $this->payload->expects($this->once())
+                      ->method('get_json_payload')
+                      ->willReturn('{"token":"endpoint"}');
+
         $this->http->expects($this->once())
                    ->method('post')
-                   ->with($this->equalTo($url), $this->equalTo($headers), $this->equalTo($post), $this->equalTo($options))
+                   ->with($this->equalTo($url), $this->equalTo($headers), $this->equalTo('{"token":"endpoint"}'), $this->equalTo($options))
                    ->will($this->throwException(new RequestsException('cURL error 10: Request error', 'curlerror', NULL)));
 
         $message = 'Dispatching FCM notification(s) failed: {message}';
@@ -198,17 +211,25 @@ class FCMDispatcherPushTest extends FCMDispatcherTest
             'Authorization' => 'Bearer oauth_token',
         ];
 
-        $url  = 'https://fcm.googleapis.com/v1/projects/fcm-project/messages:send';
-        $post = '{"to":"endpoint"}';
+        $url = 'https://fcm.googleapis.com/v1/projects/fcm-project/messages:send';
 
         $options = [
             'timeout'         => 15,
             'connect_timeout' => 15
         ];
 
+        $this->payload->expects($this->once())
+                      ->method('set_token')
+                      ->with('endpoint')
+                      ->willReturnSelf();
+
+        $this->payload->expects($this->once())
+                      ->method('get_json_payload')
+                      ->willReturn('{"token":"endpoint"}');
+
         $this->http->expects($this->once())
                    ->method('post')
-                   ->with($this->equalTo($url), $this->equalTo($headers), $this->equalTo($post), $this->equalTo($options))
+                   ->with($this->equalTo($url), $this->equalTo($headers), $this->equalTo('{"token":"endpoint"}'), $this->equalTo($options))
                    ->will($this->throwException(new RequestsException('cURL error 28: Request timed out', 'curlerror', NULL)));
 
         $message = 'Dispatching FCM notification(s) failed: {message}';
@@ -247,13 +268,22 @@ class FCMDispatcherPushTest extends FCMDispatcherTest
         ];
 
         $url  = 'https://fcm.googleapis.com/v1/projects/fcm-project/messages:send';
-        $post = '{"to":"endpoint"}';
+        $post = '{"token":"endpoint"}';
 
         $options = [
             'timeout'         => 15,
             'connect_timeout' => 15
         ];
 
+        $this->payload->expects($this->once())
+                      ->method('set_token')
+                      ->with('endpoint')
+                      ->willReturnSelf();
+
+        $this->payload->expects($this->once())
+                      ->method('get_json_payload')
+                      ->willReturn($post);
+
         $this->http->expects($this->once())
                    ->method('post')
                    ->with($this->equalTo($url), $this->equalTo($headers), $this->equalTo($post), $this->equalTo($options))
@@ -274,10 +304,6 @@ class FCMDispatcherPushTest extends FCMDispatcherTest
 
         $endpoints = [ 'endpoint' ];
 
-        $this->payload->expects($this->once())
-                      ->method('get_payload')
-                      ->willReturn('{"collapse_key":"abcde-12345"}');
-
         $response = $this->getMockBuilder('WpOrg\Requests\Response')->getMock();
 
         $headers = [
@@ -286,13 +312,22 @@ class FCMDispatcherPushTest extends FCMDispatcherTest
         ];
 
         $url  = 'https://fcm.googleapis.com/v1/projects/fcm-project/messages:send';
-        $post = '{"collapse_key":"abcde-12345","to":"endpoint"}';
+        $post = '{"collapse_key":"abcde-12345","token":"endpoint"}';
 
         $options = [
             'timeout'         => 15,
             'connect_timeout' => 15
         ];
 
+        $this->payload->expects($this->once())
+                      ->method('set_token')
+                      ->with('endpoint')
+                      ->willReturnSelf();
+
+        $this->payload->expects($this->once())
+                      ->method('get_json_payload')
+                      ->willReturn($post);
+
         $this->http->expects($this->once())
                    ->method('post')
                    ->with($this->equalTo($url), $this->equalTo($headers), $this->equalTo($post), $this->equalTo($options))
@@ -313,10 +348,6 @@ class FCMDispatcherPushTest extends FCMDispatcherTest
 
         $endpoints = [ 'endpoint' ];
 
-        $this->payload->expects($this->once())
-                      ->method('get_payload')
-                      ->willReturn('{"collapse_key":"abcde-12345","data":{"message":"凄い"}}');
-
         $response = $this->getMockBuilder('WpOrg\Requests\Response')->getMock();
 
         $headers = [
@@ -325,13 +356,22 @@ class FCMDispatcherPushTest extends FCMDispatcherTest
         ];
 
         $url  = 'https://fcm.googleapis.com/v1/projects/fcm-project/messages:send';
-        $post = '{"collapse_key":"abcde-12345","data":{"message":"凄い"},"to":"endpoint"}';
+        $post = '{"collapse_key":"abcde-12345","data":{"message":"凄い"},"token":"endpoint"}';
 
         $options = [
             'timeout'         => 15,
             'connect_timeout' => 15
         ];
 
+        $this->payload->expects($this->once())
+                      ->method('set_token')
+                      ->with('endpoint')
+                      ->willReturnSelf();
+
+        $this->payload->expects($this->once())
+                      ->method('get_json_payload')
+                      ->willReturn($post);
+
         $this->http->expects($this->once())
                    ->method('post')
                    ->with($url, $headers, $post, $options)
diff --git a/src/Lunr/Vortex/FCM/Tests/FCMPayloadBaseTest.php b/src/Lunr/Vortex/FCM/Tests/FCMPayloadBaseTest.php
index 3e8ccc7f70e1fdba6570d387428f222dcae30a86..7feffe50236cb9f62eb5a9662f19bf7787374b76 100644
--- a/src/Lunr/Vortex/FCM/Tests/FCMPayloadBaseTest.php
+++ b/src/Lunr/Vortex/FCM/Tests/FCMPayloadBaseTest.php
@@ -23,7 +23,12 @@ class FCMPayloadBaseTest extends FCMPayloadTest
      */
     public function testElementsIsInitializedWithHighPriority(): void
     {
-        $this->assertPropertySame('elements', [ 'priority' => 'high' ]);
+        $elements = [
+            'android' => [ 'priority' => 'HIGH' ],
+            'apns'    => [ 'headers'  => [ 'apns-priority' => 10 ] ]
+        ];
+
+        $this->assertPropertySame('elements', $elements);
     }
 
 }
diff --git a/src/Lunr/Vortex/FCM/Tests/FCMPayloadGetTest.php b/src/Lunr/Vortex/FCM/Tests/FCMPayloadGetTest.php
index b1e796e6039727d1faa8ebbd77d818b2e9267ce2..5c3cf50ac7c76c7f909b986b7e0baa6c54dd1252 100644
--- a/src/Lunr/Vortex/FCM/Tests/FCMPayloadGetTest.php
+++ b/src/Lunr/Vortex/FCM/Tests/FCMPayloadGetTest.php
@@ -21,24 +21,24 @@ class FCMPayloadGetTest extends FCMPayloadTest
     /**
      * Test get_payload() with collapse_key being present.
      *
-     * @covers Lunr\Vortex\FCM\FCMPayload::get_payload
+     * @covers Lunr\Vortex\FCM\FCMPayload::get_json_payload
      */
-    public function testGetPayloadWithCollapseKey(): void
+    public function testGetJsonPayloadWithCollapseKey(): void
     {
         $file     = TEST_STATICS . '/Vortex/fcm/collapse_key.json';
         $elements = [ 'collapse_key' => 'test' ];
 
         $this->set_reflection_property_value('elements', $elements);
 
-        $this->assertStringMatchesFormatFile($file, $this->class->get_payload());
+        $this->assertStringMatchesFormatFile($file, $this->class->get_json_payload());
     }
 
     /**
-     * Test get_payload() with data being present.
+     * Test get_json_payload() with data being present.
      *
-     * @covers Lunr\Vortex\FCM\FCMPayload::get_payload
+     * @covers Lunr\Vortex\FCM\FCMPayload::get_json_payload
      */
-    public function testGetPayloadWithData(): void
+    public function testGetJsonPayloadWithData(): void
     {
         $file     = TEST_STATICS . '/Vortex/fcm/data.json';
         $elements = [
@@ -50,30 +50,30 @@ class FCMPayloadGetTest extends FCMPayloadTest
 
         $this->set_reflection_property_value('elements', $elements);
 
-        $this->assertStringMatchesFormatFile($file, $this->class->get_payload());
+        $this->assertStringMatchesFormatFile($file, $this->class->get_json_payload());
     }
 
     /**
-     * Test get_payload() with time_to_live being present.
+     * Test get_json_payload() with time_to_live being present.
      *
-     * @covers Lunr\Vortex\FCM\FCMPayload::get_payload
+     * @covers Lunr\Vortex\FCM\FCMPayload::get_json_payload
      */
-    public function testGetPayloadWithTimeToLive(): void
+    public function testGetJsonPayloadWithTimeToLive(): void
     {
         $file     = TEST_STATICS . '/Vortex/fcm/time_to_live.json';
         $elements = [ 'time_to_live' => 10 ];
 
         $this->set_reflection_property_value('elements', $elements);
 
-        $this->assertStringMatchesFormatFile($file, $this->class->get_payload());
+        $this->assertStringMatchesFormatFile($file, $this->class->get_json_payload());
     }
 
     /**
-     * Test get_payload() with everything being present.
+     * Test get_json_payload() with everything being present.
      *
-     * @covers Lunr\Vortex\FCM\FCMPayload::get_payload
+     * @covers Lunr\Vortex\FCM\FCMPayload::get_json_payload
      */
-    public function testGetPayload(): void
+    public function testGetJsonPayload(): void
     {
         $file     = TEST_STATICS . '/Vortex/fcm/fcm.json';
         $elements = [
@@ -88,7 +88,7 @@ class FCMPayloadGetTest extends FCMPayloadTest
 
         $this->set_reflection_property_value('elements', $elements);
 
-        $this->assertStringMatchesFormatFile($file, $this->class->get_payload());
+        $this->assertStringMatchesFormatFile($file, $this->class->get_json_payload());
     }
 
 }
diff --git a/src/Lunr/Vortex/FCM/Tests/FCMPayloadSetTest.php b/src/Lunr/Vortex/FCM/Tests/FCMPayloadSetTest.php
index 56323cfa7494826665dde7aea1c11ea5a4904716..fe29e3624ef3d1d59de88e65c4665e201ea94629 100644
--- a/src/Lunr/Vortex/FCM/Tests/FCMPayloadSetTest.php
+++ b/src/Lunr/Vortex/FCM/Tests/FCMPayloadSetTest.php
@@ -29,8 +29,14 @@ class FCMPayloadSetTest extends FCMPayloadTest
 
         $value = $this->get_reflection_property_value('elements');
 
-        $this->assertArrayHasKey('collapse_key', $value);
-        $this->assertEquals('test', $value['collapse_key']);
+        $this->assertArrayHasKey('android', $value);
+        $this->assertArrayHasKey('collapse_key', $value['android']);
+        $this->assertEquals('test', $value['android']['collapse_key']);
+
+        $this->assertArrayHasKey('apns', $value);
+        $this->assertArrayHasKey('headers', $value['apns']);
+        $this->assertArrayHasKey('apns-collapse-id', $value['apns']['headers']);
+        $this->assertEquals('test', $value['apns']['headers']['apns-collapse-id']);
     }
 
     /**
@@ -54,8 +60,9 @@ class FCMPayloadSetTest extends FCMPayloadTest
 
         $value = $this->get_reflection_property_value('elements');
 
-        $this->assertArrayHasKey('time_to_live', $value);
-        $this->assertEquals(5, $value['time_to_live']);
+        $this->assertArrayHasKey('android', $value);
+        $this->assertArrayHasKey('ttl', $value['android']);
+        $this->assertEquals('5s', $value['android']['ttl']);
     }
 
     /**
@@ -104,8 +111,14 @@ class FCMPayloadSetTest extends FCMPayloadTest
 
         $value = $this->get_reflection_property_value('elements');
 
-        $this->assertArrayHasKey('priority', $value);
-        $this->assertEquals('normal', $value['priority']);
+        $this->assertArrayHasKey('android', $value);
+        $this->assertArrayHasKey('priority', $value['android']);
+        $this->assertEquals('NORMAL', $value['android']['priority']);
+
+        $this->assertArrayHasKey('apns', $value);
+        $this->assertArrayHasKey('headers', $value['apns']);
+        $this->assertArrayHasKey('apns-priority', $value['apns']['headers']);
+        $this->assertEquals(5, $value['apns']['headers']['apns-priority']);
     }
 
     /**
@@ -119,8 +132,14 @@ class FCMPayloadSetTest extends FCMPayloadTest
 
         $value = $this->get_reflection_property_value('elements');
 
-        $this->assertArrayHasKey('priority', $value);
-        $this->assertEquals('high', $value['priority']);
+        $this->assertArrayHasKey('android', $value);
+        $this->assertArrayHasKey('priority', $value['android']);
+        $this->assertEquals('HIGH', $value['android']['priority']);
+
+        $this->assertArrayHasKey('apns', $value);
+        $this->assertArrayHasKey('headers', $value['apns']);
+        $this->assertArrayHasKey('apns-priority', $value['apns']['headers']);
+        $this->assertEquals(10, $value['apns']['headers']['apns-priority']);
     }
 
     /**
@@ -144,8 +163,11 @@ class FCMPayloadSetTest extends FCMPayloadTest
 
         $value = $this->get_reflection_property_value('elements');
 
-        $this->assertArrayHasKey('mutable_content', $value);
-        $this->assertEquals(TRUE, $value['mutable_content']);
+        $this->assertArrayHasKey('apns', $value);
+        $this->assertArrayHasKey('payload', $value['apns']);
+        $this->assertArrayHasKey('aps', $value['apns']['payload']);
+        $this->assertArrayHasKey('mutable-content', $value['apns']['payload']['aps']);
+        $this->assertEquals(1, $value['apns']['payload']['aps']['mutable-content']);
     }
 
     /**
@@ -244,8 +266,11 @@ class FCMPayloadSetTest extends FCMPayloadTest
 
         $value = $this->get_reflection_property_value('elements');
 
-        $this->assertArrayHasKey('content_available', $value);
-        $this->assertEquals(TRUE, $value['content_available']);
+        $this->assertArrayHasKey('apns', $value);
+        $this->assertArrayHasKey('payload', $value['apns']);
+        $this->assertArrayHasKey('aps', $value['apns']['payload']);
+        $this->assertArrayHasKey('content-available', $value['apns']['payload']['aps']);
+        $this->assertEquals(1, $value['apns']['payload']['aps']['content-available']);
     }
 
     /**
@@ -259,9 +284,9 @@ class FCMPayloadSetTest extends FCMPayloadTest
     }
 
     /**
-     * Test set_content_available() works correctly.
+     * Test set_options() works correctly.
      *
-     * @covers \Lunr\Vortex\FCM\FCMPayload::set_content_available
+     * @covers \Lunr\Vortex\FCM\FCMPayload::set_options
      */
     public function testSetOptions()
     {
@@ -277,13 +302,185 @@ class FCMPayloadSetTest extends FCMPayloadTest
     /**
      * Test fluid interface of set_content_available().
      *
-     * @covers \Lunr\Vortex\FCM\FCMPayload::set_content_available
+     * @covers \Lunr\Vortex\FCM\FCMPayload::set_options
      */
     public function testSetOptionsReturnsSelfReference()
     {
         $this->assertSame($this->class, $this->class->set_options('analytics_label', 'fooBar'));
     }
 
+    /**
+     * Test set_token() works correctly.
+     *
+     * @covers \Lunr\Vortex\FCM\FCMPayload::set_token
+     */
+    public function testSetToken()
+    {
+        $this->class->set_token('endpoint_token');
+
+        $value = $this->get_reflection_property_value('elements');
+
+        $this->assertArrayHasKey('token', $value);
+        $this->assertEquals('endpoint_token', $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('endpoint_token'));
+    }
+
+    /**
+     * Test set_category() works correctly.
+     *
+     * @covers \Lunr\Vortex\FCM\FCMPayload::set_category
+     */
+    public function testSetCategory()
+    {
+        $this->class->set_category('category');
+
+        $value = $this->get_reflection_property_value('elements');
+
+        $this->assertArrayHasKey('android', $value);
+        $this->assertArrayHasKey('notification', $value['android']);
+        $this->assertArrayHasKey('click_action', $value['android']['notification']);
+        $this->assertEquals('category', $value['android']['notification']['click_action']);
+
+        $this->assertArrayHasKey('apns', $value);
+        $this->assertArrayHasKey('payload', $value['apns']);
+        $this->assertArrayHasKey('aps', $value['apns']['payload']);
+        $this->assertArrayHasKey('category', $value['apns']['payload']['aps']);
+        $this->assertEquals('category', $value['apns']['payload']['aps']['category']);
+    }
+
+    /**
+     * Test fluid interface of set_category().
+     *
+     * @covers \Lunr\Vortex\FCM\FCMPayload::set_category
+     */
+    public function testSetCategoryReturnsSelfReference()
+    {
+        $this->assertSame($this->class, $this->class->set_category('category'));
+    }
+
+    /**
+     * Test set_tag() works correctly.
+     *
+     * @covers \Lunr\Vortex\FCM\FCMPayload::set_tag
+     */
+    public function testSetTag()
+    {
+        $this->class->set_tag('tag');
+
+        $value = $this->get_reflection_property_value('elements');
+
+        $this->assertArrayHasKey('android', $value);
+        $this->assertArrayHasKey('notification', $value['android']);
+        $this->assertArrayHasKey('tag', $value['android']['notification']);
+        $this->assertEquals('tag', $value['android']['notification']['tag']);
+    }
+
+    /**
+     * Test fluid interface of set_tag().
+     *
+     * @covers \Lunr\Vortex\FCM\FCMPayload::set_tag
+     */
+    public function testSetTagReturnsSelfReference()
+    {
+        $this->assertSame($this->class, $this->class->set_tag('tag'));
+    }
+
+    /**
+     * Test set_color() works correctly.
+     *
+     * @covers \Lunr\Vortex\FCM\FCMPayload::set_color
+     */
+    public function testSetColor()
+    {
+        $this->class->set_color('red');
+
+        $value = $this->get_reflection_property_value('elements');
+
+        $this->assertArrayHasKey('android', $value);
+        $this->assertArrayHasKey('notification', $value['android']);
+        $this->assertArrayHasKey('color', $value['android']['notification']);
+        $this->assertEquals('red', $value['android']['notification']['color']);
+    }
+
+    /**
+     * Test fluid interface of set_color().
+     *
+     * @covers \Lunr\Vortex\FCM\FCMPayload::set_color
+     */
+    public function testSetColorReturnsSelfReference()
+    {
+        $this->assertSame($this->class, $this->class->set_color('red'));
+    }
+
+    /**
+     * Test set_icon() works correctly.
+     *
+     * @covers \Lunr\Vortex\FCM\FCMPayload::set_icon
+     */
+    public function testSetIcon()
+    {
+        $this->class->set_icon('icon');
+
+        $value = $this->get_reflection_property_value('elements');
+
+        $this->assertArrayHasKey('android', $value);
+        $this->assertArrayHasKey('notification', $value['android']);
+        $this->assertArrayHasKey('icon', $value['android']['notification']);
+        $this->assertEquals('icon', $value['android']['notification']['icon']);
+    }
+
+    /**
+     * Test fluid interface of set_icon().
+     *
+     * @covers \Lunr\Vortex\FCM\FCMPayload::set_icon
+     */
+    public function testSetIconReturnsSelfReference()
+    {
+        $this->assertSame($this->class, $this->class->set_icon('icon'));
+    }
+
+    /**
+     * Test set_sound() works correctly.
+     *
+     * @covers \Lunr\Vortex\FCM\FCMPayload::set_sound
+     */
+    public function testSetSound()
+    {
+        $this->class->set_sound('sound');
+
+        $value = $this->get_reflection_property_value('elements');
+
+        $this->assertArrayHasKey('android', $value);
+        $this->assertArrayHasKey('notification', $value['android']);
+        $this->assertArrayHasKey('sound', $value['android']['notification']);
+        $this->assertEquals('sound', $value['android']['notification']['sound']);
+
+        $this->assertArrayHasKey('apns', $value);
+        $this->assertArrayHasKey('payload', $value['apns']);
+        $this->assertArrayHasKey('aps', $value['apns']['payload']);
+        $this->assertArrayHasKey('sound', $value['apns']['payload']['aps']);
+        $this->assertEquals('sound', $value['apns']['payload']['aps']['sound']);
+    }
+
+    /**
+     * Test fluid interface of set_sound().
+     *
+     * @covers \Lunr\Vortex\FCM\FCMPayload::set_sound
+     */
+    public function testSetSoundReturnsSelfReference()
+    {
+        $this->assertSame($this->class, $this->class->set_sound('sound'));
+    }
+
 }
 
 ?>
