diff --git a/rigify/generate.py b/rigify/generate.py
index 96a6d68d60af07c1b4317e6309c5b707bcbaec97..73552442044516ab3ae8d75dadc40c278f53c57e 100644
--- a/rigify/generate.py
+++ b/rigify/generate.py
@@ -130,6 +130,15 @@ def generate_rig(context, metarig):
     obj.select = True
     scene.objects.active = obj
 
+    # Copy over bone properties
+    for bone in metarig.data.bones:
+        bone_gen = obj.data.bones[bone.name]
+
+        # B-bone stuff
+        bone_gen.bbone_segments = bone.bbone_segments
+        bone_gen.bbone_in = bone.bbone_in
+        bone_gen.bbone_out = bone.bbone_out
+
     # Copy over the pose_bone properties
     for bone in metarig.pose.bones:
         bone_gen = obj.pose.bones[bone.name]
@@ -146,14 +155,28 @@ def generate_rig(context, metarig):
         for prop in bone.keys():
             bone_gen[prop] = bone[prop]
 
-    # Copy over bone properties
-    for bone in metarig.data.bones:
-        bone_gen = obj.data.bones[bone.name]
-
-        # B-bone stuff
-        bone_gen.bbone_segments = bone.bbone_segments
-        bone_gen.bbone_in = bone.bbone_in
-        bone_gen.bbone_out = bone.bbone_out
+        # Constraints
+        for con1 in bone.constraints:
+            con2 = bone_gen.constraints.new(type=con1.type)
+
+            # Copy attributes
+            keys = dir(con1)
+            for key in keys:
+                if not key.startswith("_") \
+                and not key.startswith("error_") \
+                and key != "is_valid" \
+                and key != "rna_type" \
+                and key != "type" \
+                and key != "bl_rna":
+                    try:
+                        setattr(con2, key, getattr(con1, key))
+                    except AttributeError:
+                        print("Could not write to constraint attribute '%s'" % key)
+
+            # Set metarig target to rig target
+            if "target" in keys:
+                if getattr(con2, "target") == metarig:
+                    setattr(con2, "target", obj)
 
     t.tick("Duplicate rig: ")
     #----------------------------------
diff --git a/rigify/utils.py b/rigify/utils.py
index c97712228b03d0dc52c5eaed9c8f6a133bd6dadf..4add7a15052315c1893629cf15dee219b0ed7f69 100644
--- a/rigify/utils.py
+++ b/rigify/utils.py
@@ -185,6 +185,17 @@ def copy_bone(obj, bone_name, assign_name=''):
         pose_bone_2.lock_rotation_w = pose_bone_1.lock_rotation_w
         pose_bone_2.lock_rotations_4d = pose_bone_1.lock_rotations_4d
 
+        # Copy custom properties
+        for key in pose_bone_1.keys():
+            if key != "_RNA_UI" \
+            and key != "rigify_parameters" \
+            and key != "rigify_type":
+                prop1 = rna_idprop_ui_prop_get(pose_bone_1, key, create=False)
+                prop2 = rna_idprop_ui_prop_get(pose_bone_2, key, create=True)
+                pose_bone_2[key] = pose_bone_1[key]
+                for key in prop1.keys():
+                    prop2[key] = prop1[key]
+
         bpy.ops.object.mode_set(mode='EDIT')
 
         return bone_name_2