diff --git a/openfpm_data b/openfpm_data
index 20abc8eed3bca0ffc5055c7c8fad6c95a484ffc1..0f8108a0eba32e0249341040a5e127c3f5a7047e 160000
--- a/openfpm_data
+++ b/openfpm_data
@@ -1 +1 @@
-Subproject commit 20abc8eed3bca0ffc5055c7c8fad6c95a484ffc1
+Subproject commit 0f8108a0eba32e0249341040a5e127c3f5a7047e
diff --git a/src/Grid/grid_dist_id.hpp b/src/Grid/grid_dist_id.hpp
index d24ea783e4c5479637a93031d13b4f3556e0bd03..3931d5880c806ddc80e41cd9176e2ee98ce58a8c 100644
--- a/src/Grid/grid_dist_id.hpp
+++ b/src/Grid/grid_dist_id.hpp
@@ -415,8 +415,54 @@ class grid_dist_id
 		vtk_box1.write(output + std::string("internal_ghost_") + std::to_string(v_cl.getProcessUnitID()) + std::string(".vtk"));
 	}
 
+protected:
+
+	/*! \brief Get the i sub-domain grid
+	 *
+	 * \param i sub-domain
+	 *
+	 * \return local grid
+	 *
+	 */
+	device_grid & get_loc_grid(size_t i)
+	{
+		return loc_grid.get(i);
+	}
+
+	/*! \brief Return the number of local grid
+	 *
+	 * \return the number of local grid
+	 *
+	 */
+	size_t getN_loc_grid()
+	{
+		return loc_grid.size();
+	}
+
+	/*! \brief Get the point where it start the origin of the grid in the sub-domain i
+	 *
+	 * \return the point
+	 *
+	 */
+	Point<dim,St> getOffset(size_t i)
+	{
+		return Point<dim,St>(gdb_ext.get(i).origin) * cd_sm.getCellBox().getP2();
+	}
+
+	/*! \brief Given a local sub-domain i with a local grid Domain + ghost return the part of the local grid that is domain
+	 *
+	 * \return the Box defining the domain in the local grid
+	 *
+	 */
+	Box<dim,size_t> getDomain(size_t i)
+	{
+		return gdb_ext.get(i).Dbox;
+	}
+
 public:
 
+	typedef device_grid loc_grid_type;
+
 	/*! \brief Constrcuctor
 	 *
 	 * \param g_sz array with the grid size on each dimension
@@ -936,7 +982,7 @@ public:
 		VTKWriter<boost::mpl::pair<device_grid,float>,VECTOR_GRIDS> vtk_g;
 		for (size_t i = 0 ; i < loc_grid.size() ; i++)
 		{
-			Point<dim,St> offset = Point<dim,St>(gdb_ext.get(i).origin) * cd_sm.getCellBox().getP2();
+			Point<dim,St> offset = getOffset(i);
 			vtk_g.add(loc_grid.get(i),offset,cd_sm.getCellBox().getP2(),gdb_ext.get(i).Dbox);
 		}
 		vtk_g.write(output + "/grid_" + std::to_string(v_cl.getProcessUnitID()) + ".vtk");
@@ -945,32 +991,6 @@ public:
 
 		return true;
 	}
-
-	/*! \brief Write the distributed grid information, where each properties has a shift
-	 *
-	 * * grid_X.vtk Output each local grids for each local processor X
-	 * * internal_ghost_X.vtk Internal ghost boxes in grid units for the local processor X
-	 *
-	 * \param output Directory where to put the files
-	 * \param c_prp for each property specify a positional vector
-	 * \param sp spacing
-	 *
-	 */
-	bool write(std::string output, const openfpm::vector<comb<dim>> (& c_prp)[T::max_prop], const Point<dim,St> & sp)
-	{
-		// Create a writer and write
-		VTKWriter<boost::mpl::pair<device_grid,float>,VECTOR_GRIDS> vtk_g;
-		for (size_t i = 0 ; i < loc_grid.size() ; i++)
-		{
-			Point<dim,St> offset = Point<dim,St>(gdb_ext.get(i).origin) * cd_sm.getCellBox().getP2();
-			vtk_g.add(loc_grid.get(i),offset,cd_sm.getCellBox().getP2(),gdb_ext.get(i).Dbox,sp);
-		}
-		vtk_g.write(output + "/grid_" + std::to_string(v_cl.getProcessUnitID()) + ".vtk");
-
-		write_ie_boxes(output);
-
-		return true;
-	}
 };
 
 
