Index: translator/InitTweak/RemoveInit.cc
===================================================================
--- translator/InitTweak/RemoveInit.cc	(revision 42e2ad789d5cd89e0f2a67a8f6507c685dbdc4ef)
+++ translator/InitTweak/RemoveInit.cc	(revision 42e2ad789d5cd89e0f2a67a8f6507c685dbdc4ef)
@@ -0,0 +1,52 @@
+#include "RemoveInit.h"
+#include "SynTree/Declaration.h"
+#include "SynTree/Type.h"
+#include "SynTree/Expression.h"
+#include "SynTree/Statement.h"
+#include "SynTree/Initializer.h"
+#include "SynTree/Mutator.h"
+
+namespace InitTweak {
+
+namespace {
+const std::list<Label> noLabels;
+}
+
+void tweak( std::list< Declaration * > translationUnit ) {
+  RemoveInit remover;
+  mutateAll( translationUnit, remover );
+}
+
+void RemoveInit::mutateStatementList( std::list< Statement* > &statements ) {
+  for( std::list< Statement* >::iterator i = statements.begin(); i != statements.end(); ++i ) {
+    if( !stmtsToAddAfter.empty() ) {
+      statements.splice( i, stmtsToAddAfter );
+    }
+    *i = (*i)->acceptMutator( *this );
+  }
+  if( !stmtsToAddAfter.empty() ) {
+    statements.splice( statements.end(), stmtsToAddAfter );
+  }
+}
+
+CompoundStmt *RemoveInit::mutate(CompoundStmt *compoundStmt) {
+  mutateStatementList( compoundStmt->get_kids() );
+  return compoundStmt;
+}
+
+// in the case where an object has an initializer and a polymorphic type, insert an assignment
+// immediately after the declaration. This will (seemingly) cause the later phases to do the right
+// thing with the assignment
+ObjectDecl *RemoveInit::mutate( ObjectDecl *objDecl ) {
+  if (objDecl->get_init() && dynamic_cast<TypeInstType*>(objDecl->get_type())) {
+    if (SingleInit * single = dynamic_cast<SingleInit*>(objDecl->get_init())) {
+      UntypedExpr *assign = new UntypedExpr( new NameExpr( "?=?" ) );
+      assign->get_args().push_back( new AddressExpr (new NameExpr( objDecl->get_name() ) ) );
+      assign->get_args().push_back( single->get_value()->clone() );
+      stmtsToAddAfter.push_back(new ExprStmt(noLabels, assign));
+    }
+  }
+  return objDecl;
+}
+} // namespace InitTweak
+
Index: translator/InitTweak/module.mk
===================================================================
--- translator/InitTweak/module.mk	(revision bdd516a5257cb93cc0c5b4a4c343cc112252022a)
+++ translator/InitTweak/module.mk	(revision 42e2ad789d5cd89e0f2a67a8f6507c685dbdc4ef)
@@ -3,4 +3,5 @@
        InitTweak/Mutate.cc     \
        InitTweak/Association.cc     \
+       InitTweak/RemoveInit.cc     \
 	$(NULL)
 
Index: translator/main.cc
===================================================================
--- translator/main.cc	(revision bdd516a5257cb93cc0c5b4a4c343cc112252022a)
+++ translator/main.cc	(revision 42e2ad789d5cd89e0f2a67a8f6507c685dbdc4ef)
@@ -25,4 +25,5 @@
 #include "MakeLibCfa.h"
 #include "InitTweak/Mutate.h"
+#include "InitTweak/RemoveInit.h"
 //#include "Explain/GenProlog.h"
 //#include "Try/Visit.h"
@@ -256,4 +257,8 @@
             return 0;
         } // if
+
+	// add the assignment statement after the 
+	// initialization of a type parameter
+	InitTweak::tweak( translationUnit );
 
 	//std::cerr << "before validate" << std::endl;
