diff --git a/app/Http/Controllers/Web/DashboardController.php b/app/Http/Controllers/Web/DashboardController.php
index 7f06f51..8a76603 100644
--- a/app/Http/Controllers/Web/DashboardController.php
+++ b/app/Http/Controllers/Web/DashboardController.php
@@ -54,7 +54,7 @@ class DashboardController extends Controller
     private function adminDashboard()
     {
         $usersPerMonth = $this->users->countOfNewUsersPerMonth(
-            Carbon::now()->startOfYear(),
+            Carbon::now()->subYear(),
             Carbon::now()
         );
 
diff --git a/app/Http/Controllers/Web/InstallController.php b/app/Http/Controllers/Web/InstallController.php
index 6a1d261..bc1018c 100644
--- a/app/Http/Controllers/Web/InstallController.php
+++ b/app/Http/Controllers/Web/InstallController.php
@@ -68,7 +68,8 @@ class InstallController extends Controller
         if (! $this->dbCredentialsAreValid($dbCredentials)) {
             return redirect()->route('install.database')
                 ->withInput(array_except($dbCredentials, 'password'))
-                ->withErrors("Connection to your database cannot be established. Please provide correct database credentials.");
+                ->withErrors("Connection to your database cannot be established. 
+                Please provide correct database credentials.");
         }
 
         Session::put('install.db_credentials', $dbCredentials);
@@ -114,7 +115,6 @@ class InstallController extends Controller
             \Log::error($e->getTraceAsString());
             return redirect()->route('install.error');
         }
-
     }
 
     private function reloadEnv()
