diff --git a/main.cpp b/main.cpp
index 38b62c63e79a1f68ad3104477b3059eb5bad5dc7..4229622bc3425f3c6ce7a9c01ef2b10b5cb374e8 100644
--- a/main.cpp
+++ b/main.cpp
@@ -3,8 +3,10 @@
 #include <RevisionInfo.hpp>
 #include <rang.hpp>
 #include <FPEManager.hpp>
+#include <SignalManager.hpp>
 
 #include <CLI/CLI.hpp>
+#include <cassert>
 
 inline double e(double rho, double p, double gamma)
 {
@@ -114,55 +116,32 @@ void computeExplicitFluxes(const Kokkos::View<double*>& xr,
     });
 }
 
+
 #warning clean-up and add warning message when release version is run
-#include <csignal>
- void signal_handler(int s) {
-   std::cerr << rang::style::reset
-	     << rang::fg::reset
-	     << rang::style::bold;
-   std::cerr << "to attach gdb to this process run\n";
-   std::cerr << "\tgdb -pid "
-	     << rang::fg::red
-	     << getpid()
-	     << rang::fg::reset
-	     << '\n';
-   std::cerr << "else press Control-C to exit\n";
-   std::cerr << rang::style::reset;
-   
-   ::sigset_t sig; 
-   ::sigaddset(&sig,SIGSTOP); 
-   ::sigsuspend(&sig); 
- }
 
 int main(int argc, char *argv[])
 {
   CLI::App app{"Pastis help"};
 
-  long unsigned number = 0;
+  long unsigned number = 10;
   app.add_option("number,-n,--number", number, "Number of cells");//->required();
   bool disable_fpe = false;
-  app.add_flag("--disable-fpe", disable_fpe=false, "Traps floating point exceptions");
+  app.add_flag("--no-fpe", disable_fpe, "Do not trap floating point exceptions");
+  bool disable_signals = false;
+  app.add_flag("--no-signal", disable_signals, "Catches signals");
   int threads=-1;
   app.add_option("--threads", threads, "Number of Kokkos threads");
 
-  std::cerr << "disable_fpe=" << disable_fpe << '\n' << std::flush;
-
-  //  signal_handler(SIGFPE);
-
   std::atexit([](){std::cout << rang::style::reset;});
   try {
     app.parse(argc, argv);
   } catch (const CLI::ParseError &e) {
-    std::cout << (e.get_exit_code()==0 ? rang::fg::blue : rang::fg::red);
     return app.exit(e);
   }
 
-  if (disable_fpe) {
-    FPEManager::disable();
-  } else {
-    FPEManager::enable();
-  }
-
+  FPEManager::init(not disable_fpe);
+  SignalManager::init(not disable_signals);
+  
   std::cout << "Code version: "
 	    << rang::style::bold << RevisionInfo::version() << rang::style::reset << '\n';
 
@@ -267,9 +246,6 @@ int main(int argc, char *argv[])
   int iteration=0;
 
   while((t<tmax) and (iteration<itermax)) {
-    double test=3;
-    test /= t;
-    std::cout << test << '\n';
     double dt = 0.4*acoustic_dt(Vj, cj);
     if (t+dt<tmax) {
       t+=dt;
diff --git a/utils/CMakeLists.txt b/utils/CMakeLists.txt
index 7d0e57bf4a2addec583b37cbcaaabed30b3c3b1a..aa8f05c8ee7783fc6e6d9c3d613f7f7bf6c539a7 100644
--- a/utils/CMakeLists.txt
+++ b/utils/CMakeLists.txt
@@ -6,7 +6,8 @@ include_directories(${CMAKE_CURRENT_BINARY_DIR})
 add_library(
   PastisUtils
   FPEManager.cpp
-  RevisionInfo.cpp)
+  RevisionInfo.cpp
+  SignalManager.cpp)
 
 # --------------- get git revision info ---------------
 
diff --git a/utils/FPEManager.cpp b/utils/FPEManager.cpp
index 355b2b6e1ea79d7da7a39b895200b94a680e342d..455eb6d83eda5df6f76977bb086435391790ad2e 100644
--- a/utils/FPEManager.cpp
+++ b/utils/FPEManager.cpp
@@ -48,3 +48,13 @@ void FPEManager::disable()
 }
 
 #endif // PASTIS_HAS_FENV_H
+
+
+void FPEManager::init(const bool& enable)
+{
+  if (enable) {
+    FPEManager::enable();
+  } else {
+    FPEManager::disable();
+  }
+}
diff --git a/utils/FPEManager.hpp b/utils/FPEManager.hpp
index e2edb238d84c8007afe6dc0badcaa514b084c1f8..0a1ca447f2885b4621fea9f8add9bdfe84c5f96b 100644
--- a/utils/FPEManager.hpp
+++ b/utils/FPEManager.hpp
@@ -5,6 +5,7 @@ struct FPEManager
 {
   static void enable();
   static void disable();
+  static void init(const bool& enable);
 };
 
 #endif // FPEMANAGER_HPP
diff --git a/utils/SignalManager.cpp b/utils/SignalManager.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..2f873ec1947913f1946e3d9b93b763080c3cbec4
--- /dev/null
+++ b/utils/SignalManager.cpp
@@ -0,0 +1,82 @@
+#include <SignalManager.hpp>
+#include <csignal>
+#include <rang.hpp>
+#include <iomanip>
+
+std::string SignalManager::signalName(int s)
+{
+  switch (s) {
+  case SIGTERM: return "SIGTERM";
+  case SIGSEGV: return "SIGSEGV";
+  case SIGINT:  return "SIGINT";
+  case SIGILL:  return "SIGILL";
+  case SIGABRT: return "SIGABRT";
+  case SIGFPE:  return "SIGFPE";
+  }
+  return "SIGNAL undefined!";
+}
+
+void SignalManager::pauseForDebug()
+{
+  std::cerr  << "\n======================================\n";
+  std::cerr << rang::style::reset
+	    << rang::fg::reset
+	    << rang::style::bold;
+  std::cerr << "to attach gdb to this process run\n";
+  std::cerr << "\tgdb -pid "
+	    << rang::fg::red
+	    << getpid()
+	    << rang::fg::reset
+	    << '\n';
+  std::cerr << "else press Control-C to exit\n";
+  std::cerr << rang::style::reset;
+  std::cerr  << "======================================\n";  
+
+  ::sigset_t sig; 
+  ::sigaddset(&sig,SIGSTOP); 
+  ::sigsuspend(&sig); 
+}
+
+//#include <libunwind.h>
+
+void SignalManager::handler(int s)
+{
+  std::cerr << "\n *** "
+	    << rang::style::reset
+	    << rang::fg::reset
+	    << rang::style::bold;
+  std::cerr << "Signal "
+    	    << rang::fgB::yellow
+	    << signalName(s)
+    	    << rang::fg::reset
+	    << " caught"
+	    << rang::style::reset
+	    << " ***\n";
+  
+  std::signal(SIGINT, SIG_DFL);
+  SignalManager::pauseForDebug();
+ }
+
+void SignalManager::init(const bool& enable)
+{
+  if (enable) {
+    std::signal(SIGFPE,  SignalManager::handler);
+    std::signal(SIGSEGV, SignalManager::handler);
+    std::signal(SIGTERM, SignalManager::handler);
+    std::signal(SIGINT,  SignalManager::handler);
+    std::signal(SIGABRT, SignalManager::handler);
+    std::cout << "Signal management: "
+	      << rang::style::bold
+	      << rang::fgB::green
+	      << "enabled"
+	      << rang::fg::reset
+	      << rang::style::reset << '\n';
+  } else {
+    std::cout << "Signal management: "
+	      << rang::style::bold
+	      << rang::fgB::red
+	      << "disabled"
+	      << rang::fg::reset
+	      << rang::style::reset << '\n';
+  }
+}
diff --git a/utils/SignalManager.hpp b/utils/SignalManager.hpp
new file mode 100644
index 0000000000000000000000000000000000000000..485820f9c29f5d6358d269f273b0e95a6f8de371
--- /dev/null
+++ b/utils/SignalManager.hpp
@@ -0,0 +1,16 @@
+#ifndef SIGNAL_MANAGER_HPP
+#define SIGNAL_MANAGER_HPP
+
+#include <iostream>
+
+struct SignalManager
+{
+private:
+  static std::string signalName(int signal);
+  static void pauseForDebug();
+  static void handler(int signal);
+public:
+  static void init(const bool& enable);
+};
+
+#endif // SIGNAL_MANAGER_HPP