 +
 +  //---------------------------------
 +  // Collect the values for all objects
-+  unsigned int first_object=0, last_object=0;
-+
-+  for (unsigned int blk=0; last_object<n_objects; blk++)
++  for (unsigned int blk=0; blk<num_blks; blk++)
 +    {
-+      libMesh::out << "Writing object block " << blk << std::endl;
++      //libMesh::out << "Writing object block " << blk << std::endl;
 +
 +      libmesh_assert_less (blk, num_blks);
 +
 +      // Each processor should build up its transfer buffers for its
 +      // local objects in [first_object,last_object).
-+      first_object = blk*io_blksize;
-+      last_object  = std::min((blk+1)*io_blksize,n_objects);
++      const unsigned int 
++	first_object = blk*io_blksize,
++	last_object  = std::min((blk+1)*io_blksize,n_objects);
 +
 +      // convenience
 +      std::vector<unsigned int> &ids  (xfer_ids[blk]);

 
 	  // set up the comment
 	  if (libMesh::processor_id() == 0)
@@ -1632,6 +1692,43 @@
 	    }
 	}
     }

+
+  std::vector<std::vector<unsigned int> > xfer_ids(num_blks);      // The global IDs and # of components for the local objects in all blocks
+  std::vector<std::vector<Number> >       xfer_vals(num_blks);     // The raw values for the local objects in all blocks
+  std::vector<Parallel::Request>
+    id_requests(num_blks), val_requests(num_blks);                 // send request handle for each block
+  
+  // ------------------------------------------------------
+  // First pass - count the number of objects in each block
+  // traverse all the objects and figure out which block they
