diff --git a/grudge/models/advection.py b/grudge/models/advection.py
index a9033881f1f724af153a17f3d936b9d1b4be0703..4165724b73c714ebf93da8143a833847d114ecdf 100644
--- a/grudge/models/advection.py
+++ b/grudge/models/advection.py
@@ -163,7 +163,7 @@ class WeakAdvectionOperator(AdvectionOperatorBase):
                 get_flux_operator,
                 make_stiffness_t,
                 InverseMassOperator,
-                BoundarizeOperator,
+                RestrictToBoundary,
                 QuadratureGridUpsampler,
                 QuadratureInteriorFacesGridUpsampler)
 
@@ -174,7 +174,7 @@ class WeakAdvectionOperator(AdvectionOperatorBase):
 
         # boundary conditions -------------------------------------------------
         bc_in = Field("bc_in")
-        bc_out = BoundarizeOperator(self.outflow_tag)*u
+        bc_out = RestrictToBoundary(self.outflow_tag)*u
 
         stiff_t = make_stiffness_t(self.dimensions)
         m_inv = InverseMassOperator()
@@ -281,7 +281,7 @@ class VariableCoefficientAdvectionOperator(HyperbolicOperator):
         # {{{ operator preliminaries ------------------------------------------
         from grudge.symbolic import (Field, BoundaryPair, get_flux_operator,
                 make_stiffness_t, InverseMassOperator, make_sym_vector,
-                ElementwiseMaxOperator, BoundarizeOperator)
+                ElementwiseMaxOperator, RestrictToBoundary)
 
         from grudge.symbolic.primitives import make_common_subexpression as cse
 
@@ -309,9 +309,9 @@ class VariableCoefficientAdvectionOperator(HyperbolicOperator):
         # {{{ boundary conditions ---------------------------------------------
 
         from grudge.mesh import BTAG_ALL
-        bc_c = to_quad(BoundarizeOperator(BTAG_ALL)(c))
+        bc_c = to_quad(RestrictToBoundary(BTAG_ALL)(c))
         bc_u = to_quad(Field("bc_u"))
-        bc_v = to_quad(BoundarizeOperator(BTAG_ALL)(v))
+        bc_v = to_quad(RestrictToBoundary(BTAG_ALL)(v))
 
         if self.bc_u_f is "None":
             bc_w = join_fields(0, bc_v, bc_c)
diff --git a/grudge/models/em.py b/grudge/models/em.py
index e573fe68f50f7eaeaf62bf670f453eaca57146fc..3a2b70cbac3d00dab20420e060ceb073f6c1447a 100644
--- a/grudge/models/em.py
+++ b/grudge/models/em.py
@@ -227,9 +227,9 @@ class MaxwellOperator(HyperbolicOperator):
         "Construct part of the flux operator template for PEC boundary conditions"
         e, h = self.split_eh(self.field_placeholder(w))
 
-        from grudge.symbolic import BoundarizeOperator
-        pec_e = BoundarizeOperator(self.pec_tag)(e)
-        pec_h = BoundarizeOperator(self.pec_tag)(h)
+        from grudge.symbolic import RestrictToBoundary
+        pec_e = RestrictToBoundary(self.pec_tag)(e)
+        pec_h = RestrictToBoundary(self.pec_tag)(h)
 
         return join_fields(-pec_e, pec_h)
 
@@ -237,9 +237,9 @@ class MaxwellOperator(HyperbolicOperator):
         "Construct part of the flux operator template for PMC boundary conditions"
         e, h = self.split_eh(self.field_placeholder(w))
 
-        from grudge.symbolic import BoundarizeOperator
-        pmc_e = BoundarizeOperator(self.pmc_tag)(e)
-        pmc_h = BoundarizeOperator(self.pmc_tag)(h)
+        from grudge.symbolic import RestrictToBoundary
+        pmc_e = RestrictToBoundary(self.pmc_tag)(e)
+        pmc_h = RestrictToBoundary(self.pmc_tag)(h)
 
         return join_fields(pmc_e, -pmc_h)
 
