diff --git a/cadquery/cq.py b/cadquery/cq.py
index 9dad3f660..27db44cb9 100644
--- a/cadquery/cq.py
+++ b/cadquery/cq.py
@@ -543,8 +543,14 @@ def _computeXdir(normal):
                         if isinstance(obj, Shape)
                         else obj.Center()
                     )
-                normal = self.plane.zDir
-                xDir = self.plane.xDir
+
+                val = self.parent.val() if self.parent else None
+                if isinstance(val, Face):
+                    normal = val.normalAt(center)
+                    xDir = _computeXdir(normal)
+                else:
+                    normal = self.plane.zDir
+                    xDir = self.plane.xDir
             else:
                 raise ValueError("Needs a face or a vertex or point on a work plane")
 
diff --git a/tests/test_cadquery.py b/tests/test_cadquery.py
index 034e3c5e0..5c02e9933 100644
--- a/tests/test_cadquery.py
+++ b/tests/test_cadquery.py
@@ -3114,6 +3114,22 @@ def testWorkplaneFromTagged(self):
             result.faces(">Z").val().Center().toTuple(), (-3, 0, 12), 9
         )
 
+    def testWorkplaneOrientationOnVertex(self):
+
+        # create a 10 unit sized cube on the XY plane
+        parent = Workplane("XY").rect(10.0, 10.0).extrude(10)
+
+        # assert that the direction tuples reflect accordingly
+        assert parent.plane.xDir.toTuple() == approx((1.0, 0.0, 0.0))
+        assert parent.plane.zDir.toTuple() == approx((0.0, 0.0, 1.0))
+
+        # select the <XZ vertex on the <Y face and create a new workplane.
+        child = parent.faces("<Y").vertices("<XZ").workplane()
+
+        # assert that the direction tuples reflect the new workplane on the <Y face
+        assert child.plane.xDir.toTuple() == approx((1.0, 0.0, -0.0))
+        assert child.plane.zDir.toTuple() == approx((0.0, -1.0, -0.0))
+
     def testTagSelectors(self):
 
         result0 = Workplane("XY").box(1, 1, 1).tag("box").sphere(1)