diff --git a/src/Grid/staggered_dist_grid.hpp b/src/Grid/staggered_dist_grid.hpp
index 231a2ff44e025d54444363f7a306c3faf2fe0f77..ad3f685569ea4e87a0e7553f33c4065f6a98504d 100644
--- a/src/Grid/staggered_dist_grid.hpp
+++ b/src/Grid/staggered_dist_grid.hpp
@@ -18,7 +18,8 @@
  * \param dim Dimensionality of the staggered grid
  * \param ele elements object on each dimensional objects, must be a stag_elements
  *
- *
+ * \verbatim
+
 		+--#--+--#--+--#--+--#--+--#--+--#--+
 		|     |     |     |     |     |     |
 		#  *  #  *  #  *  #  *  #  *  #  *  #
@@ -41,6 +42,8 @@
 		|     |     |     |     |     |     |
 		+--#--+--#--+--#--+--#--+--#--+--#--+
 
+\endverbatim
+
 		In the case of a 2D staggered grid we have 3 (in general dim+1 ) elements
 
 		+ = vertex
@@ -61,6 +64,8 @@ class staggered_grid_dist : public grid_dist_id<dim,St,T,Decomposition,Memory,de
 
 public:
 
+	typedef T value_type;
+
 	staggered_grid_dist(const size_t (& g_sz)[dim], const Box<dim,St> & domain, const Ghost<dim,St> & ghost)
 	:grid_dist_id<dim,St,T,Decomposition,Memory,device_grid>(g_sz,domain,ghost)
 	{}
@@ -99,11 +104,16 @@ public:
 	 */
 	void write(std::string str)
 	{
+		stag_create_and_add_grid<dim,staggered_grid_dist<dim,St,T,Decomposition,Memory,device_grid>,St> sgw(*this);
+
+		boost::mpl::for_each_ref< boost::mpl::range_c<int,0,T::max_prop> >(sgw);
 		// spacing
-		Point<dim,St> spacing = grid_dist_id<dim,St,T,Decomposition,Memory,device_grid>::getSpacing();
+/*		Point<dim,St> spacing = grid_dist_id<dim,St,T,Decomposition,Memory,device_grid>::getSpacing();
 		spacing = spacing / 2;
-		grid_dist_id<dim,St,T,Decomposition,Memory,device_grid>::write(str,c_prp,spacing);
+		grid_dist_id<dim,St,T,Decomposition,Memory,device_grid>::write(str,c_prp,spacing);*/
 	}
+
+	friend class stag_create_and_add_grid<dim,staggered_grid_dist<dim,St,T,Decomposition,Memory,device_grid>,St>;
 };
 
 #endif /* SRC_GRID_STAGGERED_DIST_GRID_HPP_ */
diff --git a/src/Grid/staggered_dist_grid_util.hpp b/src/Grid/staggered_dist_grid_util.hpp
index 969f74dfcae2c43fe450266a83594232bb7dd3e3..ee1030827d59764d7ca1ff684f0f82ac7d46684c 100644
--- a/src/Grid/staggered_dist_grid_util.hpp
+++ b/src/Grid/staggered_dist_grid_util.hpp
@@ -9,6 +9,7 @@
 #define SRC_GRID_STAGGERED_DIST_GRID_UTIL_HPP_
 
 #include "util/common.hpp"
