diff --git a/rigify/base_generate.py b/rigify/base_generate.py
index 8cf04ade698e84bd4018643a08908ea9eded52e3..651e06121117dfd7c781dd4ce2ecca20e000a454 100644
--- a/rigify/base_generate.py
+++ b/rigify/base_generate.py
@@ -27,7 +27,7 @@ from .utils.errors import MetarigError, RaiseErrorMixin
 from .utils.naming import random_id
 from .utils.metaclass import SingletonPluginMetaclass
 from .utils.rig import list_bone_names_depth_first_sorted, get_rigify_type
-from .utils.misc import assign_parameters
+from .utils.misc import clone_parameters, assign_parameters
 
 from . import base_rig
 
@@ -78,6 +78,7 @@ class SubstitutionRig(RaiseErrorMixin):
         self.obj = generator.obj
         self.base_bone = pose_bone.name
         self.params = pose_bone.rigify_parameters
+        self.params_copy = clone_parameters(self.params)
 
     def substitute(self):
         # return [rig1, rig2...]
diff --git a/rigify/generate.py b/rigify/generate.py
index 295c1a503457d6680482609bb39f3c24ae0abdae..9e88dcfc691fb8040b319bf31214c987e0e3d6d5 100644
--- a/rigify/generate.py
+++ b/rigify/generate.py
@@ -165,8 +165,13 @@ class Generator(base_generate.BaseGenerator):
         # Select the target rig and join
         select_object(context, obj)
 
+        saved_matrix = obj.matrix_world.copy()
+        obj.matrix_world = metarig.matrix_world
+
         bpy.ops.object.join()
 
+        obj.matrix_world = saved_matrix
+
         # Select the generated rig
         select_object(context, obj, deselect_all=True)
 
diff --git a/rigify/rigs/spines/super_spine.py b/rigify/rigs/spines/super_spine.py
index 4e371e64a5825d2b2b8798f91c616e23573748f5..86021c84fab74ede4f6ec8ff73a48b83b64b5984 100644
--- a/rigify/rigs/spines/super_spine.py
+++ b/rigify/rigs/spines/super_spine.py
@@ -33,7 +33,7 @@ class Rig(SubstitutionRig, BoneUtilityMixin):
     """Compatibility proxy for the monolithic super_spine rig that splits it into parts."""
 
     def substitute(self):
-        params_copy = dict(self.params)
+        params_copy = self.params_copy
         orgs = [self.base_bone] + connected_children_names(self.obj, self.base_bone)
 
         # Split the bone list according to the settings
diff --git a/rigify/utils/misc.py b/rigify/utils/misc.py
index 4d0fbad30d5e52fc64faf5282b292d8dea218b4a..64367bb749ab5c1ec849acccb0c0c75c2f1a6c21 100644
--- a/rigify/utils/misc.py
+++ b/rigify/utils/misc.py
@@ -24,6 +24,7 @@ import collections
 
 from itertools import tee, chain, islice, repeat
 from mathutils import Vector, Matrix, Color
+from rna_prop_ui import rna_idprop_value_to_python
 
 
 #=============================================
@@ -170,8 +171,30 @@ def copy_attributes(a, b):
                 pass
 
 
+def property_to_python(value):
+    value = rna_idprop_value_to_python(value)
+
+    if isinstance(value, dict):
+        return { k: property_to_python(v) for k, v in value.items() }
+    elif isinstance(value, list):
+        return map_list(property_to_python, value)
+    else:
+        return value
+
+
+def clone_parameters(target):
+    return property_to_python(dict(target))
+
+
 def assign_parameters(target, val_dict=None, **params):
-    data = { **val_dict, **params } if val_dict else params
+    if val_dict is not None:
+        for key in list(target.keys()):
+            del target[key]
+
+        data = { **val_dict, **params }
+    else:
+        data = params
+
     for key, value in data.items():
         try:
             target[key] = value