diff --git a/.drone.yml b/.drone.yml
deleted file mode 100644
index e425335bd0ee07a0bdbaea64a784ec7df865081c..0000000000000000000000000000000000000000
--- a/.drone.yml
+++ /dev/null
@@ -1,16 +0,0 @@
-kind: pipeline
-name: default
-
-steps:
-- name: docker
-  image: plugins/docker
-  settings:
-    username: test
-    password: test
-    repo: andrej/test
-    password:
-        from_secret: password
-     username:
-        from_secret: username
-    tags:
-    - latest
diff --git a/VERSION b/VERSION
index 24ba9a38de68d00674ec97b283a967699716b9f4..834f2629538327723c074ed4c3addca9888f0256 100644
--- a/VERSION
+++ b/VERSION
@@ -1 +1 @@
-2.7.0
+2.8.0
diff --git a/lib/PZ.pm b/lib/PZ.pm
index 4951ab183c8b7f787c848aca5a66d5adae55a1db..7483ab1d497d6ee0d4d01a00fd7461bf70cb2119 100644
--- a/lib/PZ.pm
+++ b/lib/PZ.pm
@@ -30,6 +30,7 @@ sub startup {
     $self->plugin("ForwardedFor");
     $self->plugin('PZ::Helpers::Core');
     $self->plugin('PZ::Helpers::OIDC');
+    $self->plugin('PZ::Helpers::Octopus');
 
     my $redis = Mojo::Redis->new( 'redis://' . $cfg->{redis}{server} );
     $self->helper( redis => sub { return $redis; } );
@@ -80,6 +81,9 @@ sub startup {
 
                 return $c->$cb('Authorization header not present') if ! $token;
 
+                $token = $c->octopus_auth($token) if length($token) > 32;
+                return $c->$cb('Invalid token') if ! $token;
+
                 my $user = $c->schema->resultset('User')->find(
                     { token => $token }
                 );
diff --git a/lib/PZ/Controller/Shortcut.pm b/lib/PZ/Controller/Shortcut.pm
index a293765522247a7319c9e8d072312ece3b032633..d992049796b133f3a15aa901eb9cb1fd1434d247 100644
--- a/lib/PZ/Controller/Shortcut.pm
+++ b/lib/PZ/Controller/Shortcut.pm
@@ -61,7 +61,9 @@ sub create ($c) {
         $title = $ua->get($url)->result->dom->at('title')->text;
     };
 
-    my $shortcut = $c->current_user->add_to_shortcuts({
+    my $user = $c->stash->{user} // $c->current_user;
+
+    my $shortcut = $user->add_to_shortcuts({
         url      => $url,
         title    => $title,
         shortcut => ($custom || $c->schema->resultset('Shortcut')->generate())
@@ -98,8 +100,10 @@ sub delete ($c) {
 sub list ($c) {
     my @shortcuts = ();
 
+    my $user = $c->stash->{user} // $c->current_user;
+
     SHORTCUT:
-    foreach my $shortcut ( $c->current_user->shortcuts(
+    foreach my $shortcut ( $user->shortcuts(
         { deleted  => undef },
         { order_by => {-desc => 'created'} },
     ) ) {
diff --git a/lib/PZ/Helpers/Octopus.pm b/lib/PZ/Helpers/Octopus.pm
new file mode 100644
index 0000000000000000000000000000000000000000..e058a74725e91d736da1738d7f2c0a178d8d3510
--- /dev/null
+++ b/lib/PZ/Helpers/Octopus.pm
@@ -0,0 +1,43 @@
+package PZ::Helpers::Octopus;
+
+use strict;
+use warnings;
+
+use base 'Mojolicious::Plugin';
+use Mojo::JWT;
+
+sub register {
+    my ($class, $self) = @_;
+
+    $self->helper( octopus_auth => sub {
+        my $c     = shift;
+        my $token = shift // return undef;
+
+        my $claims;
+
+        eval {
+            $claims = Mojo::JWT->new(
+                secret => $self->cfg->{octopus}{secret}
+            )->decode($token);
+        };
+
+        if ( $@ ) {
+            $c->app->log->warn( $@ );
+            return undef;
+        }
+
+        my $user = $c->schema->resultset('User')->update_or_create(
+            uuid => $claims->{uuid},
+            { key => 'uuid', }
+        );
+
+        $user->set_token;
+
+        return $user->token;
+    });
+
+}
+
+1;
+
+__END__
diff --git a/p_z.conf b/p_z.conf
index 75679d0767e769393d893a26330b2d8306e3b69d..52c5b698f3a692826ca858155a93bc0635ae5d50 100644
--- a/p_z.conf
+++ b/p_z.conf
@@ -34,4 +34,7 @@
   piratar           => 'https://a.pirati.cz/piratar/100/',
   domain            => $ENV{DOMAIN},
   dev_mode          => ( $ENV{MOJO_MODE} eq 'development'),
+  octopus           => {
+    secret => $ENV{OCTOPUS_SECRET},
+  },
 };