diff --git a/src/Vector/vector_dist.hpp b/src/Vector/vector_dist.hpp
index 283d2f53ab5f5e4b12a75a14a2582a0ddfcc4ce9..7fcdff6f8b189074476c5acb355fe446dcd65739 100644
--- a/src/Vector/vector_dist.hpp
+++ b/src/Vector/vector_dist.hpp
@@ -65,6 +65,7 @@
 #define GCL_SYMMETRIC 1
 #define GCL_HILBERT 2
 
+
 //! General function t get a cell-list
 template<unsigned int dim, typename St, typename CellL, typename Vector, unsigned int impl>
 struct gcl
@@ -1498,7 +1499,7 @@ public:
 
 			reorder_sfc<CellL,grid_key_dx_iterator_hilbert<dim>>(v_pos_dest,v_prp_dest,h_it,cell_list);
 		}
-		else if (reorder_opt::LINEAR)
+		else if (opt == reorder_opt::LINEAR)
 		{
 			grid_sm<dim,void> gs(div);
 			grid_key_dx_iterator<dim> h_it(gs);
@@ -1721,9 +1722,17 @@ public:
 	 *
 	 *
 	 */
-	template<unsigned int ... prp> void map_list()
+	template<unsigned int ... prp> void map_list(size_t opt = NONE)
 	{
-		this->template map_list_<prp...>(v_pos,v_prp,g_m);
+#ifdef SE_CLASS3
+		se3.map_pre();
+#endif
+
+		this->template map_list_<prp...>(v_pos,v_prp,g_m,opt);
+
+#ifdef SE_CLASS3
+		se3.map_post();
+#endif
 	}
 
 
@@ -1737,13 +1746,13 @@ public:
 	 *
 	 *
 	 */
-	template<typename obp = KillParticle> void map()
+	template<typename obp = KillParticle> void map(size_t opt = NONE)
 	{
 #ifdef SE_CLASS3
 		se3.map_pre();
 #endif
 
-		this->template map_<obp>(v_pos,v_prp,g_m);
+		this->template map_<obp>(v_pos,v_prp,g_m,opt);
 
 #ifdef SE_CLASS3
 		se3.map_post();
diff --git a/src/Vector/vector_dist_comm.hpp b/src/Vector/vector_dist_comm.hpp
index a9ae0a12b65ea98f2e8a338b1ed920e0a80c8a50..f4f4b5b8ea42cb91257853a0e3861a84facbf139 100644
--- a/src/Vector/vector_dist_comm.hpp
+++ b/src/Vector/vector_dist_comm.hpp
@@ -17,6 +17,8 @@
 
 #define BIND_DEC_TO_GHOST 1
 
+#define MAP_LOCAL 2
+
 /*! \brief compute the communication options from the ghost_get/put options
  *
  *
@@ -681,7 +683,10 @@ class vector_dist_comm
 	 * \param prc_sz For each processor the number of particles to send
 	 *
 	 */
-	template<typename obp> void labelParticleProcessor(openfpm::vector<Point<dim, St>> & v_pos, openfpm::vector<aggregate<size_t,size_t,size_t>> & lbl_p, openfpm::vector<size_t> & prc_sz)
+	template<typename obp>
+	void labelParticleProcessor(openfpm::vector<Point<dim, St>> & v_pos,
+								openfpm::vector<aggregate<size_t,size_t,size_t>> & lbl_p,
+								openfpm::vector<size_t> & prc_sz)
 	{
 		// reset lbl_p
 		lbl_p.clear();
@@ -703,9 +708,9 @@ class vector_dist_comm
 
 			// Check if the particle is inside the domain
 			if (dec.getDomain().isInside(v_pos.get(key)) == true)
-				p_id = dec.processorIDBC(v_pos.get(key));
+			{p_id = dec.processorIDBC(v_pos.get(key));}
 			else
-				p_id = obp::out(key, v_cl.getProcessUnitID());
+			{p_id = obp::out(key, v_cl.getProcessUnitID());}
 
 			// Particle to move
 			if (p_id != v_cl.getProcessUnitID())
@@ -1063,9 +1068,12 @@ public:
 	 * \param v_pos vector of particle positions
 	 * \param v_prp vector of particle properties
 	 * \param g_m ghost marker
+	 * \param opt options
 	 *
 	 */
-	template<unsigned int ... prp> void map_list_(openfpm::vector<Point<dim, St>> & v_pos, openfpm::vector<prop> & v_prp, size_t & g_m)
+	template<unsigned int ... prp>
+	void map_list_(openfpm::vector<Point<dim, St>> & v_pos,
+				   openfpm::vector<prop> & v_prp, size_t & g_m, size_t opt = NONE)
 	{
 		typedef KillParticle obp;
 
@@ -1095,6 +1103,17 @@ public:
 			}
 		}
 
+		// In case we have receive option
+
+		if (opt & MAP_LOCAL)
+		{
+			// if the map is local we indicate that we receive only from the neighborhood processors
+
+			prc_recv_map.clear();
+			for (size_t i = 0 ; i < dec.getNNProcessors() ; i++)
+			{prc_recv_map.add(dec.IDtoProc(i));}
+		}
+
 		// Sending property object
 		typedef object<typename object_creator<typename prop::type, prp...>::type> prp_object;
 
@@ -1105,8 +1124,8 @@ 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),layout_base,prp...>(m_prp,v_prp,prc_r,prc_recv_map,recv_sz_map);
+		v_cl.SSendRecv(m_pos,v_pos,prc_r,prc_recv_map,recv_sz_map,opt);
+		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,opt);
 
 		// mark the ghost part
 
