diff --git a/rigify/metarigs/human.py b/rigify/metarigs/human.py
index 9a67504a7f5122c29b94db58d3af793adb8c1209..10e093163742ff4ae49392fa567d6a92c847a75c 100644
--- a/rigify/metarigs/human.py
+++ b/rigify/metarigs/human.py
@@ -551,7 +551,7 @@ def create(obj):
     pbone.rotation_mode = 'QUATERNION'
     pbone.bone.layers = [False, False, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False]
     pbone = obj.pose.bones[bones['shoulder.L']]
-    pbone.rigify_type = 'copy'
+    pbone.rigify_type = 'basic.copy'
     pbone.lock_location = (True, True, True)
     pbone.lock_rotation = (False, True, False)
     pbone.lock_rotation_w = False
@@ -559,7 +559,7 @@ def create(obj):
     pbone.rotation_mode = 'YXZ'
     pbone.bone.layers = [True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False]
     pbone = obj.pose.bones[bones['shoulder.R']]
-    pbone.rigify_type = 'copy'
+    pbone.rigify_type = 'basic.copy'
     pbone.lock_location = (True, True, True)
     pbone.lock_rotation = (False, True, False)
     pbone.lock_rotation_w = False
diff --git a/rigify/rigs/basic/__init__.py b/rigify/rigs/basic/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/rigify/rigs/copy.py b/rigify/rigs/basic/copy.py
similarity index 97%
rename from rigify/rigs/copy.py
rename to rigify/rigs/basic/copy.py
index 61c4cc99799cc8b1492740d9955de9d6b25e750b..ed6d781689b189dc5ea66433826da722d332c61e 100644
--- a/rigify/rigs/copy.py
+++ b/rigify/rigs/basic/copy.py
@@ -65,7 +65,7 @@ class Rig:
 
         # Constrain the original bone.
         con = pb[self.org_bone].constraints.new('COPY_TRANSFORMS')
-        con.name = "copy_loc"
+        con.name = "copy_transforms"
         con.target = self.obj
         con.subtarget = bone
 
@@ -92,7 +92,7 @@ class Rig:
 
         bpy.ops.object.mode_set(mode='OBJECT')
         pbone = obj.pose.bones[bones['Bone']]
-        pbone.rigify_type = 'copy'
+        pbone.rigify_type = 'simple.bone'
         pbone.lock_location = (False, False, False)
         pbone.lock_rotation = (False, False, False)
         pbone.lock_rotation_w = False
