diff --git a/asdf.lisp b/asdf.lisp
index fb96da8fdd651d24b0977d2b0cb0d43833568278..5ae9aaa8b3bab02c07dfbaa704a7e2673c87859e 100644
--- a/asdf.lisp
+++ b/asdf.lisp
@@ -467,6 +467,16 @@ processed in order by OPERATE."))
 ;;;; General Purpose Utilities
 
 (defmacro while-collecting ((&rest collectors) &body body)
+  "COLLECTORS should be a list of names for collections.  A collector
+defines a function that, when applied to an argument inside BODY, will
+add its argument to the corresponding collection.  Returns multiple values,
+a list for each collection, in order.
+   E.g.,
+\(while-collecting \(foo bar\)
+           \(dolist \(x '\(\(a 1\) \(b 2\) \(c 3\)\)\)
+             \(foo \(first x\)\)
+             \(bar \(second x\)\)\)\)
+Returns two values: \(A B C\) and \(1 2 3\)."
   (let ((vars (mapcar #'(lambda (x) (gensym (symbol-name x))) collectors))
         (initial-values (mapcar (constantly nil) collectors)))
     `(let ,(mapcar #'list vars initial-values)
diff --git a/test/test-redundant-recompile.asd b/test/test-redundant-recompile.asd
new file mode 100644
index 0000000000000000000000000000000000000000..a69d558cadaa9de26d65a967aa1f3e9c10dcd673
--- /dev/null
+++ b/test/test-redundant-recompile.asd
@@ -0,0 +1,16 @@
+;;; -*- Lisp -*-
+(asdf:defsystem test-redundant-recompile
+  :components ((:file "file2" :in-order-to ((compile-op (load-op "file1"))
+                                            (load-op (load-op "file1"))))
+               (:file "file1")))
+
+#|
+;;;This test system definition attempts to replicate the excess dependencies
+;;;that seem to give rise to launchpad bug 590517
+;;;(https://bugs.launchpad.net/asdf/+bug/590517)
+
+1) from clean, check that all fasl files build and that some function
+   defined in the second file is present
+
+2) load again.  Check to make sure that nothing is recompiled.
+|#
diff --git a/test/test-redundant-recompile.script b/test/test-redundant-recompile.script
new file mode 100644
index 0000000000000000000000000000000000000000..9f16fcba8f258a7e3bd324bd385de6ee3aa25a09
--- /dev/null
+++ b/test/test-redundant-recompile.script
@@ -0,0 +1,28 @@
+;;; -*- Lisp -*-
+(load "script-support")
+(load-asdf)
+
+(quit-on-error
+ (setf asdf:*central-registry* '(*default-pathname-defaults*))
+ (asdf:operate 'asdf:load-op 'test-redundant-recompile)
+ ;; test that it compiled
+ (let* ((file1 (asdf:compile-file-pathname* "file1"))
+        (file2 (asdf:compile-file-pathname* "file2"))
+        (file1-date (file-write-date file1))
+        (file2-date (file-write-date file2)))
+
+   (format t "~&test-redundant-recompile 1: ~S ~S~%" file1 file1-date)
+   (format t "~&test-redundant-recompile 2: ~S ~S~%" file2 file2-date)
+   (assert file1-date)
+   (assert file2-date)
+
+   ;; and loaded
+   (assert (symbol-value (find-symbol (symbol-name :*file1*) :test-package)))
+
+   ;; now rerun the load-op and check that no files are recompiled
+
+   ;;(trace asdf::operation-done-p asdf::traverse)
+   (asdf:operate 'asdf:load-op 'test-redundant-recompile)
+   (assert (= file1-date (file-write-date file1)))
+   (assert (= file2-date (file-write-date file2)))))
+