diff --git a/meshmode/mesh/io.py b/meshmode/mesh/io.py
index f3cdaea853d0f9441d7d463f2155ba8d95004d1e..f4d7acc88bdfd9e526f4f495f0c061f470ff047c 100644
--- a/meshmode/mesh/io.py
+++ b/meshmode/mesh/io.py
@@ -177,9 +177,20 @@ class GmshMeshReceiver(GmshMeshReceiverBase):
                             np.ones(ngroup_elements, np.bool))
 
             elif isinstance(group_el_type, GmshTensorProductElementBase):
+                gmsh_vertex_tuples = type(group_el_type)(order=1).gmsh_node_tuples()
+                gmsh_vertex_tuples_loc_dict = dict(
+                        (gvt, i)
+                        for i, gvt in enumerate(gmsh_vertex_tuples))
+
+                from pytools import (
+                        generate_nonnegative_integer_tuples_below as gnitb)
+                vertex_shuffle = np.array([
+                    gmsh_vertex_tuples_loc_dict[vt]
+                    for vt in gnitb(2, group_el_type.dimensions)])
+
                 group = TensorProductElementGroup(
                     group_el_type.order,
-                    vertex_indices,
+                    vertex_indices[:, vertex_shuffle],
                     nodes,
                     unit_nodes=unit_nodes
                     )