diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 31a039672851ceaf2c5e0a7d4b390db9fd44cb55..642ed97cb48cdc7749e4bc0db8c943e1486abd96 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -2,7 +2,7 @@ image: docker:19.03.12
 
 variables:
   DOCKER_TLS_CERTDIR: "/certs"
-  IMAGE_VER: 1.10.2
+  IMAGE_VER: 1.11.0
 
 services:
   - docker:19.03.12-dind
diff --git a/Dockerfile b/Dockerfile
index f1e5bbeb801912ff7b3ea52db7ac0883157e979d..465c7f6e050d86eebadc585c87843e2722fcb5bc 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -18,6 +18,7 @@ RUN apt-get update && apt-get install -y \
 RUN cpanm \
     Mojolicious \
     Mojo::Pg \
+    Mojo::Redis \
     Mojo::JWT \
     Mojolicious::Plugin::OpenAPI
 
diff --git a/lib/CF.pm b/lib/CF.pm
index a703d0ad06f707b47f896c562fcf081b7a656089..105e5fc1ba1e9809fd5218b72133f7e70782f317 100644
--- a/lib/CF.pm
+++ b/lib/CF.pm
@@ -2,6 +2,7 @@ package CF;
 use Mojo::Base 'Mojolicious';
 use Mojo::Pg;
 use Mojo::JWT;
+use Mojo::Redis;
 use CF::Schema;
 
 # This method will run once at server start
@@ -37,6 +38,10 @@ sub startup {
     });
     $self->helper( schema => sub { return $schema; } );
 
+    # Redis
+    my $redis = Mojo::Redis->new( $cfg->{redis} );
+    $self->helper( redis => sub { return $redis; } );
+
     $self->plugin('CF::Helpers::Core');
     $self->plugin('CF::Helpers::Auth');
 
diff --git a/lib/CF/Controller/SSO.pm b/lib/CF/Controller/SSO.pm
index 95e2af6509bb7785bef43dbbdab4670f5f68c4b1..880bae3d23d18c9c36a39d74ab931762aa874f21 100644
--- a/lib/CF/Controller/SSO.pm
+++ b/lib/CF/Controller/SSO.pm
@@ -1,15 +1,25 @@
 package CF::Controller::SSO;
 
-use Mojo::Base 'Mojolicious::Controller';
-use Mojo::Pg::PubSub;
 use feature 'signatures';
 no warnings qw{ experimental::signatures };
+use Mojo::Base 'Mojolicious::Controller';
+use Mojo::Pg::PubSub;
 use Mojo::UserAgent;
+use JSON;
+
+use constant REDIS_CACHE_LIFETIME => 300;
+use constant REDIS_CACHE_KEY      => 'SSO SUBJECTS %s';
 
 sub subjects ($c) {
     $c->openapi->valid_input or return;
     my $args = $c->validation->output;
 
+    my $cache_key = sprintf(REDIS_CACHE_KEY, $args->{search});
+    if ($c->redis->db->exists( $cache_key )) {
+        $c->render(openapi => from_json($c->redis->db->get( $cache_key )));
+        return;
+    }
+
     my ( $groups, $users, @subjects );
 
     if ( $args->{class} =~ /all|group/ ) {
@@ -20,6 +30,7 @@ sub subjects ($c) {
         @subjects = (@subjects, $c->_users( $args->{search} ));
     }
 
+    $c->redis->db->set( $cache_key, to_json(\@subjects), 'EX', REDIS_CACHE_LIFETIME );
     $c->render(openapi => \@subjects);
 }