diff --git a/src/BFEgg_fmt.c b/src/BFEgg_fmt_plug.c
similarity index 100%
rename from src/BFEgg_fmt.c
rename to src/BFEgg_fmt_plug.c
diff --git a/src/DMD5_fmt.c b/src/DMD5_fmt_plug.c
similarity index 100%
rename from src/DMD5_fmt.c
rename to src/DMD5_fmt_plug.c
diff --git a/src/DOMINOSEC_fmt.c b/src/DOMINOSEC_fmt_plug.c
similarity index 100%
rename from src/DOMINOSEC_fmt.c
rename to src/DOMINOSEC_fmt_plug.c
diff --git a/src/EPI_fmt.c b/src/EPI_fmt_plug.c
similarity index 100%
rename from src/EPI_fmt.c
rename to src/EPI_fmt_plug.c
diff --git a/src/HDAA_fmt.c b/src/HDAA_fmt_plug.c
similarity index 100%
rename from src/HDAA_fmt.c
rename to src/HDAA_fmt_plug.c
diff --git a/src/IPB2_fmt.c b/src/IPB2_fmt_plug.c
similarity index 100%
rename from src/IPB2_fmt.c
rename to src/IPB2_fmt_plug.c
diff --git a/src/KRB4_fmt.c b/src/KRB4_fmt_plug.c
similarity index 100%
rename from src/KRB4_fmt.c
rename to src/KRB4_fmt_plug.c
diff --git a/src/KRB4_std.c b/src/KRB4_std_plug.c
similarity index 100%
rename from src/KRB4_std.c
rename to src/KRB4_std_plug.c
diff --git a/src/KRB5_fmt.c b/src/KRB5_fmt_plug.c
similarity index 100%
rename from src/KRB5_fmt.c
rename to src/KRB5_fmt_plug.c
diff --git a/src/KRB5_std.c b/src/KRB5_std_plug.c
similarity index 100%
rename from src/KRB5_std.c
rename to src/KRB5_std_plug.c
diff --git a/src/MSCHAPv2_fmt.c b/src/MSCHAPv2_fmt_plug.c
similarity index 100%
rename from src/MSCHAPv2_fmt.c
rename to src/MSCHAPv2_fmt_plug.c
diff --git a/src/MYSQL_fast_fmt.c b/src/MYSQL_fast_fmt_plug.c
similarity index 100%
rename from src/MYSQL_fast_fmt.c
rename to src/MYSQL_fast_fmt_plug.c
diff --git a/src/MYSQL_fmt.c b/src/MYSQL_fmt_plug.c
similarity index 100%
rename from src/MYSQL_fmt.c
rename to src/MYSQL_fmt_plug.c
diff --git a/src/Makefile b/src/Makefile
index 3fa6057..212ae73 100644
--- a/src/Makefile
+++ b/src/Makefile
@@ -42,6 +42,11 @@ LDFLAGS_MKV = -s -lm
 OPT_NORMAL = -funroll-loops
 OPT_INLINE = -finline-functions
 
+# Should work on Solaris and gmake
+PLUGFORMATS_SRCS: sh =if [ -f *_plug.c ]; then ls *_plug.c; fi
+PLUGFORMATS_SRCS += $(shell ls *_plug.c)
+PLUGFORMATS_OBJS = $(PLUGFORMATS_SRCS:.c=.o)
+
 JOHN_OBJS = \
 	$(MPIOBJ) \
 	DES_fmt.o DES_std.o DES_bs.o DES_bs_b.o \
@@ -50,54 +55,14 @@ JOHN_OBJS = \
 	BF_fmt.o BF_std.o \
 	AFS_fmt.o \
 	LM_fmt.o \
-	NT_fmt.o \
-	XSHA_fmt.o \
-	BFEgg_fmt.o \
-	DOMINOSEC_fmt.o \
 	timer.o \
-	lotus5_fmt.o \
-	oracle_fmt.o \
-	oracle11_fmt.o \
-	MYSQL_fmt.o \
-	mysqlSHA1_fmt.o \
-	KRB4_fmt.o KRB4_std.o \
-	KRB5_fmt.o KRB5_std.o \
-	mskrb5_fmt.o \
 	md5_go.o \
