diff -urpN john-1.7.8-jumbo-6-RC3/doc/ENCODINGS john-1.7.8/doc/ENCODINGS
--- john-1.7.8-jumbo-6-RC3/doc/ENCODINGS	2011-09-14 17:11:18 +0000
+++ john-1.7.8/doc/ENCODINGS	2011-09-20 21:40:58 +0000
@@ -4,8 +4,8 @@ UTF-8" (or CP1252 etc). It does NOT mean
 encoded wordlist when cracking LM. It DOES make John recognise vowels, lower
 or upper case characters, etc. when specifying a codepage.
 
-Currently supported encodings: utf-8, iso-8859-1 (or ansi), koi8-r, cp1251,
-cp866, cp1252, iso-8859-15, cp437, cp850, cp858 and cp737. New encodings can
+Currently supported encodings: utf-8, iso-8859-1 (or ansi), iso-8859-15,
+koi8-r, cp437, cp737, cp850, cp858, cp866, cp1251 and cp1252. New encodings can
 be added with ease, using automated tools that rely on the Unicode Database.
 
 
@@ -24,7 +24,12 @@ The behaviour is a little different depe
    made from. But you should still tell John about it so it can handle national
    characters properly.
 
-You can convert from/to a large number of formats, see iconv(1) man page.
+You can convert your wordlists from/to a large number of formats, using for
+example iconv(1). It may be a good idea to include the encoding in the filename,
+eg. "greek.8859-7.dict" or "rockyou.utf8.lst".
+
+You can also convert on the fly, example:
+$ iconv < greek.8859-7.dict -f iso-8859-7 -t cp737 | ./john -pipe -enc:cp737 ...
 
 The traditional behavior, and what is still happening if you don't specify an
 encoding, is that John will assume ISO-8859-1 when converting plaintexts or
diff -urpN john-1.7.8-jumbo-6-RC3/src/DES_bs.c john-1.7.8/src/DES_bs.c
--- john-1.7.8-jumbo-6-RC3/src/DES_bs.c	2011-09-14 17:11:18 +0000
+++ john-1.7.8/src/DES_bs.c	2011-09-20 20:25:02 +0000
@@ -114,7 +114,14 @@ void DES_bs_init(int LM)
 
 	if (LM) {
 		for (c = 0; c < 0x100; c++)
+#ifdef BENCH_BUILD
+		if (c >= 'a' && c <= 'z')
+			DES_bs_all.E.extras.u[c] = c & ~0x20;
+		else
+			DES_bs_all.E.extras.u[c] = c;
+#else
 			DES_bs_all.E.extras.u[c] = CP_up[c];
+#endif
 	}
 
 #if DES_BS_ASM
diff -urpN john-1.7.8-jumbo-6-RC3/src/Makefile john-1.7.8/src/Makefile
--- john-1.7.8-jumbo-6-RC3/src/Makefile	2011-09-20 16:17:15 +0000
+++ john-1.7.8/src/Makefile	2011-09-20 21:41:47 +0000
@@ -64,6 +64,7 @@ JOHN_OBJS = \
 	md4.o \
 	md5_gen_fmt.o md5_gen_parser.o md5_gen_preloads.o md5_gen_utils.o \
 	rawSHA224_fmt.o rawSHA256_fmt.o rawSHA384_fmt.o rawSHA512_fmt.o \
+	XSHA512_fmt.o \
 	hmailserver_fmt.o \
 	SybaseASE_fmt.o \
 	SKEY_fmt.o \
@@ -103,10 +104,10 @@ BENCH_BF_OBJS_DEPEND = \
 BENCH_OBJS = \
     $(MPIOBJ) \
 	$(BENCH_DES_OBJS_DEPEND) \
-	DES_bs.o $(BENCH_DES_BS_OBJS_DEPEND) \
+	DES_bsg.o $(BENCH_DES_BS_OBJS_DEPEND) \
 	$(BENCH_MD5_OBJS_DEPEND) \
 	$(BENCH_BF_OBJS_DEPEND) \
