Index: src/CodeGen/FixNames.cc
===================================================================
--- src/CodeGen/FixNames.cc	(revision 075734f14acde30eb96b3d4a867306b8dcec0eb3)
+++ src/CodeGen/FixNames.cc	(revision 0270824d417173d850d0b904d76e8e5873a6ec65)
@@ -14,4 +14,6 @@
 //
 
+#include <memory>
+
 #include "FixNames.h"
 #include "SynTree/Declaration.h"
@@ -20,4 +22,6 @@
 #include "SymTab/Mangler.h"
 #include "OperatorTable.h"
+
+extern std::unique_ptr<FunctionDecl> translation_unit_main_signature;
 
 namespace CodeGen {
@@ -28,5 +32,4 @@
 
 		virtual void visit( CompoundStmt *compoundStmt );
-
 	  private:
 		int scopeLevel = 1;
@@ -34,4 +37,61 @@
 		void fixDWT( DeclarationWithType *dwt );
 	};
+
+	std::string mangle_main() {
+		FunctionType* main_type;
+		std::unique_ptr<FunctionDecl> mainDecl { new FunctionDecl(
+			"main", 
+			DeclarationNode::NoStorageClass, 
+			LinkageSpec::Cforall, 
+			main_type = new FunctionType( Type::Qualifiers(), true ), 
+			nullptr, false, false
+		) };
+		main_type->get_returnVals().push_back( 
+			new ObjectDecl( "", DeclarationNode::NoStorageClass, LinkageSpec::Cforall, 0, new BasicType( Type::Qualifiers(), BasicType::SignedInt ), nullptr )
+		);
+
+		auto&& name = SymTab::Mangler::mangle( mainDecl.get() );
+		// std::cerr << name << std::endl;
+		return name;
+	}
+	std::string mangle_main_args() {
+		FunctionType* main_type;
+		std::unique_ptr<FunctionDecl> mainDecl { new FunctionDecl(
+			"main", 
+			DeclarationNode::NoStorageClass, 
+			LinkageSpec::Cforall, 
+			main_type = new FunctionType( Type::Qualifiers(), false ), 
+			nullptr, false, false
+		) };
+		main_type->get_returnVals().push_back( 
+			new ObjectDecl( "", DeclarationNode::NoStorageClass, LinkageSpec::Cforall, 0, new BasicType( Type::Qualifiers(), BasicType::SignedInt ), nullptr )
+		);
+
+		mainDecl->get_functionType()->get_parameters().push_back( 
+			new ObjectDecl( "", DeclarationNode::NoStorageClass, LinkageSpec::Cforall, 0, new BasicType( Type::Qualifiers(), BasicType::SignedInt ), nullptr )
+		);
+
+		mainDecl->get_functionType()->get_parameters().push_back( 
+			new ObjectDecl( "", DeclarationNode::NoStorageClass, LinkageSpec::Cforall, 0, 
+			new PointerType( Type::Qualifiers(), new PointerType( Type::Qualifiers(), new BasicType( Type::Qualifiers(), BasicType::Char ) ) ), 
+			nullptr )
+		);
+
+		auto&& name = SymTab::Mangler::mangle( mainDecl.get() );
+		// std::cerr << name << std::endl;
+		return name;
+	}
+
+	bool is_main(const std::string& name) {
+		static std::string mains[] = { 
+			mangle_main(), 
+			mangle_main_args()
+		};
+
+		for(const auto& m : mains) {
+			if( name == m ) return true;
+		}
+		return false;
+	}
 
 	void fixNames( std::list< Declaration* > translationUnit ) {
@@ -57,4 +117,13 @@
 		Visitor::visit( functionDecl );
 		fixDWT( functionDecl );
+
+		if(is_main( SymTab::Mangler::mangle(functionDecl, true, true) )) {
+			if(translation_unit_main_signature) { 
+				throw SemanticError("Multiple definition of main routine\n", functionDecl); 
+			}
+
+			functionDecl->get_statements()->get_kids().push_back( new ReturnStmt( noLabels, new ConstantExpr( Constant( new BasicType( Type::Qualifiers(), BasicType::SignedInt ), "0") ) ) );
+			translation_unit_main_signature.reset( functionDecl->clone() );
+		}
 	}
 
