diff --git a/asdf.lisp b/asdf.lisp
index 4a851322a4e50e0c667c441515fdf5a2253943ec..a1cc31c7886aba457ed8e31ab7d857d8f2757f8d 100644
--- a/asdf.lisp
+++ b/asdf.lisp
@@ -109,6 +109,9 @@
            #:*resolve-symlinks*
 
            #:operation-error #:compile-failed #:compile-warned #:compile-error
+           #:error-name
+           #:error-pathname
+           #:missing-definition
            #:error-component #:error-operation
            #:system-definition-error
            #:missing-component
@@ -421,6 +424,14 @@ and NIL NAME and TYPE components"
   (:report (lambda (c s)
              (apply #'format s (format-control c) (format-arguments c)))))
 
+(define-condition missing-definition (system-definition-error)
+  ((name :initarg :name :reader error-name)
+   (pathname :initarg :pathname :reader error-pathname))
+  (:report (lambda (c s)
+             (format s "~@<Definition search function returned a wrong pathname ~A ~
+                           in search of a definition for system ~A.~@:>"
+                     (error-pathname c) (error-name c)))))
+
 (define-condition circular-dependency (system-definition-error)
   ((components :initarg :components :reader circular-dependency-components)))
 
@@ -746,14 +757,17 @@ to `~a` which is not a directory.~@:>"
                    (< (car in-memory) (safe-file-write-date on-disk))))
       (let ((package (make-temporary-package)))
         (unwind-protect
-             (let ((*package* package))
-               (asdf-message
-                "~&~@<; ~@;loading system definition from ~A into ~A~@:>~%"
-                ;; FIXME: This wants to be (ENOUGH-NAMESTRING
-                ;; ON-DISK), but CMUCL barfs on that.
-                on-disk
-                *package*)
-               (load on-disk))
+             (with-open-file (asd on-disk :if-does-not-exist nil)
+               (if asd
+                   (let ((*package* package))
+                     (asdf-message
+                      "~&~@<; ~@;loading system definition from ~A into ~A~@:>~%"
+                      ;; FIXME: This wants to be (ENOUGH-NAMESTRING
+                      ;; ON-DISK), but CMUCL barfs on that.
+                      on-disk
+                      *package*)
+                     (load asd))
+                   (error 'missing-definition :name name :pathname on-disk)))
           (delete-package package))))
     (let ((in-memory (system-registered-p name)))
       (if in-memory