diff --git a/rigify/rigs/basic/copy_chain.py b/rigify/rigs/basic/copy_chain.py
new file mode 100644
index 0000000000000000000000000000000000000000..930e025b236edad619b55306eeb06ace4b2b6e64
--- /dev/null
+++ b/rigify/rigs/basic/copy_chain.py
@@ -0,0 +1,172 @@
+#====================== BEGIN GPL LICENSE BLOCK ======================
+#
+#  This program is free software; you can redistribute it and/or
+#  modify it under the terms of the GNU General Public License
+#  as published by the Free Software Foundation; either version 2
+#  of the License, or (at your option) any later version.
+#
+#  This program is distributed in the hope that it will be useful,
+#  but WITHOUT ANY WARRANTY; without even the implied warranty of
+#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+#  GNU General Public License for more details.
+#
+#  You should have received a copy of the GNU General Public License
+#  along with this program; if not, write to the Free Software Foundation,
+#  Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+#
+#======================= END GPL LICENSE BLOCK ========================
+
+import bpy
+from rigify.utils import MetarigError
+from rigify.utils import copy_bone
+from rigify.utils import connected_children_names
+from rigify.utils import strip_org, make_deformer_name
+from rigify.utils import create_bone_widget
+
+
+class Rig:
+    """ A "copy_chain" rig.  All it does is duplicate the original bone chain
+        and constrain it.
+        This is a control and deformation rig.
+
+    """
+    def __init__(self, obj, bone_name, params):
+        """ Gather and validate data about the rig.
+        """
+        self.obj = obj
+        self.org_bones = [bone_name] + connected_children_names(obj, bone_name)
+        self.params = params
+
+        if len(self.org_bones) <= 1:
+            raise MetarigError("RIGIFY ERROR: Bone '%s': input to rig type must be a chain of 2 or more bones." % (strip_org(bone)))
+
+    def generate(self):
+        """ Generate the rig.
+            Do NOT modify any of the original bones, except for adding constraints.
+            The main armature should be selected and active before this is called.
+
+        """
+        bpy.ops.object.mode_set(mode='EDIT')
+
+        # Create the deformation and control bone chains.
+        # Just copies of the original chain.
+        def_chain = []
+        ctrl_chain = []
+        for i in range(len(self.org_bones)):
+            name = self.org_bones[i]
+
+            # Create bones
+            def_bone = copy_bone(self.obj, name)
+            ctrl_bone = copy_bone(self.obj, name)
+
+            # Get edit bones
+            eb = self.obj.data.edit_bones
+            def_bone_e = eb[def_bone]
+            ctrl_bone_e = eb[ctrl_bone]
+
+            # Set their names
+            def_bone_e.name = make_deformer_name(strip_org(name))
+            ctrl_bone_e.name = strip_org(name)
+
+            # Add them to their respective lists
+            def_chain += [def_bone_e.name]
+            ctrl_chain += [ctrl_bone_e.name]
+
+            # Parenting
+            if i == 0:
+                # First bone
+                def_bone_e.parent = eb[self.org_bones[i]].parent
+                ctrl_bone_e.parent = eb[self.org_bones[i]].parent
+            else:
+                # The rest
+                def_bone_e.parent = eb[def_chain[i-1]]
+                ctrl_bone_e.parent = eb[ctrl_chain[i-1]]
+
+        bpy.ops.object.mode_set(mode='OBJECT')
+        pb = self.obj.pose.bones
+
+        # Constraint org and def to the control bones
+        for org, ctrl, defrm in zip(self.org_bones, ctrl_chain, def_chain):
+            con = pb[org].constraints.new('COPY_TRANSFORMS')
+            con.name = "copy_transforms"
+            con.target = self.obj
+            con.subtarget = ctrl
+
+            con = pb[defrm].constraints.new('COPY_TRANSFORMS')
+            con.name = "copy_transforms"
+            con.target = self.obj
+            con.subtarget = ctrl
+
+        # Create control widgets
+        for bone in ctrl_chain:
+            create_bone_widget(self.obj, bone)
+
+    @classmethod
+    def create_sample(self, obj):
+        """ Create a sample metarig for this rig type.
+
+        """
+        # generated by rigify.utils.write_metarig
+        bpy.ops.object.mode_set(mode='EDIT')
+        arm = obj.data
+
+        bones = {}
+
+        bone = arm.edit_bones.new('bone.01')
+        bone.head[:] = 0.0000, 0.0000, 0.0000
+        bone.tail[:] = 0.0000, 0.0000, 0.3333
+        bone.roll = 0.0000
+        bone.use_connect = False
+        bones['bone.01'] = bone.name
+        bone = arm.edit_bones.new('bone.02')
+        bone.head[:] = 0.0000, 0.0000, 0.3333
+        bone.tail[:] = 0.0000, 0.0000, 0.6667
+        bone.roll = 3.1416
+        bone.use_connect = True
+        bone.parent = arm.edit_bones[bones['bone.01']]
+        bones['bone.02'] = bone.name
+        bone = arm.edit_bones.new('bone.03')
+        bone.head[:] = 0.0000, 0.0000, 0.6667
+        bone.tail[:] = 0.0000, 0.0000, 1.0000
+        bone.roll = 3.1416
+        bone.use_connect = True
+        bone.parent = arm.edit_bones[bones['bone.02']]
+        bones['bone.03'] = bone.name
+
+        bpy.ops.object.mode_set(mode='OBJECT')
+        pbone = obj.pose.bones[bones['bone.01']]
+        pbone.rigify_type = 'basic.copy_chain'
+        pbone.lock_location = (False, False, False)
+        pbone.lock_rotation = (False, False, False)
+        pbone.lock_rotation_w = False
+        pbone.lock_scale = (False, False, False)
+        pbone.rotation_mode = 'QUATERNION'
+        pbone.rigify_parameters.add()
+        pbone = obj.pose.bones[bones['bone.02']]
+        pbone.rigify_type = ''
+        pbone.lock_location = (False, False, False)
+        pbone.lock_rotation = (False, False, False)
+        pbone.lock_rotation_w = False
+        pbone.lock_scale = (False, False, False)
+        pbone.rotation_mode = 'QUATERNION'
+        pbone = obj.pose.bones[bones['bone.03']]
+        pbone.rigify_type = ''
+        pbone.lock_location = (False, False, False)
+        pbone.lock_rotation = (False, False, False)
+        pbone.lock_rotation_w = False
+        pbone.lock_scale = (False, False, False)
+        pbone.rotation_mode = 'QUATERNION'
+
+        bpy.ops.object.mode_set(mode='EDIT')
+        for bone in arm.edit_bones:
+            bone.select = False
+            bone.select_head = False
+            bone.select_tail = False
+        for b in bones:
+            bone = arm.edit_bones[bones[b]]
+            bone.select = True
+            bone.select_head = True
+            bone.select_tail = True
+            arm.edit_bones.active = bone
+
+