-	rawMD5go_fmt.o md5_eq.o \
-	rawMD5unicode_fmt.o \
-	PO_fmt.o \
+	md5_eq.o \
 	md5.o \
 	hmacmd5.o \
-	hmacMD5_fmt.o \
-	IPB2_fmt.o \
-	rawSHA1_fmt.o \
-	sha1_gen_fmt.o \
-	rawMD4_fmt.o \
-	md4_gen_fmt.o \
-	NSLDAP_fmt.o NSLDAPS_fmt.o OPENLDAPS_fmt.o salted_sha1_fmt.o base64.o \
+	base64.o \
 	md4.o \
-	mscash_fmt.o \
-	mscash2_fmt.o \
-	NETLM_fmt.o \
-	NETNTLM_fmt.o \
-	NETLMv2_fmt.o \
-	NETNTLMv2_fmt.o \
-	NETHALFLM_fmt.o \
-	mediawiki_fmt.o \
-	MSCHAPv2_fmt.o \
-	mssql_fmt.o \
-	mssql05_fmt.o \
-	EPI_fmt.o \
-	PHPS_fmt.o \
-	MYSQL_fast_fmt.o \
-	pixMD5_fmt.o \
-	sapG_fmt.o sapB_fmt.o \
-	NS_fmt.o \
-	HDAA_fmt.o \
-	phpassMD5_fmt.o \
 	md5_gen_fmt.o md5_gen_parser.o md5_gen_preloads.o md5_gen_utils.o \
-	DMD5_fmt.o \
 	hmailserver_fmt.o \
 	SybaseASE_fmt.o \
 	SKEY_fmt.o \
@@ -105,6 +70,7 @@ JOHN_OBJS = \
 	pdf_fmt.o pdf2john.o pdfcrack_common.o pdfcrack_md5.o pdfparser.o pdfcrack.o pdfcrack_rc4.o \
 	rar_fmt.o rar2john.o \
 	zip_fmt.o zip2john.o gladman_hmac.o gladman_pwd2key.o \
+	$(PLUGFORMATS_OBJS) \
 	dummy.o \
 	batch.o bench.o charset.o common.o compiler.o config.o cracker.o \
 	crc32.o external.o formats.o getopt.o idle.o inc.o john.o list.o \
@@ -1070,7 +1036,7 @@ john.com: john.asm
 # this comment should stay for a jumbo or 2, to make sure this does not break
 # other peoples cygwin builds.
 #	$(LD) $(JOHN_OBJS) -lkernel32 -lcrypto -o ../run/john.exe
-	
+
 ../run/john.exe: $(JOHN_OBJS)
 	$(LD) $(JOHN_OBJS) $(LDFLAGS) -lkernel32 -o ../run/john.exe
 	strip ../run/john.exe
@@ -1151,6 +1117,11 @@ bench-t.o: bench.c
 .c.o:
 	$(CC) $(CFLAGS) $(OPT_NORMAL) $*.c
 
+john.o: john.c $(PLUGFORMATS_SRCS)
+	grep "struct fmt_main [^\*]" *_fmt_plug.c | grep -v extern | grep " =" | sed 's/.c:struct/.c/' | awk '{printf("/* %-22s */ extern struct %s %s;\n",$$1,$$2,$$3);}' > fmt_externs.h
+	grep "struct fmt_main [^\*]" *_fmt_plug.c | grep -v extern | grep " =" | sed 's/.c:struct/.c/' | awk '{printf("/* %-22s */ john_register_one(&%s);\n",$$1,$$3);}' > fmt_registers.h
+	$(CC) -c $(CFLAGS) $(OPT_NORMAL) john.c
+
 .S.o:
 	$(AS) $(ASFLAGS) $*.S
 
@@ -1168,6 +1139,7 @@ clean:
 	$(RM) $(PROJ) $(PROJ_DOS) $(PROJ_WIN32) $(PROJ_WIN32_MINGW)
 	$(RM) ../run/john.exe john-macosx-* *.o *.bak core
 	$(RM) detect bench generic.h arch.h tmp.s
