diff -urpN 179-a/src/MSCHAPv2_fmt_plug.c john-1.7.9-a/src/MSCHAPv2_fmt_plug.c
--- 179-a/src/MSCHAPv2_fmt_plug.c	2011-11-29 19:25:30.459125000 +0000
+++ john-1.7.9-a/src/MSCHAPv2_fmt_plug.c	2011-11-29 21:38:16.193500000 +0000
@@ -89,10 +89,10 @@ static uchar (*saved_key)[21];
 static uchar (*output)[PARTIAL_BINARY_SIZE];
 static uchar *challenge;
 static int keys_prepared;
+#define setzero(var) memset(var, 0, sizeof(*var) * pFmt->params.max_keys_per_crypt)
 
 #include "unicode.h"
 
-extern struct fmt_main fmt_MSCHAPv2;
 static void init(struct fmt_main *pFmt)
 {
 #ifdef _OPENMP
@@ -101,16 +101,21 @@ static void init(struct fmt_main *pFmt)
 		n = MIN_KEYS_PER_CRYPT;
 	if (n > MAX_KEYS_PER_CRYPT)
 		n = MAX_KEYS_PER_CRYPT;
-	fmt_MSCHAPv2.params.min_keys_per_crypt = n;
+	pFmt->params.min_keys_per_crypt = n;
 	n = n * (n << 1) * THREAD_RATIO;
 	if (n > MAX_KEYS_PER_CRYPT)
 		n = MAX_KEYS_PER_CRYPT;
-	fmt_MSCHAPv2.params.max_keys_per_crypt = n;
+	pFmt->params.max_keys_per_crypt = n;
 #endif
-	saved_plain = mem_alloc_tiny(sizeof(*saved_plain) * fmt_MSCHAPv2.params.max_keys_per_crypt, MEM_ALIGN_NONE);
-	saved_len = mem_alloc_tiny(sizeof(*saved_len) * fmt_MSCHAPv2.params.max_keys_per_crypt, MEM_ALIGN_WORD);
-	saved_key = mem_alloc_tiny(sizeof(*saved_key) * fmt_MSCHAPv2.params.max_keys_per_crypt, MEM_ALIGN_NONE);
-	output = mem_alloc_tiny(sizeof(*output) * fmt_MSCHAPv2.params.max_keys_per_crypt, MEM_ALIGN_WORD);
+	saved_plain = mem_alloc_tiny(sizeof(*saved_plain) * pFmt->params.max_keys_per_crypt, MEM_ALIGN_NONE);
+	saved_len = mem_alloc_tiny(sizeof(*saved_len) * pFmt->params.max_keys_per_crypt, MEM_ALIGN_WORD);
+	saved_key = mem_alloc_tiny(sizeof(*saved_key) * pFmt->params.max_keys_per_crypt, MEM_ALIGN_NONE);
+	output = mem_alloc_tiny(sizeof(*output) * pFmt->params.max_keys_per_crypt, MEM_ALIGN_WORD);
+	setzero(saved_plain);
+	setzero(saved_len);
+	setzero(saved_key);
+	setzero(output);
+
 }
 
 static int mschapv2_valid(char *ciphertext, struct fmt_main *pFmt)
diff -urpN 179-a/src/NETLM_fmt_plug.c john-1.7.9-a/src/NETLM_fmt_plug.c
--- 179-a/src/NETLM_fmt_plug.c	2011-11-29 19:25:30.459125000 +0000
+++ john-1.7.9-a/src/NETLM_fmt_plug.c	2011-11-29 21:35:14.381000000 +0000
@@ -88,8 +88,8 @@ static uchar (*saved_key)[21];
 static uchar (*saved_plain)[PLAINTEXT_LENGTH + 1];
 static uchar (*output)[PARTIAL_BINARY_SIZE];
 static uchar *challenge;
+#define setzero(var) memset(var, 0, sizeof(*var) * pFmt->params.max_keys_per_crypt)
 