-	bench-t.o best.o common.o config.o formats.o math.o memory.o miscnl.o \
+	bench-t.o best.o common.o config_g.o formats.o math.o memory.o miscnl.o \
 	params.o path.o signals.o tty.o
 
 GENMKVPWD_OBJS = \
@@ -1221,6 +1222,14 @@ john.com: john.asm
 DES_bs_b.o: DES_bs_b.c sboxes.c nonstd.c sboxes-s.c
 	$(CC) $(CFLAGS) $(OPT_INLINE) DES_bs_b.c
 
+# This is for the BENCH build (to not depend upon unicode.o)
+DES_bsg.o: DES_bs.c
+	$(CC) $(CFLAGS) -DBENCH_BUILD DES_bs.c -o DES_bsg.o
+	
+# This is for the BENCH build (to not depend upon unicode.o)
+config_g.o: config.c
+	$(CC) $(CFLAGS) -DBENCH_BUILD config.c -o config_g.o
+
 miscnl.o: misc.c
 	$(CC) $(CFLAGS) $(OPT_NORMAL) -D_JOHN_MISC_NO_LOG misc.c -o miscnl.o
 
diff -urpN john-1.7.8-jumbo-6-RC3/src/XSHA512_fmt.c john-1.7.8/src/XSHA512_fmt.c
--- john-1.7.8-jumbo-6-RC3/src/XSHA512_fmt.c	1970-01-01 00:00:00 +0000
+++ john-1.7.8/src/XSHA512_fmt.c	2011-09-20 21:59:23 +0000
@@ -0,0 +1,286 @@
+/*
+ * This file is part of John the Ripper password cracker,
+ * Copyright (c) 2008,2011 by Solar Designer
+ */
+
+#include <openssl/opensslv.h>
+#if OPENSSL_VERSION_NUMBER >= 0x00908000
+
+#include <string.h>
+#include <openssl/sha.h>
+
+#include "arch.h"
+#include "params.h"
+#include "common.h"
+#include "formats.h"
+
+#define FORMAT_LABEL			"xsha512"
+#define FORMAT_NAME			"Mac OS X 10.7+ salted SHA-512"
+#define ALGORITHM_NAME			"64/" ARCH_BITS_STR
+
+#define BENCHMARK_COMMENT		""
+#define BENCHMARK_LENGTH		0
+
+#define PLAINTEXT_LENGTH		107
+#define CIPHERTEXT_LENGTH		136
+
+#define BINARY_SIZE			64
+#define SALT_SIZE			4
+
+#define MIN_KEYS_PER_CRYPT		1
+#ifdef _OPENMP
+#define MAX_KEYS_PER_CRYPT		(0x200 * 3)
+#else
+#define MAX_KEYS_PER_CRYPT		0x100
+#endif
+
+#if ARCH_BITS >= 64
+/* 64-bitness happens to correlate with faster memcpy() */
+#define PRECOMPUTE_CTX_FOR_SALT
+#else
+#undef PRECOMPUTE_CTX_FOR_SALT
+#endif
+
+static struct fmt_tests tests[] = {
+	{"bb0489df7b073e715f19f83fd52d08ede24243554450f7159dd65c100298a5820525b55320f48182491b72b4c4ba50d7b0e281c1d98e06591a5e9c6167f42a742f0359c7", "password"},
+	{"74911f723bd2f66a3255e0af4b85c639776d510b63f0b939c432ab6e082286c47586f19b4e2f3aab74229ae124ccb11e916a7a1c9b29c64bd6b0fd6cbd22e7b1f0ba1673", "hello"},
+	{"5e3ab14c8bd0f210eddafbe3c57c0003147d376bf4caf75dbffa65d1891e39b82c383d19da392d3fcc64ea16bf8203b1fc3f2b14ab82c095141bb6643de507e18ebe7489", "boobies"},
+	{NULL}
+};
+
+static char saved_key[MAX_KEYS_PER_CRYPT][PLAINTEXT_LENGTH + 1];
+static int saved_key_length[MAX_KEYS_PER_CRYPT];
+#ifdef PRECOMPUTE_CTX_FOR_SALT
+static SHA512_CTX ctx_salt;
+#else
+static ARCH_WORD_32 saved_salt;
+#endif
+static ARCH_WORD_32 crypt_out[MAX_KEYS_PER_CRYPT][16];
+
+static int valid(char *ciphertext, struct fmt_main *pFmt)
+{
+	char *pos;
+
+	/* Require lowercase hex digits (assume ASCII) */
+	pos = ciphertext;
+	while (atoi16[ARCH_INDEX(*pos)] != 0x7F && (*pos <= '9' || *pos >= 'a'))
+		pos++;
+	return !*pos && pos - ciphertext == CIPHERTEXT_LENGTH;
+}
+
+static void *get_binary(char *ciphertext)
+{
+	static unsigned char out[BINARY_SIZE];
+	char *p;
+	int i;
+
+	p = ciphertext + 8;
+	for (i = 0; i < sizeof(out); i++) {
+		out[i] =
+		    (atoi16[ARCH_INDEX(*p)] << 4) |
+		    atoi16[ARCH_INDEX(p[1])];
+		p += 2;
+	}
+
+	return out;
+}
+
+static void *salt(char *ciphertext)
+{
+	static unsigned char out[SALT_SIZE];
+	char *p;
+	int i;
+
+	p = ciphertext;
+	for (i = 0; i < sizeof(out); i++) {
+		out[i] =
+		    (atoi16[ARCH_INDEX(*p)] << 4) |
+		    atoi16[ARCH_INDEX(p[1])];
+		p += 2;
+	}
+
+	return out;
+}
+
+static int binary_hash_0(void *binary)
+{
+	return *(ARCH_WORD_32 *)binary & 0xF;
+}
+
+static int binary_hash_1(void *binary)
+{
+	return *(ARCH_WORD_32 *)binary & 0xFF;
+}
+
+static int binary_hash_2(void *binary)
+{
+	return *(ARCH_WORD_32 *)binary & 0xFFF;
+}
+
+static int binary_hash_3(void *binary)
+{
+	return *(ARCH_WORD_32 *)binary & 0xFFFF;
+}
+
+static int binary_hash_4(void *binary)
+{
+	return *(ARCH_WORD_32 *)binary & 0xFFFFF;
+}
+
+static int get_hash_0(int index)
+{
+	return crypt_out[index][0] & 0xF;
+}
+
+static int get_hash_1(int index)
+{
+	return crypt_out[index][0] & 0xFF;
+}
+
+static int get_hash_2(int index)
+{
+	return crypt_out[index][0] & 0xFFF;
+}
+
+static int get_hash_3(int index)
+{
+	return crypt_out[index][0] & 0xFFFF;
+}
+
+static int get_hash_4(int index)
+{
+	return crypt_out[index][0] & 0xFFFFF;
+}
+
+static int salt_hash(void *salt)
+{
+	return *(ARCH_WORD_32 *)salt & 0x3FF;
+}
+
+static void set_salt(void *salt)
+{
+#ifdef PRECOMPUTE_CTX_FOR_SALT
+	SHA512_Init(&ctx_salt);
+	SHA512_Update(&ctx_salt, salt, SALT_SIZE);
+#else
+	saved_salt = *(ARCH_WORD_32 *)salt;
+#endif
+}
+
+static void set_key(char *key, int index)
+{
+	int length = strlen(key);
+	if (length > PLAINTEXT_LENGTH)
+		length = PLAINTEXT_LENGTH;
+	saved_key_length[index] = length;
+	memcpy(saved_key[index], key, length);
+}
+
+static char *get_key(int index)
+{
+	saved_key[index][saved_key_length[index]] = 0;
+	return saved_key[index];
+}
+
+static void crypt_all(int count)
+{
+	int i;
+
+#ifdef _OPENMP
+#ifdef PRECOMPUTE_CTX_FOR_SALT
+#pragma omp parallel for default(none) private(i) shared(ctx_salt, count, saved_key, saved_key_length, crypt_out)
+#else
+#pragma omp parallel for default(none) private(i) shared(saved_salt, count, saved_key, saved_key_length, crypt_out)
+#endif
+#endif
+	for (i = 0; i < count; i++) {
+		SHA512_CTX ctx;
+
+#ifdef PRECOMPUTE_CTX_FOR_SALT
+		memcpy(&ctx, &ctx_salt, sizeof(ctx));
+#else
+		SHA512_Init(&ctx);
+		SHA512_Update(&ctx, &saved_salt, SALT_SIZE);
+#endif
+
+		SHA512_Update(&ctx, saved_key[i], saved_key_length[i]);
+		SHA512_Final((unsigned char *)(crypt_out[i]), &ctx);
+	}
+}
+
+static int cmp_all(void *binary, int count)
+{
+	ARCH_WORD_32 b0 = *(ARCH_WORD_32 *)binary;
+	int i;
+
+	for (i = 0; i < count; i++) {
+		if (b0 != crypt_out[i][0])
+			continue;
+		if (!memcmp(binary, crypt_out[i], BINARY_SIZE))
+			return 1;
+	}
+	return 0;
+}
+
+static int cmp_one(void *binary, int index)
+{
+	return !memcmp(binary, crypt_out[index], BINARY_SIZE);
+}
+
+static int cmp_exact(char *source, int index)
+{
+	return 1;
+}
+
+struct fmt_main fmt_XSHA512 = {
+	{
+		FORMAT_LABEL,
+		FORMAT_NAME,
+		ALGORITHM_NAME,
+		BENCHMARK_COMMENT,
+		BENCHMARK_LENGTH,
+		PLAINTEXT_LENGTH,
+		BINARY_SIZE,
+		SALT_SIZE,
+		MIN_KEYS_PER_CRYPT,
+		MAX_KEYS_PER_CRYPT,
+		FMT_CASE | FMT_8_BIT | FMT_OMP,
+		tests
+	}, {
+		fmt_default_init,
+		fmt_default_prepare,
+		valid,
+		fmt_default_split,
+		get_binary,
+		salt,
+		{
+			binary_hash_0,
+			binary_hash_1,
+			binary_hash_2,
+			binary_hash_3,
+			binary_hash_4
+		},
+		salt_hash,
+		set_salt,
+		set_key,
+		get_key,
+		fmt_default_clear_keys,
+		crypt_all,
+		{
+			get_hash_0,
+			get_hash_1,
+			get_hash_2,
+			get_hash_3,
+			get_hash_4
+		},
+		cmp_all,
+		cmp_one,
+		cmp_exact
+	}
+};
+
+#else
+#ifdef __GNUC__
+#warning Note: Mac OS X Lion format disabled - it needs OpenSSL 0.9.8 or above
+#endif
+#endif
diff -urpN john-1.7.8-jumbo-6-RC3/src/XSHA_fmt_plug.c john-1.7.8/src/XSHA_fmt_plug.c
--- john-1.7.8-jumbo-6-RC3/src/XSHA_fmt_plug.c	2011-09-20 17:42:47 +0000
+++ john-1.7.8/src/XSHA_fmt_plug.c	2011-09-20 19:45:22 +0000
@@ -1,6 +1,6 @@
 /*
  * This file is part of John the Ripper password cracker,
- * Copyright (c) 2008 by Solar Designer
+ * Copyright (c) 2008,2011 by Solar Designer
  */
 
 #include <string.h>