+	$(RM) fmt_registers.h fmt_externs.h
 	$(CP) $(NULL) Makefile.dep
 
 include Makefile.dep
diff --git a/src/NETLM_fmt.c b/src/NETLM_fmt_plug.c
similarity index 100%
rename from src/NETLM_fmt.c
rename to src/NETLM_fmt_plug.c
diff --git a/src/NETLMv2_fmt.c b/src/NETLMv2_fmt_plug.c
similarity index 100%
rename from src/NETLMv2_fmt.c
rename to src/NETLMv2_fmt_plug.c
diff --git a/src/NETNTLM_fmt.c b/src/NETNTLM_fmt_plug.c
similarity index 100%
rename from src/NETNTLM_fmt.c
rename to src/NETNTLM_fmt_plug.c
diff --git a/src/NETNTLMv2_fmt.c b/src/NETNTLMv2_fmt_plug.c
similarity index 100%
rename from src/NETNTLMv2_fmt.c
rename to src/NETNTLMv2_fmt_plug.c
diff --git a/src/NETHALFLM_fmt.c b/src/NETSPLITLM_fmt_plug.c
similarity index 100%
rename from src/NETHALFLM_fmt.c
rename to src/NETSPLITLM_fmt_plug.c
diff --git a/src/NSLDAPS_fmt.c b/src/NSLDAPS_fmt_plug.c
similarity index 100%
rename from src/NSLDAPS_fmt.c
rename to src/NSLDAPS_fmt_plug.c
diff --git a/src/NSLDAP_fmt.c b/src/NSLDAP_fmt_plug.c
similarity index 100%
rename from src/NSLDAP_fmt.c
rename to src/NSLDAP_fmt_plug.c
diff --git a/src/NS_fmt.c b/src/NS_fmt_plug.c
similarity index 100%
rename from src/NS_fmt.c
rename to src/NS_fmt_plug.c
diff --git a/src/NT_fmt.c b/src/NT_fmt_plug.c
similarity index 100%
rename from src/NT_fmt.c
rename to src/NT_fmt_plug.c
diff --git a/src/OPENLDAPS_fmt.c b/src/OPENLDAPS_fmt_plug.c
similarity index 100%
rename from src/OPENLDAPS_fmt.c
rename to src/OPENLDAPS_fmt_plug.c
diff --git a/src/PHPS_fmt.c b/src/PHPS_fmt_plug.c
similarity index 100%
rename from src/PHPS_fmt.c
rename to src/PHPS_fmt_plug.c
diff --git a/src/PO_fmt.c b/src/PO_fmt_plug.c
similarity index 100%
rename from src/PO_fmt.c
rename to src/PO_fmt_plug.c
diff --git a/src/XSHA_fmt.c b/src/XSHA_fmt_plug.c
similarity index 100%
rename from src/XSHA_fmt.c
rename to src/XSHA_fmt_plug.c
diff --git a/src/fmt_registers.orig.h b/src/fmt_registers.orig.h
new file mode 100644
index 0000000..51c62be
--- /dev/null
+++ b/src/fmt_registers.orig.h
@@ -0,0 +1,45 @@
+ 	john_register_one(&fmt_NT);
+-	john_register_one(&fmt_XSHA);
+-	john_register_one(&fmt_mscash);
+-	john_register_one(&fmt_mscash2);
+-	john_register_one(&fmt_hmacMD5);
+-	john_register_one(&fmt_PO);
+-	john_register_one(&fmt_rawMD5go);
+-	john_register_one(&fmt_rawMD5unicode);
+-	john_register_one(&fmt_phpassmd5);
+-	john_register_one(&fmt_DMD5);
+-	john_register_one(&fmt_IPB2);
+-	john_register_one(&fmt_rawSHA1);
+-	john_register_one(&fmt_sha1_gen);
+-	john_register_one(&fmt_rawMD4);
+-	john_register_one(&fmt_md4_gen);
+-	john_register_one(&fmt_KRB4);
+-	john_register_one(&fmt_KRB5);
+-	john_register_one(&fmt_mskrb5);
+-	john_register_one(&fmt_NSLDAP);
+-	john_register_one(&fmt_NSLDAPS);
+-	john_register_one(&fmt_OPENLDAPS);
+-	john_register_one(&fmt_BFEgg);
+-	john_register_one(&fmt_oracle);
+-	john_register_one(&fmt_oracle11);
+-	john_register_one(&fmt_MYSQL);
+-	john_register_one(&fmt_mysqlSHA1);
+-	john_register_one(&fmt_lotus5);
+-	john_register_one(&fmt_DOMINOSEC);
+ 	john_register_one(&fmt_NETLM);
+-	john_register_one(&fmt_NETNTLM);
+-	john_register_one(&fmt_NETLMv2);
+-	john_register_one(&fmt_NETNTLMv2);
+ 	john_register_one(&fmt_NETHALFLM);
+-	john_register_one(&fmt_MSCHAPv2);
+-	john_register_one(&fmt_mssql);
+-	john_register_one(&fmt_mssql05);
+-	john_register_one(&fmt_EPI);
+-	john_register_one(&fmt_PHPS);
+-	john_register_one(&fmt_MYSQL_fast);
+-	john_register_one(&fmt_pixMD5);
+-	john_register_one(&fmt_sapG);
+-	john_register_one(&fmt_sapB);
+-	john_register_one(&fmt_NS);
+-	john_register_one(&fmt_HDAA);
+-	john_register_one(&fmt_saltedsha);
diff --git a/src/hmacMD5_fmt.c b/src/hmacMD5_fmt_plug.c
similarity index 100%
rename from src/hmacMD5_fmt.c
rename to src/hmacMD5_fmt_plug.c
diff --git a/src/john.c b/src/john.c
index a29a4e4..eb61bd3 100644
--- a/src/john.c
+++ b/src/john.c
@@ -61,53 +61,7 @@ extern struct fmt_main fmt_crypt;
 #endif
 extern struct fmt_main fmt_dummy;
 
