diff --git a/composer.json b/composer.json
index 51fd46428523261846d145af089f0f16c2ba9b02..3afbf4913c410b4f43ac7134ff09179cd2858606 100644
--- a/composer.json
+++ b/composer.json
@@ -4,9 +4,11 @@
     "m2mobi/apns-php": "2.0.0beta1",
     "phpmailer/phpmailer": "~6.2.0",
     "rmccue/requests": "~1.7.0",
-    "php": ">=7.2",
+    "php": ">=7.4",
     "lunr/halo": "dev-master",
-    "lunr/config": "dev-master"
+    "lunr/config": "dev-master",
+    "ext-json": "*",
+    "ext-xml": "*"
   },
   "require-dev": {
     "phpunit/phpunit": "~9.0",
diff --git a/src/Lunr/Vortex/APNS/APNSPayload.php b/src/Lunr/Vortex/APNS/APNSPayload.php
index 7993ba8e77c8263751e21e4d99a7a45106943553..f7372ff5cb8f97460ceb158239ca4e50af62dbcd 100644
--- a/src/Lunr/Vortex/APNS/APNSPayload.php
+++ b/src/Lunr/Vortex/APNS/APNSPayload.php
@@ -23,7 +23,7 @@ class APNSPayload
      * Array of Push Notification elements.
      * @var array
      */
-    protected $elements;
+    protected array $elements;
 
     /**
      * Constructor.
@@ -48,7 +48,7 @@ class APNSPayload
      *
      * @return array APNSPayload elements
      */
-    public function get_payload()
+    public function get_payload(): array
     {
         return $this->elements;
     }
@@ -63,7 +63,7 @@ class APNSPayload
      *
      * @return APNSPayload Self Reference
      */
-    public function set_collapse_key($key)
+    public function set_collapse_key(string $key): self
     {
         $this->elements['collapse_key'] = $key;
 
@@ -79,7 +79,7 @@ class APNSPayload
      *
      * @return APNSPayload Self Reference
      */
-    public function set_topic($topic)
+    public function set_topic(string $topic): self
     {
         $this->elements['topic'] = $topic;
 
@@ -93,7 +93,7 @@ class APNSPayload
      *
      * @return APNSPayload Self Reference
      */
-    public function set_priority($priority)
+    public function set_priority(int $priority): self
     {
         $priority       = $priority;
         $priority_class = new ReflectionClass('\Lunr\Vortex\APNS\APNSPriority');
@@ -114,7 +114,7 @@ class APNSPayload
      *
      * @return APNSPayload Self Reference
      */
-    public function set_badge($badge)
+    public function set_badge(int $badge): self
     {
         $this->elements['badge'] = $badge;
 
@@ -128,7 +128,7 @@ class APNSPayload
      *
      * @return APNSPayload Self Reference
      */
-    public function set_sound($sound)
+    public function set_sound(string $sound): self
     {
         $this->elements['sound'] = $sound;
 
@@ -142,7 +142,7 @@ class APNSPayload
      *
      * @return APNSPayload Self Reference
      */
-    public function set_thread_id($thread_id)
+    public function set_thread_id(string $thread_id): self
     {
         $this->elements['thread_id'] = $thread_id;
 
@@ -156,7 +156,7 @@ class APNSPayload
      *
      * @return APNSPayload Self Reference
      */
-    public function set_identifier($identifier)
+    public function set_identifier(string $identifier): self
     {
         $this->elements['identifier'] = $identifier;
 
@@ -170,7 +170,7 @@ class APNSPayload
      *
      * @return APNSPayload Self Reference
      */
-    public function set_category($category)
+    public function set_category(string $category): self
     {
         $this->elements['category'] = $category;
 
@@ -184,7 +184,7 @@ class APNSPayload
      *
      * @return APNSPayload Self Reference
      */
-    public function set_content_available($content_available)
+    public function set_content_available(bool $content_available): self
     {
         $this->elements['content_available'] = $content_available;
 
@@ -198,7 +198,7 @@ class APNSPayload
      *
      * @return APNSPayload Self Reference
      */
-    public function set_mutable_content($mutable_content)
+    public function set_mutable_content(bool $mutable_content): self
     {
         $this->elements['mutable_content'] = $mutable_content;
 
@@ -212,7 +212,7 @@ class APNSPayload
      *
      * @return APNSPayload Self Reference
      */
-    public function set_title($title)
+    public function set_title(string $title): self
     {
         $this->elements['title'] = $title;
 
@@ -226,7 +226,7 @@ class APNSPayload
      *
      * @return APNSPayload Self Reference
      */
-    public function set_body($body)
+    public function set_body(string $body): self
     {
         $this->elements['body'] = $body;
 
@@ -246,7 +246,7 @@ class APNSPayload
      *
      * @return APNSPayload Self Reference
      */
-    public function set_alert($alert)
+    public function set_alert(string $alert): self
     {
         return $this->set_body($alert);
     }
@@ -259,7 +259,7 @@ class APNSPayload
      *
      * @return APNSPayload Self Reference
      */
-    public function set_custom_data($key, $value)
+    public function set_custom_data(string $key, string $value): self
     {
         if (!isset($this->elements['custom_data']))
         {
diff --git a/src/Lunr/Vortex/APNS/APNSPriority.php b/src/Lunr/Vortex/APNS/APNSPriority.php
index d919236461086f5723ee9cd6622ab01e818af008..6a251a68d18334d5312ae9f9adb53669d80068c2 100644
--- a/src/Lunr/Vortex/APNS/APNSPriority.php
+++ b/src/Lunr/Vortex/APNS/APNSPriority.php
@@ -19,15 +19,15 @@ class APNSPriority
 
     /**
      * Deliver notification immediately.
-     * @var string
+     * @var int
      */
-    const HIGH = 10;
+    public const HIGH = 10;
 
     /**
      * Deliver notification with normal priority.
-     * @var string
+     * @var int
      */
-    const NORMAL = 5;
+    public const NORMAL = 5;
 
 }
 
diff --git a/src/Lunr/Vortex/APNS/ApnsPHP/APNSBinaryStatus.php b/src/Lunr/Vortex/APNS/ApnsPHP/APNSBinaryStatus.php
index 5ef13c2394081eee25fddcff3b96f8ef4f4badec..037b45a1bcdb4dfdf702b7f6251f9bede2cb58a1 100644
--- a/src/Lunr/Vortex/APNS/ApnsPHP/APNSBinaryStatus.php
+++ b/src/Lunr/Vortex/APNS/ApnsPHP/APNSBinaryStatus.php
@@ -21,73 +21,73 @@ class APNSBinaryStatus
      * No error encountered.
      * @var integer
      */
-    const SUCCESS = 0;
+    public const SUCCESS = 0;
 
     /**
      * Processing error.
      * @var integer
      */
-    const ERROR_PROCESSING = 1;
+    public const ERROR_PROCESSING = 1;
 
     /**
      * Missing device token error.
      * @var integer
      */
-    const ERROR_MISSING_DEVICE_TOKEN = 2;
+    public const ERROR_MISSING_DEVICE_TOKEN = 2;
 
     /**
      * Missing topic error.
      * @var integer
      */
-    const ERROR_TOPIC = 3;
+    public const ERROR_TOPIC = 3;
 
     /**
      * Missing payload error.
      * @var integer
      */
-    const ERROR_MISSING_PAYLOAD = 4;
+    public const ERROR_MISSING_PAYLOAD = 4;
 
     /**
      * Invalid token size error.
      * @var integer
      */
-    const ERROR_INVALID_TOKEN_SIZE = 5;
+    public const ERROR_INVALID_TOKEN_SIZE = 5;
 
     /**
      * Invalid topic size error.
      * @var integer
      */
-    const ERROR_INVALID_TOPIC_SIZE = 6;
+    public const ERROR_INVALID_TOPIC_SIZE = 6;
 
     /**
      * Invalid payload size error.
      * @var integer
      */
-    const ERROR_INVALID_PAYLOAD_SIZE = 7;
+    public const ERROR_INVALID_PAYLOAD_SIZE = 7;
 
     /**
      * Invalid token error.
      * @var integer
      */
-    const ERROR_INVALID_TOKEN = 8;
+    public const ERROR_INVALID_TOKEN = 8;
 
     /**
      * Shutdown error.
      * @var integer
      */
-    const ERROR_SHUTDOWN = 10;
+    public const ERROR_SHUTDOWN = 10;
 
     /**
      * Protocol error,
      * @var integer
      */
-    const ERROR_PROTOCOL = 128;
+    public const ERROR_PROTOCOL = 128;
 
     /**
      * Unknown error.
      * @var integer
      */
-    const ERROR_UNKNOWN = 255;
+    public const ERROR_UNKNOWN = 255;
 
 }
 
diff --git a/src/Lunr/Vortex/APNS/ApnsPHP/APNSDispatcher.php b/src/Lunr/Vortex/APNS/ApnsPHP/APNSDispatcher.php
index 1b3f2aa1c5eb5928237a47da7f92f085f304d99d..61dc734d40a635fdef8017e66f99f7dad688ae8f 100644
--- a/src/Lunr/Vortex/APNS/ApnsPHP/APNSDispatcher.php
+++ b/src/Lunr/Vortex/APNS/ApnsPHP/APNSDispatcher.php
@@ -16,6 +16,8 @@ use \ApnsPHP_Message_Exception;
 use \ApnsPHP_Exception;
 use Lunr\Vortex\APNS\APNSPayload;
 use Lunr\Vortex\PushNotificationMultiDispatcherInterface;
+use Lunr\Vortex\PushNotificationResponseInterface;
+use Psr\Log\LoggerInterface;
 
 /**
  * Apple Push Notification Service Push Notification Dispatcher.
@@ -27,19 +29,19 @@ class APNSDispatcher implements PushNotificationMultiDispatcherInterface
      * Shared instance of ApnsPHP_Push.
      * @var \ApnsPHP_Push
      */
-    protected $apns_push;
+    protected \ApnsPHP_Push $apns_push;
 
     /**
      * Apns Message instance
      * @var \ApnsPHP_Message
      */
-    protected $apns_message;
+    protected \ApnsPHP_Message $apns_message;
 
     /**
      * Shared instance of a Logger class.
      * @var \Psr\Log\LoggerInterface
      */
-    protected $logger;
+    protected LoggerInterface $logger;
 
     /**
      * Constructor.
@@ -47,7 +49,7 @@ class APNSDispatcher implements PushNotificationMultiDispatcherInterface
      * @param \Psr\Log\LoggerInterface $logger    Shared instance of a Logger.
      * @param \ApnsPHP_Push            $apns_push Apns Push instance.
      */
-    public function __construct($logger, $apns_push)
+    public function __construct(LoggerInterface $logger, \ApnsPHP_Push $apns_push)
     {
         $this->logger    = $logger;
         $this->apns_push = $apns_push;
@@ -70,7 +72,7 @@ class APNSDispatcher implements PushNotificationMultiDispatcherInterface
      *
      * @return void
      */
-    protected function reset()
+    protected function reset(): void
     {
         unset($this->apns_message);
     }
@@ -80,7 +82,7 @@ class APNSDispatcher implements PushNotificationMultiDispatcherInterface
      *
      * @return \ApnsPHP_Message
      */
-    protected function get_new_apns_message()
+    protected function get_new_apns_message(): ApnsPHP_Message
     {
         return new ApnsPHP_Message();
     }
@@ -91,9 +93,9 @@ class APNSDispatcher implements PushNotificationMultiDispatcherInterface
      * @param APNSPayload $payload   Payload object
      * @param array       $endpoints Endpoints to send to in this batch
      *
-     * @return APNSResponse Response object
+     * @return PushNotificationResponseInterface&APNSResponse Response object
      */
-    public function push($payload, &$endpoints)
+    public function push(object $payload, array &$endpoints): PushNotificationResponseInterface
     {
         // Create message
         $payload = $payload->get_payload();
diff --git a/src/Lunr/Vortex/APNS/ApnsPHP/APNSHttpStatus.php b/src/Lunr/Vortex/APNS/ApnsPHP/APNSHttpStatus.php
index b23ad244047f81686ebacefcefafc597bc2eecf0..c6d20a9909ded5235b0adb69d00720c964036611 100644
--- a/src/Lunr/Vortex/APNS/ApnsPHP/APNSHttpStatus.php
+++ b/src/Lunr/Vortex/APNS/ApnsPHP/APNSHttpStatus.php
@@ -21,49 +21,49 @@ class APNSHttpStatus
      * No error encountered.
      * @var integer
      */
-    const SUCCESS = 200;
+    public const SUCCESS = 200;
 
     /**
      * Bad request error.
      * @var integer
      */
-    const ERROR_BAD_REQUEST = 400;
+    public const ERROR_BAD_REQUEST = 400;
 
     /**
      * Certificate or token error.
      * @var integer
      */
-    const ERROR_AUTHENTICATION = 403;
+    public const ERROR_AUTHENTICATION = 403;
 
     /**
      * The device token is inactive for the specified topic.
      * @var integer
      */
-    const ERROR_UNREGISTERED = 410;
+    public const ERROR_UNREGISTERED = 410;
 
     /**
      * The message payload was too large.
      * @var integer
      */
-    const ERROR_PAYLOAD_TOO_LARGE = 413;
+    public const ERROR_PAYLOAD_TOO_LARGE = 413;
 
     /**
      * The provider token is being updated too often.
      * @var integer
      */
-    const TOO_MANY_REQUESTS = 429;
+    public const TOO_MANY_REQUESTS = 429;
 
     /**
      * Unknown internal error.
      * @var integer
      */
-    const ERROR_INTERNAL_ERROR = 500;
+    public const ERROR_INTERNAL_ERROR = 500;
 
     /**
      * Shutdown error.
      * @var integer
      */
-    const ERROR_SHUTDOWN = 503;
+    public const ERROR_SHUTDOWN = 503;
 
 }
 
diff --git a/src/Lunr/Vortex/APNS/ApnsPHP/APNSHttpStatusReason.php b/src/Lunr/Vortex/APNS/ApnsPHP/APNSHttpStatusReason.php
index e858bb040585fb457f9314266203a2b6a02082d2..94e3311925eea3bbc2ffe5822054461c76ae53ae 100644
--- a/src/Lunr/Vortex/APNS/ApnsPHP/APNSHttpStatusReason.php
+++ b/src/Lunr/Vortex/APNS/ApnsPHP/APNSHttpStatusReason.php
@@ -21,91 +21,91 @@ class APNSHttpStatusReason
      * Bad token error.
      * @var string
      */
-    const ERROR_BAD_TOKEN = 'BadDeviceToken';
+    public const ERROR_BAD_TOKEN = 'BadDeviceToken';
 
     /**
      * Bad collapse ID error.
      * @var string
      */
-    const ERROR_BAD_COLLAPSE_ID = 'BadCollapseId';
+    public const ERROR_BAD_COLLAPSE_ID = 'BadCollapseId';
 
     /**
      * Bad expiration date error.
      * @var string
      */
-    const ERROR_BAD_EXPIRATION_DATE = 'BadExpirationDate';
+    public const ERROR_BAD_EXPIRATION_DATE = 'BadExpirationDate';
 
     /**
      * Bad message ID error.
      * @var string
      */
-    const ERROR_BAD_MESSAGE_ID = 'BadMessageId';
+    public const ERROR_BAD_MESSAGE_ID = 'BadMessageId';
 
     /**
      * Bad priority error.
      * @var string
      */
-    const ERROR_BAD_PRIORITY = 'BadPriority';
+    public const ERROR_BAD_PRIORITY = 'BadPriority';
 
     /**
      * Bad topic error.
      * @var string
      */
-    const ERROR_BAD_TOPIC = 'BadTopic';
+    public const ERROR_BAD_TOPIC = 'BadTopic';
 
     /**
      * Token not for current topic error.
      * @var string
      */
-    const ERROR_NON_MATCHING_TOKEN = 'DeviceTokenNotForTopic';
+    public const ERROR_NON_MATCHING_TOKEN = 'DeviceTokenNotForTopic';
 
     /**
      * Idle timeout.
      * @var string
      */
-    const ERROR_IDLE_TIMEOUT = 'IdleTimeout';
+    public const ERROR_IDLE_TIMEOUT = 'IdleTimeout';
 
     /**
      * Topic not allowed error.
      * @var string
      */
-    const ERROR_TOPIC_BLOCKED = 'TopicDisallowed';
+    public const ERROR_TOPIC_BLOCKED = 'TopicDisallowed';
 
     /**
      * Certificate is not valid.
      * @var string
      */
-    const ERROR_CERTIFICATE_INVALID = 'BadCertificate';
+    public const ERROR_CERTIFICATE_INVALID = 'BadCertificate';
 
     /**
      * Certificate does not match requested environment.
      * @var string
      */
-    const ERROR_CERTIFICATE_ENVIRONMENT = 'BadCertificateEnvironment';
+    public const ERROR_CERTIFICATE_ENVIRONMENT = 'BadCertificateEnvironment';
 
     /**
      * JWT Provider token is expired.
      * @var string
      */
-    const ERROR_EXPIRED_AUTH_TOKEN = 'ExpiredProviderToken';
+    public const ERROR_EXPIRED_AUTH_TOKEN = 'ExpiredProviderToken';
 
     /**
      * JWT Provider token is invalid.
      * @var string
      */
-    const ERROR_INVALID_AUTH_TOKEN = 'InvalidProviderToken';
+    public const ERROR_INVALID_AUTH_TOKEN = 'InvalidProviderToken';
 
     /**
      * JWT Provider token is missing.
      * @var string
      */
-    const ERROR_MISSING_AUTH_TOKEN = 'MissingProviderToken';
+    public const ERROR_MISSING_AUTH_TOKEN = 'MissingProviderToken';
 
     /**
      * Action is forbidden.
      * @var string
      */
-    const ERROR_FORBIDDEN = 'Forbidden';
+    public const ERROR_FORBIDDEN = 'Forbidden';
 
 }
 
diff --git a/src/Lunr/Vortex/APNS/ApnsPHP/APNSResponse.php b/src/Lunr/Vortex/APNS/ApnsPHP/APNSResponse.php
index bc22591f1f329e9fc4c06c268f44fb318612d969..fb4b40149efbfaa7a664e5ff55f6ca4c65a716f0 100644
--- a/src/Lunr/Vortex/APNS/ApnsPHP/APNSResponse.php
+++ b/src/Lunr/Vortex/APNS/ApnsPHP/APNSResponse.php
@@ -13,6 +13,7 @@ namespace Lunr\Vortex\APNS\ApnsPHP;
 
 use Lunr\Vortex\PushNotificationStatus;
 use Lunr\Vortex\PushNotificationResponseInterface;
+use Psr\Log\LoggerInterface;
 
 /**
  * Apple Push Notification Service response wrapper.
@@ -24,19 +25,19 @@ class APNSResponse implements PushNotificationResponseInterface
      * Shared instance of a Logger class.
      * @var \Psr\Log\LoggerInterface
      */
-    protected $logger;
+    protected LoggerInterface $logger;
 
     /**
      * The statuses per endpoint.
      * @var array<PushNotificationStatus::*>
      */
-    protected $statuses;
+    protected array $statuses;
 
     /**
      * Raw payload that was sent to APNS.
      * @var string
      */
-    protected $payload;
+    protected string $payload;
 
     /**
      * Constructor.
@@ -47,7 +48,7 @@ class APNSResponse implements PushNotificationResponseInterface
      * @param array                    $errors            The errors response from the APNS Push.
      * @param string                   $payload           Raw payload that was sent to APNS.
      */
-    public function __construct($logger, $endpoints, $invalid_endpoints, $errors, $payload)
+    public function __construct(LoggerInterface $logger, array $endpoints, array $invalid_endpoints, array $errors, string $payload)
     {
         $this->logger   = $logger;
         $this->statuses = [];
@@ -83,7 +84,7 @@ class APNSResponse implements PushNotificationResponseInterface
      *
      * @return void
      */
-    protected function set_statuses($endpoints, $errors)
+    protected function set_statuses(array $endpoints, array $errors): void
     {
         foreach ($errors as $error)
         {
@@ -164,7 +165,7 @@ class APNSResponse implements PushNotificationResponseInterface
      *
      * @return void
      */
-    protected function report_invalid_endpoints(&$invalid_endpoints)
+    protected function report_invalid_endpoints(array &$invalid_endpoints): void
     {
         foreach ($invalid_endpoints as $invalid_endpoint)
         {
@@ -179,7 +180,7 @@ class APNSResponse implements PushNotificationResponseInterface
      *
      * @return void
      */
-    protected function report_error(&$endpoints)
+    protected function report_error(array &$endpoints): void
     {
         foreach ($endpoints as $endpoint)
         {
@@ -197,7 +198,7 @@ class APNSResponse implements PushNotificationResponseInterface
      *
      * @return PushNotificationStatus::* Delivery status for the endpoint
      */
-    public function get_status($endpoint)
+    public function get_status(string $endpoint): int
     {
         return isset($this->statuses[$endpoint]) ? $this->statuses[$endpoint] : PushNotificationStatus::UNKNOWN;
     }
diff --git a/src/Lunr/Vortex/APNS/ApnsPHP/Tests/APNSDispatcherPushTest.php b/src/Lunr/Vortex/APNS/ApnsPHP/Tests/APNSDispatcherPushTest.php
index b2a84f0eed10152544976dad0253de7aad6e2d6a..e81d7eda5dacbfe61be780791099b2cfad3c5b65 100644
--- a/src/Lunr/Vortex/APNS/ApnsPHP/Tests/APNSDispatcherPushTest.php
+++ b/src/Lunr/Vortex/APNS/ApnsPHP/Tests/APNSDispatcherPushTest.php
@@ -58,7 +58,7 @@ class APNSDispatcherPushTest extends APNSDispatcherTest
 
         $this->payload->expects($this->once())
                       ->method('get_payload')
-                      ->willReturn('{"yo"}');
+                      ->willReturn(['yo' => 'data']);
 
         $result = $this->class->push($this->payload, $endpoints);
 
diff --git a/src/Lunr/Vortex/APNS/Tests/APNSPayloadSetTest.php b/src/Lunr/Vortex/APNS/Tests/APNSPayloadSetTest.php
index 58608fd77de641c848e799ad8c635bb8e3177784..960bd661cccec50c6decf25e0b14766de04a450a 100644
--- a/src/Lunr/Vortex/APNS/Tests/APNSPayloadSetTest.php
+++ b/src/Lunr/Vortex/APNS/Tests/APNSPayloadSetTest.php
@@ -231,7 +231,7 @@ class APNSPayloadSetTest extends APNSPayloadTest
      */
     public function testSetBadgeReturnsSelfReference(): void
     {
-        $this->assertSame($this->class, $this->class->set_badge('badge'));
+        $this->assertSame($this->class, $this->class->set_badge(1));
     }
 
     /**
@@ -321,7 +321,7 @@ class APNSPayloadSetTest extends APNSPayloadTest
      */
     public function testSetPriorityReturnsSelfReference(): void
     {
-        $this->assertSame($this->class, $this->class->set_priority('badge'));
+        $this->assertSame($this->class, $this->class->set_priority(5));
     }
 
     /**
diff --git a/src/Lunr/Vortex/Email/EmailDispatcher.php b/src/Lunr/Vortex/Email/EmailDispatcher.php
index 5de1b12ebe85181be3c087c08605eeaefd06d8e0..54d24c4e38176adab6a82bfc0cd2ec4e6fa60e7f 100644
--- a/src/Lunr/Vortex/Email/EmailDispatcher.php
+++ b/src/Lunr/Vortex/Email/EmailDispatcher.php
@@ -12,7 +12,10 @@
 namespace Lunr\Vortex\Email;
 
 use Lunr\Vortex\PushNotificationMultiDispatcherInterface;
+use Lunr\Vortex\PushNotificationResponseInterface;
 use PHPMailer\PHPMailer\Exception as PHPMailerException;
+use PHPMailer\PHPMailer\PHPMailer;
+use Psr\Log\LoggerInterface;
 
 /**
  * Email Notification Dispatcher.
@@ -23,19 +26,19 @@ class EmailDispatcher implements PushNotificationMultiDispatcherInterface
      * Email Notification source.
      * @var string
      */
-    private $source;
+    private string $source;
 
     /**
      * Shared instance of the mail transport class.
      * @var \PHPMailer\PHPMailer\PHPMailer
      */
-    private $mail_transport;
+    private PHPMailer $mail_transport;
 
     /**
      * Shared instance of a Logger class.
      * @var \Psr\Log\LoggerInterface
      */
-    private $logger;
+    private LoggerInterface $logger;
 
     /**
      * Constructor.
@@ -43,7 +46,7 @@ class EmailDispatcher implements PushNotificationMultiDispatcherInterface
      * @param \PHPMailer\PHPMailer\PHPMailer $mail_transport Shared instance of the mail transport class.
      * @param \Psr\Log\LoggerInterface       $logger         Shared instance of a Logger.
      */
-    public function __construct($mail_transport, $logger)
+    public function __construct(PHPMailer $mail_transport, LoggerInterface $logger)
     {
         $this->source = '';
         $this->logger = $logger;
@@ -66,7 +69,7 @@ class EmailDispatcher implements PushNotificationMultiDispatcherInterface
      *
      * @return \PHPMailer\PHPMailer\PHPMailer Cloned instance of the PHPMailer class
      */
-    private function clone_mail()
+    private function clone_mail(): PHPMailer
     {
         return clone $this->mail_transport;
     }
@@ -77,9 +80,9 @@ class EmailDispatcher implements PushNotificationMultiDispatcherInterface
      * @param EmailPayload $payload   Payload object
      * @param array        $endpoints Endpoints to send to in this batch
      *
-     * @return EmailResponse Response object
+     * @return PushNotificationResponseInterface&EmailResponse Response object
      */
-    public function push($payload, &$endpoints)
+    public function push(object $payload, array &$endpoints): PushNotificationResponseInterface
     {
         $payload_array = json_decode($payload->get_payload(), TRUE);
 
@@ -129,7 +132,7 @@ class EmailDispatcher implements PushNotificationMultiDispatcherInterface
      *
      * @return EmailDispatcher Self reference
      */
-    public function set_source($source)
+    public function set_source(string $source): self
     {
         $this->source = $source;
 
diff --git a/src/Lunr/Vortex/Email/EmailPayload.php b/src/Lunr/Vortex/Email/EmailPayload.php
index 7372a5ac56bd9c2f97508a35e8236d7a5a1bca3e..61856801e1793f8b84287f1289724571c114b55a 100644
--- a/src/Lunr/Vortex/Email/EmailPayload.php
+++ b/src/Lunr/Vortex/Email/EmailPayload.php
@@ -21,7 +21,7 @@ class EmailPayload
      * Array of Email Notification message elements.
      * @var array
      */
-    protected $elements;
+    protected array $elements;
 
     /**
      * Constructor.
@@ -44,7 +44,7 @@ class EmailPayload
      *
      * @return string The Email Payload
      */
-    public function get_payload()
+    public function get_payload(): string
     {
         return json_encode($this->elements);
     }
@@ -56,7 +56,7 @@ class EmailPayload
      *
      * @return EmailPayload Self Reference
      */
-    public function set_body($body)
+    public function set_body(string $body): self
     {
         $this->elements['body'] = $body;
 
@@ -70,7 +70,7 @@ class EmailPayload
      *
      * @return EmailPayload Self Reference
      */
-    public function set_subject($subject)
+    public function set_subject(string $subject): self
     {
         $this->elements['subject'] = $subject;
 
diff --git a/src/Lunr/Vortex/Email/EmailResponse.php b/src/Lunr/Vortex/Email/EmailResponse.php
index c8f8c402f4f4569f6a0a7678d116ade4148f7078..54d35f2dc81f7c1c14032dab1f7824425b0e3813 100644
--- a/src/Lunr/Vortex/Email/EmailResponse.php
+++ b/src/Lunr/Vortex/Email/EmailResponse.php
@@ -14,6 +14,7 @@ namespace Lunr\Vortex\Email;
 
 use Lunr\Vortex\PushNotificationStatus;
 use Lunr\Vortex\PushNotificationResponseInterface;
+use Psr\Log\LoggerInterface;
 
 /**
  * Email notification response wrapper.
@@ -25,19 +26,19 @@ class EmailResponse implements PushNotificationResponseInterface
      * Push notification statuses per endpoint.
      * @var array
      */
-    private $statuses;
+    private array $statuses;
 
     /**
      * Shared instance of a Logger class.
      * @var \Psr\Log\LoggerInterface
      */
-    private $logger;
+    private LoggerInterface $logger;
 
     /**
      * Raw payload that was sent out.
      * @var string
      */
-    protected $payload;
+    protected string $payload;
 
     /**
      * Constructor.
@@ -46,7 +47,7 @@ class EmailResponse implements PushNotificationResponseInterface
      * @param \Psr\Log\LoggerInterface $logger       Shared instance of a Logger.
      * @param string                   $payload      Raw payload that was sent out.
      */
-    public function __construct($mail_results, $logger, $payload)
+    public function __construct(array $mail_results, LoggerInterface $logger, string $payload)
     {
         $this->logger   = $logger;
         $this->statuses = [];
@@ -72,7 +73,7 @@ class EmailResponse implements PushNotificationResponseInterface
      *
      * @return PushNotificationStatus::* Delivery status for the endpoint
      */
-    public function get_status($endpoint)
+    public function get_status(string $endpoint): int
     {
         if (!array_key_exists($endpoint, $this->statuses))
         {
@@ -89,7 +90,7 @@ class EmailResponse implements PushNotificationResponseInterface
      *
      * @return void
      */
-    private function handle_sent_notifications($mail_results)
+    private function handle_sent_notifications(array $mail_results): void
     {
         foreach ($mail_results as $endpoint => $result_array)
         {
diff --git a/src/Lunr/Vortex/Email/Tests/EmailDispatcherPushTest.php b/src/Lunr/Vortex/Email/Tests/EmailDispatcherPushTest.php
index fc2c163dbf7f8b7bac3a32261ad5753dc1a4e9ab..1b710173affb11e5dcb18c8148b4285dae6b2a00 100644
--- a/src/Lunr/Vortex/Email/Tests/EmailDispatcherPushTest.php
+++ b/src/Lunr/Vortex/Email/Tests/EmailDispatcherPushTest.php
@@ -53,6 +53,10 @@ class EmailDispatcherPushTest extends EmailDispatcherTest
         $this->mail_transport->expects($this->once())
                              ->method('clearAddresses');
 
+        $this->mail_transport->expects($this->once())
+                             ->method('getSentMIMEMessage')
+                             ->will($this->returnValue(''));
+
         $this->assertInstanceOf('Lunr\Vortex\Email\EmailResponse', $this->class->push($this->payload, $endpoints));
 
         $this->assertEquals($this->mail_transport->Subject, 'subject');
@@ -93,6 +97,10 @@ class EmailDispatcherPushTest extends EmailDispatcherTest
         $this->mail_transport->expects($this->once())
                              ->method('clearAddresses');
 
+        $this->mail_transport->expects($this->once())
+                             ->method('getSentMIMEMessage')
+                             ->will($this->returnValue(''));
+
         $this->assertInstanceOf('Lunr\Vortex\Email\EmailResponse', $this->class->push($this->payload, $endpoints));
 
         $this->assertEquals($this->mail_transport->Subject, 'subject');
@@ -122,6 +130,10 @@ class EmailDispatcherPushTest extends EmailDispatcherTest
                              ->method('send')
                              ->will($this->returnValue(TRUE));
 
+        $this->mail_transport->expects($this->once())
+                             ->method('getSentMIMEMessage')
+                             ->will($this->returnValue(''));
+
         $this->class->push($this->payload, $endpoints);
 
         $this->unmock_method([ $this->class, 'clone_mail' ]);
diff --git a/src/Lunr/Vortex/Email/Tests/EmailDispatcherTest.php b/src/Lunr/Vortex/Email/Tests/EmailDispatcherTest.php
index 2cb56cb5934c77335a38eb76a044102d13866b4b..45a006a1d526526ca314c283a4791731717284ae 100644
--- a/src/Lunr/Vortex/Email/Tests/EmailDispatcherTest.php
+++ b/src/Lunr/Vortex/Email/Tests/EmailDispatcherTest.php
@@ -13,6 +13,7 @@ namespace Lunr\Vortex\Email\Tests;
 
 use Lunr\Vortex\Email\EmailDispatcher;
 use Lunr\Halo\LunrBaseTest;
+use Lunr\Vortex\Email\EmailPayload;
 use ReflectionClass;
 
 /**
diff --git a/src/Lunr/Vortex/FCM/FCMDispatcher.php b/src/Lunr/Vortex/FCM/FCMDispatcher.php
index afabc935168e037a489549d29633c01bf9fbc98e..c91393a1b7420ca1ee94c954023166b9a5d7f406 100644
--- a/src/Lunr/Vortex/FCM/FCMDispatcher.php
+++ b/src/Lunr/Vortex/FCM/FCMDispatcher.php
@@ -12,6 +12,8 @@
 namespace Lunr\Vortex\FCM;
 
 use Lunr\Vortex\PushNotificationMultiDispatcherInterface;
+use Lunr\Vortex\PushNotificationResponseInterface;
+use Psr\Log\LoggerInterface;
 use Requests_Exception;
 use Requests_Response;
 
@@ -25,37 +27,37 @@ class FCMDispatcher implements PushNotificationMultiDispatcherInterface
      * Maximum number of endpoints allowed in one push.
      * @var integer
      */
-    const BATCH_SIZE = 1000;
+    private const BATCH_SIZE = 1000;
 
     /**
      * Push Notification authentication token.
      * @var string
      */
-    protected $auth_token;
+    protected string $auth_token;
 
     /**
      * Shared instance of the Requests_Session class.
      * @var \Requests_Session
      */
-    protected $http;
+    protected \Requests_Session $http;
 
     /**
      * Shared instance of a Logger class.
      * @var \Psr\Log\LoggerInterface
      */
-    protected $logger;
+    protected LoggerInterface $logger;
 
     /**
      * Url to send the FCM push notification to.
      * @var string
      */
-    const GOOGLE_SEND_URL = 'https://fcm.googleapis.com/fcm/send';
+    private const GOOGLE_SEND_URL = 'https://fcm.googleapis.com/fcm/send';
 
     /**
      * Service name.
      * @var string
      */
-    const SERVICE_NAME = 'FCM';
+    private const SERVICE_NAME = 'FCM';
 
     /**
      * Constructor.
@@ -63,7 +65,7 @@ class FCMDispatcher implements PushNotificationMultiDispatcherInterface
      * @param \Requests_Session        $http   Shared instance of the Requests_Session class.
      * @param \Psr\Log\LoggerInterface $logger Shared instance of a Logger.
      */
-    public function __construct($http, $logger)
+    public function __construct(\Requests_Session $http, LoggerInterface $logger)
     {
         $this->http       = $http;
         $this->logger     = $logger;
@@ -85,7 +87,7 @@ class FCMDispatcher implements PushNotificationMultiDispatcherInterface
      *
      * @return FCMResponse
      */
-    public function get_response()
+    public function get_response(): FCMResponse
     {
         return new FCMResponse();
     }
@@ -100,7 +102,7 @@ class FCMDispatcher implements PushNotificationMultiDispatcherInterface
      *
      * @return FCMBatchResponse
      */
-    public function get_batch_response($http_response, $logger, $endpoints, $payload)
+    public function get_batch_response(\Requests_Response $http_response, LoggerInterface $logger, array $endpoints, string $payload): FCMBatchResponse
     {
         return new FCMBatchResponse($http_response, $logger, $endpoints, $payload);
     }
@@ -111,9 +113,9 @@ class FCMDispatcher implements PushNotificationMultiDispatcherInterface
      * @param FCMPayload $payload   Payload object
      * @param array      $endpoints Endpoints to send to in this batch
      *
-     * @return FCMResponse Response object
+     * @return PushNotificationResponseInterface&FCMResponse Response object
      */
-    public function push($payload, &$endpoints)
+    public function push(object $payload, array &$endpoints): PushNotificationResponseInterface
     {
         $gcm_response = $this->get_response();
 
@@ -139,7 +141,7 @@ class FCMDispatcher implements PushNotificationMultiDispatcherInterface
      *
      * @return FCMBatchResponse Response object
      */
-    protected function push_batch($payload, &$endpoints)
+    protected function push_batch(FCMPayload $payload, array &$endpoints)
     {
         $headers = [
             'Content-Type'  => 'application/json',
@@ -180,9 +182,7 @@ class FCMDispatcher implements PushNotificationMultiDispatcherInterface
             }
         }
 
-        $gcm_batch_response = $this->get_batch_response($http_response, $this->logger, $endpoints, json_encode($tmp_payload));
-
-        return $gcm_batch_response;
+        return $this->get_batch_response($http_response, $this->logger, $endpoints, json_encode($tmp_payload));
     }
 
     /**
@@ -192,7 +192,7 @@ class FCMDispatcher implements PushNotificationMultiDispatcherInterface
      *
      * @return FCMDispatcher Self reference
      */
-    public function set_auth_token($auth_token)
+    public function set_auth_token(string $auth_token): self
     {
         $this->auth_token = $auth_token;
 
@@ -204,7 +204,7 @@ class FCMDispatcher implements PushNotificationMultiDispatcherInterface
      *
      * @return \Requests_Response New instance of a Requests_Response object.
      */
-    protected function get_new_response_object_for_failed_request()
+    protected function get_new_response_object_for_failed_request(): \Requests_Response
     {
         $http_response = new Requests_Response();
 
diff --git a/src/Lunr/Vortex/FCM/FCMPayload.php b/src/Lunr/Vortex/FCM/FCMPayload.php
index 140d9f191133dd3e99c9fdac72e019129fe57124..f615730ac0864777fdb654fe70809bd6cf8bf2dc 100644
--- a/src/Lunr/Vortex/FCM/FCMPayload.php
+++ b/src/Lunr/Vortex/FCM/FCMPayload.php
@@ -23,7 +23,7 @@ class FCMPayload
      * Array of Push Notification elements.
      * @var array
      */
-    protected $elements;
+    protected array $elements;
 
     /**
      * Constructor.
@@ -48,7 +48,7 @@ class FCMPayload
      *
      * @return string FCMPayload
      */
-    public function get_payload()
+    public function get_payload(): string
     {
         return json_encode($this->elements);
     }
@@ -63,7 +63,7 @@ class FCMPayload
      *
      * @return FCMPayload Self Reference
      */
-    public function set_collapse_key($key)
+    public function set_collapse_key(string $key): self
     {
         $this->elements['collapse_key'] = $key;
 
@@ -79,7 +79,7 @@ class FCMPayload
      *
      * @return FCMPayload Self Reference
      */
-    public function set_data($data)
+    public function set_data(array $data): self
     {
         $this->elements['data'] = $data;
 
@@ -96,7 +96,7 @@ class FCMPayload
      *
      * @return FCMPayload Self Reference
      */
-    public function set_time_to_live($ttl)
+    public function set_time_to_live(int $ttl): self
     {
         $this->elements['time_to_live'] = $ttl;
 
@@ -108,7 +108,7 @@ class FCMPayload
      *
      * @return boolean TRUE if condition is present.
      */
-    public function has_condition()
+    public function has_condition(): bool
     {
         return isset($this->elements['condition']);
     }
@@ -118,7 +118,7 @@ class FCMPayload
      *
      * @return boolean TRUE if condition is present.
      */
-    public function has_topic()
+    public function has_topic(): bool
     {
         return isset($this->elements['topic']);
     }
@@ -132,7 +132,7 @@ class FCMPayload
      *
      * @return FCMPayload Self Reference
      */
-    public function set_notification($notification)
+    public function set_notification(array $notification): self
     {
         $this->elements['notification'] = $notification;
 
@@ -146,7 +146,7 @@ class FCMPayload
      *
      * @return FCMPayload Self Reference
      */
-    public function set_content_available($val)
+    public function set_content_available(bool $val): self
     {
         $this->elements['content_available'] = $val;
 
@@ -160,7 +160,7 @@ class FCMPayload
      *
      * @return FCMPayload Self Reference
      */
-    public function set_topic($topic)
+    public function set_topic(string $topic): self
     {
         $this->elements['topic'] = $topic;
 
@@ -178,7 +178,7 @@ class FCMPayload
      *
      * @return FCMPayload Self Reference
      */
-    public function set_condition($condition)
+    public function set_condition(string $condition): self
     {
         $this->elements['condition'] = $condition;
 
@@ -192,7 +192,7 @@ class FCMPayload
      *
      * @return FCMPayload Self Reference
      */
-    public function set_mutable_content($mutable)
+    public function set_mutable_content(bool $mutable): self
     {
         $this->elements['mutable_content'] = $mutable;
 
@@ -202,11 +202,11 @@ class FCMPayload
     /**
      * Mark the notification priority.
      *
-     * @param FCMPriority $priority Notification priority value.
+     * @param FCMPriority::* $priority Notification priority value.
      *
      * @return FCMPayload Self Reference
      */
-    public function set_priority($priority)
+    public function set_priority(string $priority): self
     {
         $priority       = strtolower($priority);
         $priority_class = new ReflectionClass('\Lunr\Vortex\FCM\FCMPriority');
@@ -226,7 +226,7 @@ class FCMPayload
      *
      * @return FCMPayload Self Reference
      */
-    public function set_options($key, $value)
+    public function set_options(string $key, string $value): self
     {
         $this->elements['fcm_options'][$key] = $value;
 
diff --git a/src/Lunr/Vortex/FCM/FCMPriority.php b/src/Lunr/Vortex/FCM/FCMPriority.php
index d4d724507574102597c8d2519399720d913fc3d0..5e2414388d12824dc5ace1e3f166d684ffd19b85 100644
--- a/src/Lunr/Vortex/FCM/FCMPriority.php
+++ b/src/Lunr/Vortex/FCM/FCMPriority.php
@@ -21,13 +21,13 @@ class FCMPriority
      * Deliver notification immediately.
      * @var string
      */
-    const HIGH = 'high';
+    public const HIGH = 'high';
 
     /**
      * Deliver notification with normal priority.
      * @var string
      */
-    const NORMAL = 'normal';
+    public const NORMAL = 'normal';
 
 }
 
diff --git a/src/Lunr/Vortex/FCM/FCMResponse.php b/src/Lunr/Vortex/FCM/FCMResponse.php
index 23d1ec9925396ddda2243f3b7eb7564dd67c4cba..7c51cd4210a35439fe527878cd3bd0d6661417d5 100644
--- a/src/Lunr/Vortex/FCM/FCMResponse.php
+++ b/src/Lunr/Vortex/FCM/FCMResponse.php
@@ -24,7 +24,7 @@ class FCMResponse implements PushNotificationResponseInterface
      * The statuses per endpoint.
      * @var array<string, PushNotificationStatus::*>
      */
-    protected $statuses;
+    protected array $statuses;
 
     /**
      * Constructor.
@@ -50,7 +50,7 @@ class FCMResponse implements PushNotificationResponseInterface
      *
      * @return void
      */
-    public function add_batch_response($batch_response, $endpoints)
+    public function add_batch_response(FCMBatchResponse $batch_response, array $endpoints): void
     {
         foreach ($endpoints as $endpoint)
         {
@@ -65,7 +65,7 @@ class FCMResponse implements PushNotificationResponseInterface
      *
      * @return PushNotificationStatus::* Delivery status for the endpoint
      */
-    public function get_status($endpoint)
+    public function get_status(string $endpoint): int
     {
         return isset($this->statuses[$endpoint]) ? $this->statuses[$endpoint] : PushNotificationStatus::UNKNOWN;
     }
diff --git a/src/Lunr/Vortex/FCM/Tests/FCMDispatcherBaseTest.php b/src/Lunr/Vortex/FCM/Tests/FCMDispatcherBaseTest.php
index c2dd4435ac10eba8a3a5ff39cfb3b95ea1531c8d..48cd868a37d80e87c4989e52575564c65a10b276 100644
--- a/src/Lunr/Vortex/FCM/Tests/FCMDispatcherBaseTest.php
+++ b/src/Lunr/Vortex/FCM/Tests/FCMDispatcherBaseTest.php
@@ -75,12 +75,8 @@ class FCMDispatcherBaseTest extends FCMDispatcherTest
      */
     public function testGetBatchResponseReturnsFCMBatchResponseObject(): void
     {
-        $this->http->expects($this->atLeast(1))
-                   ->method('__get')
-                   ->willReturnMap([['status_code', 500]]);
-
         $method = $this->get_accessible_reflection_method('get_batch_response');
-        $result = $method->invokeArgs($this->class, [ $this->http, $this->logger, [ 'endpoint' ], '{}' ]);
+        $result = $method->invokeArgs($this->class, [ $this->response, $this->logger, [ 'endpoint' ], '{}' ]);
 
         $this->assertInstanceOf('Lunr\Vortex\FCM\FCMBatchResponse', $result);
     }
diff --git a/src/Lunr/Vortex/FCM/Tests/FCMDispatcherTest.php b/src/Lunr/Vortex/FCM/Tests/FCMDispatcherTest.php
index 3b774120daeb6ee06737b1a404e8e783c52170ea..32a3ee76a3592cb45af580db928c3ff8c057f0a1 100644
--- a/src/Lunr/Vortex/FCM/Tests/FCMDispatcherTest.php
+++ b/src/Lunr/Vortex/FCM/Tests/FCMDispatcherTest.php
@@ -13,6 +13,7 @@ namespace Lunr\Vortex\FCM\Tests;
 
 use Lunr\Vortex\FCM\FCMDispatcher;
 use Lunr\Halo\LunrBaseTest;
+use Lunr\Vortex\FCM\FCMPayload;
 use ReflectionClass;
 
 /**
@@ -29,6 +30,12 @@ abstract class FCMDispatcherTest extends LunrBaseTest
      */
     protected $http;
 
+    /**
+     * Mock instance of the Requests_Response class.
+     * @var \Requests_Response
+     */
+    protected $response;
+
     /**
      * Mock instance of a Logger class.
      * @var \Psr\Log\LoggerInterface
@@ -46,10 +53,10 @@ abstract class FCMDispatcherTest extends LunrBaseTest
      */
     public function setUp(): void
     {
-        $this->http   = $this->getMockBuilder('Requests_Session')->getMock();
-        $this->logger = $this->getMockBuilder('Psr\Log\LoggerInterface')->getMock();
-
-        $this->payload = $this->getMockBuilder('Lunr\Vortex\FCM\FCMPayload')
+        $this->http     = $this->getMockBuilder('Requests_Session')->getMock();
+        $this->response = $this->getMockBuilder('Requests_Response')->getMock();
+        $this->logger   = $this->getMockBuilder('Psr\Log\LoggerInterface')->getMock();
+        $this->payload  = $this->getMockBuilder('Lunr\Vortex\FCM\FCMPayload')
                               ->disableOriginalConstructor()
                               ->getMock();
 
diff --git a/src/Lunr/Vortex/FCM/Tests/FCMPayloadSetTest.php b/src/Lunr/Vortex/FCM/Tests/FCMPayloadSetTest.php
index 2b636843867d76c7270cf24fcd707c5907638db4..59bd29801e1aed8e7673eaef3bb54040387710b2 100644
--- a/src/Lunr/Vortex/FCM/Tests/FCMPayloadSetTest.php
+++ b/src/Lunr/Vortex/FCM/Tests/FCMPayloadSetTest.php
@@ -66,7 +66,7 @@ class FCMPayloadSetTest extends FCMPayloadTest
      */
     public function testSetTimeToLiveReturnsSelfReference(): void
     {
-        $this->assertSame($this->class, $this->class->set_time_to_live('time_to_live'));
+        $this->assertSame($this->class, $this->class->set_time_to_live(15));
     }
 
     /**
@@ -91,7 +91,7 @@ class FCMPayloadSetTest extends FCMPayloadTest
      */
     public function testSetNotificationReturnsSelfReference(): void
     {
-        $this->assertSame($this->class, $this->class->set_notification('data'));
+        $this->assertSame($this->class, $this->class->set_notification([]));
     }
 
     /**
@@ -181,7 +181,7 @@ class FCMPayloadSetTest extends FCMPayloadTest
      */
     public function testSetDataReturnsSelfReference(): void
     {
-        $this->assertSame($this->class, $this->class->set_data('data'));
+        $this->assertSame($this->class, $this->class->set_data([]));
     }
 
     /**
diff --git a/src/Lunr/Vortex/JPush/JPushBatchResponse.php b/src/Lunr/Vortex/JPush/JPushBatchResponse.php
index e0297cd7507b3475cbad8331691d959958191a84..aa2947ff1ef03c0b9787c6e67e42d4938272a9d8 100644
--- a/src/Lunr/Vortex/JPush/JPushBatchResponse.php
+++ b/src/Lunr/Vortex/JPush/JPushBatchResponse.php
@@ -12,6 +12,7 @@
 namespace Lunr\Vortex\JPush;
 
 use Lunr\Vortex\PushNotificationStatus;
+use Psr\Log\LoggerInterface;
 use Requests_Exception;
 
 /**
@@ -24,43 +25,43 @@ class JPushBatchResponse
      * JPush Report API URL.
      * @var string
      */
-    const JPUSH_REPORT_URL = 'https://report.jpush.cn/v3/status/message';
+    private const JPUSH_REPORT_URL = 'https://report.jpush.cn/v3/status/message';
 
     /**
      * Shared instance of a Logger class.
      * @var \Psr\Log\LoggerInterface
      */
-    private $logger;
+    private LoggerInterface $logger;
 
     /**
      * Shared instance of the Requests_Session class.
      * @var \Requests_Session
      */
-    protected $http;
+    protected \Requests_Session $http;
 
     /**
      * The statuses per endpoint.
      * @var array
      */
-    private $statuses;
+    private array $statuses;
 
     /**
      * Raw payload that was sent to JPush.
      * @var array
      */
-    protected $payload;
+    protected array $payload;
 
     /**
      * Message ID.
      * @var integer
      */
-    protected $message_id;
+    protected int $message_id;
 
     /**
      * Notification endpoints.
      * @var array
      */
-    protected $endpoints;
+    protected array $endpoints;
 
     /**
      * Constructor.
@@ -71,7 +72,7 @@ class JPushBatchResponse
      * @param array                    $endpoints The endpoints the message was sent to (in the same order as sent).
      * @param array                    $payload   Raw payload that was sent to JPush.
      */
-    public function __construct($http, $logger, $response, $endpoints, $payload)
+    public function __construct(\Requests_Session $http, LoggerInterface $logger, \Requests_Response $response, array $endpoints, array $payload)
     {
         $this->statuses  = [];
         $this->http      = $http;
@@ -114,7 +115,7 @@ class JPushBatchResponse
      *
      * @return void
      */
-    private function set_statuses()
+    private function set_statuses(): void
     {
 
         $payload = [
@@ -153,7 +154,7 @@ class JPushBatchResponse
      *
      * @return PushNotificationStatus::* Delivery status for the endpoint
      */
-    public function get_status($endpoint)
+    public function get_status(string $endpoint): int
     {
         if ($this->statuses === [])
         {
@@ -173,7 +174,7 @@ class JPushBatchResponse
      *
      * @return void
      */
-    private function report_error(&$endpoints, $response)
+    private function report_error(array &$endpoints, \Requests_Response $response): void
     {
         $upstream_msg = NULL;
         if (!empty($response->body))
@@ -227,7 +228,7 @@ class JPushBatchResponse
      *
      * @return void
      */
-    private function report_endpoint_error($endpoint, $error_code)
+    private function report_endpoint_error(string $endpoint, string $error_code): void
     {
         switch ($error_code)
         {
diff --git a/src/Lunr/Vortex/JPush/JPushDispatcher.php b/src/Lunr/Vortex/JPush/JPushDispatcher.php
index 3790c2a83112e0ac5327195851ac260375644f69..3d689ec7de3be857a30ce71488504dd667535d41 100644
--- a/src/Lunr/Vortex/JPush/JPushDispatcher.php
+++ b/src/Lunr/Vortex/JPush/JPushDispatcher.php
@@ -12,6 +12,8 @@
 namespace Lunr\Vortex\JPush;
 
 use Lunr\Vortex\PushNotificationMultiDispatcherInterface;
+use Lunr\Vortex\PushNotificationResponseInterface;
+use Psr\Log\LoggerInterface;
 use Requests_Exception;
 use Requests_Response;
 
@@ -25,37 +27,37 @@ class JPushDispatcher implements PushNotificationMultiDispatcherInterface
      * Maximum number of endpoints allowed in one push.
      * @var integer
      */
-    const BATCH_SIZE = 1000;
+    private const BATCH_SIZE = 1000;
 
     /**
      * Url to send the JPush push notification to.
      * @var string
      */
-    const JPUSH_SEND_URL = 'https://api.jpush.cn/v3/push';
+    private const JPUSH_SEND_URL = 'https://api.jpush.cn/v3/push';
 
     /**
      * Service name.
      * @var string
      */
-    const SERVICE_NAME = 'JPush';
+    private const SERVICE_NAME = 'JPush';
 
     /**
      * Push Notification authentication token.
      * @var string|null
      */
-    protected $auth_token;
+    protected ?string $auth_token;
 
     /**
      * Shared instance of the Requests_Session class.
      * @var \Requests_Session
      */
-    protected $http;
+    protected \Requests_Session $http;
 
     /**
      * Shared instance of a Logger class.
      * @var \Psr\Log\LoggerInterface
      */
-    protected $logger;
+    protected LoggerInterface $logger;
 
     /**
      * Constructor.
@@ -63,7 +65,7 @@ class JPushDispatcher implements PushNotificationMultiDispatcherInterface
      * @param \Requests_Session        $http   Shared instance of the Requests_Session class.
      * @param \Psr\Log\LoggerInterface $logger Shared instance of a Logger.
      */
-    public function __construct($http, $logger)
+    public function __construct(\Requests_Session $http, LoggerInterface $logger)
     {
         $this->http       = $http;
         $this->logger     = $logger;
@@ -90,7 +92,7 @@ class JPushDispatcher implements PushNotificationMultiDispatcherInterface
      *
      * @return JPushResponse
      */
-    public function get_response()
+    public function get_response(): JPushResponse
     {
         return new JPushResponse();
     }
@@ -104,7 +106,7 @@ class JPushDispatcher implements PushNotificationMultiDispatcherInterface
      *
      * @return JPushBatchResponse
      */
-    public function get_batch_response($http_response, $endpoints, $payload)
+    public function get_batch_response(Requests_Response $http_response, array $endpoints, array $payload): JPushBatchResponse
     {
         return new JPushBatchResponse($this->http, $this->logger, $http_response, $endpoints, $payload);
     }
@@ -115,9 +117,9 @@ class JPushDispatcher implements PushNotificationMultiDispatcherInterface
      * @param JPushPayload $payload   Payload object
      * @param string[]     $endpoints Endpoints to send to in this batch
      *
-     * @return JPushResponse Response object
+     * @return PushNotificationResponseInterface&JPushResponse Response object
      */
-    public function push($payload, &$endpoints)
+    public function push(object $payload, array &$endpoints): PushNotificationResponseInterface
     {
         $response = $this->get_response();
 
@@ -143,7 +145,7 @@ class JPushDispatcher implements PushNotificationMultiDispatcherInterface
      *
      * @return JPushBatchResponse Response object
      */
-    protected function push_batch($payload, &$endpoints)
+    protected function push_batch(JPushPayload $payload, array &$endpoints): JPushBatchResponse
     {
 
         $tmp_payload = $payload->get_payload();
@@ -177,7 +179,7 @@ class JPushDispatcher implements PushNotificationMultiDispatcherInterface
      *
      * @return JPushDispatcher Self reference
      */
-    public function set_auth_token($auth_token)
+    public function set_auth_token(string $auth_token): self
     {
         $this->auth_token = $auth_token;
 
@@ -194,7 +196,7 @@ class JPushDispatcher implements PushNotificationMultiDispatcherInterface
      *
      * @return \Requests_Response New instance of a Requests_Response object.
      */
-    protected function get_new_response_object_for_failed_request()
+    protected function get_new_response_object_for_failed_request(): Requests_Response
     {
         $http_response = new Requests_Response();
 
diff --git a/src/Lunr/Vortex/JPush/JPushMessagePayload.php b/src/Lunr/Vortex/JPush/JPushMessagePayload.php
index 51ff722a3daf7128696b3974f057598478258150..6c42745f9e8ccf59b72b982dd20518bcc7e783b1 100644
--- a/src/Lunr/Vortex/JPush/JPushMessagePayload.php
+++ b/src/Lunr/Vortex/JPush/JPushMessagePayload.php
@@ -38,7 +38,7 @@ class JPushMessagePayload extends JPushPayload
      *
      * @return array JPushPayload
      */
-    public function get_payload()
+    public function get_payload(): array
     {
         $elements = $this->elements;
 
diff --git a/src/Lunr/Vortex/JPush/JPushNotificationPayload.php b/src/Lunr/Vortex/JPush/JPushNotificationPayload.php
index 0bd14cc9953e3ca58dbc6708f0fe6b3019934b5d..21009b996b8d2777a949a9dd40dd7117a345093d 100644
--- a/src/Lunr/Vortex/JPush/JPushNotificationPayload.php
+++ b/src/Lunr/Vortex/JPush/JPushNotificationPayload.php
@@ -42,7 +42,7 @@ class JPushNotificationPayload extends JPushPayload
      *
      * @return array JPushPayload
      */
-    public function get_payload()
+    public function get_payload(): array
     {
         $elements = $this->elements;
 
@@ -56,9 +56,9 @@ class JPushNotificationPayload extends JPushPayload
      *
      * @param string $sound The notification sound
      *
-     * @return JPushPayload Self Reference
+     * @return JPushNotificationPayload Self Reference
      */
-    public function set_sound($sound)
+    public function set_sound(string $sound): self
     {
         return $this->set_notification_data('sound', $sound);
     }
@@ -68,9 +68,9 @@ class JPushNotificationPayload extends JPushPayload
      *
      * @param boolean $val Value for the "content_available" field.
      *
-     * @return JPushPayload Self Reference
+     * @return JPushNotificationPayload Self Reference
      */
-    public function set_content_available($val)
+    public function set_content_available(bool $val): self
     {
         return $this->set_notification_data('content-available', $val, ['ios']);
     }
@@ -80,9 +80,9 @@ class JPushNotificationPayload extends JPushPayload
      *
      * @param boolean $mutable Notification mutable_content value.
      *
-     * @return JPushPayload Self Reference
+     * @return JPushNotificationPayload Self Reference
      */
-    public function set_mutable_content($mutable)
+    public function set_mutable_content(bool $mutable): self
     {
         return $this->set_notification_data('mutable-content', $mutable, ['ios']);
     }
@@ -90,11 +90,11 @@ class JPushNotificationPayload extends JPushPayload
     /**
      * Mark the notification priority.
      *
-     * @param JPushPriority $priority Notification priority value.
+     * @param JPushPriority::* $priority Notification priority value.
      *
-     * @return JPushPayload Self Reference
+     * @return JPushNotificationPayload Self Reference
      */
-    public function set_priority($priority)
+    public function set_priority(int $priority): self
     {
         $priority_class = new ReflectionClass('\Lunr\Vortex\JPush\JPushPriority');
         $priorities     = array_values($priority_class->getConstants());
diff --git a/src/Lunr/Vortex/JPush/JPushPayload.php b/src/Lunr/Vortex/JPush/JPushPayload.php
index 08a2b46c8cbe0bc933639cfb4e2fe75e812b10f6..622ae6191980a3505eb9a4e12339bdaade11e88c 100644
--- a/src/Lunr/Vortex/JPush/JPushPayload.php
+++ b/src/Lunr/Vortex/JPush/JPushPayload.php
@@ -21,13 +21,13 @@ abstract class JPushPayload
      * Array of Push Notification elements.
      * @var array
      */
-    protected $elements;
+    protected array $elements;
 
     /**
      * Supported push platforms
      * @var array
      */
-    const PLATFORMS = ['ios', 'android'];
+    private const PLATFORMS = ['ios', 'android'];
 
     /**
      * Constructor.
@@ -55,7 +55,7 @@ abstract class JPushPayload
      *
      * @return array JPushPayload
      */
-    public abstract function get_payload();
+    public abstract function get_payload(): array;
 
     /**
      * Sets the notification identifier.
@@ -64,7 +64,7 @@ abstract class JPushPayload
      *
      * @return JPushPayload Self Reference
      */
-    public function set_notification_identifier($identifier)
+    public function set_notification_identifier(string $identifier): self
     {
         $this->elements['cid'] = $identifier;
 
@@ -78,7 +78,7 @@ abstract class JPushPayload
      *
      * @return JPushPayload Self Reference
      */
-    public function set_body($message)
+    public function set_body(string $message): self
     {
         return $this->set_message_data('msg_content', $message)
                     ->set_notification_data('alert', $message);
@@ -91,7 +91,7 @@ abstract class JPushPayload
      *
      * @return JPushPayload Self Reference
      */
-    public function set_title($message)
+    public function set_title(string $message): self
     {
         return $this->set_message_data('title', $message)
                     ->set_notification_data('title', $message, ['android']);
@@ -106,7 +106,7 @@ abstract class JPushPayload
      *
      * @return JPushPayload Self Reference
      */
-    public function set_data($data)
+    public function set_data(array $data): self
     {
         return $this->set_message_data('extras', $data)
                     ->set_notification_data('extras', $data);
@@ -119,7 +119,7 @@ abstract class JPushPayload
      *
      * @return JPushPayload Self Reference
      */
-    public function set_category($category)
+    public function set_category(string $category): self
     {
         return $this->set_message_data('content_type', $category)
                     ->set_notification_data('category', $category);
@@ -135,7 +135,7 @@ abstract class JPushPayload
      *
      * @return JPushPayload Self Reference
      */
-    public function set_time_to_live($ttl)
+    public function set_time_to_live(int $ttl): self
     {
         $this->set_options('time_to_live', $ttl);
 
@@ -152,7 +152,7 @@ abstract class JPushPayload
      *
      * @return JPushPayload Self Reference
      */
-    public function set_collapse_key($key)
+    public function set_collapse_key(string $key): self
     {
         $this->set_options('apns_collapse_id', $key);
 
@@ -167,7 +167,7 @@ abstract class JPushPayload
      *
      * @return JPushPayload Self Reference
      */
-    public function set_options($key, $value)
+    public function set_options(string $key, string $value): self
     {
         if (!isset($this->elements['options']))
         {
@@ -188,7 +188,7 @@ abstract class JPushPayload
      *
      * @return JPushPayload Self Reference
      */
-    protected function set_notification_data($key, $value, $platforms = self::PLATFORMS)
+    protected function set_notification_data(string $key, $value, array $platforms = self::PLATFORMS): self
     {
         foreach ($platforms as $platform)
         {
@@ -206,7 +206,7 @@ abstract class JPushPayload
      *
      * @return JPushPayload Self Reference
      */
-    protected function set_message_data($key, $value)
+    protected function set_message_data(string $key, $value): self
     {
         $this->elements['message'][$key] = $value;
 
diff --git a/src/Lunr/Vortex/JPush/JPushPriority.php b/src/Lunr/Vortex/JPush/JPushPriority.php
index 06200552482706e683758ec7666c86d4b41de403..b6d83c130e2d712c2c5a6fa66487a00b7d76fa7a 100644
--- a/src/Lunr/Vortex/JPush/JPushPriority.php
+++ b/src/Lunr/Vortex/JPush/JPushPriority.php
@@ -19,33 +19,33 @@ class JPushPriority
 
     /**
      * Deliver notification immediately.
-     * @var string
+     * @var int
      */
-    const HIGH = 2;
+    public const HIGH = 2;
 
     /**
      * Deliver notification with medium priority.
-     * @var string
+     * @var int
      */
-    const MEDIUM = 1;
+    public const MEDIUM = 1;
 
     /**
      * Deliver notification with normal priority.
-     * @var string
+     * @var int
      */
-    const NORMAL = 0;
+    public const NORMAL = 0;
 
     /**
      * Deliver notification with low priority.
-     * @var string
+     * @var int
      */
-    const LOW = -1;
+    public const LOW = -1;
 
     /**
      * Deliver notification with no priority.
-     * @var string
+     * @var int
      */
-    const NONE = -2;
+    public const NONE = -2;
 
 }
 
diff --git a/src/Lunr/Vortex/JPush/JPushResponse.php b/src/Lunr/Vortex/JPush/JPushResponse.php
index 5c853a925261821ec8c6881229b5fcdfaf743bfe..956e616d741a8d7b4a4b0f80b8be103fdf37c7ae 100644
--- a/src/Lunr/Vortex/JPush/JPushResponse.php
+++ b/src/Lunr/Vortex/JPush/JPushResponse.php
@@ -24,7 +24,7 @@ class JPushResponse implements PushNotificationResponseInterface
      * The statuses per endpoint.
      * @var array<string,PushNotificationStatus::*>
      */
-    protected $statuses;
+    protected array $statuses;
 
     /**
      * Constructor.
@@ -50,7 +50,7 @@ class JPushResponse implements PushNotificationResponseInterface
      *
      * @return void
      */
-    public function add_batch_response($batch_response, $endpoints)
+    public function add_batch_response(JPushBatchResponse $batch_response, array $endpoints)
     {
         foreach ($endpoints as $endpoint)
         {
@@ -65,7 +65,7 @@ class JPushResponse implements PushNotificationResponseInterface
      *
      * @return PushNotificationStatus::* Delivery status for the endpoint
      */
-    public function get_status($endpoint)
+    public function get_status(string $endpoint): int
     {
         return isset($this->statuses[$endpoint]) ? $this->statuses[$endpoint] : PushNotificationStatus::UNKNOWN;
     }
diff --git a/src/Lunr/Vortex/JPush/Tests/JPushDispatcherBaseTest.php b/src/Lunr/Vortex/JPush/Tests/JPushDispatcherBaseTest.php
index 43bb6cc01490585396a8424e3a2579ff14319381..fe23671a75a83cf993b2f6e998e72961160098a9 100644
--- a/src/Lunr/Vortex/JPush/Tests/JPushDispatcherBaseTest.php
+++ b/src/Lunr/Vortex/JPush/Tests/JPushDispatcherBaseTest.php
@@ -77,12 +77,8 @@ class JPushDispatcherBaseTest extends JPushDispatcherTest
      */
     public function testGetBatchResponseReturnsJPushBatchResponseObject(): void
     {
-        $this->http->expects($this->atLeast(1))
-                   ->method('__get')
-                   ->willReturnMap([['success', FALSE]]);
-
         $method = $this->get_accessible_reflection_method('get_batch_response');
-        $result = $method->invokeArgs($this->class, [ $this->http, $this->logger, [ 'endpoint' ], '{}' ]);
+        $result = $method->invokeArgs($this->class, [ $this->response, [ 'endpoint' ], [] ]);
 
         $this->assertInstanceOf('Lunr\Vortex\JPush\JPushBatchResponse', $result);
     }
diff --git a/src/Lunr/Vortex/JPush/Tests/JPushDispatcherTest.php b/src/Lunr/Vortex/JPush/Tests/JPushDispatcherTest.php
index 86eba3e5cb4c136da3e0a4d70e1689b7d55c1dc3..70c042a7ddac24835cd29889b35ccd5b7009e306 100644
--- a/src/Lunr/Vortex/JPush/Tests/JPushDispatcherTest.php
+++ b/src/Lunr/Vortex/JPush/Tests/JPushDispatcherTest.php
@@ -29,6 +29,11 @@ abstract class JPushDispatcherTest extends LunrBaseTest
      * @var \Requests_Session
      */
     protected $http;
+    /**
+     * Mock instance of the Requests_Response class.
+     * @var \Requests_Response
+     */
+    protected $response;
 
     /**
      * Mock instance of a Logger class.
@@ -47,10 +52,10 @@ abstract class JPushDispatcherTest extends LunrBaseTest
      */
     public function setUp(): void
     {
-        $this->http   = $this->getMockBuilder('Requests_Session')->getMock();
-        $this->logger = $this->getMockBuilder('Psr\Log\LoggerInterface')->getMock();
-
-        $this->payload = $this->getMockBuilder('Lunr\Vortex\JPush\JPushPayload')
+        $this->http     = $this->getMockBuilder('\Requests_Session')->getMock();
+        $this->response = $this->getMockBuilder('\Requests_Response')->getMock();
+        $this->logger   = $this->getMockBuilder('Psr\Log\LoggerInterface')->getMock();
+        $this->payload  = $this->getMockBuilder('Lunr\Vortex\JPush\JPushPayload')
                               ->disableOriginalConstructor()
                               ->getMock();
 
@@ -65,6 +70,7 @@ abstract class JPushDispatcherTest extends LunrBaseTest
     public function tearDown(): void
     {
         unset($this->http);
+        unset($this->response);
         unset($this->logger);
         unset($this->payload);
         unset($this->class);
diff --git a/src/Lunr/Vortex/JPush/Tests/JPushMessagePayloadSetTest.php b/src/Lunr/Vortex/JPush/Tests/JPushMessagePayloadSetTest.php
index 33fb232fa53211b979ae8cb85f0413411b74a0aa..5e113a4522def6f729ad51b30172c2eceeedc64e 100644
--- a/src/Lunr/Vortex/JPush/Tests/JPushMessagePayloadSetTest.php
+++ b/src/Lunr/Vortex/JPush/Tests/JPushMessagePayloadSetTest.php
@@ -66,7 +66,7 @@ class JPushMessagePayloadSetTest extends JPushMessagePayloadTest
      */
     public function testSetTimeToLiveReturnsSelfReference(): void
     {
-        $this->assertSame($this->class, $this->class->set_time_to_live('time_to_live'));
+        $this->assertSame($this->class, $this->class->set_time_to_live(1));
     }
 
     /**
@@ -92,7 +92,7 @@ class JPushMessagePayloadSetTest extends JPushMessagePayloadTest
      */
     public function testSetDataReturnsSelfReference(): void
     {
-        $this->assertSame($this->class, $this->class->set_data('data'));
+        $this->assertSame($this->class, $this->class->set_data([]));
     }
 
     /**
diff --git a/src/Lunr/Vortex/JPush/Tests/JPushNotificationPayloadSetTest.php b/src/Lunr/Vortex/JPush/Tests/JPushNotificationPayloadSetTest.php
index 9e7219692f152951709d041fac7d0fe8577e039d..ff4ef3d98a646870333648c6e691a045c9a2bd6c 100644
--- a/src/Lunr/Vortex/JPush/Tests/JPushNotificationPayloadSetTest.php
+++ b/src/Lunr/Vortex/JPush/Tests/JPushNotificationPayloadSetTest.php
@@ -66,7 +66,7 @@ class JPushNotificationPayloadSetTest extends JPushNotificationPayloadTest
      */
     public function testSetTimeToLiveReturnsSelfReference(): void
     {
-        $this->assertSame($this->class, $this->class->set_time_to_live('time_to_live'));
+        $this->assertSame($this->class, $this->class->set_time_to_live(1));
     }
 
     /**
@@ -91,7 +91,7 @@ class JPushNotificationPayloadSetTest extends JPushNotificationPayloadTest
      */
     public function testSetPriorityInvalid(): void
     {
-        $this->class->set_priority('cow');
+        $this->class->set_priority(25);
 
         $value = $this->get_reflection_property_value('elements');
 
@@ -106,7 +106,7 @@ class JPushNotificationPayloadSetTest extends JPushNotificationPayloadTest
      */
     public function testSetPriorityReturnsSelfReference(): void
     {
-        $this->assertSame($this->class, $this->class->set_priority('high'));
+        $this->assertSame($this->class, $this->class->set_priority(1));
     }
 
     /**
@@ -157,7 +157,7 @@ class JPushNotificationPayloadSetTest extends JPushNotificationPayloadTest
      */
     public function testSetDataReturnsSelfReference(): void
     {
-        $this->assertSame($this->class, $this->class->set_data('data'));
+        $this->assertSame($this->class, $this->class->set_data([]));
     }
 
     /**
diff --git a/src/Lunr/Vortex/MPNS/MPNSDispatcher.php b/src/Lunr/Vortex/MPNS/MPNSDispatcher.php
index 763ba66a4dd75eabd7772517a7df0f2165734659..0e8d1e17819e2975abfd9c672ad699ec2bfe96fa 100644
--- a/src/Lunr/Vortex/MPNS/MPNSDispatcher.php
+++ b/src/Lunr/Vortex/MPNS/MPNSDispatcher.php
@@ -12,6 +12,8 @@
 namespace Lunr\Vortex\MPNS;
 
 use Lunr\Vortex\PushNotificationDispatcherInterface;
+use Lunr\Vortex\PushNotificationResponseInterface;
+use Psr\Log\LoggerInterface;
 use Requests_Exception;
 use Requests_Response;
 
@@ -25,13 +27,13 @@ class MPNSDispatcher implements PushNotificationDispatcherInterface
      * Shared instance of the Requests_Session class.
      * @var \Requests_Session
      */
-    private $http;
+    private \Requests_Session $http;
 
     /**
      * Shared instance of a Logger class.
      * @var \Psr\Log\LoggerInterface
      */
-    private $logger;
+    private LoggerInterface $logger;
 
     /**
      * Constructor.
@@ -39,7 +41,7 @@ class MPNSDispatcher implements PushNotificationDispatcherInterface
      * @param \Requests_Session        $http   Shared instance of the Requests_Session class.
      * @param \Psr\Log\LoggerInterface $logger Shared instance of a Logger.
      */
-    public function __construct($http, $logger)
+    public function __construct(\Requests_Session $http, LoggerInterface $logger)
     {
         $this->http     = $http;
         $this->logger   = $logger;
@@ -60,9 +62,9 @@ class MPNSDispatcher implements PushNotificationDispatcherInterface
      * @param MPNSPayload $payload   Payload object
      * @param array       $endpoints Endpoints to send to in this batch
      *
-     * @return MPNSResponse Response object
+     * @return PushNotificationResponseInterface&MPNSResponse Response object
      */
-    public function push($payload, &$endpoints)
+    public function push(object $payload, array &$endpoints): PushNotificationResponseInterface
     {
         $type = MPNSType::RAW;
         if ($payload instanceof MPNSToastPayload)
@@ -114,7 +116,7 @@ class MPNSDispatcher implements PushNotificationDispatcherInterface
      *
      * @return \Requests_Response New instance of a Requests_Response object.
      */
-    protected function get_new_response_object_for_failed_request($endpoint)
+    protected function get_new_response_object_for_failed_request(string $endpoint): \Requests_Response
     {
         $http_response = new Requests_Response();
 
diff --git a/src/Lunr/Vortex/MPNS/MPNSPayload.php b/src/Lunr/Vortex/MPNS/MPNSPayload.php
index c79ab4b5d41a479f327b3b7f38496ca4404c8837..369f2e8e59b8075b545f100688194cbeade9a74e 100644
--- a/src/Lunr/Vortex/MPNS/MPNSPayload.php
+++ b/src/Lunr/Vortex/MPNS/MPNSPayload.php
@@ -23,13 +23,13 @@ abstract class MPNSPayload
      * Array of Push Notification elements.
      * @var array
      */
-    protected $elements;
+    protected array $elements;
 
     /**
      * Priority of the payload.
-     * @var integer
+     * @var MPNSPriority::*
      */
-    protected $priority = MPNSPriority::DEFAULT;
+    protected int $priority = MPNSPriority::DEFAULT;
 
     /**
      * Constructor.
@@ -55,7 +55,7 @@ abstract class MPNSPayload
      *
      * @return string Escaped string
      */
-    protected function escape_string($string)
+    protected function escape_string(string $string): string
     {
         $search  = [ '&', '<', '>', '‘', '“' ];
         $replace = [ '&amp;', '&lt;', '&gt;', '&apos;', '&quot;' ];
@@ -68,7 +68,7 @@ abstract class MPNSPayload
      *
      * @return string Payload
      */
-    public abstract function get_payload();
+    public abstract function get_payload(): string;
 
     /**
      * Mark the notification priority.
@@ -77,7 +77,7 @@ abstract class MPNSPayload
      *
      * @return MPNSPayload Self Reference
      */
-    public function set_priority($priority)
+    public function set_priority(int $priority): self
     {
         $mpns = new ReflectionClass('\Lunr\Vortex\MPNS\MPNSPriority');
         if (in_array($priority, $mpns->getConstants()))
diff --git a/src/Lunr/Vortex/MPNS/MPNSPriority.php b/src/Lunr/Vortex/MPNS/MPNSPriority.php
index 13dbc3c175831050d645c7cb101ae4b852092cc5..310067c74e6c2cd229312ba283b040a0afba28cc 100644
--- a/src/Lunr/Vortex/MPNS/MPNSPriority.php
+++ b/src/Lunr/Vortex/MPNS/MPNSPriority.php
@@ -21,61 +21,61 @@ class MPNSPriority
      * Initial priority.
      * @var integer
      */
-    const DEFAULT = 0;
+    public const DEFAULT = 0;
 
     /**
      * Deliver Tile notification immediately.
      * @var integer
      */
-    const TILE_IMMEDIATELY = 1;
+    public const TILE_IMMEDIATELY = 1;
 
     /**
      * Deliver Tile notification within 450 seconds.
      * @var integer
      */
-    const TILE_WAIT_450 = 11;
+    public const TILE_WAIT_450 = 11;
 
     /**
      * Deliver Tile notification within 900 seconds.
      * @var integer
      */
-    const TILE_WAIT_900 = 21;
+    public const TILE_WAIT_900 = 21;
 
     /**
      * Deliver Toast notification immediately.
      * @var integer
      */
-    const TOAST_IMMEDIATELY = 2;
+    public const TOAST_IMMEDIATELY = 2;
 
     /**
      * Deliver Toast notification within 450 seconds.
      * @var integer
      */
-    const TOAST_WAIT_450 = 12;
+    public const TOAST_WAIT_450 = 12;
 
     /**
      * Deliver Toast notification within 900 seconds.
      * @var integer
      */
-    const TOAST_WAIT_900 = 22;
+    public const TOAST_WAIT_900 = 22;
 
     /**
      * Deliver Raw notification immediately.
      * @var integer
      */
-    const RAW_IMMEDIATELY = 3;
+    public const RAW_IMMEDIATELY = 3;
 
     /**
      * Deliver Raw notification within 450 seconds.
      * @var integer
      */
-    const RAW_WAIT_450 = 13;
+    public const RAW_WAIT_450 = 13;
 
     /**
      * Deliver Raw notification within 900 seconds.
      * @var integer
      */
-    const RAW_WAIT_900 = 23;
+    public const RAW_WAIT_900 = 23;
 
 }
 
diff --git a/src/Lunr/Vortex/MPNS/MPNSResponse.php b/src/Lunr/Vortex/MPNS/MPNSResponse.php
index a9c6e3fddd8c0ef217339b0042180cae33834249..bcaa2a21d4032dec61299600fd238abbc1999e63 100644
--- a/src/Lunr/Vortex/MPNS/MPNSResponse.php
+++ b/src/Lunr/Vortex/MPNS/MPNSResponse.php
@@ -13,6 +13,7 @@ namespace Lunr\Vortex\MPNS;
 
 use Lunr\Vortex\PushNotificationStatus;
 use Lunr\Vortex\PushNotificationResponseInterface;
+use Psr\Log\LoggerInterface;
 
 /**
  * Windows Phone Push Notification response wrapper.
@@ -22,13 +23,13 @@ class MPNSResponse implements PushNotificationResponseInterface
 
     /**
      * HTTP headers of the response.
-     * @var array
+     * @var \Requests_Response_Headers
      */
-    private $headers;
+    private \Requests_Response_Headers $headers;
 
     /**
      * HTTP status code.
-     * @var integer
+     * @var bool
      */
     private $http_code;
 
@@ -36,19 +37,19 @@ class MPNSResponse implements PushNotificationResponseInterface
      * Delivery status.
      * @var PushNotificationStatus::*
      */
-    private $status;
+    private int $status;
 
     /**
      * Push notification endpoint.
      * @var string
      */
-    private $endpoint;
+    private string $endpoint;
 
     /**
      * Raw payload that was sent to MPNS.
      * @var string
      */
-    protected $payload;
+    protected string $payload;
 
     /**
      * Constructor.
@@ -57,14 +58,16 @@ class MPNSResponse implements PushNotificationResponseInterface
      * @param \Psr\Log\LoggerInterface $logger   Shared instance of a Logger.
      * @param string                   $payload  Raw payload that was sent to MPNS.
      */
-    public function __construct($response, $logger, $payload)
+    public function __construct(\Requests_Response $response, LoggerInterface $logger, string $payload)
     {
         $this->http_code = $response->status_code;
         $this->endpoint  = $response->url;
         $this->payload   = $payload;
 
+
         if ($this->http_code === FALSE)
         {
+            $this->headers = new \Requests_Response_Headers();
             $this->status = PushNotificationStatus::ERROR;
         }
         else
@@ -88,22 +91,26 @@ class MPNSResponse implements PushNotificationResponseInterface
     /**
      * Set response header information.
      *
-     * @param array $headers Response headers
+     * @param \Requests_Response_Headers $headers Response headers
      *
      * @return void
      */
-    private function set_headers($headers)
+    private function set_headers(\Requests_Response_Headers $headers): void
     {
         $this->headers = $headers;
 
         if (in_array($this->http_code, [ 400, 401, 405, 503 ]))
         {
+            unset($this->headers['X-Notificationstatus']);
+            unset($this->headers['X-Deviceconnectionstatus']);
+            unset($this->headers['X-Subscriptionstatus']);
             $this->headers['X-Notificationstatus']     = 'N/A';
             $this->headers['X-Deviceconnectionstatus'] = 'N/A';
             $this->headers['X-Subscriptionstatus']     = 'N/A';
         }
         elseif ($this->http_code === 412)
         {
+            unset($this->headers['X-Subscriptionstatus']);
             $this->headers['X-Subscriptionstatus'] = 'N/A';
         }
     }
@@ -116,7 +123,7 @@ class MPNSResponse implements PushNotificationResponseInterface
      *
      * @return void
      */
-    private function set_status($endpoint, $logger)
+    private function set_status(string $endpoint, LoggerInterface $logger)
     {
         switch ($this->http_code)
         {
@@ -176,7 +183,7 @@ class MPNSResponse implements PushNotificationResponseInterface
      *
      * @return PushNotificationStatus::* Delivery status for the endpoint
      */
-    public function get_status($endpoint)
+    public function get_status(string $endpoint): int
     {
         if ($endpoint != $this->endpoint)
         {
diff --git a/src/Lunr/Vortex/MPNS/MPNSTilePayload.php b/src/Lunr/Vortex/MPNS/MPNSTilePayload.php
index d7290b4726cb2d850118c9e6e2101c80983eac2a..bd036340c31dc4ff1b43c7b5954bb8277500e515 100644
--- a/src/Lunr/Vortex/MPNS/MPNSTilePayload.php
+++ b/src/Lunr/Vortex/MPNS/MPNSTilePayload.php
@@ -38,7 +38,7 @@ class MPNSTilePayload extends MPNSPayload
      *
      * @return string Payload
      */
-    public function get_payload()
+    public function get_payload(): string
     {
         $xml  = "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n";
         $xml .= "<wp:Notification xmlns:wp=\"WPNotification\">\n";
@@ -94,7 +94,7 @@ class MPNSTilePayload extends MPNSPayload
      *
      * @return MPNSTilePayload Self Reference
      */
-    public function set_title($title)
+    public function set_title(string $title): self
     {
         $this->elements['title'] = $this->escape_string($title);
 
@@ -108,7 +108,7 @@ class MPNSTilePayload extends MPNSPayload
      *
      * @return MPNSTilePayload Self Reference
      */
-    public function set_background_image($image)
+    public function set_background_image(string $image): self
     {
         $this->elements['background_image'] = $this->escape_string($image);
 
@@ -122,7 +122,7 @@ class MPNSTilePayload extends MPNSPayload
      *
      * @return MPNSTilePayload Self Reference
      */
-    public function set_count($count)
+    public function set_count(string $count): self
     {
         $this->elements['count'] = $this->escape_string($count);
 
@@ -136,7 +136,7 @@ class MPNSTilePayload extends MPNSPayload
      *
      * @return MPNSTilePayload Self Reference
      */
-    public function set_back_background_image($image)
+    public function set_back_background_image(string $image): self
     {
         $this->elements['back_background_image'] = $this->escape_string($image);
 
@@ -150,7 +150,7 @@ class MPNSTilePayload extends MPNSPayload
      *
      * @return MPNSTilePayload Self Reference
      */
-    public function set_back_title($title)
+    public function set_back_title(string $title): self
     {
         $this->elements['back_title'] = $this->escape_string($title);
 
@@ -164,7 +164,7 @@ class MPNSTilePayload extends MPNSPayload
      *
      * @return MPNSTilePayload Self Reference
      */
-    public function set_back_content($content)
+    public function set_back_content(string $content): self
     {
         $this->elements['back_content'] = $this->escape_string($content);
 
@@ -178,7 +178,7 @@ class MPNSTilePayload extends MPNSPayload
      *
      * @return MPNSTilePayload Self Reference
      */
-    public function set_id($id)
+    public function set_id(string $id): self
     {
         $this->elements['id'] = $this->escape_string($id);
 
diff --git a/src/Lunr/Vortex/MPNS/MPNSToastPayload.php b/src/Lunr/Vortex/MPNS/MPNSToastPayload.php
index f859832116779fa26f48debd04486beeb7a264ea..f7ff27280bb9716cadc6adc1fef451202fc8dc9e 100644
--- a/src/Lunr/Vortex/MPNS/MPNSToastPayload.php
+++ b/src/Lunr/Vortex/MPNS/MPNSToastPayload.php
@@ -11,6 +11,8 @@
 
 namespace Lunr\Vortex\MPNS;
 
+use Psr\Log\LoggerInterface;
+
 /**
  * Windows Phone Toast Push Notification Payload Generator.
  */
@@ -21,14 +23,14 @@ class MPNSToastPayload extends MPNSPayload
      * Shared instance of a Logger.
      * @var \Psr\Log\LoggerInterface
      */
-    private $logger;
+    private LoggerInterface $logger;
 
     /**
      * Constructor.
      *
      * @param \Psr\Log\LoggerInterface $logger Shared instance of a logger
      */
-    public function __construct($logger)
+    public function __construct(LoggerInterface $logger)
     {
         parent::__construct();
 
@@ -50,7 +52,7 @@ class MPNSToastPayload extends MPNSPayload
      *
      * @return string Payload
      */
-    public function get_payload()
+    public function get_payload(): string
     {
         $xml  = "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n";
         $xml .= "<wp:Notification xmlns:wp=\"WPNotification\">\n";
@@ -83,7 +85,7 @@ class MPNSToastPayload extends MPNSPayload
      *
      * @return MPNSToastPayload Self Reference
      */
-    public function set_title($title)
+    public function set_title(string $title): self
     {
         $this->elements['title'] = $this->escape_string($title);
 
@@ -97,7 +99,7 @@ class MPNSToastPayload extends MPNSPayload
      *
      * @return MPNSToastPayload Self Reference
      */
-    public function set_message($message)
+    public function set_message(string $message): self
     {
         $this->elements['message'] = $this->escape_string($message);
 
@@ -111,7 +113,7 @@ class MPNSToastPayload extends MPNSPayload
      *
      * @return MPNSToastPayload Self Reference
      */
-    public function set_deeplink($deeplink)
+    public function set_deeplink(string $deeplink): self
     {
         $deeplink = $this->escape_string($deeplink);
 
diff --git a/src/Lunr/Vortex/MPNS/MPNSType.php b/src/Lunr/Vortex/MPNS/MPNSType.php
index 731669a5d18a085cab6f33cb8bf7681015204ee0..91cfc462389e34ce2f42290505f699f1c8b428d5 100644
--- a/src/Lunr/Vortex/MPNS/MPNSType.php
+++ b/src/Lunr/Vortex/MPNS/MPNSType.php
@@ -21,19 +21,19 @@ class MPNSType
      * Tile notification.
      * @var string
      */
-    const TILE = 'token';
+    public const TILE = 'token';
 
     /**
      * Toast notification.
      * @var string
      */
-    const TOAST = 'toast';
+    public const TOAST = 'toast';
 
     /**
      * Raw notification.
      * @var string
      */
-    const RAW = 'raw';
+    public const RAW = 'raw';
 
 }
 
diff --git a/src/Lunr/Vortex/MPNS/Tests/MPNSDispatcherTest.php b/src/Lunr/Vortex/MPNS/Tests/MPNSDispatcherTest.php
index f52319cf95d95b020fe3aee73fb962f697d17fae..87ed6fb554896f5dad5697674e51a3b7ed904133 100644
--- a/src/Lunr/Vortex/MPNS/Tests/MPNSDispatcherTest.php
+++ b/src/Lunr/Vortex/MPNS/Tests/MPNSDispatcherTest.php
@@ -12,6 +12,7 @@
 namespace Lunr\Vortex\MPNS\Tests;
 
 use Lunr\Vortex\MPNS\MPNSDispatcher;
+use Lunr\Vortex\MPNS\MPNSPayload;
 use Lunr\Vortex\MPNS\MPNSPriority;
 use Lunr\Vortex\MPNS\MPNSType;
 use Lunr\Halo\LunrBaseTest;
diff --git a/src/Lunr/Vortex/MPNS/Tests/MPNSResponseErrorTest.php b/src/Lunr/Vortex/MPNS/Tests/MPNSResponseErrorTest.php
index 3b94189b2634dd4d02bf1a0bd489d0a878b84ca1..90df49a638e721396357f28ca4f194481af2da27 100644
--- a/src/Lunr/Vortex/MPNS/Tests/MPNSResponseErrorTest.php
+++ b/src/Lunr/Vortex/MPNS/Tests/MPNSResponseErrorTest.php
@@ -34,7 +34,7 @@ class MPNSResponseErrorTest extends MPNSResponseTest
      */
     public function testHeadersIsNull(): void
     {
-        $this->assertNull($this->get_reflection_property_value('headers'));
+        $this->assertEquals(new \Requests_Response_Headers(), $this->get_reflection_property_value('headers'));
     }
 
     /**
diff --git a/src/Lunr/Vortex/MPNS/Tests/MPNSResponseSetTest.php b/src/Lunr/Vortex/MPNS/Tests/MPNSResponseSetTest.php
index 5c415eb69b1a2c461c6935f87b16846e42966fcb..72e543b5334c62090bb3a5005df756c8a50eb66b 100644
--- a/src/Lunr/Vortex/MPNS/Tests/MPNSResponseSetTest.php
+++ b/src/Lunr/Vortex/MPNS/Tests/MPNSResponseSetTest.php
@@ -36,7 +36,7 @@ class MPNSResponseSetTest extends MPNSResponseTest
      */
     public function testSetHeadersWithPreconditionFailedStatus(): void
     {
-        $headers = [
+        $in_headers = [
             'Date'                     => '2013-07-05',
             'X-Notificationstatus'     => 'Received',
             'X-Deviceconnectionstatus' => 'Connected',
@@ -46,7 +46,7 @@ class MPNSResponseSetTest extends MPNSResponseTest
         $this->set_reflection_property_value('http_code', 412);
 
         $method = $this->get_accessible_reflection_method('set_headers');
-        $method->invokeArgs($this->class, [ $headers ]);
+        $method->invokeArgs($this->class, [ new \Requests_Response_Headers($in_headers) ]);
 
         $headers = $this->get_reflection_property_value('headers');
 
@@ -65,11 +65,11 @@ class MPNSResponseSetTest extends MPNSResponseTest
      * @param integer $status Special status code
      *
      * @dataProvider specialStatusProvider
-     * @covers       Lunr\Vortex\MPNS\MPNSResponse::set_headers
+     * @covers       \Lunr\Vortex\MPNS\MPNSResponse::set_headers
      */
-    public function testSetHeadersWithSpecialStatusCodes($status): void
+    public function testSetHeadersWithSpecialStatusCodes(int $status): void
     {
-        $headers = [
+        $in_headers = [
             'Date'                     => '2013-07-05',
             'X-Notificationstatus'     => 'Received',
             'X-Deviceconnectionstatus' => 'Connected',
@@ -79,7 +79,7 @@ class MPNSResponseSetTest extends MPNSResponseTest
         $this->set_reflection_property_value('http_code', $status);
 
         $method = $this->get_accessible_reflection_method('set_headers');
-        $method->invokeArgs($this->class, [ $headers ]);
+        $method->invokeArgs($this->class, [ new \Requests_Response_Headers($in_headers) ]);
 
         $headers = $this->get_reflection_property_value('headers');
 
@@ -126,7 +126,7 @@ class MPNSResponseSetTest extends MPNSResponseTest
         $headers['X-Deviceconnectionstatus'] = 'N/A';
         $headers['X-Subscriptionstatus']     = 'N/A';
 
-        $this->set_reflection_property_value('headers', $headers);
+        $this->set_reflection_property_value('headers', new \Requests_Response_Headers($headers));
         $this->set_reflection_property_value('http_code', $code);
 
         $context = [
diff --git a/src/Lunr/Vortex/MPNS/Tests/MPNSResponseTest.php b/src/Lunr/Vortex/MPNS/Tests/MPNSResponseTest.php
index 27b3bd954c39e93c09b508264ec52d8675f7c893..a568c32f1d460096f11c12c1e15cc9f46c5f5067 100644
--- a/src/Lunr/Vortex/MPNS/Tests/MPNSResponseTest.php
+++ b/src/Lunr/Vortex/MPNS/Tests/MPNSResponseTest.php
@@ -40,10 +40,11 @@ abstract class MPNSResponseTest extends LunrBaseTest
     {
         $this->logger = $this->getMockBuilder('Psr\Log\LoggerInterface')->getMock();
 
-        $response = $this->getMockBuilder('Requests_Response')->getMock();
+        $response = $this->getMockBuilder('\Requests_Response')->getMock();
 
         $response->status_code = FALSE;
         $response->url         = 'http://localhost/';
+        $response->headers     = new \Requests_Response_Headers();
 
         $this->class      = new MPNSResponse($response, $this->logger, '<?xml version="1.0" encoding="utf-8"?>');
         $this->reflection = new ReflectionClass('Lunr\Vortex\MPNS\MPNSResponse');
@@ -60,7 +61,7 @@ abstract class MPNSResponseTest extends LunrBaseTest
 
         $response = $this->getMockBuilder('Requests_Response')->getMock();
 
-        $response->headers = [
+        $headers = [
             'Date'                     => '2013-07-05',
             'X-Notificationstatus'     => 'Received',
             'X-Deviceconnectionstatus' => 'Connected',
@@ -69,6 +70,7 @@ abstract class MPNSResponseTest extends LunrBaseTest
 
         $response->status_code = 200;
         $response->url         = 'http://localhost/';
+        $response->headers     = new \Requests_Response_Headers($headers);
 
         $this->class      = new MPNSResponse($response, $this->logger, '<?xml version="1.0" encoding="utf-8"?>');
         $this->reflection = new ReflectionClass('Lunr\Vortex\MPNS\MPNSResponse');
diff --git a/src/Lunr/Vortex/PAP/PAPDispatcher.php b/src/Lunr/Vortex/PAP/PAPDispatcher.php
index 5838a7be481fb3f299ae6891821cfef83da6ab75..d8966c712d5e1860f09e1e08ea0d21f9bd8bf019 100644
--- a/src/Lunr/Vortex/PAP/PAPDispatcher.php
+++ b/src/Lunr/Vortex/PAP/PAPDispatcher.php
@@ -13,6 +13,7 @@
 namespace Lunr\Vortex\PAP;
 
 use Lunr\Vortex\PushNotificationDispatcherInterface;
+use Lunr\Vortex\PushNotificationResponseInterface;
 use Requests_Exception;
 use Requests_Response;
 
@@ -99,9 +100,9 @@ class PAPDispatcher implements PushNotificationDispatcherInterface
      * @param PAPPayload $payload   Payload object
      * @param array      $endpoints Endpoints to send to in this batch
      *
-     * @return PAPResponse Response object
+     * @return PushNotificationResponseInterface&PAPResponse Response object
      */
-    public function push($payload, &$endpoints)
+    public function push(object $payload, array &$endpoints): PushNotificationResponseInterface
     {
         // construct PAP URL
         $pap_url = "https://cp{$this->cid}.pushapi.na.blackberry.com/mss/PD_pushRequest";
diff --git a/src/Lunr/Vortex/PAP/PAPPayload.php b/src/Lunr/Vortex/PAP/PAPPayload.php
index 13a624530f8597a10df0c10e71f2d7966d6a90a0..5e98f8e298850d307a62f4191e44a146a9e454d1 100644
--- a/src/Lunr/Vortex/PAP/PAPPayload.php
+++ b/src/Lunr/Vortex/PAP/PAPPayload.php
@@ -21,7 +21,7 @@ class PAPPayload
      * Array of Push Notification message elements.
      * @var array
      */
-    protected $data;
+    protected array $data;
 
     /**
      * Push Notification deliver before timestamp.
@@ -50,7 +50,7 @@ class PAPPayload
      *
      * @return string The PAP Payload
      */
-    public function get_payload()
+    public function get_payload(): string
     {
         return json_encode($this->data);
     }
@@ -65,7 +65,7 @@ class PAPPayload
      *
      * @return PAPPayload Self Reference
      */
-    public function set_message_data($key, $value)
+    public function set_message_data(string $key, string $value): self
     {
         $this->data[$key] = $value;
 
@@ -79,7 +79,7 @@ class PAPPayload
      *
      * @return PAPPayload Self Reference
      */
-    public function set_priority($priority)
+    public function set_priority(int $priority): self
     {
         $this->priority = $priority;
 
diff --git a/src/Lunr/Vortex/PAP/PAPResponse.php b/src/Lunr/Vortex/PAP/PAPResponse.php
index 4152b5bae4b55bf2314dea0502283bcc3f6a17c1..d7cc27bd2224b9339c8678f425bf33549e3a2f70 100644
--- a/src/Lunr/Vortex/PAP/PAPResponse.php
+++ b/src/Lunr/Vortex/PAP/PAPResponse.php
@@ -14,6 +14,7 @@ namespace Lunr\Vortex\PAP;
 
 use Lunr\Vortex\PushNotificationStatus;
 use Lunr\Vortex\PushNotificationResponseInterface;
+use Psr\Log\LoggerInterface;
 
 /**
  * Google Cloud Messaging Push Notification response wrapper.
@@ -25,37 +26,37 @@ class PAPResponse implements PushNotificationResponseInterface
      * HTTP status code.
      * @var integer
      */
-    private $http_code;
+    private int $http_code;
 
     /**
      * Delivery status.
      * @var PushNotificationStatus::*
      */
-    private $status;
+    private int $status;
 
     /**
      * The HTTP response.
      * @var string
      */
-    private $result;
+    private string $result;
 
     /**
      * The PAP response info.
      * @var array
      */
-    private $pap_response;
+    private array $pap_response;
 
     /**
      * Push notification endpoint.
      * @var string
      */
-    private $endpoint;
+    private string $endpoint;
 
     /**
      * Raw payload that was sent to PAP.
      * @var string
      */
-    protected $payload;
+    protected string $payload;
 
     /**
      * Constructor.
@@ -65,7 +66,7 @@ class PAPResponse implements PushNotificationResponseInterface
      * @param string                   $device_id The deviceID that the message was sent to.
      * @param string                   $payload   Raw payload that was sent to PAP.
      */
-    public function __construct($response, $logger, $device_id, $payload)
+    public function __construct(\Requests_Response $response, LoggerInterface $logger, string $device_id, string $payload)
     {
         $this->http_code    = $response->status_code;
         $this->result       = $response->body;
@@ -155,7 +156,7 @@ class PAPResponse implements PushNotificationResponseInterface
      *
      * @return void
      */
-    private function set_status($endpoint, $logger)
+    private function set_status(string $endpoint, LoggerInterface $logger)
     {
         switch ($this->http_code)
         {
@@ -223,7 +224,7 @@ class PAPResponse implements PushNotificationResponseInterface
      *
      * @return PushNotificationStatus::* Delivery status for the endpoint
      */
-    public function get_status($endpoint)
+    public function get_status(string $endpoint): int
     {
         if ($endpoint != $this->endpoint)
         {
diff --git a/src/Lunr/Vortex/PAP/Tests/PAPDispatcherPushTest.php b/src/Lunr/Vortex/PAP/Tests/PAPDispatcherPushTest.php
index c3543ba194c199fcfb4bd2bb269c39645085d49a..98f2477669b4a11fb4c7dd61be039ca729555249 100644
--- a/src/Lunr/Vortex/PAP/Tests/PAPDispatcherPushTest.php
+++ b/src/Lunr/Vortex/PAP/Tests/PAPDispatcherPushTest.php
@@ -71,9 +71,9 @@ class PAPDispatcherPushTest extends PAPDispatcherTest
         $message = 'Dispatching push notification to {endpoint} failed: {error}';
         $context = [ 'endpoint' => 'endpoint', 'error' => 'Network error!' ];
 
-        $this->logger->expects($this->once())
+        $this->logger->expects($this->exactly(2))
                      ->method('warning')
-                     ->with($message, $context);
+                     ->withConsecutive([$message, $context], ['Parsing response of push notification to {endpoint} failed: {error}']);
 
         $this->assertInstanceOf('Lunr\Vortex\PAP\PAPResponse', $this->class->push($this->payload, $endpoints));
 
@@ -183,9 +183,9 @@ class PAPDispatcherPushTest extends PAPDispatcherTest
         $message = 'Dispatching push notification to {endpoint} failed: {error}';
         $context = [ 'endpoint' => 'endpoint', 'error' => 'Network error!' ];
 
-        $this->logger->expects($this->once())
+        $this->logger->expects($this->exactly(2))
                      ->method('warning')
-                     ->with($message, $context);
+                     ->withConsecutive([$message, $context], ['Parsing response of push notification to {endpoint} failed: {error}']);
 
         $this->class->push($this->payload, $endpoints);
 
diff --git a/src/Lunr/Vortex/PAP/Tests/PAPPayloadSetTest.php b/src/Lunr/Vortex/PAP/Tests/PAPPayloadSetTest.php
index 7e79a4467031555d0e4a39800bfcaafe759ffda9..edbef49458ccecf61b0f1a7b1d1e220aa1ba3292 100644
--- a/src/Lunr/Vortex/PAP/Tests/PAPPayloadSetTest.php
+++ b/src/Lunr/Vortex/PAP/Tests/PAPPayloadSetTest.php
@@ -45,16 +45,16 @@ class PAPPayloadSetTest extends PAPPayloadTest
     }
 
     /**
-     * Test that set_deliver_before_timestamp() sets the deliverbefore.
+     * Test that set_priority() sets the priority.
      *
      * @covers Lunr\Vortex\PAP\PAPPayload::set_priority
      */
     public function testSetPrioritySetsPriority(): void
     {
-        $priority = 'priority';
+        $priority = 1;
         $this->class->set_priority($priority);
 
-        $this->assertPropertyEquals('priority', 'priority');
+        $this->assertPropertyEquals('priority', 1);
     }
 
     /**
@@ -64,8 +64,7 @@ class PAPPayloadSetTest extends PAPPayloadTest
      */
     public function testSetPriorityReturnsSelfReference(): void
     {
-        $cid = 'cid';
-        $this->assertEquals($this->class, $this->class->set_priority($cid));
+        $this->assertEquals($this->class, $this->class->set_priority(2));
     }
 
 }
diff --git a/src/Lunr/Vortex/PAP/Tests/PAPResponseErrorTest.php b/src/Lunr/Vortex/PAP/Tests/PAPResponseErrorTest.php
index bc62143b077ebb7e05e83aa3cb5d3058fbc52663..339087233f0216190e2a7bd169ea1e839ca72e11 100644
--- a/src/Lunr/Vortex/PAP/Tests/PAPResponseErrorTest.php
+++ b/src/Lunr/Vortex/PAP/Tests/PAPResponseErrorTest.php
@@ -50,7 +50,7 @@ class PAPResponseErrorTest extends PAPResponseTest
      */
     public function testHttpCodeIsSetCorrectly(): void
     {
-        $this->assertPropertySame('http_code', FALSE);
+        $this->assertPropertySame('http_code', 0);
     }
 
     /**
diff --git a/src/Lunr/Vortex/PushNotificationDispatcherInterface.php b/src/Lunr/Vortex/PushNotificationDispatcherInterface.php
index 23dceafc7a622f1c6da47daa00fec018adae8698..a6d4f6d0c0e292a4e8285527490556b4fcea59bc 100644
--- a/src/Lunr/Vortex/PushNotificationDispatcherInterface.php
+++ b/src/Lunr/Vortex/PushNotificationDispatcherInterface.php
@@ -27,7 +27,7 @@ interface PushNotificationDispatcherInterface
      *
      * @return PushNotificationResponseInterface Response object
      */
-    public function push($payload, &$endpoints);
+    public function push(object $payload, array &$endpoints): PushNotificationResponseInterface;
 
 }
 
diff --git a/src/Lunr/Vortex/PushNotificationResponseInterface.php b/src/Lunr/Vortex/PushNotificationResponseInterface.php
index eaa6e47c70c79fabb3f89a1a1ca0543bf6f79bf0..27fa5b2f8363377dcb205c3e16d0e73f03ad64f9 100644
--- a/src/Lunr/Vortex/PushNotificationResponseInterface.php
+++ b/src/Lunr/Vortex/PushNotificationResponseInterface.php
@@ -24,7 +24,7 @@ interface PushNotificationResponseInterface
      *
      * @return PushNotificationStatus::* Delivery status for the endpoint
      */
-    public function get_status($endpoint);
+    public function get_status(string $endpoint): int;
 
 }
 
diff --git a/src/Lunr/Vortex/PushNotificationStatus.php b/src/Lunr/Vortex/PushNotificationStatus.php
index 20d4749273d001e92242d4526c90129700dadf93..6ff189d59c6fe2a211e80c336c0c15311cecbbf8 100644
--- a/src/Lunr/Vortex/PushNotificationStatus.php
+++ b/src/Lunr/Vortex/PushNotificationStatus.php
@@ -12,7 +12,7 @@
 namespace Lunr\Vortex;
 
 /**
- * Windows Phone Push Notification Priority Types.
+ * Push notification delivery status.
  */
 class PushNotificationStatus
 {
@@ -21,43 +21,43 @@ class PushNotificationStatus
      * Push notification status unknown.
      * @var integer
      */
-    const UNKNOWN = 0;
+    public const UNKNOWN = 0;
 
     /**
      * Push notification delivered successfully.
      * @var integer
      */
-    const SUCCESS = 1;
+    public const SUCCESS = 1;
 
     /**
      * Push notification could not be delivered. Try again later.
      * @var integer
      */
-    const TEMPORARY_ERROR = 2;
+    public const TEMPORARY_ERROR = 2;
 
     /**
      * Push notification endpoint invalid.
      * @var integer
      */
-    const INVALID_ENDPOINT = 3;
+    public const INVALID_ENDPOINT = 3;
 
     /**
      * Push notification not delivered because of client misconfiguration.
      * @var integer
      */
-    const CLIENT_ERROR = 4;
+    public const CLIENT_ERROR = 4;
 
     /**
      * Push notification not delivered because of server error.
      * @var integer
      */
-    const ERROR = 5;
+    public const ERROR = 5;
 
     /**
      * Push notification not processed by any dispatcher.
      * @var integer
      */
-    const NOT_HANDLED = 6;
+    public const NOT_HANDLED = 6;
 
 }
 
diff --git a/src/Lunr/Vortex/WNS/Tests/WNSResponseErrorTest.php b/src/Lunr/Vortex/WNS/Tests/WNSResponseErrorTest.php
index 2540fbdc7590c5872af18aa815c4607b482e0ad9..ca23930352633174371a706b36a144b513ef5c82 100644
--- a/src/Lunr/Vortex/WNS/Tests/WNSResponseErrorTest.php
+++ b/src/Lunr/Vortex/WNS/Tests/WNSResponseErrorTest.php
@@ -16,7 +16,7 @@ use Lunr\Vortex\PushNotificationStatus;
 /**
  * This class contains tests for failed WNS dispatches.
  *
- * @covers Lunr\Vortex\WNS\WNSResponse
+ * @covers \Lunr\Vortex\WNS\WNSResponse
  */
 class WNSResponseErrorTest extends WNSResponseTest
 {
@@ -34,7 +34,7 @@ class WNSResponseErrorTest extends WNSResponseTest
      */
     public function testHeadersIsNull(): void
     {
-        $this->assertNull($this->get_reflection_property_value('headers'));
+        $this->assertEquals(NULL, $this->get_reflection_property_value('headers'));
     }
 
     /**
diff --git a/src/Lunr/Vortex/WNS/Tests/WNSResponseTest.php b/src/Lunr/Vortex/WNS/Tests/WNSResponseTest.php
index 3a62f8088216dfb6b8a68ed9bd64f03d0825252d..28595206581d8bec31dd98e29dcdafda8a74f0b7 100644
--- a/src/Lunr/Vortex/WNS/Tests/WNSResponseTest.php
+++ b/src/Lunr/Vortex/WNS/Tests/WNSResponseTest.php
@@ -58,7 +58,7 @@ abstract class WNSResponseTest extends LunrBaseTest
     {
         $this->logger = $this->getMockBuilder('Psr\Log\LoggerInterface')->getMock();
 
-        $response = $this->getMockBuilder('Requests_Response')->getMock();
+        $response = $this->getMockBuilder('\Requests_Response')->getMock();
 
         $response->headers = [
             'Date'                         => '2016-01-13',
diff --git a/src/Lunr/Vortex/WNS/WNSBadgePayload.php b/src/Lunr/Vortex/WNS/WNSBadgePayload.php
index bab39fe24f65e383864343ada54f717e863ed805..6b4341bcd0f78f41cda8c1e240dfa958a0dd0b6c 100644
--- a/src/Lunr/Vortex/WNS/WNSBadgePayload.php
+++ b/src/Lunr/Vortex/WNS/WNSBadgePayload.php
@@ -38,7 +38,7 @@ class WNSBadgePayload extends WNSPayload
      *
      * @return string Payload
      */
-    public function get_payload()
+    public function get_payload(): string
     {
         $xml = "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n";
         if (isset($this->elements['value']))
@@ -58,7 +58,7 @@ class WNSBadgePayload extends WNSPayload
      *
      * @return WNSBadgePayload Self Reference
      */
-    public function set_value($value)
+    public function set_value(string $value): self
     {
         $this->elements['value'] = $this->escape_string($value);
 
diff --git a/src/Lunr/Vortex/WNS/WNSDispatcher.php b/src/Lunr/Vortex/WNS/WNSDispatcher.php
index 84ae5d06f4345aee0066ee1efbe3fe28c201b777..882a8b4af4f665c725425b18f2cfe4ff32e74cbc 100644
--- a/src/Lunr/Vortex/WNS/WNSDispatcher.php
+++ b/src/Lunr/Vortex/WNS/WNSDispatcher.php
@@ -13,6 +13,8 @@
 namespace Lunr\Vortex\WNS;
 
 use Lunr\Vortex\PushNotificationDispatcherInterface;
+use Lunr\Vortex\PushNotificationResponseInterface;
+use Psr\Log\LoggerInterface;
 use Requests_Exception;
 use Requests_Response;
 
@@ -25,49 +27,49 @@ class WNSDispatcher implements PushNotificationDispatcherInterface
      * Client Secret to use when obtaining an oauth token
      * @var string|null
      */
-    protected $client_secret;
+    protected ?string $client_secret;
 
     /**
      * Client ID to use when obtaining an oauth token
      * @var string|null
      */
-    protected $client_id;
+    protected ?string $client_id;
 
     /**
      * The authentication token to identify the app channel
      * @var string|null
      */
-    private $oauth_token;
+    private ?string $oauth_token;
 
     /**
      * Push notification type.
      * @var string
      */
-    private $type;
+    private string $type;
 
     /**
      * Shared instance of the Requests_Session class.
      * @var \Requests_Session
      */
-    private $http;
+    private \Requests_Session $http;
 
     /**
      * Shared instance of a Logger class.
      * @var \Psr\Log\LoggerInterface
      */
-    private $logger;
+    private LoggerInterface $logger;
 
     /**
      * The URL to use to request an OAuth token.
      * @var string
      */
-    const TOKEN_URL = 'https://login.live.com/accesstoken.srf';
+    private const TOKEN_URL = 'https://login.live.com/accesstoken.srf';
 
     /**
      * The scope to request the oauth token from.
      * @var string
      */
-    const NOTIFICATION_SCOPE = 'notify.windows.com';
+    private const NOTIFICATION_SCOPE = 'notify.windows.com';
 
     /**
      * Constructor.
@@ -75,7 +77,7 @@ class WNSDispatcher implements PushNotificationDispatcherInterface
      * @param \Requests_Session        $http   Shared instance of the Requests_Session class.
      * @param \Psr\Log\LoggerInterface $logger Shared instance of a Logger.
      */
-    public function __construct($http, $logger)
+    public function __construct(\Requests_Session $http, LoggerInterface $logger)
     {
         $this->http          = $http;
         $this->logger        = $logger;
@@ -104,9 +106,9 @@ class WNSDispatcher implements PushNotificationDispatcherInterface
      * @param WNSPayload $payload   Payload object
      * @param array      $endpoints Endpoints to send to in this batch
      *
-     * @return WNSResponse Response object
+     * @return PushNotificationResponseInterface&WNSResponse Response object
      */
-    public function push($payload, &$endpoints)
+    public function push(object $payload, array &$endpoints): PushNotificationResponseInterface
     {
         if (!isset($this->oauth_token))
         {
@@ -177,7 +179,7 @@ class WNSDispatcher implements PushNotificationDispatcherInterface
      *
      * @return WNSDispatcher Self reference
      */
-    public function set_type($type)
+    public function set_type(string $type): self
     {
         if (in_array($type, [ WNSType::TOAST, WNSType::TILE, WNSType::RAW, WNSType::BADGE ]))
         {
@@ -194,7 +196,7 @@ class WNSDispatcher implements PushNotificationDispatcherInterface
      *
      * @return WNSDispatcher Self reference
      */
-    public function set_client_id($client_id)
+    public function set_client_id(string $client_id): self
     {
         $this->client_id = $client_id;
         return $this;
@@ -207,7 +209,7 @@ class WNSDispatcher implements PushNotificationDispatcherInterface
      *
      * @return WNSDispatcher Self reference
      */
-    public function set_client_secret($client_secret)
+    public function set_client_secret(string $client_secret): self
     {
         $this->client_secret = $client_secret;
         return $this;
@@ -263,7 +265,7 @@ class WNSDispatcher implements PushNotificationDispatcherInterface
      *
      * @return void
      */
-    public function set_oauth_token($token)
+    public function set_oauth_token(string $token): void
     {
         $this->oauth_token = $token;
     }
@@ -275,7 +277,7 @@ class WNSDispatcher implements PushNotificationDispatcherInterface
      *
      * @return \Requests_Response New instance of a Requests_Response object.
      */
-    protected function get_new_response_object_for_failed_request($endpoint)
+    protected function get_new_response_object_for_failed_request(string $endpoint): Requests_Response
     {
         $http_response = new Requests_Response();
 
diff --git a/src/Lunr/Vortex/WNS/WNSPayload.php b/src/Lunr/Vortex/WNS/WNSPayload.php
index 512a2a96d8aa50a91f04a15e88ae7f595b98d18e..0904d8e09f22366a9744fb9c358df1cee9e0519b 100644
--- a/src/Lunr/Vortex/WNS/WNSPayload.php
+++ b/src/Lunr/Vortex/WNS/WNSPayload.php
@@ -21,7 +21,7 @@ abstract class WNSPayload
      * Array of Push Notification elements.
      * @var array
      */
-    protected $elements;
+    protected array $elements;
 
     /**
      * Constructor.
@@ -46,7 +46,7 @@ abstract class WNSPayload
      *
      * @return string Escaped string
      */
-    protected function escape_string($string)
+    protected function escape_string(string $string): string
     {
         $search  = [ '&', '<', '>', '‘', '“' ];
         $replace = [ '&amp;', '&lt;', '&gt;', '&apos;', '&quot;' ];
@@ -59,7 +59,7 @@ abstract class WNSPayload
      *
      * @return string Payload
      */
-    public abstract function get_payload();
+    public abstract function get_payload(): string;
 
 }
 
diff --git a/src/Lunr/Vortex/WNS/WNSResponse.php b/src/Lunr/Vortex/WNS/WNSResponse.php
index b027e4582bc08daffa4d7faed5088528529098b4..c681d948b6cecc4d8cadcd2f86ebb33a6a67726c 100644
--- a/src/Lunr/Vortex/WNS/WNSResponse.php
+++ b/src/Lunr/Vortex/WNS/WNSResponse.php
@@ -12,12 +12,14 @@
 
 namespace Lunr\Vortex\WNS;
 
+use Lunr\Vortex\PushNotificationResponseInterface;
 use Lunr\Vortex\PushNotificationStatus;
+use Psr\Log\LoggerInterface;
 
 /**
  * Windows Push Notification response wrapper.
  */
-class WNSResponse
+class WNSResponse implements PushNotificationResponseInterface
 {
 
     /**
@@ -28,7 +30,7 @@ class WNSResponse
 
     /**
      * HTTP status code.
-     * @var integer
+     * @var mixed
      */
     private $http_code;
 
@@ -36,28 +38,28 @@ class WNSResponse
      * Delivery status.
      * @var PushNotificationStatus::*
      */
-    private $status;
+    private int $status;
 
     /**
      * Push notification endpoint.
      * @var string
      */
-    private $endpoint;
+    private string $endpoint;
 
     /**
      * Raw payload that was sent to WNS.
-     * @var string
+     * @var string|null
      */
-    protected $payload;
+    protected ?string $payload;
 
     /**
      * Constructor.
      *
      * @param \Requests_Response       $response Requests_Response object.
      * @param \Psr\Log\LoggerInterface $logger   Shared instance of a Logger.
-     * @param string                   $payload  Raw payload that was sent to WNS.
+     * @param string|null              $payload  Raw payload that was sent to WNS.
      */
-    public function __construct($response, $logger, $payload)
+    public function __construct(\Requests_Response $response, LoggerInterface $logger, ?string $payload)
     {
         $this->http_code = $response->status_code;
         $this->endpoint  = $response->url;
@@ -93,7 +95,7 @@ class WNSResponse
      *
      * @return void
      */
-    private function set_status($endpoint, $logger)
+    private function set_status(string $endpoint, LoggerInterface $logger)
     {
         switch ($this->http_code)
         {
@@ -157,7 +159,7 @@ class WNSResponse
      *
      * @return PushNotificationStatus::* Delivery status for the endpoint
      */
-    public function get_status($endpoint)
+    public function get_status(string $endpoint): int
     {
         if ($endpoint != $this->endpoint)
         {
diff --git a/src/Lunr/Vortex/WNS/WNSTilePayload.php b/src/Lunr/Vortex/WNS/WNSTilePayload.php
index 4211e74fd9f786ee1150ec6419cf375613b544f0..8a2df1bdcd4a6373eec64dcf33feb29c3fffd547 100644
--- a/src/Lunr/Vortex/WNS/WNSTilePayload.php
+++ b/src/Lunr/Vortex/WNS/WNSTilePayload.php
@@ -38,7 +38,7 @@ class WNSTilePayload extends WNSPayload
      *
      * @return string Payload
      */
-    public function get_payload()
+    public function get_payload(): string
     {
         $inner_xml = '';
         foreach ($this->elements['image'] as $key => $value)
@@ -75,9 +75,9 @@ class WNSTilePayload extends WNSPayload
      *
      * @param integer         $line The line on which to add the text
      *
-     * @return WNSTilePayload Self Reference
+     * @return self Self Reference
      */
-    public function set_text($text, $line = 0)
+    public function set_text($text, int $line = 0): self
     {
         if (!is_array($text))
         {
@@ -100,9 +100,9 @@ class WNSTilePayload extends WNSPayload
      *
      * @param integer         $line  The line on which to add the text
      *
-     * @return WNSTilePayload Self Reference
+     * @return self Self Reference
      */
-    public function set_image($image, $line = 0)
+    public function set_image($image, int $line = 0): self
     {
         if (!is_array($image))
         {
@@ -128,7 +128,7 @@ class WNSTilePayload extends WNSPayload
      *
      * @return WNSTilePayload Self Reference
      */
-    public function set_templates($templates)
+    public function set_templates($templates): self
     {
         if (!is_array($templates))
         {
diff --git a/src/Lunr/Vortex/WNS/WNSToastPayload.php b/src/Lunr/Vortex/WNS/WNSToastPayload.php
index c0046199d7df18243521939f3c8a9933d551de6c..335de39547d0d1de5a9d0576b2c9649c1055a40d 100644
--- a/src/Lunr/Vortex/WNS/WNSToastPayload.php
+++ b/src/Lunr/Vortex/WNS/WNSToastPayload.php
@@ -38,7 +38,7 @@ class WNSToastPayload extends WNSPayload
      *
      * @return string Payload
      */
-    public function get_payload()
+    public function get_payload(): string
     {
         $template = (isset($this->elements['template'])) ? $this->elements['template'] : 'ToastText0' . count($this->elements['text']);
 
@@ -78,9 +78,9 @@ class WNSToastPayload extends WNSPayload
      *
      * @param integer         $line The line on which to add the text
      *
-     * @return \Lunr\Vortex\WNS\WNSToastPayload Self Reference
+     * @return self Self Reference
      */
-    public function set_text($text, $line = 0)
+    public function set_text($text, int $line = 0): self
     {
         if (!is_array($text))
         {
@@ -101,9 +101,9 @@ class WNSToastPayload extends WNSPayload
      *
      * @param string $launch Launch parameters for the app
      *
-     * @return WNSToastPayload Self Reference
+     * @return self Self Reference
      */
-    public function set_launch($launch)
+    public function set_launch(string $launch): self
     {
         $this->elements['launch'] = $this->escape_string($launch);
 
@@ -117,9 +117,9 @@ class WNSToastPayload extends WNSPayload
      *
      * @see https://msdn.microsoft.com/en-us/library/windows/apps/windows.ui.notifications.toasttemplatetype
      *
-     * @return WNSToastPayload Self Reference
+     * @return self Self Reference
      */
-    public function set_template($template)
+    public function set_template(string $template): self
     {
         $this->elements['template'] = $this->escape_string($template);
 
@@ -131,9 +131,9 @@ class WNSToastPayload extends WNSPayload
      *
      * @param string $image Image to display
      *
-     * @return WNSToastPayload Self Reference
+     * @return self Self Reference
      */
-    public function set_image($image)
+    public function set_image(string $image): self
     {
         $this->elements['image'] = $this->escape_string($image);
 
diff --git a/src/Lunr/Vortex/WNS/WNSType.php b/src/Lunr/Vortex/WNS/WNSType.php
index d0f84f57cdf0b00508d8cc23b8aea4704e344396..5dd570cce1ed5b616bb5b1361d9a44ae107c8e6d 100644
--- a/src/Lunr/Vortex/WNS/WNSType.php
+++ b/src/Lunr/Vortex/WNS/WNSType.php
@@ -21,25 +21,25 @@ class WNSType
      * Tile notification.
      * @var string
      */
-    const TILE = 'tile';
+    public const TILE = 'tile';
 
     /**
      * Toast notification.
      * @var string
      */
-    const TOAST = 'toast';
+    public const TOAST = 'toast';
 
     /**
      * Badge notification.
      * @var string
      */
-    const BADGE = 'badge';
+    public const BADGE = 'badge';
 
     /**
      * Raw notification.
      * @var string
      */
-    const RAW = 'raw';
+    public const RAW = 'raw';
 
 }
 
