diff --git a/action.lisp b/action.lisp
index 67725bd9cd32cc810572975515b2ce57d88f8149..431dc6c8dd617f5a0605f30bdeb772421b860de0 100644
--- a/action.lisp
+++ b/action.lisp
@@ -377,9 +377,12 @@ in some previous image, or T if it needs to be done.")
   (defmethod perform ((o operation) (c parent-component))
     nil)
   (defmethod perform ((o operation) (c source-file))
-    (sysdef-error
-     (compatfmt "~@<Required method PERFORM not implemented for operation ~A, component ~A~@:>")
-     (class-of o) (class-of c)))
+    ;; For backward compatibility, don't error on operations that don't specify propagation.
+    (when (typep o '(or downward-operation upward-operation sideway-operation
+                     selfward-operation non-propagating-operation))
+      (sysdef-error
+       (compatfmt "~@<Required method ~S not implemented for ~/asdf-action:format-action/~@:>")
+       'perform (cons o c))))
 
   (defmethod perform-with-restarts (operation component)
     ;; TOO verbose, especially as the default. Add your own :before method
diff --git a/test/test-operation-classes.script b/test/test-operation-classes.script
index 1d569870265ba39cc622b827a50221e1b799f102..c7599d15ce751d00ec308363ce789abdeb2855b1 100644
--- a/test/test-operation-classes.script
+++ b/test/test-operation-classes.script
@@ -71,3 +71,5 @@
    (trivial-operation "test-asdf/test-module-depend" "quux" "file3mod" "file3")
    (trivial-operation "test-asdf/test-module-depend" "quux" "file3mod")
    (trivial-operation "test-asdf/test-module-depend" "quux")))
+
+(operate 'trivial-operation 'test-asdf/test-module-depend)