@@ -1129,7 +1148,7 @@ public:
 	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)
+			  size_t & g_m, size_t opt = NONE)
 	{
 		// Processor communication size
 		openfpm::vector<size_t> prc_sz(v_cl.getProcessingUnits());
@@ -1164,8 +1183,8 @@ public:
 
 		fill_send_map_buf(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.SSendRecv(m_prp,v_prp,prc_r,prc_recv_map,recv_sz_map);
+		v_cl.SSendRecv(m_pos,v_pos,prc_r,prc_recv_map,recv_sz_map,opt);
+		v_cl.SSendRecv(m_prp,v_prp,prc_r,prc_recv_map,recv_sz_map,opt);
 
 		// mark the ghost part
 
diff --git a/src/Vector/vector_dist_unit_test.hpp b/src/Vector/vector_dist_unit_test.hpp
index ec536d3cb8cb4f9fe4db1155d54eee294ffa1bf3..447afe0227ab8528f8fcc7371468fda11b1fb561 100644
--- a/src/Vector/vector_dist_unit_test.hpp
+++ b/src/Vector/vector_dist_unit_test.hpp
@@ -755,7 +755,7 @@ BOOST_AUTO_TEST_CASE( vector_dist_periodic_test_use_3d )
 	}
 }
 
-BOOST_AUTO_TEST_CASE( vector_dist_periodic_test_random_walk )
+void test_random_walk(size_t opt)
 {
 	Vcluster & v_cl = create_vcluster();
 
@@ -823,7 +823,7 @@ BOOST_AUTO_TEST_CASE( vector_dist_periodic_test_random_walk )
 				++it;
 			}
 
-			vd.map();
+			vd.map(opt);
 
 			vd.ghost_get<0>();
 
@@ -835,6 +835,16 @@ BOOST_AUTO_TEST_CASE( vector_dist_periodic_test_random_walk )
 	}
 }
 
+BOOST_AUTO_TEST_CASE( vector_dist_periodic_test_random_walk )
+{
+	test_random_walk(NONE);
+}
+
+BOOST_AUTO_TEST_CASE( vector_dist_periodic_test_random_walk_local_map )
+{
+	test_random_walk(MAP_LOCAL);
+}
+
 BOOST_AUTO_TEST_CASE( vector_dist_periodic_map )
 {
 	Box<3,float> box({0.0,0.0,0.0},{1.0,1.0,1.0});