diff --git a/context.go b/context.go
index adeea4a..e45c237 100644
--- a/context.go
+++ b/context.go
@@ -1147,9 +1147,9 @@
 	}}
 }
 
-func (c *Context) addReverseDependency(module *moduleInfo, destName string) []error {
+func (c *Context) findReverseDependency(module *moduleInfo, destName string) (*moduleInfo, []error) {
 	if destName == module.properties.Name {
-		return []error{&Error{
+		return nil, []error{&Error{
 			Err: fmt.Errorf("%q depends on itself", destName),
 			Pos: module.pos,
 		}}
@@ -1157,7 +1157,7 @@
 
 	destInfo, ok := c.moduleGroups[destName]
 	if !ok {
-		return []error{&Error{
+		return nil, []error{&Error{
 			Err: fmt.Errorf("%q has a reverse dependency on undefined module %q",
 				module.properties.Name, destName),
 			Pos: module.pos,
@@ -1165,11 +1165,10 @@
 	}
 
 	if m := c.findMatchingVariant(module, destInfo); m != nil {
-		m.directDeps = append(m.directDeps, module)
-		return nil
+		return m, nil
 	}
 
-	return []error{&Error{
+	return nil, []error{&Error{
 		Err: fmt.Errorf("reverse dependency %q of %q missing variant %q",
 			destName, module.properties.Name,
 			c.prettyPrintVariant(module.dependencyVariant)),
@@ -1543,6 +1542,8 @@
 func (c *Context) runBottomUpMutator(config interface{},
 	name string, mutator BottomUpMutator) (errs []error) {
 
+	reverseDeps := make(map[*moduleInfo][]*moduleInfo)
+
 	for _, module := range c.modulesSorted {
 		newModules := make([]*moduleInfo, 0, 1)
 
@@ -1556,7 +1557,8 @@
 				config:  config,
 				module:  module,
 			},
-			name: name,
+			name:        name,
+			reverseDeps: reverseDeps,
 		}
 
 		mutator(mctx)
@@ -1582,6 +1584,11 @@
 		module.group.modules = spliceModules(module.group.modules, module, newModules)
 	}
 
+	for module, deps := range reverseDeps {
+		sort.Sort(moduleSorter(deps))
+		module.directDeps = append(module.directDeps, deps...)
+	}
+
 	errs = c.updateDependencies()
 	if len(errs) > 0 {
 		return errs
diff --git a/module_ctx.go b/module_ctx.go
index 5fd04d0..ce3cb8a 100644
--- a/module_ctx.go
+++ b/module_ctx.go
@@ -328,7 +328,8 @@
 
 type mutatorContext struct {
 	baseModuleContext
-	name string
+	name        string
+	reverseDeps map[*moduleInfo][]*moduleInfo
 }
 
 type baseMutatorContext interface {
@@ -453,12 +454,18 @@
 
 // Add a dependency from the destination to the given module.
 // Does not affect the ordering of the current mutator pass, but will be ordered
-// correctly for all future mutator passes.
+// correctly for all future mutator passes.  All reverse dependencies for a destination module are
+// collected until the end of the mutator pass, sorted by name, and then appended to the destination
+// module's dependency list.
 func (mctx *mutatorContext) AddReverseDependency(module Module, destName string) {
-	errs := mctx.context.addReverseDependency(mctx.module, destName)
+	destModule, errs := mctx.context.findReverseDependency(mctx.context.moduleInfo[module], destName)
 	if len(errs) > 0 {
 		mctx.errs = append(mctx.errs, errs...)
+		return
 	}
+
+	mctx.reverseDeps[destModule] = append(mctx.reverseDeps[destModule],
+		mctx.context.moduleInfo[module])
 }
 
 // AddVariationDependencies adds deps as dependencies of the current module, but uses the variations
