diff --git a/meshmode/discretization/__init__.py b/meshmode/discretization/__init__.py
index 45fdc22e4b64f93dfd8c04f34d0e5d29cbecf7a6..6da392cae8b58022cf3efd72b3e710fd980b57f5 100644
--- a/meshmode/discretization/__init__.py
+++ b/meshmode/discretization/__init__.py
@@ -37,6 +37,10 @@ __doc__ = """
 
 # {{{ element group base
 
+class NoninterpolatoryElementGroupError(TypeError):
+    pass
+
+
 class ElementGroupBase(object):
     """Container for the :class:`Discretization` data corresponding to
     one :class:`meshmode.mesh.MeshElementGroup`.
diff --git a/meshmode/discretization/connection/__init__.py b/meshmode/discretization/connection/__init__.py
index c0b622d0afbbf1d2647e218ab45808ad5c291898..bdb0f5250256ad6e8a67a10d9b735c3ff085da4b 100644
--- a/meshmode/discretization/connection/__init__.py
+++ b/meshmode/discretization/connection/__init__.py
@@ -156,7 +156,7 @@ class DiscretizationConnectionElementGroup(object):
 # }}}
 
 
-# {{{ connection class
+# {{{ connection classes
 
 class DiscretizationConnection(object):
     """Abstract interface for transporting a DOF vector from one
@@ -266,6 +266,14 @@ class DirectDiscretizationConnection(DiscretizationConnection):
         ibatch = self.groups[to_group_index].batches[ibatch_index]
         from_grp = self.from_discr.groups[ibatch.from_group_index]
 
+        if len(from_grp.basis()) != from_grp.unit_nodes.shape[1]:
+            from meshmode.discretization import NoninterpolatoryElementGroupError
+            raise NoninterpolatoryElementGroupError(
+                    "%s does not support interpolation because it is not "
+                    "unisolvent (its unit node count does not match its "
+                    "number of basis functions). Using connections requires "
+                    "the ability to interpolate." % type(from_grp).__name__)
+
         result = mp.resampling_matrix(
                 from_grp.basis(),
                 ibatch.result_unit_nodes, from_grp.unit_nodes)
diff --git a/meshmode/discretization/poly_element.py b/meshmode/discretization/poly_element.py
index 54aaabef97ac5f9bfc97b642ebe1a476608e0603..f509a911bdaca5d8a07b4c4a4585da89fc403cd0 100644
--- a/meshmode/discretization/poly_element.py
+++ b/meshmode/discretization/poly_element.py
@@ -80,6 +80,14 @@ class PolynomialSimplexElementGroupBase(ElementGroupBase):
 
     @memoize_method
     def diff_matrices(self):
+        if len(self.basis()) != self.unit_nodes.shape[1]:
+            from meshmode.discretization import NoninterpolatoryElementGroupError
+            raise NoninterpolatoryElementGroupError(
+                    "%s does not support interpolation because it is not "
+                    "unisolvent (its unit node count does not match its "
+                    "number of basis functions). Differentiation requires "
+                    "the ability to interpolate." % type(self).__name__)
+
         result = mp.differentiation_matrices(
                 self.basis(),
                 self.grad_basis(),