diff --git a/grudge/symbolic/primitives.py b/grudge/symbolic/primitives.py
index ace6d42b442696b85fd4baa46d2815a3dc814b80..0db0a8908a2b9647c87e15046480de8d3904fbe5 100644
--- a/grudge/symbolic/primitives.py
+++ b/grudge/symbolic/primitives.py
@@ -587,8 +587,10 @@ def mv_normal(dd, ambient_dim, dim=None):
             pseudoscalar(ambient_dim, dim, dd=dd)
             /
             area_element(ambient_dim, dim, dd=dd))
-    return cse(pder.I | pder, "normal",
-            cse_scope.DISCRETIZATION)
+    return cse(
+            # Dorst Section 3.7.2
+            pder << pder.I.inv(),
+            "normal", cse_scope.DISCRETIZATION)
 
 
 def normal(dd, ambient_dim, dim=None, quadrature_tag=None):