diff --git a/rigify/__init__.py b/rigify/__init__.py
index 68d2224506d75421fa6d6d811181ee3bac1ec3f5..fe9511cf2fafc9ffa221cbb8c53c8d7f86b03ea4 100644
--- a/rigify/__init__.py
+++ b/rigify/__init__.py
@@ -115,6 +115,37 @@ class RigifyParameters(bpy.types.PropertyGroup):
     name = bpy.props.StringProperty()
 
 
+class RigifyArmatureProps(bpy.types.PropertyGroup):
+    layer_name_01 = bpy.props.StringProperty(name="Layer 1 Name", default="1")
+    layer_name_02 = bpy.props.StringProperty(name="Layer 2 Name", default="2")
+    layer_name_03 = bpy.props.StringProperty(name="Layer 3 Name", default="3")
+    layer_name_04 = bpy.props.StringProperty(name="Layer 4 Name", default="4")
+    layer_name_05 = bpy.props.StringProperty(name="Layer 5 Name", default="5")
+    layer_name_06 = bpy.props.StringProperty(name="Layer 6 Name", default="6")
+    layer_name_07 = bpy.props.StringProperty(name="Layer 7 Name", default="7")
+    layer_name_08 = bpy.props.StringProperty(name="Layer 8 Name", default="8")
+    layer_name_09 = bpy.props.StringProperty(name="Layer 9 Name", default="9")
+    layer_name_10 = bpy.props.StringProperty(name="Layer 10 Name", default="10")
+    layer_name_11 = bpy.props.StringProperty(name="Layer 11 Name", default="11")
+    layer_name_12 = bpy.props.StringProperty(name="Layer 12 Name", default="12")
+    layer_name_13 = bpy.props.StringProperty(name="Layer 13 Name", default="13")
+    layer_name_14 = bpy.props.StringProperty(name="Layer 14 Name", default="14")
+    layer_name_15 = bpy.props.StringProperty(name="Layer 15 Name", default="15")
+    layer_name_16 = bpy.props.StringProperty(name="Layer 16 Name", default="16")
+    layer_name_17 = bpy.props.StringProperty(name="Layer 17 Name", default="17")
+    layer_name_18 = bpy.props.StringProperty(name="Layer 18 Name", default="18")
+    layer_name_19 = bpy.props.StringProperty(name="Layer 19 Name", default="19")
+    layer_name_20 = bpy.props.StringProperty(name="Layer 20 Name", default="20")
+    layer_name_21 = bpy.props.StringProperty(name="Layer 21 Name", default="21")
+    layer_name_22 = bpy.props.StringProperty(name="Layer 22 Name", default="22")
+    layer_name_23 = bpy.props.StringProperty(name="Layer 23 Name", default="23")
+    layer_name_24 = bpy.props.StringProperty(name="Layer 24 Name", default="24")
+    layer_name_25 = bpy.props.StringProperty(name="Layer 25 Name", default="25")
+    layer_name_26 = bpy.props.StringProperty(name="Layer 26 Name", default="26")
+    layer_name_27 = bpy.props.StringProperty(name="Layer 27 Name", default="27")
+    layer_name_28 = bpy.props.StringProperty(name="Layer 28 Name", default="28")
+
+
 ##### REGISTER #####
 
 def register():
@@ -123,10 +154,13 @@ def register():
 
     bpy.utils.register_class(RigifyName)
     bpy.utils.register_class(RigifyParameters)
+    bpy.utils.register_class(RigifyArmatureProps)
 
     bpy.types.PoseBone.rigify_type = bpy.props.StringProperty(name="Rigify Type", description="Rig type for this bone.")
     bpy.types.PoseBone.rigify_parameters = bpy.props.CollectionProperty(type=RigifyParameters)
 
+    bpy.types.Armature.rigify_props = bpy.props.CollectionProperty(type=RigifyArmatureProps)
+
     IDStore = bpy.types.WindowManager
     IDStore.rigify_collection = bpy.props.EnumProperty(items=col_enum_list, default="All", name="Rigify Active Collection", description="The selected rig collection")
     IDStore.rigify_types = bpy.props.CollectionProperty(type=RigifyName)
@@ -144,6 +178,7 @@ def register():
 def unregister():
     del bpy.types.PoseBone.rigify_type
     del bpy.types.PoseBone.rigify_parameters
+    del bpy.types.Armature.rigify_props
 
     IDStore = bpy.types.WindowManager
     del IDStore.rigify_collection
@@ -152,6 +187,7 @@ def unregister():
 
     bpy.utils.unregister_class(RigifyName)
     bpy.utils.unregister_class(RigifyParameters)
+    bpy.utils.unregister_class(RigifyArmatureProps)
 
     metarig_menu.unregister()
     ui.unregister()