Index: src/SymTab/Mangler.h
===================================================================
--- src/SymTab/Mangler.h	(revision 075734f14acde30eb96b3d4a867306b8dcec0eb3)
+++ src/SymTab/Mangler.h	(revision 0270824d417173d850d0b904d76e8e5873a6ec65)
@@ -27,5 +27,5 @@
 		/// Mangle syntax tree object; primary interface to clients
 		template< typename SynTreeClass >
-	    static std::string mangle( SynTreeClass *decl, bool mangleOverridable = true );
+	    static std::string mangle( SynTreeClass *decl, bool mangleOverridable = true, bool typeMode = false );
 		/// Mangle a type name; secondary interface
 		static std::string mangleType( Type* ty );
@@ -70,6 +70,6 @@
 
 	template< typename SynTreeClass >
-	std::string Mangler::mangle( SynTreeClass *decl, bool mangleOverridable ) {
-		Mangler mangler( mangleOverridable, false );
+	std::string Mangler::mangle( SynTreeClass *decl, bool mangleOverridable, bool typeMode ) {
+		Mangler mangler( mangleOverridable, typeMode );
 		maybeAccept( decl, mangler );
 		return mangler.get_mangleName();
Index: src/SynTree/FunctionDecl.cc
===================================================================
--- src/SynTree/FunctionDecl.cc	(revision 075734f14acde30eb96b3d4a867306b8dcec0eb3)
+++ src/SynTree/FunctionDecl.cc	(revision 0270824d417173d850d0b904d76e8e5873a6ec65)
@@ -27,7 +27,8 @@
 	set_isInline( isInline );
 	set_isNoreturn( isNoreturn );
-	// this is a brazen hack to force the function "main" to have C linkage
+	// this is a brazen hack to force the function "main" to have Cforall linkage
+	// because we want to replace the main even if it is inside an extern
 	if ( name == "main" ) {
-		set_linkage( LinkageSpec::C );
+		set_linkage( LinkageSpec::Cforall );
 	} // if
 }
Index: src/main.cc
===================================================================
--- src/main.cc	(revision 075734f14acde30eb96b3d4a867306b8dcec0eb3)
+++ src/main.cc	(revision 0270824d417173d850d0b904d76e8e5873a6ec65)
@@ -14,4 +14,5 @@
 //
 
+#include <memory>
 #include <iostream>
 #include <fstream>
@@ -78,4 +79,6 @@
 static void dump( list< Declaration * > & translationUnit, ostream & out = cout );
 
+std::unique_ptr<FunctionDecl> translation_unit_main_signature = nullptr;
+
 static void backtrace( int start ) {					// skip first N stack frames
 	enum { Frames = 50 };
@@ -299,4 +302,16 @@
 
 		CodeGen::generate( translationUnit, *output, ! noprotop );
+
+		if( translation_unit_main_signature ) {
+			*output << "int main(int argc, char** argv) { return ";
+
+			*output << translation_unit_main_signature->get_scopedMangleName() << "(";
+			if(translation_unit_main_signature->get_functionType()->get_parameters().size() != 0){
+				*output << "argc, argv";
+			}
+			*output << ");";
+
+			*output << " }\n";
+		}
 
 		if ( output != &cout ) {
Index: src/tests/.expect/32/declarationSpecifier.txt
===================================================================
--- src/tests/.expect/32/declarationSpecifier.txt	(revision 075734f14acde30eb96b3d4a867306b8dcec0eb3)
+++ src/tests/.expect/32/declarationSpecifier.txt	(revision 0270824d417173d850d0b904d76e8e5873a6ec65)
@@ -621,7 +621,11 @@
 static inline volatile const short __f47__FCVs___1();
 static inline volatile const short __f48__FCVs___1();
-int main(int __argc__i_1, const char **__argv__PPCc_1){
+int __main__Fi_iPPCc__1(int __argc__i_1, const char **__argv__PPCc_1){
     int ___retval_main__i_1;
     ((void)(___retval_main__i_1=((int )0)) /* ?{} */);
     return ((int )___retval_main__i_1);
-}
+    ((void)(___retval_main__i_1=0) /* ?{} */);
+    return ((int )___retval_main__i_1);
+}
+int main(int argc, char** argv) { return __main__Fi_iPPCc__1(argc, argv); }
+
Index: src/tests/.expect/32/gccExtensions.txt
===================================================================
--- src/tests/.expect/32/gccExtensions.txt	(revision 075734f14acde30eb96b3d4a867306b8dcec0eb3)
+++ src/tests/.expect/32/gccExtensions.txt	(revision 0270824d417173d850d0b904d76e8e5873a6ec65)
@@ -6,5 +6,5 @@
 extern int printf(const char *__restrict __format, ...);
 extern int __x__i_1 asm ( "xx" );
-int main(int __argc__i_1, const char **__argv__PPCc_1){
+int __main__Fi_iPPCc__1(int __argc__i_1, const char **__argv__PPCc_1){
     int ___retval_main__i_1;
     asm ( "nop" :  :  :  );
@@ -162,3 +162,6 @@
     ((void)(___retval_main__i_1=((int )0)) /* ?{} */);
     return ((int )___retval_main__i_1);
+    ((void)(___retval_main__i_1=0) /* ?{} */);
+    return ((int )___retval_main__i_1);
 }
+int main(int argc, char** argv) { return __main__Fi_iPPCc__1(argc, argv); }
Index: src/tests/.expect/64/declarationSpecifier.txt
===================================================================
--- src/tests/.expect/64/declarationSpecifier.txt	(revision 075734f14acde30eb96b3d4a867306b8dcec0eb3)
+++ src/tests/.expect/64/declarationSpecifier.txt	(revision 0270824d417173d850d0b904d76e8e5873a6ec65)
@@ -621,7 +621,10 @@
 static inline volatile const short __f47__FCVs___1();
 static inline volatile const short __f48__FCVs___1();
-int main(int __argc__i_1, const char **__argv__PPCc_1){
+int __main__Fi_iPPCc__1(int __argc__i_1, const char **__argv__PPCc_1){
     int ___retval_main__i_1;
     ((void)(___retval_main__i_1=((int )0)) /* ?{} */);
     return ((int )___retval_main__i_1);
-}
+    ((void)(___retval_main__i_1=0) /* ?{} */);
+    return ((int )___retval_main__i_1);
+}
+int main(int argc, char** argv) { return __main__Fi_iPPCc__1(argc, argv); }
Index: src/tests/.expect/64/gccExtensions.txt
===================================================================
--- src/tests/.expect/64/gccExtensions.txt	(revision 075734f14acde30eb96b3d4a867306b8dcec0eb3)
+++ src/tests/.expect/64/gccExtensions.txt	(revision 0270824d417173d850d0b904d76e8e5873a6ec65)
@@ -6,5 +6,5 @@
 extern int printf(const char *__restrict __format, ...);
 extern int __x__i_1 asm ( "xx" );
-int main(int __argc__i_1, const char **__argv__PPCc_1){
+int __main__Fi_iPPCc__1(int __argc__i_1, const char **__argv__PPCc_1){
     int ___retval_main__i_1;
     asm ( "nop" :  :  :  );
@@ -162,3 +162,6 @@
     ((void)(___retval_main__i_1=((int )0)) /* ?{} */);
     return ((int )___retval_main__i_1);
+    ((void)(___retval_main__i_1=0) /* ?{} */);
+    return ((int )___retval_main__i_1);
 }
+int main(int argc, char** argv) { return __main__Fi_iPPCc__1(argc, argv); }
