diff --git a/rigify/rigs/limbs/arm.py b/rigify/rigs/limbs/arm.py
index 4e9cf299e267ad902ad942c9da67f1bdc1580e6c..98a3c50f4411f14ff04621363ae755cb6d65c54c 100644
--- a/rigify/rigs/limbs/arm.py
+++ b/rigify/rigs/limbs/arm.py
@@ -65,7 +65,7 @@ class Rig(BaseLimbRig):
         pbuilder.register_parent(self, self.bones.org.main[2], exclude_self=True)
 
     def make_ik_ctrl_widget(self, ctrl):
-        create_hand_widget(self.obj, ctrl, bone_transform_name=None)
+        create_hand_widget(self.obj, ctrl)
 
     ####################################################
     # Settings
diff --git a/rigify/rigs/limbs/leg.py b/rigify/rigs/limbs/leg.py
index 098d303aa524bdaafef809456b68d388cdfcf3f6..dbdd20cba05e3201a8722c162388848019e8fe7a 100644
--- a/rigify/rigs/limbs/leg.py
+++ b/rigify/rigs/limbs/leg.py
@@ -127,7 +127,7 @@ class Rig(BaseLimbRig):
         pbuilder.register_parent(self, self.bones.org.main[2], exclude_self=True)
 
     def make_ik_ctrl_widget(self, ctrl):
-        create_foot_widget(self.obj, ctrl, bone_transform_name=None)
+        create_foot_widget(self.obj, ctrl)
 
 
     ####################################################
@@ -159,7 +159,7 @@ class Rig(BaseLimbRig):
 
     @stage.generate_widgets
     def generate_heel_control_widget(self):
-        create_ballsocket_widget(self.obj, self.bones.ctrl.heel, bone_transform_name=None)
+        create_ballsocket_widget(self.obj, self.bones.ctrl.heel)
 
 
     ####################################################
diff --git a/rigify/rigs/limbs/limb_rigs.py b/rigify/rigs/limbs/limb_rigs.py
index 4799e87d3a291a889b4717277d6358a91dc8f54a..30d475bbf928a88b2856b12e657fbdcbfd0b8861 100644
--- a/rigify/rigs/limbs/limb_rigs.py
+++ b/rigify/rigs/limbs/limb_rigs.py
@@ -407,10 +407,10 @@ class BaseLimbRig(BaseRig):
         else:
             roll = pi/2
 
-        create_ikarrow_widget(self.obj, ctrl, bone_transform_name=None, roll=roll)
+        create_ikarrow_widget(self.obj, ctrl, roll=roll)
 
     def make_ik_pole_widget(self, ctrl):
-        create_sphere_widget(self.obj, ctrl, bone_transform_name=None)
+        create_sphere_widget(self.obj, ctrl)
 
     def make_ik_ctrl_widget(self, ctrl):
         raise NotImplementedError()
diff --git a/rigify/rigs/limbs/paw.py b/rigify/rigs/limbs/paw.py
index fa590b66f3e77d7d6e8a9ff38506b2e417aaa734..f8cb1f9fe98992bb0d6aee16eeea78c117ea5fad 100644
--- a/rigify/rigs/limbs/paw.py
+++ b/rigify/rigs/limbs/paw.py
@@ -110,7 +110,7 @@ class Rig(BaseLimbRig):
         pbuilder.register_parent(self, self.bones.org.main[3], exclude_self=True)
 
     def make_ik_ctrl_widget(self, ctrl):
-        create_foot_widget(self.obj, ctrl, bone_transform_name=None)
+        create_foot_widget(self.obj, ctrl)
 
 
     ####################################################
@@ -136,7 +136,7 @@ class Rig(BaseLimbRig):
 
     @stage.generate_widgets
     def generate_heel_control_widget(self):
-        create_ballsocket_widget(self.obj, self.bones.ctrl.heel, bone_transform_name=None)
+        create_ballsocket_widget(self.obj, self.bones.ctrl.heel)
 
 
     ####################################################
diff --git a/rigify/rigs/spines/basic_spine.py b/rigify/rigs/spines/basic_spine.py
index d90e4c8d92650158e24469270906e9685f846209..269889cf0691c748143ee4da2a1f89a566a0d586 100644
--- a/rigify/rigs/spines/basic_spine.py
+++ b/rigify/rigs/spines/basic_spine.py
@@ -125,9 +125,9 @@ class Rig(BaseSpineRig):
         create_circle_widget(
             self.obj, ctrl,
             radius=1.0,
-            head_tail=0.75,
+            head_tail=0.0,
+            head_tail_x=1.0,
             with_line=False,
-            bone_transform_name=wgt_mch
         )
 
     ####################################################
