diff --git a/asdf.lisp b/asdf.lisp
index 4962a8a354b4e06a678f9e34fc283dfafc153a87..f172a88af7e51e625a9319c6baa073558cc524a4 100644
--- a/asdf.lisp
+++ b/asdf.lisp
@@ -60,19 +60,26 @@
 (eval-when (:load-toplevel :compile-toplevel :execute)
   (labels ((rename-away (package)
              (loop :with name = (package-name package)
-               :for i :from 1 :for n = (format nil "~A.~D" name i)
-               :unless (find-package n) :do (rename-package package n)))
+               :for i :from 1 :for new = (format nil "~A.~D" name i)
+               :unless (find-package new) :do
+               (rename-package-name package name new)))
+           (rename-package-name (package old new)
+             (let* ((old-names (cons (package-name package) (package-nicknames package)))
+                    (new-names (subst new old old-names :test 'equal))
+                    (new-name (car new-names))
+                    (new-nicknames (cdr new-names)))
+               (rename-package package new-name new-nicknames)))
            (ensure-exists (name nicknames use)
              (let* ((previous
                      (remove-duplicates
                       (remove-if
                        #'null
                        (mapcar #'find-package (cons name nicknames)))
-                      :from-end t)))
+                      :from-end nil)))
                (cond
                  (previous
-                  (map () #'rename-away (cdr previous))
-                  (let ((p (car previous)))
+                  (map () #'rename-away (cdr previous)) ;; packages with conflicting (nick)names
+                  (let ((p (car previous))) ;; previous package with same name
                     (rename-package p name nicknames)
                     (ensure-use p use)
                     p))
@@ -114,7 +121,7 @@
                p)))
     (let ((redefined-functions
            '(#:perform #:explain #:output-files #:operation-done-p
-             #:component-relative-pathname)))
+             #:perform-with-restarts #:component-relative-pathname)))
       (ensure-package
        ':asdf-utilities
        :nicknames '(#:asdf-extensions)
@@ -244,7 +251,7 @@
          #:compute-source-registry
          #:clear-source-registry
          #:ensure-source-registry
-         #:process-source-registry))))
+         #:process-source-registry)))))
 
 (in-package #:asdf)
 
@@ -255,7 +262,7 @@
   ;; This parameter isn't actually user-visible
   ;; -- please use the exported function ASDF:ASDF-VERSION below.
   ;; the 1+ hair is to ensure that we don't do an inadvertent find and replace
-  (subseq "VERSION:1.651" (1+ (length "VERSION"))))
+  (subseq "VERSION:1.652" (1+ (length "VERSION"))))
 
 (defun asdf-version ()
   "Exported interface to the version of ASDF currently installed. A string.
@@ -1555,7 +1562,7 @@ recursive calls to traverse.")
 (defmethod perform-with-restarts (operation component)
   (perform operation component))
 
-(defmethod perform-with-restarts :around ((o load-op) (c cl-source-file))
+(defmethod perform-with-restarts ((o load-op) (c cl-source-file))
   (let ((state :initial))
     (loop :until (or (eq state :success)
                      (eq state :failure)) :do
@@ -1575,7 +1582,7 @@ recursive calls to traverse.")
               (call-next-method)
               (setf state :success)))))))
 
-(defmethod perform-with-restarts :around ((o compile-op) (c cl-source-file))
+(defmethod perform-with-restarts ((o compile-op) (c cl-source-file))
   (let ((state :initial))
     (loop :until (or (eq state :success)
                      (eq state :failure)) :do
@@ -1869,7 +1876,7 @@ Returns the new tree (which probably shares structure with the old one)"
   (dolist (name +asdf-methods+)
     (map ()
          ;; this is inefficient as most of the stored
-         ;; methods will not be for this particular gf n
+         ;; methods will not be for this particular gf
          ;; But this is hardly performance-critical
          (lambda (m)
            (remove-method (symbol-function name) m))