@@ -138,7 +138,7 @@ class InstallController extends Controller
     private function getRequirements()
     {
         $requirements = [
-            'PHP Version (>= 5.5.9)' => version_compare(phpversion(), '5.5.9', '>='),
+            'PHP Version (>= 7.0.0)' => version_compare(phpversion(), '7.0.0', '>='),
             'OpenSSL Extension'   => extension_loaded('openssl'),
             'PDO Extension'       => extension_loaded('PDO'),
             'PDO MySQL Extension' => extension_loaded('pdo_mysql'),
diff --git a/app/Http/Requests/User/CreateUserRequest.php b/app/Http/Requests/User/CreateUserRequest.php
index 8febf77..ac4a53a 100644
--- a/app/Http/Requests/User/CreateUserRequest.php
+++ b/app/Http/Requests/User/CreateUserRequest.php
@@ -16,9 +16,9 @@ class CreateUserRequest extends Request
     {
         $rules = [
             'email' => 'required|email|unique:users,email',
-            'username' => 'unique:users,username',
+            'username' => 'nullable|unique:users,username',
             'password' => 'required|min:6|confirmed',
-            'birthday' => 'date',
+            'birthday' => 'nullable|date',
             'role_id' => 'required|exists:roles,id',
         ];
 
diff --git a/app/Http/Requests/User/UpdateDetailsRequest.php b/app/Http/Requests/User/UpdateDetailsRequest.php
index 49539f3..64ba878 100644
--- a/app/Http/Requests/User/UpdateDetailsRequest.php
+++ b/app/Http/Requests/User/UpdateDetailsRequest.php
@@ -15,7 +15,7 @@ class UpdateDetailsRequest extends Request
     public function rules()
     {
         return [
-            'birthday' => 'date',
+            'birthday' => 'nullable|date',
             'role_id' => 'required|exists:roles,id'
         ];
     }
diff --git a/app/Http/Requests/User/UpdateProfileDetailsRequest.php b/app/Http/Requests/User/UpdateProfileDetailsRequest.php
index ffe7c81..412d6a3 100644
--- a/app/Http/Requests/User/UpdateProfileDetailsRequest.php
+++ b/app/Http/Requests/User/UpdateProfileDetailsRequest.php
@@ -15,7 +15,7 @@ class UpdateProfileDetailsRequest extends Request
     public function rules()
     {
         return [
-            'birthday' => 'date',
+            'birthday' => 'nullable|date',
         ];
     }
 }
diff --git a/app/Http/Requests/User/UpdateUserRequest.php b/app/Http/Requests/User/UpdateUserRequest.php
index b403e6c..a502ca5 100644
--- a/app/Http/Requests/User/UpdateUserRequest.php
+++ b/app/Http/Requests/User/UpdateUserRequest.php
@@ -20,9 +20,9 @@ class UpdateUserRequest extends Request
 
         return [
             'email' => 'email|unique:users,email,' . $user->id,
-            'username' => 'unique:users,username,' . $user->id,
+            'username' => 'nullable|unique:users,username,' . $user->id,
             'password' => 'min:6|confirmed',
-            'birthday' => 'date',
+            'birthday' => 'nullable|date',
             'role_id' => 'exists:roles,id',
             'country_id' => 'exists:countries,id',
             'status' => Rule::in(array_keys(UserStatus::lists()))
diff --git a/app/Listeners/Users/InvalidateSessionsAndTokens.php b/app/Listeners/Users/InvalidateSessionsAndTokens.php
new file mode 100644
index 0000000..5709adf
--- /dev/null
+++ b/app/Listeners/Users/InvalidateSessionsAndTokens.php
@@ -0,0 +1,39 @@
+<?php
+
+namespace Portal\Listeners\Users;
+
+use Carbon\Carbon;
+use Illuminate\Contracts\Auth\Guard;
+use Portal\Events\User\Banned;
+use Portal\Events\User\LoggedIn;
+use Portal\Repositories\Session\SessionRepository;
+use Portal\Repositories\User\UserRepository;
+use Portal\Services\Auth\Api\Token;
+
+class InvalidateSessionsAndTokens
+{
+    /**
+     * @var SessionRepository
+     */
+    private $sessions;
+
+    public function __construct(SessionRepository $sessions)
+    {
+        $this->sessions = $sessions;
+    }
+
+    /**
+     * Handle the event.
+     *
+     * @param Banned $event
+     * @return void
+     */
+    public function handle(Banned $event)
+    {
+        $user = $event->getBannedUser();
+
+        $this->sessions->invalidateAllSessionsForUser($user->id);
+
+        Token::where('user_id', $user->id)->delete();
+    }
+}
diff --git a/app/Presenters/UserPresenter.php b/app/Presenters/UserPresenter.php
index baf43c3..68ad06c 100644
--- a/app/Presenters/UserPresenter.php
+++ b/app/Presenters/UserPresenter.php
@@ -32,7 +32,7 @@ class UserPresenter extends Presenter
     public function birthday()
     {
         return $this->entity->birthday
-            ? $this->entity->birthday->toDateString()
+            ? $this->entity->birthday->format(config('app.date_format'))
             : '-';
     }
 
diff --git a/app/Providers/AppServiceProvider.php b/app/Providers/AppServiceProvider.php
index b755d1b..5f5a0b0 100644
--- a/app/Providers/AppServiceProvider.php
+++ b/app/Providers/AppServiceProvider.php
@@ -28,6 +28,7 @@ class AppServiceProvider extends ServiceProvider
     {
         Carbon::setLocale(config('app.locale'));
         config(['app.name' => settings('app_name')]);
+        \Illuminate\Database\Schema\Builder::defaultStringLength(191);
     }
 
     /**
diff --git a/app/Providers/EventServiceProvider.php b/app/Providers/EventServiceProvider.php
index 089c4df..7c3b3ca 100644
--- a/app/Providers/EventServiceProvider.php
+++ b/app/Providers/EventServiceProvider.php
@@ -2,8 +2,10 @@
 
 namespace Portal\Providers;
 
+use Portal\Events\User\Banned;
 use Portal\Events\User\LoggedIn;
 use Portal\Events\User\Registered;
+use Portal\Listeners\Users\InvalidateSessionsAndTokens;
 use Portal\Listeners\Login\UpdateLastLoginTimestamp;
 use Portal\Listeners\PermissionEventsSubscriber;
 use Portal\Listeners\Registration\SendConfirmationEmail;
@@ -26,6 +28,9 @@ class EventServiceProvider extends ServiceProvider
         ],
         LoggedIn::class => [
             UpdateLastLoginTimestamp::class
+        ],
+        Banned::class => [
+            InvalidateSessionsAndTokens::class
         ]
     ];
 
diff --git a/app/Repositories/Session/DbSession.php b/app/Repositories/Session/DbSession.php
index b5e1144..441c189 100644
--- a/app/Repositories/Session/DbSession.php
+++ b/app/Repositories/Session/DbSession.php
@@ -3,6 +3,7 @@
 namespace Portal\Repositories\Session;
 
 use Carbon\Carbon;
+use Jenssegers\Agent\Agent;
 use Portal\Repositories\User\UserRepository;
 use DB;
 
@@ -12,14 +13,20 @@ class DbSession implements SessionRepository
      * @var UserRepository
      */
     private $users;
+    /**
+     * @var Agent
+     */
+    private $agent;
 
     /**
      * DbSession constructor.
      * @param UserRepository $users
+     * @param Agent $agent
      */
-    public function __construct(UserRepository $users)
+    public function __construct(UserRepository $users, Agent $agent)
     {
         $this->users = $users;
+        $this->agent = $agent;
     }
 
     /**
@@ -33,7 +40,21 @@ class DbSession implements SessionRepository
             ->where('user_id', $userId)
             ->where('last_activity', '>=', $validTimestamp)
             ->get()
-            ->all();
+            ->map(function ($session) {
+                return $this->mapSessionAttributes($session);
+            });
+    }
+
+    private function mapSessionAttributes($session)
+    {
+        $this->agent->setUserAgent($session->user_agent);
+
+        $session->last_activity = Carbon::createFromTimestamp($session->last_activity);
+        $session->platform = $this->agent->platform();
+        $session->browser = $this->agent->browser();
+        $session->device = $this->agent->device();
+
+        return $session;
     }
 
     /**
@@ -55,8 +76,24 @@ class DbSession implements SessionRepository
      */
     public function find($sessionId)
     {
-        return DB::table('sessions')
+        $session = DB::table('sessions')
             ->where('id', $sessionId)
             ->first();
+
+        return $session
+            ? $this->mapSessionAttributes($session)
+            : null;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function invalidateAllSessionsForUser($userId)
+    {
+        DB::table('sessions')
+            ->where('user_id', $userId)
+            ->delete();
+
+        $this->users->update($userId, ['remember_token' => null]);
     }
 }
diff --git a/app/Repositories/Session/SessionRepository.php b/app/Repositories/Session/SessionRepository.php
index c061d65..f9ab12e 100644
--- a/app/Repositories/Session/SessionRepository.php
+++ b/app/Repositories/Session/SessionRepository.php
@@ -26,4 +26,11 @@ interface SessionRepository
      * @return mixed
      */
     public function invalidateSession($sessionId);
+
+    /**
+     * Invalidate all sessions for user with given id.
+     * @param $userId
+     * @return mixed
+     */
+    public function invalidateAllSessionsForUser($userId);
 }
diff --git a/app/Repositories/User/EloquentUser.php b/app/Repositories/User/EloquentUser.php
index d7b4385..6e5f49a 100644
--- a/app/Repositories/User/EloquentUser.php
+++ b/app/Repositories/User/EloquentUser.php
@@ -185,49 +185,39 @@ class EloquentUser implements UserRepository
     /**
      * {@inheritdoc}
      */
-    public function countOfNewUsersPerMonth($from, $to)
+    public function countOfNewUsersPerMonth(Carbon $from, Carbon $to)
     {
-        $perMonthQuery = $this->getPerMonthQuery();
-
-        $result = User::select([
-            DB::raw("{$perMonthQuery} as month"),
-            DB::raw('count(id) as count')
-        ])
-            ->whereBetween('created_at', [$from, $to])
-            ->groupBy('month')
-            ->orderBy('month', 'ASC')
-            ->pluck('count', 'month');
+        $result = User::whereBetween('created_at', [$from, $to])
+            ->get(['created_at'])
+            ->groupBy(function ($user) {
+                return $user->created_at->format("Y_n");
+            });
 
         $counts = [];
 
-        foreach(range(1, 12) as $m) {
-            $month = date('F', mktime(0, 0, 0, $m, 1));
+        while ($from->lt($to)) {
+            $key = $from->format("Y_n");
 
-            $month = trans("app.months.{$month}");
+            $counts[$this->parseDate($key)] = count($result->get($key, []));
 
-            $counts[$month] = isset($result[$m])
-                ? $result[$m]
-                : 0;
+            $from->addMonth();
         }
 
         return $counts;
     }
 
     /**
-     * Creates query that will be used to fetch users per
-     * month, depending on type of the connection.
-     *
+     * Parse date from "Y_m" format to "{Month Name} {Year}" format.
+     * @param $yearMonth
      * @return string
      */
-    private function getPerMonthQuery()
+    private function parseDate($yearMonth)
     {
-        $connection = DB::connection();
+        list($year, $month) = explode("_", $yearMonth);
 
-        if ($connection instanceof SQLiteConnection) {
-            return 'CAST(strftime(\'%m\', created_at) AS INTEGER)';
-        }
+        $month = trans("app.months.{$month}");
 
-        return 'MONTH(created_at)';
+        return "{$month} {$year}";
     }
 
     /**
diff --git a/app/Repositories/User/UserRepository.php b/app/Repositories/User/UserRepository.php
index 221b76c..65a3e1d 100644
--- a/app/Repositories/User/UserRepository.php
+++ b/app/Repositories/User/UserRepository.php
@@ -2,6 +2,7 @@
 
 namespace Portal\Repositories\User;
 
+use Carbon\Carbon;
 use Portal\User;
 use \Laravel\Socialite\Contracts\User as SocialUser;
 
@@ -116,7 +117,7 @@ interface UserRepository
      * @param $to
      * @return mixed
      */
-    public function countOfNewUsersPerMonth($from, $to);
+    public function countOfNewUsersPerMonth(Carbon $from, Carbon $to);
 
     /**
      * Get latest {$count} users from database.
diff --git a/app/Transformers/SessionTransformer.php b/app/Transformers/SessionTransformer.php
index fac31af..f960dc5 100644
--- a/app/Transformers/SessionTransformer.php
+++ b/app/Transformers/SessionTransformer.php
@@ -10,18 +10,15 @@ class SessionTransformer extends TransformerAbstract
 {
     public function transform($session)
     {
-        $agent = app('agent');
-        $agent->setUserAgent($session->user_agent);
-
         return [
             'id' => $session->id,
             'user_id' => (int) $session->user_id,
             'ip_address' => $session->ip_address,
             'user_agent' => $session->user_agent,
-            'browser' => $agent->browser(),
-            'platform' => $agent->platform(),
-            'device' => $agent->device(),
-            'last_activity' => (string) Carbon::createFromTimestamp($session->last_activity)
+            'browser' => $session->browser,
+            'platform' => $session->platform,
+            'device' => $session->device,
+            'last_activity' => (string) $session->last_activity
         ];
     }
 }
diff --git a/composer.json b/composer.json
index 68496e7..eafb2d5 100644
--- a/composer.json
+++ b/composer.json
@@ -4,7 +4,7 @@
     "keywords": ["advanced", "secure", "login", "user management", "authentication", "authorization", "register"],
     "type": "project",
     "require": {
-        "php": ">=5.6.4",
+        "php": ">=7.0.0",
         "laravel/framework": "5.5.*",
         "proengsoft/laravel-jsvalidation": "2.1.*",
         "laravel/socialite": "^3.0",
diff --git a/composer.lock b/composer.lock
index 3a38821..bf3f1df 100644
--- a/composer.lock
+++ b/composer.lock
@@ -4,8 +4,8 @@
         "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file",
         "This file is @generated automatically"
     ],
-    "hash": "e8c1e8c032db302bc3152ddab94454fc",
-    "content-hash": "6201b59af8308187ae76f8002e73160d",
+    "hash": "0afb12c3312468c30411247ef607b23d",
+    "content-hash": "692a122461ca79eec69ce3e6bb636b56",
     "packages": [
         {
             "name": "anhskohbo/no-captcha",
@@ -232,16 +232,16 @@
         },
         {
             "name": "egulias/email-validator",
-            "version": "2.1.2",
+            "version": "2.1.3",
             "source": {
                 "type": "git",
                 "url": "https://github.com/egulias/EmailValidator.git",
-                "reference": "bc31baa11ea2883e017f0a10d9722ef9d50eac1c"
+                "reference": "1bec00a10039b823cc94eef4eddd47dcd3b2ca04"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/egulias/EmailValidator/zipball/bc31baa11ea2883e017f0a10d9722ef9d50eac1c",
-                "reference": "bc31baa11ea2883e017f0a10d9722ef9d50eac1c",
+                "url": "https://api.github.com/repos/egulias/EmailValidator/zipball/1bec00a10039b823cc94eef4eddd47dcd3b2ca04",
+                "reference": "1bec00a10039b823cc94eef4eddd47dcd3b2ca04",
                 "shasum": ""
             },
             "require": {
@@ -250,8 +250,8 @@
             },
             "require-dev": {
                 "dominicsayers/isemail": "dev-master",
-                "phpunit/phpunit": "^4.8.0",
-                "satooshi/php-coveralls": "dev-master"
+                "phpunit/phpunit": "^4.8.35",
+                "satooshi/php-coveralls": "^1.0.1"
             },
             "suggest": {
                 "ext-intl": "PHP Internationalization Libraries are required to use the SpoofChecking validation"
@@ -285,25 +285,28 @@
                 "validation",
                 "validator"
             ],
-            "time": "2017-01-30 22:07:36"
+            "time": "2017-11-15 23:40:40"
         },
         {
             "name": "erusev/parsedown",
-            "version": "1.6.3",
+            "version": "1.6.4",
             "source": {
                 "type": "git",
                 "url": "https://github.com/erusev/parsedown.git",
-                "reference": "728952b90a333b5c6f77f06ea9422b94b585878d"
+                "reference": "fbe3fe878f4fe69048bb8a52783a09802004f548"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/erusev/parsedown/zipball/728952b90a333b5c6f77f06ea9422b94b585878d",
-                "reference": "728952b90a333b5c6f77f06ea9422b94b585878d",
+                "url": "https://api.github.com/repos/erusev/parsedown/zipball/fbe3fe878f4fe69048bb8a52783a09802004f548",
+                "reference": "fbe3fe878f4fe69048bb8a52783a09802004f548",
                 "shasum": ""
             },
             "require": {
                 "php": ">=5.3.0"
             },
+            "require-dev": {
+                "phpunit/phpunit": "^4.8.35"
+            },
             "type": "library",
             "autoload": {
                 "psr-0": {
@@ -327,7 +330,7 @@
                 "markdown",
                 "parser"
             ],
-            "time": "2017-05-14 14:47:48"
+            "time": "2017-11-14 20:44:03"
         },
         {
             "name": "fideloper/proxy",
@@ -688,20 +691,19 @@
         },
         {
             "name": "jenssegers/agent",
-            "version": "v2.5.2",
+            "version": "v2.6.0",
             "source": {
                 "type": "git",
                 "url": "https://github.com/jenssegers/agent.git",
-                "reference": "faf85b10206478382ac93eda122430fee78c544e"
+                "reference": "df71082ed2a95fc8a82ba30832ccf72df939f02a"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/jenssegers/agent/zipball/faf85b10206478382ac93eda122430fee78c544e",
-                "reference": "faf85b10206478382ac93eda122430fee78c544e",
+                "url": "https://api.github.com/repos/jenssegers/agent/zipball/df71082ed2a95fc8a82ba30832ccf72df939f02a",
+                "reference": "df71082ed2a95fc8a82ba30832ccf72df939f02a",
                 "shasum": ""
             },
             "require": {
-                "illuminate/support": "^4.0|^5.0",
                 "jaybizzle/crawler-detect": "^1.2",
                 "mobiledetect/mobiledetectlib": "^2.7.6",
                 "php": ">=5.4.0"
@@ -751,7 +753,7 @@
                 "user agent",
                 "useragent"
             ],
-            "time": "2017-06-27 06:30:13"
+            "time": "2017-11-10 10:35:35"
         },
         {
             "name": "laracasts/presenter",
@@ -801,16 +803,16 @@
         },
         {
             "name": "laravel/framework",
-            "version": "v5.5.19",
+            "version": "v5.5.26",
             "source": {
                 "type": "git",
                 "url": "https://github.com/laravel/framework.git",
-                "reference": "c678100e84934ec85c9f8bc26bd0a60222682719"
+                "reference": "d7e6a7aab600c5cfae595ea22074ac3c536cbc28"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/laravel/framework/zipball/c678100e84934ec85c9f8bc26bd0a60222682719",
-                "reference": "c678100e84934ec85c9f8bc26bd0a60222682719",
+                "url": "https://api.github.com/repos/laravel/framework/zipball/d7e6a7aab600c5cfae595ea22074ac3c536cbc28",
+                "reference": "d7e6a7aab600c5cfae595ea22074ac3c536cbc28",
                 "shasum": ""
             },
             "require": {
@@ -884,15 +886,18 @@
             "suggest": {
                 "aws/aws-sdk-php": "Required to use the SQS queue driver and SES mail driver (~3.0).",
                 "doctrine/dbal": "Required to rename columns and drop SQLite columns (~2.5).",
+                "ext-pcntl": "Required to use all features of the queue worker.",
+                "ext-posix": "Required to use all features of the queue worker.",
                 "fzaninotto/faker": "Required to use the eloquent factory builder (~1.4).",
                 "guzzlehttp/guzzle": "Required to use the Mailgun and Mandrill mail drivers and the ping methods on schedules (~6.0).",
                 "laravel/tinker": "Required to use the tinker console command (~1.0).",
                 "league/flysystem-aws-s3-v3": "Required to use the Flysystem S3 driver (~1.0).",
+                "league/flysystem-cached-adapter": "Required to use Flysystem caching (~1.0).",
                 "league/flysystem-rackspace": "Required to use the Flysystem Rackspace driver (~1.0).",
                 "nexmo/client": "Required to use the Nexmo transport (~1.0).",
                 "pda/pheanstalk": "Required to use the beanstalk queue driver (~3.0).",
                 "predis/predis": "Required to use the redis cache and queue drivers (~1.0).",
-                "pusher/pusher-php-server": "Required to use the Pusher broadcast driver (~2.0).",
+                "pusher/pusher-php-server": "Required to use the Pusher broadcast driver (~3.0).",
                 "symfony/css-selector": "Required to use some of the crawler integration testing tools (~3.3).",
                 "symfony/dom-crawler": "Required to use most of the crawler integration testing tools (~3.3).",
                 "symfony/psr-http-message-bridge": "Required to psr7 bridging features (~1.0)."
@@ -928,7 +933,7 @@
                 "framework",
                 "laravel"
             ],
-            "time": "2017-10-25 19:10:45"
+            "time": "2017-12-18 14:15:59"
         },
         {
             "name": "laravel/socialite",
@@ -1269,23 +1274,23 @@
         },
         {
             "name": "mobiledetect/mobiledetectlib",
-            "version": "2.8.26",
+            "version": "2.8.30",
             "source": {
                 "type": "git",
                 "url": "https://github.com/serbanghita/Mobile-Detect.git",
-                "reference": "a0ed86c9d7c04ae27fa6418b55e3beb04dfe3297"
+                "reference": "5500bbbf312fe77ef0c7223858dad84fe49ee0c3"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/serbanghita/Mobile-Detect/zipball/a0ed86c9d7c04ae27fa6418b55e3beb04dfe3297",
-                "reference": "a0ed86c9d7c04ae27fa6418b55e3beb04dfe3297",
+                "url": "https://api.github.com/repos/serbanghita/Mobile-Detect/zipball/5500bbbf312fe77ef0c7223858dad84fe49ee0c3",
+                "reference": "5500bbbf312fe77ef0c7223858dad84fe49ee0c3",
                 "shasum": ""
             },
             "require": {
                 "php": ">=5.0.0"
             },
             "require-dev": {
-                "phpunit/phpunit": "*"
+                "phpunit/phpunit": "~4.8.35||~5.7"
             },
             "type": "library",
             "autoload": {
@@ -1317,7 +1322,7 @@
                 "mobile detector",
                 "php mobile detect"
             ],
-            "time": "2017-08-29 18:23:54"
+            "time": "2017-12-18 10:38:51"
         },
         {
             "name": "monolog/monolog",
@@ -2012,44 +2017,45 @@
         },
         {
             "name": "symfony/console",
-            "version": "v3.3.10",
+            "version": "v3.4.2",
             "source": {
                 "type": "git",
                 "url": "https://github.com/symfony/console.git",
-                "reference": "116bc56e45a8e5572e51eb43ab58c769a352366c"
+                "reference": "9f21adfb92a9315b73ae2ed43138988ee4913d4e"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/console/zipball/116bc56e45a8e5572e51eb43ab58c769a352366c",
-                "reference": "116bc56e45a8e5572e51eb43ab58c769a352366c",
+                "url": "https://api.github.com/repos/symfony/console/zipball/9f21adfb92a9315b73ae2ed43138988ee4913d4e",
+                "reference": "9f21adfb92a9315b73ae2ed43138988ee4913d4e",
                 "shasum": ""
             },
             "require": {
                 "php": "^5.5.9|>=7.0.8",
-                "symfony/debug": "~2.8|~3.0",
+                "symfony/debug": "~2.8|~3.0|~4.0",
                 "symfony/polyfill-mbstring": "~1.0"
             },
             "conflict": {
-                "symfony/dependency-injection": "<3.3"
+                "symfony/dependency-injection": "<3.4",
+                "symfony/process": "<3.3"
             },
             "require-dev": {
                 "psr/log": "~1.0",
-                "symfony/config": "~3.3",
-                "symfony/dependency-injection": "~3.3",
-                "symfony/event-dispatcher": "~2.8|~3.0",
-                "symfony/filesystem": "~2.8|~3.0",
-                "symfony/process": "~2.8|~3.0"
+                "symfony/config": "~3.3|~4.0",
+                "symfony/dependency-injection": "~3.4|~4.0",
+                "symfony/event-dispatcher": "~2.8|~3.0|~4.0",
+                "symfony/lock": "~3.4|~4.0",
+                "symfony/process": "~3.3|~4.0"
             },
             "suggest": {
                 "psr/log": "For using the console logger",
                 "symfony/event-dispatcher": "",
-                "symfony/filesystem": "",
+                "symfony/lock": "",
                 "symfony/process": ""
             },
             "type": "library",
             "extra": {
                 "branch-alias": {
-                    "dev-master": "3.3-dev"
+                    "dev-master": "3.4-dev"
                 }
             },
             "autoload": {
@@ -2076,20 +2082,20 @@
             ],
             "description": "Symfony Console Component",
             "homepage": "https://symfony.com",
-            "time": "2017-10-02 06:42:24"
+            "time": "2017-12-14 19:40:10"
         },
         {
             "name": "symfony/css-selector",
-            "version": "v3.3.10",
+            "version": "v3.4.2",
             "source": {
                 "type": "git",
                 "url": "https://github.com/symfony/css-selector.git",
-                "reference": "07447650225ca9223bd5c97180fe7c8267f7d332"
+                "reference": "eac760b414cf1f64362c3dd047b989e4db121332"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/css-selector/zipball/07447650225ca9223bd5c97180fe7c8267f7d332",
-                "reference": "07447650225ca9223bd5c97180fe7c8267f7d332",
+                "url": "https://api.github.com/repos/symfony/css-selector/zipball/eac760b414cf1f64362c3dd047b989e4db121332",
+                "reference": "eac760b414cf1f64362c3dd047b989e4db121332",
                 "shasum": ""
             },
             "require": {
@@ -2098,7 +2104,7 @@
             "type": "library",
             "extra": {
                 "branch-alias": {
-                    "dev-master": "3.3-dev"
+                    "dev-master": "3.4-dev"
                 }
             },
             "autoload": {
@@ -2129,20 +2135,20 @@
             ],
             "description": "Symfony CssSelector Component",
             "homepage": "https://symfony.com",
-            "time": "2017-10-02 06:42:24"
+            "time": "2017-12-14 19:40:10"
         },
         {
             "name": "symfony/debug",
-            "version": "v3.3.10",
+            "version": "v3.4.2",
             "source": {
                 "type": "git",
                 "url": "https://github.com/symfony/debug.git",
-                "reference": "eb95d9ce8f18dcc1b3dfff00cb624c402be78ffd"
+                "reference": "543deab3ffff94402440b326fc94153bae2dfa7a"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/debug/zipball/eb95d9ce8f18dcc1b3dfff00cb624c402be78ffd",
-                "reference": "eb95d9ce8f18dcc1b3dfff00cb624c402be78ffd",
+                "url": "https://api.github.com/repos/symfony/debug/zipball/543deab3ffff94402440b326fc94153bae2dfa7a",
+                "reference": "543deab3ffff94402440b326fc94153bae2dfa7a",
                 "shasum": ""
             },
             "require": {
@@ -2153,12 +2159,12 @@
                 "symfony/http-kernel": ">=2.3,<2.3.24|~2.4.0|>=2.5,<2.5.9|>=2.6,<2.6.2"
             },
             "require-dev": {
-                "symfony/http-kernel": "~2.8|~3.0"
+                "symfony/http-kernel": "~2.8|~3.0|~4.0"
             },
             "type": "library",
             "extra": {
                 "branch-alias": {
-                    "dev-master": "3.3-dev"
+                    "dev-master": "3.4-dev"
                 }
             },
             "autoload": {
@@ -2185,34 +2191,34 @@
             ],
             "description": "Symfony Debug Component",
             "homepage": "https://symfony.com",
-            "time": "2017-10-02 06:42:24"
+            "time": "2017-12-12 08:27:14"
         },
         {
             "name": "symfony/event-dispatcher",
-            "version": "v3.3.10",
+            "version": "v4.0.2",
             "source": {
                 "type": "git",
                 "url": "https://github.com/symfony/event-dispatcher.git",
-                "reference": "d7ba037e4b8221956ab1e221c73c9e27e05dd423"
+                "reference": "d4face19ed8002eec8280bc1c5ec18130472bf43"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/d7ba037e4b8221956ab1e221c73c9e27e05dd423",
-                "reference": "d7ba037e4b8221956ab1e221c73c9e27e05dd423",
+                "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/d4face19ed8002eec8280bc1c5ec18130472bf43",
+                "reference": "d4face19ed8002eec8280bc1c5ec18130472bf43",
                 "shasum": ""
             },
             "require": {
-                "php": "^5.5.9|>=7.0.8"
+                "php": "^7.1.3"
             },
             "conflict": {
-                "symfony/dependency-injection": "<3.3"
+                "symfony/dependency-injection": "<3.4"
             },
             "require-dev": {
                 "psr/log": "~1.0",
-                "symfony/config": "~2.8|~3.0",
-                "symfony/dependency-injection": "~3.3",
-                "symfony/expression-language": "~2.8|~3.0",
-                "symfony/stopwatch": "~2.8|~3.0"
+                "symfony/config": "~3.4|~4.0",
+                "symfony/dependency-injection": "~3.4|~4.0",
+                "symfony/expression-language": "~3.4|~4.0",
+                "symfony/stopwatch": "~3.4|~4.0"
             },
             "suggest": {
                 "symfony/dependency-injection": "",
@@ -2221,7 +2227,7 @@
             "type": "library",
             "extra": {
                 "branch-alias": {
-                    "dev-master": "3.3-dev"
+                    "dev-master": "4.0-dev"
                 }
             },
             "autoload": {
@@ -2248,20 +2254,20 @@
             ],
             "description": "Symfony EventDispatcher Component",
             "homepage": "https://symfony.com",
-            "time": "2017-10-02 06:42:24"
+            "time": "2017-12-14 19:48:22"
         },
         {
             "name": "symfony/finder",
-            "version": "v3.3.10",
+            "version": "v3.4.2",
             "source": {
                 "type": "git",
                 "url": "https://github.com/symfony/finder.git",
-                "reference": "773e19a491d97926f236942484cb541560ce862d"
+                "reference": "dac8d7db537bac7ad8143eb11360a8c2231f251a"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/finder/zipball/773e19a491d97926f236942484cb541560ce862d",
-                "reference": "773e19a491d97926f236942484cb541560ce862d",
+                "url": "https://api.github.com/repos/symfony/finder/zipball/dac8d7db537bac7ad8143eb11360a8c2231f251a",
+                "reference": "dac8d7db537bac7ad8143eb11360a8c2231f251a",
                 "shasum": ""
             },
             "require": {
@@ -2270,7 +2276,7 @@
             "type": "library",
             "extra": {
                 "branch-alias": {
-                    "dev-master": "3.3-dev"
+                    "dev-master": "3.4-dev"
                 }
             },
             "autoload": {
@@ -2297,33 +2303,34 @@
             ],
             "description": "Symfony Finder Component",
             "homepage": "https://symfony.com",
-            "time": "2017-10-02 06:42:24"
+            "time": "2017-11-05 16:10:10"
         },
         {
             "name": "symfony/http-foundation",
-            "version": "v3.3.10",
+            "version": "v3.4.2",
             "source": {
                 "type": "git",
                 "url": "https://github.com/symfony/http-foundation.git",
-                "reference": "22cf9c2b1d9f67cc8e75ae7f4eaa60e4c1eff1f8"
+                "reference": "59bf131b5460227a2f583a7dbe6b179f98f9e0a5"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/http-foundation/zipball/22cf9c2b1d9f67cc8e75ae7f4eaa60e4c1eff1f8",
-                "reference": "22cf9c2b1d9f67cc8e75ae7f4eaa60e4c1eff1f8",
+                "url": "https://api.github.com/repos/symfony/http-foundation/zipball/59bf131b5460227a2f583a7dbe6b179f98f9e0a5",
+                "reference": "59bf131b5460227a2f583a7dbe6b179f98f9e0a5",
                 "shasum": ""
             },
             "require": {
                 "php": "^5.5.9|>=7.0.8",
-                "symfony/polyfill-mbstring": "~1.1"
+                "symfony/polyfill-mbstring": "~1.1",
+                "symfony/polyfill-php70": "~1.6"
             },
             "require-dev": {
-                "symfony/expression-language": "~2.8|~3.0"
+                "symfony/expression-language": "~2.8|~3.0|~4.0"
             },
             "type": "library",
             "extra": {
                 "branch-alias": {
-                    "dev-master": "3.3-dev"
+                    "dev-master": "3.4-dev"
                 }
             },
             "autoload": {
@@ -2350,56 +2357,58 @@
             ],
             "description": "Symfony HttpFoundation Component",
             "homepage": "https://symfony.com",
-            "time": "2017-10-05 23:10:23"
+            "time": "2017-12-14 19:40:10"
         },
         {
             "name": "symfony/http-kernel",
-            "version": "v3.3.10",
+            "version": "v3.4.2",
             "source": {
                 "type": "git",
                 "url": "https://github.com/symfony/http-kernel.git",
-                "reference": "654f047a78756964bf91b619554f956517394018"
+                "reference": "48325096bbda77b983e642d21a4dd9bdde3ab73e"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/http-kernel/zipball/654f047a78756964bf91b619554f956517394018",
-                "reference": "654f047a78756964bf91b619554f956517394018",
+                "url": "https://api.github.com/repos/symfony/http-kernel/zipball/48325096bbda77b983e642d21a4dd9bdde3ab73e",
+                "reference": "48325096bbda77b983e642d21a4dd9bdde3ab73e",
                 "shasum": ""
             },
             "require": {
                 "php": "^5.5.9|>=7.0.8",
                 "psr/log": "~1.0",
-                "symfony/debug": "~2.8|~3.0",
-                "symfony/event-dispatcher": "~2.8|~3.0",
-                "symfony/http-foundation": "~3.3"
+                "symfony/debug": "~2.8|~3.0|~4.0",
+                "symfony/event-dispatcher": "~2.8|~3.0|~4.0",
+                "symfony/http-foundation": "^3.3.11|~4.0"
             },
             "conflict": {
                 "symfony/config": "<2.8",
-                "symfony/dependency-injection": "<3.3",
+                "symfony/dependency-injection": "<3.4",
                 "symfony/var-dumper": "<3.3",
                 "twig/twig": "<1.34|<2.4,>=2"
             },
+            "provide": {
+                "psr/log-implementation": "1.0"
+            },
             "require-dev": {
                 "psr/cache": "~1.0",
-                "symfony/browser-kit": "~2.8|~3.0",
+                "symfony/browser-kit": "~2.8|~3.0|~4.0",
                 "symfony/class-loader": "~2.8|~3.0",
-                "symfony/config": "~2.8|~3.0",
-                "symfony/console": "~2.8|~3.0",
-                "symfony/css-selector": "~2.8|~3.0",
-                "symfony/dependency-injection": "~3.3",
-                "symfony/dom-crawler": "~2.8|~3.0",
-                "symfony/expression-language": "~2.8|~3.0",
-                "symfony/finder": "~2.8|~3.0",
-                "symfony/process": "~2.8|~3.0",
-                "symfony/routing": "~2.8|~3.0",
-                "symfony/stopwatch": "~2.8|~3.0",
-                "symfony/templating": "~2.8|~3.0",
-                "symfony/translation": "~2.8|~3.0",
-                "symfony/var-dumper": "~3.3"
+                "symfony/config": "~2.8|~3.0|~4.0",
+                "symfony/console": "~2.8|~3.0|~4.0",
+                "symfony/css-selector": "~2.8|~3.0|~4.0",
+                "symfony/dependency-injection": "~3.4|~4.0",
+                "symfony/dom-crawler": "~2.8|~3.0|~4.0",
+                "symfony/expression-language": "~2.8|~3.0|~4.0",
+                "symfony/finder": "~2.8|~3.0|~4.0",
+                "symfony/process": "~2.8|~3.0|~4.0",
+                "symfony/routing": "~3.4|~4.0",
+                "symfony/stopwatch": "~2.8|~3.0|~4.0",
+                "symfony/templating": "~2.8|~3.0|~4.0",
+                "symfony/translation": "~2.8|~3.0|~4.0",
+                "symfony/var-dumper": "~3.3|~4.0"
             },
             "suggest": {
                 "symfony/browser-kit": "",
-                "symfony/class-loader": "",
                 "symfony/config": "",
                 "symfony/console": "",
                 "symfony/dependency-injection": "",
@@ -2409,7 +2418,7 @@
             "type": "library",
             "extra": {
                 "branch-alias": {
-                    "dev-master": "3.3-dev"
+                    "dev-master": "3.4-dev"
                 }
             },
             "autoload": {
@@ -2436,7 +2445,7 @@
             ],
             "description": "Symfony HttpKernel Component",
             "homepage": "https://symfony.com",
-            "time": "2017-10-05 23:40:19"
+            "time": "2017-12-15 02:05:18"
         },
         {
             "name": "symfony/polyfill-mbstring",
@@ -2554,6 +2563,65 @@
             "time": "2017-10-11 12:05:26"
         },
         {
+            "name": "symfony/polyfill-php70",
+            "version": "v1.6.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/polyfill-php70.git",
+                "reference": "0442b9c0596610bd24ae7b5f0a6cdbbc16d9fcff"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/symfony/polyfill-php70/zipball/0442b9c0596610bd24ae7b5f0a6cdbbc16d9fcff",
+                "reference": "0442b9c0596610bd24ae7b5f0a6cdbbc16d9fcff",
+                "shasum": ""
+            },
+            "require": {
+                "paragonie/random_compat": "~1.0|~2.0",
+                "php": ">=5.3.3"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "1.6-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Symfony\\Polyfill\\Php70\\": ""
+                },
+                "files": [
+                    "bootstrap.php"
+                ],
+                "classmap": [
+                    "Resources/stubs"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Nicolas Grekas",
+                    "email": "p@tchwork.com"
+                },
+                {
+                    "name": "Symfony Community",
+                    "homepage": "https://symfony.com/contributors"
+                }
+            ],
+            "description": "Symfony polyfill backporting some PHP 7.0+ features to lower PHP versions",
+            "homepage": "https://symfony.com",
+            "keywords": [
+                "compatibility",
+                "polyfill",
+                "portable",
+                "shim"
+            ],
+            "time": "2017-10-11 12:05:26"
+        },
+        {
             "name": "symfony/polyfill-util",
             "version": "v1.6.0",
             "source": {
@@ -2607,16 +2675,16 @@
         },
         {
             "name": "symfony/process",
-            "version": "v3.3.10",
+            "version": "v3.4.2",
             "source": {
                 "type": "git",
                 "url": "https://github.com/symfony/process.git",
-                "reference": "fdf89e57a723a29baf536e288d6e232c059697b1"
+                "reference": "bb3ef65d493a6d57297cad6c560ee04e2a8f5098"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/process/zipball/fdf89e57a723a29baf536e288d6e232c059697b1",
-                "reference": "fdf89e57a723a29baf536e288d6e232c059697b1",
+                "url": "https://api.github.com/repos/symfony/process/zipball/bb3ef65d493a6d57297cad6c560ee04e2a8f5098",
+                "reference": "bb3ef65d493a6d57297cad6c560ee04e2a8f5098",
                 "shasum": ""
             },
             "require": {
@@ -2625,7 +2693,7 @@
             "type": "library",
             "extra": {
                 "branch-alias": {
-                    "dev-master": "3.3-dev"
+                    "dev-master": "3.4-dev"
                 }
             },
             "autoload": {
@@ -2652,20 +2720,20 @@
             ],
             "description": "Symfony Process Component",
             "homepage": "https://symfony.com",
-            "time": "2017-10-02 06:42:24"
+            "time": "2017-12-14 19:40:10"
         },
         {
             "name": "symfony/routing",
-            "version": "v3.3.10",
+            "version": "v3.4.2",
             "source": {
                 "type": "git",
                 "url": "https://github.com/symfony/routing.git",
-                "reference": "2e26fa63da029dab49bf9377b3b4f60a8fecb009"
+                "reference": "5f248dfac5e4660c74982eb3dadc71cf58595570"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/routing/zipball/2e26fa63da029dab49bf9377b3b4f60a8fecb009",
-                "reference": "2e26fa63da029dab49bf9377b3b4f60a8fecb009",
+                "url": "https://api.github.com/repos/symfony/routing/zipball/5f248dfac5e4660c74982eb3dadc71cf58595570",
+                "reference": "5f248dfac5e4660c74982eb3dadc71cf58595570",
                 "shasum": ""
             },
             "require": {
@@ -2674,17 +2742,17 @@
             "conflict": {
                 "symfony/config": "<2.8",
                 "symfony/dependency-injection": "<3.3",
-                "symfony/yaml": "<3.3"
+                "symfony/yaml": "<3.4"
             },
             "require-dev": {
                 "doctrine/annotations": "~1.0",
                 "doctrine/common": "~2.2",
                 "psr/log": "~1.0",
-                "symfony/config": "~2.8|~3.0",
-                "symfony/dependency-injection": "~3.3",
-                "symfony/expression-language": "~2.8|~3.0",
-                "symfony/http-foundation": "~2.8|~3.0",
-                "symfony/yaml": "~3.3"
+                "symfony/config": "~2.8|~3.0|~4.0",
+                "symfony/dependency-injection": "~3.3|~4.0",
+                "symfony/expression-language": "~2.8|~3.0|~4.0",
+                "symfony/http-foundation": "~2.8|~3.0|~4.0",
+                "symfony/yaml": "~3.4|~4.0"
             },
             "suggest": {
                 "doctrine/annotations": "For using the annotation loader",
@@ -2697,7 +2765,7 @@
             "type": "library",
             "extra": {
                 "branch-alias": {
-                    "dev-master": "3.3-dev"
+                    "dev-master": "3.4-dev"
                 }
             },
             "autoload": {
@@ -2730,20 +2798,20 @@
                 "uri",
                 "url"
             ],
-            "time": "2017-10-02 07:25:00"
+            "time": "2017-12-14 22:37:31"
         },
         {
             "name": "symfony/translation",
-            "version": "v3.3.10",
+            "version": "v3.4.2",
             "source": {
                 "type": "git",
                 "url": "https://github.com/symfony/translation.git",
-                "reference": "409bf229cd552bf7e3faa8ab7e3980b07672073f"
+                "reference": "4c5d5582baf2829751a5207659329c1f52eedeb6"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/translation/zipball/409bf229cd552bf7e3faa8ab7e3980b07672073f",
-                "reference": "409bf229cd552bf7e3faa8ab7e3980b07672073f",
+                "url": "https://api.github.com/repos/symfony/translation/zipball/4c5d5582baf2829751a5207659329c1f52eedeb6",
+                "reference": "4c5d5582baf2829751a5207659329c1f52eedeb6",
                 "shasum": ""
             },
             "require": {
@@ -2752,13 +2820,16 @@
             },
             "conflict": {
                 "symfony/config": "<2.8",
-                "symfony/yaml": "<3.3"
+                "symfony/dependency-injection": "<3.4",
+                "symfony/yaml": "<3.4"
             },
             "require-dev": {
                 "psr/log": "~1.0",
-                "symfony/config": "~2.8|~3.0",
-                "symfony/intl": "^2.8.18|^3.2.5",
-                "symfony/yaml": "~3.3"
+                "symfony/config": "~2.8|~3.0|~4.0",
+                "symfony/dependency-injection": "~3.4|~4.0",
+                "symfony/finder": "~2.8|~3.0|~4.0",
+                "symfony/intl": "^2.8.18|^3.2.5|~4.0",
+                "symfony/yaml": "~3.4|~4.0"
             },
             "suggest": {
                 "psr/log": "To use logging capability in translator",
@@ -2768,7 +2839,7 @@
             "type": "library",
             "extra": {
                 "branch-alias": {
-                    "dev-master": "3.3-dev"
+                    "dev-master": "3.4-dev"
                 }
             },
             "autoload": {
@@ -2795,20 +2866,20 @@
             ],
             "description": "Symfony Translation Component",
             "homepage": "https://symfony.com",
-            "time": "2017-10-02 06:42:24"
+            "time": "2017-12-12 08:27:14"
         },
         {
             "name": "symfony/var-dumper",
-            "version": "v3.3.10",
+            "version": "v3.4.2",
             "source": {
                 "type": "git",
                 "url": "https://github.com/symfony/var-dumper.git",
-                "reference": "03e3693a36701f1c581dd24a6d6eea2eba2113f6"
+                "reference": "757074cf71b952ce9e75b557538948811c2bf006"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/var-dumper/zipball/03e3693a36701f1c581dd24a6d6eea2eba2113f6",
-                "reference": "03e3693a36701f1c581dd24a6d6eea2eba2113f6",
+                "url": "https://api.github.com/repos/symfony/var-dumper/zipball/757074cf71b952ce9e75b557538948811c2bf006",
+                "reference": "757074cf71b952ce9e75b557538948811c2bf006",
                 "shasum": ""
             },
             "require": {
@@ -2824,12 +2895,13 @@
             },
             "suggest": {
                 "ext-iconv": "To convert non-UTF-8 strings to UTF-8 (or symfony/polyfill-iconv in case ext-iconv cannot be used).",
+                "ext-intl": "To show region name in time zone dump",
                 "ext-symfony_debug": ""
             },
             "type": "library",
             "extra": {
                 "branch-alias": {
-                    "dev-master": "3.3-dev"
+                    "dev-master": "3.4-dev"
                 }
             },
             "autoload": {
@@ -2863,7 +2935,7 @@
                 "debug",
                 "dump"
             ],
-            "time": "2017-10-02 06:42:24"
+            "time": "2017-12-11 22:06:16"
         },
         {
             "name": "tijsverkoyen/css-to-inline-styles",
@@ -3336,16 +3408,16 @@
         },
         {
             "name": "filp/whoops",
-            "version": "2.1.12",
+            "version": "2.1.14",
             "source": {
                 "type": "git",
                 "url": "https://github.com/filp/whoops.git",
-                "reference": "a99f0b151846021ba7a73b4e3cba3ebc9f14f03e"
+                "reference": "c6081b8838686aa04f1e83ba7e91f78b7b2a23e6"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/filp/whoops/zipball/a99f0b151846021ba7a73b4e3cba3ebc9f14f03e",
-                "reference": "a99f0b151846021ba7a73b4e3cba3ebc9f14f03e",
+                "url": "https://api.github.com/repos/filp/whoops/zipball/c6081b8838686aa04f1e83ba7e91f78b7b2a23e6",
+                "reference": "c6081b8838686aa04f1e83ba7e91f78b7b2a23e6",
                 "shasum": ""
             },
             "require": {
@@ -3354,7 +3426,7 @@
             },
             "require-dev": {
                 "mockery/mockery": "0.9.*",
-                "phpunit/phpunit": "^4.8 || ^5.0",
+                "phpunit/phpunit": "^4.8.35 || ^5.7",
                 "symfony/var-dumper": "^2.6 || ^3.0"
             },
             "suggest": {
@@ -3393,7 +3465,7 @@
                 "throwable",
                 "whoops"
             ],
-            "time": "2017-10-15 13:05:10"
+            "time": "2017-11-23 18:22:44"
         },
         {
             "name": "fzaninotto/faker",
@@ -3867,29 +3939,35 @@
         },
         {
             "name": "phpdocumentor/reflection-docblock",
-            "version": "4.1.1",
+            "version": "4.2.0",
             "source": {
                 "type": "git",
                 "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git",
-                "reference": "2d3d238c433cf69caeb4842e97a3223a116f94b2"
+                "reference": "66465776cfc249844bde6d117abff1d22e06c2da"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/2d3d238c433cf69caeb4842e97a3223a116f94b2",
-                "reference": "2d3d238c433cf69caeb4842e97a3223a116f94b2",
+                "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/66465776cfc249844bde6d117abff1d22e06c2da",
+                "reference": "66465776cfc249844bde6d117abff1d22e06c2da",
                 "shasum": ""
             },
             "require": {
                 "php": "^7.0",
-                "phpdocumentor/reflection-common": "^1.0@dev",
+                "phpdocumentor/reflection-common": "^1.0.0",
                 "phpdocumentor/type-resolver": "^0.4.0",
                 "webmozart/assert": "^1.0"
             },
             "require-dev": {
-                "mockery/mockery": "^0.9.4",
-                "phpunit/phpunit": "^4.4"
+                "doctrine/instantiator": "~1.0.5",
+                "mockery/mockery": "^1.0",
+                "phpunit/phpunit": "^6.4"
             },
             "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "4.x-dev"
+                }
+            },
             "autoload": {
                 "psr-4": {
                     "phpDocumentor\\Reflection\\": [
@@ -3908,7 +3986,7 @@
                 }
             ],
             "description": "With this component, a library can provide support for annotations via DocBlocks or otherwise retrieve information that is embedded in a DocBlock.",
-            "time": "2017-08-30 18:51:59"
+            "time": "2017-11-27 17:38:31"
         },
         {
             "name": "phpdocumentor/type-resolver",
@@ -3959,16 +4037,16 @@
         },
         {
             "name": "phpspec/prophecy",
-            "version": "v1.7.2",
+            "version": "1.7.3",
             "source": {
                 "type": "git",
                 "url": "https://github.com/phpspec/prophecy.git",
-                "reference": "c9b8c6088acd19d769d4cc0ffa60a9fe34344bd6"
+                "reference": "e4ed002c67da8eceb0eb8ddb8b3847bb53c5c2bf"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/phpspec/prophecy/zipball/c9b8c6088acd19d769d4cc0ffa60a9fe34344bd6",
-                "reference": "c9b8c6088acd19d769d4cc0ffa60a9fe34344bd6",
+                "url": "https://api.github.com/repos/phpspec/prophecy/zipball/e4ed002c67da8eceb0eb8ddb8b3847bb53c5c2bf",
+                "reference": "e4ed002c67da8eceb0eb8ddb8b3847bb53c5c2bf",
                 "shasum": ""
             },
             "require": {
@@ -3980,7 +4058,7 @@
             },
             "require-dev": {
                 "phpspec/phpspec": "^2.5|^3.2",
-                "phpunit/phpunit": "^4.8 || ^5.6.5"
+                "phpunit/phpunit": "^4.8.35 || ^5.7"
             },
             "type": "library",
             "extra": {
@@ -4018,20 +4096,20 @@
                 "spy",
                 "stub"
             ],
-            "time": "2017-09-04 11:05:03"
+            "time": "2017-11-24 13:59:53"
         },
         {
             "name": "phpunit/php-code-coverage",
-            "version": "5.2.3",
+            "version": "5.3.0",
             "source": {
                 "type": "git",
                 "url": "https://github.com/sebastianbergmann/php-code-coverage.git",
-                "reference": "8e1d2397d8adf59a3f12b2878a3aaa66d1ab189d"
+                "reference": "661f34d0bd3f1a7225ef491a70a020ad23a057a1"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/8e1d2397d8adf59a3f12b2878a3aaa66d1ab189d",
-                "reference": "8e1d2397d8adf59a3f12b2878a3aaa66d1ab189d",
+                "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/661f34d0bd3f1a7225ef491a70a020ad23a057a1",
+                "reference": "661f34d0bd3f1a7225ef491a70a020ad23a057a1",
                 "shasum": ""
             },
             "require": {
@@ -4040,14 +4118,13 @@
                 "php": "^7.0",
                 "phpunit/php-file-iterator": "^1.4.2",
                 "phpunit/php-text-template": "^1.2.1",
-                "phpunit/php-token-stream": "^2.0",
+                "phpunit/php-token-stream": "^2.0.1",
                 "sebastian/code-unit-reverse-lookup": "^1.0.1",
                 "sebastian/environment": "^3.0",
                 "sebastian/version": "^2.0.1",
                 "theseer/tokenizer": "^1.1"
             },
             "require-dev": {
-                "ext-xdebug": "^2.5",
                 "phpunit/phpunit": "^6.0"
             },
             "suggest": {
@@ -4056,7 +4133,7 @@
             "type": "library",
             "extra": {
                 "branch-alias": {
-                    "dev-master": "5.2.x-dev"
+                    "dev-master": "5.3.x-dev"
                 }
             },
             "autoload": {
@@ -4071,7 +4148,7 @@
             "authors": [
                 {
                     "name": "Sebastian Bergmann",
-                    "email": "sb@sebastian-bergmann.de",
+                    "email": "sebastian@phpunit.de",
                     "role": "lead"
                 }
             ],
@@ -4082,20 +4159,20 @@
                 "testing",
                 "xunit"
             ],
-            "time": "2017-11-03 13:47:33"
+            "time": "2017-12-06 09:29:45"
         },
         {
             "name": "phpunit/php-file-iterator",
-            "version": "1.4.2",
+            "version": "1.4.5",
             "source": {
                 "type": "git",
                 "url": "https://github.com/sebastianbergmann/php-file-iterator.git",
-                "reference": "3cc8f69b3028d0f96a9078e6295d86e9bf019be5"
+                "reference": "730b01bc3e867237eaac355e06a36b85dd93a8b4"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/3cc8f69b3028d0f96a9078e6295d86e9bf019be5",
-                "reference": "3cc8f69b3028d0f96a9078e6295d86e9bf019be5",
+                "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/730b01bc3e867237eaac355e06a36b85dd93a8b4",
+                "reference": "730b01bc3e867237eaac355e06a36b85dd93a8b4",
                 "shasum": ""
             },
             "require": {
@@ -4129,7 +4206,7 @@
                 "filesystem",
                 "iterator"
             ],
-            "time": "2016-10-03 07:40:28"
+            "time": "2017-11-27 13:52:08"
         },
         {
             "name": "phpunit/php-text-template",
@@ -4223,16 +4300,16 @@
         },
         {
             "name": "phpunit/php-token-stream",
-            "version": "2.0.1",
+            "version": "2.0.2",
             "source": {
                 "type": "git",
                 "url": "https://github.com/sebastianbergmann/php-token-stream.git",
-                "reference": "9a02332089ac48e704c70f6cefed30c224e3c0b0"
+                "reference": "791198a2c6254db10131eecfe8c06670700904db"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/sebastianbergmann/php-token-stream/zipball/9a02332089ac48e704c70f6cefed30c224e3c0b0",
-                "reference": "9a02332089ac48e704c70f6cefed30c224e3c0b0",
+                "url": "https://api.github.com/repos/sebastianbergmann/php-token-stream/zipball/791198a2c6254db10131eecfe8c06670700904db",
+                "reference": "791198a2c6254db10131eecfe8c06670700904db",
                 "shasum": ""
             },
             "require": {
@@ -4268,20 +4345,20 @@
             "keywords": [
                 "tokenizer"
             ],
-            "time": "2017-08-20 05:47:52"
+            "time": "2017-11-27 05:48:46"
         },
         {
             "name": "phpunit/phpunit",
-            "version": "6.4.3",
+            "version": "6.5.5",
             "source": {
                 "type": "git",
                 "url": "https://github.com/sebastianbergmann/phpunit.git",
-                "reference": "06b28548fd2b4a20c3cd6e247dc86331a7d4db13"
+                "reference": "83d27937a310f2984fd575686138597147bdc7df"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/06b28548fd2b4a20c3cd6e247dc86331a7d4db13",
-                "reference": "06b28548fd2b4a20c3cd6e247dc86331a7d4db13",
+                "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/83d27937a310f2984fd575686138597147bdc7df",
+                "reference": "83d27937a310f2984fd575686138597147bdc7df",
                 "shasum": ""
             },
             "require": {
@@ -4295,12 +4372,12 @@
                 "phar-io/version": "^1.0",
                 "php": "^7.0",
                 "phpspec/prophecy": "^1.7",
-                "phpunit/php-code-coverage": "^5.2.2",
-                "phpunit/php-file-iterator": "^1.4.2",
+                "phpunit/php-code-coverage": "^5.3",
+                "phpunit/php-file-iterator": "^1.4.3",
                 "phpunit/php-text-template": "^1.2.1",
                 "phpunit/php-timer": "^1.0.9",
-                "phpunit/phpunit-mock-objects": "^4.0.3",
-                "sebastian/comparator": "^2.0.2",
+                "phpunit/phpunit-mock-objects": "^5.0.5",
+                "sebastian/comparator": "^2.1",
                 "sebastian/diff": "^2.0",
                 "sebastian/environment": "^3.1",
                 "sebastian/exporter": "^3.1",
@@ -4326,7 +4403,7 @@
             "type": "library",
             "extra": {
                 "branch-alias": {
-                    "dev-master": "6.4.x-dev"
+                    "dev-master": "6.5.x-dev"
                 }
             },
             "autoload": {
@@ -4352,33 +4429,33 @@
                 "testing",
                 "xunit"
             ],
-            "time": "2017-10-16 13:18:59"
+            "time": "2017-12-17 06:31:19"
         },
         {
             "name": "phpunit/phpunit-mock-objects",
-            "version": "4.0.4",
+            "version": "5.0.5",
             "source": {
                 "type": "git",
                 "url": "https://github.com/sebastianbergmann/phpunit-mock-objects.git",
-                "reference": "2f789b59ab89669015ad984afa350c4ec577ade0"
+                "reference": "283b9f4f670e3a6fd6c4ff95c51a952eb5c75933"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/sebastianbergmann/phpunit-mock-objects/zipball/2f789b59ab89669015ad984afa350c4ec577ade0",
-                "reference": "2f789b59ab89669015ad984afa350c4ec577ade0",
+                "url": "https://api.github.com/repos/sebastianbergmann/phpunit-mock-objects/zipball/283b9f4f670e3a6fd6c4ff95c51a952eb5c75933",
+                "reference": "283b9f4f670e3a6fd6c4ff95c51a952eb5c75933",
                 "shasum": ""
             },
             "require": {
                 "doctrine/instantiator": "^1.0.5",
                 "php": "^7.0",
                 "phpunit/php-text-template": "^1.2.1",
-                "sebastian/exporter": "^3.0"
+                "sebastian/exporter": "^3.1"
             },
             "conflict": {
                 "phpunit/phpunit": "<6.0"
             },
             "require-dev": {
-                "phpunit/phpunit": "^6.0"
+                "phpunit/phpunit": "^6.5"
             },
             "suggest": {
                 "ext-soap": "*"
@@ -4386,7 +4463,7 @@
             "type": "library",
             "extra": {
                 "branch-alias": {
-                    "dev-master": "4.0.x-dev"
+                    "dev-master": "5.0.x-dev"
                 }
             },
             "autoload": {
@@ -4401,7 +4478,7 @@
             "authors": [
                 {
                     "name": "Sebastian Bergmann",
-                    "email": "sb@sebastian-bergmann.de",
+                    "email": "sebastian@phpunit.de",
                     "role": "lead"
                 }
             ],
@@ -4411,7 +4488,7 @@
                 "mock",
                 "xunit"
             ],
-            "time": "2017-08-03 14:08:16"
+            "time": "2017-12-10 08:01:53"
         },
         {
             "name": "sebastian/code-unit-reverse-lookup",
@@ -4974,23 +5051,23 @@
         },
         {
             "name": "symfony/class-loader",
-            "version": "v3.3.10",
+            "version": "v3.4.2",
             "source": {
                 "type": "git",
                 "url": "https://github.com/symfony/class-loader.git",
-                "reference": "7572c904b209fa9907c69a6a9a68243c265a4d01"
+                "reference": "e8d36a7b5568d232f5c3f8ef92665836b9f1e038"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/class-loader/zipball/7572c904b209fa9907c69a6a9a68243c265a4d01",
-                "reference": "7572c904b209fa9907c69a6a9a68243c265a4d01",
+                "url": "https://api.github.com/repos/symfony/class-loader/zipball/e8d36a7b5568d232f5c3f8ef92665836b9f1e038",
+                "reference": "e8d36a7b5568d232f5c3f8ef92665836b9f1e038",
                 "shasum": ""
             },
             "require": {
                 "php": "^5.5.9|>=7.0.8"
             },
             "require-dev": {
-                "symfony/finder": "~2.8|~3.0",
+                "symfony/finder": "~2.8|~3.0|~4.0",
                 "symfony/polyfill-apcu": "~1.1"
             },
             "suggest": {
@@ -4999,7 +5076,7 @@
             "type": "library",
             "extra": {
                 "branch-alias": {
-                    "dev-master": "3.3-dev"
+                    "dev-master": "3.4-dev"
                 }
             },
             "autoload": {
@@ -5026,20 +5103,20 @@
             ],
             "description": "Symfony ClassLoader Component",
             "homepage": "https://symfony.com",
-            "time": "2017-10-02 06:42:24"
+            "time": "2017-11-05 16:10:10"
         },
         {
             "name": "symfony/dom-crawler",
-            "version": "v3.3.10",
+            "version": "v3.4.2",
             "source": {
                 "type": "git",
                 "url": "https://github.com/symfony/dom-crawler.git",
-                "reference": "40dafd42d5dad7fe5ad4e958413d92a207522ac1"
+                "reference": "dc847845c66fa68ad4522ed27e62b9b9dd12ab3b"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/dom-crawler/zipball/40dafd42d5dad7fe5ad4e958413d92a207522ac1",
-                "reference": "40dafd42d5dad7fe5ad4e958413d92a207522ac1",
+                "url": "https://api.github.com/repos/symfony/dom-crawler/zipball/dc847845c66fa68ad4522ed27e62b9b9dd12ab3b",
+                "reference": "dc847845c66fa68ad4522ed27e62b9b9dd12ab3b",
                 "shasum": ""
             },
             "require": {
@@ -5047,7 +5124,7 @@
                 "symfony/polyfill-mbstring": "~1.0"
             },
             "require-dev": {
-                "symfony/css-selector": "~2.8|~3.0"
+                "symfony/css-selector": "~2.8|~3.0|~4.0"
             },
             "suggest": {
                 "symfony/css-selector": ""
@@ -5055,7 +5132,7 @@
             "type": "library",
             "extra": {
                 "branch-alias": {
-                    "dev-master": "3.3-dev"
+                    "dev-master": "3.4-dev"
                 }
             },
             "autoload": {
@@ -5082,7 +5159,7 @@
             ],
             "description": "Symfony DomCrawler Component",
             "homepage": "https://symfony.com",
-            "time": "2017-10-02 06:42:24"
+            "time": "2017-12-14 19:40:10"
         },
         {
             "name": "theseer/tokenizer",
@@ -5183,7 +5260,7 @@
     "prefer-stable": false,
     "prefer-lowest": false,
     "platform": {
-        "php": ">=5.6.4"
+        "php": ">=7.0.0"
     },
     "platform-dev": []
 }
diff --git a/config/app.php b/config/app.php
index 2e409ae..f8ccbe4 100644
--- a/config/app.php
+++ b/config/app.php
@@ -23,7 +23,7 @@ return [
     | Portal Version
     |--------------------------------------------------------------------------
     */
-    'version' => '2.1.0',
+    'version' => '2.1.1',
 
     /*
     |--------------------------------------------------------------------------
@@ -79,6 +79,20 @@ return [
 
     /*
     |--------------------------------------------------------------------------
+    | Application Date and Date-Time Format
+    |--------------------------------------------------------------------------
+    |
+    | Here you may specify the default date as well as date and time
+    | format used across the application.
+    |
+    */
+
+    'date_format' => 'Y-m-d',
+
+    'date_time_format' => 'Y-m-d \a\t h:i A',
+
+    /*
+    |--------------------------------------------------------------------------
     | Application Locale Configuration
     |--------------------------------------------------------------------------
     |
diff --git a/database/factories/ActivityFactory.php b/database/factories/ActivityFactory.php
new file mode 100644
index 0000000..a14a35b
--- /dev/null
+++ b/database/factories/ActivityFactory.php
@@ -0,0 +1,15 @@
+<?php
+
+use Faker\Generator as Faker;
+use Portal\Services\Logging\UserActivity\Activity;
+
+$factory->define(Activity::class, function (Faker $faker) {
+    return [
+        'user_id' => function () {
+            return factory(\Portal\User::class)->create()->id;
+        },
+        'description' => substr($faker->paragraph, 0, 255),
+        'ip_address' => $faker->ipv4,
+        'user_agent' => $faker->userAgent
+    ];
+});
diff --git a/database/factories/CountryFactory.php b/database/factories/CountryFactory.php
new file mode 100644
index 0000000..08600d9
--- /dev/null
+++ b/database/factories/CountryFactory.php
@@ -0,0 +1,15 @@
+<?php
+
+use Faker\Generator as Faker;
+use Portal\Country;
+
+$factory->define(Country::class, function (Faker $faker) {
+    return [
+        'country_code' => $faker->countryCode,
+        'iso_3166_2' => strtoupper($faker->randomLetter . $faker->randomLetter),
+        'iso_3166_3' => $faker->countryISOAlpha3,
+        'name' => $faker->country,
+        'region_code' => 123,
+        'sub_region_code' => 123
+    ];
+});
diff --git a/database/factories/ModelFactory.php b/database/factories/ModelFactory.php
deleted file mode 100644
index cb6c8aa..0000000
--- a/database/factories/ModelFactory.php
+++ /dev/null
@@ -1,98 +0,0 @@
-<?php
-
-/*
-|--------------------------------------------------------------------------
-| Model Factories
-|--------------------------------------------------------------------------
-|
-| Here you may define all of your model factories. Model factories give
-| you a convenient way to create models for testing and seeding your
-| database. Just tell the factory how a default model should look.
-|
-*/
-
-use Portal\Country;
-use Portal\Services\Logging\UserActivity\Activity;
-use Portal\Support\Enum\UserStatus;
-
-$factory->define(Portal\User::class, function (Faker\Generator $faker, array $attrs) {
-
-    $countryId = isset($attrs['country_id'])
-        ? $attrs['country_id']
-        : $faker->randomElement(Country::pluck('id')->toArray());
-
-    $roleId = isset($attrs['role_id'])
-        ? $attrs['role_id']
-        : factory(\Portal\Role::class)->create()->id;
-
-    return [
-        'email' => $faker->email,
-        'password' => bcrypt(str_random(10)),
-        'first_name' => $faker->firstName,
-        'last_name' => $faker->lastName,
-        'phone' => $faker->phoneNumber,
-        'avatar' => null,
-        'address' => $faker->address,
-        'country_id' => $countryId,
-        'role_id' => $roleId,
-        'status' => UserStatus::ACTIVE,
-        'birthday' => $faker->date()
-    ];
-});
-
-$factory->define(Portal\Role::class, function (Faker\Generator $faker) {
-    return [
-        'name' => str_random(5),
-        'display_name' => implode(" ", $faker->words(2)),
-        'description' => substr($faker->paragraph, 0, 255),
-        'removable' => true,
-    ];
-});
-
-$factory->define(Portal\Permission::class, function (Faker\Generator $faker) {
-    return [
-        'name' => str_random(5),
-        'display_name' => implode(" ", $faker->words(2)),
-        'description' => substr($faker->paragraph, 0, 255),
-        'removable' => true
-    ];
-});
-
-$factory->define(Activity::class, function (Faker\Generator $faker, array $attrs) {
-
-    $userId = isset($attrs['user_id'])
-        ? $attrs['user_id']
-        : factory(\Portal\User::class)->create()->id;
-
-    return [
-        'user_id' => $userId,
-        'description' => substr($faker->paragraph, 0, 255),
-        'ip_address' => $faker->ipv4,
-        'user_agent' => $faker->userAgent
-    ];
-});
-
-$factory->define(Country::class, function (Faker\Generator $faker) {
-    return [
-        'country_code' => $faker->countryCode,
-        'iso_3166_2' => strtoupper($faker->randomLetter . $faker->randomLetter),
-        'iso_3166_3' => $faker->countryISOAlpha3,
-        'name' => $faker->country,
-        'region_code' => 123,
-        'sub_region_code' => 123
-    ];
-});
-
-$factory->define(\Portal\Services\Auth\Api\Token::class, function (Faker\Generator $faker, array $attrs) {
-    $userId = isset($attrs['user_id'])
-        ? $attrs['user_id']
-        : factory(\Portal\User::class)->create()->id;
-
-    return [
-        'id' => str_random(40),
-        'user_id' => $userId,
-        'ip_address' => $faker->ipv4,
-        'user_agent' => substr($faker->userAgent, 0, 500),
-        'expires_at' => \Carbon\Carbon::now()->addMinutes(60)
-    ];
-});
diff --git a/database/factories/PermissionFactory.php b/database/factories/PermissionFactory.php
new file mode 100644
index 0000000..d7c8ea3
--- /dev/null
+++ b/database/factories/PermissionFactory.php
@@ -0,0 +1,12 @@
+<?php
+
+use Faker\Generator as Faker;
+
+$factory->define(Portal\Permission::class, function (Faker $faker) {
+    return [
+        'name' => str_random(5),
+        'display_name' => implode(" ", $faker->words(2)),
+        'description' => substr($faker->paragraph, 0, 191),
+        'removable' => true
+    ];
+});
diff --git a/database/factories/RoleFactory.php b/database/factories/RoleFactory.php
new file mode 100644
index 0000000..d85f880
--- /dev/null
+++ b/database/factories/RoleFactory.php
@@ -0,0 +1,12 @@
+<?php
+
+use Faker\Generator as Faker;
+
+$factory->define(Portal\Role::class, function (Faker $faker) {
+    return [
+        'name' => str_random(5),
+        'display_name' => implode(" ", $faker->words(2)),
+        'description' => substr($faker->paragraph, 0, 191),
+        'removable' => true,
+    ];
+});
diff --git a/database/factories/TokenFactory.php b/database/factories/TokenFactory.php
new file mode 100644
index 0000000..a22d85a
--- /dev/null
+++ b/database/factories/TokenFactory.php
@@ -0,0 +1,15 @@
+<?php
+
+use Faker\Generator as Faker;
+
+$factory->define(\Portal\Services\Auth\Api\Token::class, function (Faker $faker) {
+    return [
+        'id' => str_random(40),
+        'user_id' => function () {
+            return factory(\Portal\User::class)->create()->id;
+        },
+        'ip_address' => $faker->ipv4,
+        'user_agent' => substr($faker->userAgent, 0, 500),
+        'expires_at' => \Carbon\Carbon::now()->addMinutes(60)
+    ];
+});
diff --git a/database/factories/UserFactory.php b/database/factories/UserFactory.php
new file mode 100644
index 0000000..fe8d2f0
--- /dev/null
+++ b/database/factories/UserFactory.php
@@ -0,0 +1,23 @@
+<?php
+
+use Faker\Generator as Faker;
+
+$factory->define(Portal\User::class, function (Faker $faker) {
+    return [
+        'email' => $faker->email,
+        'password' => bcrypt(str_random(10)),
+        'first_name' => $faker->firstName,
+        'last_name' => $faker->lastName,
+        'phone' => $faker->phoneNumber,
+        'avatar' => null,
+        'address' => $faker->address,
+        'country_id' => function () use ($faker) {
+            return $faker->randomElement(Portal\Country::pluck('id')->toArray());
+        },
+        'role_id' => function () {
+            return factory(\Portal\Role::class)->create()->id;
+        },
+        'status' => Portal\Support\Enum\UserStatus::ACTIVE,
+        'birthday' => $faker->date()
+    ];
+});
diff --git a/database/migrations/2015_10_10_170827_create_users_table.php b/database/migrations/2015_10_10_170827_create_users_table.php
index b41dcc5..7904176 100644
--- a/database/migrations/2015_10_10_170827_create_users_table.php
+++ b/database/migrations/2015_10_10_170827_create_users_table.php
@@ -21,7 +21,7 @@ class CreateUsersTable extends Migration
             $table->string('last_name')->nullable();
             $table->string('phone')->nullable();
             $table->string('avatar')->nullable();
-            $table->string('address')->default('');
+            $table->string('address')->nullable();
             $table->unsignedInteger('country_id')->nullable();
             $table->unsignedInteger('role_id');
             $table->date('birthday')->nullable();
diff --git a/extra/auth.php b/extra/auth.php
index 0ddfd1c..fb9840d 100644
--- a/extra/auth.php
+++ b/extra/auth.php
@@ -1,6 +1,6 @@
 <?php
 
-require __DIR__.'/../bootstrap/autoload.php';
+require __DIR__.'/../vendor/autoload.php';
 $app = require_once __DIR__.'/../bootstrap/app.php';
 
 $request = Illuminate\Http\Request::capture();
@@ -17,7 +17,7 @@ $kernel->handle($request);
 function redirectTo($url)
 {
     if (! headers_sent()) {
-        header('Location: '.$url, TRUE, 302);
+        header('Location: '.$url, true, 302);
     } else {
         echo '<script type="text/javascript">';
         echo 'window.location.href="'.$url.'";';
@@ -27,4 +27,4 @@ function redirectTo($url)
         echo '</noscript>';
     }
     exit;
-}
\ No newline at end of file
+}
diff --git a/package.json b/package.json
index 6b58680..f3bdda4 100644
--- a/package.json
+++ b/package.json
@@ -1,14 +1,21 @@
 {
   "private": true,
+  "scripts": {
+    "dev": "npm run development",
+    "development": "cross-env NODE_ENV=development node_modules/webpack/bin/webpack.js --progress --hide-modules --config=node_modules/laravel-mix/setup/webpack.config.js",
+    "watch": "cross-env NODE_ENV=development node_modules/webpack/bin/webpack.js --watch --progress --hide-modules --config=node_modules/laravel-mix/setup/webpack.config.js",
+    "watch-poll": "npm run watch -- --watch-poll",
+    "hot": "cross-env NODE_ENV=development node_modules/webpack-dev-server/bin/webpack-dev-server.js --inline --hot --config=node_modules/laravel-mix/setup/webpack.config.js",
+    "prod": "npm run production",
+    "production": "cross-env NODE_ENV=production node_modules/webpack/bin/webpack.js --no-progress --hide-modules --config=node_modules/laravel-mix/setup/webpack.config.js"
+  },
   "devDependencies": {
-    "laravel-mix": "^0.7.2",
+    "axios": "^0.17",
     "bootstrap-sass": "^3.3.7",
-    "lodash": "^4.17.4"
-  },
-  "scripts": {
-    "dev": "node node_modules/cross-env/bin/cross-env.js NODE_ENV=development node_modules/webpack/bin/webpack.js --progress --hide-modules --config=node_modules/laravel-mix/setup/webpack.config.js",
-    "watch": "node node_modules/cross-env/bin/cross-env.js NODE_ENV=development node_modules/webpack/bin/webpack.js --watch --progress --hide-modules --config=node_modules/laravel-mix/setup/webpack.config.js",
-    "hot": "node node_modules/cross-env/bin/cross-env.js NODE_ENV=development node_modules/webpack-dev-server/bin/webpack-dev-server.js --inline --hot --config=node_modules/laravel-mix/setup/webpack.config.js",
-    "production": "node node_modules/cross-env/bin/cross-env.js NODE_ENV=production node_modules/webpack/bin/webpack.js --progress --hide-modules --config=node_modules/laravel-mix/setup/webpack.config.js"
+    "cross-env": "^5.1",
+    "jquery": "^3.2",
+    "laravel-mix": "^1.0",
+    "lodash": "^4.17.4",
+    "vue": "^2.5.7"
   }
-}
+}
\ No newline at end of file
diff --git a/resources/assets/js/app.js b/resources/assets/js/app.js
new file mode 100644
index 0000000..922878b
--- /dev/null
+++ b/resources/assets/js/app.js
@@ -0,0 +1,22 @@
+
+/**
+ * First we will load all of this project's JavaScript dependencies which
+ * includes Vue and other libraries. It is a great starting point when
+ * building robust, powerful web applications using Vue and Laravel.
+ */
+
+require('./bootstrap');
+
+window.Vue = require('vue');
+
+/**
+ * Next, we will create a fresh Vue application instance and attach it to
+ * the page. Then, you may begin adding components to this application
+ * or customize the JavaScript scaffolding to fit your unique needs.
+ */
+
+Vue.component('example', require('./components/Example.vue'));
+
+const app = new Vue({
+    el: '#app'
+});
\ No newline at end of file
diff --git a/resources/assets/js/bootstrap.js b/resources/assets/js/bootstrap.js
new file mode 100644
index 0000000..9042114
--- /dev/null
+++ b/resources/assets/js/bootstrap.js
@@ -0,0 +1,53 @@
+
+window._ = require('lodash');
+
+/**
+ * We'll load jQuery and the Bootstrap jQuery plugin which provides support
+ * for JavaScript based Bootstrap features such as modals and tabs. This
+ * code may be modified to fit the specific needs of your application.
+ */
+
+try {
+    window.$ = window.jQuery = require('jquery');
+
+    require('bootstrap-sass');
+} catch (e) {}
+
+/**
+ * We'll load the axios HTTP library which allows us to easily issue requests
+ * to our Laravel back-end. This library automatically handles sending the
+ * CSRF token as a header based on the value of the "XSRF" token cookie.
+ */
+
+window.axios = require('axios');
+
+window.axios.defaults.headers.common['X-Requested-With'] = 'XMLHttpRequest';
+
+/**
+ * Next we will register the CSRF Token as a common header with Axios so that
+ * all outgoing HTTP requests automatically have it attached. This is just
+ * a simple convenience so we don't have to attach every token manually.
+ */
+
+let token = document.head.querySelector('meta[name="csrf-token"]');
+
+if (token) {
+    window.axios.defaults.headers.common['X-CSRF-TOKEN'] = token.content;
+} else {
+    console.error('CSRF token not found: https://laravel.com/docs/csrf#csrf-x-csrf-token');
+}
+
+/**
+ * Echo exposes an expressive API for subscribing to channels and listening
+ * for events that are broadcast by Laravel. Echo and event broadcasting
+ * allows your team to easily build robust real-time web applications.
+ */
+
+// import Echo from 'laravel-echo'
+
+// window.Pusher = require('pusher-js');
+
+// window.Echo = new Echo({
+//     broadcaster: 'pusher',
+//     key: 'your-pusher-key'
+// });
\ No newline at end of file
diff --git a/resources/assets/js/components/Example.vue b/resources/assets/js/components/Example.vue
new file mode 100644
index 0000000..0439f43
--- /dev/null
+++ b/resources/assets/js/components/Example.vue
@@ -0,0 +1,23 @@
+<template>
+    <div class="container">
+        <div class="row">
+            <div class="col-md-8 col-md-offset-2">
+                <div class="panel panel-default">
+                    <div class="panel-heading">Example Component</div>
+
+                    <div class="panel-body">
+                        I'm an example component!
+                    </div>
+                </div>
+            </div>
+        </div>
+    </div>
+</template>
+
+<script>
+    export default {
+        mounted() {
+            console.log('Component mounted.')
+        }
+    }
+</script>
\ No newline at end of file
diff --git a/resources/assets/sass/_variables.scss b/resources/assets/sass/_variables.scss
new file mode 100644
index 0000000..06a96e4
--- /dev/null
+++ b/resources/assets/sass/_variables.scss
@@ -0,0 +1,38 @@
+
+// Body
+$body-bg: #f5f8fa;
+
+// Borders
+$laravel-border-color: darken($body-bg, 10%);
+$list-group-border: $laravel-border-color;
+$navbar-default-border: $laravel-border-color;
+$panel-default-border: $laravel-border-color;
+$panel-inner-border: $laravel-border-color;
+
+// Brands
+$brand-primary: #3097D1;
+$brand-info: #8eb4cb;
+$brand-success: #2ab27b;
+$brand-warning: #cbb956;
+$brand-danger: #bf5329;
+
+// Typography
+$icon-font-path: "~bootstrap-sass/assets/fonts/bootstrap/";
+$font-family-sans-serif: "Raleway", sans-serif;
+$font-size-base: 14px;
+$line-height-base: 1.6;
+$text-color: #636b6f;
+
+// Navbar
+$navbar-default-bg: #fff;
+
+// Buttons
+$btn-default-color: $text-color;
+
+// Inputs
+$input-border: lighten($text-color, 40%);
+$input-border-focus: lighten($brand-primary, 25%);
+$input-color-placeholder: lighten($text-color, 30%);
+
+// Panels
+$panel-default-heading-bg: #fff;
\ No newline at end of file
diff --git a/resources/assets/sass/app.scss b/resources/assets/sass/app.scss
index bb76e29..548c375 100644
--- a/resources/assets/sass/app.scss
+++ b/resources/assets/sass/app.scss
@@ -1,2 +1,8 @@
-// @import "node_modules/bootstrap-sass/assets/stylesheets/bootstrap";
+// Fonts
+@import url("https://fonts.googleapis.com/css?family=Raleway:300,400,600");
 
+// Variables
+@import "variables";
+
+// Bootstrap
+@import "~bootstrap-sass/assets/stylesheets/bootstrap";
\ No newline at end of file
diff --git a/resources/lang/de/app.php b/resources/lang/de/app.php
index c172fae..908ba98 100644
--- a/resources/lang/de/app.php
+++ b/resources/lang/de/app.php
@@ -318,18 +318,19 @@ return [
     'confirm_email' => 'eMail Adresse bestätigen',
 
     'months' => [
-        'January' => 'Januar',
-        'February' => 'Februar',
-        'March' => 'März',
-        'April' => 'April',
-        'May' => 'Mai',
-        'June' => 'Juni',
-        'July' => 'Juli',
-        'August' => 'August',
-        'September' => 'September',
-        'October' => 'Oktober',
-        'November' => 'November',
-        'December' => 'Dezember',
-    ]
-];
+        1 => 'Januar',
+        2 => 'Februar',
+        3 => 'März',
+        4 => 'April',
+        5 => 'Mai',
+        6 => 'Juni',
+        7 => 'Juli',
+        8 => 'August',
+        9 => 'September',
+        10 => 'Oktober',
+        11 => 'November',
+        12 => 'Dezember',
+    ],
 
