--- pari-2.5.0/src/headers/paricom.h-pre	2011-05-30 02:28:34.000000000 -0700
+++ pari-2.5.0/src/headers/paricom.h	2018-09-16 00:04:16.527215600 -0700
@@ -73,6 +73,10 @@ extern void (*cb_pari_sigint)(void);
 extern int (*cb_pari_handle_exception)(long);
 extern void (*cb_pari_err_recover)(long);
 
+#define CB_EXCEPTION_FLAGS 1
+extern int cb_exception_resets_avma;
+extern int cb_exception_flushes_err;
+
 enum manage_var_t {
   manage_var_create,
   manage_var_delete,
--- pari-2.5.0/src/language/eval.c-pre	2018-08-06 12:00:59.504359600 -0700
+++ pari-2.5.0/src/language/eval.c	2018-09-16 00:10:41.286291400 -0700
@@ -1316,7 +1316,8 @@ evalstate_reset(void)
   s_trace.n = 0;
   reset_break();
   compilestate_reset();
-  avma = top;
+  if (!cb_exception_resets_avma)
+    avma = top;
 }
 
 void
--- pari-2.5.0/src/language/init.c-pre	2011-05-30 02:28:26.000000000 -0700
+++ pari-2.5.0/src/language/init.c	2018-09-19 03:34:41.813699200 -0700
@@ -93,6 +93,9 @@ int  (*cb_pari_whatnow)(PariOUT *out, co
 void (*cb_pari_sigint)(void);
 void (*cb_pari_err_recover)(long);
 
+int cb_exception_resets_avma = 0;
+int cb_exception_flushes_err = 0;
+
 typedef struct {
   jmp_buf *penv;
   long flag;
@@ -896,8 +899,11 @@ err_recover(long numerr)
   s_ERR_CATCH.n = 0;
   dbg_release();
   global_err_data = NULL;
-  out_puts(pariErr, "\n");
-  pariErr->flush();
+
+  if (!cb_exception_flushes_err) {
+    out_puts(pariErr, "\n");		/* What is this doing in generic code?  It was flushed already, so this is just an empty error message! */
+    pariErr->flush();			/* If an empty line is needed by gp, this should be done in gp's error handler! */
+  }
 
   cb_pari_err_recover(numerr);
 }
@@ -975,7 +981,8 @@ pari_sigint(const char *time_s)
   out_puts(pariErr, "user interrupt after ");
   out_puts(pariErr, time_s);
   out_term_color(pariErr, c_NONE);
-  pariErr->flush();
+  if (!cb_exception_flushes_err)
+    pariErr->flush();
   if (cb_pari_handle_exception &&
       cb_pari_handle_exception(-1)) return;
   err_recover(talker);
@@ -1118,7 +1125,8 @@ pari_err(int numerr, ...)
     pariErr->puts(buf);
     pariErr->puts("  [hint] you can increase GP stack with allocatemem()\n");
   }
-  pariErr->flush();
+  if (!cb_exception_flushes_err)
+    pariErr->flush();
   if (cb_pari_handle_exception &&
       cb_pari_handle_exception(numerr)) return;
   err_recover(numerr);