diff --git a/rigify/rigs/spines/spine_rigs.py b/rigify/rigs/spines/spine_rigs.py
index 47a72287f5d2f8cc80fc4e59759f31a462f994a7..34eefbf55f1fc47b8819bf9a13454c8c12b1fb8d 100644
--- a/rigify/rigs/spines/spine_rigs.py
+++ b/rigify/rigs/spines/spine_rigs.py
@@ -79,7 +79,6 @@ class BaseSpineRig(TweakChainRig):
         create_cube_widget(
             self.obj, self.bones.ctrl.master,
             radius=0.5,
-            bone_transform_name=None
         )
 
     ####################################################
diff --git a/rigify/rigs/spines/super_head.py b/rigify/rigs/spines/super_head.py
index de25113a9a3572df21930d13bf7fa242eb7f1ed2..422f3ad094511d664a7c06c4e5aa491d48a70ca4 100644
--- a/rigify/rigs/spines/super_head.py
+++ b/rigify/rigs/spines/super_head.py
@@ -144,7 +144,6 @@ class Rig(BaseHeadTailRig):
             self.obj, ctrl,
             radius=radius,
             head_tail=0.5,
-            bone_transform_name=None
         )
 
     def make_neck_bend_widget(self, ctrl):
@@ -154,7 +153,6 @@ class Rig(BaseHeadTailRig):
             self.obj, ctrl,
             radius=radius/2,
             head_tail=0.0,
-            bone_transform_name=None
         )
 
     def make_head_widget(self, ctrl):
@@ -169,7 +167,6 @@ class Rig(BaseHeadTailRig):
             radius              = 0.5,
             head_tail           = head_tail,
             with_line           = False,
-            bone_transform_name = None
         )
 
     ####################################################
diff --git a/rigify/utils/widgets.py b/rigify/utils/widgets.py
index 037d4118e58d69f570fd4728e2da72cf372f00ab..f7e796b606ff51bccdd8e9cf0992abd54fc56897 100644
--- a/rigify/utils/widgets.py
+++ b/rigify/utils/widgets.py
@@ -33,7 +33,7 @@ WGT_PREFIX = "WGT-"  # Prefix for widget objects
 #=============================================
 
 
-def obj_to_bone(obj, rig, bone_name):
+def obj_to_bone(obj, rig, bone_name, bone_transform_name=None):
     """ Places an object at the location/rotation/scale of the given bone.
     """
     if bpy.context.mode == 'EDIT_ARMATURE':
@@ -45,7 +45,9 @@ def obj_to_bone(obj, rig, bone_name):
     if bone.use_custom_shape_bone_size:
         scale *= bone.length
 
-    if bone.custom_shape_transform:
+    if bone_transform_name is not None:
+        bone = rig.pose.bones[bone_transform_name]
+    elif bone.custom_shape_transform:
         bone = bone.custom_shape_transform
 
     mat = rig.matrix_world @ bone.bone.matrix_local
@@ -63,9 +65,6 @@ def obj_to_bone(obj, rig, bone_name):
 def create_widget(rig, bone_name, bone_transform_name=None):
     """ Creates an empty widget object for a bone, and returns the object.
     """
-    if bone_transform_name is None:
-        bone_transform_name = bone_name
-
     obj_name = WGT_PREFIX + rig.name + '_' + bone_name
     scene = bpy.context.scene
     collection = ensure_widget_collection(bpy.context)
@@ -74,7 +73,7 @@ def create_widget(rig, bone_name, bone_transform_name=None):
     if obj_name in scene.objects:
         # Move object to bone position, in case it changed
         obj = scene.objects[obj_name]
-        obj_to_bone(obj, rig, bone_transform_name)
+        obj_to_bone(obj, rig, bone_name, bone_transform_name)
 
         return None
     else:
@@ -91,7 +90,7 @@ def create_widget(rig, bone_name, bone_transform_name=None):
         collection.objects.link(obj)
 
         # Move object to bone position and set layers
-        obj_to_bone(obj, rig, bone_transform_name)
+        obj_to_bone(obj, rig, bone_name, bone_transform_name)
         wgts_group_name = 'WGTS_' + rig.name
         if wgts_group_name in bpy.data.objects.keys():
             obj.parent = bpy.data.objects[wgts_group_name]
