Index: libcfa/src/exception.c
===================================================================
--- libcfa/src/exception.c	(revision 6d43cdde0e3ec27d64977f210123157ee7b67ffa)
+++ libcfa/src/exception.c	(revision 3eb5a47849aa6054acbc7a319ad4cf0f46de50a3)
@@ -10,6 +10,6 @@
 // Created On       : Mon Jun 26 15:13:00 2017
 // Last Modified By : Andrew Beach
-// Last Modified On : Fri Mar 27 10:19:00 2020
-// Update Count     : 12
+// Last Modified On : Thr Apr 02 14:47:00 2020
+// Update Count     : 13
 //
 
@@ -53,10 +53,9 @@
 // Temperary global exception context. Does not work with concurency.
 struct exception_context_t {
-    struct __cfaehm_try_resume_node * top_resume;
-    struct __cfaehm_try_resume_node * current_resume;
-
-    exception_t * current_exception;
-    int current_handler_index;
-} static shared_stack = {NULL, NULL, NULL, 0};
+	struct __cfaehm_try_resume_node * top_resume;
+
+	exception_t * current_exception;
+	int current_handler_index;
+} static shared_stack = {NULL, NULL, 0};
 
 // Get the current exception context.
@@ -75,12 +74,11 @@
 	__cfaabi_dbg_print_safe("Throwing resumption exception\n");
 
-	struct __cfaehm_try_resume_node * original_head = context->current_resume;
-	struct __cfaehm_try_resume_node * current =
-		(original_head) ? original_head->next : context->top_resume;
+	struct __cfaehm_try_resume_node * original_head = context->top_resume;
+	struct __cfaehm_try_resume_node * current = context->top_resume;
 
 	for ( ; current ; current = current->next) {
-		context->current_resume = current;
+		context->top_resume = current->next;
 		if (current->handler(except)) {
-			context->current_resume = original_head;
+			context->top_resume = original_head;
 			return;
 		}
@@ -88,5 +86,5 @@
 
 	__cfaabi_dbg_print_safe("Unhandled exception\n");
-	context->current_resume = original_head;
+	context->top_resume = original_head;
 
 	// Fall back to termination:
Index: tests/exceptions/.expect/interact.txt
===================================================================
--- tests/exceptions/.expect/interact.txt	(revision 6d43cdde0e3ec27d64977f210123157ee7b67ffa)
+++ tests/exceptions/.expect/interact.txt	(revision 3eb5a47849aa6054acbc7a319ad4cf0f46de50a3)
@@ -8,2 +8,8 @@
 
 resume catch on resume
+
+termination catch, will resume
+outer resume catch
+
+resumption catch, will terminate
+inner termination catch
Index: tests/exceptions/.expect/resume.txt
===================================================================
--- tests/exceptions/.expect/resume.txt	(revision 6d43cdde0e3ec27d64977f210123157ee7b67ffa)
+++ tests/exceptions/.expect/resume.txt	(revision 3eb5a47849aa6054acbc7a319ad4cf0f46de50a3)
@@ -19,2 +19,8 @@
 caught yin, will throw yang
 caught yang
+
+throwing first exception
+caught first exception
+throwing second exception
+caught second exception
+recaught first exception
Index: tests/exceptions/interact.cfa
===================================================================
--- tests/exceptions/interact.cfa	(revision 6d43cdde0e3ec27d64977f210123157ee7b67ffa)
+++ tests/exceptions/interact.cfa	(revision 3eb5a47849aa6054acbc7a319ad4cf0f46de50a3)
@@ -5,4 +5,5 @@
 
 TRIVIAL_EXCEPTION(star);
+TRIVIAL_EXCEPTION(moon);
 
 int main(int argc, char * argv[]) {
@@ -51,3 +52,63 @@
 		printf("resume catch on resume\n");
 	}
+	printf("\n");
+
+	// Resume a termination exception.
+	try {
+		try {
+			try {
+				THROW(&(star){});
+			} catchResume (star *) {
+				printf("inner resume catch (error)\n");
+			}
+		} catch (star * error) {
+			printf("termination catch, will resume\n");
+			THROW_RESUME(error);
+		}
+	} catchResume (star *) {
+		printf("outer resume catch\n");
+	}
+	printf("\n");
+
+	// Terminate a resumption exception.
+	try {
+		try {
+			try {
+				THROW_RESUME(&(star){});
+			} catch (star *) {
+				printf("inner termination catch\n");
+			}
+		} catchResume (star * error) {
+			printf("resumption catch, will terminate\n");
+			THROW(error);
+		}
+	} catch (star *) {
+		printf("outer terminate catch (error)\n");
+	}
+#if 0
+	printf("\n");
+
+	// Unwinding a resumption catch does not break the system.
+	try {
+		try {
+			try {
+				try {
+					printf("throwing resume moon\n");
+					THROW_RESUME(&(moon){});
+				} catch (star *) {
+					printf("termination catch\n");
+				}
+				printf("throwing resume star\n");
+				THROW_RESUME(&(star){});
+			} catchResume (star *) {
+				printf("resumption star catch\n");
+			}
+		} catchResume (moon *) {
+			printf("resumption moon catch, will terminate\n");
+			THROW(&(star){});
+		}
+	} catchResume (star *) {
+		printf("outermost catch (error)\n");
+	}
+#endif
 }
Index: tests/exceptions/resume.cfa
===================================================================
--- tests/exceptions/resume.cfa	(revision 6d43cdde0e3ec27d64977f210123157ee7b67ffa)
+++ tests/exceptions/resume.cfa	(revision 3eb5a47849aa6054acbc7a319ad4cf0f46de50a3)
@@ -77,5 +77,4 @@
 		printf("caught yang\n");
 	}
-#ifdef FAILING
 	printf("\n");
 
@@ -100,4 +99,3 @@
 		printf("caught second exception (bad location)\n");
 	}
-#endif
 }
