diff --git a/examples/wave/wave-min.py b/examples/wave/wave-min.py
index 6e2baa1bcc328af322a8e45cc1d04c2f78613a8b..bd3424bc470c58f4d9eb175e9d24af696488ccd9 100644
--- a/examples/wave/wave-min.py
+++ b/examples/wave/wave-min.py
@@ -35,7 +35,7 @@ def main(write_output=True, order=4):
     cl_ctx = cl.create_some_context()
     queue = cl.CommandQueue(cl_ctx)
 
-    dims = 3
+    dims = 2
     from meshmode.mesh.generation import generate_regular_rect_mesh
     mesh = generate_regular_rect_mesh(
             a=(-0.5,)*dims,
@@ -84,8 +84,8 @@ def main(write_output=True, order=4):
 
     # print(sym.pretty(op.sym_operator()))
     bound_op = bind(discr, op.sym_operator())
-    # print(bound_op)
-    # 1/0
+    print(bound_op)
+    1/0
 
     def rhs(t, w):
         return bound_op(queue, t=t, w=w)
diff --git a/grudge/execution.py b/grudge/execution.py
index d6725f2f7583d37aa3f4bf98f4245546828c0c76..ceb413aabe8af6100b89be678c8b8d2f16146864 100644
--- a/grudge/execution.py
+++ b/grudge/execution.py
@@ -559,6 +559,9 @@ def process_sym_operator(sym_operator, post_bind_mapper=None,
     dumper("before-global-to-reference", sym_operator)
     sym_operator = mappers.GlobalToReferenceMapper(mesh.ambient_dim)(sym_operator)
 
+    dumper("before-distributed", sym_operator)
+    sys_operator = mappers.DistributedMapper()(sym_operator)
+
     # Ordering restriction:
     #
     # - Must specialize quadrature operators before performing inverse mass
@@ -575,8 +578,6 @@ def process_sym_operator(sym_operator, post_bind_mapper=None,
     # dumper("before-derivative-join", sym_operator)
     # sym_operator = mappers.DerivativeJoiner()(sym_operator)
 
-    sys_operator = mappers.DistributedMapper()(sym_operator)
-
     dumper("process-finished", sym_operator)
 
     return sym_operator
diff --git a/grudge/symbolic/mappers/__init__.py b/grudge/symbolic/mappers/__init__.py
index ae6766281401870cfeaa70960319d9ed412a25c8..94bf9734a776236f4ff360150942b69a0297bd4c 100644
--- a/grudge/symbolic/mappers/__init__.py
+++ b/grudge/symbolic/mappers/__init__.py
@@ -147,6 +147,7 @@ class OperatorReducerMixin(LocalOpReducerMixin, FluxOpReducerMixin):
     map_ref_mass = _map_op_base
     map_ref_inverse_mass = _map_op_base
 
+    map_opposite_rank_face_swap = _map_op_base
     map_opposite_interior_face_swap = _map_op_base
     map_face_mass_operator = _map_op_base
     map_ref_face_mass_operator = _map_op_base
@@ -195,6 +196,7 @@ class IdentityMapperMixin(LocalOpReducerMixin, FluxOpReducerMixin):
     map_ref_mass = map_elementwise_linear
     map_ref_inverse_mass = map_elementwise_linear
 
+    map_opposite_rank_face_swap = map_elementwise_linear
     map_opposite_interior_face_swap = map_elementwise_linear
     map_face_mass_operator = map_elementwise_linear
     map_ref_face_mass_operator = map_elementwise_linear
@@ -338,8 +340,7 @@ class DistributedMapper(CSECachingMapperMixin, IdentityMapper):
 
     def map_operator_binding(self, expr):
         if isinstance(expr.op, op.OppositeInteriorFaceSwap):
-            return 42
-            # return expr.op + op.OppositeRankFaceSwap()(self.rec(expr.field))
+            return op.OppositeRankFaceSwap()(self.rec(expr.field))
         else:
             return IdentityMapper.map_operator_binding(self, expr)
 
@@ -683,6 +684,9 @@ class StringifyMapper(pymbolic.mapper.stringifier.StringifyMapper):
     def map_ref_face_mass_operator(self, expr, enclosing_prec):
         return "RefFaceM" + self._format_op_dd(expr)
 
+    def map_opposite_rank_face_swap(self, expr, enclosing_prec):
+        return "RankSwap" + self._format_op_dd(expr)
+
     def map_opposite_interior_face_swap(self, expr, enclosing_prec):
         return "OppSwap" + self._format_op_dd(expr)