@@ -25,7 +25,11 @@
 #define SALT_SIZE			4
 
 #define MIN_KEYS_PER_CRYPT		1
-#define MAX_KEYS_PER_CRYPT		1
+#ifdef _OPENMP
+#define MAX_KEYS_PER_CRYPT		(0x200 * 3)
+#else
+#define MAX_KEYS_PER_CRYPT		0x100
+#endif
 
 static struct fmt_tests tests[] = {
 	{"12345678F9083C7F66F46A0A102E4CC17EC08C8AF120571B", "abc"},
@@ -37,11 +41,10 @@ static struct fmt_tests tests[] = {
 	{NULL}
 };
 
-static char saved_key[PLAINTEXT_LENGTH + 1];
-static int saved_key_length;
-static ARCH_WORD_32 saved_salt;
-static SHA_CTX ctx;
-static ARCH_WORD_32 crypt_out[5];
+static char saved_key[MAX_KEYS_PER_CRYPT][PLAINTEXT_LENGTH + 1];
+static int saved_key_length[MAX_KEYS_PER_CRYPT];
+static SHA_CTX ctx_salt;
+static ARCH_WORD_32 crypt_out[MAX_KEYS_PER_CRYPT][5];
 
 static int valid(char *ciphertext, struct fmt_main *pFmt)
 {
@@ -115,27 +118,27 @@ static int binary_hash_4(void *binary)
 
 static int get_hash_0(int index)
 {
-	return crypt_out[0] & 0xF;
+	return crypt_out[index][0] & 0xF;
 }
 
 static int get_hash_1(int index)
 {
-	return crypt_out[0] & 0xFF;
+	return crypt_out[index][0] & 0xFF;
 }
 
 static int get_hash_2(int index)
 {
-	return crypt_out[0] & 0xFFF;
+	return crypt_out[index][0] & 0xFFF;
 }
 
 static int get_hash_3(int index)
 {
-	return crypt_out[0] & 0xFFFF;
+	return crypt_out[index][0] & 0xFFFF;
 }
 
 static int get_hash_4(int index)
 {
-	return crypt_out[0] & 0xFFFFF;
+	return crypt_out[index][0] & 0xFFFFF;
 }
 
 static int salt_hash(void *salt)
@@ -145,34 +148,59 @@ static int salt_hash(void *salt)
 
 static void set_salt(void *salt)
 {
-	saved_salt = *(ARCH_WORD_32 *)salt;
+	SHA1_Init(&ctx_salt);
+	SHA1_Update(&ctx_salt, salt, SALT_SIZE);
 }
 
 static void set_key(char *key, int index)
 {
-	saved_key_length = strlen(key);
-	if (saved_key_length > PLAINTEXT_LENGTH)
-		saved_key_length = PLAINTEXT_LENGTH;
-	memcpy(saved_key, key, saved_key_length);
+	int length = strlen(key);
+	if (length > PLAINTEXT_LENGTH)
+		length = PLAINTEXT_LENGTH;
+	saved_key_length[index] = length;
+	memcpy(saved_key[index], key, length);
 }
 
 static char *get_key(int index)
 {
-	saved_key[saved_key_length] = 0;
-	return saved_key;
+	saved_key[index][saved_key_length[index]] = 0;
+	return saved_key[index];
 }
 
 static void crypt_all(int count)
 {
-	SHA1_Init(&ctx);
-	SHA1_Update(&ctx, &saved_salt, SALT_SIZE);
-	SHA1_Update(&ctx, saved_key, saved_key_length);
-	SHA1_Final((unsigned char *)crypt_out, &ctx);
+	int i;
+
+#ifdef _OPENMP
+#pragma omp parallel for default(none) private(i) shared(ctx_salt, count, saved_key, saved_key_length, crypt_out)
+#endif
+	for (i = 0; i < count; i++) {
+		SHA_CTX ctx;
+
+		memcpy(&ctx, &ctx_salt, sizeof(ctx));
+
+		SHA1_Update(&ctx, saved_key[i], saved_key_length[i]);
+		SHA1_Final((unsigned char *)(crypt_out[i]), &ctx);
+	}
 }
 
 static int cmp_all(void *binary, int count)
 {
-	return !memcmp(binary, crypt_out, BINARY_SIZE);
+	ARCH_WORD_32 b0 = *(ARCH_WORD_32 *)binary;
+	int i;
+
+	for (i = 0; i < count; i++) {
+		if (b0 != crypt_out[i][0])
+			continue;
+		if (!memcmp(binary, crypt_out[i], BINARY_SIZE))
+			return 1;
+	}
+	return 0;
+}
+
+static int cmp_one(void *binary, int index)
+{
+	return !memcmp(binary, crypt_out[index], BINARY_SIZE);
 }
 
 static int cmp_exact(char *source, int index)
@@ -192,7 +220,7 @@ struct fmt_main fmt_XSHA = {
 		SALT_SIZE,
 		MIN_KEYS_PER_CRYPT,
 		MAX_KEYS_PER_CRYPT,
-		FMT_CASE | FMT_8_BIT,
+		FMT_CASE | FMT_8_BIT | FMT_OMP,
 		tests
 	}, {
 		fmt_default_init,
@@ -222,7 +250,7 @@ struct fmt_main fmt_XSHA = {
 			get_hash_4
 		},
 		cmp_all,
-		cmp_all,
+		cmp_one,
 		cmp_exact
 	}
 };
diff -urpN john-1.7.8-jumbo-6-RC3/src/config.c john-1.7.8/src/config.c
--- john-1.7.8-jumbo-6-RC3/src/config.c	2011-09-20 15:51:04 +0000
+++ john-1.7.8/src/config.c	2011-09-20 20:25:02 +0000
@@ -259,26 +259,34 @@ static int cfg_process_directive_include
 	char Section[256];
 	if (!p2) {
 		fprintf(stderr, "ERROR, invalid config include line:  %s\n", line);
+#ifndef BENCH_BUILD
 		log_event ("! Error, invalid config include line:  %s", line);
+#endif
 		return 1;
 	}
 	if (!cfg_database || !cfg_database->name) {
 		fprintf(stderr, "ERROR, invalid section include, when not in a section:  %s\n", line);
+#ifndef BENCH_BUILD
 		log_event ("! ERROR, invalid section include, when not in a section:  %s", line);
+#endif
 		return 1;
 	}
 	*p2 = 0;
 	strlwr(p);
 	if (!strcmp(cfg_database->name, p)) {
 		fprintf(stderr, "ERROR, invalid to load the current section (recursive):  %s\n", line);
+#ifndef BENCH_BUILD
 		log_event ("! ERROR, invalid to load the current section (recursive):  %s", line);
+#endif
 		return 1;
 	}
 	p = strtok(p, ":");
 	p2 = strtok(NULL, "");
 	if (!p || !p2) {
 		fprintf(stderr, "ERROR, invalid .include line, can not find this section:  %s\n", line);
+#ifndef BENCH_BUILD
 		log_event("! ERROR, invalid .include line, can not find this section:  %s", line);
+#endif
 		return 1;
 	}
 	*Section = ':';
@@ -302,7 +310,9 @@ static int cfg_process_directive_include
 		}
 	}
 	fprintf(stderr, "ERROR, could not find include section:  %s%s]\n", line, Section);