-extern struct fmt_main fmt_NETLM;
 static void init(struct fmt_main *pFmt)
 {
 #ifdef _OPENMP
@@ -98,15 +98,18 @@ static void init(struct fmt_main *pFmt)
 		n = MIN_KEYS_PER_CRYPT;
 	if (n > MAX_KEYS_PER_CRYPT)
 		n = MAX_KEYS_PER_CRYPT;
-	fmt_NETLM.params.min_keys_per_crypt = n;
+	pFmt->params.min_keys_per_crypt = n;
 	n = n * n * ((n >> 1) + 1) * THREAD_RATIO;
 	if (n > MAX_KEYS_PER_CRYPT)
 		n = MAX_KEYS_PER_CRYPT;
-	fmt_NETLM.params.max_keys_per_crypt = n;
+	pFmt->params.max_keys_per_crypt = n;
 #endif
-	saved_key = mem_alloc_tiny(sizeof(*saved_key) * fmt_NETLM.params.max_keys_per_crypt, MEM_ALIGN_NONE);
-	saved_plain = mem_alloc_tiny(sizeof(*saved_plain) * fmt_NETLM.params.max_keys_per_crypt, MEM_ALIGN_NONE);
-	output = mem_alloc_tiny(sizeof(*output) * fmt_NETLM.params.max_keys_per_crypt, MEM_ALIGN_WORD);
+	saved_key = mem_alloc_tiny(sizeof(*saved_key) * pFmt->params.max_keys_per_crypt, MEM_ALIGN_NONE);
+	saved_plain = mem_alloc_tiny(sizeof(*saved_plain) * pFmt->params.max_keys_per_crypt, MEM_ALIGN_NONE);
+	output = mem_alloc_tiny(sizeof(*output) * pFmt->params.max_keys_per_crypt, MEM_ALIGN_WORD);
+	setzero(saved_key);
+	setzero(saved_plain);
+	setzero(output);
 }
 
 static int netlm_valid(char *ciphertext, struct fmt_main *pFmt)
diff -urpN 179-a/src/NETLMv2_fmt_plug.c john-1.7.9-a/src/NETLMv2_fmt_plug.c
--- 179-a/src/NETLMv2_fmt_plug.c	2011-11-29 19:25:30.474750000 +0000
+++ john-1.7.9-a/src/NETLMv2_fmt_plug.c	2011-11-29 21:38:11.802875000 +0000
@@ -98,6 +98,7 @@ static uchar (*output)[BINARY_SIZE];
 static HMACMD5Context (*saved_ctx);
 static int keys_prepared;
 static unsigned char *challenge;
+#define setzero(var) memset(var, 0, sizeof(*var) * pFmt->params.max_keys_per_crypt)
 
 #if !defined(uint16) && !defined(HAVE_UINT16_FROM_RPC_RPC_H)
 #if (SIZEOF_SHORT == 4)
@@ -117,7 +118,6 @@ static unsigned char *challenge;
 
 #include "byteorder.h"
 
-extern struct fmt_main fmt_NETLMv2;
 static void init(struct fmt_main *pFmt)
 {
 #ifdef _OPENMP
@@ -126,16 +126,20 @@ static void init(struct fmt_main *pFmt)
 		n = MIN_KEYS_PER_CRYPT;
 	if (n > MAX_KEYS_PER_CRYPT)
 		n = MAX_KEYS_PER_CRYPT;
-	fmt_NETLMv2.params.min_keys_per_crypt = n;
+	pFmt->params.min_keys_per_crypt = n;
 	n = n * n * ((n >> 1) + 1) * THREAD_RATIO;
 	if (n > MAX_KEYS_PER_CRYPT)
 		n = MAX_KEYS_PER_CRYPT;
-	fmt_NETLMv2.params.max_keys_per_crypt = n;
+	pFmt->params.max_keys_per_crypt = n;
 #endif
-	saved_plain = mem_alloc_tiny(sizeof(*saved_plain) * fmt_NETLMv2.params.max_keys_per_crypt, MEM_ALIGN_NONE);
-	saved_len = mem_alloc_tiny(sizeof(*saved_len) * fmt_NETLMv2.params.max_keys_per_crypt, MEM_ALIGN_WORD);
-	output = mem_alloc_tiny(sizeof(*output) * fmt_NETLMv2.params.max_keys_per_crypt, MEM_ALIGN_WORD);
-	saved_ctx = mem_alloc_tiny(sizeof(*saved_ctx) * fmt_NETLMv2.params.max_keys_per_crypt, MEM_ALIGN_WORD);
+	saved_plain = mem_alloc_tiny(sizeof(*saved_plain) * pFmt->params.max_keys_per_crypt, MEM_ALIGN_NONE);
+	saved_len = mem_alloc_tiny(sizeof(*saved_len) * pFmt->params.max_keys_per_crypt, MEM_ALIGN_WORD);
+	output = mem_alloc_tiny(sizeof(*output) * pFmt->params.max_keys_per_crypt, MEM_ALIGN_WORD);
+	saved_ctx = mem_alloc_tiny(sizeof(*saved_ctx) * pFmt->params.max_keys_per_crypt, MEM_ALIGN_WORD);
+	setzero(saved_plain);
+	setzero(saved_len);
+	setzero(output);
+	setzero(saved_ctx);
 }
 
 static int netlmv2_valid(char *ciphertext, struct fmt_main *pFmt)
