diff --git a/include/bt/execution.h b/include/bt/execution.h
index 913d60c8b2b5a44e9aa693b6a546c3e75d258fba..e46654f2ed6bd1b4a8eb53475adfb3f0543ab716 100644
--- a/include/bt/execution.h
+++ b/include/bt/execution.h
@@ -23,13 +23,13 @@ class Execution : public BT::StatefulActionNode{
     moveit_task_constructor_msgs::ExecuteTaskSolutionGoal ets_;
     Moveit_robot* mr_reference_;
     ros::Publisher* publisher_reference_;
-    std::map<std::string, moveit_msgs::RobotTrajectory>* executions_;
+    std::map<std::string, std::pair<moveit_msgs::RobotTrajectory, moveit_msgs::PlanningScene>>* executions_;
     std::vector<moveit_task_constructor_msgs::SubTrajectory>::iterator it_;
 
 
     public:
     Execution(const std::string& name, const BT::NodeConfiguration& config);
-    void init(std::map<std::string, moveit_msgs::RobotTrajectory>* executions_, ros::Publisher* publisher_reference, Moveit_robot* mr_reference_, moveit_task_constructor_msgs::ExecuteTaskSolutionGoal& ets);
+    void init(std::map<std::string, std::pair<moveit_msgs::RobotTrajectory, moveit_msgs::PlanningScene>>* executions_, ros::Publisher* publisher_reference, Moveit_robot* mr_reference_, moveit_task_constructor_msgs::ExecuteTaskSolutionGoal& ets);
 
     inline static BT::PortsList providedPorts() { return {}; }
 
diff --git a/include/impl/moveit_mediator.h b/include/impl/moveit_mediator.h
index fa37d5970ec5b3c8b4c8a5167c97ea292ab61dcd..680e700764a1c77ae69dbf8be2b440eb545a395c 100644
--- a/include/impl/moveit_mediator.h
+++ b/include/impl/moveit_mediator.h
@@ -77,7 +77,7 @@ class Moveit_mediator : public Abstract_mediator{
 
     std::map<std::string, std::vector<uint8_t>> acm_;
     std::multimap<std::string, std::pair<tf2::Vector3, std::queue<moveit_task_constructor_msgs::ExecuteTaskSolutionGoal>>> tasks_;
-    std::map<std::string, moveit_msgs::RobotTrajectory> executions_;
+    std::map<std::string, std::pair<moveit_msgs::RobotTrajectory, moveit_msgs::PlanningScene>> executions_;
 
 
 
@@ -95,18 +95,19 @@ class Moveit_mediator : public Abstract_mediator{
     void status_callback(const actionlib_msgs::GoalStatusArray::ConstPtr& status);
 
 
-    void merge_ps(moveit_msgs::PlanningScene& out, moveit_msgs::PlanningScene* in, Moveit_robot* mr);
+    void merge_ps(moveit_msgs::PlanningScene& out, moveit_msgs::PlanningScene in, Moveit_robot* mr);
     void merge_acm(moveit_msgs::PlanningScene& in);
 
     void task_planner();
     void publish_tables();
-    void rewrite_task_template(Abstract_robot* r, moveit_msgs::CollisionObject& source, tf2::Transform& target);
 
     void parallel_exec(Moveit_robot& r, moveit_msgs::RobotTrajectory rt);
+    void manipulate_acm(Moveit_robot* mr, moveit_msgs::PlanningScene& ps);
+
     //void parallel_exec();
 
     moveit::task_constructor::Task create_Task(Moveit_robot* r, moveit_msgs::CollisionObject& source, tf2::Transform& target);
-    inline std::map<std::string, moveit_msgs::RobotTrajectory>& executions(){return executions_;};
+    inline std::map<std::string, std::pair<moveit_msgs::RobotTrajectory, moveit_msgs::PlanningScene>>& executions(){return executions_;};
     inline std::map<std::string, std::vector<moveit::task_constructor::Task>>& task_map(){return task_map_;};
 
     inline void set_tasks(std::multimap<std::string, std::pair<tf2::Vector3, std::queue<moveit_task_constructor_msgs::ExecuteTaskSolutionGoal>>>& tasks) {tasks_ = tasks;};
diff --git a/src/bt/execution.cpp b/src/bt/execution.cpp
index e502f162eab9be1a4e4974399f4f7e4cf88723ab..ad9eccec6594b295149cf52a1236ce82fff5b79e 100644
--- a/src/bt/execution.cpp
+++ b/src/bt/execution.cpp
@@ -22,9 +22,8 @@ BT::NodeStatus Execution::tick() {
 
 BT::NodeStatus Execution::onStart(){
     if (it_ != ets_.solution.sub_trajectory.end()){
-        executions_->insert_or_assign(mr_reference_->name(), it_->trajectory);
-        ROS_INFO("%i", it_->trajectory.joint_trajectory.points.size());
-		ROS_INFO("%i", it_->trajectory.multi_dof_joint_trajectory.points.size());
+        std::pair<moveit_msgs::RobotTrajectory, moveit_msgs::PlanningScene> pair(it_->trajectory, it_->scene_diff);
+        executions_->insert_or_assign(mr_reference_->name(), pair);
         it_++;
         return BT::NodeStatus::RUNNING;
     } else {
@@ -36,9 +35,8 @@ BT::NodeStatus Execution::onStart(){
     // this method until it return something different from RUNNING
 BT::NodeStatus Execution::onRunning(){
     if (it_ != ets_.solution.sub_trajectory.end()){
-        executions_->insert_or_assign(mr_reference_->name(), it_->trajectory);
-        ROS_INFO("%i", it_->trajectory.joint_trajectory.points.size());
-		ROS_INFO("%i", it_->trajectory.multi_dof_joint_trajectory.points.size());
+        std::pair<moveit_msgs::RobotTrajectory, moveit_msgs::PlanningScene> pair(it_->trajectory, it_->scene_diff);
+        executions_->insert_or_assign(mr_reference_->name(), pair);
         it_++;
         return BT::NodeStatus::RUNNING;
     } else {
@@ -49,7 +47,7 @@ BT::NodeStatus Execution::onRunning(){
     // callback to execute if the action was aborted by another node
 void Execution::onHalted(){}
 
-void Execution::init(std::map<std::string, moveit_msgs::RobotTrajectory>* executions ,ros::Publisher* publisher_reference, Moveit_robot* mr_reference, moveit_task_constructor_msgs::ExecuteTaskSolutionGoal& ets) {
+void Execution::init(std::map<std::string, std::pair<moveit_msgs::RobotTrajectory, moveit_msgs::PlanningScene>>* executions ,ros::Publisher* publisher_reference, Moveit_robot* mr_reference, moveit_task_constructor_msgs::ExecuteTaskSolutionGoal& ets) {
     mr_reference_= mr_reference;
     publisher_reference_ = publisher_reference;
     ets_ = ets;
diff --git a/src/impl/moveit_mediator.cpp b/src/impl/moveit_mediator.cpp
index ea29805702cefe929a54ca6128fb26edc50c229b..613251e5ef655fb62b644c7e5b35a368bb5afec3 100644
--- a/src/impl/moveit_mediator.cpp
+++ b/src/impl/moveit_mediator.cpp
@@ -555,158 +555,140 @@ void Moveit_mediator::setup_task(){
 	}
 	*/
 
-	
+}
 
+void Moveit_mediator::manipulate_acm(Moveit_robot* mr, moveit_msgs::PlanningScene& ps){
+	// First find ID from panda to start with
+	std::regex rx_panda("panda_arm([0-9]+)");
+	std::smatch match;
+	std::regex_match(mr->name(), match, rx_panda);
+
+	// build panda link regex
+	std::stringstream ss;
+	ss << "panda_" << match[1] << "_.*";
+	std::regex rx_panda_links(ss.str());
+	std::regex rx_box("box.*");
+	std::regex rx_table("table.*");
+
+	// Iterate task collsion matrix
+	for(int j = 0; j < ps.allowed_collision_matrix.entry_names.size(); j++ ){
+		if( mr->map().at("base") == ps.allowed_collision_matrix.entry_names[j]){
+			//In case an entry matches an robot spezific link
+			ROS_INFO("entry matches link %s at index %i", mr->map().at("base").c_str(), j);
+
+			for(int k = 0; k < ps.allowed_collision_matrix.entry_values[j].enabled.size(); k++){
+				// For that specific entry, loop over values								
+				int distance = std::distance(acm_.begin(),acm_.find(ps.allowed_collision_matrix.entry_names[k]));								
+
+				if (std::regex_match(ps.allowed_collision_matrix.entry_names[k], match, rx_panda_links)){
+					ROS_INFO("Entry in row corresponds to link_pattern %s", match[0].str().c_str());
+					acm_.at(ps.allowed_collision_matrix.entry_names[k])[distance] = ps.allowed_collision_matrix.entry_values[j].enabled[k];
+				}
 
+				if (std::regex_match(ps.allowed_collision_matrix.entry_names[k], match, rx_box)){
+					ROS_INFO("Entry in row corresponds to box_pattern %s", match[0].str().c_str());
+					acm_.at(ps.allowed_collision_matrix.entry_names[k])[distance] = ps.allowed_collision_matrix.entry_values[j].enabled[k];
+				}				
 
-	std::regex item("box_([0-9]+)");
-    std::smatch match;
-	ROS_INFO("tasks %i", tasks_.size());
-
-	while(!tasks_.empty()){
-		ROS_INFO("in tasks");
-		std::vector<std::pair<std::string, std::queue<moveit_task_constructor_msgs::ExecuteTaskSolutionGoal>>> q_ets;
-		for (auto*r:robots_){
-			ROS_INFO("robot iteration");
-			auto itlow = tasks_.lower_bound (r->name());  // itlow points to b
-  			auto itup = tasks_.upper_bound (r->name());  
-			for (auto it=itlow; it!=itup; ++it){
-				tf2::Vector3 b_start_position = (*it).second.first;
-				for(auto& s_co : psi_->getObjects()){
-					if(!std::regex_match(s_co.first, match, item)) continue;
-					if(tf2::tf2Distance2(b_start_position, tf2::Vector3(s_co.second.pose.position.x, s_co.second.pose.position.y,s_co.second.pose.position.z)) == 0) {
-						q_ets.push_back(std::pair<std::string, std::queue<moveit_task_constructor_msgs::ExecuteTaskSolutionGoal>>(r->name(), (*it).second.second));
-						tasks_.erase(it);
-						break;
-					}
+				if (std::regex_match(ps.allowed_collision_matrix.entry_names[k], match, rx_table)){
+					ROS_INFO("Entry in row corresponds to table_pattern %s", match[0].str().c_str());
+					acm_.at(ps.allowed_collision_matrix.entry_names[k])[distance] = ps.allowed_collision_matrix.entry_values[j].enabled[k];
+				}	
+
+				if (mr->map().at("base")== ps.allowed_collision_matrix.entry_names[k]){
+					ROS_INFO("Entry in row corresponds to base %s", mr->map().at("base").c_str());
+					acm_.at(ps.allowed_collision_matrix.entry_names[k])[distance] = ps.allowed_collision_matrix.entry_values[j].enabled[k];
 				}
 			}
 		}
 
-		ROS_INFO("tasks %i", tasks_.size());
-		ROS_INFO("jobs %i", q_ets.size());
+		if(std::regex_match(ps.allowed_collision_matrix.entry_names[j], match, rx_panda_links)){
+			//In case an entry matches an robot spezific link
+			ROS_INFO("entry matches link %s at index %i", ps.allowed_collision_matrix.entry_names[j].c_str(), j);
+			for(int k = 0; k < ps.allowed_collision_matrix.entry_values[j].enabled.size(); k++){
+					//For that specific entry, loop over values							
+				int distance = std::distance(acm_.begin(),acm_.find(ps.allowed_collision_matrix.entry_names[k]));								
 
-		// now execution should be possible, but with bocking
-		std::vector<std::thread> th;
+				if (std::regex_match(ps.allowed_collision_matrix.entry_names[k], match, rx_panda_links)){
+					ROS_INFO("Entry in row corresponds to link_pattern %s", match[0].str().c_str());
+					acm_.at(ps.allowed_collision_matrix.entry_names[k])[distance] = ps.allowed_collision_matrix.entry_values[j].enabled[k];
+				}
 
-		while(!q_ets.empty()){
-			moveit_msgs::PlanningScene ps_m;
-			ps_m.is_diff = 0;
-			for (auto*r:robots_){
-				for (auto& s_qets : q_ets){
-					if(s_qets.first == r->name()){
-						if(!s_qets.second.front().solution.sub_trajectory.empty()){
-							moveit_msgs::RobotTrajectory* rt = (!s_qets.second.front().solution.sub_trajectory.empty()) ? &s_qets.second.front().solution.sub_trajectory.front().trajectory : nullptr;
-							moveit_msgs::PlanningScene* ps = (!s_qets.second.front().solution.sub_trajectory.empty()) ? &s_qets.second.front().solution.sub_trajectory.front().scene_diff : nullptr;
-
-							if (rt){
-								Moveit_robot* mr = dynamic_cast<Moveit_robot*>(r);
-								// mr->mgi()->execute(*rt);
-								//th.push_back(std::thread(&Moveit_mediator::parallel_exec, this, std::ref(*mr), *rt));
-							
-								// First find ID from panda to start with
-								std::regex rx_panda("panda_arm([0-9]+)");
-								std::smatch match;
-								std::regex_match(mr->name(), match, rx_panda);
-
-								// build panda link regex
-								std::stringstream ss;
-								ss << "panda_" << match[1] << "_.*";
-								std::regex rx_panda_links(ss.str());
-								std::regex rx_box("box.*");
-								std::regex rx_table("table.*");
-
-								if(ps){
-									for(int j = 0; j < ps->allowed_collision_matrix.entry_names.size(); j++ ){
-										if( mr->map().at("base") == ps->allowed_collision_matrix.entry_names[j]){
-											for(int k = 0; k < ps->allowed_collision_matrix.entry_values[j].enabled.size(); k++){
-												int distance = std::distance(acm_.begin(),acm_.find(ps->allowed_collision_matrix.entry_names[k]));								
-												if (std::regex_match(ps->allowed_collision_matrix.entry_names[k], match, rx_panda_links)){
-													acm_.at(ps->allowed_collision_matrix.entry_names[k])[distance] = ps->allowed_collision_matrix.entry_values[j].enabled[k];
-												}
-												if (std::regex_match(ps->allowed_collision_matrix.entry_names[k], match, rx_box)){
-													acm_.at(ps->allowed_collision_matrix.entry_names[k])[distance] = ps->allowed_collision_matrix.entry_values[j].enabled[k];
-												}				
-												if (std::regex_match(ps->allowed_collision_matrix.entry_names[k], match, rx_table)){
-													acm_.at(ps->allowed_collision_matrix.entry_names[k])[distance] = ps->allowed_collision_matrix.entry_values[j].enabled[k];
-												}	
-												if (mr->map().at("base")== ps->allowed_collision_matrix.entry_names[k]){
-													acm_.at(ps->allowed_collision_matrix.entry_names[k])[distance] = ps->allowed_collision_matrix.entry_values[j].enabled[k];
-												}
-											}
-										}
-
-										if(std::regex_match(ps->allowed_collision_matrix.entry_names[j], match, rx_panda_links)){
-											for(int k = 0; k < ps->allowed_collision_matrix.entry_values[j].enabled.size(); k++){
-												int distance = std::distance(acm_.begin(),acm_.find(ps->allowed_collision_matrix.entry_names[k]));								
-												if (std::regex_match(ps->allowed_collision_matrix.entry_names[k], match, rx_panda_links)){
-													acm_.at(ps->allowed_collision_matrix.entry_names[k])[distance] = ps->allowed_collision_matrix.entry_values[j].enabled[k];
-												}
-												if (std::regex_match(ps->allowed_collision_matrix.entry_names[k], match, rx_box)){
-													acm_.at(ps->allowed_collision_matrix.entry_names[k])[distance] = ps->allowed_collision_matrix.entry_values[j].enabled[k];
-												}				
-												if (std::regex_match(ps->allowed_collision_matrix.entry_names[k], match, rx_table)){
-													acm_.at(ps->allowed_collision_matrix.entry_names[k])[distance] = ps->allowed_collision_matrix.entry_values[j].enabled[k];
-												}	
-												if (mr->map().at("base")== ps->allowed_collision_matrix.entry_names[k]){
-													acm_.at(ps->allowed_collision_matrix.entry_names[k])[distance] = ps->allowed_collision_matrix.entry_values[j].enabled[k];
-												}
-											}
-										}
-
-										if(std::regex_match(ps->allowed_collision_matrix.entry_names[j], match, rx_box)){
-											for(int k = 0; k < ps->allowed_collision_matrix.entry_values[j].enabled.size(); k++){
-												int distance = std::distance(acm_.begin(),acm_.find(ps->allowed_collision_matrix.entry_names[k]));								
-												if (std::regex_match(ps->allowed_collision_matrix.entry_names[k], match, rx_panda_links)){
-													acm_.at(ps->allowed_collision_matrix.entry_names[k])[distance] = ps->allowed_collision_matrix.entry_values[j].enabled[k];
-												}
-												if (std::regex_match(ps->allowed_collision_matrix.entry_names[k], match, rx_box)){
-													acm_.at(ps->allowed_collision_matrix.entry_names[k])[distance] = ps->allowed_collision_matrix.entry_values[j].enabled[k];
-												}				
-												if (std::regex_match(ps->allowed_collision_matrix.entry_names[k], match, rx_table)){
-													acm_.at(ps->allowed_collision_matrix.entry_names[k])[distance] = ps->allowed_collision_matrix.entry_values[j].enabled[k];
-												}	
-												if (mr->map().at("base")== ps->allowed_collision_matrix.entry_names[k]){
-													acm_.at(ps->allowed_collision_matrix.entry_names[k])[distance] = ps->allowed_collision_matrix.entry_values[j].enabled[k];
-												}
-											}
-										}
-
-										if(std::regex_match(ps->allowed_collision_matrix.entry_names[j], match, rx_table)){
-											for(int k = 0; k < ps->allowed_collision_matrix.entry_values[j].enabled.size(); k++){
-												int distance = std::distance(acm_.begin(),acm_.find(ps->allowed_collision_matrix.entry_names[k]));								
-												if (std::regex_match(ps->allowed_collision_matrix.entry_names[k], match, rx_panda_links)){
-													acm_.at(ps->allowed_collision_matrix.entry_names[k])[distance] = ps->allowed_collision_matrix.entry_values[j].enabled[k];
-												}
-												if (std::regex_match(ps->allowed_collision_matrix.entry_names[k], match, rx_box)){
-													acm_.at(ps->allowed_collision_matrix.entry_names[k])[distance] = ps->allowed_collision_matrix.entry_values[j].enabled[k];
-												}				
-												if (std::regex_match(ps->allowed_collision_matrix.entry_names[k], match, rx_table)){
-													acm_.at(ps->allowed_collision_matrix.entry_names[k])[distance] = ps->allowed_collision_matrix.entry_values[j].enabled[k];
-												}	
-												if (mr->map().at("base")== ps->allowed_collision_matrix.entry_names[k]){
-													acm_.at(ps->allowed_collision_matrix.entry_names[k])[distance] = ps->allowed_collision_matrix.entry_values[j].enabled[k];
-												}
-											}
-										}
-									}
-									merge_ps(ps_m, ps, mr);
-								}
-								s_qets.second.front().solution.sub_trajectory.erase(s_qets.second.front().solution.sub_trajectory.begin());
-							}
-						} else {s_qets.second.pop();};	
-					}
+				if (std::regex_match(ps.allowed_collision_matrix.entry_names[k], match, rx_box)){
+					ROS_INFO("Entry in row corresponds to box_pattern %s", match[0].str().c_str());
+					acm_.at(ps.allowed_collision_matrix.entry_names[k])[distance] = ps.allowed_collision_matrix.entry_values[j].enabled[k];
+				}				
+
+				if (std::regex_match(ps.allowed_collision_matrix.entry_names[k], match, rx_table)){
+					ROS_INFO("Entry in row corresponds to table_pattern %s", match[0].str().c_str());
+					acm_.at(ps.allowed_collision_matrix.entry_names[k])[distance] = ps.allowed_collision_matrix.entry_values[j].enabled[k];
+				}	
+
+				if (mr->map().at("base")== ps.allowed_collision_matrix.entry_names[k]){
+					ROS_INFO("Entry in row corresponds to base %s", mr->map().at("base").c_str());
+					acm_.at(ps.allowed_collision_matrix.entry_names[k])[distance] = ps.allowed_collision_matrix.entry_values[j].enabled[k];
 				}
 			}
-			for(int i = 0; i < th.size(); i++){
-				if(th[i].joinable()) th[i].join();
+		}
+
+		if(std::regex_match(ps.allowed_collision_matrix.entry_names[j], match, rx_box)){
+				//In case an entry matches an robot spezific link
+			ROS_INFO("entry matches link %s at index %i", ps.allowed_collision_matrix.entry_names[j].c_str(), j);
+			for(int k = 0; k < ps.allowed_collision_matrix.entry_values[j].enabled.size(); k++){
+				//For that specific entry, loop over values							
+				int distance = std::distance(acm_.begin(),acm_.find(ps.allowed_collision_matrix.entry_names[k]));								
+
+				if (std::regex_match(ps.allowed_collision_matrix.entry_names[k], match, rx_panda_links)){
+					ROS_INFO("Entry in row corresponds to link_pattern %s", match[0].str().c_str());
+					acm_.at(ps.allowed_collision_matrix.entry_names[k])[distance] = ps.allowed_collision_matrix.entry_values[j].enabled[k];
+				}
+
+				if (std::regex_match(ps.allowed_collision_matrix.entry_names[k], match, rx_box)){
+					ROS_INFO("Entry in row corresponds to box_pattern %s", match[0].str().c_str());
+					acm_.at(ps.allowed_collision_matrix.entry_names[k])[distance] = ps.allowed_collision_matrix.entry_values[j].enabled[k];
+				}				
+
+				if (std::regex_match(ps.allowed_collision_matrix.entry_names[k], match, rx_table)){
+					ROS_INFO("Entry in row corresponds to table_pattern %s", match[0].str().c_str());
+					acm_.at(ps.allowed_collision_matrix.entry_names[k])[distance] = ps.allowed_collision_matrix.entry_values[j].enabled[k];
+				}	
+
+				if (mr->map().at("base")== ps.allowed_collision_matrix.entry_names[k]){
+					ROS_INFO("Entry in row corresponds to base %s", mr->map().at("base").c_str());
+					acm_.at(ps.allowed_collision_matrix.entry_names[k])[distance] = ps.allowed_collision_matrix.entry_values[j].enabled[k];
+				}
 			}
-			merge_acm(ps_m);
-			if(ps_m.is_diff) planning_scene_diff_publisher_->publish(ps_m);
 		}
 
-	}
+		if(std::regex_match(ps.allowed_collision_matrix.entry_names[j], match, rx_table)){
+			//In case an entry matches an robot spezific link
+			ROS_INFO("entry matches link %s at index %i", ps.allowed_collision_matrix.entry_names[j], j);
+			for(int k = 0; k < ps.allowed_collision_matrix.entry_values[j].enabled.size(); k++){
+				//For that specific entry, loop over values									
+				int distance = std::distance(acm_.begin(),acm_.find(ps.allowed_collision_matrix.entry_names[k]));								
+
+				if (std::regex_match(ps.allowed_collision_matrix.entry_names[k], match, rx_panda_links)){
+					ROS_INFO("Entry in row corresponds to link_pattern %s", match[0].str().c_str());
+					acm_.at(ps.allowed_collision_matrix.entry_names[k])[distance] = ps.allowed_collision_matrix.entry_values[j].enabled[k];
+				}
+
+				if (std::regex_match(ps.allowed_collision_matrix.entry_names[k], match, rx_box)){
+					ROS_INFO("Entry in row corresponds to box_pattern %s", match[0].str().c_str());
+					acm_.at(ps.allowed_collision_matrix.entry_names[k])[distance] = ps.allowed_collision_matrix.entry_values[j].enabled[k];
+				}				
 
+				if (std::regex_match(ps.allowed_collision_matrix.entry_names[k], match, rx_table)){
+					ROS_INFO("Entry in row corresponds to table_pattern %s", match[0].str().c_str());
+					acm_.at(ps.allowed_collision_matrix.entry_names[k])[distance] = ps.allowed_collision_matrix.entry_values[j].enabled[k];
+				}	
+
+				if (mr->map().at("base")== ps.allowed_collision_matrix.entry_names[k]){
+					ROS_INFO("Entry in row corresponds to base %s", mr->map().at("base").c_str());
+					acm_.at(ps.allowed_collision_matrix.entry_names[k])[distance] = ps.allowed_collision_matrix.entry_values[j].enabled[k];
+				}
+			}
+		}
+	}
 }
 
 
@@ -750,6 +732,9 @@ void Moveit_mediator::task_planner(){
 
 		// Could also safe id's somewhere
 	}
+	
+	// Setup shared ACM
+	for(auto& a: acm_) a.second.resize(acm_.size(), 0);
 
 	std::regex item("box_([0-9]+)");
     std::smatch match;
@@ -775,7 +760,6 @@ void Moveit_mediator::task_planner(){
 			ROS_INFO("1. job entry %f %f %f", temp.second.jobs_.front().getOrigin().getX(), temp.second.jobs_.front().getOrigin().getY(), temp.second.jobs_.front().getOrigin().getZ());
 			ROS_INFO("object position %f %f %f", s_co.second.pose.position.x, s_co.second.pose.position.y, s_co.second.pose.position.z);
 			if(tf2::tf2Distance2(temp.second.jobs_.front().getOrigin(), tf2::Vector3(s_co.second.pose.position.x, s_co.second.pose.position.y, s_co.second.pose.position.z )) == 0) {
-				std::queue<moveit_task_constructor_msgs::ExecuteTaskSolutionGoal> tasks_per_robot;
 				std::vector<moveit_task_constructor_msgs::ExecuteTaskSolutionGoal> bt_list;
 				
 				Moveit_robot* mr;
@@ -787,7 +771,6 @@ void Moveit_mediator::task_planner(){
 					if(mgt.plan(1)) {
 						moveit_task_constructor_msgs::ExecuteTaskSolutionGoal e;
 						mgt.solutions().front()->fillMessage(e.solution, &mgt.introspection());
-						tasks_per_robot.push(e);
 						bt_list.push_back(e);
 
 						moveit_msgs::CollisionObject temp_co = psi_->getObjects().at(s_co.first);
@@ -845,8 +828,6 @@ void Moveit_mediator::task_planner(){
 					std::tuple<const std::string&, tf2::Vector3&, std::vector<moveit_task_constructor_msgs::ExecuteTaskSolutionGoal>&> tuple(s_co.first, temp.second.jobs_.front().getOrigin(), bt_list);
 					task_but_different.insert(std::pair<std::string, std::vector<std::tuple<const std::string, tf2::Vector3, std::vector<moveit_task_constructor_msgs::ExecuteTaskSolutionGoal>>>>(mr->name(),{tuple}));
 				}
-
-				tasks_.insert(std::pair<std::string, std::pair<tf2::Vector3, std::queue<moveit_task_constructor_msgs::ExecuteTaskSolutionGoal>>>(mr->name(), {temp.second.jobs_.front().getOrigin(), tasks_per_robot}));
 				jq.pop_front();
 			} else {jq.push_back(temp);}
 		}
@@ -909,21 +890,26 @@ void Moveit_mediator::task_planner(){
 		status = tree.tickRoot();
 
 		std::vector<std::thread> th;
+		moveit_msgs::PlanningScene ps_m;
 		
 		for(auto& exec : executions_){
 			for (int i = 0; i < robots_.size(); i++){
 				if (exec.first == robots_[i]->name()){
 					auto mr = dynamic_cast<Moveit_robot*>(robots_[i]);
-					th.push_back(std::thread(&Moveit_mediator::parallel_exec, this, std::ref(*mr), exec.second));
+					th.push_back(std::thread(&Moveit_mediator::parallel_exec, this, std::ref(*mr), exec.second.first));
+					//mr->mgi()->execute(exec.second.first);
+					manipulate_acm(mr, exec.second.second);
+					merge_ps(ps_m, exec.second.second, mr);
 				}
 			}
 		}
 		
+		
 		for(auto& t : th){
 			if(t.joinable()) t.join();
+			merge_acm(ps_m);
+			planning_scene_diff_publisher_->publish(ps_m);
 		}
-
-		
 	}
 
 
@@ -971,8 +957,6 @@ void Moveit_mediator::merge_acm(moveit_msgs::PlanningScene& ps_m){
 	}
 
 	ps_m.allowed_collision_matrix = acmt;
-	ROS_INFO("broken after merge");
-
 }
 
 void Moveit_mediator::status_callback(const actionlib_msgs::GoalStatusArray::ConstPtr& status){
@@ -981,7 +965,7 @@ void Moveit_mediator::status_callback(const actionlib_msgs::GoalStatusArray::Con
    }
 }
 
-void Moveit_mediator::merge_ps(moveit_msgs::PlanningScene& out, moveit_msgs::PlanningScene* in, Moveit_robot* mr){
+void Moveit_mediator::merge_ps(moveit_msgs::PlanningScene& out, moveit_msgs::PlanningScene in, Moveit_robot* mr){
 	// get full mr link list 
 	std::vector<std::string> links;
 	for (auto link : mr->mgi()->getLinkNames())links.push_back(link);
@@ -991,33 +975,33 @@ void Moveit_mediator::merge_ps(moveit_msgs::PlanningScene& out, moveit_msgs::Pla
 	links.push_back(mr->map()["base"]);
 
 
-	for (auto ao : in->robot_state.attached_collision_objects) out.robot_state.attached_collision_objects.push_back(ao);
-	if (in->robot_state.is_diff) out.robot_state.is_diff = in->robot_state.is_diff;
-	if (in->is_diff) out.is_diff = in->is_diff;
-	out.robot_state.joint_state.header = in->robot_state.joint_state.header;
+	for (auto ao : in.robot_state.attached_collision_objects) out.robot_state.attached_collision_objects.push_back(ao);
+	if (in.robot_state.is_diff) out.robot_state.is_diff = in.robot_state.is_diff;
+	if (in.is_diff) out.is_diff = in.is_diff;
+	out.robot_state.joint_state.header = in.robot_state.joint_state.header;
 	out.robot_model_name = "panda";
 
 
 
 	for (auto link : links) {
-		for(int i = 0; i < in->robot_state.joint_state.name.size(); i++){
-			if(link.c_str() == in->robot_state.joint_state.name[i].c_str()){
-				out.robot_state.joint_state.effort.push_back(in->robot_state.joint_state.effort[i]);
-				out.robot_state.joint_state.position.push_back(in->robot_state.joint_state.position[i]);
-				out.robot_state.joint_state.velocity.push_back(in->robot_state.joint_state.velocity[i]);
+		for(int i = 0; i < in.robot_state.joint_state.name.size(); i++){
+			if(link.c_str() == in.robot_state.joint_state.name[i].c_str()){
+				out.robot_state.joint_state.effort.push_back(in.robot_state.joint_state.effort[i]);
+				out.robot_state.joint_state.position.push_back(in.robot_state.joint_state.position[i]);
+				out.robot_state.joint_state.velocity.push_back(in.robot_state.joint_state.velocity[i]);
 				ROS_INFO("check");
 			}
 		}
 
-		for(int i = 0; i < in->link_padding.size(); i++){
-			if(link.c_str() == in->link_padding[i].link_name.c_str()){
-				out.link_padding.push_back(in->link_padding[i]);
+		for(int i = 0; i < in.link_padding.size(); i++){
+			if(link.c_str() == in.link_padding[i].link_name.c_str()){
+				out.link_padding.push_back(in.link_padding[i]);
 			}
 		}
 
-		for(int i = 0; i < in->link_scale.size(); i++){
-			if(link.c_str() == in->link_scale[i].link_name.c_str()){
-				out.link_scale.push_back(in->link_scale[i]);
+		for(int i = 0; i < in.link_scale.size(); i++){
+			if(link.c_str() == in.link_scale[i].link_name.c_str()){
+				out.link_scale.push_back(in.link_scale[i]);
 			}
 		}
 	}
@@ -1325,106 +1309,6 @@ moveit::task_constructor::Task Moveit_mediator::create_Task(Moveit_robot* mr, mo
 }
 
 
-void Moveit_mediator::rewrite_task_template(Abstract_robot* r, moveit_msgs::CollisionObject& source, tf2::Transform& target){
-    tf2::Transform t(tf2::Quaternion(source.pose.orientation.x, source.pose.orientation.y, source.pose.orientation.z, source.pose.orientation.w), tf2::Vector3(source.pose.position.x, source.pose.position.y, source.pose.position.z));
-    // unique ids cartesian, samplimg, interpolation, ready, hand_open, pick_up
-
-    std::string support_surface1 = "nichts";
-    std::string support_surface2 = "nichts";
-
-	XmlRpc::XmlRpcValue task;
-    nh_->getParam("task/stages", task);
-
-
-
-    for (Abstract_robot* ar : robots_){
-        std::string str;
-        if(ar->check_single_object_collision(t, str)) support_surface1 = str;
-        if(ar->check_single_object_collision(target, str)) support_surface2= str;
-    }
-
-	Moveit_robot* mr = dynamic_cast<Moveit_robot*>(r);
-    
-    ROS_INFO("%f %f %f source", t.getOrigin().getX(), t.getOrigin().getY(), t.getOrigin().getZ());
-
-    ROS_INFO("surface1 %s", support_surface1.c_str());
-    ROS_INFO("surface2 %s", support_surface2.c_str());
-
-
-    nh_->setParam("/task/properties/group", r->name());
-    nh_->setParam("/task/properties/eef", mr->map()["eef"]);
-    nh_->setParam("/task/properties/hand_grasping_frame", mr->map()["hand_grasping_frame"]);
-    nh_->setParam("/task/properties/ik_frame", mr->map()["ik_frame"]);
-    nh_->setParam("/task/properties/hand", mr->map()["hand"]);
-
-    XmlRpc::XmlRpcValue a, b, c, d, e, h;
-    a["group"] = mr->map()["hand"];
-    e["joint_model_group_name"] = mr->map()["hand"];
-
-    b = task[4]["stages"];
-    b[1]["stage"]["properties"]["object"] = source.id;
-    b[3]["properties"] = a;
-    b[2]["set"]["allow_collisions"]["first"] = source.id;
-    b[2]["set"]["allow_collisions"]["second"] = e;
-
-    c = task[6]["stages"];
-
-    c[0]["set"]["allow_collisions"]["first"] = source.id;
-    c[0]["set"]["allow_collisions"]["second"] = support_surface2;
-    c[3]["properties"] = a;
-    c[6]["properties"] = a;
-    c[4]["set"]["allow_collisions"]["first"] = source.id;
-    c[4]["set"]["allow_collisions"]["second"] = e;
-
-    c[2]["stage"]["set"]["pose"]["point"]["x"]= static_cast<double>(target.getOrigin().getX());
-    c[2]["stage"]["set"]["pose"]["point"]["y"]= static_cast<double>(target.getOrigin().getY());
-    c[2]["stage"]["set"]["pose"]["point"]["z"]= static_cast<double>(target.getOrigin().getZ());
-
-
-    task[2]["properties"] = a;
-
-    XmlRpc::XmlRpcValue connect, f, g;
-    f[r->name()] = "sampling";
-    g["source"] = "PARENT";
-    connect["type"] = "Connect";
-    connect["group_planner_vector"] = f;
-    connect["propertiesConfigureInitFrom"] = g;
-    task[5] = connect;
-    task[3] = connect;
-
-    a.clear();
-    e.clear();
-    a["link"] = mr->map()["ik_frame"];
-    a["min_distance"] = 0.07;
-    a["max_distance"] = 0.2;
-    c[5]["properties"] = a;
-    b[0]["properties"] = a;
-    a["min_distance"] = 0.1;
-    a["max_distance"] = 0.2;
-    c[1]["properties"] = a;
-
-    e["object"] = "bottle";
-    e["link"] = mr->map()["ik_frame"];
-    b[4]["set"]["attach_object"] = e;
-    c[4]["set"]["detach_object"] = e;
-    c[2]["set"]["ik_frame"]["link"] = mr->map()["ik_frame"];
-    c[5]["set"]["direction"]["vector"]["header"]["frame_id"]  = mr->map()["ik_frame"];
-    b[1]["set"]["ik_frame"]["link"] = mr->map()["ik_frame"];
-    b[6]["set"]["ik_frame"]["link"] = mr->map()["ik_frame"];
-    b[0]["set"]["direction"]["vector"]["header"]["frame_id"] = mr->map()["ik_frame"];
-
-    b[5]["set"]["allow_collisions"]["first"] = source.id;
-    b[5]["set"]["allow_collisions"]["second"] = support_surface1;
-    b[7]["set"]["allow_collisions"]["first"] = source.id;
-    b[7]["set"]["allow_collisions"]["second"] = support_surface1;
-
-    task[6]["stages"] = c;
-    task[4]["stages"] = b;
-
-    nh_->setParam("task/stages", task);
-
-}
-
 Moveit_mediator::Moveit_mediator(std::vector<std::vector<tf2::Transform>> objects, ros::Publisher* pub, std::shared_ptr<ros::NodeHandle> const& nh)
     : Abstract_mediator(objects, pub), nh_(nh)
     , sampling_planner_(std::make_unique<moveit::task_constructor::solvers::PipelinePlanner>())