+#ifndef BENCH_BUILD
 	log_event("! ERROR, could not find include section:  %s%s]", line, Section);
+#endif
 	return 1;
 }
 
@@ -317,7 +327,9 @@ static int cfg_process_directive_include
 		p2 = strchr(&p[1], '\"');
 		if (!p2) {
 			fprintf(stderr, "ERROR, invalid config include line:  %s\n", line);
+#ifndef BENCH_BUILD
 			log_event("! ERROR, invalid config include line:  %s", line);
+#endif
 			return 1;
 		}
 		*p2 = 0;
@@ -328,7 +340,9 @@ static int cfg_process_directive_include
 		p2 = strchr(&p[1], '>');
 		if (!p2) {
 			fprintf(stderr, "ERROR, invalid config include line:  %s\n", line);
+#ifndef BENCH_BUILD
 			log_event("! ERROR, invalid config include line:  %s", line);
+#endif
 			return 1;
 		}
 		*p2 = 0;
@@ -337,7 +351,9 @@ static int cfg_process_directive_include
 	}
 	if (cfg_recursion == 6) {
 		fprintf(stderr, "ERROR, .include recursion too deep in john.ini processing file .include \"%s\"\n", p);
+#ifndef BENCH_BUILD
 		log_event("! ERROR, .include recursion too deep in john.ini processing file .include \"%s\"", p);
+#endif
 		return 1;
 	}
 	saved_fname = cfg_name;
