diff --git a/asdf.asd b/asdf.asd
index 2337e06536f4d8ef52b82ca7d81fb4f4c91cee3a..2a5ec0c2713ff4f59dfce62e456aad63eecddffe 100644
--- a/asdf.asd
+++ b/asdf.asd
@@ -62,7 +62,7 @@
   :licence "MIT"
   :description "Another System Definition Facility"
   :long-description "ASDF builds Common Lisp software organized into defined systems."
-  :version "2.26.155" ;; to be automatically updated by make bump-version
+  :version "2.26.156" ;; 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-interface.lisp b/backward-interface.lisp
index 450b453e6b670aa723cd0b9ed16db3ea84a5cab9..a77703e4b516bee668d7cf52e230067ac26bd8a1 100644
--- a/backward-interface.lisp
+++ b/backward-interface.lisp
@@ -9,7 +9,7 @@
   (:export
    #:*asdf-verbose*
    #:operation-error #:compile-error #:compile-failed #:compile-warned
-   #:error-component #:error-operation #:load-sysdef
+   #:error-component #:error-operation
    #:component-load-dependencies
    #:enable-asdf-binary-locations-compatibility
    #:operation-forced
@@ -116,11 +116,6 @@ ASDF:ENABLE-ASDF-BINARY-LOCATIONS-COMPATIBILITY as documented in the manual;
 call that function where you would otherwise have loaded and configured A-B-L.")))
 
 
-;;;; load-sysdef
-(defun* load-sysdef (name pathname)
-  (load-asd pathname :name name))
-
-
 ;;;; run-shell-command
 ;;
 ;; WARNING! The function below is dysfunctional and deprecated.
diff --git a/backward-internals.lisp b/backward-internals.lisp
index 79e31e5edb73ce37cfd301eab25aacfab4742458..6caf4d2a8b58f5b0c2386637904cd953cd858e06 100644
--- a/backward-internals.lisp
+++ b/backward-internals.lisp
@@ -7,9 +7,11 @@
    :asdf/system :asdf/component :asdf/operation
    :asdf/find-system :asdf/action :asdf/lisp-action)
   (:export ;; for internal use
+   #:load-sysdef #:make-temporary-package
    #:%refresh-component-inline-methods
    #:%resolve-if-component-dep-fails
-   #:make-sub-operation))
+   #:make-sub-operation
+   #:load-sysdef #:make-temporary-package))
 (in-package :asdf/backward-internals)
 
 ;;;; Backward compatibility with "inline methods"
@@ -70,3 +72,13 @@
 (when-upgrade (:when (fboundp 'make-sub-operation))
   (defun* make-sub-operation (c o dep-c dep-o)
     (declare (ignore c o dep-c dep-o)) (asdf-upgrade-error)))
+
+
+;;;; load-sysdef
+(defun* load-sysdef (name pathname)
+  (load-asd pathname :name name))
+
+(defun* make-temporary-package ()
+  (make-package (fresh-package-name :prefix :asdf :index 0) :use '(:cl :asdf/interface)))
+
+
diff --git a/component.lisp b/component.lisp
index 663b31b206d1d79d44ae8ba4c18e07ab4b5892e8..3e8c7fd4e9ab7e0d37265adccbdc17b1a1088f32 100644
--- a/component.lisp
+++ b/component.lisp
@@ -25,6 +25,7 @@
    #:component-build-operation
    #:module-default-component-class
    #:module-components ;; backward-compatibility. DO NOT USE.
+   #:sub-components
 
    ;; Internals we'd like to share with the ASDF package, especially for upgrade purposes
    #:name #:version #:description #:long-description #:author #:maintainer #:licence
@@ -257,3 +258,16 @@ another pathname in a degenerate way."))
 
 (defmethod version-satisfies ((cver string) version)
   (version-compatible-p cver version))
+
+
+;;; all sub-components (of a given type)
+
+(defun* sub-components (component &key (type t))
+  (while-collecting (c)
+    (labels ((recurse (x)
+               (when (if-let (it (component-if-feature x)) (featurep it) t)
+                 (when (typep x type)
+                   (c x))
+                 (when (typep x 'parent-component)
+                   (map () #'recurse (component-children x))))))
+      (recurse component))))
diff --git a/configuration.lisp b/configuration.lisp
index 898fe2b47aa27f76ff18092232fd0f6f887ef1e4..b9105750daf0a2a0db7f0011637e21fd2e61d582 100644
--- a/configuration.lisp
+++ b/configuration.lisp
@@ -240,21 +240,22 @@ directive.")
                              (:ensure-directory boolean)) t) resolve-location))
 
 (defun* (resolve-location) (x &key ensure-directory wilden directory)
-  (when directory (setf ensure-directory t)) ;; :directory backward compatibility, until 2014-01-16.
-  (if (atom x)
-      (resolve-absolute-location x :ensure-directory ensure-directory :wilden wilden)
-      (loop* :with (first . rest) = x
-        :with path = (resolve-absolute-location
-                          first :ensure-directory (and (or ensure-directory rest) t)
-                          :wilden (and wilden (null rest)))
-        :for (element . morep) :on rest
-        :for dir = (and (or morep ensure-directory) t)
-        :for wild = (and wilden (not morep))
-        :do (setf path (merge-pathnames*
-                        (resolve-relative-location
-                         element :ensure-directory dir :wilden wild)
-                        path))
-        :finally (return path))))
+  ;; :directory backward compatibility, until 2014-01-16: accept directory as well as ensure-directory
+  (let ((dirp (or directory ensure-directory)))
+    (if (atom x)
+        (resolve-absolute-location x :ensure-directory dirp :wilden wilden)
+        (loop* :with (first . rest) = x
+               :with path = (resolve-absolute-location
+                             first :ensure-directory (and (or dirp rest) t)
+                                   :wilden (and wilden (null rest)))
+               :for (element . morep) :on rest
+               :for dir = (and (or morep dirp) t)
+               :for wild = (and wilden (not morep))
+               :do (setf path (merge-pathnames*
+                               (resolve-relative-location
+                                element :ensure-directory dir :wilden wild)
+                               path))
+               :finally (return path)))))
 
 (defun* location-designator-p (x)
   (flet ((absolute-component-p (c)
diff --git a/driver.lisp b/driver.lisp
index 138a99651837f01e5ea51e01ff51c913242c631b..950ed7c9d50a5a071a58e43c57294224a72ac7cb 100644
--- a/driver.lisp
+++ b/driver.lisp
@@ -13,4 +13,4 @@
    :asdf/package :asdf/utility
    :asdf/pathname :asdf/stream :asdf/os :asdf/image
    :asdf/run-program :asdf/lisp-build
-   :asdf/configuration))
+   :asdf/configuration :asdf/backward-driver))
diff --git a/header.lisp b/header.lisp
index e16fb7f2e7f5ff709d046da1e72e2231f8531efb..d8f53cef0c437a6de165c58fb1332c2106f5d2e0 100644
--- a/header.lisp
+++ b/header.lisp
@@ -1,5 +1,5 @@
 ;;; -*- mode: Common-Lisp; Base: 10 ; Syntax: ANSI-Common-Lisp -*-
-;;; This is ASDF 2.26.155: Another System Definition Facility.
+;;; This is ASDF 2.26.156: Another System Definition Facility.
 ;;;
 ;;; Feedback, bug reports, and patches are all welcome:
 ;;; please mail to <asdf-devel@common-lisp.net>.
diff --git a/lisp-action.lisp b/lisp-action.lisp
index 063b4800268de364957f0e24b3e9e40f52e150db..899da73752f20fa7b05310de9c4ac5f3efb0eae9 100644
--- a/lisp-action.lisp
+++ b/lisp-action.lisp
@@ -145,13 +145,13 @@
 #+(or clozure sbcl)
 (defmethod input-files ((o compile-op) (c system))
   (declare (ignorable o c))
-  (unless (builtin-system-p c)
-    (loop* :for (sub-o . sub-c)
-           :in (traverse-sub-actions
-                o c :other-systems nil
-                    :keep-operation 'compile-op :keep-component 'cl-source-file)
-           :append (remove-if-not 'warnings-file-p
-                                  (output-files sub-o sub-c)))))
+  (when *warnings-file-type*
+    (unless (builtin-system-p c)
+      ;; The most correct way to do it would be to use:
+      ;; (traverse-sub-actions o c :other-systems nil :keep-operation 'compile-op :keep-component 'cl-source-file)
+      ;; but it's expensive and we don't care too much about file order or ASDF extensions.
+      (loop :for sub :in (sub-components c :type 'cl-source-file)
+            :nconc (remove-if-not 'warnings-file-p (output-files o sub))))))
 #+sbcl
 (defmethod output-files ((o compile-op) (c system))
   (unless (builtin-system-p c)
diff --git a/upgrade.lisp b/upgrade.lisp
index 0ff92ad265b0aa99f7ebbc6842a41623f9166fb1..5f11e470e8ea0930619cc18291ba265ea147009c 100644
--- a/upgrade.lisp
+++ b/upgrade.lisp
@@ -35,7 +35,7 @@
          ;; "2.345.6" would be a development version in the official upstream
          ;; "2.345.0.7" would be your seventh local modification of official release 2.345
          ;; "2.345.6.7" would be your seventh local modification of development version 2.345.6
-         (asdf-version "2.26.155")
+         (asdf-version "2.26.156")
          (existing-asdf (find-class (find-symbol* :component :asdf nil) nil))
          (existing-version *asdf-version*)
          (already-there (equal asdf-version existing-version))
diff --git a/version.lisp-expr b/version.lisp-expr
index 8c163475d37beda491ff62146958156df4008a94..208d5b7431689ebb7eeb8aec51bd6cdfdd7bdec3 100644
--- a/version.lisp-expr
+++ b/version.lisp-expr
@@ -1 +1 @@
-"2.26.155"
+"2.26.156"