diff --git a/src/Vector/vector_dist_comm.hpp b/src/Vector/vector_dist_comm.hpp
index 3b5e58ddf0f47b1f6bcb9ceeb700d39ae812636e..5a666ca24c0da29b45336962c1a1d9f7169bf8e5 100644
--- a/src/Vector/vector_dist_comm.hpp
+++ b/src/Vector/vector_dist_comm.hpp
@@ -268,7 +268,8 @@ class vector_dist_comm
 	 * \param v_prp vector of particles properties
 	 *
 	 */
-	void local_ghost_from_opart(openfpm::vector<Point<dim, St>> & v_pos, openfpm::vector<prop> & v_prp)
+	void local_ghost_from_opart(openfpm::vector<Point<dim, St>> & v_pos,
+			                    openfpm::vector<prop,Memory,typename layout_base<prop>::type,layout_base> & v_prp)
 	{
 		// get the shift vectors
 		const openfpm::vector<Point<dim, St>> & shifts = dec.getShiftVectors();
@@ -295,7 +296,9 @@ class vector_dist_comm
 	 * \param g_m ghost marker
 	 *
 	 */
-	void local_ghost_from_dec(openfpm::vector<Point<dim, St>> & v_pos, openfpm::vector<prop> & v_prp, size_t g_m)
+	void local_ghost_from_dec(openfpm::vector<Point<dim, St>> & v_pos,
+			                  openfpm::vector<prop,Memory,typename layout_base<prop>::type,layout_base> & v_prp,
+							  size_t g_m)
 	{
 		o_part_loc.clear();
 
@@ -396,7 +399,10 @@ class vector_dist_comm
 	 * \param opt options
 	 *
 	 */
-	void add_loc_particles_bc(openfpm::vector<Point<dim, St>> & v_pos, openfpm::vector<prop> & v_prp ,size_t & g_m, size_t opt)
+	void add_loc_particles_bc(openfpm::vector<Point<dim, St>> & v_pos,
+			                  openfpm::vector<prop,Memory,typename layout_base<prop>::type,layout_base> & v_prp ,
+							  size_t & g_m,
+							  size_t opt)
 	{
 		// Create the shift boxes
 		createShiftBox();
@@ -409,9 +415,9 @@ class vector_dist_comm
 		else
 		{
 			if (opt & SKIP_LABELLING)
-				local_ghost_from_opart(v_pos,v_prp);
+			{local_ghost_from_opart(v_pos,v_prp);}
 			else
-				local_ghost_from_dec(v_pos,v_prp,g_m);
+			{local_ghost_from_dec(v_pos,v_prp,g_m);}
 		}
 	}
 
@@ -538,7 +544,9 @@ class vector_dist_comm
 	 * \param g_send_prp Send buffer to fill
 	 *
 	 */
-	template<typename send_vector, typename prp_object, int ... prp> void fill_send_ghost_prp_buf(openfpm::vector<prop> & v_prp, openfpm::vector<send_vector> & g_send_prp)
+	template<typename send_vector, typename prp_object, int ... prp>
+	void fill_send_ghost_prp_buf(openfpm::vector<prop,Memory,typename layout_base<prop>::type,layout_base> & v_prp,
+			                     openfpm::vector<send_vector> & g_send_prp)
 	{
 		// create a number of send buffers equal to the near processors
 		g_send_prp.resize(g_opart.size());
@@ -565,7 +573,7 @@ class vector_dist_comm
 			for (size_t j = 0; j < g_opart.get(i).size(); j++)
 			{
 				// source object type
-				typedef encapc<1, prop, typename openfpm::vector<prop>::layout_type> encap_src;
+				typedef encapc<1, prop, typename openfpm::vector<prop,Memory,typename layout_base<prop>::type,layout_base>::layout_type> encap_src;
 				// destination object type
 				typedef encapc<1, prp_object, typename openfpm::vector<prp_object>::layout_type> encap_dst;
 
@@ -584,7 +592,11 @@ class vector_dist_comm
 	 * \param m_prp sending buffer for properties
 	 *
 	 */
-	void fill_send_map_buf(openfpm::vector<Point<dim, St>> & v_pos, openfpm::vector<prop> & v_prp, openfpm::vector<size_t> & prc_sz_r, openfpm::vector<openfpm::vector<Point<dim,St>>> & m_pos, openfpm::vector<openfpm::vector<prop>> & m_prp)
+	void fill_send_map_buf(openfpm::vector<Point<dim, St>> & v_pos,
+			               openfpm::vector<prop,Memory,typename layout_base<prop>::type,layout_base> & v_prp,
+						   openfpm::vector<size_t> & prc_sz_r,
+						   openfpm::vector<openfpm::vector<Point<dim,St>>> & m_pos,
+						   openfpm::vector<openfpm::vector<prop>> & m_prp)
 	{
 		m_prp.resize(prc_sz_r.size());
 		m_pos.resize(prc_sz_r.size());
@@ -627,7 +639,12 @@ class vector_dist_comm
 	 * \param m_prp sending buffer for properties
 	 *
 	 */
-	template<typename prp_object,int ... prp> void fill_send_map_buf_list(openfpm::vector<Point<dim, St>> & v_pos, openfpm::vector<prop> & v_prp, openfpm::vector<size_t> & prc_sz_r, openfpm::vector<openfpm::vector<Point<dim,St>>> & m_pos, openfpm::vector<openfpm::vector<prp_object>> & m_prp)
+	template<typename prp_object,int ... prp>
+	void fill_send_map_buf_list(openfpm::vector<Point<dim, St>> & v_pos,
+			                    openfpm::vector<prop,Memory,typename layout_base<prop>::type,layout_base> & v_prp,
+								openfpm::vector<size_t> & prc_sz_r,
+								openfpm::vector<openfpm::vector<Point<dim,St>>> & m_pos,
+								openfpm::vector<openfpm::vector<prp_object>> & m_prp)
 	{
 		m_prp.resize(prc_sz_r.size());
 		m_pos.resize(prc_sz_r.size());
@@ -726,7 +743,10 @@ class vector_dist_comm
 	 * \param g_m ghost marker
 	 *
 	 */
-	void labelParticlesGhost(openfpm::vector<Point<dim, St>> & v_pos, openfpm::vector<prop> & v_prp, openfpm::vector<size_t> & prc, size_t & g_m)
+	void labelParticlesGhost(openfpm::vector<Point<dim, St>> & v_pos,
+			                 openfpm::vector<prop,Memory,typename layout_base<prop>::type,layout_base> & v_prp,
+							 openfpm::vector<size_t> & prc,
+							 size_t & g_m)
 	{
 		// Buffer that contain for each processor the id of the particle to send
 		g_opart.clear();
@@ -941,7 +961,11 @@ public:
 	 * \param g_m marker between real and ghost particles
 	 *
 	 */
-	template<int ... prp> inline void ghost_get_(openfpm::vector<Point<dim, St>> & v_pos, openfpm::vector<prop> & v_prp, size_t & g_m, size_t opt = WITH_POSITION)
+	template<int ... prp> inline
+	void ghost_get_(openfpm::vector<Point<dim, St>> & v_pos,
+			        openfpm::vector<prop,Memory,typename layout_base<prop>::type,layout_base> & v_prp,
+					size_t & g_m,
+					size_t opt = WITH_POSITION)
 	{
 		// Sending property object
 		typedef object<typename object_creator<typename prop::type, prp...>::type> prp_object;
@@ -959,7 +983,7 @@ public:
 
 		// Label all the particles
 		if ((opt & SKIP_LABELLING) == false)
-			labelParticlesGhost(v_pos,v_prp,prc_g_opart,g_m);
+		{labelParticlesGhost(v_pos,v_prp,prc_g_opart,g_m);}
 
 		// Send and receive ghost particle information
 		{
@@ -975,10 +999,10 @@ public:
                 {
                 	size_t opt_ = compute_options(opt);
                 	op_ssend_gg_recv_merge opm(g_m);
-                    v_cl.SSendRecvP_op<op_ssend_gg_recv_merge,send_vector,decltype(v_prp),prp...>(g_send_prp,v_prp,prc_g_opart,opm,prc_recv_get,recv_sz_get,opt_);
+                    v_cl.SSendRecvP_op<op_ssend_gg_recv_merge,send_vector,decltype(v_prp),layout_base,prp...>(g_send_prp,v_prp,prc_g_opart,opm,prc_recv_get,recv_sz_get,opt_);
                 }
                 else
-                	v_cl.SSendRecvP<send_vector,decltype(v_prp),prp...>(g_send_prp,v_prp,prc_g_opart,prc_recv_get,recv_sz_get,recv_sz_get_byte);
+                {v_cl.SSendRecvP<send_vector,decltype(v_prp),layout_base,prp...>(g_send_prp,v_prp,prc_g_opart,prc_recv_get,recv_sz_get,recv_sz_get_byte);}
 
                 // fill g_opart_sz
                 g_opart_sz.resize(prc_g_opart.size());
@@ -1082,7 +1106,7 @@ public:
 		fill_send_map_buf_list<prp_object,prp...>(v_pos,v_prp,prc_sz_r, m_pos, m_prp);
 
 		v_cl.SSendRecv(m_pos,v_pos,prc_r,prc_recv_map,recv_sz_map);
-		v_cl.SSendRecvP<openfpm::vector<prp_object>,decltype(v_prp),prp...>(m_prp,v_prp,prc_r,prc_recv_map,recv_sz_map);
+		v_cl.SSendRecvP<openfpm::vector<prp_object>,decltype(v_prp),layout_base,prp...>(m_prp,v_prp,prc_r,prc_recv_map,recv_sz_map);
 
 		// mark the ghost part
 
@@ -1102,7 +1126,10 @@ public:
 	 * \param g_m ghost marker
 	 *
 	 */
-	template<typename obp = KillParticle> void map_(openfpm::vector<Point<dim, St>> & v_pos, openfpm::vector<prop> & v_prp, size_t & g_m)
+	template<typename obp = KillParticle>
+	void map_(openfpm::vector<Point<dim, St>> & v_pos,
+			  openfpm::vector<prop,Memory,typename layout_base<prop>::type,layout_base> & v_prp,
+			  size_t & g_m)
 	{
 		// Processor communication size
 		openfpm::vector<size_t> prc_sz(v_cl.getProcessingUnits());
@@ -1221,12 +1248,12 @@ public:
 			size_t opt_ = compute_options(opt);
 
 			op_ssend_recv_merge<op> opm(g_opart);
-			v_cl.SSendRecvP_op<op_ssend_recv_merge<op>,send_vector,decltype(v_prp),prp...>(g_send_prp,v_prp,prc_recv_get,opm,prc_g_opart,g_opart_sz,opt_);
+			v_cl.SSendRecvP_op<op_ssend_recv_merge<op>,send_vector,decltype(v_prp),layout_base,prp...>(g_send_prp,v_prp,prc_recv_get,opm,prc_g_opart,g_opart_sz,opt_);
 		}
 		else
 		{
 			op_ssend_recv_merge<op> opm(g_opart);
-			v_cl.SSendRecvP_op<op_ssend_recv_merge<op>,send_vector,decltype(v_prp),prp...>(g_send_prp,v_prp,prc_recv_get,opm,prc_recv_put,recv_sz_put);
+			v_cl.SSendRecvP_op<op_ssend_recv_merge<op>,send_vector,decltype(v_prp),layout_base,prp...>(g_send_prp,v_prp,prc_recv_get,opm,prc_recv_put,recv_sz_put);
 		}
 
 		// process also the local replicated particles
diff --git a/src/Vector/vector_dist_unit_test.hpp b/src/Vector/vector_dist_unit_test.hpp
index 887364d557fb4ae9bdc7381b3553538eae2f0e8a..a130c7ae789c37c181e941ff3bf22210e276c10c 100644
--- a/src/Vector/vector_dist_unit_test.hpp
+++ b/src/Vector/vector_dist_unit_test.hpp
@@ -101,6 +101,7 @@ void print_test(std::string test, size_t sz)
 		std::cout << test << " " << sz << "\n";
 }
 
+template<typename vector>
 void Test2D_ghost(Box<2,float> & box)
 {
 	// Communication object
@@ -150,7 +151,7 @@ void Test2D_ghost(Box<2,float> & box)
 	size_t bc[2]={NON_PERIODIC,NON_PERIODIC};
 
 	// Vector of particles
-	vector_dist<2,float, Point_test<float> > vd(g_info.size(),box,bc,g);
+	vector vd(g_info.size(),box,bc,g);
 
 	// size_t
 	size_t cobj = 0;
@@ -194,16 +195,16 @@ void Test2D_ghost(Box<2,float> & box)
 		auto key = v_it2.get();
 
 		// fill with the processor ID where these particle live
-		vd.getProp<p::s>(key) = vd.getPos(key)[0] + vd.getPos(key)[1] * 16.0f;
-		vd.getProp<p::v>(key)[0] = v_cl.getProcessUnitID();
-		vd.getProp<p::v>(key)[1] = v_cl.getProcessUnitID();
-		vd.getProp<p::v>(key)[2] = v_cl.getProcessUnitID();
+		vd.template getProp<p::s>(key) = vd.getPos(key)[0] + vd.getPos(key)[1] * 16.0f;
+		vd.template getProp<p::v>(key)[0] = v_cl.getProcessUnitID();
+		vd.template getProp<p::v>(key)[1] = v_cl.getProcessUnitID();
+		vd.template getProp<p::v>(key)[2] = v_cl.getProcessUnitID();
 
 		++v_it2;
 	}
 
 	// do a ghost get
-	vd.ghost_get<p::s,p::v>();
+	vd.template ghost_get<p::s,p::v>();
 
 	//! [Redistribute the particles and sync the ghost properties]
 
@@ -224,7 +225,7 @@ void Test2D_ghost(Box<2,float> & box)
 		auto key = g_it.get();
 
 		// Check the received data
-		BOOST_REQUIRE_EQUAL(vd.getPos(key)[0] + vd.getPos(key)[1] * 16.0f,vd.getProp<p::s>(key));
+		BOOST_REQUIRE_EQUAL(vd.getPos(key)[0] + vd.getPos(key)[1] * 16.0f,vd.template getProp<p::s>(key));
 
 		bool is_in = false;
 		size_t b = 0;
@@ -247,7 +248,7 @@ void Test2D_ghost(Box<2,float> & box)
 		BOOST_REQUIRE_EQUAL(is_in,true);
 
 		// Check that the particle come from the correct processor
-		BOOST_REQUIRE_EQUAL(vd.getProp<p::v>(key)[0],dec.getEGhostBoxProcessor(lb));
+		BOOST_REQUIRE_EQUAL(vd.template getProp<p::v>(key)[0],dec.getEGhostBoxProcessor(lb));
 
 		n_part++;
 		++g_it;
@@ -269,13 +270,17 @@ void Test2D_ghost(Box<2,float> & box)
 	}
 }
 
-BOOST_AUTO_TEST_CASE( vector_dist_ghost )
+//! types to use in the tests each element in the list is tested
+typedef boost::mpl::list<vector_dist<2,float, Point_test<float> >,
+		                 vector_dist<2,float, Point_test<float>,memory_traits_inte<Point_test<float>>::type,memory_traits_inte> > test_types;
+
+BOOST_AUTO_TEST_CASE_TEMPLATE( vector_dist_ghost, vector, test_types )
 {
 	Box<2,float> box({0.0,0.0},{1.0,1.0});
-	Test2D_ghost(box);
+	Test2D_ghost<vector>(box);
 
 	Box<2,float> box2({-1.0,-1.0},{2.5,2.5});
-	Test2D_ghost(box2);
+	Test2D_ghost<vector>(box2);
 }
 
 void print_test_v(std::string test, size_t sz)