+    'unknown' => 'Unbekannt'
+];
diff --git a/resources/lang/en/app.php b/resources/lang/en/app.php
index e40fe94..f547c0f 100644
--- a/resources/lang/en/app.php
+++ b/resources/lang/en/app.php
@@ -321,19 +321,20 @@ return [
     'regards' => 'Regards',
 
     'months' => [
-        'January' => 'January',
-        'February' => 'February',
-        'March' => 'March',
-        'April' => 'April',
-        'May' => 'May',
-        'June' => 'June',
-        'July' => 'July',
-        'August' => 'August',
-        'September' => 'September',
-        'October' => 'October',
-        'November' => 'November',
-        'December' => 'December',
+        1 => 'January',
+        2 => 'February',
+        3 => 'March',
+        4 => 'April',
+        5 => 'May',
+        6 => 'June',
+        7 => 'July',
+        8 => 'August',
+        9 => 'September',
+        10 => 'October',
+        11 => 'November',
+        12 => 'December',
     ],
 
     'avatar_not_changed' => 'Avatar image cannot be updated. Please try again.',
+    'unknown' => 'Unknown'
 ];
diff --git a/resources/lang/sr/app.php b/resources/lang/sr/app.php
index c80b5cd..15cf01e 100644
--- a/resources/lang/sr/app.php
+++ b/resources/lang/sr/app.php
@@ -313,19 +313,20 @@ return [
     'confirm_email' => 'Potvrdi E-Mail',
 
     'months' => [
-        'January' => 'Januar',
-        'February' => 'Februar',
-        'March' => 'Mart',
-        'April' => 'April',
-        'May' => 'Maj',
-        'June' => 'Jun',
-        'July' => 'Jul',
-        'August' => 'Avgust',
-        'September' => 'Septembar',
-        'October' => 'Oktobar',
-        'November' => 'Novembar',
-        'December' => 'Decembar',
+        1 => 'Januar',
+        2 => 'Februar',
+        3 => 'Mart',
+        4 => 'April',
+        5 => 'Maj',
+        6 => 'Jun',
+        7 => 'Jul',
+        8 => 'Avgust',
+        9 => 'Septembar',
+        10 => 'Oktobar',
+        11 => 'Novembar',
+        12 => 'Decembar',
     ],
 
     'avatar_not_changed' => 'Avatar ne može biti ažuriran. Molimo pokušajte ponovo.',
+    'unknown' => 'Nepoznato'
 ];