-extern struct fmt_main fmt_NT, fmt_XSHA;
-extern struct fmt_main fmt_PO;
-extern struct fmt_main fmt_rawMD5go;
-extern struct fmt_main fmt_rawMD5unicode;
 extern struct fmt_main fmt_MD5gen;
-extern struct fmt_main fmt_hmacMD5;
-extern struct fmt_main fmt_IPB2;
-extern struct fmt_main fmt_phpassmd5;
-extern struct fmt_main fmt_DMD5;
-extern struct fmt_main fmt_BFEgg;
-extern struct fmt_main fmt_KRB4;
-extern struct fmt_main fmt_KRB5;
-extern struct fmt_main fmt_mskrb5;
-extern struct fmt_main fmt_oracle;
-extern struct fmt_main fmt_oracle11;
-extern struct fmt_main fmt_MYSQL;
-extern struct fmt_main fmt_mysqlSHA1;
-extern struct fmt_main fmt_NSLDAP;
-extern struct fmt_main fmt_NSLDAPS;
-extern struct fmt_main fmt_OPENLDAPS;
-extern struct fmt_main fmt_saltedsha;
-extern struct fmt_main fmt_mediawiki;
-extern struct fmt_main fmt_mscash;
-extern struct fmt_main fmt_mscash2;
-extern struct fmt_main fmt_rawSHA1;
-extern struct fmt_main fmt_XSHA;
-extern struct fmt_main fmt_sha1_gen;
-extern struct fmt_main fmt_rawMD4;
-extern struct fmt_main fmt_md4_gen;
-extern struct fmt_main fmt_lotus5;
-extern struct fmt_main fmt_DOMINOSEC;
-extern struct fmt_main fmt_NETLM;
-extern struct fmt_main fmt_NETNTLM;
-extern struct fmt_main fmt_NETLMv2;
-extern struct fmt_main fmt_NETNTLMv2;
-extern struct fmt_main fmt_NETHALFLM;
-extern struct fmt_main fmt_MSCHAPv2;
-extern struct fmt_main fmt_mssql;
-extern struct fmt_main fmt_mssql05;
-extern struct fmt_main fmt_EPI;
-extern struct fmt_main fmt_PHPS;
-extern struct fmt_main fmt_MYSQL_fast;
-extern struct fmt_main fmt_pixMD5;
-extern struct fmt_main fmt_sapG;
-extern struct fmt_main fmt_sapB;
-extern struct fmt_main fmt_NS;
-extern struct fmt_main fmt_HDAA;
 
 #if OPENSSL_VERSION_NUMBER >= 0x00908000
 extern struct fmt_main fmt_hmailserver;
