Index: src/libcfa/bits/signal.h
===================================================================
--- src/libcfa/bits/signal.h	(revision 7d94d805fda9a7adff66f41535cded2b01ce85e4)
+++ src/libcfa/bits/signal.h	(revision 2b8bc41cc0f55bac8689d482865c1aaa65298733)
@@ -33,5 +33,5 @@
 
 // Sigaction wrapper : register an signal handler
-static void __kernel_sigaction( int sig, void (*handler)(__CFA_SIGPARMS__), int flags ) {
+static void __cfaabi_sigaction( int sig, void (*handler)(__CFA_SIGPARMS__), int flags ) {
 	struct sigaction act;
 
@@ -41,5 +41,5 @@
 	if ( sigaction( sig, &act, NULL ) == -1 ) {
 		__cfaabi_dbg_print_buffer_decl(
-			" __kernel_sigaction( sig:%d, handler:%p, flags:%d ), problem installing signal handler, error(%d) %s.\n",
+			" __cfaabi_sigaction( sig:%d, handler:%p, flags:%d ), problem installing signal handler, error(%d) %s.\n",
 			sig, handler, flags, errno, strerror( errno )
 		);
@@ -49,5 +49,5 @@
 
 // Sigaction wrapper : restore default handler
-static void __kernel_sigdefault( int sig ) {
+static void __cfaabi_sigdefault( int sig ) {
 	struct sigaction act;
 
@@ -58,5 +58,5 @@
 	if ( sigaction( sig, &act, NULL ) == -1 ) {
 		__cfaabi_dbg_print_buffer_decl(
-			" __kernel_sigdefault( sig:%d ), problem reseting signal handler, error(%d) %s.\n",
+			" __cfaabi_sigdefault( sig:%d ), problem reseting signal handler, error(%d) %s.\n",
 			sig, errno, strerror( errno )
 		);
Index: src/libcfa/concurrency/kernel.c
===================================================================
--- src/libcfa/concurrency/kernel.c	(revision 7d94d805fda9a7adff66f41535cded2b01ce85e4)
+++ src/libcfa/concurrency/kernel.c	(revision 2b8bc41cc0f55bac8689d482865c1aaa65298733)
@@ -10,6 +10,6 @@
 // Created On       : Tue Jan 17 12:27:26 2017
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Fri Dec  8 16:23:33 2017
-// Update Count     : 3
+// Last Modified On : Tue Feb  6 21:51:26 2018
+// Update Count     : 4
 //
 
@@ -588,4 +588,8 @@
 }
 
+int kernel_abort_lastframe( void ) __attribute__ ((__nothrow__)) {
+	return get_coroutine(this_thread) == get_coroutine(mainThread) ? 4 : 2;
+}
+
 extern "C" {
 	void __cfaabi_dbg_bits_acquire() {
Index: src/libcfa/concurrency/preemption.c
===================================================================
--- src/libcfa/concurrency/preemption.c	(revision 7d94d805fda9a7adff66f41535cded2b01ce85e4)
+++ src/libcfa/concurrency/preemption.c	(revision 2b8bc41cc0f55bac8689d482865c1aaa65298733)
@@ -10,6 +10,6 @@
 // Created On       : Mon Jun 5 14:20:42 2017
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Tue Jan 23 17:59:30 2018
-// Update Count     : 7
+// Last Modified On : Tue Feb  6 15:00:36 2018
+// Update Count     : 10
 //
 
@@ -42,4 +42,6 @@
 void sigHandler_ctxSwitch( __CFA_SIGPARMS__ );
 void sigHandler_segv     ( __CFA_SIGPARMS__ );
+void sigHandler_ill      ( __CFA_SIGPARMS__ );
+void sigHandler_fpe      ( __CFA_SIGPARMS__ );
 void sigHandler_abort    ( __CFA_SIGPARMS__ );
 
@@ -243,5 +245,5 @@
 
 	// Setup proper signal handlers
-	__kernel_sigaction( SIGUSR1, sigHandler_ctxSwitch, SA_SIGINFO | SA_RESTART );         // CtxSwitch handler
+	__cfaabi_sigaction( SIGUSR1, sigHandler_ctxSwitch, SA_SIGINFO | SA_RESTART );         // CtxSwitch handler
 
 	signal_block( SIGALRM );
Index: src/libcfa/interpose.c
===================================================================
--- src/libcfa/interpose.c	(revision 7d94d805fda9a7adff66f41535cded2b01ce85e4)
+++ src/libcfa/interpose.c	(revision 2b8bc41cc0f55bac8689d482865c1aaa65298733)
@@ -10,6 +10,6 @@
 // Created On       : Wed Mar 29 16:10:31 2017
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Mon Feb  5 23:40:04 2018
-// Update Count     : 17
+// Last Modified On : Tue Feb  6 17:57:56 2018
+// Update Count     : 49
 //
 
@@ -88,4 +88,6 @@
 
 void sigHandler_segv ( __CFA_SIGPARMS__ );
+void sigHandler_ill  ( __CFA_SIGPARMS__ );
+void sigHandler_fpe  ( __CFA_SIGPARMS__ );
 void sigHandler_abort( __CFA_SIGPARMS__ );
 
@@ -98,7 +100,9 @@
 		INIT_REALRTN( exit, version );
 
-		__kernel_sigaction( SIGSEGV, sigHandler_segv , SA_SIGINFO ); // Failure handler
-		__kernel_sigaction( SIGBUS , sigHandler_segv , SA_SIGINFO ); // Failure handler
-		__kernel_sigaction( SIGABRT, sigHandler_abort, SA_SIGINFO ); // Failure handler
+		__cfaabi_sigaction( SIGSEGV, sigHandler_segv , SA_SIGINFO ); // Failure handler
+		__cfaabi_sigaction( SIGBUS , sigHandler_segv , SA_SIGINFO ); // Failure handler
+		__cfaabi_sigaction( SIGILL , sigHandler_ill  , SA_SIGINFO ); // Failure handler
+		__cfaabi_sigaction( SIGFPE , sigHandler_fpe  , SA_SIGINFO ); // Failure handler
+		__cfaabi_sigaction( SIGABRT, sigHandler_abort, SA_SIGINFO ); // Failure handler
 	}
 }
@@ -118,19 +122,27 @@
 }
 
-void abort( const char *fmt, va_list argp ) __attribute__ ((__nothrow__, __leaf__, __noreturn__)) {
+void abort( const char fmt[], ... ) __attribute__ ((__nothrow__, __leaf__, __noreturn__)) {
+	va_list argp;
+	va_start( argp, fmt );
 	abortf( fmt, argp );
+	va_end( argp );
 }
 
 void * kernel_abort    ( void ) __attribute__ ((__nothrow__, __leaf__, __weak__)) { return NULL; }
 void   kernel_abort_msg( void * data, char * buffer, int size ) __attribute__ ((__nothrow__, __leaf__, __weak__)) {}
+int kernel_abort_lastframe( void ) __attribute__ ((__nothrow__, __leaf__, __weak__)) { return 4; }
 
 enum { abort_text_size = 1024 };
 static char abort_text[ abort_text_size ];
+static int abort_lastframe;
 
 extern "C" {
 	void abortf( const char fmt[], ... ) __attribute__ ((__nothrow__, __leaf__, __noreturn__)) {
-		void * kernel_data = kernel_abort();
-
+		void * kernel_data = kernel_abort();			// must be done here to lock down kernel
 		int len;
+
+		abort_lastframe = kernel_abort_lastframe();
+		len = snprintf( abort_text, abort_text_size, "Cforall Runtime error (UNIX pid:%ld) ", (long int)getpid() ); // use UNIX pid (versus getPid)
+		__cfaabi_dbg_bits_write( abort_text, len );
 
 		if ( fmt ) {
@@ -139,27 +151,23 @@
 
 			len = vsnprintf( abort_text, abort_text_size, fmt, args );
-
 			va_end( args );
-
 			__cfaabi_dbg_bits_write( abort_text, len );
-			//__cfaabi_dbg_bits_write( "\n", 1 );
-		}
-
-		len = snprintf( abort_text, abort_text_size, "Cforall Runtime error (UNIX pid:%ld)\n", (long int)getpid() ); // use UNIX pid (versus getPid)
-		__cfaabi_dbg_bits_write( abort_text, len );
-
+
+			if ( fmt[strlen( fmt ) - 1] != '\n' ) {		// add optional newline if missing at the end of the format text
+				__cfaabi_dbg_bits_write( "\n", 1 );
+			}
+		}
 
 		kernel_abort_msg( kernel_data, abort_text, abort_text_size );
-
 		libc_abort();
 	}
 }
 
-// skip first 6 stack frames by default
-static void __kernel_backtrace() {
-	// skip first N stack frames
-	int start = 6;
-
-	enum { Frames = 50 };
+static void __cfaabi_backtrace() {
+	enum {
+		Frames = 50,									// maximum number of stack frames
+		Start = 8,										// skip first N stack frames
+	};
+
 	void * array[Frames];
 	size_t size = backtrace( array, Frames );
@@ -170,11 +178,8 @@
 	__cfaabi_dbg_bits_print_nolock( "Stack back trace for: %s\n", messages[0]);
 
-	// skip last 2 stack frames after main
-	for ( int i = start; i < size && messages != NULL; i += 1 ) {
-		char * name = NULL;
-		char * offset_begin = NULL;
-		char * offset_end = NULL;
-
-		for ( char *p = messages[i]; *p; ++p ) {
+	for ( int i = Start; i < size - abort_lastframe && messages != NULL; i += 1 ) {
+		char * name = NULL, * offset_begin = NULL, * offset_end = NULL;
+
+		for ( char * p = messages[i]; *p; ++p ) {
 			//__cfaabi_dbg_bits_print_nolock( "X %s\n", p);
 			// find parantheses and +offset
@@ -192,5 +197,5 @@
 
 		// if line contains symbol print it
-		int frameNo = i - start;
+		int frameNo = i - Start;
 		if ( name && offset_begin && offset_end && name < offset_begin ) {
 			// delimit strings
@@ -206,18 +211,40 @@
 		}
 	}
-
 	free( messages );
 }
 
 void sigHandler_segv( __CFA_SIGPARMS__ ) {
-	// skip first only 1 stack frames in case of segfault.
-	abortf( "*CFA runtime error* program cfa-cpp terminated with %s\n", sig == SIGSEGV ? "segment fault." : "bus error." );
+	abortf( "Attempt to address location %p\n"
+			"Possible cause is reading outside the address space or writing to a protected area within the address space with an invalid pointer or subscript.\n",
+			sfp->si_addr );
+}
+
+void sigHandler_ill( __CFA_SIGPARMS__ ) {
+	abortf( "Attempt to execute code at location %p.\n"
+			"Possible cause is stack corruption.\n",
+			sfp->si_addr );
+}
+
+void sigHandler_fpe( __CFA_SIGPARMS__ ) {
+	const char * msg;
+
+	switch ( sfp->si_code ) {
+	  case FPE_INTDIV:
+	  case FPE_FLTDIV: msg = "divide by zero"; break;
+	  case FPE_FLTOVF: msg = "overflow"; break;
+	  case FPE_FLTUND: msg = "underflow"; break;
+	  case FPE_FLTRES: msg = "inexact result"; break;
+	  case FPE_FLTINV: msg = "invalid operation"; break;
+	  default: msg = "unknown";
+	} // switch
+	abortf( "Floating point error.\n"
+			"Cause is %s.\n", msg );
 }
 
 void sigHandler_abort( __CFA_SIGPARMS__ ) {
-	__kernel_backtrace();
+	__cfaabi_backtrace();
 
 	// reset default signal handler
-	__kernel_sigdefault( SIGABRT );
+	__cfaabi_sigdefault( SIGABRT );
 
 	raise( SIGABRT );
