Index: src/ControlStruct/ExceptDecl.cpp
===================================================================
--- src/ControlStruct/ExceptDecl.cpp	(revision 58eb9250e6207108d230dd7d6311b0c3a9103779)
+++ src/ControlStruct/ExceptDecl.cpp	(revision 190a833c2baaf0fb88c72cb00720c5ab476197bc)
@@ -445,4 +445,11 @@
 }
 
+ast::NameExpr const * designatedName( ast::Designation const * des ) {
+	if ( des && 1 == des->designators.size() ) {
+		return des->designators.front().as<ast::NameExpr>();
+	}
+	return nullptr;
+}
+
 ast::ObjectDecl const * ExceptDeclCore::transformVTable(
 		ast::ObjectDecl const * decl, ast::VTableType const * type ) {
@@ -467,10 +474,42 @@
 				createTypeIdValue( location, exceptionName, params ) );
 		}
-		declsToAddBefore.push_back(
-			createCopy( location, exceptionName, params ) );
-		declsToAddBefore.push_back(
-			createMsg( location, exceptionName, params ) );
 		retDecl = createVirtualTable(
 			location, exceptionName, params, tableName );
+		// There is quite a bit of work to pull over any initializers and
+		// decide if we want to insert the default functions.
+		bool foundCopy = false;
+		bool foundMsg = false;
+		ast::ListInit const * init = decl->init.as<ast::ListInit>();
+		if ( init ) {
+			for ( size_t i = 0 ; i < init->initializers.size() ; ++i ) {
+				ast::Designation const * des = init->designations.at(i);
+				auto name = designatedName( des );
+				if ( nullptr == name ) continue;
+				if ( "copy" == name->name ) {
+					foundCopy = true;
+				} else if ( "msg" == name->name ) {
+					foundMsg = true;
+				}
+				auto retInit = retDecl->init.as<ast::ListInit>();
+				for ( size_t j = 0 ; j < retInit->initializers.size() ; ++j ) {
+					ast::Designation const * des = retInit->designations.at(j);
+					auto retName = designatedName( des );
+					if ( retName && name->name == retName->name ) {
+						retInit = ast::mutate_field_index( retInit,
+							&ast::ListInit::initializers, j,
+							init->initializers.at(i) );
+					}
+				}
+				retDecl->init = retInit;
+			}
+		}
+		if ( !foundCopy ) {
+			declsToAddBefore.push_back(
+				createCopy( location, exceptionName, params ) );
+		}
+		if ( !foundMsg ) {
+			declsToAddBefore.push_back(
+				createMsg( location, exceptionName, params ) );
+		}
 	}
 
