diff --git a/rigify/ui.py b/rigify/ui.py
index 7f59e4b422616ff8d12de260952fecb000bbf196..005aed800be44c3b5a55413c05a55748e7005a4f 100644
--- a/rigify/ui.py
+++ b/rigify/ui.py
@@ -725,7 +725,7 @@ def rigify_report_exception(operator, exception):
 
     message.reverse()  # XXX - stupid! menu's are upside down!
 
-    operator.report({'INFO'}, '\n'.join(message))
+    operator.report({'ERROR'}, '\n'.join(message))
 
 
 class LayerInit(bpy.types.Operator):
@@ -761,6 +761,13 @@ class Generate(bpy.types.Operator):
             traceback.print_exc()
 
             rigify_report_exception(self, rig_exception)
+        except Exception as rig_exception:
+            import traceback
+            traceback.print_exc()
+
+            self.report({'ERROR'}, 'Generation has thrown an exception: ' + str(rig_exception))
+        finally:
+            bpy.ops.object.mode_set(mode='OBJECT')
 
         return {'FINISHED'}
 
diff --git a/rigify/utils/switch_parent.py b/rigify/utils/switch_parent.py
index d43e08303837d1ba8554d9b09a8366963112136e..b536048da700f514c3cc3e56820c4b73ff69d1e4 100644
--- a/rigify/utils/switch_parent.py
+++ b/rigify/utils/switch_parent.py
@@ -13,7 +13,8 @@ from .misc import map_list, map_apply, force_lazy
 from ..base_rig import *
 from ..base_generate import GeneratorPlugin
 
-from itertools import count, repeat
+from collections import defaultdict
+from itertools import count, repeat, chain
 
 
 def _rig_is_child(rig, parent):
@@ -40,7 +41,7 @@ class SwitchParentBuilder(GeneratorPlugin, MechanismUtilityMixin):
 
         self.child_list = []
         self.global_parents = []
-        self.local_parents = []
+        self.local_parents = defaultdict(list)
         self.child_map = {}
         self.frozen = False
 
@@ -77,7 +78,7 @@ class SwitchParentBuilder(GeneratorPlugin, MechanismUtilityMixin):
         if is_global:
             self.global_parents.append(entry)
         else:
-            self.local_parents.append(entry)
+            self.local_parents[id(rig)].append(entry)
 
 
     def build_child(self, rig, bone, *, use_parent_mch=True, **options):
@@ -171,16 +172,28 @@ class SwitchParentBuilder(GeneratorPlugin, MechanismUtilityMixin):
 
             child[name] = value
 
+    def get_rig_parent_candidates(self, rig):
+        candidates = []
+
+        # Build a list in parent hierarchy order
+        while rig:
+            candidates.append(self.local_parents[id(rig)])
+            rig = rig.rigify_parent
+
+        candidates.append(self.global_parents)
+
+        return list(chain.from_iterable(reversed(candidates)))
+
     def generate_bones(self):
         self.frozen = True
-        self.parent_list = self.global_parents + self.local_parents
+        self.parent_list = self.global_parents + list(chain.from_iterable(self.local_parents.values()))
 
         # Link children to parents
         for child in self.child_list:
             child_rig = child['context_rig'] or child['rig']
             parents = []
 
-            for parent in self.parent_list:
+            for parent in self.get_rig_parent_candidates(child_rig):
                 if parent['rig'] is child_rig:
                     if parent['exclude_self'] or child['exclude_self']:
                         continue