     */
    AugmentSendList *_augment_send_list;
  
+@@ -1145,14 +1152,75 @@
+ 
+ // ------------------------------------------------------------
+ // Dof Map inline member functions
+-
+ inline
+ unsigned int DofMap::sys_number() const
+ {
+   return _sys_number;
+ }
+ 
++
++
+ inline
++const VariableGroup & DofMap::variable_group (const unsigned int g) const
++{
++  libmesh_assert_less (g, _variable_groups.size());
++
++  return _variable_groups[g];
++}
++
++
++
++inline
++const Variable & DofMap::variable (const unsigned int c) const
++{
++  libmesh_assert_less (c, _variables.size());
++
++  return _variables[c];
++}
++
++
++
++inline
++Order DofMap::variable_order (const unsigned int c) const
++{
++  libmesh_assert_less (c, _variables.size());
++
++  return _variables[c].type().order;
++}
++
++
++
++inline
++Order DofMap::variable_group_order (const unsigned int vg) const
++{
++  libmesh_assert_less (vg, _variable_groups.size());
++
++  return _variable_groups[vg].type().order;
++}
++
++
++
++inline
++const FEType& DofMap::variable_type (const unsigned int c) const
++{
++  libmesh_assert_less (c, _variables.size());
++
++  return _variables[c].type();
++}
++
++
++
++inline
++const FEType& DofMap::variable_group_type (const unsigned int vg) const
++{
++  libmesh_assert_less (vg, _variable_groups.size());
++
++  return _variable_groups[vg].type();
++}
++
++
++
++inline
+ bool DofMap::is_constrained_node (const Node*
+ #ifdef LIBMESH_ENABLE_NODE_CONSTRAINTS
+ node
 Index: include/base/variable.h
 ===================================================================
---- include/base/variable.h	(revision 6500)
+--- include/base/variable.h	(revision 6517)
 +++ include/base/variable.h	(working copy)
 @@ -109,7 +109,7 @@
     * empty \p _active_subdomains container as active everywhere, i.e.

   //-------------------------------------------------------------------------
   // First count and assign temporary numbers to local dofs
   MeshBase::element_iterator       elem_it  = mesh.active_local_elements_begin();
@@ -1085,15 +1104,10 @@
   // We now only add remote dofs to the _send_list
   // unsigned int send_list_size = 0;
 
-  // We will cache the first local index for each variable
-  _var_first_local_df.clear();
-
   //-------------------------------------------------------------------------
   // First count and assign temporary numbers to local dofs
   for (unsigned var=0; var<n_vars; var++)
     {
-      _var_first_local_df.push_back(next_free_dof);
-
       const Variable var_description = this->variable(var);
 
       // Skip the SCALAR dofs
@@ -1198,9 +1212,6 @@
   if ( libMesh::processor_id() == (libMesh::n_processors()-1) )
     next_free_dof += _n_SCALAR_dofs;
 

-      for (unsigned int v=0; v<nvars; v++)
-	this->set_n_comp(s,v,0);
+      for (unsigned int vg=0; vg<nvg; vg++)
+	{
+	  this->set_n_comp(s,vg,0);
+	  libmesh_assert_equal_to (this->n_vars(s,vg), nvpg[vg]);
+	}
       return;
     }
 
@@ -226,13 +245,13 @@
   old_system_sizes.reserve(this->n_systems());
 
   for (unsigned int s_ctr=0; s_ctr<this->n_systems(); s_ctr++)
