diff --git a/src/one-body-problem.cc b/src/one-body-problem.cc
index ef5b22c7e3c3c324f84c465b0e3b72e0a23a440c..14139f808bf467490964be8ae9929e24ad0facce 100644
--- a/src/one-body-problem.cc
+++ b/src/one-body-problem.cc
@@ -6,7 +6,9 @@
 #undef HAVE_IPOPT
 #endif
 
+#include <atomic>
 #include <cmath>
+#include <csignal>
 #include <exception>
 #include <fstream>
 #include <iostream>
@@ -71,6 +73,9 @@ Dune::ParameterTree getParameters(int argc, char *argv[]) {
   return parset;
 }
 
+static std::atomic<bool> terminationRequested(false);
+void handleSignal(int signum) { terminationRequested = true; }
+
 int main(int argc, char *argv[]) {
   try {
     Dune::MPIHelper::instance(argc, argv);
@@ -268,6 +273,10 @@ int main(int argc, char *argv[]) {
       return stateEnergyNorm.diff(fineAlpha, coarseAlpha) > refinementTolerance;
     };
 
+    std::signal(SIGXCPU, handleSignal);
+    std::signal(SIGINT, handleSignal);
+    std::signal(SIGTERM, handleSignal);
+
     AdaptiveTimeStepper<NonlinearFactory, MyUpdater,
                         EnergyNorm<ScalarMatrix, ScalarVector>>
         adaptiveTimeStepper(factory, parset, myGlobalFriction, current,
@@ -286,6 +295,11 @@ int main(int argc, char *argv[]) {
       current.state_->extractAlpha(programState.alpha);
 
       report();
+
+      if (terminationRequested) {
+        std::cerr << "Terminating prematurely" << std::endl;
+        break;
+      }
     }
   } catch (Dune::Exception &e) {
     Dune::derr << "Dune reported error: " << e << std::endl;