diff --git a/resources/views/activity/index.blade.php b/resources/views/activity/index.blade.php
index df7a421..3f80bc0 100644
--- a/resources/views/activity/index.blade.php
+++ b/resources/views/activity/index.blade.php
@@ -76,7 +76,7 @@
                     @endif
                     <td>{{ $activity->ip_address }}</td>
                     <td>{{ $activity->description }}</td>
-                    <td>{{ $activity->created_at->format('Y-m-d H:i:s') }}</td>
+                    <td>{{ $activity->created_at->format(config('app.date_time_format')) }}</td>
                     <td class="text-center">
                         <a tabindex="0" role="button" class="btn btn-primary btn-circle"
                            data-trigger="focus"
diff --git a/resources/views/errors/token-mismatch.blade.php b/resources/views/errors/token-mismatch.blade.php
deleted file mode 100644
index 44d1d8f..0000000
--- a/resources/views/errors/token-mismatch.blade.php
+++ /dev/null
@@ -1,43 +0,0 @@
-<!DOCTYPE html>
-<html lang="en">
-<head>
-    <meta charset="utf-8">
-    <meta http-equiv="X-UA-Compatible" content="IE=edge">
-    <meta name="viewport" content="width=device-width, initial-scale=1">
-    <title>TokenMismatch</title>
-
-    {!! HTML::style('assets/css/bootstrap.min.css') !!}
-
-    <style>
-        body { padding-top: 100px; }
-        h1 { font-size: 34px;
-            margin-top: 40px;
-        }
-
-        @media (max-width: 768px) {
-            body { padding-top: 50px; }
-        }
-    </style>
-</head>
-
-<body>
-
-<div class="container">
-
-    <div class="row">
-        <div class="col-md-6 col-md-push-3">
-            <div class="text-center">
-                    <img src="{{ url('assets/img/portal-logo-no-text.png') }}" alt="{{ settings('app_name') }}" class="logo">
-                <h1>Token Mismatch</h1>
-                <br />
-                <p>
-                    Hmmm... Seems you couldn't submit form for a longtime. Please go back, refresh the page and try again.
-                </p>
-            </div>
-        </div>
-    </div>
-
-</div>
-
-</body>
-</html>
\ No newline at end of file
diff --git a/resources/views/user/list.blade.php b/resources/views/user/list.blade.php
index 68cecbf..f4f4d8a 100644
--- a/resources/views/user/list.blade.php
+++ b/resources/views/user/list.blade.php
@@ -69,7 +69,7 @@
                         <td>{{ $user->username ?: trans('app.n_a') }}</td>
                         <td>{{ $user->first_name . ' ' . $user->last_name }}</td>
                         <td>{{ $user->email }}</td>
