diff -urpN john-1.7.8-jumbo-7b/src/dynamic_fmt.c john-1.7.8-jumbo-6b/src/dynamic_fmt.c
--- john-1.7.8-jumbo-7b/src/dynamic_fmt.c	2011-11-08 15:07:01.218750000 +0000
+++ john-1.7.8-jumbo-6b/src/dynamic_fmt.c	2011-11-08 15:07:16.468750000 +0000
@@ -547,6 +547,7 @@ typedef struct private_subformat_data
 
 	char dynamic_WHICH_TYPE_SIG[40];
 	// this 'will' be replaced, and will 'replace' FORMAT_NAME
+	int init;
 	int dynamic_FIXED_SALT_SIZE;
 	int dynamic_SALT_OFFSET;
 	int dynamic_HASH_OFFSET;
@@ -696,9 +697,11 @@ static void init(struct fmt_main *pFmt)
 	private_subformat_data *pPriv = pFmt->private.data;
 	int i;
 
-	if (!pPriv || !strcmp(curdat.dynamic_WHICH_TYPE_SIG, pPriv->dynamic_WHICH_TYPE_SIG))
+	if (!pPriv || (pPriv->init == 1 && !strcmp(curdat.dynamic_WHICH_TYPE_SIG, pPriv->dynamic_WHICH_TYPE_SIG)))
 		return;
 
+	pPriv->init = 1;
+
 	dynamic_RESET(pFmt);
 	if (!pPriv)
 		return;
@@ -717,6 +720,7 @@ static void init(struct fmt_main *pFmt)
 		pFmt->params.plaintext_length = pPriv->pSetup->MaxInputLen * 3; // we allow for 3 bytes of utf8 data to make up the number of plaintext_length unicode chars.
 	else
 		fmt_MD5gen.params.plaintext_length   = pFmt->params.plaintext_length;
+//	fprintf(stderr, "plaintext_length %u\n", pFmt->params.plaintext_length);
 	fmt_MD5gen.params.salt_size          = pFmt->params.salt_size;
 	if (pFmt->params.salt_size > 0)
 		++pFmt->params.salt_size;
@@ -6234,6 +6238,7 @@ int dynamic_SETUP(DYNAMIC_Setup *Setup,
 	curdat.nUserName = 0;
 	curdat.nPassCase = 1;
 	curdat.md5_startup_in_x86 = curdat.dynamic_use_sse = 0;  // if 0, then never use SSE2
+	curdat.init = 0;
 	curdat.pSetup = Setup;
 	pFmt->methods.binary = binary;
 	pFmt->methods.cmp_all=cmp_all;
