diff --git a/src/modules/Java/Makefile.in b/src/modules/Java/Makefile.in
index dcf7a6d5716a1daca396ad8e85c2ae2203c74d4c..9bfb8fc064c62da562de148200a0015e558c0c96 100644
--- a/src/modules/Java/Makefile.in
+++ b/src/modules/Java/Makefile.in
@@ -9,3 +9,5 @@ CONFIG_HEADERS=@CONFIG_HEADERS@
 @dynamic_module_makefile@
 
 @dependencies@
+
+jvm.o: ntdl.c
diff --git a/src/modules/Java/configure.in b/src/modules/Java/configure.in
index 4f2c14c29d83a36752a7b10d62650e2cc8600b99..679ae1f5027299ba69c76649c4aeaf7bea4a6bd7 100644
--- a/src/modules/Java/configure.in
+++ b/src/modules/Java/configure.in
@@ -464,7 +464,6 @@ if test "x$with_java" = xyes; then
 #include <setjmp.h>
 #endif
 #include <stdio.h>
-#define CONFIGURE
 #ifdef __NT__
 #include <windows.h>
 #include "ntdl.c"
diff --git a/src/modules/Java/jvm.c b/src/modules/Java/jvm.c
index 32fea522bbe160440fc6133405a995974edcadd1..8c7e1d9f4672493f66ae0624c9d889723517590b 100644
--- a/src/modules/Java/jvm.c
+++ b/src/modules/Java/jvm.c
@@ -3854,14 +3854,25 @@ PIKE_MODULE_INIT
 {
 #ifdef HAVE_JAVA
   struct svalue prog;
-  SET_SVAL_TYPE(prog, PIKE_T_PROGRAM);
-  SET_SVAL_SUBTYPE(prog, 0);
 
 #ifdef __NT__
-  if (open_nt_dll()<0)
+  switch(open_nt_dll()) {
+  case 0: break;
+  case -1:
+    yywarning("Failed to load JVM.\n");
+    return;
+  case -2:
+    yywarning("Failed to create JVM.\n");
+    return;
+  default:
+    yywarning("Failed to initialize the JVM library.\n");
     return;
+  }
 #endif /* __NT__ */
 
+  SET_SVAL_TYPE(prog, PIKE_T_PROGRAM);
+  SET_SVAL_SUBTYPE(prog, 0);
+
 #ifdef HAVE_IBMFINDDLL
   {
     /* Debug... */
diff --git a/src/modules/Java/ntdl.c b/src/modules/Java/ntdl.c
index b1b7931ca744f7a896ea47b71209c0f3f35472b3..ed8fe6f1c1a0e8b53355a747da6f84b8b07c947e 100644
--- a/src/modules/Java/ntdl.c
+++ b/src/modules/Java/ntdl.c
@@ -12,9 +12,6 @@
  */
 
 #include <tchar.h>
-#ifndef CONFIGURE
-#include "program.h"
-#endif
 
 #define JNI_CreateJavaVM createjavavm
 typedef jint (JNICALL *createjavavmtype)(JavaVM **, void **, void *);
@@ -23,50 +20,49 @@ static HINSTANCE jvmdll = NULL;
 
 static int open_nt_dll(void)
 {
-  LPTSTR libname=_T("jvm");
-  LPCTSTR keyname=_T("SOFTWARE\\JavaSoft\\Java Runtime Environment");
+  WCHAR buffer[2*MAX_PATH+32] = L"jvm";
+  WCHAR keyname[] = L"SOFTWARE\\JavaSoft\\Java Runtime Environment";
   HKEY key;
-  TCHAR buffer[2*MAX_PATH+32];
-  DWORD type, len = sizeof(buffer)-16;
+  WCHAR *libname = buffer;
+  DWORD type, len = sizeof(buffer)/2;
   DWORD l;
   HINSTANCE kernel;
-  DWORD (*getdlldir)(DWORD nBufferLength, LPTSTR lpBuffer);
-  BOOL (*setdlldir)(LPCTSTR lpPathname);
+  DWORD (WINAPI *getdlldir)(DWORD nBufferLength, WCHAR *lpBuffer) = NULL;
+  BOOL (WINAPI *setdlldir)(WCHAR *lpPathname) = NULL;
   
-  l = GetEnvironmentVariable("PIKE_JRE_JVMDLL", buffer, len);
+  l = GetEnvironmentVariableW(L"PIKE_JRE_JVMDLL", buffer, len);
   if (l > 0) {
-    libname = buffer;
     len = l;
   }
-  else if(RegOpenKeyEx(HKEY_CURRENT_USER, keyname, 0,
-                       KEY_READ, &key) == ERROR_SUCCESS ||
-          RegOpenKeyEx(HKEY_LOCAL_MACHINE, keyname, 0,
-                       KEY_READ, &key) == ERROR_SUCCESS) {
-    LPCTSTR subkeyname=_T("1.2");
+  else if(RegOpenKeyExW(HKEY_CURRENT_USER, keyname, 0,
+			KEY_READ, &key) == ERROR_SUCCESS ||
+          RegOpenKeyExW(HKEY_LOCAL_MACHINE, keyname, 0,
+			KEY_READ, &key) == ERROR_SUCCESS) {
+    WCHAR *subkeyname = L"1.2";
     HKEY subkey;
 
-    if(ERROR_SUCCESS == RegQueryValueEx(key, _T("CurrentVersion"), 0,
-					&type, buffer, &len) &&
-       type == REG_SZ)
+    if(ERROR_SUCCESS == RegQueryValueExW(key, L"CurrentVersion", 0,
+					 &type, buffer, &len) &&
+       type == REG_SZ) {
       subkeyname = buffer;
-    
-    if(RegOpenKeyEx(key, subkeyname, 0, KEY_READ, &subkey) ==
+    }
+
+    if(RegOpenKeyExW(key, subkeyname, 0, KEY_READ, &subkey) ==
        ERROR_SUCCESS) {
-      
+
       len = sizeof(buffer)-16;
 
-      if(ERROR_SUCCESS == RegQueryValueEx(subkey, _T("RuntimeLib"), 0,
-					  &type, buffer, &len))
+      if(ERROR_SUCCESS == RegQueryValueExW(subkey, L"RuntimeLib", 0,
+					   &type, buffer, &len))
 	switch(type) {
 	 case REG_SZ:
-	   libname = buffer;
+	   len /= sizeof(*buffer);
 	   break;
 	 case REG_EXPAND_SZ:
 	   {
-	     LPTSTR subbuffer = buffer+((len+1)/sizeof(TCHAR));
-	     l = ExpandEnvironmentStrings(buffer, subbuffer,
-					     sizeof(buffer)-len-2);
-	     if(l && l <= sizeof(buffer)-len-2) {
+	     WCHAR *subbuffer = buffer + MAX_PATH + 16;
+	     l = ExpandEnvironmentStringsW(buffer, subbuffer, MAX_PATH + 16);
+	     if(l && l <= MAX_PATH + 16) {
 	       libname = subbuffer;
 	       len = l;
 	     }
@@ -76,6 +72,8 @@ static int open_nt_dll(void)
       RegCloseKey(subkey);
     }
     RegCloseKey(key);
+  } else {
+    len = wcslen(buffer);
   }
 
   /* Java 6 and 7 jvm.dll have dependencies on msvcr71.dll and msvcr100.dll
@@ -87,9 +85,15 @@ static int open_nt_dll(void)
    * from the registry to "C:\Program Files\Java\jre\bin", and call
    * SetDllDirectory() with it.
    */
-  kernel = GetModuleHandle("kernel32");
-  getdlldir = (void *)GetProcAddress(kernel, "GetDllDirectoryA");
-  setdlldir = (void *)GetProcAddress(kernel, "SetDllDirectoryA");
+  kernel = GetModuleHandle(_T("kernel32"));
+  getdlldir = (void *)GetProcAddress(kernel, "GetDllDirectoryW");
+  setdlldir = (void *)GetProcAddress(kernel, "SetDllDirectoryW");
+
+  if (!setdlldir) {
+    /* Fallback to {Get,Set}CurrentDirectoryW(). */
+    getdlldir = GetCurrentDirectoryW;
+    setdlldir = SetCurrentDirectoryW;
+  }
 
   if (setdlldir) {
     int cnt = 0;
@@ -101,8 +105,8 @@ static int open_nt_dll(void)
       }
     }
     if (cnt == 2) {
-      TCHAR dlldirbuffer[2*MAX_PATH];
-      LPTSTR origdlldir = NULL;
+      WCHAR dlldirbuffer[MAX_PATH + 16];
+      WCHAR *origdlldir = NULL;
 
       libname[l] = 0;
 
@@ -114,7 +118,7 @@ static int open_nt_dll(void)
 	 *        directories from the dlldir load path if
 	 *        it has been used.
 	 */
-	if ((len = getdlldir(2*MAX_PATH, dlldirbuffer))) {
+	if ((len = getdlldir(MAX_PATH + 16, dlldirbuffer))) {
 	  dlldirbuffer[len] = 0;
 	  origdlldir = dlldirbuffer;
 	}
@@ -125,23 +129,20 @@ static int open_nt_dll(void)
       /* Restore the zapped diretory separator. */
       libname[l] = '\\';
 
-      jvmdll = LoadLibrary(libname);
+      jvmdll = LoadLibraryW(libname);
 
       /* Restore the original dlldir load path. */
       setdlldir(origdlldir);
     } else {
       /* Not enough directory levels. */
-      jvmdll = LoadLibrary(libname);
+      jvmdll = LoadLibraryW(libname);
     }
   } else {
     /* No SetDllDirectory(). */
-    jvmdll = LoadLibrary(libname);
+    jvmdll = LoadLibraryW(libname);
   }
 
   if (!jvmdll) {
-#ifndef CONFIGURE
-    yywarning("Failed to load JVM: '%s'\n", libname);
-#endif
     return -1;
   }
   else {
@@ -151,9 +152,6 @@ static int open_nt_dll(void)
     else {
       if(FreeLibrary(jvmdll))
 	jvmdll = NULL;
-#ifndef CONFIGURE
-      yywarning("Failed to create JVM.\n");
-#endif
       return -2;
     }
   }