-                        <td>{{ $user->created_at->format('Y-m-d') }}</td>
+                        <td>{{ $user->created_at->format(config('app.date_format')) }}</td>
                         <td>
                             <span class="label label-{{ $user->present()->labelClass }}">{{ trans("app.{$user->status}") }}</span>
                         </td>
diff --git a/resources/views/user/sessions.blade.php b/resources/views/user/sessions.blade.php
index 1f7a893..9a1fdef 100644
--- a/resources/views/user/sessions.blade.php
+++ b/resources/views/user/sessions.blade.php
@@ -31,18 +31,24 @@
 <div class="table-responsive">
     <table class="table">
         <thead>
-            <th>@lang('app.ip_address')</th>
-            <th>@lang('app.user_agent')</th>
-            <th>@lang('app.last_activity')</th>
-            <th class="text-center">@lang('app.action')</th>
+            <tr>
+                <th>@lang('app.ip_address')</th>
+                <th>Device</th>
+                <th>Browser</th>
+                <th>@lang('app.last_activity')</th>
+                <th class="text-center">@lang('app.action')</th>
+            </tr>
         </thead>
         <tbody>
             @if (count($sessions))
                 @foreach ($sessions as $session)
                     <tr>
                         <td>{{ $session->ip_address }}</td>
-                        <td>{{ $session->user_agent }}</td>
-                        <td>{{ \Carbon\Carbon::createFromTimestamp($session->last_activity)->format('Y-m-d H:i:s') }}</td>
+                        <td>
+                            {{ $session->device ?: trans('app.unknown') }} ({{ $session->platform ?: trans('app.unknown') }})
+                        </td>
+                        <td>{{ $session->browser ?: trans('app.unknown') }}</td>
+                        <td>{{ $session->last_activity->format(config('app.date_time_format')) }}</td>
                         <td class="text-center">
                             <a href="{{ isset($profile) ? route('profile.sessions.invalidate', $session->id) : route('user.sessions.invalidate', [$user->id, $session->id]) }}"
                                 class="btn btn-danger btn-circle" title="@lang('app.invalidate_session')"
