diff --git a/grudge/op.py b/grudge/op.py
index 1853da059c0b7b58127e129d1cf9c242b8c69dc4..50b96ec9ea9c058a2a59960fcab6636c3a8335c9 100644
--- a/grudge/op.py
+++ b/grudge/op.py
@@ -334,8 +334,9 @@ def reference_mass_matrix(actx, out_element_group, in_element_group):
     def get_ref_mass_mat(out_grp, in_grp):
         if out_grp == in_grp:
             from meshmode.discretization.poly_element import mass_matrix
+
             return actx.freeze(
-                actx.from_numpy(mass_matrix(in_grp))
+                actx.from_numpy(mass_matrix(out_grp))
             )
 
         from modepy import vandermonde
@@ -355,30 +356,59 @@ def reference_mass_matrix(actx, out_element_group, in_element_group):
 
 
 def _apply_mass_operator(dcoll, dd_out, dd_in, vec):
+    from grudge.geometry import area_element
+
+    import numpy as np
+
     in_discr = dcoll.discr_from_dd(dd_in)
     out_discr = dcoll.discr_from_dd(dd_out)
 
     actx = vec.array_context
-    area_elements = in_discr.zeros(actx)  # FIXME *cough*
-    return DOFArray(actx,
-            tuple(
-                actx.einsum("ij,ej,ej->ei",
-                    reference_mass_matrix(actx,
-                        out_element_group=out_grp,
-                        in_element_group=in_grp),
-                    ae_i, vec_i,
-                    arg_names=("mass_mat", "jac_det", "vec"),
-                    tagged=(MassOperatorTag(),))
-
-                for in_grp, out_grp, ae_i, vec_i in zip(
-                    in_discr.groups, out_discr.groups,
-                    area_elements, vec)))
+    area_elements = area_element(actx, dcoll, dd=dd_in)
+
+    data = []
+    for in_grp, out_grp, ae_i, vec_i in zip(
+        in_discr.groups, out_discr.groups, area_elements, vec):
+
+        ref_mass = reference_mass_matrix(actx,
+                                         out_element_group=out_grp,
+                                         in_element_group=in_grp)
+        numpy_mass = actx.to_numpy(ref_mass)
+        numpy_aei = actx.to_numpy(ae_i)
+        numpy_veci = actx.to_numpy(vec_i)
+        result = np.einsum("ij,ej,ej->ei", numpy_mass, numpy_aei, numpy_veci)
+        # result = actx.einsum("ij,ej,ej->ei",
+        #                      ref_mass,
+        #                      ae_i,
+        #                      vec_i,
+        #                      arg_names=("mass_mat", "jac_det", "vec"),
+        #                      tagged=(MassOperatorTag(),))
+        data.append(actx.from_numpy(result))
+    #import pdb; pdb.set_trace()
+    return DOFArray(actx, data=tuple(data))
+    # return DOFArray(
+    #     actx,
+    #     tuple(actx.einsum("ij,ej,ej->ei",
+    #                       reference_mass_matrix(
+    #                           actx,
+    #                           out_element_group=out_grp,
+    #                           in_element_group=in_grp
+    #                       ),
+    #                       ae_i,
+    #                       vec_i,
+    #                       arg_names=("mass_mat", "jac_det", "vec"),
+    #                       tagged=(MassOperatorTag(),))
+
+    #           for in_grp, out_grp, ae_i, vec_i in zip(
+    #               in_discr.groups, out_discr.groups, area_elements, vec)
+    #     )
+    # )
 
 
 def mass_operator(dcoll, *args):
     if len(args) == 1:
         vec, = args
-        dd = sym.DOFDesc("vol", sym.QTAG_NONE)
+        dd = dof_desc.DOFDesc("vol", dof_desc.QTAG_NONE)
     elif len(args) == 2:
         dd, vec = args
     else:
@@ -389,12 +419,7 @@ def mass_operator(dcoll, *args):
             lambda el: mass_operator(dcoll, dd, el), vec
         )
 
-    dd_in = dd
-    del dd
-    from grudge.dof_desc import QTAG_NONE
-    dd_out = dd_in.with_qtag(QTAG_NONE)
-
-    return _apply_mass_operator(dcoll, dd_out, dd_in, vec)
+    return _apply_mass_operator(dcoll, dof_desc.DD_VOLUME, dd, vec)
 
 
 @memoize_on_first_arg
diff --git a/test/test_new_world_grudge.py b/test/test_new_world_grudge.py
index 87bbf28f4f994bebb31da56c66290c79a1b5a1d5..0a97b0ce3c20f955b3b345a70a39ec0fa339bd94 100644
--- a/test/test_new_world_grudge.py
+++ b/test/test_new_world_grudge.py
@@ -97,8 +97,6 @@ def test_mass_mat_trig(actx_factory, ambient_dim, quad_tag):
     f_quad = f(x_quad)
     ones_quad = quad_disc.zeros(actx) + 1
 
-    #mass_op = bind(discr, dof_desc.MassOperator(dd_quad, dof_desc.DD_VOLUME)(sym_f))
-
     mop = op.mass_operator(dcoll, dd_quad, f_quad)
     num_integral_1 = np.dot(
             actx.to_numpy(flatten(ones_volm)),