@@ -356,6 +372,8 @@ static int cfg_process_directive(char *l
 	if (!strncmp(line, ".include [", 10))
 		return cfg_process_directive_include_section(line, number);
 	fprintf (stderr, "Unknown directive in the .conf file:  '%s'\n", line);
+#ifndef BENCH_BUILD
 	log_event("! Unknown directive in the .conf file:  %s", line);
+#endif
 	return 1;
 }
diff -urpN john-1.7.8-jumbo-6-RC3/src/john.c john-1.7.8/src/john.c
--- john-1.7.8-jumbo-6-RC3/src/john.c	2011-09-20 16:44:45 +0000
+++ john-1.7.8/src/john.c	2011-09-20 21:44:26 +0000
@@ -71,6 +71,8 @@ extern struct fmt_main fmt_rawSHA256;
 extern struct fmt_main fmt_rawSHA384;
 extern struct fmt_main fmt_rawSHA512;
 
+extern struct fmt_main fmt_XSHA512;
+
 extern struct fmt_main fmt_hmailserver;
 extern struct fmt_main fmt_SybaseASE;
 #endif
@@ -140,6 +142,8 @@ static void john_register_all(void)
 	john_register_one(&fmt_rawSHA384);
 	john_register_one(&fmt_rawSHA512);
 
