Index: src/CodeGen/CodeGenerator.cc
===================================================================
--- src/CodeGen/CodeGenerator.cc	(revision 058f549aa36a522d2e89bddf81f736ef628c045e)
+++ src/CodeGen/CodeGenerator.cc	(revision a984e65cceaf54cae32c9c76370d3f267d90a57b)
@@ -195,7 +195,5 @@
 		}
 
-		output << kind;
-		if ( aggDecl->get_name() != "" )
-			output << aggDecl->get_name();
+		output << kind << aggDecl->get_name();
 
 		if ( aggDecl->has_body() ) {
@@ -233,6 +231,5 @@
 		genAttributes( enumDecl->get_attributes() );
 
-		if ( enumDecl->get_name() != "" )
-			output << enumDecl->get_name();
+		output << enumDecl->get_name();
 
 		std::list< Declaration* > &memb = enumDecl->get_members();
@@ -260,5 +257,9 @@
 	}
 
-	void CodeGenerator::visit( __attribute__((unused)) TraitDecl * traitDecl ) {}
+	void CodeGenerator::visit( TraitDecl * traitDecl ) {
+		assertf( ! genC, "TraitDecl nodes should not reach code generation." );
+		extension( traitDecl );
+		handleAggregate( traitDecl, "trait " );
+	}
 
 	void CodeGenerator::visit( TypedefDecl * typeDecl ) {
Index: src/CodeGen/Generate.cc
===================================================================
--- src/CodeGen/Generate.cc	(revision 058f549aa36a522d2e89bddf81f736ef628c045e)
+++ src/CodeGen/Generate.cc	(revision a984e65cceaf54cae32c9c76370d3f267d90a57b)
@@ -21,4 +21,5 @@
 #include "CodeGenerator.h"           // for CodeGenerator, doSemicolon, oper...
 #include "GenType.h"                 // for genPrettyType
+#include "Common/PassVisitor.h"      // for PassVisitor
 #include "Parser/LinkageSpec.h"      // for isBuiltin, isGeneratable
 #include "SynTree/BaseSyntaxNode.h"  // for BaseSyntaxNode
@@ -29,5 +30,22 @@
 
 namespace CodeGen {
+	namespace {
+		/// Removes misc. nodes that should not exist in CodeGen
+		struct TreeCleaner {
+			void visit( CompoundStmt * stmt );
+
+			static bool shouldClean( Declaration * );
+		};
+
+		void cleanTree( std::list< Declaration * > & translationUnit ) {
+			PassVisitor<TreeCleaner> cleaner;
+			filter( translationUnit, [](Declaration * decl) { return TreeCleaner::shouldClean(decl); }, false );
+			acceptAll( translationUnit, cleaner );
+		} // cleanTree
+	} // namespace
+
 	void generate( std::list< Declaration* > translationUnit, std::ostream &os, bool doIntrinsics, bool pretty, bool generateC, bool lineMarks ) {
+		cleanTree( translationUnit );
+
 		CodeGen::CodeGenerator cgv( os, pretty, generateC, lineMarks );
 		for ( auto & dcl : translationUnit ) {
@@ -52,4 +70,19 @@
 		os << std::endl;
 	}
+
+	namespace {
+		void TreeCleaner::visit( CompoundStmt * cstmt ) {
+			filter( cstmt->kids, [](Statement * stmt) {
+				if ( DeclStmt * declStmt = dynamic_cast< DeclStmt * >( stmt ) ) {
+					return shouldClean( declStmt->decl );
+				}
+				return false;
+			}, false );
+		}
+
+		bool TreeCleaner::shouldClean( Declaration * decl ) {
+			return dynamic_cast< TraitDecl * >( decl );
+		}
+	} // namespace
 } // namespace CodeGen
 
