diff -r 5a2dcfce47de src/org/armedbear/lisp/Debug.java
--- a/src/org/armedbear/lisp/Debug.java	Thu Mar 11 09:36:33 2010 +0100
+++ b/src/org/armedbear/lisp/Debug.java	Thu Mar 11 11:18:30 2010 +0100
@@ -41,8 +41,9 @@
     public static final void assertTrue(boolean b)
     {
         if (!b) {
-            System.err.println("Assertion failed!");
-            Error e = new Error();
+            String msg = "ABCL Debug.assertTrue() assertion failed!";
+            System.err.println(msg);
+            Error e = new Error(msg);
             e.printStackTrace();
             throw e;
         }
diff -r 5a2dcfce47de src/org/armedbear/lisp/Load.java
--- a/src/org/armedbear/lisp/Load.java	Thu Mar 11 09:36:33 2010 +0100
+++ b/src/org/armedbear/lisp/Load.java	Thu Mar 11 11:18:30 2010 +0100
@@ -252,12 +252,19 @@
         Pathname pathname = null;
         Pathname truename = null;
         pathname = new Pathname(filename);
-        Pathname mergedPathname = Pathname.mergePathnames(pathname, Site.getLispHome());
+        LispObject bootPath = Site.getLispHome();
+        Pathname mergedPathname;
+        if (bootPath instanceof Pathname) {
+            mergedPathname = Pathname.mergePathnames(pathname, (Pathname)bootPath);
+        } else {
+            mergedPathname = pathname;
+        }
+        URL url = null;
         truename = findLoadableFile(mergedPathname);
-        if (truename == null || truename.equals(NIL)) {
+        if (truename == null || truename.equals(NIL) || bootPath.equals(NIL)) {
             // Make an attempt to use the boot classpath
             String path = pathname.asEntryPath();
-            URL url = Lisp.class.getResource(path);
+            url = Lisp.class.getResource(path);
             if (url == null || url.toString().endsWith("/")) {
                 url = Lisp.class.getResource(path + ".abcl");
                 if (url == null) {
@@ -269,16 +276,21 @@
                                            + "'" + path + "'"
                                            + " in boot classpath."));
             }                
-            Pathname urlPathname = new Pathname(url);
-            truename = findLoadableFile(urlPathname);
-            if (truename == null) {
-                return error(new LispError("Failed to find loadable system file in boot classpath "
-                                           + "'" + url + "'"));
+            if (!bootPath.equals(NIL)) {
+                Pathname urlPathname = new Pathname(url);
+                truename = findLoadableFile(urlPathname);
+                if (truename == null) {
+                    return error(new LispError("Failed to find loadable system file in boot classpath "
+                                               + "'" + url + "'"));
+                }
+            } else {
+                truename = null; // We can't represent the FASL in a Pathname (q.v. OSGi)
             }
         }
 
         // Look for a init FASL inside a packed FASL
-        if (truename.type.writeToString().equals(COMPILE_FILE_TYPE) && Utilities.checkZipFile(truename))  {
+        if (truename != null
+            && truename.type.writeToString().equals(COMPILE_FILE_TYPE) && Utilities.checkZipFile(truename))  {
             Pathname init = new Pathname(truename.getNamestring());
             init.type = COMPILE_FILE_INIT_FASL_TYPE;
             LispObject t = Pathname.truename(init);
@@ -290,7 +302,19 @@
             }
         }
 
-        in = truename.getInputStream();
+        if (truename != null) {
+            in = truename.getInputStream();
+        } else { 
+            try {
+                Debug.assertTrue(url != null);
+                in = url.openStream();
+            } catch (IOException e) {
+                error(new FileError("Failed to load system file: " 
+                                    + "'" + filename + "'"
+                                    + " from URL: " 
+                                    + "'" + url + "'"));
+            } 
+        }
 
         if (in != null) {
             final LispThread thread = LispThread.currentThread();
diff -r 5a2dcfce47de src/org/armedbear/lisp/Pathname.java
--- a/src/org/armedbear/lisp/Pathname.java	Thu Mar 11 09:36:33 2010 +0100
+++ b/src/org/armedbear/lisp/Pathname.java	Thu Mar 11 11:18:30 2010 +0100
@@ -151,8 +151,16 @@
         init(s);
     }
 
+    public static boolean isSupportedProtocol(String protocol) {
+        return "jar".equals(protocol) || "file".equals(protocol);
+    }
+
     public Pathname(URL url) {
         String protocol = url.getProtocol();
+        if (!isSupportedProtocol(protocol)) {
+            error(new LispError("Unsupported URL: '" + url.toString() + "'"));
+        }
+
         if ("jar".equals(protocol)) {
             init(url.toString());
             return;
@@ -181,7 +189,8 @@
                 return;
             }
         }
-        error(new LispError("Unsupported URL: '" + url.toString() + "'"));
+        error(new LispError("Failed to construct Pathname from URL: "
+                            + "'" + url.toString() + "'"));
     }
 
     static final private String jarSeparator = "!/";
diff -r 5a2dcfce47de src/org/armedbear/lisp/Site.java
--- a/src/org/armedbear/lisp/Site.java	Thu Mar 11 09:36:33 2010 +0100
+++ b/src/org/armedbear/lisp/Site.java	Thu Mar 11 11:18:30 2010 +0100
@@ -42,31 +42,34 @@
 
 public final class Site
 {
-    private static Pathname LISP_HOME;
+    private static LispObject LISP_HOME;
 
     private static void init() {
         String s = System.getProperty("abcl.home");
         if (s != null) {
             String fileSeparator = System.getProperty("file.separator");
             if (!s.endsWith(fileSeparator)) {
-                s += fileSeparator;;
+                s += fileSeparator;
             }
             LISP_HOME = new Pathname(s);
-            return;
         }
         URL url = Lisp.class.getResource("boot.lisp");
         if (url != null) {
-            LISP_HOME = new Pathname(url);
-            LISP_HOME.name = NIL;
-            LISP_HOME.type = NIL;
-            LISP_HOME.invalidateNamestring();
+            if (!Pathname.isSupportedProtocol(url.getProtocol())) {
+                LISP_HOME = NIL;
+            } else {
+                Pathname p = new Pathname(url);
+                p.name = NIL;
+                p.type = NIL;
+                p.invalidateNamestring();
+                LISP_HOME = p;
+            }
             return;
         }
         Debug.trace("Unable to determine LISP_HOME.");
     }
 
-
-    public static final Pathname getLispHome()
+    public static final LispObject getLispHome()
     {
       if (LISP_HOME == null) {
         init();
@@ -79,7 +82,7 @@
         exportSpecial("*LISP-HOME*", PACKAGE_EXT, NIL);
 
     static {
-        Pathname p  = Site.getLispHome();
+        LispObject p  = Site.getLispHome();
         if (p != null)
             _LISP_HOME_.setSymbolValue(p);
     }
