diff --git a/grudge/eager.py b/grudge/eager.py
index 566f3cd1ab6acd8f078e878500bcd27ca3651825..87368161e5045b2a7c1b508b89cf60ebb336053a 100644
--- a/grudge/eager.py
+++ b/grudge/eager.py
@@ -162,25 +162,32 @@ class EagerDGDiscretization(DGDiscretizationWithBoundaries):
         return self._bound_face_mass(dd)(u=vec)
 
     @memoize_method
-    def _norm(self, p):
-        return bind(self, sym.norm(p, sym.var("arg")), local_only=True)
+    def _norm(self, p, dd):
+        return bind(self,
+                sym.norm(p, sym.var("arg", dd=dd), dd=dd),
+                local_only=True)
+
+    def norm(self, vec, p=2, dd=None):
+        if dd is None:
+            dd = "vol"
+
+        dd = sym.as_dofdesc(dd)
 
-    def norm(self, vec, p=2):
         if (isinstance(vec, np.ndarray)
                 and vec.dtype.char == "O"
                 and not isinstance(vec, DOFArray)):
             if p == 2:
                 return sum(
-                        self.norm(vec[idx])**2
+                        self.norm(vec[idx], dd=dd)**2
                         for idx in np.ndindex(vec.shape))**0.5
             elif p == np.inf:
                 return max(
-                        self.norm(vec[idx], np.inf)
+                        self.norm(vec[idx], np.inf, dd=dd)
                         for idx in np.ndindex(vec.shape))
             else:
                 raise ValueError("unsupported norm order")
 
-        return self._norm(p)(arg=vec)
+        return self._norm(p, dd)(arg=vec)
 
     @memoize_method
     def _nodal_reduction(self, operator, dd):