diff --git a/asdf.asd b/asdf.asd
index ceb98a6eec7137561583dea892ca392f21c17122..9d5c587562bf0bd21b65122a86aedda5e48664f2 100644
--- a/asdf.asd
+++ b/asdf.asd
@@ -74,7 +74,7 @@
   :licence "MIT"
   :description "Another System Definition Facility"
   :long-description "ASDF builds Common Lisp software organized into defined systems."
-  :version "2.28.3" ;; to be automatically updated by make bump-version
+  :version "2.28.4" ;; to be automatically updated by make bump-version
   :depends-on ()
   #+asdf3 :encoding #+asdf3 :utf-8
   ;; For most purposes, asdf itself specially counts as a builtin system.
diff --git a/backward-internals.lisp b/backward-internals.lisp
index b4ba5ad1a0052d9a57c45980beb55c64de89434f..cc3c6c37069bbb42ce3184ff96941e0e093c2a3f 100644
--- a/backward-internals.lisp
+++ b/backward-internals.lisp
@@ -28,7 +28,6 @@
            #'(lambda (m)
                (remove-method (symbol-function name) m))
            (component-inline-methods component)))
-    ;; clear methods, then add the new ones
     (component-inline-methods component) nil)
 
   (defun %define-component-inline-methods (ret rest)
@@ -39,13 +38,19 @@
               :for value = (second data)
               :while data
               :when (eq key keyword) :do
-                (destructuring-bind (op qual (o c) &body body) value
-                  (pushnew
-                   (eval `(defmethod ,name ,qual ((,o ,op) (,c (eql ,ret)))
-                            ,@body))
-                   (component-inline-methods ret)))))))
+                (destructuring-bind (op qual? &rest rest) value
+                  (multiple-value-bind (qual args-and-body)
+                      (if (symbolp qual?)
+                          (values (list qual?) rest)
+                          (values nil (cons qual? rest)))
+                    (destructuring-bind ((o c) &body body) args-and-body
+                      (pushnew
+                       (eval `(defmethod ,name ,@qual ((,o ,op) (,c (eql ,ret)))
+                                ,@body))
+                       (component-inline-methods ret)))))))))
 
   (defun %refresh-component-inline-methods (component rest)
+    ;; clear methods, then add the new ones
     (%remove-component-inline-methods component)
     (%define-component-inline-methods component rest)))
 
diff --git a/find-system.lisp b/find-system.lisp
index 5c0384e55707c7a4a37c5dd206e236e5270fbf39..addecb7240198baf912700c98491648b9eab5bcf 100644
--- a/find-system.lisp
+++ b/find-system.lisp
@@ -57,18 +57,6 @@
     (error 'formatted-system-definition-error :format-control
            format :format-arguments arguments))
 
-  (defvar *defined-systems* (make-hash-table :test 'equal)
-    "This is a hash table whose keys are strings, being the
-names of the systems, and whose values are pairs, the first
-element of which is a universal-time indicating when the
-system definition was last updated, and the second element
-of which is a system object.")
-
-  (defun clear-defined-systems ()
-    (setf *defined-systems* (make-hash-table :test 'equal)))
-
-  (register-hook-function '*post-upgrade-cleanup-hook* 'clear-defined-systems nil)
-
   (defun coerce-name (name)
     (typecase name
       (component (component-name name))
@@ -81,6 +69,13 @@ of which is a system object.")
     ;; the first of the slash-separated components.
     (first (split-string (coerce-name name) :separator "/")))
 
+  (defvar *defined-systems* (make-hash-table :test 'equal)
+    "This is a hash table whose keys are strings, being the
+names of the systems, and whose values are pairs, the first
+element of which is a universal-time indicating when the
+system definition was last updated, and the second element
+of which is a system object.")
+
   (defun system-registered-p (name)
     (gethash (coerce-name name) *defined-systems*))
 
@@ -99,6 +94,17 @@ of which is a system object.")
                       (get-file-stamp file))
                     system)))))
 
+  (defun clear-defined-systems ()
+    ;; Invalidate all systems but ASDF itself, if registered.
+    (let ((asdf (cdr (system-registered-p :asdf))))
+      (setf *defined-systems* (make-hash-table :test 'equal))
+      (when asdf
+        (setf (component-version asdf) *asdf-version*)
+        (register-system asdf)))
+    (values))
+
+  (register-hook-function '*post-upgrade-cleanup-hook* 'clear-defined-systems nil)
+
   (defun clear-system (name)
     "Clear the entry for a system in the database of systems previously loaded.
 Note that this does NOT in any way cause the code of the system to be unloaded."
diff --git a/header.lisp b/header.lisp
index 1c61d5fa9af943a22a7737077da1e6bbb9aefa43..d402fac10f264666a3d2703c7e7d2bf2e5739a68 100644
--- a/header.lisp
+++ b/header.lisp
@@ -1,5 +1,5 @@
 ;;; -*- mode: Common-Lisp; Base: 10 ; Syntax: ANSI-Common-Lisp -*-
-;;; This is ASDF 2.28.3: Another System Definition Facility.
+;;; This is ASDF 2.28.4: Another System Definition Facility.
 ;;;
 ;;; Feedback, bug reports, and patches are all welcome:
 ;;; please mail to <asdf-devel@common-lisp.net>.
diff --git a/test/test-inline-methods.script b/test/test-inline-methods.script
index 5a485f5c93fc68c1f632a6226ffdf16fbfcf851a..42e2003b403094fa97af328133aa8d612cdf0f76 100644
--- a/test/test-inline-methods.script
+++ b/test/test-inline-methods.script
@@ -1,11 +1,19 @@
-(defparameter *a* nil)
+;;; -*- Lisp -*-
+
+(defparameter *a* 0)
 
 (def-test-system :foo
   :components
-  ((:file "file1" :perform (load-op :before (o c)
-                             (setf *a* t)
-                             (format t "Method run before ~A~%" (action-description o c))))))
+  ((:file "file1"
+    :perform (load-op :before (o c)
+                      (incf *a*)
+                      (format t "Method run before ~A~%" (action-description o c))))
+   (:file "file2" :depends-on ("file1")
+    :perform (load-op (o c)
+                      (incf *a*)
+                      (format t "Method run for ~A~%" (action-description o c))
+                      (call-next-method)))))
 
 (load-system :foo)
 
-(assert *a*)
+(assert-equal *a* 2)
diff --git a/upgrade.lisp b/upgrade.lisp
index 094b54360cd09f3c7df7fd4ccda14a8a0a7a3adc..aa4828ff4625bad12818efa74ff68681c6368dae 100644
--- a/upgrade.lisp
+++ b/upgrade.lisp
@@ -52,7 +52,7 @@ You can compare this string with e.g.: (ASDF:VERSION-SATISFIES (ASDF:ASDF-VERSIO
          ;; "3.4.5.67" would be a development version in the official upstream of 3.4.5.
          ;; "3.4.5.0.8" would be your eighth local modification of official release 3.4.5
          ;; "3.4.5.67.8" would be your eighth local modification of development version 3.4.5.67
-         (asdf-version "2.28.3")
+         (asdf-version "2.28.4")
          (existing-version (asdf-version)))
     (setf *asdf-version* asdf-version)
     (when (and existing-version (not (equal asdf-version existing-version)))
diff --git a/version.lisp-expr b/version.lisp-expr
index e919307b1113f555dfd6ff0098148be83d1aebf2..b921a872f7824ba68e0b436e773c233fadf09765 100644
--- a/version.lisp-expr
+++ b/version.lisp-expr
@@ -1 +1 @@
-"2.28.3"
+"2.28.4"