Index: src/libcfa/exception.c
===================================================================
--- src/libcfa/exception.c	(revision 5ea26ed2fcd7204d100fb83710fcb611e2948b38)
+++ src/libcfa/exception.c	(revision cbce2727f642c2a177c82c045248ba1923699527)
@@ -10,7 +10,9 @@
 // Created On       : Mon Jun 26 15:13:00 2017
 // Last Modified By : Andrew Beach
-// Last Modified On : Mon Jul 31 13:51:00 2017
-// Update Count     : 4
+// Last Modified On : Fri Aug  4 15:20:00 2017
+// Update Count     : 6
 //
+
+#include <stddef.h> // for size_t
 
 #include "exception.h"
@@ -32,4 +34,16 @@
 #include "lsda.h"
 
+
+// Base exception vtable is abstract, you should not have base exceptions.
+struct __cfaehm__base_exception_t_vtable
+		___cfaehm__base_exception_t_vtable_instance = {
+	.parent = NULL,
+	.size = 0,
+	.copy = NULL,
+	.free = NULL,
+	.msg = NULL
+};
+
+
 // Temperary global exception context. Does not work with concurency.
 struct exception_context_t {
@@ -39,8 +53,5 @@
     exception * current_exception;
     int current_handler_index;
-
-	// Storage to avoid using the heap for exceptions.
-	exception built_in_storage;
-} shared_stack = {NULL, NULL, 0, 0, 0};
+} shared_stack = {NULL, NULL, 0, 0};
 
 // Get the current exception context.
@@ -69,5 +80,5 @@
 
 	// DEBUG
-	printf("Throwing resumption exception %d\n", *except);
+	printf("Throwing resumption exception\n");
 
 	struct __cfaehm__try_resume_node * original_head = shared_stack.current_resume;
@@ -83,5 +94,5 @@
 	}
 
-	printf("Unhandled exception %d\n", *except);
+	printf("Unhandled exception\n");
 	shared_stack.current_resume = original_head;
 
@@ -124,5 +135,5 @@
 	// Allocate memory for the exception.
 	struct __cfaehm__node * store = malloc(
-		sizeof( except ) + sizeof( struct __cfaehm__node ) );
+		sizeof( struct __cfaehm__node ) + except->virtual_table->size );
 
 	if ( ! store ) {
@@ -136,5 +147,5 @@
 
 	// Copy the exception to storage.
-	*context->current_exception = *except;
+	except->virtual_table->copy( context->current_exception, except );
 }
 
@@ -144,5 +155,5 @@
 
 	// DEBUG
-	printf( "Deleting Exception %d\n", *except);
+	printf( "Deleting Exception\n");
 
 	// Remove the exception from the list.
@@ -163,10 +174,11 @@
 
 	// Free the old exception node.
+	except->virtual_table->free( except );
 	free( to_free );
 }
 
 // If this isn't a rethrow (*except==0), delete the provided exception.
-void __cfaehm__cleanup_terminate( exception ** except ) {
-	if ( *except ) __cfaehm__delete_exception( *except );
+void __cfaehm__cleanup_terminate( void * except ) {
+	if ( *(void**)except ) __cfaehm__delete_exception( *(exception**)except );
 }
 
Index: src/libcfa/exception.h
===================================================================
--- src/libcfa/exception.h	(revision 5ea26ed2fcd7204d100fb83710fcb611e2948b38)
+++ src/libcfa/exception.h	(revision cbce2727f642c2a177c82c045248ba1923699527)
@@ -10,6 +10,6 @@
 // Created On       : Mon Jun 26 15:11:00 2017
 // Last Modified By : Andrew Beach
-// Last Modified On : Fri Jul 27 12:42:00 2017
-// Update Count     : 4
+// Last Modified On : Fri Aug  4 15:20:00 2017
+// Update Count     : 5
 //
 
@@ -21,20 +21,19 @@
 #endif
 
-#if 1
-typedef int exception;
-#else
-struct exception_t;
-struct exception_t_vtable {
-	struct exception_t_vtable const * parent;
+struct __cfaehm__base_exception_t;
+typedef struct __cfaehm__base_exception_t exception;
+struct __cfaehm__base_exception_t_vtable {
+	const struct __cfaehm__base_exception_t_vtable * parent;
 	size_t size;
-	void (*copy)(struct exception_t *this, struct exception_t * other);
-	void (*free)(struct exception_t *this);
-	const char (*msg)(struct exception_t *this);
+	void (*copy)(struct __cfaehm__base_exception_t *this,
+	             struct __cfaehm__base_exception_t * other);
+	void (*free)(struct __cfaehm__base_exception_t *this);
+	const char (*msg)(struct __cfaehm__base_exception_t *this);
 };
-struct exception_t {
-	struct exception_vtable const * virtual_table;
+struct __cfaehm__base_exception_t {
+	struct __cfaehm__base_exception_t_vtable const * virtual_table;
 };
-typedef struct exception_t exception;
-#endif
+extern struct __cfaehm__base_exception_t_vtable
+	___cfaehm__base_exception_t_vtable_instance;
 
 
@@ -51,5 +50,5 @@
 
 // Clean-up the exception in catch blocks.
-void __cfaehm__cleanup_terminate(exception ** except);
+void __cfaehm__cleanup_terminate(void * except);
 
 // Data structure creates a list of resume handlers.
