diff --git a/grudge/symbolic/mappers/__init__.py b/grudge/symbolic/mappers/__init__.py
index 14fea40a18c1edf788ee660d80a479a12a3e4bfa..32ad7b8c87419ef21c686247131017ee984f6da7 100644
--- a/grudge/symbolic/mappers/__init__.py
+++ b/grudge/symbolic/mappers/__init__.py
@@ -25,6 +25,8 @@ THE SOFTWARE.
 """
 
 
+import six
+
 import numpy as np
 import pymbolic.primitives
 import pymbolic.mapper.stringifier
@@ -1135,7 +1137,7 @@ class _InnerDerivativeJoiner(pymbolic.mapper.RecursiveMapper):
                 else:
                     return self.rec(expr, derivatives)
 
-            for operator, operands in sub_derivatives.iteritems():
+            for operator, operands in six.iteritem(sub_derivatives):
                 for operand in operands:
                     derivatives.setdefault(operator, []).append(
                             factor*operand)
@@ -1185,7 +1187,7 @@ class DerivativeJoiner(CSECachingMapperMixin, IdentityMapper):
             if not sub_derivatives:
                 return expr
             else:
-                for operator, operands in sub_derivatives.iteritems():
+                for operator, operands in six.iteritems(sub_derivatives):
                     derivatives.setdefault(operator, []).extend(operands)
 
                 return result
@@ -1194,7 +1196,7 @@ class DerivativeJoiner(CSECachingMapperMixin, IdentityMapper):
         new_children = [invoke_idj(child)
                 for child in expr.children]
 
-        for operator, operands in derivatives.iteritems():
+        for operator, operands in six.iteritems(derivatives):
             new_children.insert(0, operator(
                 sum(self.rec(operand) for operand in operands)))
 
diff --git a/grudge/symbolic/mappers/type_inference.py b/grudge/symbolic/mappers/type_inference.py
index 0d77d71a1268a0271ac1e7e69923be7766aeac00..a90d4348a455b07a95d78f7877f3f1f210dcb77a 100644
--- a/grudge/symbolic/mappers/type_inference.py
+++ b/grudge/symbolic/mappers/type_inference.py
@@ -24,6 +24,7 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
 THE SOFTWARE.
 """
 
+import six
 import pymbolic.mapper
 from grudge import sym
 
@@ -348,8 +349,10 @@ class TypeDict(object):
                 self.change_flag = True
                 self.container[expr] = tp
 
-    def iteritems(self):
-        return self.container.iteritems()
+    def items(self):
+        return six.iteritems(self.container)
+
+    iteritems = items
 
 # }}}
 
@@ -380,7 +383,7 @@ class TypeInferrer(pymbolic.mapper.RecursiveMapper):
                 break
 
         # check that type inference completed successfully
-        for expr, tp in typedict.iteritems():
+        for expr, tp in six.iteritems(typedict):
             if not isinstance(tp, type_info.FinalType):
                 raise RuntimeError("type inference was unable to deduce "
                         "complete type information for '%s' (only '%s')"
diff --git a/grudge/symbolic/operators.py b/grudge/symbolic/operators.py
index 923092142e1d7ecf7ee11d596aced56d32c79054..58a093f705198231b889d696c7593d570034bf23 100644
--- a/grudge/symbolic/operators.py
+++ b/grudge/symbolic/operators.py
@@ -1,7 +1,6 @@
 """Building blocks and mappers for operator expression trees."""
 
-from __future__ import division
-from __future__ import absolute_import
+from __future__ import division, absolute_import
 
 __copyright__ = "Copyright (C) 2008 Andreas Kloeckner"
 
@@ -25,6 +24,7 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
 THE SOFTWARE.
 """
 
+from six.moves import intern
 
 import numpy as np
 import numpy.linalg as la