diff --git a/composer.json b/composer.json
index 89456e7..6999b21 100644
--- a/composer.json
+++ b/composer.json
@@ -12,7 +12,8 @@
         }
     ],
     "require": {
-        "php": ">=5.3.0"
+        "php": "^7.4|^8.0",
+        "ext-json": "*"
     },
     "autoload": {
         "files": [ "flight/autoload.php", "flight/Flight.php" ]
diff --git a/flight/Engine.php b/flight/Engine.php
index 784d431..5ad9238 100644
--- a/flight/Engine.php
+++ b/flight/Engine.php
@@ -1,4 +1,6 @@
 vars = array();
+    public function __construct()
+    {
+        $this->vars = [];
 
         $this->loader = new Loader();
         $this->dispatcher = new Dispatcher();
@@ -80,38 +83,42 @@ class Engine {
     /**
      * Handles calls to class methods.
      *
-     * @param string $name Method name
-     * @param array $params Method parameters
+     * @param string $name   Method name
+     * @param array  $params Method parameters
+     *
+     *@throws Exception
+     *
      * @return mixed Callback results
-     * @throws \Exception
      */
-    public function __call($name, $params) {
+    public function __call(string $name, array $params)
+    {
         $callback = $this->dispatcher->get($name);
 
-        if (is_callable($callback)) {
+        if (\is_callable($callback)) {
             return $this->dispatcher->run($name, $params);
         }
 
         if (!$this->loader->get($name)) {
-            throw new \Exception("{$name} must be a mapped method.");
+            throw new Exception("{$name} must be a mapped method.");
         }
 
-        $shared = (!empty($params)) ? (bool)$params[0] : true;
+        $shared = (!empty($params)) ? (bool) $params[0] : true;
 
         return $this->loader->load($name, $shared);
     }
 
-    /*** Core Methods ***/
+    // Core Methods
 
     /**
      * Initializes the framework.
      */
-    public function init() {
+    public function init(): void
+    {
         static $initialized = false;
         $self = $this;
 
         if ($initialized) {
-            $this->vars = array();
+            $this->vars = [];
             $this->loader->reset();
             $this->dispatcher->reset();
         }
@@ -120,18 +127,18 @@ class Engine {
         $this->loader->register('request', '\flight\net\Request');
         $this->loader->register('response', '\flight\net\Response');
         $this->loader->register('router', '\flight\net\Router');
-        $this->loader->register('view', '\flight\template\View', array(), function($view) use ($self) {
+        $this->loader->register('view', '\flight\template\View', [], function ($view) use ($self) {
             $view->path = $self->get('flight.views.path');
             $view->extension = $self->get('flight.views.extension');
         });
 
         // Register framework methods
-        $methods = array(
-            'start','stop','route','halt','error','notFound',
-            'render','redirect','etag','lastModified','json','jsonp'
-        );
+        $methods = [
+            'start', 'stop', 'route', 'halt', 'error', 'notFound',
+            'render', 'redirect', 'etag', 'lastModified', 'json', 'jsonp',
+        ];
         foreach ($methods as $name) {
-            $this->dispatcher->set($name, array($this, '_'.$name));
+            $this->dispatcher->set($name, [$this, '_' . $name]);
         }
 
         // Default configuration settings
@@ -144,11 +151,11 @@ class Engine {
         $this->set('flight.content_length', true);
 
         // Startup configuration
-        $this->before('start', function() use ($self) {
+        $this->before('start', function () use ($self) {
             // Enable error handling
             if ($self->get('flight.handle_errors')) {
-                set_error_handler(array($self, 'handleError'));
-                set_exception_handler(array($self, 'handleException'));
+                set_error_handler([$self, 'handleError']);
+                set_exception_handler([$self, 'handleException']);
             }
 
             // Set case-sensitivity
@@ -163,24 +170,27 @@ class Engine {
     /**
      * Custom error handler. Converts errors into exceptions.
      *
-     * @param int $errno Error number
-     * @param int $errstr Error string
+     * @param int $errno   Error number
+     * @param int $errstr  Error string
      * @param int $errfile Error file name
      * @param int $errline Error file line number
-     * @throws \ErrorException
+     *
+     * @throws ErrorException
      */
-    public function handleError($errno, $errstr, $errfile, $errline) {
+    public function handleError(int $errno, int $errstr, int $errfile, int $errline)
+    {
         if ($errno & error_reporting()) {
-            throw new \ErrorException($errstr, $errno, 0, $errfile, $errline);
+            throw new ErrorException($errstr, $errno, 0, $errfile, $errline);
         }
     }
 
     /**
      * Custom exception handler. Logs exceptions.
      *
-     * @param \Exception $e Thrown exception
+     * @param Exception $e Thrown exception
      */
-    public function handleException($e) {
+    public function handleException($e): void
+    {
         if ($this->get('flight.log_errors')) {
             error_log($e->getMessage());
         }
@@ -191,13 +201,15 @@ class Engine {
     /**
      * Maps a callback to a framework method.
      *
-     * @param string $name Method name
+     * @param string   $name     Method name
      * @param callback $callback Callback function
-     * @throws \Exception If trying to map over a framework method
+     *
+     * @throws Exception If trying to map over a framework method
      */
-    public function map($name, $callback) {
+    public function map(string $name, callable $callback): void
+    {
         if (method_exists($this, $name)) {
-            throw new \Exception('Cannot override an existing framework method.');
+            throw new Exception('Cannot override an existing framework method.');
         }
 
         $this->dispatcher->set($name, $callback);
@@ -206,15 +218,17 @@ class Engine {
     /**
      * Registers a class to a framework method.
      *
-     * @param string $name Method name
-     * @param string $class Class name
-     * @param array $params Class initialization parameters
-     * @param callback $callback Function to call after object instantiation
-     * @throws \Exception If trying to map over a framework method
+     * @param string        $name     Method name
+     * @param string        $class    Class name
+     * @param array         $params   Class initialization parameters
+     * @param callable|null $callback $callback Function to call after object instantiation
+     *
+     * @throws Exception If trying to map over a framework method
      */
-    public function register($name, $class, array $params = array(), $callback = null) {
+    public function register(string $name, string $class, array $params = [], ?callable $callback = null): void
+    {
         if (method_exists($this, $name)) {
-            throw new \Exception('Cannot override an existing framework method.');
+            throw new Exception('Cannot override an existing framework method.');
         }
 
         $this->loader->register($name, $class, $params, $callback);
@@ -223,48 +237,54 @@ class Engine {
     /**
      * Adds a pre-filter to a method.
      *
-     * @param string $name Method name
+     * @param string   $name     Method name
      * @param callback $callback Callback function
      */
-    public function before($name, $callback) {
+    public function before(string $name, callable $callback): void
+    {
         $this->dispatcher->hook($name, 'before', $callback);
     }
 
     /**
      * Adds a post-filter to a method.
      *
-     * @param string $name Method name
+     * @param string   $name     Method name
      * @param callback $callback Callback function
      */
-    public function after($name, $callback) {
+    public function after(string $name, callable $callback): void
+    {
         $this->dispatcher->hook($name, 'after', $callback);
     }
 
     /**
      * Gets a variable.
      *
-     * @param string $key Key
-     * @return mixed
+     * @param string|null $key Key
+     *
+     * @return array|mixed|null
      */
-    public function get($key = null) {
-        if ($key === null) return $this->vars;
+    public function get(?string $key = null)
+    {
+        if (null === $key) {
+            return $this->vars;
+        }
 
-        return isset($this->vars[$key]) ? $this->vars[$key] : null;
+        return $this->vars[$key] ?? null;
     }
 
     /**
      * Sets a variable.
      *
-     * @param mixed $key Key
-     * @param string $value Value
+     * @param mixed      $key   Key
+     * @param mixed|null $value Value
      */
-    public function set($key, $value = null) {
-        if (is_array($key) || is_object($key)) {
+    public function set($key, $value = null): void
+    {
+        if (\is_array($key) || \is_object($key)) {
             foreach ($key as $k => $v) {
                 $this->vars[$k] = $v;
             }
-        }
-        else {
+        } else {
             $this->vars[$key] = $value;
         }
     }
@@ -273,22 +293,24 @@ class Engine {
      * Checks if a variable has been set.
      *
      * @param string $key Key
+     *
      * @return bool Variable status
      */
-    public function has($key) {
+    public function has(string $key): bool
+    {
         return isset($this->vars[$key]);
     }
 
     /**
      * Unsets a variable. If no key is passed in, clear all variables.
      *
-     * @param string $key Key
+     * @param string|null $key Key
      */
-    public function clear($key = null) {
-        if (is_null($key)) {
-            $this->vars = array();
-        }
-        else {
+    public function clear(?string $key = null): void
+    {
+        if (null === $key) {
+            $this->vars = [];
+        } else {
             unset($this->vars[$key]);
         }
     }
@@ -298,17 +320,20 @@ class Engine {
      *
      * @param string $dir Directory path
      */
-    public function path($dir) {
+    public function path(string $dir): void
+    {
         $this->loader->addDirectory($dir);
     }
 
-    /*** Extensible Methods ***/
+    // Extensible Methods
 
     /**
      * Starts the framework.
-     * @throws \Exception
+     *
+     * @throws Exception
      */
-    public function _start() {
+    public function _start(): void
+    {
         $dispatched = false;
         $self = $this;
         $request = $this->request();
@@ -316,7 +341,7 @@ class Engine {
         $router = $this->router();
 
         // Allow filters to run
-        $this->after('start', function() use ($self) {
+        $this->after('start', function () use ($self) {
             $self->stop();
         });
 
@@ -345,7 +370,9 @@ class Engine {
 
             $dispatched = true;
 
-            if (!$continue) break;
+            if (!$continue) {
+                break;
+            }
 
             $router->next();
 
@@ -360,14 +387,16 @@ class Engine {
     /**
      * Stops the framework and outputs the current response.
      *
-     * @param int $code HTTP status code
-     * @throws \Exception
+     * @param int|null $code HTTP status code
+     *
+     * @throws Exception
      */
-    public function _stop($code = null) {
+    public function _stop(?int $code = null): void
+    {
         $response = $this->response();
 
         if (!$response->sent()) {
-            if ($code !== null) {
+            if (null !== $code) {
                 $response->status($code);
             }
 
@@ -380,21 +409,23 @@ class Engine {
     /**
      * Routes a URL to a callback function.
      *
-     * @param string $pattern URL pattern to match
-     * @param callback $callback Callback function
-     * @param boolean $pass_route Pass the matching route object to the callback
+     * @param string   $pattern    URL pattern to match
+     * @param callback $callback   Callback function
+     * @param bool     $pass_route Pass the matching route object to the callback
      */
-    public function _route($pattern, $callback, $pass_route = false) {
+    public function _route(string $pattern, callable $callback, bool $pass_route = false): void
+    {
         $this->router()->map($pattern, $callback, $pass_route);
     }
 
     /**
      * Stops processing and returns a given response.
      *
-     * @param int $code HTTP status code
+     * @param int    $code    HTTP status code
      * @param string $message Response message
      */
-    public function _halt($code = 200, $message = '') {
+    public function _halt(int $code = 200, string $message = ''): void
+    {
         $this->response()
             ->clear()
             ->status($code)
@@ -406,11 +437,12 @@ class Engine {
     /**
      * Sends an HTTP 500 response for any errors.
      *
-     * @param \Exception|\Throwable $e Thrown exception
+     * @param Exception|Throwable $e Thrown exception
      */
-    public function _error($e) {
-        $msg = sprintf('
500 Internal Server Error
'.
-            '%s (%s)
'.
+    public function _error($e): void
+    {
+        $msg = sprintf('500 Internal Server Error
' .
+            '%s (%s)
' .
             '%s
',
             $e->getMessage(),
             $e->getCode(),
@@ -423,10 +455,9 @@ class Engine {
                 ->status(500)
                 ->write($msg)
                 ->send();
-        }
-        catch (\Throwable $t) { // PHP 7.0+
+        } catch (Throwable $t) { // PHP 7.0+
             exit($msg);
-        } catch(\Exception $e) { // PHP < 7
+        } catch (Exception $e) { // PHP < 7
             exit($msg);
         }
     }
@@ -434,13 +465,14 @@ class Engine {
     /**
      * Sends an HTTP 404 response when a URL is not found.
      */
-    public function _notFound() {
+    public function _notFound(): void
+    {
         $this->response()
             ->clear()
             ->status(404)
             ->write(
-                '404 Not Found
'.
-                'The page you have requested could not be found.
'.
+                '404 Not Found
' .
+                'The page you have requested could not be found.
' .
                 str_repeat(' ', 512)
             )
             ->send();
@@ -449,18 +481,19 @@ class Engine {
     /**
      * Redirects the current request to another URL.
      *
-     * @param string $url URL
-     * @param int $code HTTP status code
+     * @param string $url  URL
+     * @param int    $code HTTP status code
      */
-    public function _redirect($url, $code = 303) {
+    public function _redirect(string $url, int $code = 303): void
+    {
         $base = $this->get('flight.base_url');
 
-        if ($base === null) {
+        if (null === $base) {
             $base = $this->request()->base;
         }
 
         // Append base url to redirect url
-        if ($base != '/' && strpos($url, '://') === false) {
+        if ('/' != $base && false === strpos($url, '://')) {
             $url = $base . preg_replace('#/+#', '/', '/' . $url);
         }
 
@@ -474,16 +507,17 @@ class Engine {
     /**
      * Renders a template.
      *
-     * @param string $file Template file
-     * @param array $data Template data
-     * @param string $key View variable name
-     * @throws \Exception
+     * @param string      $file Template file
+     * @param array|null  $data Template data
+     * @param string|null $key  View variable name
+     *
+     * @throws Exception
      */
-    public function _render($file, $data = null, $key = null) {
-        if ($key !== null) {
+    public function _render(string $file, ?array $data = null, ?string $key = null): void
+    {
+        if (null !== $key) {
             $this->view()->set($key, $this->view()->fetch($file, $data));
-        }
-        else {
+        } else {
             $this->view()->render($file, $data);
         }
     }
@@ -491,67 +525,70 @@ class Engine {
     /**
      * Sends a JSON response.
      *
-     * @param mixed $data JSON data
-     * @param int $code HTTP status code
-     * @param bool $encode Whether to perform JSON encoding
+     * @param mixed  $data    JSON data
+     * @param int    $code    HTTP status code
+     * @param bool   $encode  Whether to perform JSON encoding
      * @param string $charset Charset
-     * @param int $option Bitmask Json constant such as JSON_HEX_QUOT
-     * @throws \Exception
+     * @param int    $option  Bitmask Json constant such as JSON_HEX_QUOT
+     *
+     * @throws Exception
      */
     public function _json(
         $data,
-        $code = 200,
-        $encode = true,
-        $charset = 'utf-8',
-        $option = 0
-    ) {
+        int $code = 200,
+        bool $encode = true,
+        string $charset = 'utf-8',
+        int $option = 0
+    ): void {
         $json = ($encode) ? json_encode($data, $option) : $data;
 
         $this->response()
             ->status($code)
-            ->header('Content-Type', 'application/json; charset='.$charset)
+            ->header('Content-Type', 'application/json; charset=' . $charset)
             ->write($json)
             ->send();
     }
-	
+
     /**
      * Sends a JSONP response.
      *
-     * @param mixed $data JSON data
-     * @param string $param Query parameter that specifies the callback name.
-     * @param int $code HTTP status code
-     * @param bool $encode Whether to perform JSON encoding
+     * @param mixed  $data    JSON data
+     * @param string $param   Query parameter that specifies the callback name.
+     * @param int    $code    HTTP status code
+     * @param bool   $encode  Whether to perform JSON encoding
      * @param string $charset Charset
-     * @param int $option Bitmask Json constant such as JSON_HEX_QUOT
-     * @throws \Exception
+     * @param int    $option  Bitmask Json constant such as JSON_HEX_QUOT
+     *
+     * @throws Exception
      */
     public function _jsonp(
         $data,
-        $param = 'jsonp',
-        $code = 200,
-        $encode = true,
-        $charset = 'utf-8',
-        $option = 0
-    ) {
+        string $param = 'jsonp',
+        int $code = 200,
+        bool $encode = true,
+        string $charset = 'utf-8',
+        int $option = 0
+    ): void {
         $json = ($encode) ? json_encode($data, $option) : $data;
 
         $callback = $this->request()->query[$param];
 
         $this->response()
             ->status($code)
-            ->header('Content-Type', 'application/javascript; charset='.$charset)
-            ->write($callback.'('.$json.');')
+            ->header('Content-Type', 'application/javascript; charset=' . $charset)
+            ->write($callback . '(' . $json . ');')
             ->send();
     }
 
     /**
      * Handles ETag HTTP caching.
      *
-     * @param string $id ETag identifier
+     * @param string $id   ETag identifier
      * @param string $type ETag type
      */
-    public function _etag($id, $type = 'strong') {
-        $id = (($type === 'weak') ? 'W/' : '').$id;
+    public function _etag(string $id, string $type = 'strong'): void
+    {
+        $id = (('weak' === $type) ? 'W/' : '') . $id;
 
         $this->response()->header('ETag', $id);
 
@@ -566,7 +603,8 @@ class Engine {
      *
      * @param int $time Unix timestamp
      */
-    public function _lastModified($time) {
+    public function _lastModified(int $time): void
+    {
         $this->response()->header('Last-Modified', gmdate('D, d M Y H:i:s \G\M\T', $time));
 
         if (isset($_SERVER['HTTP_IF_MODIFIED_SINCE']) &&
diff --git a/flight/Flight.php b/flight/Flight.php
index 1f75cde..101c455 100644
--- a/flight/Flight.php
+++ b/flight/Flight.php
@@ -1,4 +1,6 @@
 events[$name] = $callback;
     }
 
@@ -70,19 +75,23 @@ class Dispatcher {
      * Gets an assigned callback.
      *
      * @param string $name Event name
+     *
      * @return callback $callback Callback function
      */
-    public function get($name) {
-        return isset($this->events[$name]) ? $this->events[$name] : null;
+    public function get(string $name): ?callable
+    {
+        return $this->events[$name] ?? null;
     }
 
     /**
      * Checks if an event has been set.
      *
      * @param string $name Event name
+     *
      * @return bool Event status
      */
-    public function has($name) {
+    public function has(string $name): bool
+    {
         return isset($this->events[$name]);
     }
 
@@ -90,27 +99,28 @@ class Dispatcher {
      * Clears an event. If no name is given,
      * all events are removed.
      *
-     * @param string $name Event name
+     * @param string|null $name Event name
      */
-    public function clear($name = null) {
-        if ($name !== null) {
+    public function clear(?string $name = null): void
+    {
+        if (null !== $name) {
             unset($this->events[$name]);
             unset($this->filters[$name]);
-        }
-        else {
-            $this->events = array();
-            $this->filters = array();
+        } else {
+            $this->events = [];
+            $this->filters = [];
         }
     }
 
     /**
      * Hooks a callback to an event.
      *
-     * @param string $name Event name
-     * @param string $type Filter type
+     * @param string   $name     Event name
+     * @param string   $type     Filter type
      * @param callback $callback Callback function
      */
-    public function hook($name, $type, $callback) {
+    public function hook(string $name, string $type, callable $callback)
+    {
         $this->filters[$name][$type][] = $callback;
     }
 
@@ -118,15 +128,19 @@ class Dispatcher {
      * Executes a chain of method filters.
      *
      * @param array $filters Chain of filters
-     * @param array $params Method parameters
-     * @param mixed $output Method output
-     * @throws \Exception
+     * @param array $params  Method parameters
+     * @param mixed $output  Method output
+     *
+     * @throws Exception
      */
-    public function filter($filters, &$params, &$output) {
-        $args = array(&$params, &$output);
+    public function filter(array $filters, array &$params, &$output): void
+    {
+        $args = [&$params, &$output];
         foreach ($filters as $callback) {
             $continue = $this->execute($callback, $args);
-            if ($continue === false) break;
+            if (false === $continue) {
+                break;
+            }
         }
     }
 
@@ -134,35 +148,39 @@ class Dispatcher {
      * Executes a callback function.
      *
      * @param callback $callback Callback function
-     * @param array $params Function parameters
+     * @param array    $params   Function parameters
+     *
+     *@throws Exception
+     *
      * @return mixed Function results
-     * @throws \Exception
      */
-    public static function execute($callback, array &$params = array()) {
-        if (is_callable($callback)) {
-            return is_array($callback) ?
+    public static function execute(callable $callback, array &$params = [])
+    {
+        if (\is_callable($callback)) {
+            return \is_array($callback) ?
                 self::invokeMethod($callback, $params) :
                 self::callFunction($callback, $params);
         }
-        else {
-            throw new \Exception('Invalid callback specified.');
-        }
+
+        throw new Exception('Invalid callback specified.');
     }
 
     /**
      * Calls a function.
      *
-     * @param string $func Name of function to call
-     * @param array $params Function parameters
+     * @param callable|string $func   Name of function to call
+     * @param array           $params Function parameters
+     *
      * @return mixed Function results
      */
-    public static function callFunction($func, array &$params = array()) {
+    public static function callFunction($func, array &$params = [])
+    {
         // Call static method
-        if (is_string($func) && strpos($func, '::') !== false) {
-            return call_user_func_array($func, $params);
+        if (\is_string($func) && false !== strpos($func, '::')) {
+            return \call_user_func_array($func, $params);
         }
 
-        switch (count($params)) {
+        switch (\count($params)) {
             case 0:
                 return $func();
             case 1:
@@ -176,23 +194,25 @@ class Dispatcher {
             case 5:
                 return $func($params[0], $params[1], $params[2], $params[3], $params[4]);
             default:
-                return call_user_func_array($func, $params);
+                return \call_user_func_array($func, $params);
         }
     }
 
     /**
      * Invokes a method.
      *
-     * @param mixed $func Class method
+     * @param mixed $func   Class method
      * @param array $params Class method parameters
+     *
      * @return mixed Function results
      */
-    public static function invokeMethod($func, array &$params = array()) {
-        list($class, $method) = $func;
+    public static function invokeMethod($func, array &$params = [])
+    {
+        [$class, $method] = $func;
+
+        $instance = \is_object($class);
 
-        $instance = is_object($class);
-		
-        switch (count($params)) {
+        switch (\count($params)) {
             case 0:
                 return ($instance) ?
                     $class->$method() :
@@ -218,15 +238,16 @@ class Dispatcher {
                     $class->$method($params[0], $params[1], $params[2], $params[3], $params[4]) :
                     $class::$method($params[0], $params[1], $params[2], $params[3], $params[4]);
             default:
-                return call_user_func_array($func, $params);
+                return \call_user_func_array($func, $params);
         }
     }
 
     /**
      * Resets the object to the initial state.
      */
-    public function reset() {
-        $this->events = array();
-        $this->filters = array();
+    public function reset(): void
+    {
+        $this->events = [];
+        $this->filters = [];
     }
 }
diff --git a/flight/core/Loader.php b/flight/core/Loader.php
index 76e3ea4..4520b32 100644
--- a/flight/core/Loader.php
+++ b/flight/core/Loader.php
@@ -1,4 +1,6 @@
 instances[$name]);
 
-        $this->classes[$name] = array($class, $params, $callback);
+        $this->classes[$name] = [$class, $params, $callback];
     }
 
     /**
@@ -55,23 +57,27 @@ class Loader {
      *
      * @param string $name Registry name
      */
-    public function unregister($name) {
+    public function unregister(string $name): void
+    {
         unset($this->classes[$name]);
     }
 
     /**
      * Loads a registered class.
      *
-     * @param string $name Method name
-     * @param bool $shared Shared instance
+     * @param string $name   Method name
+     * @param bool   $shared Shared instance
+     *
+     * @throws Exception
+     *
      * @return object Class instance
-     * @throws \Exception
      */
-    public function load($name, $shared = true) {
+    public function load(string $name, bool $shared = true): ?object
+    {
         $obj = null;
 
         if (isset($this->classes[$name])) {
-            list($class, $params, $callback) = $this->classes[$name];
+            [$class, $params, $callback] = $this->classes[$name];
 
             $exists = isset($this->instances[$name]);
 
@@ -79,18 +85,17 @@ class Loader {
                 $obj = ($exists) ?
                     $this->getInstance($name) :
                     $this->newInstance($class, $params);
-                
+
                 if (!$exists) {
                     $this->instances[$name] = $obj;
                 }
-            }
-            else {
+            } else {
                 $obj = $this->newInstance($class, $params);
             }
 
             if ($callback && (!$shared || !$exists)) {
-                $ref = array(&$obj);
-                call_user_func_array($callback, $ref);
+                $ref = [&$obj];
+                \call_user_func_array($callback, $ref);
             }
         }
 
@@ -101,26 +106,31 @@ class Loader {
      * Gets a single instance of a class.
      *
      * @param string $name Instance name
+     *
      * @return object Class instance
      */
-    public function getInstance($name) {
-        return isset($this->instances[$name]) ? $this->instances[$name] : null;
+    public function getInstance(string $name): ?object
+    {
+        return $this->instances[$name] ?? null;
     }
 
     /**
      * Gets a new instance of a class.
      *
-     * @param string|callable $class Class name or callback function to instantiate class
-     * @param array $params Class initialization parameters
+     * @param callable|string $class  Class name or callback function to instantiate class
+     * @param array           $params Class initialization parameters
+     *
+     * @throws Exception
+     *
      * @return object Class instance
-     * @throws \Exception
      */
-    public function newInstance($class, array $params = array()) {
-        if (is_callable($class)) {
-            return call_user_func_array($class, $params);
+    public function newInstance($class, array $params = []): object
+    {
+        if (\is_callable($class)) {
+            return \call_user_func_array($class, $params);
         }
 
-        switch (count($params)) {
+        switch (\count($params)) {
             case 0:
                 return new $class();
             case 1:
@@ -135,44 +145,48 @@ class Loader {
                 return new $class($params[0], $params[1], $params[2], $params[3], $params[4]);
             default:
                 try {
-                    $refClass = new \ReflectionClass($class);
+                    $refClass = new ReflectionClass($class);
+
                     return $refClass->newInstanceArgs($params);
-                } catch (\ReflectionException $e) {
-                    throw new \Exception("Cannot instantiate {$class}", 0, $e);
+                } catch (ReflectionException $e) {
+                    throw new Exception("Cannot instantiate {$class}", 0, $e);
                 }
         }
     }
 
     /**
      * @param string $name Registry name
+     *
      * @return mixed Class information or null if not registered
      */
-    public function get($name) {
-        return isset($this->classes[$name]) ? $this->classes[$name] : null;
+    public function get(string $name)
+    {
+        return $this->classes[$name] ?? null;
     }
 
     /**
      * Resets the object to the initial state.
      */
-    public function reset() {
-        $this->classes = array();
-        $this->instances = array();
+    public function reset(): void
+    {
+        $this->classes = [];
+        $this->instances = [];
     }
 
-    /*** Autoloading Functions ***/
+    // Autoloading Functions
 
     /**
      * Starts/stops autoloader.
      *
-     * @param bool $enabled Enable/disable autoloading
-     * @param array $dirs Autoload directories
+     * @param bool  $enabled Enable/disable autoloading
+     * @param array $dirs    Autoload directories
      */
-    public static function autoload($enabled = true, $dirs = array()) {
+    public static function autoload(bool $enabled = true, array $dirs = []): void
+    {
         if ($enabled) {
-            spl_autoload_register(array(__CLASS__, 'loadClass'));
-        }
-        else {
-            spl_autoload_unregister(array(__CLASS__, 'loadClass'));
+            spl_autoload_register([__CLASS__, 'loadClass']);
+        } else {
+            spl_autoload_unregister([__CLASS__, 'loadClass']);
         }
 
         if (!empty($dirs)) {
@@ -185,13 +199,15 @@ class Loader {
      *
      * @param string $class Class name
      */
-    public static function loadClass($class) {
-        $class_file = str_replace(array('\\', '_'), '/', $class).'.php';
+    public static function loadClass(string $class): void
+    {
+        $class_file = str_replace(['\\', '_'], '/', $class) . '.php';
 
         foreach (self::$dirs as $dir) {
-            $file = $dir.'/'.$class_file;
+            $file = $dir . '/' . $class_file;
             if (file_exists($file)) {
                 require $file;
+
                 return;
             }
         }
@@ -202,14 +218,16 @@ class Loader {
      *
      * @param mixed $dir Directory path
      */
-    public static function addDirectory($dir) {
-        if (is_array($dir) || is_object($dir)) {
+    public static function addDirectory($dir): void
+    {
+        if (\is_array($dir) || \is_object($dir)) {
             foreach ($dir as $value) {
                 self::addDirectory($value);
             }
-        }
-        else if (is_string($dir)) {
-            if (!in_array($dir, self::$dirs)) self::$dirs[] = $dir;
+        } elseif (\is_string($dir)) {
+            if (!\in_array($dir, self::$dirs, true)) {
+                self::$dirs[] = $dir;
+            }
         }
     }
 }
diff --git a/flight/net/Request.php b/flight/net/Request.php
index 19a8331..670ce79 100644
--- a/flight/net/Request.php
+++ b/flight/net/Request.php
@@ -1,4 +1,6 @@
  str_replace('@', '%40', self::getVar('REQUEST_URI', '/')),
-                'base' => str_replace(array('\\',' '), array('/','%20'), dirname(self::getVar('SCRIPT_NAME'))),
+                'base' => str_replace(['\\', ' '], ['/', '%20'], \dirname(self::getVar('SCRIPT_NAME'))),
                 'method' => self::getMethod(),
                 'referrer' => self::getVar('HTTP_REFERER'),
                 'ip' => self::getVar('REMOTE_ADDR'),
-                'ajax' => self::getVar('HTTP_X_REQUESTED_WITH') == 'XMLHttpRequest',
+                'ajax' => 'XMLHttpRequest' == self::getVar('HTTP_X_REQUESTED_WITH'),
                 'scheme' => self::getScheme(),
                 'user_agent' => self::getVar('HTTP_USER_AGENT'),
                 'type' => self::getVar('CONTENT_TYPE'),
@@ -148,11 +152,11 @@ class Request {
                 'data' => new Collection($_POST),
                 'cookies' => new Collection($_COOKIE),
                 'files' => new Collection($_FILES),
-                'secure' => self::getScheme() == 'https',
+                'secure' => 'https' == self::getScheme(),
                 'accept' => self::getVar('HTTP_ACCEPT'),
                 'proxy_ip' => self::getProxyIpAddress(),
                 'host' => self::getVar('HTTP_HOST'),
-            );
+            ];
         }
 
         $this->init($config);
@@ -163,15 +167,16 @@ class Request {
      *
      * @param array $properties Array of request properties
      */
-    public function init($properties = array()) {
+    public function init(array $properties = [])
+    {
         // Set all the defined properties
         foreach ($properties as $name => $value) {
             $this->$name = $value;
         }
 
         // Get the requested URL without the base directory
-        if ($this->base != '/' && strlen($this->base) > 0 && strpos($this->url, $this->base) === 0) {
-            $this->url = substr($this->url, strlen($this->base));
+        if ('/' != $this->base && \strlen($this->base) > 0 && 0 === strpos($this->url, $this->base)) {
+            $this->url = substr($this->url, \strlen($this->base));
         }
 
         // Default url
@@ -186,11 +191,11 @@ class Request {
         }
 
         // Check for JSON input
-        if (strpos($this->type, 'application/json') === 0) {
+        if (0 === strpos($this->type, 'application/json')) {
             $body = $this->getBody();
-            if ($body != '') {
+            if ('' != $body) {
                 $data = json_decode($body, true);
-                if ($data != null) {
+                if (null != $data) {
                     $this->data->setData($data);
                 }
             }
@@ -202,16 +207,17 @@ class Request {
      *
      * @return string Raw HTTP request body
      */
-    public static function getBody() {
+    public static function getBody(): ?string
+    {
         static $body;
 
-        if (!is_null($body)) {
+        if (null !== $body) {
             return $body;
         }
 
         $method = self::getMethod();
 
-        if ($method == 'POST' || $method == 'PUT' || $method == 'DELETE' || $method == 'PATCH') {
+        if ('POST' === $method || 'PUT' === $method || 'DELETE' === $method || 'PATCH' === $method) {
             $body = file_get_contents('php://input');
         }
 
@@ -220,16 +226,14 @@ class Request {
 
     /**
      * Gets the request method.
-     *
-     * @return string
      */
-    public static function getMethod() {
+    public static function getMethod(): string
+    {
         $method = self::getVar('REQUEST_METHOD', 'GET');
 
         if (isset($_SERVER['HTTP_X_HTTP_METHOD_OVERRIDE'])) {
             $method = $_SERVER['HTTP_X_HTTP_METHOD_OVERRIDE'];
-        }
-        elseif (isset($_REQUEST['_method'])) {
+        } elseif (isset($_REQUEST['_method'])) {
             $method = $_REQUEST['_method'];
         }
 
@@ -241,22 +245,23 @@ class Request {
      *
      * @return string IP address
      */
-    public static function getProxyIpAddress() {
-        static $forwarded = array(
+    public static function getProxyIpAddress(): string
+    {
+        static $forwarded = [
             'HTTP_CLIENT_IP',
             'HTTP_X_FORWARDED_FOR',
             'HTTP_X_FORWARDED',
             'HTTP_X_CLUSTER_CLIENT_IP',
             'HTTP_FORWARDED_FOR',
-            'HTTP_FORWARDED'
-        );
+            'HTTP_FORWARDED',
+        ];
 
         $flags = \FILTER_FLAG_NO_PRIV_RANGE | \FILTER_FLAG_NO_RES_RANGE;
 
         foreach ($forwarded as $key) {
-            if (array_key_exists($key, $_SERVER)) {
+            if (\array_key_exists($key, $_SERVER)) {
                 sscanf($_SERVER[$key], '%[^,]', $ip);
-                if (filter_var($ip, \FILTER_VALIDATE_IP, $flags) !== false) {
+                if (false !== filter_var($ip, \FILTER_VALIDATE_IP, $flags)) {
                     return $ip;
                 }
             }
@@ -268,22 +273,26 @@ class Request {
     /**
      * Gets a variable from $_SERVER using $default if not provided.
      *
-     * @param string $var Variable name
-     * @param string $default Default value to substitute
-     * @return string Server variable value
+     * @param string $var     Variable name
+     * @param mixed  $default Default value to substitute
+     *
+     * @return mixed Server variable value
      */
-    public static function getVar($var, $default = '') {
-        return isset($_SERVER[$var]) ? $_SERVER[$var] : $default;
+    public static function getVar(string $var, $default = '')
+    {
+        return $_SERVER[$var] ?? $default;
     }
 
     /**
      * Parse query parameters from a URL.
      *
      * @param string $url URL string
+     *
      * @return array Query parameters
      */
-    public static function parseQuery($url) {
-        $params = array();
+    public static function parseQuery(string $url): array
+    {
+        $params = [];
 
         $args = parse_url($url);
         if (isset($args['query'])) {
@@ -293,18 +302,20 @@ class Request {
         return $params;
     }
 
-    public static function getScheme() {
+    public static function getScheme(): string
+    {
         if (
-            (isset($_SERVER['HTTPS']) && strtolower($_SERVER['HTTPS']) === 'on')
+            (isset($_SERVER['HTTPS']) && 'on' === strtolower($_SERVER['HTTPS']))
             ||
-            (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] === 'https')
+            (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && 'https' === $_SERVER['HTTP_X_FORWARDED_PROTO'])
             ||
-            (isset($_SERVER['HTTP_FRONT_END_HTTPS']) && $_SERVER['HTTP_FRONT_END_HTTPS'] === 'on')
+            (isset($_SERVER['HTTP_FRONT_END_HTTPS']) && 'on' === $_SERVER['HTTP_FRONT_END_HTTPS'])
             ||
-            (isset($_SERVER['REQUEST_SCHEME']) && $_SERVER['REQUEST_SCHEME'] === 'https')
+            (isset($_SERVER['REQUEST_SCHEME']) && 'https' === $_SERVER['REQUEST_SCHEME'])
         ) {
             return 'https';
         }
+
         return 'http';
     }
 }
diff --git a/flight/net/Response.php b/flight/net/Response.php
index 9f4b925..38c4dcc 100644
--- a/flight/net/Response.php
+++ b/flight/net/Response.php
@@ -1,4 +1,6 @@
  'Continue',
         101 => 'Switching Protocols',
         102 => 'Processing',
@@ -112,25 +95,46 @@ class Response {
         508 => 'Loop Detected',
 
         510 => 'Not Extended',
-        511 => 'Network Authentication Required'
-    );
+        511 => 'Network Authentication Required',
+    ];
+    /**
+     * @var int HTTP status
+     */
+    protected $status = 200;
+
+    /**
+     * @var array HTTP headers
+     */
+    protected $headers = [];
+
+    /**
+     * @var string HTTP response body
+     */
+    protected $body;
+
+    /**
+     * @var bool HTTP response sent
+     */
+    protected $sent = false;
 
     /**
      * Sets the HTTP status of the response.
      *
      * @param int $code HTTP status code.
-     * @return object|int Self reference
+     *
      * @throws \Exception If invalid status code
+     *
+     * @return int|object Self reference
      */
-    public function status($code = null) {
-        if ($code === null) {
+    public function status($code = null)
+    {
+        if (null === $code) {
             return $this->status;
         }
 
-        if (array_key_exists($code, self::$codes)) {
+        if (\array_key_exists($code, self::$codes)) {
             $this->status = $code;
-        }
-        else {
+        } else {
             throw new \Exception('Invalid status code.');
         }
 
@@ -140,17 +144,18 @@ class Response {
     /**
      * Adds a header to the response.
      *
-     * @param string|array $name Header name or array of names and values
-     * @param string $value Header value
+     * @param array|string $name  Header name or array of names and values
+     * @param string       $value Header value
+     *
      * @return object Self reference
      */
-    public function header($name, $value = null) {
-        if (is_array($name)) {
+    public function header($name, $value = null)
+    {
+        if (\is_array($name)) {
             foreach ($name as $k => $v) {
                 $this->headers[$k] = $v;
             }
-        }
-        else {
+        } else {
             $this->headers[$name] = $value;
         }
 
@@ -158,10 +163,12 @@ class Response {
     }
 
     /**
-     * Returns the headers from the response
+     * Returns the headers from the response.
+     *
      * @return array
      */
-    public function headers() {
+    public function headers()
+    {
         return $this->headers;
     }
 
@@ -169,9 +176,11 @@ class Response {
      * Writes content to the response body.
      *
      * @param string $str Response content
+     *
      * @return object Self reference
      */
-    public function write($str) {
+    public function write($str)
+    {
         $this->body .= $str;
 
         return $this;
@@ -182,9 +191,10 @@ class Response {
      *
      * @return object Self reference
      */
-    public function clear() {
+    public function clear()
+    {
         $this->status = 200;
-        $this->headers = array();
+        $this->headers = [];
         $this->body = '';
 
         return $this;
@@ -194,26 +204,28 @@ class Response {
      * Sets caching headers for the response.
      *
      * @param int|string $expires Expiration time
+     *
      * @return object Self reference
      */
-    public function cache($expires) {
-        if ($expires === false) {
+    public function cache($expires)
+    {
+        if (false === $expires) {
             $this->headers['Expires'] = 'Mon, 26 Jul 1997 05:00:00 GMT';
-            $this->headers['Cache-Control'] = array(
+            $this->headers['Cache-Control'] = [
                 'no-store, no-cache, must-revalidate',
                 'post-check=0, pre-check=0',
-                'max-age=0'
-            );
+                'max-age=0',
+            ];
             $this->headers['Pragma'] = 'no-cache';
-        }
-        else {
-            $expires = is_int($expires) ? $expires : strtotime($expires);
+        } else {
+            $expires = \is_int($expires) ? $expires : strtotime($expires);
             $this->headers['Expires'] = gmdate('D, d M Y H:i:s', $expires) . ' GMT';
-            $this->headers['Cache-Control'] = 'max-age='.($expires - time());
-            if (isset($this->headers['Pragma']) && $this->headers['Pragma'] == 'no-cache'){
+            $this->headers['Cache-Control'] = 'max-age=' . ($expires - time());
+            if (isset($this->headers['Pragma']) && 'no-cache' == $this->headers['Pragma']) {
                 unset($this->headers['Pragma']);
             }
         }
+
         return $this;
     }
 
@@ -222,9 +234,10 @@ class Response {
      *
      * @return object Self reference
      */
-    public function sendHeaders() {
+    public function sendHeaders()
+    {
         // Send status code header
-        if (strpos(php_sapi_name(), 'cgi') !== false) {
+        if (false !== strpos(\PHP_SAPI, 'cgi')) {
             header(
                 sprintf(
                     'Status: %d %s',
@@ -233,12 +246,11 @@ class Response {
                 ),
                 true
             );
-        }
-        else {
+        } else {
             header(
                 sprintf(
                     '%s %d %s',
-                    (isset($_SERVER['SERVER_PROTOCOL']) ? $_SERVER['SERVER_PROTOCOL'] : 'HTTP/1.1'),
+                    ($_SERVER['SERVER_PROTOCOL'] ?? 'HTTP/1.1'),
                     $this->status,
                     self::$codes[$this->status]),
                 true,
@@ -248,13 +260,12 @@ class Response {
 
         // Send other headers
         foreach ($this->headers as $field => $value) {
-            if (is_array($value)) {
+            if (\is_array($value)) {
                 foreach ($value as $v) {
-                    header($field.': '.$v, false);
+                    header($field . ': ' . $v, false);
                 }
-            }
-            else {
-                header($field.': '.$value);
+            } else {
+                header($field . ': ' . $value);
             }
         }
 
@@ -263,7 +274,7 @@ class Response {
             $length = $this->getContentLength();
 
             if ($length > 0) {
-                header('Content-Length: '.$length);
+                header('Content-Length: ' . $length);
             }
         }
 
@@ -275,23 +286,26 @@ class Response {
      *
      * @return string Content length
      */
-    public function getContentLength() {
-        return extension_loaded('mbstring') ?
+    public function getContentLength()
+    {
+        return \extension_loaded('mbstring') ?
             mb_strlen($this->body, 'latin1') :
-            strlen($this->body);
+            \strlen($this->body);
     }
 
     /**
      * Gets whether response was sent.
      */
-    public function sent() {
+    public function sent()
+    {
         return $this->sent;
     }
 
     /**
      * Sends a HTTP response.
      */
-    public function send() {
+    public function send()
+    {
         if (ob_get_length() > 0) {
             ob_end_clean();
         }
@@ -305,4 +319,3 @@ class Response {
         $this->sent = true;
     }
 }
-
diff --git a/flight/net/Route.php b/flight/net/Route.php
index a3c4457..f82536a 100644
--- a/flight/net/Route.php
+++ b/flight/net/Route.php
@@ -1,4 +1,6 @@
 pattern = $pattern;
         $this->callback = $callback;
         $this->methods = $methods;
@@ -67,61 +71,67 @@ class Route {
     /**
      * Checks if a URL matches the route pattern. Also parses named parameters in the URL.
      *
-     * @param string $url Requested URL
-     * @param boolean $case_sensitive Case sensitive matching
-     * @return boolean Match status
+     * @param string $url            Requested URL
+     * @param bool   $case_sensitive Case sensitive matching
+     *
+     * @return bool Match status
      */
-    public function matchUrl($url, $case_sensitive = false) {
+    public function matchUrl(string $url, bool $case_sensitive = false): bool
+    {
         // Wildcard or exact match
-        if ($this->pattern === '*' || $this->pattern === $url) {
+        if ('*' === $this->pattern || $this->pattern === $url) {
             return true;
         }
 
-        $ids = array();
+        $ids = [];
         $last_char = substr($this->pattern, -1);
 
         // Get splat
-        if ($last_char === '*') {
+        if ('*' === $last_char) {
             $n = 0;
-            $len = strlen($url);
+            $len = \strlen($url);
             $count = substr_count($this->pattern, '/');
 
             for ($i = 0; $i < $len; $i++) {
-                if ($url[$i] == '/') $n++;
-                if ($n == $count) break;
+                if ('/' === $url[$i]) {
+                    $n++;
+                }
+                if ($n === $count) {
+                    break;
+                }
             }
 
-            $this->splat = (string)substr($url, $i+1);
+            $this->splat = (string) substr($url, $i + 1);
         }
 
         // Build the regex for matching
-        $regex = str_replace(array(')','/*'), array(')?','(/?|/.*?)'), $this->pattern);
+        $regex = str_replace([')', '/*'], [')?', '(/?|/.*?)'], $this->pattern);
 
         $regex = preg_replace_callback(
             '#@([\w]+)(:([^/\(\)]*))?#',
-            function($matches) use (&$ids) {
+            static function ($matches) use (&$ids) {
                 $ids[$matches[1]] = null;
                 if (isset($matches[3])) {
-                    return '(?P<'.$matches[1].'>'.$matches[3].')';
+                    return '(?P<' . $matches[1] . '>' . $matches[3] . ')';
                 }
-                return '(?P<'.$matches[1].'>[^/\?]+)';
+
+                return '(?P<' . $matches[1] . '>[^/\?]+)';
             },
             $regex
         );
 
         // Fix trailing slash
-        if ($last_char === '/') {
+        if ('/' === $last_char) {
             $regex .= '?';
-        }
-        // Allow trailing slash
+        } // Allow trailing slash
         else {
             $regex .= '/?';
         }
 
         // Attempt to match route and named parameters
-        if (preg_match('#^'.$regex.'(?:\?.*)?$#'.(($case_sensitive) ? '' : 'i'), $url, $matches)) {
+        if (preg_match('#^' . $regex . '(?:\?.*)?$#' . (($case_sensitive) ? '' : 'i'), $url, $matches)) {
             foreach ($ids as $k => $v) {
-                $this->params[$k] = (array_key_exists($k, $matches)) ? urldecode($matches[$k]) : null;
+                $this->params[$k] = (\array_key_exists($k, $matches)) ? urldecode($matches[$k]) : null;
             }
 
             $this->regex = $regex;
@@ -136,9 +146,11 @@ class Route {
      * Checks if an HTTP method matches the route methods.
      *
      * @param string $method HTTP method
+     *
      * @return bool Match status
      */
-    public function matchMethod($method) {
-        return count(array_intersect(array($method, '*'), $this->methods)) > 0;
+    public function matchMethod(string $method): bool
+    {
+        return \count(array_intersect([$method, '*'], $this->methods)) > 0;
     }
 }
diff --git a/flight/net/Router.php b/flight/net/Router.php
index 173ba11..c85dba4 100644
--- a/flight/net/Router.php
+++ b/flight/net/Router.php
@@ -1,4 +1,6 @@
 routes;
     }
 
     /**
      * Clears all routes in the router.
      */
-    public function clear() {
-        $this->routes = array();
+    public function clear(): void
+    {
+        $this->routes = [];
     }
 
     /**
      * Maps a URL pattern to a callback function.
      *
-     * @param string $pattern URL pattern to match
-     * @param callback $callback Callback function
-     * @param boolean $pass_route Pass the matching route object to the callback
+     * @param string   $pattern    URL pattern to match
+     * @param callback $callback   Callback function
+     * @param bool     $pass_route Pass the matching route object to the callback
      */
-    public function map($pattern, $callback, $pass_route = false) {
+    public function map(string $pattern, callable $callback, bool $pass_route = false): void
+    {
         $url = $pattern;
-        $methods = array('*');
+        $methods = ['*'];
 
-        if (strpos($pattern, ' ') !== false) {
-            list($method, $url) = explode(' ', trim($pattern), 2);
+        if (false !== strpos($pattern, ' ')) {
+            [$method, $url] = explode(' ', trim($pattern), 2);
             $url = trim($url);
             $methods = explode('|', $method);
         }
@@ -75,12 +74,14 @@ class Router {
      * Routes the current request.
      *
      * @param Request $request Request object
-     * @return Route|bool Matching route or false if no match
+     *
+     * @return bool|Route Matching route or false if no match
      */
-    public function route(Request $request) {
-        $url_decoded = urldecode( $request->url );
+    public function route(Request $request)
+    {
+        $url_decoded = urldecode($request->url);
         while ($route = $this->current()) {
-            if ($route !== false && $route->matchMethod($request->method) && $route->matchUrl($url_decoded, $this->case_sensitive)) {
+            if (false !== $route && $route->matchMethod($request->method) && $route->matchUrl($url_decoded, $this->case_sensitive)) {
                 return $route;
             }
             $this->next();
@@ -92,26 +93,26 @@ class Router {
     /**
      * Gets the current route.
      *
-     * @return Route
+     * @return bool|Route
      */
-    public function current() {
-        return isset($this->routes[$this->index]) ? $this->routes[$this->index] : false;
+    public function current()
+    {
+        return $this->routes[$this->index] ?? false;
     }
 
     /**
      * Gets the next route.
-     *
-     * @return Route
      */
-    public function next() {
+    public function next(): void
+    {
         $this->index++;
     }
 
     /**
      * Reset to the first route.
      */
-    public  function reset() {
+    public function reset(): void
+    {
         $this->index = 0;
     }
 }
-
diff --git a/flight/template/View.php b/flight/template/View.php
index a0bc3c3..90dbb81 100644
--- a/flight/template/View.php
+++ b/flight/template/View.php
@@ -1,4 +1,6 @@
 path = $path;
     }
 
@@ -55,25 +59,27 @@ class View {
      * Gets a template variable.
      *
      * @param string $key Key
+     *
      * @return mixed Value
      */
-    public function get($key) {
-        return isset($this->vars[$key]) ? $this->vars[$key] : null;
+    public function get($key)
+    {
+        return $this->vars[$key] ?? null;
     }
 
     /**
      * Sets a template variable.
      *
-     * @param mixed $key Key
+     * @param mixed  $key   Key
      * @param string $value Value
      */
-    public function set($key, $value = null) {
-        if (is_array($key) || is_object($key)) {
+    public function set($key, $value = null)
+    {
+        if (\is_array($key) || \is_object($key)) {
             foreach ($key as $k => $v) {
                 $this->vars[$k] = $v;
             }
-        }
-        else {
+        } else {
             $this->vars[$key] = $value;
         }
     }
@@ -82,9 +88,11 @@ class View {
      * Checks if a template variable is set.
      *
      * @param string $key Key
-     * @return boolean If key exists
+     *
+     * @return bool If key exists
      */
-    public function has($key) {
+    public function has($key)
+    {
         return isset($this->vars[$key]);
     }
 
@@ -93,11 +101,11 @@ class View {
      *
      * @param string $key Key
      */
-    public function clear($key = null) {
-        if (is_null($key)) {
-            $this->vars = array();
-        }
-        else {
+    public function clear($key = null)
+    {
+        if (null === $key) {
+            $this->vars = [];
+        } else {
             unset($this->vars[$key]);
         }
     }
@@ -106,17 +114,19 @@ class View {
      * Renders a template.
      *
      * @param string $file Template file
-     * @param array $data Template data
+     * @param array  $data Template data
+     *
      * @throws \Exception If template not found
      */
-    public function render($file, $data = null) {
+    public function render($file, $data = null)
+    {
         $this->template = $this->getTemplate($file);
 
         if (!file_exists($this->template)) {
             throw new \Exception("Template file not found: {$this->template}.");
         }
 
-        if (is_array($data)) {
+        if (\is_array($data)) {
             $this->vars = array_merge($this->vars, $data);
         }
 
@@ -129,25 +139,28 @@ class View {
      * Gets the output of a template.
      *
      * @param string $file Template file
-     * @param array $data Template data
+     * @param array  $data Template data
+     *
      * @return string Output of template
      */
-    public function fetch($file, $data = null) {
+    public function fetch($file, $data = null)
+    {
         ob_start();
 
         $this->render($file, $data);
-        $output = ob_get_clean();
 
-        return $output;
+        return ob_get_clean();
     }
 
     /**
      * Checks if a template file exists.
      *
      * @param string $file Template file
+     *
      * @return bool Template file exists
      */
-    public function exists($file) {
+    public function exists($file)
+    {
         return file_exists($this->getTemplate($file));
     }
 
@@ -155,30 +168,33 @@ class View {
      * Gets the full path to a template file.
      *
      * @param string $file Template file
+     *
      * @return string Template file location
      */
-    public function getTemplate($file) {
+    public function getTemplate($file)
+    {
         $ext = $this->extension;
 
-        if (!empty($ext) && (substr($file, -1 * strlen($ext)) != $ext)) {
+        if (!empty($ext) && (substr($file, -1 * \strlen($ext)) != $ext)) {
             $file .= $ext;
         }
 
-        if ((substr($file, 0, 1) == '/')) {
+        if (('/' == substr($file, 0, 1))) {
             return $file;
         }
-        
-        return $this->path.'/'.$file;
+
+        return $this->path . '/' . $file;
     }
 
     /**
      * Displays escaped output.
      *
      * @param string $str String to escape
+     *
      * @return string Escaped string
      */
-    public function e($str) {
+    public function e($str)
+    {
         echo htmlentities($str);
     }
 }
-
diff --git a/flight/util/Collection.php b/flight/util/Collection.php
index 1062b11..883dccf 100644
--- a/flight/util/Collection.php
+++ b/flight/util/Collection.php
@@ -1,4 +1,6 @@
 data = $data;
     }
 
@@ -37,19 +45,22 @@ class Collection implements \ArrayAccess, \Iterator, \Countable, \JsonSerializab
      * Gets an item.
      *
      * @param string $key Key
+     *
      * @return mixed Value
      */
-    public function __get($key) {
-        return isset($this->data[$key]) ? $this->data[$key] : null;
+    public function __get(string $key)
+    {
+        return $this->data[$key] ?? null;
     }
 
     /**
      * Set an item.
      *
-     * @param string $key Key
-     * @param mixed $value Value
+     * @param string $key   Key
+     * @param mixed  $value Value
      */
-    public function __set($key, $value) {
+    public function __set(string $key, $value): void
+    {
         $this->data[$key] = $value;
     }
 
@@ -57,9 +68,11 @@ class Collection implements \ArrayAccess, \Iterator, \Countable, \JsonSerializab
      * Checks if an item exists.
      *
      * @param string $key Key
+     *
      * @return bool Item status
      */
-    public function __isset($key) {
+    public function __isset(string $key): bool
+    {
         return isset($this->data[$key]);
     }
 
@@ -68,7 +81,8 @@ class Collection implements \ArrayAccess, \Iterator, \Countable, \JsonSerializab
      *
      * @param string $key Key
      */
-    public function __unset($key) {
+    public function __unset(string $key): void
+    {
         unset($this->data[$key]);
     }
 
@@ -76,23 +90,25 @@ class Collection implements \ArrayAccess, \Iterator, \Countable, \JsonSerializab
      * Gets an item at the offset.
      *
      * @param string $offset Offset
+     *
      * @return mixed Value
      */
-    public function offsetGet($offset) {
-        return isset($this->data[$offset]) ? $this->data[$offset] : null;
+    public function offsetGet($offset)
+    {
+        return $this->data[$offset] ?? null;
     }
 
     /**
      * Sets an item at the offset.
      *
      * @param string $offset Offset
-     * @param mixed $value Value
+     * @param mixed  $value  Value
      */
-    public function offsetSet($offset, $value) {
-        if (is_null($offset)) {
+    public function offsetSet($offset, $value)
+    {
+        if (null === $offset) {
             $this->data[] = $value;
-        }
-        else {
+        } else {
             $this->data[$offset] = $value;
         }
     }
@@ -101,9 +117,11 @@ class Collection implements \ArrayAccess, \Iterator, \Countable, \JsonSerializab
      * Checks if an item exists at the offset.
      *
      * @param string $offset Offset
+     *
      * @return bool Item status
      */
-    public function offsetExists($offset) {
+    public function offsetExists($offset): bool
+    {
         return isset($this->data[$offset]);
     }
 
@@ -112,54 +130,59 @@ class Collection implements \ArrayAccess, \Iterator, \Countable, \JsonSerializab
      *
      * @param string $offset Offset
      */
-    public function offsetUnset($offset) {
+    public function offsetUnset($offset): void
+    {
         unset($this->data[$offset]);
     }
 
     /**
      * Resets the collection.
      */
-    public function rewind() {
+    public function rewind(): void
+    {
         reset($this->data);
     }
- 
+
     /**
      * Gets current collection item.
      *
      * @return mixed Value
-     */ 
-    public function current() {
+     */
+    public function current()
+    {
         return current($this->data);
     }
- 
+
     /**
      * Gets current collection key.
      *
      * @return mixed Value
-     */ 
-    public function key() {
+     */
+    public function key()
+    {
         return key($this->data);
     }
- 
+
     /**
      * Gets the next collection value.
      *
      * @return mixed Value
-     */ 
-    public function next() 
+     */
+    public function next()
     {
         return next($this->data);
     }
- 
+
     /**
      * Checks if the current collection key is valid.
      *
      * @return bool Key status
-     */ 
-    public function valid()
+     */
+    public function valid(): bool
     {
         $key = key($this->data);
-        return ($key !== NULL && $key !== FALSE);
+
+        return null !== $key && false !== $key;
     }
 
     /**
@@ -167,8 +190,9 @@ class Collection implements \ArrayAccess, \Iterator, \Countable, \JsonSerializab
      *
      * @return int Collection size
      */
-    public function count() {
-        return sizeof($this->data);
+    public function count(): int
+    {
+        return \count($this->data);
     }
 
     /**
@@ -176,7 +200,8 @@ class Collection implements \ArrayAccess, \Iterator, \Countable, \JsonSerializab
      *
      * @return array Collection keys
      */
-    public function keys() {
+    public function keys(): array
+    {
         return array_keys($this->data);
     }
 
@@ -185,7 +210,8 @@ class Collection implements \ArrayAccess, \Iterator, \Countable, \JsonSerializab
      *
      * @return array Collection data
      */
-    public function getData() {
+    public function getData(): array
+    {
         return $this->data;
     }
 
@@ -194,23 +220,26 @@ class Collection implements \ArrayAccess, \Iterator, \Countable, \JsonSerializab
      *
      * @param array $data New collection data
      */
-    public function setData(array $data) {
+    public function setData(array $data): void
+    {
         $this->data = $data;
     }
 
     /**
-     * Gets the collection data which can be serialized to JSON
+     * Gets the collection data which can be serialized to JSON.
      *
      * @return array Collection data which can be serialized by json_encode
      */
-    public function jsonSerialize() {
+    public function jsonSerialize(): array
+    {
         return $this->data;
     }
 
     /**
      * Removes all items from the collection.
      */
-    public function clear() {
-        $this->data = array();
+    public function clear(): void
+    {
+        $this->data = [];
     }
 }
diff --git a/flight/util/LegacyJsonSerializable.php b/flight/util/LegacyJsonSerializable.php
index 4c907c7..0c973aa 100644
--- a/flight/util/LegacyJsonSerializable.php
+++ b/flight/util/LegacyJsonSerializable.php
@@ -1,11 +1,13 @@
 
  * @license     MIT, http://flightphp.com/license
  */
-
-interface JsonSerializable {
+interface LegacyJsonSerializable
+{
     public function jsonSerialize();
-}
\ No newline at end of file
+}