diff --git a/src/modules/Java/configure.in b/src/modules/Java/configure.in
index 34f6193f12530fbdf09a1a018b1ca65143a132cc..6c1199dff8a9d33a55d4781c13c579e18ccf2027 100644
--- a/src/modules/Java/configure.in
+++ b/src/modules/Java/configure.in
@@ -68,16 +68,18 @@ if test "x$with_java" = xyes; then
     AC_MSG_WARN([If you are unsure, please unset \$THREADS_FLAG and rerun configure.])
   fi
 
+  changequote({,})dnl
   AC_MSG_CHECKING(for JAVA_HOME)
-  AC_CACHE_VAL(pike_cv_java_java_home, [
+  AC_CACHE_VAL(pike_cv_java_java_home, {{
     if test "x$JAVA_HOME" = x; then
       pike_cv_java_java_home=no
-      java_home_guess="`java -verbose 2>&1 | sed -n -e 's/^[[^/]]*//' -e 's:/lib/rt.jar .*$::' -e p -e q`"
+      java_home_guess="`java -verbose 2>&1 | sed -e 's:^\[[^]/]*\(/.*\)/[^/]*\.jar[] ].*$:\1:' -e t -e d | sed -e 's:/[Cc]lasses$::' -e 's:/lib$::' -e 1q`"
       for tmp_java_home in /usr/java /usr/local/java /usr/local/jdk* /usr/java*/jre /usr/local/java*/jre /usr/local/jdk*/jre /usr/local/jre* "$java_home_guess" "$pike_java_user_lib_directory"/..; do
         if test -d $tmp_java_home/.; then
           if ls "$tmp_java_home/lib/$pike_cv_java_arch/$pike_cv_java_threads_type"/libjvm* >/dev/null 2>&1 || \
 	    ls "$tmp_java_home/lib/$pike_cv_java_arch"/libjvm* >/dev/null 2>&1 || \
-	    ls "$tmp_java_home/lib/$pike_cv_java_arch"/classic/libjvm* >/dev/null 2>&1; then
+	    ls "$tmp_java_home/lib/$pike_cv_java_arch"/classic/libjvm* >/dev/null 2>&1 || \
+	    ls "$tmp_java_home/Libraries"/libjvm* >/dev/null 2>&1; then
 	      pike_cv_java_java_home="$tmp_java_home"
 	  else
 	    :
@@ -89,21 +91,26 @@ if test "x$with_java" = xyes; then
     else
       pike_cv_java_java_home="$JAVA_HOME"
     fi
-  ])
+  }})
   AC_MSG_RESULT($pike_cv_java_java_home)
+  changequote([,])dnl
 
   AC_MSG_CHECKING(for Java libraries)
   AC_CACHE_VAL(pike_cv_java_lib_dir, [
     pike_cv_java_lib_dir=""
     if test -z "$pike_java_user_lib_directory"; then
-      tmp_java_lib_dir="$pike_cv_java_java_home/lib"
+      if test -d "$pike_cv_java_java_home"/Libraries; then
+        tmp_java_lib_dir="$pike_cv_java_java_home"/Libraries
+      else
+        tmp_java_lib_dir="$pike_cv_java_java_home/lib"
+      fi
     else
       tmp_java_lib_dir="$pike_java_user_lib_directory"
     fi
     for i in "$pike_cv_java_arch/$pike_cv_java_threads_type" \
              "$pike_cv_java_arch/classic" "$pike_cv_java_arch" \
-	     "$pike_cv_java_arch/server" ; do
-      if test -d "$tmp_java_lib_dir/$i/." ; then
+	     "$pike_cv_java_arch/server" "."; do
+      if test -d "$tmp_java_lib_dir/$i/." && ls "$tmp_java_lib_dir/$i/"lib* >/dev/null 2>&1; then
         pike_cv_java_lib_dir="$pike_cv_java_lib_dir$tmp_java_lib_dir/$i "
       else
         :
@@ -127,7 +134,7 @@ if test "x$with_java" = xyes; then
   AC_MSG_CHECKING(for the Java include directory)
   AC_CACHE_VAL(pike_cv_java_include_dir, [
     pike_cv_java_include_dir=no
-    for tmp_java_incdir in /usr/java* /usr/local/java* /usr/local/jdk* /usr/local/jre* "$pike_cv_java_java_home"/.. "$pike_cv_java_java_home" "$pike_java_user_include_directory"; do
+    for tmp_java_incdir in /usr/java* /usr/local/java* /usr/local/jdk* /usr/local/jre* "$pike_cv_java_java_home"/../.. "$pike_cv_java_java_home"/.. "$pike_cv_java_java_home" "$pike_java_user_include_directory"; do
       if test -d $tmp_java_incdir/. -a -d $tmp_java_incdir/include/$pike_cv_java_sysos/.; then
         if ls "$tmp_java_incdir/include/jni.h" >/dev/null 2>&1 ; then
 	  pike_cv_java_include_dir="$tmp_java_incdir/include"
@@ -135,7 +142,15 @@ if test "x$with_java" = xyes; then
 	  :
 	fi
       else
-        :
+        if test -d $tmp_java_incdir/. -a -d $tmp_java_incdir/Headers/.; then
+          if ls "$tmp_java_incdir/Headers/jni.h" >/dev/null 2>&1 ; then
+	    pike_cv_java_include_dir="$tmp_java_incdir/Headers"
+	  else
+	    :
+	  fi
+        else
+          :
+	fi
       fi
     done
   ])