+	john_register_one(&fmt_XSHA512);
+
 	john_register_one(&fmt_hmailserver);
 	john_register_one(&fmt_SybaseASE);
 #endif
@@ -159,10 +163,12 @@ static void john_register_all(void)
 
 	john_register_one(&fmt_dummy);
 
+#ifdef HAVE_DL
 	if (options.fmt_dlls)
 	register_dlls ( options.fmt_dlls,
 		cfg_get_param(SECTION_OPTIONS, NULL, "plugin"),
 		john_register_one );
+#endif
 
 	if (!fmt_list) {
 #ifdef HAVE_MPI
diff -urpN john-1.7.8-jumbo-6-RC3/src/loader.c john-1.7.8/src/loader.c
--- john-1.7.8-jumbo-6-RC3/src/loader.c	2011-09-14 17:11:19 +0000
+++ john-1.7.8/src/loader.c	2011-09-20 20:42:12 +0000
@@ -5,6 +5,8 @@
  * ...with heavy changes in the jumbo patch, by various authors
  */
 
+#define LDR_WARN_AMBIGUOUS
+
 #include <stdio.h>
 #include <sys/stat.h>
 #ifndef _MSC_VER
diff -urpN john-1.7.8-jumbo-6-RC3/src/md5_gen_fmt.c john-1.7.8/src/md5_gen_fmt.c
--- john-1.7.8-jumbo-6-RC3/src/md5_gen_fmt.c	2011-09-20 17:10:21 +0000
+++ john-1.7.8/src/md5_gen_fmt.c	2011-09-20 21:41:01 +0000
@@ -549,6 +549,7 @@ typedef struct private_subformat_data
 	int md5_gen_HASH_OFFSET;
 	MD5_GEN_primitive_funcp *md5_gen_FUNCTIONS;
 	MD5_GEN_Setup *pSetup;
+	int init;
 
 } private_subformat_data;
 