diff --git a/resources/views/user/view.blade.php b/resources/views/user/view.blade.php
index 6fd44db..3425de5 100644
--- a/resources/views/user/view.blade.php
+++ b/resources/views/user/view.blade.php
@@ -110,7 +110,7 @@
                         @foreach($userActivities as $activity)
                             <tr>
                                 <td>{{ $activity->description }}</td>
-                                <td>{{ $activity->created_at }}</td>
+                                <td>{{ $activity->created_at->format(config('app.date_time_format')) }}</td>
                             </tr>
                         @endforeach
                     </tbody>
diff --git a/storage/settings.json b/storage/settings.json
index 9a6cc28..5951746 100644
--- a/storage/settings.json
+++ b/storage/settings.json
@@ -1 +1 @@
-{"remember_me":true,"notifications_signup_email":true,"forgot_password":true,"login_reset_token_lifetime":"30","throttle_enabled":true,"throttle_attempts":3,"throttle_lockout_time":2,"reg_enabled":false,"reg_email_confirmation":true,"2fa":{"enabled":true},"app_name":"foo","registration":{"captcha":{"enabled":false}},"tos":false,"captcha":{"enabled":false}}
\ No newline at end of file
+{"remember_me":true,"notifications_signup_email":true,"forgot_password":true,"login_reset_token_lifetime":"30","throttle_enabled":true,"throttle_attempts":3,"throttle_lockout_time":2,"reg_enabled":false,"reg_email_confirmation":true,"2fa":{"enabled":true},"app_name":"Portal","registration":{"captcha":{"enabled":false}},"tos":false,"captcha":{"enabled":false}}
\ No newline at end of file
diff --git a/tests/Feature/Http/Controllers/Api/Profile/SessionsControllerTest.php b/tests/Feature/Http/Controllers/Api/Profile/SessionsControllerTest.php
index aa0beb2..2dafbdd 100644
--- a/tests/Feature/Http/Controllers/Api/Profile/SessionsControllerTest.php
+++ b/tests/Feature/Http/Controllers/Api/Profile/SessionsControllerTest.php
@@ -4,6 +4,7 @@ namespace Tests\Feature\Http\Controllers\Api\Profile;
 
 use Carbon\Carbon;
 use Tests\Feature\ApiTestCase;