@@ -251,7 +251,7 @@ class MaxwellOperator(HyperbolicOperator):
         from grudge.symbolic import normal
         absorb_normal = normal(self.absorb_tag, self.dimensions)
 
-        from grudge.symbolic import BoundarizeOperator, Field
+        from grudge.symbolic import RestrictToBoundary, Field
 
         e, h = self.split_eh(self.field_placeholder(w))
 
@@ -260,15 +260,15 @@ class MaxwellOperator(HyperbolicOperator):
             mu = self.mu
         else:
             epsilon = cse(
-                    BoundarizeOperator(self.absorb_tag)(Field("epsilon")))
+                    RestrictToBoundary(self.absorb_tag)(Field("epsilon")))
             mu = cse(
-                    BoundarizeOperator(self.absorb_tag)(Field("mu")))
+                    RestrictToBoundary(self.absorb_tag)(Field("mu")))
 
         absorb_Z = (mu/epsilon)**0.5
         absorb_Y = 1/absorb_Z
 
-        absorb_e = BoundarizeOperator(self.absorb_tag)(e)
-        absorb_h = BoundarizeOperator(self.absorb_tag)(h)
+        absorb_e = RestrictToBoundary(self.absorb_tag)(e)
+        absorb_h = RestrictToBoundary(self.absorb_tag)(h)
 
         bc = join_fields(
                 absorb_e + 1/2*(self.space_cross_h(absorb_normal, self.space_cross_e(
@@ -350,10 +350,10 @@ class MaxwellOperator(HyperbolicOperator):
             if self.fixed_material:
                 return bc
             else:
-                from grudge.symbolic import BoundarizeOperator
+                from grudge.symbolic import RestrictToBoundary
                 return join_fields(
-                        cse(BoundarizeOperator(tag)(epsilon)),
-                        cse(BoundarizeOperator(tag)(mu)),
+                        cse(RestrictToBoundary(tag)(epsilon)),
+                        cse(RestrictToBoundary(tag)(mu)),
                         bc)
 
         return (
diff --git a/grudge/models/gas_dynamics/__init__.py b/grudge/models/gas_dynamics/__init__.py
index 3262cc6fd16e957b07315685884aed0d013c5ff2..e5a8ddc9418f1bac4776f252d2951fab3d3c1a2b 100644
--- a/grudge/models/gas_dynamics/__init__.py
+++ b/grudge/models/gas_dynamics/__init__.py
@@ -498,8 +498,8 @@ class GasDynamicsOperator(TimeDependentOperator):
 
         c0 = (self.equation_of_state.gamma * p0 / rho0)**0.5
 
-        from grudge.symbolic import BoundarizeOperator
-        bdrize_op = BoundarizeOperator(tag)
+        from grudge.symbolic import RestrictToBoundary
+        bdrize_op = RestrictToBoundary(tag)
 
         class SingleBCInfo(Record):
             pass
@@ -567,8 +567,8 @@ class GasDynamicsOperator(TimeDependentOperator):
         return self.inflow_state_inner(normal, bc, "noslip")
 
     def wall_state(self, state):
-        from grudge.symbolic import BoundarizeOperator
-        bc = BoundarizeOperator(self.wall_tag)(state)
+        from grudge.symbolic import RestrictToBoundary
+        bc = RestrictToBoundary(self.wall_tag)(state)
         wall_rho = self.rho(bc)
         wall_e = self.e(bc) # <3 eve
         wall_rho_u = self.rho_u(bc)
@@ -596,12 +596,12 @@ class GasDynamicsOperator(TimeDependentOperator):
     def get_conservative_boundary_conditions(self):
         state = self.state()
 
-        from grudge.symbolic import BoundarizeOperator
+        from grudge.symbolic import RestrictToBoundary
         return {
                 self.supersonic_inflow_tag:
                 make_sym_vector("bc_q_supersonic_in", self.dimensions+2),
                 self.supersonic_outflow_tag:
-                BoundarizeOperator(self.supersonic_outflow_tag)(
+                RestrictToBoundary(self.supersonic_outflow_tag)(
                             (state)),
                 self.wall_tag: self.wall_state(state),
                 }
@@ -664,8 +664,8 @@ class GasDynamicsOperator(TimeDependentOperator):
 
                 return cbstate[expr.index]
             elif isinstance(expr, Variable) and expr.name =="sensor":
-                from grudge.symbolic import BoundarizeOperator
-                result = BoundarizeOperator(tag)(self.sensor())
+                from grudge.symbolic import RestrictToBoundary
+                result = RestrictToBoundary(tag)(self.sensor())
                 return cse(to_bdry_quad(result), "bdry_sensor")
 
         from grudge.symbolic import SubstitutionMapper
diff --git a/grudge/models/wave.py b/grudge/models/wave.py
index f016699347aaa1fe3655e0b34170a2b7ce254592..9591573e0b7cc16b2d86f4b55632b719a5e371bd 100644
--- a/grudge/models/wave.py
+++ b/grudge/models/wave.py
@@ -117,8 +117,8 @@ class StrongWaveOperator(HyperbolicOperator):
         # boundary conditions -------------------------------------------------
 
         # dirichlet BCs -------------------------------------------------------
-        dir_u = sym.BoundarizeOperator(self.dirichlet_tag) * u
-        dir_v = sym.BoundarizeOperator(self.dirichlet_tag) * v
+        dir_u = sym.RestrictToBoundary(self.dirichlet_tag) * u
+        dir_v = sym.RestrictToBoundary(self.dirichlet_tag) * v
         if self.dirichlet_bc_f:
             # FIXME
             from warnings import warn
@@ -131,15 +131,15 @@ class StrongWaveOperator(HyperbolicOperator):
             dir_bc = join_fields(-dir_u, dir_v)
 
         # neumann BCs ---------------------------------------------------------
-        neu_u = sym.BoundarizeOperator(self.neumann_tag) * u
-        neu_v = sym.BoundarizeOperator(self.neumann_tag) * v
+        neu_u = sym.RestrictToBoundary(self.neumann_tag) * u
+        neu_v = sym.RestrictToBoundary(self.neumann_tag) * v
         neu_bc = join_fields(neu_u, -neu_v)
 
         # radiation BCs -------------------------------------------------------
         rad_normal = sym.normal(self.radiation_tag, d)
 
-        rad_u = sym.BoundarizeOperator(self.radiation_tag) * u
-        rad_v = sym.BoundarizeOperator(self.radiation_tag) * v
+        rad_u = sym.RestrictToBoundary(self.radiation_tag) * u
+        rad_v = sym.RestrictToBoundary(self.radiation_tag) * v
 
         rad_bc = join_fields(
                 0.5*(rad_u - self.sign*np.dot(rad_normal, rad_v)),
@@ -274,25 +274,25 @@ class VariableVelocityStrongWaveOperator(HyperbolicOperator):
         # {{{ boundary conditions
 
         # Dirichlet
-        dir_c = sym.BoundarizeOperator(self.dirichlet_tag) * self.c
-        dir_u = sym.BoundarizeOperator(self.dirichlet_tag) * u
-        dir_v = sym.BoundarizeOperator(self.dirichlet_tag) * v
+        dir_c = sym.RestrictToBoundary(self.dirichlet_tag) * self.c
+        dir_u = sym.RestrictToBoundary(self.dirichlet_tag) * u
+        dir_v = sym.RestrictToBoundary(self.dirichlet_tag) * v
 
         dir_bc = join_fields(dir_c, -dir_u, dir_v)
 
         # Neumann
-        neu_c = sym.BoundarizeOperator(self.neumann_tag) * self.c
-        neu_u = sym.BoundarizeOperator(self.neumann_tag) * u
-        neu_v = sym.BoundarizeOperator(self.neumann_tag) * v
+        neu_c = sym.RestrictToBoundary(self.neumann_tag) * self.c
+        neu_u = sym.RestrictToBoundary(self.neumann_tag) * u
+        neu_v = sym.RestrictToBoundary(self.neumann_tag) * v
 
         neu_bc = join_fields(neu_c, neu_u, -neu_v)
 
         # Radiation
         rad_normal = sym.make_normal(self.radiation_tag, d)
 
-        rad_c = sym.BoundarizeOperator(self.radiation_tag) * self.c
-        rad_u = sym.BoundarizeOperator(self.radiation_tag) * u
-        rad_v = sym.BoundarizeOperator(self.radiation_tag) * v
+        rad_c = sym.RestrictToBoundary(self.radiation_tag) * self.c
+        rad_u = sym.RestrictToBoundary(self.radiation_tag) * u
+        rad_v = sym.RestrictToBoundary(self.radiation_tag) * v
 
         rad_bc = join_fields(
                 rad_c,
diff --git a/grudge/symbolic/mappers/__init__.py b/grudge/symbolic/mappers/__init__.py
index e47214d1b88950ae32310e1ac4437f2ec1c72358..815e624455d6421883a17d7c2703d36da47776ca 100644
--- a/grudge/symbolic/mappers/__init__.py
+++ b/grudge/symbolic/mappers/__init__.py
@@ -400,8 +400,8 @@ class OperatorSpecializer(CSECachingMapperMixin, IdentityMapper):
                 and isinstance(field_type, type_info.BoundaryVectorBase)):
             # potential shortcut:
             #if (isinstance(expr.field, OperatorBinding)
-                    #and isinstance(expr.field.op, BoundarizeOperator)):
-                #return QuadratureBoundarizeOperator(
+                    #and isinstance(expr.field.op, RestrictToBoundary)):
+                #return QuadratureRestrictToBoundary(
                         #expr.field.op.tag, expr.op.quadrature_tag)(
                                 #self.rec(expr.field.field))
 
@@ -409,8 +409,8 @@ class OperatorSpecializer(CSECachingMapperMixin, IdentityMapper):
                     expr.op.quadrature_tag, field_type.boundary_tag)(expr.field)
         # }}}
 
-        elif isinstance(expr.op, op.BoundarizeOperator) and has_quad_operand:
-            raise TypeError("BoundarizeOperator cannot be applied to "
+        elif isinstance(expr.op, op.RestrictToBoundary) and has_quad_operand:
+            raise TypeError("RestrictToBoundary cannot be applied to "
                     "quadrature-based operands--use QuadUpsample(Boundarize(...))")
 
         # {{{ flux operator specialization
@@ -806,7 +806,7 @@ class PrettyStringifyMapper(
         return "BC%d@%s" % (bc_number, self._format_btag(expr.tag))
 
     def map_operator_binding(self, expr, enclosing_prec):
-        if isinstance(expr.op, op.BoundarizeOperator):
+        if isinstance(expr.op, op.RestrictToBoundary):
             from pymbolic.mapper.stringifier import PREC_CALL, PREC_SUM
             return self.parenthesize_if_needed(
                     "%s@%s" % (
diff --git a/grudge/symbolic/mappers/bc_to_flux.py b/grudge/symbolic/mappers/bc_to_flux.py
index c3307688c584a1b6dbae79d4e997374f0e99c35c..545743698a673dd02e12c52343fdb9bfa0778837 100644
--- a/grudge/symbolic/mappers/bc_to_flux.py
+++ b/grudge/symbolic/mappers/bc_to_flux.py
@@ -43,7 +43,7 @@ class ExpensiveBoundaryOperatorDetector(CombineMapper):
         return False
 
     def map_operator_binding(self, expr):
-        if isinstance(expr.op, sym.BoundarizeOperator):
+        if isinstance(expr.op, sym.RestrictToBoundary):
             return False
 
         elif isinstance(expr.op, sym.FluxExchangeOperator):
@@ -52,7 +52,7 @@ class ExpensiveBoundaryOperatorDetector(CombineMapper):
 
         elif isinstance(expr.op, (
                 sym.QuadratureGridUpsampler,
-                sym.QuadratureBoundaryGridUpsampler)):
+                sym.QuadratureInteriorFacesGridUpsampler)):
             return True
 
         else:
@@ -204,9 +204,9 @@ class BCToFluxRewriter(CSECachingMapperMixin, IdentityMapper):
             map_subscript = map_variable
 
             def map_operator_binding(self, expr):
-                if isinstance(expr.op, sym.BoundarizeOperator):
+                if isinstance(expr.op, sym.RestrictToBoundary):
                     if expr.op.tag != bpair.tag:
-                        raise RuntimeError("BoundarizeOperator and BoundaryPair "
+                        raise RuntimeError("RestrictToBoundary and BoundaryPair "
                                 "do not agree about boundary tag: %s vs %s"
                                 % (expr.op.tag, bpair.tag))
 
@@ -218,7 +218,7 @@ class BCToFluxRewriter(CSECachingMapperMixin, IdentityMapper):
                     from grudge.mesh import TAG_RANK_BOUNDARY
                     op_tag = TAG_RANK_BOUNDARY(expr.op.rank)
                     if bpair.tag != op_tag:
-                        raise RuntimeError("BoundarizeOperator and "
+                        raise RuntimeError("RestrictToBoundary and "
                                 "FluxExchangeOperator do not agree about "
                                 "boundary tag: %s vs %s"
                                 % (op_tag, bpair.tag))
@@ -228,7 +228,7 @@ class BCToFluxRewriter(CSECachingMapperMixin, IdentityMapper):
 
                 elif isinstance(expr.op, sym.QuadratureBoundaryGridUpsampler):
                     if bpair.tag != expr.op.boundary_tag:
-                        raise RuntimeError("BoundarizeOperator "
+                        raise RuntimeError("RestrictToBoundary "
                                 "and QuadratureBoundaryGridUpsampler "
                                 "do not agree about boundary tag: %s vs %s"
                                 % (expr.op.boundary_tag, bpair.tag))
diff --git a/grudge/symbolic/mappers/type_inference.py b/grudge/symbolic/mappers/type_inference.py
index a90d4348a455b07a95d78f7877f3f1f210dcb77a..7f3c9bfec20f1e59452c1496dfc280a81b2d6f5b 100644
--- a/grudge/symbolic/mappers/type_inference.py
+++ b/grudge/symbolic/mappers/type_inference.py
@@ -506,7 +506,7 @@ class TypeInferrer(pymbolic.mapper.RecursiveMapper):
                     type_info.KnownVolume(), expr.field)
             return self.rec(expr.field, typedict)
 
-        elif isinstance(expr.op, sym.BoundarizeOperator):
+        elif isinstance(expr.op, sym.RestrictToBoundary):
             # upward propagation: argument has same rep tag as result
             typedict[expr.field] = type_info.KnownVolume().unify(
                     extract_representation(type_info), expr.field)
diff --git a/grudge/symbolic/operators.py b/grudge/symbolic/operators.py
index c5375c4f68eb0dab3e4f0aad1fa840a835e2ee64..de96dba9ecd57c15c0fdabc2f27f4fe584b4d852 100644
--- a/grudge/symbolic/operators.py
+++ b/grudge/symbolic/operators.py
@@ -427,7 +427,7 @@ class ReferenceInverseMassOperator(ReferenceMassOperatorBase):
 
 # {{{ boundary-related operators
 
-class BoundarizeOperator(Operator):
+class RestrictToBoundary(Operator):
     def __init__(self, tag):
         self.tag = tag