@@ -737,11 +738,15 @@ static void init(struct fmt_main *pFmt)
 	private_subformat_data *pPriv = pFmt->private.data;
 	int i;
 
-	md5_gen_RESET(pFmt);
+	if (pPriv && pPriv->init)
+		return;
 
+	md5_gen_RESET(pFmt);
 	if (!pPriv)
 		return;
 
+	pPriv->init = 1;
+
 	memcpy(&curdat, pPriv, sizeof(private_subformat_data));
 	md5_gen_use_sse = curdat.md5_gen_use_sse;
 	force_md5_ctx = curdat.force_md5_ctx;
@@ -6145,6 +6150,7 @@ int md5_gen_SETUP(MD5_GEN_Setup *Setup, 
 	curdat.nPassCase = 1;
 	curdat.md5_startup_in_x86 = curdat.md5_gen_use_sse = 0;  // if 0, then never use SSE2
 	curdat.pSetup = Setup;
+	curdat.init = 0;
 	pFmt->methods.binary = binary;
 	pFmt->methods.cmp_all=cmp_all;
 	pFmt->methods.cmp_one=cmp_one;
diff -urpN john-1.7.8-jumbo-6-RC3/src/md5_gen_preloads.c john-1.7.8/src/md5_gen_preloads.c
--- john-1.7.8-jumbo-6-RC3/src/md5_gen_preloads.c	2011-09-20 17:10:21 +0000
+++ john-1.7.8/src/md5_gen_preloads.c	2011-09-20 21:41:01 +0000
@@ -797,7 +797,7 @@ static MD5_GEN_Setup Setups[] =
 #if defined (MMX_COEF)
 	{ " md5_gen(29): md5(unicode($p))",             _Funcs_29,_Preloads_29,_ConstDefault, MGF_UTF8, MGF_NO_FLAG, 0, 27 } // if we are in utf8 mode, we triple this in the init() call
 #else
-	{ " md5_gen(29): md5(unicode($p))",             _Funcs_29,_Preloads_29,_ConstDefault, MGF_UTF8, MGF_NO_FLAG, 0, 50 } // if we are in utf8 mode, we triple this in the init() call
+	{ " md5_gen(29): md5(unicode($p))",             _Funcs_29,_Preloads_29,_ConstDefault, MGF_UTF8, MGF_NO_FLAG, 0, 40 } // if we are in utf8 mode, we triple this in the init() call
 #endif
 };
 