+use Portal\Repositories\Session\SessionRepository;
 use Portal\Transformers\SessionTransformer;
 use Portal\User;
 
@@ -62,8 +63,6 @@ class SessionsControllerTest extends ApiTestCase
 
         \DB::table('sessions')->insert($sessions);
 
-        return \DB::table('sessions')
-            ->where('user_id', $user->id)
-            ->get();
+        return app(SessionRepository::class)->getUserSessions($user->id);
     }
 }
diff --git a/tests/Feature/Http/Controllers/Api/SessionsControllerTest.php b/tests/Feature/Http/Controllers/Api/SessionsControllerTest.php
index 09017fa..358a2eb 100644
--- a/tests/Feature/Http/Controllers/Api/SessionsControllerTest.php
+++ b/tests/Feature/Http/Controllers/Api/SessionsControllerTest.php
@@ -5,6 +5,7 @@ namespace Tests\Feature\Http\Controllers\Api;
 use Carbon\Carbon;
 use Tests\Feature\ApiTestCase;
 use Tests\Feature\FunctionalTestCase;
+use Portal\Repositories\Session\SessionRepository;
 use Portal\Transformers\SessionTransformer;
 use Portal\User;
 
@@ -109,6 +110,6 @@ class SessionsControllerTest extends ApiTestCase
 
         \DB::table('sessions')->insert($data);
 