+#include "VTKWriter.hpp"
 
 /*! \brief Classes to get the number of components of the properties
  *
@@ -266,7 +267,6 @@ public:
 	}
 };
 
-
 ///////////////////// Staggered default positioning ////////////////////////
 
 /*! \brief this class is a functor for "for_each" algorithm
@@ -347,4 +347,129 @@ public:
 	}
 };
 
+/*! \brief It create separated grid for each properties to write them into a file
+ *
+ * \tparam dim dimensionality of the grids
+ * \tparam obj type object to print, must be in OpenFPM format
+ *
+ */
+template<unsigned int dim, typename st_grid, typename St>
+class stag_create_and_add_grid
+{
+
+	// staggered grid to write
+	st_grid & st_g;
+
+public:
+
+	/*! \brief Constructor
+	 *
+	 * \param st_g staggered grid
+	 *
+	 */
+	stag_create_and_add_grid(st_grid & st_g)
+	:st_g(st_g)
+	{}
+
+	template<unsigned int p_val> void out_normal()
+	{
+		// property type
+		typedef typename boost::mpl::at< typename st_grid::value_type::type , typename boost::mpl::int_<p_val> >::type ele;
+
+		// create an openfpm format object from the property type
+		typedef object<typename boost::fusion::vector<ele>> d_object;
+
+		VTKWriter<boost::mpl::pair<grid_cpu<dim, d_object >,St>,VECTOR_GRIDS> vtk_w;
+
+		// Create a vector of grids
+
+		openfpm::vector< grid_cpu<dim, d_object > > vg(st_g.getN_loc_grid());
+
+		// for each domain grid
+		for (size_t i = 0 ; i < vg.size() ; i++)
+		{
+			// Set dimansions and memory
+			vg.get(i).template resize<HeapMemory>(st_g.get_loc_grid(i).getGrid().getSize());
+
+			// create the Memory
+			vg.get(i).template setMemory<HeapMemory>();
+
+			auto g_src = st_g.get_loc_grid(i);
+			auto g_dst = vg.get(i);
+
+			auto it = vg.get(i).getIterator();
+
+			while(it.isNext())
+			{
+				object_si_d< decltype(g_src.get_o(it.get())),decltype(g_dst.get_o(it.get())) ,ENCAP,T::value>(g_src.get_o(it.get()),g_dst.get_o(it.get()));
+
+				++it;
+			}
+
+			Point<dim,St> offset = st_g.getOffset(i);
+			Point<dim,St> spacing = st_g.getSpacing();
+			Box<dim,size_t> dom = st_g.getDomain(i);
+
+			vtk_w.add(g_dst,offset,spacing,dom);
+		}
+
+		vtk_w.write("vtk_grids_st_" + std::to_string(T::value) + ".vtk");
+	}
+
+	template<unsigned int p_val> void out_staggered()
+	{
+		// property type
+		typedef typename boost::mpl::at< typename st_grid::value_type::type , typename boost::mpl::int_<p_val> >::type ele;
+
+		// create an openfpm format object from the property type
+		typedef object<typename boost::fusion::vector<ele>> d_object;
+
+		VTKWriter<boost::mpl::pair<grid_cpu<dim, d_object >,St>,VECTOR_GRIDS> vtk_w;
+
+		// Create a vector of grids
+
+		openfpm::vector< grid_cpu<dim, d_object > > vg(st_g.getN_loc_grid());
+
+		// for each domain grid
+		for (size_t i = 0 ; i < vg.size() ; i++)
+		{
+			// Set dimansions and memory
+			vg.get(i).template resize<HeapMemory>(st_g.get_loc_grid(i).getGrid().getSize());
+
+			// create the Memory
+			vg.get(i).template setMemory<HeapMemory>();
+
+			auto g_src = st_g.get_loc_grid(i);
+			auto g_dst = vg.get(i);
+
+			auto it = vg.get(i).getIterator();
+
+			while(it.isNext())
+			{
+				object_si_d< decltype(g_src.get_o(it.get())),decltype(g_dst.get_o(it.get())) ,ENCAP,T::value>(g_src.get_o(it.get()),g_dst.get_o(it.get()));
+
+				++it;
+			}
+
+			Point<dim,St> offset = st_g.getOffset(i);
+			Point<dim,St> spacing = st_g.getSpacing();
+			Box<dim,size_t> dom = st_g.getDomain(i);
+
+			vtk_w.add(g_dst,offset,spacing,dom);
+		}
+
+		vtk_w.write("vtk_grids_st_" + std::to_string(T::value) + ".vtk");
+	}
+
+	//! It call the copy function for each property
+	template<typename T>
+	void operator()(T& t)
+	{
+		if (st_g.is_staggered_prop(T::value) == false)
+			out_normal<T::value>();
+		else
+			out_staggered<T::value>();
+	}
+};
+
 #endif /* SRC_GRID_STAGGERED_DIST_GRID_UTIL_HPP_ */