@@ -123,6 +77,8 @@ extern struct fmt_main fmt_pdf;
 extern struct fmt_main rar_fmt;
 extern struct fmt_main zip_fmt;
 
+#include "fmt_externs.h"
+
 extern int unique(int argc, char **argv);
 extern int unshadow(int argc, char **argv);
 extern int unafs(int argc, char **argv);
@@ -164,53 +120,6 @@ static void john_register_all(void)
 	john_register_one(&fmt_AFS);
 	john_register_one(&fmt_LM);
 
-	john_register_one(&fmt_NT);
-	john_register_one(&fmt_XSHA);
-	john_register_one(&fmt_mscash);
-	john_register_one(&fmt_mscash2);
-	john_register_one(&fmt_hmacMD5);
-	john_register_one(&fmt_PO);
-	john_register_one(&fmt_rawMD5go);
-	john_register_one(&fmt_rawMD5unicode);
-	john_register_one(&fmt_phpassmd5);
-	john_register_one(&fmt_DMD5);
-	john_register_one(&fmt_IPB2);
-	john_register_one(&fmt_rawSHA1);
-	john_register_one(&fmt_sha1_gen);
-	john_register_one(&fmt_rawMD4);
-	john_register_one(&fmt_md4_gen);
-	john_register_one(&fmt_KRB4);
-	john_register_one(&fmt_KRB5);
-	john_register_one(&fmt_mskrb5);
-	john_register_one(&fmt_NSLDAP);
-	john_register_one(&fmt_NSLDAPS);
-	john_register_one(&fmt_OPENLDAPS);
-	john_register_one(&fmt_saltedsha);
-	john_register_one(&fmt_BFEgg);
-	john_register_one(&fmt_oracle);
-	john_register_one(&fmt_oracle11);
-	john_register_one(&fmt_MYSQL);
-	john_register_one(&fmt_mysqlSHA1);
-	john_register_one(&fmt_lotus5);
-	john_register_one(&fmt_DOMINOSEC);
-	john_register_one(&fmt_NETLM);
-	john_register_one(&fmt_NETNTLM);
-	john_register_one(&fmt_NETLMv2);
-	john_register_one(&fmt_NETNTLMv2);
-	john_register_one(&fmt_NETHALFLM);
-	john_register_one(&fmt_mediawiki);
-	john_register_one(&fmt_MSCHAPv2);
-	john_register_one(&fmt_mssql);
-	john_register_one(&fmt_mssql05);
-	john_register_one(&fmt_EPI);
-	john_register_one(&fmt_PHPS);
-	john_register_one(&fmt_MYSQL_fast);
-	john_register_one(&fmt_pixMD5);
-	john_register_one(&fmt_sapG);
-	john_register_one(&fmt_sapB);
-	john_register_one(&fmt_NS);
-	john_register_one(&fmt_HDAA);
-
 #if OPENSSL_VERSION_NUMBER >= 0x00908000
 	john_register_one(&fmt_hmailserver);
 	john_register_one(&fmt_SybaseASE);
@@ -232,6 +141,8 @@ static void john_register_all(void)
 	john_register_one(&rar_fmt);
 	john_register_one(&zip_fmt);
 