diff --git a/rigify/generate.py b/rigify/generate.py
index 4809e290c4bffed0b25f6b2058babeee0c64fc15..3de8fe23364f51eedc9e06dde2f883c5e87a647b 100644
--- a/rigify/generate.py
+++ b/rigify/generate.py
@@ -282,6 +282,13 @@ def generate_rig(context, metarig):
         vis_layers[i] = vis_layers[i] and not (ORG_LAYER[i] or MCH_LAYER[i] or DEF_LAYER[i])
     obj.data.layers = vis_layers
 
+    # Create list of layer names
+    if len(metarig.data.rigify_props) < 1:
+        metarig.data.rigify_props.add()
+    layer_names = []
+    for i in range(28):
+        layer_names += [getattr(metarig.data.rigify_props[0], "layer_name_%s" % str(i+1).rjust(2, "0"))]
+
     # Generate the UI script
     if "rig_ui.py" in bpy.data.texts:
         script = bpy.data.texts["rig_ui.py"]
@@ -291,7 +298,7 @@ def generate_rig(context, metarig):
     script.write(UI_SLIDERS % rig_id)
     for s in ui_scripts:
         script.write("\n        " + s.replace("\n", "\n        ") + "\n")
-    script.write(layers_ui(vis_layers))
+    script.write(layers_ui(vis_layers, layer_names))
     script.write(UI_REGISTER)
     script.use_module = True
 
diff --git a/rigify/metarigs/human.py b/rigify/metarigs/human.py
index e4eb9f2bf617019d731024d0cc2c3020ac04e68e..d0744066cae7f0323df905f380986a1f955d8297 100644
--- a/rigify/metarigs/human.py
+++ b/rigify/metarigs/human.py
@@ -24,6 +24,20 @@ def create(obj):
     bpy.ops.object.mode_set(mode='EDIT')
     arm = obj.data
 
+    props = arm.rigify_props.add()
+    props.layer_name_01 = "Torso"
+    props.layer_name_03 = "Head"
+    props.layer_name_05 = "Fingers"
+    props.layer_name_06 = "Fingers (tweak)"
+    props.layer_name_07 = "Arm.L (FK)"
+    props.layer_name_08 = "Arm.L (IK)"
+    props.layer_name_09 = "Arm.R (FK)"
+    props.layer_name_10 = "Arm.R (IK)"
+    props.layer_name_11 = "Leg.L (FK)"
+    props.layer_name_12 = "Leg.L (IK)"
+    props.layer_name_13 = "Leg.R (FK)"
+    props.layer_name_14 = "Leg.R (IK)"
+
     bones = {}
 
     bone = arm.edit_bones.new('hips')
diff --git a/rigify/rig_ui_template.py b/rigify/rig_ui_template.py
index db3bb6cbc6a27fe76e9a496ef0b4a6f270e8a7f9..35df1ec2a2f18e8992614e4af8c77d33390f93a8 100644
--- a/rigify/rig_ui_template.py
+++ b/rigify/rig_ui_template.py
@@ -493,8 +493,8 @@ class RigUI(bpy.types.Panel):
 '''
 
 
-def layers_ui(layers):
-    """ Turn a list of booleans into a layer UI.
+def layers_ui(layers, names):
+    """ Turn a list of booleans + a list of names into a layer UI.
     """
 
     code = '''
@@ -522,7 +522,7 @@ class RigLayers(bpy.types.Panel):
             if i == 28:
                 code += "        row.prop(context.active_object.data, 'layers', index=%s, toggle=True, text='Root')\n" % (str(i))
             else:
-                code += "        row.prop(context.active_object.data, 'layers', index=%s, toggle=True, text='%s')\n" % (str(i), str(i + 1))
+                code += "        row.prop(context.active_object.data, 'layers', index=%s, toggle=True, text='%s')\n" % (str(i), names[i])
         i += 1
 
     return code
diff --git a/rigify/rigs/biped/arm/fk.py b/rigify/rigs/biped/arm/fk.py
index 77dcc6a6884701c626d7f076a2f078366547dc28..2c634b8667327d97cf678d59b7766f97dbca65c0 100644
--- a/rigify/rigs/biped/arm/fk.py
+++ b/rigify/rigs/biped/arm/fk.py
@@ -120,6 +120,8 @@ class Rig:
         uarm_p = pb[uarm]
         farm_p = pb[farm]
         hand_p = pb[hand]
+        if self.org_parent != None:
+            hinge_p = pb[hinge]
 
         if self.org_parent != None:
             socket1_p = pb[socket1]
@@ -134,6 +136,13 @@ class Rig:
         else:
             farm_p.lock_rotation = (True, True, False)
 
+        # Hinge transforms are locked, for auto-ik
+        if self.org_parent != None:
+            hinge_p.lock_location = True, True, True
+            hinge_p.lock_rotation = True, True, True
+            hinge_p.lock_rotation_w = True
+            hinge_p.lock_scale = True, True, True
+
         # Set up custom properties
         if self.org_parent != None:
             prop = rna_idprop_ui_prop_get(uarm_p, "isolate", create=True)