diff --git a/src/Grid/staggered_grid_dist_unit_test.hpp b/src/Grid/staggered_grid_dist_unit_test.hpp
new file mode 100644
index 0000000000000000000000000000000000000000..c79392b3533aab5704043cf77255289372f1a470
--- /dev/null
+++ b/src/Grid/staggered_grid_dist_unit_test.hpp
@@ -0,0 +1,69 @@
+/*
+ * staggered_grid_unit_test.hpp
+ *
+ *  Created on: Aug 20, 2015
+ *      Author: i-bird
+ */
+
+#ifndef SRC_GRID_STAGGERED_GRID_DIST_UNIT_TEST_HPP_
+#define SRC_GRID_STAGGERED_GRID_DIST_UNIT_TEST_HPP_
+
+#include "staggered_dist_grid.hpp"
+#include "Point_test.hpp"
+
+BOOST_AUTO_TEST_SUITE( staggered_grid_dist_id_test )
+
+
+BOOST_AUTO_TEST_CASE( staggered_grid_dist_unit_test)
+{
+	typedef Point2D_test<float> p;
+
+	Vcluster & v_cl = *global_v_cluster;
+
+	// Domain
+	Box<2,float> domain({0.0,0.0},{1.0,1.0});
+
+	for (size_t k = 1024 ; k >= 2 ; k--)
+	{
+		BOOST_TEST_CHECKPOINT( "Testing grid k=" << k );
+
+		// grid size
+		size_t sz[2];
+		sz[0] = k;
+		sz[1] = k;
+
+		// Ghost
+		Ghost<2,float> g(0.01);
+
+		staggered_grid_dist<2,float,Point2D_test<float>,CartDecomposition<2,float>> sg(sz,domain,g);
+
+		sg.setDefaultStagPosition();
+
+		auto it = sg.getDomainIterator();
+
+		while (it.isNext())
+		{
+			auto key = it.get();
+
+			grid_key_dx<2> keyg = sg.getGKey(key);
+
+			sg.template get<p::s>(key) = keyg.get(0);
+
+			sg.template get<p::v>(key)[0] = keyg.get(0);
+			sg.template get<p::v>(key)[1] = keyg.get(1);
+
+			sg.template get<p::t>(key)[0][0] = keyg.get(0);
+			sg.template get<p::t>(key)[0][1] = keyg.get(1);
+			sg.template get<p::t>(key)[1][0] = keyg.get(0) + 1.0;
+			sg.template get<p::t>(key)[1][1] = keyg.get(1) + 7.0;
+
+			++it;
+		}
+
+		sg.write("stag_test.vtk");
+	}
+}
+
+BOOST_AUTO_TEST_SUITE_END()
+
+#endif /* SRC_GRID_STAGGERED_GRID_DIST_UNIT_TEST_HPP_ */