-        return (object) $data;
+        return app(SessionRepository::class)->find($sessionId);
     }
 }
diff --git a/tests/Feature/Http/Controllers/Api/Users/SessionsControllerTest.php b/tests/Feature/Http/Controllers/Api/Users/SessionsControllerTest.php
index cd9b934..1d8b1aa 100644
--- a/tests/Feature/Http/Controllers/Api/Users/SessionsControllerTest.php
+++ b/tests/Feature/Http/Controllers/Api/Users/SessionsControllerTest.php
@@ -3,6 +3,7 @@
 namespace Tests\Feature\Http\Controllers\Api\Users;
 
 use Tests\Feature\ApiTestCase;
+use Portal\Repositories\Session\SessionRepository;
 use Portal\Transformers\SessionTransformer;
 use Portal\User;
 
@@ -27,6 +28,10 @@ class SessionsControllerTest extends ApiTestCase
 
     public function test_get_user_sessions()
     {
+        putenv('SESSION_DRIVER=database');
+
+        $this->refreshApp();
+
         $user = $this->login();
 
         $this->addPermissionForUser($user, 'users.manage');
@@ -59,8 +64,6 @@ class SessionsControllerTest extends ApiTestCase
 
         \DB::table('sessions')->insert($sessions);
 
-        return \DB::table('sessions')
-            ->where('user_id', $user->id)
-            ->get();
+        return app(SessionRepository::class)->getUserSessions($user->id);
     }
 }
diff --git a/tests/Feature/Http/Controllers/Web/ActivityControllerTest.php b/tests/Feature/Http/Controllers/Web/ActivityControllerTest.php
index 2fbc295..a30ae85 100644
--- a/tests/Feature/Http/Controllers/Web/ActivityControllerTest.php
+++ b/tests/Feature/Http/Controllers/Web/ActivityControllerTest.php
@@ -77,7 +77,7 @@ class ActivityControllerTest extends FunctionalTestCase
         return $this->seeInTable('table', $user->present()->nameOrEmail, $row, 1)
             ->seeInTable('table', Input::ip(), $row, 2)
             ->seeInTable('table', $message, $row, 3)
-            ->seeInTable('table', Carbon::now(), $row, 4)
+            ->seeInTable('table', Carbon::now()->format(config('app.date_time_format')), $row, 4)
             ->seeElement("table tbody tr:nth-child({$row}) > td:nth-child(5) > a[data-content='".Input::header('User-agent')."']");
     }
 
diff --git a/tests/Feature/Http/Controllers/Web/ProfileControllerTest.php b/tests/Feature/Http/Controllers/Web/ProfileControllerTest.php
index aff0b4f..2f5324d 100644
--- a/tests/Feature/Http/Controllers/Web/ProfileControllerTest.php
+++ b/tests/Feature/Http/Controllers/Web/ProfileControllerTest.php
@@ -252,11 +252,11 @@ class ProfileControllerTest extends FunctionalTestCase
         $this->visit('profile/activity')
             ->seeInTable('table', Input::ip(), 1, 1)
             ->seeInTable('table', 'foo', 1, 2)
-            ->seeInTable('table', Carbon::now()->toDateTimeString(), 1, 3)
+            ->seeInTable('table', Carbon::now()->format(config('app.date_time_format')), 1, 3)
             ->seeElement("table tbody tr:nth-child(1) > td:nth-child(4) > {$buttonSelector}")
             ->seeInTable('table', Input::ip(), 2, 1)
             ->seeInTable('table', 'bar', 2, 2)
-            ->seeInTable('table', Carbon::now()->toDateTimeString(), 2, 3)
+            ->seeInTable('table', Carbon::now()->format(config('app.date_time_format')), 2, 3)
             ->seeElement("table tbody tr:nth-child(2) > td:nth-child(4) > {$buttonSelector}");
     }
 
@@ -274,12 +274,17 @@ class ProfileControllerTest extends FunctionalTestCase
 
         $user = $this->createAndLoginAdminUser();
 
+        $agent = $this->app['agent'];
+        $device = $agent->device() ?: 'Unknown';
+        $platform = $agent->platform() ?: 'Unknown';
+
         $this->visit('user')
             ->click('Active Sessions')
             ->seePageIs("profile/sessions")
             ->seeInTable('table', Input::ip(), 1, 1)
-            ->seeInTable('table', Input::header("User-agent"), 1, 2)
-            ->seeInTable('table', Carbon::now()->toDateString(), 1, 3);
+            ->seeInTable('table', "{$device} ({$platform})", 1, 2)
+            ->seeInTable('table', $agent->browser(), 1, 3)
+            ->seeInTable('table', Carbon::now()->format(config('app.date_time_format')), 1, 4);
 
         $this->assertEquals(1, $this->crawler->filter("table tbody tr")->count());
 
diff --git a/tests/Feature/Http/Controllers/Web/UsersControllerTest.php b/tests/Feature/Http/Controllers/Web/UsersControllerTest.php
index 21ae1f1..8ea22f2 100644
--- a/tests/Feature/Http/Controllers/Web/UsersControllerTest.php
+++ b/tests/Feature/Http/Controllers/Web/UsersControllerTest.php
@@ -7,9 +7,11 @@ use Hash;
 use Input;
 use Settings;
 use Tests\Feature\FunctionalTestCase;
+use Portal\Events\User\Banned;
 use Portal\Events\User\TwoFactorEnabledByAdmin;
 use Portal\Events\User\UpdatedByAdmin;
 use Portal\Role;
+use Portal\Services\Auth\Api\Token;
 use Portal\Support\Enum\UserStatus;
 use Portal\User;
 use Carbon\Carbon;
@@ -17,6 +19,19 @@ use Mockery as m;
 
 class UsersControllerTest extends FunctionalTestCase
 {
+    protected function validParams(array $overrides = [])
+    {
+        return array_merge([
+            'role_id' => Role::whereName('User')->first()->id,
+            'status' => UserStatus::ACTIVE,
+            'first_name' => 'foo',
+            'last_name' => 'bar',
+            'birthday' => Carbon::now()->subYears(25)->format('Y-m-d'),
+            'phone' => '12345667',
+            'address' => 'the address',
+            'country_id' => 688 //Serbia,
+        ], $overrides);
+    }
 
     public function test_users_table_is_displayed()
     {
@@ -180,16 +195,7 @@ class UsersControllerTest extends FunctionalTestCase
 
         $this->visit("user/{$user->id}/edit");
 
-        $data = [
-            'role_id' => Role::whereName('User')->first()->id,
-            'status' => UserStatus::BANNED,
-            'first_name' => 'foo',
-            'last_name' => 'bar',
-            'birthday' => Carbon::now()->subYears(25)->format('Y-m-d'),
-            'phone' => '12345667',
-            'address' => 'the address',
-            'country_id' => 688 //Serbia,
-        ];
+        $data = $this->validParams();
 
         $this->submitForm('update-details-btn', $data);
 
@@ -200,6 +206,48 @@ class UsersControllerTest extends FunctionalTestCase
             ->see('User updated successfully.');
     }
 
+    /** @test */
+    public function banning_user_will_invalidate_all_his_sessions_and_api_tokens()
+    {
+        putenv('SESSION_DRIVER=database');
+
+        $this->refreshApp();
+
+        $this->createAndLoginAdminUser();
+
+        $user = $this->createUser([
+            'remember_token' => str_random(60)
+        ]);
+
+        $user = $this->setRoleForUser($user, 'User');
+
+        \DB::table('sessions')->insert([
+            'id' => str_random(40),
+            'user_id' => $user->id,
+            'ip_address' => "127.0.0.1",
+            'user_agent' => 'Foo',
+            'payload' => str_random(),
+            'last_activity' => Carbon::now()->subMinute()->timestamp
+        ]);
+
+        factory(Token::class)->create(['user_id' => $user->id]);
+
+        $this->visit('user')
+            ->seeLink('', "user/{$user->id}/edit");
+
+        $this->visit("user/{$user->id}/edit");
+
+        $data = $this->validParams([
+            'status' => UserStatus::BANNED
+        ]);
+
+        $this->submitForm('update-details-btn', $data);
+
+        $this->assertDatabaseMissing('sessions', ['user_id' => $user->id]);
+        $this->assertNull($user->fresh()->remember_token);
+        $this->assertDatabaseMissing('api_tokens', ['user_id' => $user->id]);
+    }
+
     public function test_update_user_login_details()
     {
         $user = $this->createAndLoginAdminUser([
@@ -382,12 +430,17 @@ class UsersControllerTest extends FunctionalTestCase
 
         $user = $this->createAndLoginAdminUser();
 
+        $agent = $this->app['agent'];
+        $device = $agent->device() ?: 'Unknown';
+        $platform = $agent->platform() ?: 'Unknown';
+
         $this->visit('user')
             ->clickOn('a[title="User Sessions"]')
             ->seePageIs("user/{$user->id}/sessions")
             ->seeInTable('table', Input::ip(), 1, 1)
-            ->seeInTable('table', Input::header("User-agent"), 1, 2)
-            ->seeInTable('table', Carbon::now()->toDateString(), 1, 3);
+            ->seeInTable('table', "{$device} ({$platform})", 1, 2)
+            ->seeInTable('table', $agent->browser(), 1, 3)
+            ->seeInTable('table', Carbon::now()->format(config('app.date_time_format')), 1, 4);
 
         $this->assertEquals(1, $this->crawler->filter("table tbody tr")->count());
 
diff --git a/tests/Feature/Repositories/Session/DbSessionTest.php b/tests/Feature/Repositories/Session/DbSessionTest.php
index 868ea1e..626190a 100644
--- a/tests/Feature/Repositories/Session/DbSessionTest.php
+++ b/tests/Feature/Repositories/Session/DbSessionTest.php
@@ -37,20 +37,32 @@ class DbSessionTest extends FunctionalTestCase
         DB::table('sessions')->insert($data2);
 
         $expected = collect([
-            (object) $data1,
-            (object) $data2,
+            (object) $this->addAddMissingFields($data1),
+            (object) $this->addAddMissingFields($data2),
         ]);
         $expected = $expected->sortBy('id')->keyBy('id')->toArray();
 
-        $actual = collect($this->repo->getUserSessions($user->id))
+        $actual = $this->repo->getUserSessions($user->id)
             ->sortBy('id')
             ->keyBy('id')
             ->toArray();
 
-
         $this->assertEquals($expected, $actual);
     }
 
+    private function addAddMissingFields(array $data)
+    {
+        $agent = app('agent');
+        $agent->setUserAgent($data['user_agent']);
+
+        return array_merge($data, [
+            'browser' => $agent->browser(),
+            'platform' => $agent->platform(),
+            'device' => $agent->device(),
+            'last_activity' => Carbon::createFromTimestamp($data['last_activity'])
+        ]);
+    }
+
     public function test_if_get_user_sessions_will_return_active_sessions_only()
     {
         $user = factory(User::class)->create();
@@ -65,17 +77,16 @@ class DbSessionTest extends FunctionalTestCase
         DB::table('sessions')->insert($data2);
 
         $expected = collect([
-            (object) $data1
+            (object) $this->addAddMissingFields($data1)
         ]);
 
         $expected = $expected->sortBy('id')->keyBy('id')->toArray();
 
-        $actual = collect($this->repo->getUserSessions($user->id))
+        $actual = $this->repo->getUserSessions($user->id)
             ->sortBy('id')
             ->keyBy('id')
             ->toArray();
 
-
         $this->assertEquals($expected, $actual);
     }
 
@@ -94,6 +105,21 @@ class DbSessionTest extends FunctionalTestCase
             ->seeInDatabase('users', ['remember_token' => null]);
     }
 
+    public function test_invalidate_all_sessions_for_user()
+    {
+        $user = factory(User::class)->create([
+            'remember_token' => str_random(60)
+        ]);
+
+        $data = $this->getSessionStubData($user);
+        DB::table('sessions')->insert($data);
+
+        $this->repo->invalidateAllSessionsForUser($user->id);
+
+        $this->dontSeeInDatabase('sessions', ['user_id' => $user->id])
+            ->seeInDatabase('users', ['remember_token' => null]);
+    }
+
     private function getSessionStubData($user)
     {
         $faker = app(\Faker\Generator::class);
diff --git a/tests/Feature/Repositories/User/EloquentUserTest.php b/tests/Feature/Repositories/User/EloquentUserTest.php
index 5e05b00..b21d876 100644
--- a/tests/Feature/Repositories/User/EloquentUserTest.php
+++ b/tests/Feature/Repositories/User/EloquentUserTest.php
@@ -270,18 +270,18 @@ class EloquentUserTest extends FunctionalTestCase
         Carbon::setTestNow(null);
 
         $expected = [
-            'January' => 2,
-            'February' => 0,
-            'March' => 4,
-            'April' => 0,
-            'May' => 0,
-            'June' => 0,
-            'July' => 2,
-            'August' => 1,
-            'September' => 0,
-            'October' => 0,
-            'November' => 4,
-            'December' => 0
+            'January 2017' => 2,
+            'February 2017' => 0,
+            'March 2017' => 4,
+            'April 2017' => 0,
+            'May 2017' => 0,
+            'June 2017' => 0,
+            'July 2017' => 2,
+            'August 2017' => 1,
+            'September 2017' => 0,
+            'October 2017' => 0,
+            'November 2017' => 4,
+            'December 2017' => 0
         ];
 
         $usersPerMonth = $this->repo->countOfNewUsersPerMonth(
