diff --git a/lib/AccessCheck/App.pm b/lib/AccessCheck/App.pm
index 394ad69d23f0279f858ca8fbd081f26c0a6e1b40..24e8f1d72b2311da927a95b29e2e2b15fdf3640c 100644
--- a/lib/AccessCheck/App.pm
+++ b/lib/AccessCheck/App.pm
@@ -6,13 +6,26 @@ use English qw(-no_match_vars);
 use Template::Constants qw(:chomp);
 use Syntax::Keyword::Try;
 
+use AccessCheck::Data::DB;
+
 use constant {
     ACCESSCHECK_VERSION => '1.2.0'
 };
 
+has 'db';
+
 sub startup {
     my $self = shift;
 
+    $self->helper(
+        string_to_list => sub {
+            my $self = shift;
+            my $value = shift;
+
+            return defined $value ? split(/, */, $value) : ();
+        }
+    );
+
     $self->plugin('INIConfig', { file => $ENV{ACCESS_CHECK_CONFIG} || 'conf/manager.conf' });
 
     $self->plugin(
@@ -39,6 +52,22 @@ sub startup {
         )
     );
 
+    AccessCheck::Data::DB->register_db(
+        driver   => $config->{database}->{type},
+        database => $config->{database}->{name},
+        host     => $config->{database}->{host},
+        password => $config->{database}->{password},
+        username => $config->{database}->{username},
+        options  => [ $self->string_to_list($config->{database}->{options}) ]
+    );
+
+    try {
+        $self->db(AccessCheck::Data::DB->new());
+    } catch ($error) {
+        $self->log()->fatal("unable to access database, aborting");
+        return;
+    }
+
     my $theme = $config->{setup}->{templates_theme} || 'default';
     my $base_templates_dir  = $self->home()->child('templates');
 
@@ -72,14 +101,6 @@ sub startup {
     $routes->get('/step4')->to(controller => 'step4', action => 'run')->name('step4');
     $routes->get('/step5')->to(controller => 'step5', action => 'run')->name('step5');
 
-    $self->helper(
-        string_to_list => sub {
-            my $self = shift;
-            my $value = shift;
-
-            return defined $value ? split(/, */, $value) : ();
-        }
-    );
 
 }
 
diff --git a/lib/AccessCheck/App/Controller.pm b/lib/AccessCheck/App/Controller.pm
index 0688c5b2aeba57768e2b5ce820a09fc656e69ccc..0ee9820ce1caff382a61a459295728bd3483f4b4 100644
--- a/lib/AccessCheck/App/Controller.pm
+++ b/lib/AccessCheck/App/Controller.pm
@@ -5,7 +5,6 @@ use Mojo::Base qw(Mojolicious::Controller);
 use English qw(-no_match_vars);
 use Syntax::Keyword::Try;
 
-use AccessCheck::Data::DB;
 use AccessCheck::Data::Entity;
 use AccessCheck::Data::Token;
 use AccessCheck::L10N;
@@ -42,31 +41,6 @@ sub init_l10n {
     return $l10n;
 }
 
-sub init_db {
-    my $self = shift;
-
-    my $config = $self->app()->config();
-
-    AccessCheck::Data::DB->register_db(
-        driver   => $config->{database}->{type},
-        database => $config->{database}->{name},
-        host     => $config->{database}->{host},
-        password => $config->{database}->{password},
-        username => $config->{database}->{username},
-        options  => [ $self->string_to_list($config->{database}->{options}) ]
-    );
-
-    my $db;
-    try {
-        $db = AccessCheck::Data::DB->new();
-    } catch {
-    }
-
-    $self->stash(db => $db);
-
-    return $db;
-}
-
 sub init_user {
     my $self = shift;
 
@@ -106,7 +80,7 @@ sub check_token {
     my ($self, %args) = @_;
 
     my $secret = $args{token};
-    my $db = $self->stash('db');
+    my $db = $self->app()->db();
 
     my $token = AccessCheck::Data::Token->new(
         db     => $db,
@@ -152,7 +126,7 @@ sub get_sp {
         user_message => "invalid_entityid"
     ) if $entityid !~ $AccessCheck::Regexp::entityid;
 
-    my $db = $self->stash('db');
+    my $db = $self->app()->db();
 
     my $sp = AccessCheck::Data::Entity->new(
         db       => $db,
@@ -174,7 +148,7 @@ sub abort {
     my $status = $args{status} || 200;
     my $format = $args{format} || 'html';
 
-    my $db = $self->stash('db');
+    my $db = $self->app()->db();
     $db->rollback() if $db && $db->in_transaction();
 
     $self->app()->log()->error($args{log_message}) if $args{log_message};
diff --git a/lib/AccessCheck/App/Status.pm b/lib/AccessCheck/App/Status.pm
index 10d997113a75940a5b324efe8edd1f634f6fad6f..26313543b6e90e2a05a0c73535e73b3bfa5709f1 100644
--- a/lib/AccessCheck/App/Status.pm
+++ b/lib/AccessCheck/App/Status.pm
@@ -31,7 +31,7 @@ Return the health status of the frontend.
 sub run {
     my $self  = shift;
 
-    my $config  = $self->app()->config();
+    my $config = $self->app()->config();
 
     if (!$config->{status}) {
         $self->render(
diff --git a/lib/AccessCheck/App/Step1.pm b/lib/AccessCheck/App/Step1.pm
index 826cb20df6e7e310091526c95fc464f60c8a573e..349fabdd1e546bac05b147844743eb1159dd7df3 100644
--- a/lib/AccessCheck/App/Step1.pm
+++ b/lib/AccessCheck/App/Step1.pm
@@ -10,10 +10,11 @@ use AccessCheck::Data::Entity;
 sub run {
     my $self = shift;
 
-    my $config = $self->app()->config();
-    my $log    = $self->app()->log();
+    my $app    = $self->app();
+    my $config = $app->config();
+    my $log    = $app->log();
+    my $db     = $app->db();
 
-    $self->init_db();
     $self->init_l10n();
     $self->init_user();
 
@@ -21,7 +22,6 @@ sub run {
         return if !$self->check_authentication();
     }
 
-    my $db   = $self->stash('db');
     my $user = $self->stash('user');
 
     my $sps = AccessCheck::Data::Entity->get_entities(
diff --git a/lib/AccessCheck/App/Step2.pm b/lib/AccessCheck/App/Step2.pm
index e5749c4eb229db3fe3bc83b366eed5ff06e64bc7..69daf89c669318454978d536147477acae060ea4 100644
--- a/lib/AccessCheck/App/Step2.pm
+++ b/lib/AccessCheck/App/Step2.pm
@@ -8,10 +8,10 @@ use Syntax::Keyword::Try;
 sub run {
     my $self = shift;
 
-    my $config = $self->app()->config();
-    my $log    = $self->app()->log();
+    my $app    = $self->app();
+    my $config = $app->config();
+    my $log    = $app->log();
 
-    $self->init_db();
     $self->init_l10n();
     $self->init_user();
 
diff --git a/lib/AccessCheck/App/Step3.pm b/lib/AccessCheck/App/Step3.pm
index 8fb5bb130cee91ff1e3b014871293071f0c62325..decf63befc8bba7865d5f3470495ba3eca581082 100644
--- a/lib/AccessCheck/App/Step3.pm
+++ b/lib/AccessCheck/App/Step3.pm
@@ -16,10 +16,11 @@ use AccessCheck::Tools;
 sub run {
     my $self = shift;
 
-    my $config = $self->app()->config();
-    my $log    = $self->app()->log();
+    my $app    = $self->app();
+    my $config = $app->config();
+    my $log    = $app->log();
+    my $db     = $app->db();
 
-    $self->init_db();
     $self->init_l10n();
     $self->init_user();
 
@@ -29,7 +30,6 @@ sub run {
 
     my $entityid = $self->param('entityid');
     my $email    = $self->param('email');
-    my $db       = $self->stash('db');
     my $l10n     = $self->stash('l10n');
     my $user     = $self->stash('user');
 
diff --git a/lib/AccessCheck/App/Step4.pm b/lib/AccessCheck/App/Step4.pm
index 932ae9a7183e57450e40b6d1d33a9ad36870d09f..4e793cce0824170d888eb3fa9a0bac97112877c9 100644
--- a/lib/AccessCheck/App/Step4.pm
+++ b/lib/AccessCheck/App/Step4.pm
@@ -16,10 +16,11 @@ use AccessCheck::Tools;
 sub run {
     my $self = shift;
 
-    my $config = $self->app()->config();
-    my $log    = $self->app()->log();
+    my $app    = $self->app();
+    my $config = $app->config();
+    my $log    = $app->log();
+    my $db     = $app->db();
 
-    $self->init_db();
     $self->init_l10n();
     $self->init_user();
 
@@ -32,7 +33,6 @@ sub run {
     my $token    = $self->param('token');
     my $validity = $self->param('validity');
     my $profiles = $self->every_param('profiles');
-    my $db       = $self->stash('db');
     my $l10n     = $self->stash('l10n');
 
     my $sp = $self->get_sp(entityid => $entityid);
diff --git a/lib/AccessCheck/App/Step5.pm b/lib/AccessCheck/App/Step5.pm
index ba95f1fa34a27f7e2fa64ac17ff80678c4f8e818..af2444ce6e453d1c6d2758cff11b1b2c96ec2009 100644
--- a/lib/AccessCheck/App/Step5.pm
+++ b/lib/AccessCheck/App/Step5.pm
@@ -18,8 +18,8 @@ sub run {
     my $app    = $self->app();
     my $config = $app->config();
     my $log    = $app->log();
+    my $db     = $app->db();
 
-    $self->init_db();
     $self->init_l10n();
     $self->init_user();
 
@@ -30,7 +30,6 @@ sub run {
     my $entityid = $self->param('entityid');
     my $token    = $self->param('token');
     my $key      = $self->param('key');
-    my $db       = $self->stash('db');
 
     return if !$self->check_token(token => $token, entityid => $entityid);