diff --git a/index.pl b/index.pl
index c86fe5b2d384510a3f37150bc32cdb312e47d36e..90fb660120d8f72ea139bbb96f7cbea53f100187 100755
--- a/index.pl
+++ b/index.pl
@@ -299,39 +299,17 @@ helper 'checkout' => sub {
 	my $user     = $self->get_user_status;
 	my $train_id = $user->{train_id};
 
-	if ( $status->{errstr} and not $force ) {
-		return $status->{errstr};
-	}
 	if ( not $user->{checked_in} ) {
 		return 'You are not checked into any train';
 	}
-	else {
-		my ($train)
-		  = first { $_->train_id eq $train_id } @{ $status->{results} };
-		if ( not defined $train ) {
-			if ($force) {
-				my $success = $self->app->checkout_query->execute(
-					$self->get_user_id,
-					$self->get_station_id(
-						ds100 => $status->{station_ds100},
-						name  => $status->{station_name}
-					),
-					DateTime->now( time_zone => 'Europe/Berlin' )->epoch,
-					undef, undef, undef, undef, undef,
-					undef, undef, undef
-				);
-				if ( defined $success ) {
-					return;
-				}
-				else {
-					return 'INSERT failed';
-				}
-			}
-			else {
-				return "Train ${train_id} not found";
-			}
-		}
-		else {
+	if ( $status->{errstr} and not $force ) {
+		return $status->{errstr};
+	}
+
+	my ($train)
+		= first { $_->train_id eq $train_id } @{ $status->{results} };
+	if ( not defined $train ) {
+		if ($force) {
 			my $success = $self->app->checkout_query->execute(
 				$self->get_user_id,
 				$self->get_station_id(
@@ -339,16 +317,8 @@ helper 'checkout' => sub {
 					name  => $status->{station_name}
 				),
 				DateTime->now( time_zone => 'Europe/Berlin' )->epoch,
-				$train->type,
-				$train->line_no,
-				$train->train_no,
-				$train->train_id,
-				$train->sched_arrival ? $train->sched_arrival->epoch : undef,
-				$train->arrival       ? $train->arrival->epoch       : undef,
-				join( '|', $train->route ),
-				join( '|',
-					map { ( $_->[0] ? $_->[0]->epoch : q{} ) . ':' . $_->[1] }
-					  $train->messages )
+				undef, undef, undef, undef, undef,
+				undef, undef, undef
 			);
 			if ( defined $success ) {
 				return;
@@ -357,6 +327,35 @@ helper 'checkout' => sub {
 				return 'INSERT failed';
 			}
 		}
+		else {
+			return "Train ${train_id} not found";
+		}
+	}
+	else {
+		my $success = $self->app->checkout_query->execute(
+			$self->get_user_id,
+			$self->get_station_id(
+				ds100 => $status->{station_ds100},
+				name  => $status->{station_name}
+			),
+			DateTime->now( time_zone => 'Europe/Berlin' )->epoch,
+			$train->type,
+			$train->line_no,
+			$train->train_no,
+			$train->train_id,
+			$train->sched_arrival ? $train->sched_arrival->epoch : undef,
+			$train->arrival       ? $train->arrival->epoch       : undef,
+			join( '|', $train->route ),
+			join( '|',
+				map { ( $_->[0] ? $_->[0]->epoch : q{} ) . ':' . $_->[1] }
+					$train->messages )
+		);
+		if ( defined $success ) {
+			return;
+		}
+		else {
+			return 'INSERT failed';
+		}
 	}
 };
 
diff --git a/public/static/js/travelynx-actions.js b/public/static/js/travelynx-actions.js
index 7cec0cd5e1b0b80d92c5e95582f2ba5575526406..91953a6a34eb61f43d9c480734b0c9ba513860c6 100644
--- a/public/static/js/travelynx-actions.js
+++ b/public/static/js/travelynx-actions.js
@@ -1,41 +1,42 @@
-$(document).ready(function() {
+function travelynx_run_action(link, req, redir, err_callback) {
 	var error_icon = '<i class="material-icons">error</i>';
+	var progressbar = $('<div class="progress"><div class="indeterminate"></div></div>');
+	link.hide();
+	link.after(progressbar);
+	$.post('/action', req, function(data) {
+		if (data.success) {
+			$(location).attr('href', redir);
+		} else {
+			M.toast({html: error_icon + ' ' + data.error});
+			progressbar.remove();
+			if (err_callback) {
+				err_callback();
+			}
+			link.append(' ' + error_icon);
+			link.show();
+		}
+	});
+}
+$(document).ready(function() {
 	$('.action-checkin').click(function() {
 		var link = $(this);
-		req = {
+		var req = {
 			action: 'checkin',
 			station: link.data('station'),
 			train: link.data('train'),
 		};
-		progressbar = $('<div class="progress"><div class="indeterminate"></div></div>');
-		link.replaceWith(progressbar);
-		$.post('/action', req, function(data) {
-			if (data.success) {
-				$(location).attr('href', '/');
-			} else {
-				M.toast({html: error_icon + ' ' + data.error});
-				link.append(' ' + error_icon);
-				progressbar.replaceWith(link);
-			}
-		});
+		travelynx_run_action(link, req, '/');
 	});
 	$('.action-checkout').click(function() {
 		var link = $(this);
-		req = {
+		var req = {
 			action: 'checkout',
 			station: link.data('station'),
 			force: link.data('force'),
 		};
-		progressbar = $('<div class="progress"><div class="indeterminate"></div></div>');
-		link.replaceWith(progressbar);
-		$.post('/action', req, function(data) {
-			if (data.success) {
-				$(location).attr('href', '/' + req.station);
-			} else {
-				M.toast({html: error_icon + ' ' + data.error});
-				link.append(' ' + error_icon);
-				progressbar.replaceWith(link);
-			}
+		travelynx_run_action(link, req, '/' + req.station, function() {
+			link.append(' – Keine Echtzeitdaten vorhanden')
+			link.data('force', true);
 		});
 	});
 });