diff --git a/rigify/rigs/biped/leg/fk.py b/rigify/rigs/biped/leg/fk.py
index e231fa8e8bfa66e3518bfa7520c4b1f72fbfa74d..f2ce6653d5bfe2010fd4b9db917b4ea9112a2723 100644
--- a/rigify/rigs/biped/leg/fk.py
+++ b/rigify/rigs/biped/leg/fk.py
@@ -158,12 +158,14 @@ class Rig:
         thigh_p = pb[thigh]
         shin_p = pb[shin]
         foot_p = pb[foot]
+        if self.org_parent != None:
+            hinge_p = pb[hinge]
 
         if self.org_parent != None:
             socket1_p = pb[socket1]
             socket2_p = pb[socket2]
 
-        # Set the elbow to only bend on the x-axis.
+        # Set the knee to only bend on the x-axis.
         shin_p.rotation_mode = 'XYZ'
         if 'X' in self.primary_rotation_axis:
             shin_p.lock_rotation = (False, True, True)
@@ -172,6 +174,13 @@ class Rig:
         else:
             shin_p.lock_rotation = (True, True, False)
 
+        # Hinge transforms are locked, for auto-ik
+        if self.org_parent != None:
+            hinge_p.lock_location = True, True, True
+            hinge_p.lock_rotation = True, True, True
+            hinge_p.lock_rotation_w = True
+            hinge_p.lock_scale = True, True, True
+
         # Set up custom properties
         if self.org_parent != None:
             prop = rna_idprop_ui_prop_get(thigh_p, "isolate", create=True)
diff --git a/rigify/rigs/spine.py b/rigify/rigs/spine.py
index 2b4558f4f5c2b6c7cc919a6b14e170de689033a3..a6bbc74733b071a65fa2a54c8ffa8da3119fbf12 100644
--- a/rigify/rigs/spine.py
+++ b/rigify/rigs/spine.py
@@ -508,6 +508,9 @@ class Rig:
         if w != None:
             obj_to_bone(w, self.obj, self.org_bones[-1])
 
+        # Layers
+        pb[main_control].bone.layers = pb[self.org_bones[0]].bone.layers
+
         return [main_control] + controls
 
     def generate(self):
diff --git a/rigify/ui.py b/rigify/ui.py
index a751cfe93fe585494a5448ce3c8bbdc866126e62..eafa967960b9f4d016a72da0c18a3916f2ce4dca 100644
--- a/rigify/ui.py
+++ b/rigify/ui.py
@@ -81,6 +81,46 @@ class DATA_PT_rigify_buttons(bpy.types.Panel):
             op.metarig_type = id_store.rigify_types[id_store.rigify_active_type].name
 
 
+class DATA_PT_rigify_layer_names(bpy.types.Panel):
+    bl_label = "Rigify Layer Names"
+    bl_space_type = 'PROPERTIES'
+    bl_region_type = 'WINDOW'
+    bl_context = "data"
+    bl_options = {'DEFAULT_CLOSED'}
+
+    @classmethod
+    def poll(cls, context):
+        if not context.armature:
+            return False
+        #obj = context.object
+        #if obj:
+        #    return (obj.mode in ('POSE', 'OBJECT', 'EDIT'))
+        #return False
+        return True
+
+    def draw(self, context):
+        C = context
+        layout = self.layout
+        obj = context.object
+
+        if len(obj.data.rigify_props) < 1:
+            obj.data.rigify_props.add()
+
+        for i in range(28):
+            if (i % 16) == 0:
+                col = layout.column()
+                if i == 0:
+                    col.label(text="Top Row:")
+                else:
+                    col.label(text="Bottom Row:")
+            if (i % 8) == 0:
+                col = layout.column(align=True)
+            row = col.row()
+            row.prop(obj.data, "layers", index=i, text="", toggle=True)
+            row.prop(obj.data.rigify_props[0], "layer_name_%s" % str(i+1).rjust(2, "0"), text="Layer %d" % (i + 1))
+
+
+
 class BONE_PT_rigify_buttons(bpy.types.Panel):
     bl_label = "Rigify Type"
     bl_space_type = 'PROPERTIES'
@@ -243,6 +283,7 @@ class Sample(bpy.types.Operator):
 #from bl_ui import space_info  # ensure the menu is loaded first
 
 def register():
+    bpy.utils.register_class(DATA_PT_rigify_layer_names)
     bpy.utils.register_class(DATA_PT_rigify_buttons)
     bpy.utils.register_class(BONE_PT_rigify_buttons)
     bpy.utils.register_class(Generate)
@@ -252,6 +293,7 @@ def register():
 
 
 def unregister():
+    bpy.utils.unregister_class(DATA_PT_rigify_layer_names)
     bpy.utils.unregister_class(DATA_PT_rigify_buttons)
     bpy.utils.unregister_class(BONE_PT_rigify_buttons)
     bpy.utils.unregister_class(Generate)