diff -urpN 179-a/src/NETNTLM_fmt_plug.c john-1.7.9-a/src/NETNTLM_fmt_plug.c
--- 179-a/src/NETNTLM_fmt_plug.c	2011-11-29 19:25:30.490375000 +0000
+++ john-1.7.9-a/src/NETNTLM_fmt_plug.c	2011-11-29 21:38:05.318500000 +0000
@@ -102,8 +102,8 @@ static uchar (*output)[PARTIAL_BINARY_SI
 static uchar (*saved_key)[21]; // NT hash
 static uchar *challenge;
 static int keys_prepared;
+#define setzero(var) memset(var, 0, sizeof(*var) * pFmt->params.max_keys_per_crypt)
 
-extern struct fmt_main fmt_NETNTLM;
 static void init(struct fmt_main *pFmt)
 {
 #ifdef _OPENMP
@@ -112,16 +112,20 @@ static void init(struct fmt_main *pFmt)
 		n = MIN_KEYS_PER_CRYPT;
 	if (n > MAX_KEYS_PER_CRYPT)
 		n = MAX_KEYS_PER_CRYPT;
-	fmt_NETNTLM.params.min_keys_per_crypt = n;
+	pFmt->params.min_keys_per_crypt = n;
 	n = n * (n << 1) * THREAD_RATIO;
 	if (n > MAX_KEYS_PER_CRYPT)
 		n = MAX_KEYS_PER_CRYPT;
-	fmt_NETNTLM.params.max_keys_per_crypt = n;
+	pFmt->params.max_keys_per_crypt = n;
 #endif
-	saved_plain = mem_alloc_tiny(sizeof(*saved_plain) * fmt_NETNTLM.params.max_keys_per_crypt, MEM_ALIGN_NONE);
-	saved_len = mem_alloc_tiny(sizeof(*saved_len) * fmt_NETNTLM.params.max_keys_per_crypt, MEM_ALIGN_WORD);
-	output = mem_alloc_tiny(sizeof(*output) * fmt_NETNTLM.params.max_keys_per_crypt, MEM_ALIGN_WORD);
-	saved_key = mem_alloc_tiny(sizeof(*saved_key) * fmt_NETNTLM.params.max_keys_per_crypt, MEM_ALIGN_NONE);
+	saved_plain = mem_alloc_tiny(sizeof(*saved_plain) * pFmt->params.max_keys_per_crypt, MEM_ALIGN_NONE);
+	saved_len = mem_alloc_tiny(sizeof(*saved_len) * pFmt->params.max_keys_per_crypt, MEM_ALIGN_WORD);
+	output = mem_alloc_tiny(sizeof(*output) * pFmt->params.max_keys_per_crypt, MEM_ALIGN_WORD);
+	saved_key = mem_alloc_tiny(sizeof(*saved_key) * pFmt->params.max_keys_per_crypt, MEM_ALIGN_NONE);
+	setzero(saved_plain);
+	setzero(saved_len);
+	setzero(output);
+	setzero(saved_key);
 }
 
 static int netntlm_valid(char *ciphertext, struct fmt_main *pFmt)
diff -urpN 179-a/src/NETNTLMv2_fmt_plug.c john-1.7.9-a/src/NETNTLMv2_fmt_plug.c
--- 179-a/src/NETNTLMv2_fmt_plug.c	2011-11-29 19:25:30.490375000 +0000
+++ john-1.7.9-a/src/NETNTLMv2_fmt_plug.c	2011-11-29 21:38:08.412250000 +0000
@@ -105,6 +105,7 @@ static uchar (*output)[BINARY_SIZE];
 static HMACMD5Context (*saved_ctx);
 static uchar *challenge;
 static int keys_prepared;
+#define setzero(var) memset(var, 0, sizeof(*var) * pFmt->params.max_keys_per_crypt)
 
 #if !defined(uint16) && !defined(HAVE_UINT16_FROM_RPC_RPC_H)
 #if (SIZEOF_SHORT == 4)
@@ -124,7 +125,6 @@ static int keys_prepared;
 
 #include "byteorder.h"
 
-extern struct fmt_main fmt_NETNTLMv2;
 static void init(struct fmt_main *pFmt)
 {
 #ifdef _OPENMP
@@ -133,16 +133,20 @@ static void init(struct fmt_main *pFmt)
 		n = MIN_KEYS_PER_CRYPT;
 	if (n > MAX_KEYS_PER_CRYPT)
 		n = MAX_KEYS_PER_CRYPT;
-	fmt_NETNTLMv2.params.min_keys_per_crypt = n;
+	pFmt->params.min_keys_per_crypt = n;
 	n = n * (n << 1) * THREAD_RATIO;
 	if (n > MAX_KEYS_PER_CRYPT)
 		n = MAX_KEYS_PER_CRYPT;
-	fmt_NETNTLMv2.params.max_keys_per_crypt = n;
+	pFmt->params.max_keys_per_crypt = n;
 #endif
-	saved_plain = mem_alloc_tiny(sizeof(*saved_plain) * fmt_NETNTLMv2.params.max_keys_per_crypt, MEM_ALIGN_NONE);
-	saved_len = mem_alloc_tiny(sizeof(*saved_len) * fmt_NETNTLMv2.params.max_keys_per_crypt, MEM_ALIGN_WORD);
-	output = mem_alloc_tiny(sizeof(*output) * fmt_NETNTLMv2.params.max_keys_per_crypt, MEM_ALIGN_WORD);
-	saved_ctx = mem_alloc_tiny(sizeof(*saved_ctx) * fmt_NETNTLMv2.params.max_keys_per_crypt, MEM_ALIGN_WORD);
+	saved_plain = mem_alloc_tiny(sizeof(*saved_plain) * pFmt->params.max_keys_per_crypt, MEM_ALIGN_NONE);
+	saved_len = mem_alloc_tiny(sizeof(*saved_len) * pFmt->params.max_keys_per_crypt, MEM_ALIGN_WORD);
+	output = mem_alloc_tiny(sizeof(*output) * pFmt->params.max_keys_per_crypt, MEM_ALIGN_WORD);
+	saved_ctx = mem_alloc_tiny(sizeof(*saved_ctx) * pFmt->params.max_keys_per_crypt, MEM_ALIGN_WORD);
+	setzero(saved_plain);
+	setzero(saved_len);
+	setzero(output);
+	setzero(saved_ctx);
 }
 
 static int netntlmv2_valid(char *ciphertext, struct fmt_main *pFmt)
diff -urpN 179-a/src/NETSPLITLM_fmt_plug.c john-1.7.9-a/src/NETSPLITLM_fmt_plug.c
--- 179-a/src/NETSPLITLM_fmt_plug.c	2011-11-29 19:25:30.506000000 +0000
+++ john-1.7.9-a/src/NETSPLITLM_fmt_plug.c	2011-11-29 21:35:00.724750000 +0000
@@ -67,8 +67,9 @@ static uchar (*saved_plain)[PLAINTEXT_LE
 static uchar (*saved_pre)[8];
 static uchar (*output)[BINARY_SIZE];
 static uchar *challenge;
+#define setzero(var) memset(var, 0, sizeof(*var) * pFmt->params.max_keys_per_crypt)
+
 
-extern struct fmt_main fmt_NETHALFLM;
 static void init(struct fmt_main *pFmt)
 {
 #ifdef _OPENMP
@@ -77,15 +78,18 @@ static void init(struct fmt_main *pFmt)
 		n = MIN_KEYS_PER_CRYPT;
 	if (n > MAX_KEYS_PER_CRYPT)
 		n = MAX_KEYS_PER_CRYPT;
-	fmt_NETHALFLM.params.min_keys_per_crypt = n;
+	pFmt->params.min_keys_per_crypt = n;
 	n = n * n * ((n >> 1) + 1) * THREAD_RATIO;
 	if (n > MAX_KEYS_PER_CRYPT)
 		n = MAX_KEYS_PER_CRYPT;
-	fmt_NETHALFLM.params.max_keys_per_crypt = n;
+	pFmt->params.max_keys_per_crypt = n;
 #endif
-	saved_plain = mem_alloc_tiny(sizeof(*saved_plain) * fmt_NETHALFLM.params.max_keys_per_crypt, MEM_ALIGN_NONE);
-	saved_pre = mem_alloc_tiny(sizeof(*saved_pre) * fmt_NETHALFLM.params.max_keys_per_crypt, MEM_ALIGN_NONE);
-	output = mem_alloc_tiny(sizeof(*output) * fmt_NETHALFLM.params.max_keys_per_crypt, MEM_ALIGN_WORD);
+	saved_plain = mem_alloc_tiny(sizeof(*saved_plain) * pFmt->params.max_keys_per_crypt, MEM_ALIGN_NONE);
+	saved_pre = mem_alloc_tiny(sizeof(*saved_pre) * pFmt->params.max_keys_per_crypt, MEM_ALIGN_NONE);
+	output = mem_alloc_tiny(sizeof(*output) * pFmt->params.max_keys_per_crypt, MEM_ALIGN_WORD);
+	setzero(saved_plain);
+	setzero(saved_pre);
+	setzero(output);
 }
 
 static int nethalflm_valid(char *ciphertext, struct fmt_main *pFmt)
diff -urpN 179-a/src/XSHA512_fmt.c john-1.7.9-a/src/XSHA512_fmt.c
--- 179-a/src/XSHA512_fmt.c	2011-11-29 20:05:31.334125000 +0000
+++ john-1.7.9-a/src/XSHA512_fmt.c	2011-11-29 21:39:12.943500000 +0000
@@ -50,6 +50,8 @@ static struct fmt_tests tests[] = {
 
 static char (*saved_key)[PLAINTEXT_LENGTH + 1];
 static int saved_key_length[MAX_KEYS_PER_CRYPT];
+#define setzero(var) memset(var, 0, sizeof(*var) * pFmt->params.max_keys_per_crypt)
+
 #ifdef PRECOMPUTE_CTX_FOR_SALT
 static SHA512_CTX ctx_salt;
 #else
@@ -60,7 +62,7 @@ static ARCH_WORD_32 crypt_out[MAX_KEYS_P
 static void init(struct fmt_main *pFmt)
 {
 	saved_key = mem_alloc_tiny(sizeof(*saved_key) * pFmt->params.max_keys_per_crypt, MEM_ALIGN_NONE);
-	memset(saved_key, 0, (sizeof(*saved_key) * pFmt->params.max_keys_per_crypt));
+	setzero(saved_key);
 }
 
 static int valid(char *ciphertext, struct fmt_main *pFmt)
diff -urpN 179-a/src/mskrb5_fmt_plug.c john-1.7.9-a/src/mskrb5_fmt_plug.c
--- 179-a/src/mskrb5_fmt_plug.c	2011-11-29 19:25:30.506000000 +0000
+++ john-1.7.9-a/src/mskrb5_fmt_plug.c	2011-11-29 21:26:30.943500000 +0000
@@ -97,6 +97,7 @@ static char (*saved_plain)[(PLAINTEXT_LE
 static int (*saved_len);
 static char (*output)[CRYPT_BINARY_SIZE];
 static HMACMD5Context (*saved_ctx);
+#define setzero(var) memset(var, 0, sizeof(*var) * fmt_mskrb5.params.max_keys_per_crypt)
 
 static int keys_prepared;
 static unsigned char *saltblob = NULL;
@@ -122,6 +123,10 @@ static void init(struct fmt_main *pFmt)
 	saved_len = mem_alloc_tiny(sizeof(*saved_len) * fmt_mskrb5.params.max_keys_per_crypt, MEM_ALIGN_WORD);
 	output = mem_alloc_tiny(sizeof(*output) * fmt_mskrb5.params.max_keys_per_crypt, MEM_ALIGN_WORD);
 	saved_ctx = mem_alloc_tiny(sizeof(*saved_ctx) * fmt_mskrb5.params.max_keys_per_crypt, MEM_ALIGN_WORD);
+	setzero(saved_plain);
+	setzero(saved_len);
+	setzero(output);
+	setzero(saved_ctx);
 
 	if (options.utf8) {
 		tests[1].plaintext = "\xC3\xBC"; // German u-umlaut in UTF-8