diff --git a/rigify/utils/widgets_basic.py b/rigify/utils/widgets_basic.py
index a40806adec7533bb84b4a180d950a6197aa7dc48..2848e5bfb20366d624e2fc6a588d49ad8d093937 100644
--- a/rigify/utils/widgets_basic.py
+++ b/rigify/utils/widgets_basic.py
@@ -33,15 +33,17 @@ def create_line_widget(rig, bone_name, bone_transform_name=None):
         mesh.update()
 
 
-def create_circle_widget(rig, bone_name, radius=1.0, head_tail=0.0, with_line=False, bone_transform_name=None):
+def create_circle_widget(rig, bone_name, radius=1.0, head_tail=0.0, head_tail_x=None, with_line=False, bone_transform_name=None):
     """ Creates a basic circle widget, a circle around the y-axis.
         radius: the radius of the circle
         head_tail: where along the length of the bone the circle is (0.0=head, 1.0=tail)
+        head_tail_x: if not None, specifies a different value along the X axis to create a deformed circle
     """
     obj = create_widget(rig, bone_name, bone_transform_name)
     if obj != None:
         v = [(0.7071068286895752, 2.980232238769531e-07, -0.7071065306663513), (0.8314696550369263, 2.980232238769531e-07, -0.5555699467658997), (0.9238795042037964, 2.682209014892578e-07, -0.3826831877231598), (0.9807852506637573, 2.5331974029541016e-07, -0.19509011507034302), (1.0, 2.365559055306221e-07, 1.6105803979371558e-07), (0.9807853698730469, 2.2351741790771484e-07, 0.19509044289588928), (0.9238796234130859, 2.086162567138672e-07, 0.38268351554870605), (0.8314696550369263, 1.7881393432617188e-07, 0.5555704236030579), (0.7071068286895752, 1.7881393432617188e-07, 0.7071070075035095), (0.5555702447891235, 1.7881393432617188e-07, 0.8314698934555054), (0.38268327713012695, 1.7881393432617188e-07, 0.923879861831665), (0.19509008526802063, 1.7881393432617188e-07, 0.9807855486869812), (-3.2584136988589307e-07, 1.1920928955078125e-07, 1.000000238418579), (-0.19509072601795197, 1.7881393432617188e-07, 0.9807854294776917), (-0.3826838731765747, 1.7881393432617188e-07, 0.9238795638084412), (-0.5555707216262817, 1.7881393432617188e-07, 0.8314695358276367), (-0.7071071863174438, 1.7881393432617188e-07, 0.7071065902709961), (-0.8314700126647949, 1.7881393432617188e-07, 0.5555698871612549), (-0.923879861831665, 2.086162567138672e-07, 0.3826829195022583), (-0.9807853698730469, 2.2351741790771484e-07, 0.1950896978378296), (-1.0, 2.365559907957504e-07, -7.290432222362142e-07), (-0.9807850122451782, 2.5331974029541016e-07, -0.195091113448143), (-0.9238790273666382, 2.682209014892578e-07, -0.38268423080444336), (-0.831468939781189, 2.980232238769531e-07, -0.5555710196495056), (-0.7071058750152588, 2.980232238769531e-07, -0.707107424736023), (-0.555569052696228, 2.980232238769531e-07, -0.8314701318740845), (-0.38268208503723145, 2.980232238769531e-07, -0.923879861831665), (-0.19508881866931915, 2.980232238769531e-07, -0.9807853102684021), (1.6053570561780361e-06, 2.980232238769531e-07, -0.9999997615814209), (0.19509197771549225, 2.980232238769531e-07, -0.9807847142219543), (0.3826850652694702, 2.980232238769531e-07, -0.9238786101341248), (0.5555717945098877, 2.980232238769531e-07, -0.8314683437347412)]
-        verts = [(a[0] * radius, head_tail, a[2] * radius) for a in v]
+        delta = (head_tail_x - head_tail) if head_tail_x is not None else 0
+        verts = [(a[0] * radius, head_tail + delta * a[0] * a[0], a[2] * radius) for a in v]
         if with_line:
             edges = [(28, 12), (0, 1), (1, 2), (2, 3), (3, 4), (4, 5), (5, 6), (6, 7), (7, 8), (8, 9), (9, 10), (10, 11), (11, 12), (12, 13), (13, 14), (14, 15), (15, 16), (16, 17), (17, 18), (18, 19), (19, 20), (20, 21), (21, 22), (22, 23), (23, 24), (24, 25), (25, 26), (26, 27), (27, 28), (28, 29), (29, 30), (30, 31), (0, 31)]
         else: