diff --git a/asdf.asd b/asdf.asd
index ed64fe46b87d5835539a8dec101c8ae8078e1d99..55afc88c46d47a46eef36f83308a39b47e541add 100644
--- a/asdf.asd
+++ b/asdf.asd
@@ -7,13 +7,29 @@
 ;;;                                                                  ;;;
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 
-(asdf:defsystem :asdf
+(in-package :asdf)
+
+(defsystem :asdf
   :author ("Daniel Barlow")
   :licence "MIT"
   :description "Another System Definition Facility"
   :long-description "ASDF builds Common Lisp software organized into defined systems."
-  :version "2.016.2" ;; to be automatically updated by bin/bump-revision
+  :version "2.016.3" ;; to be automatically updated by bin/bump-revision
   :depends-on ()
   :components
   ((:file "asdf")
    #+ecl (:file "asdf-ecl" :depends-on ("asdf"))))
+
+;; The method below ensures that before we compile asdf, we load it as source.
+;; This ensures that when we compile asdf, it won't remove symbols and packages
+;; in the back of the compiling asdf, which then finds itself incapable of
+;; perform'ing the load-op'ing of the newly compiled asdf fasl because
+;; perform has been undefined during the initial package-frobbing eval-when code,
+;; but not redefined yet by loading the code rather than merely compiling it.
+;; We could use (:file "asdf" :do-first ((compile-op (load-source-op "asdf"))))
+;; but it's only supported since ASDF 2.016.3. What's below should be more compatible.
+;; We can't use find-component, because it's not compatible with old versions of ASDF 1.x
+
+(defmethod perform :before ((operation compile-op)
+			    (c (eql (first (module-components (find-system :asdf))))))
+  (perform (make-instance 'load-source-op) c))
diff --git a/asdf.lisp b/asdf.lisp
index d115075167d69de6bd7a4fdafe9303020cf8d1ec..069459ceeff2269cf74a37f71fea0338da49f2a5 100755
--- a/asdf.lisp
+++ b/asdf.lisp
@@ -1,5 +1,5 @@
 ;;; -*- mode: common-lisp; Base: 10 ; Syntax: ANSI-Common-Lisp -*-
-;;; This is ASDF 2.016.2: Another System Definition Facility.
+;;; This is ASDF 2.016.3: Another System Definition Facility.
 ;;;
 ;;; Feedback, bug reports, and patches are all welcome:
 ;;; please mail to <asdf-devel@common-lisp.net>.
@@ -112,7 +112,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.016.2")
+         (asdf-version "2.016.3")
          (existing-asdf (find-class 'component nil))
          (existing-version *asdf-version*)
          (already-there (equal asdf-version existing-version)))
@@ -200,12 +200,13 @@
                    :do (unintern old user)))
                (loop :for x :in newly-exported-symbols :do
                  (export (intern* x package)))))
-           (ensure-package (name &key nicknames use unintern fmakunbound shadow export)
+           (ensure-package (name &key nicknames use unintern fmakunbound
+				 shadow export redefined-functions)
              (let* ((p (ensure-exists name nicknames use)))
                (ensure-unintern p unintern)
                (ensure-shadow p shadow)
                (ensure-export p export)
-               (ensure-fmakunbound p fmakunbound)
+               (ensure-fmakunbound p (append fmakunbound redefined-functions))
                p)))
         (macrolet
             ((pkgdcl (name &key nicknames use export
@@ -213,8 +214,9 @@
                  `(ensure-package
                    ',name :nicknames ',nicknames :use ',use :export ',export
                    :shadow ',shadow
-                   :unintern ',(append #-(or gcl ecl) redefined-functions unintern)
-                   :fmakunbound ',(append fmakunbound))))
+                   :unintern ',unintern
+		   :redefined-functions ',redefined-functions
+                   :fmakunbound ',fmakunbound)))
           (pkgdcl
            :asdf
            :nicknames (:asdf-utilities) ;; DEPRECATED! Do not use, for backward compatibility only.
@@ -571,7 +573,6 @@ and NIL NAME, TYPE and VERSION components"
                                '(:relative :back) (pathname-directory pathname))
                    :defaults pathname)))
 
-
 (define-modify-macro appendf (&rest args)
   append "Append onto list") ;; only to be used on short lists.
 
@@ -2359,7 +2360,7 @@ recursive calls to traverse.")
           (t
            (asdf-message (compatfmt "~&~@<; ~@;Changed ASDF from version ~A to incompatible version ~A~@:>~%")
                          version new-version)))
-        (let ((asdf (find-system :asdf)))
+        (let ((asdf (funcall (find-symbol* 'find-system :asdf) :asdf)))
           ;; invalidate all systems but ASDF itself
           (setf *defined-systems* (make-defined-systems-table))
           (register-system asdf)
@@ -2595,7 +2596,7 @@ Returns the new tree (which probably shares structure with the old one)"
               components pathname default-component-class
               perform explain output-files operation-done-p
               weakly-depends-on
-              depends-on serial in-order-to
+              depends-on serial in-order-to do-first
               (version nil versionp)
               ;; list ends
               &allow-other-keys) options
@@ -2656,7 +2657,10 @@ Returns the new tree (which probably shares structure with the old one)"
              in-order-to
              `((compile-op (compile-op ,@depends-on))
                (load-op (load-op ,@depends-on)))))
-      (setf (component-do-first ret) `((compile-op (load-op ,@depends-on))))
+      (setf (component-do-first ret)
+            (union-of-dependencies
+             do-first
+	     `((compile-op (load-op ,@depends-on)))))
 
       (%refresh-component-inline-methods ret rest)
       ret)))
@@ -2803,9 +2807,7 @@ if that's whay you mean." ;;)
   "Return a pathname object corresponding to the
 directory in which the system specification (.asd file) is
 located."
-     (make-pathname :name nil
-                 :type nil
-                 :defaults (system-source-file system-designator)))
+  (pathname-directory-pathname (system-source-file system-designator)))
 
 (defun* relativize-directory (directory)
   (cond
diff --git a/bin/bump-version b/bin/bump-version
index 32073799a7b4456077ecffa1a259499d9f40e058..f37226570d0b5b2f8644e96249ebefdb6cc40191 100755
--- a/bin/bump-version
+++ b/bin/bump-version
@@ -4,7 +4,7 @@
 # e.g. 3.45.6 ==> 3.45.7, or 3.56 ==> 3.56.1
 NEWVER="${1}"
 PROG="$0"
-ASDFDIR="$(readlink -f $(dirname $PROG)/..)"
+ASDFDIR="$(cd $(dirname $PROG)/.. ; /bin/pwd)" ## readlink -f doesn't work on BSD
 ASDFLISP=${ASDFDIR}/asdf.lisp
 ASDFASD=${ASDFDIR}/asdf.asd