+#include "fmt_registers.h"
+
 	john_register_one(&fmt_dummy);
 
 	if (!fmt_list) {
diff --git a/src/lotus5_fmt.c b/src/lotus5_fmt_plug.c
similarity index 100%
rename from src/lotus5_fmt.c
rename to src/lotus5_fmt_plug.c
diff --git a/src/md4_gen_fmt.c b/src/md4_gen_fmt_plug.c
similarity index 100%
rename from src/md4_gen_fmt.c
rename to src/md4_gen_fmt_plug.c
diff --git a/src/mediawiki_fmt.c b/src/mediawiki_fmt_plug.c
similarity index 100%
rename from src/mediawiki_fmt.c
rename to src/mediawiki_fmt_plug.c
diff --git a/src/mscash_fmt.c b/src/mscash1_fmt_plug.c
similarity index 100%
rename from src/mscash_fmt.c
rename to src/mscash1_fmt_plug.c
diff --git a/src/mscash2_fmt.c b/src/mscash2_fmt_plug.c
similarity index 100%
rename from src/mscash2_fmt.c
rename to src/mscash2_fmt_plug.c
diff --git a/src/mskrb5_fmt.c b/src/mskrb5_fmt_plug.c
similarity index 100%
rename from src/mskrb5_fmt.c
rename to src/mskrb5_fmt_plug.c
diff --git a/src/mssql_fmt.c b/src/mssql-old_fmt_plug.c
similarity index 100%
rename from src/mssql_fmt.c
rename to src/mssql-old_fmt_plug.c
diff --git a/src/mssql05_fmt.c b/src/mssql05_fmt_plug.c
similarity index 100%
rename from src/mssql05_fmt.c
rename to src/mssql05_fmt_plug.c
diff --git a/src/mysqlSHA1_fmt.c b/src/mysqlSHA1_fmt_plug.c
similarity index 100%
rename from src/mysqlSHA1_fmt.c
rename to src/mysqlSHA1_fmt_plug.c
diff --git a/src/oracle11_fmt.c b/src/oracle11_fmt_plug.c
similarity index 100%
rename from src/oracle11_fmt.c
rename to src/oracle11_fmt_plug.c
diff --git a/src/oracle_fmt.c b/src/oracle_fmt_plug.c
similarity index 100%
rename from src/oracle_fmt.c
rename to src/oracle_fmt_plug.c
diff --git a/src/phpassMD5_fmt.c b/src/phpassMD5_fmt_plug.c
similarity index 100%
rename from src/phpassMD5_fmt.c
rename to src/phpassMD5_fmt_plug.c
diff --git a/src/pixMD5_fmt.c b/src/pixMD5_fmt_plug.c
similarity index 100%
rename from src/pixMD5_fmt.c
rename to src/pixMD5_fmt_plug.c
diff --git a/src/rawMD4_fmt.c b/src/rawMD4_fmt_plug.c
similarity index 100%
rename from src/rawMD4_fmt.c
rename to src/rawMD4_fmt_plug.c
diff --git a/src/rawMD5go_fmt.c b/src/rawMD5go_fmt_plug.c
similarity index 100%
rename from src/rawMD5go_fmt.c
rename to src/rawMD5go_fmt_plug.c
diff --git a/src/rawMD5unicode_fmt.c b/src/rawMD5unicode_fmt_plug.c
similarity index 100%
rename from src/rawMD5unicode_fmt.c
rename to src/rawMD5unicode_fmt_plug.c
diff --git a/src/rawSHA1_fmt.c b/src/rawSHA1_fmt_plug.c
similarity index 100%
rename from src/rawSHA1_fmt.c
rename to src/rawSHA1_fmt_plug.c
diff --git a/src/salted_sha1_fmt.c b/src/salted_sha1_fmt_plug.c
similarity index 100%
rename from src/salted_sha1_fmt.c
rename to src/salted_sha1_fmt_plug.c
diff --git a/src/sapB_fmt.c b/src/sapB_fmt_plug.c
similarity index 100%
rename from src/sapB_fmt.c
rename to src/sapB_fmt_plug.c
diff --git a/src/sapG_fmt.c b/src/sapG_fmt_plug.c
similarity index 100%
rename from src/sapG_fmt.c
rename to src/sapG_fmt_plug.c
diff --git a/src/sha1_gen_fmt.c b/src/sha1_gen_fmt_plug.c
similarity index 100%
rename from src/sha1_gen_fmt.c
rename to src/sha1_gen_fmt_plug.c