diff -urpN john-1.7.8-jumbo-6-RC3/src/oracle_fmt_plug.c john-1.7.8/src/oracle_fmt_plug.c
--- john-1.7.8-jumbo-6-RC3/src/oracle_fmt_plug.c	2011-09-20 15:56:08 +0000
+++ john-1.7.8/src/oracle_fmt_plug.c	2011-09-20 21:41:01 +0000
@@ -180,7 +180,10 @@ static void oracle_set_salt(void *salt) 
 
 static void oracle_set_key(char *key, int index) {
 	UTF16 cur_key_mixedcase[PLAINTEXT_LENGTH+1];
-
+#if ARCH_LITTLE_ENDIAN
+	UTF16 *c;
+#endif
+	
 	plain_key = key;
 	// Can't use enc_to_utf16_be() because we need to do utf16_uc later
 	key_length = enc_to_utf16((UTF16 *)cur_key_mixedcase, PLAINTEXT_LENGTH, (unsigned char*)key, strlen(key));
@@ -197,7 +200,7 @@ static void oracle_set_key(char *key, in
 
 	// This must be byte-swapped on LE systems only (odd!?)
 #if ARCH_LITTLE_ENDIAN
-	UTF16 *c = cur_key;
+	c = cur_key;
 	while((*c = *c << 8 | *c >> 8))
 		c++;
 #endif
diff -urpN john-1.7.8-jumbo-6-RC3/src/params.h john-1.7.8/src/params.h
--- john-1.7.8-jumbo-6-RC3/src/params.h	2011-09-20 15:50:11 +0000
+++ john-1.7.8/src/params.h	2011-09-20 22:00:51 +0000
@@ -17,7 +17,7 @@
 /*
  * John's version number.
  */
-#define JOHN_VERSION			"1.7.8-jumbo-6-RC3"
+#define JOHN_VERSION			"1.7.8-jumbo-6-RC5"
 
 /*
  * Notes to packagers of John for *BSD "ports", Linux distributions, etc.:
diff -urpN john-1.7.8-jumbo-6-RC3/src/plugin.h john-1.7.8/src/plugin.h
--- john-1.7.8-jumbo-6-RC3/src/plugin.h	2011-09-20 16:28:40 +0000
+++ john-1.7.8/src/plugin.h	2011-09-20 19:23:53 +0000
@@ -16,10 +16,6 @@ register_dlls(
 	char *config_param,
 	format_register register_one);
 
-#else
-
-#define register_dlls(a, b, c)
-
 #endif
 
 #endif
