diff --git a/.catkin_tools/profiles/default/devel_collisions.txt b/.catkin_tools/profiles/default/devel_collisions.txt
index a99b3e8c806533a16d0b11b6a5ede667d211d6d1..8c649ed65f675068f4c74bc4eccb4ce30f96ab51 100644
--- a/.catkin_tools/profiles/default/devel_collisions.txt
+++ b/.catkin_tools/profiles/default/devel_collisions.txt
@@ -1,4 +1,4 @@
 /home/matteo/ws_panda/devel/./cmake.lock 42
-/home/matteo/reachability/devel/./cmake.lock 21138
+/home/matteo/reachability/devel/./cmake.lock 21925
 /home/matteo/reachability/devel/lib/libmoveit_grasps.so 79
 /home/matteo/reachability/devel/lib/libmoveit_grasps_filter.so 79
diff --git a/src/.vscode/c_cpp_properties.json b/src/.vscode/c_cpp_properties.json
index 73b94dd7c5066c90b3c9ad8baa14adcda17b8395..836711d39b12de45d9d0e96800c31359984789fc 100644
--- a/src/.vscode/c_cpp_properties.json
+++ b/src/.vscode/c_cpp_properties.json
@@ -39,7 +39,8 @@
                 "${workspaceFolder}/mtc/src",
                 "${workspaceFolder}/yaml_to_mtc/include",
                 "${workspaceFolder}/moveit_task_constructor/core/include",
-                "${workspaceFolder}/moveit_task_constructor/"
+                "${workspaceFolder}/moveit_task_constructor/",
+                "${workspaceFolder}/object_creator/include"
             ],
             "name": "ROS",
             "cStandard": "c17",
diff --git a/src/mtc/include/impl/moveit_robot.h b/src/mtc/include/impl/moveit_robot.h
index 387d9b26cc207ff3be503e835dc81c4365cdd2de..60e789438cf403620374056ec374f7263179fc5a 100644
--- a/src/mtc/include/impl/moveit_robot.h
+++ b/src/mtc/include/impl/moveit_robot.h
@@ -8,7 +8,7 @@
 class Moveit_robot : public Robot{
     protected:
     moveit::planning_interface::MoveGroupInterface* mgi_;
-    std::map<std::string, std::pair <std::string, std::string>>  map_; 
+    std::map<std::string, std::string>  map_; 
 
 
 
@@ -16,26 +16,21 @@ class Moveit_robot : public Robot{
     public:
     Moveit_robot(std::string& name, tf2::Transform tf, tf2::Vector3 size) : Robot(name, tf, size){
         mgi_ = new moveit::planning_interface::MoveGroupInterface(name);
-        std::stringstream group, eef, hand_grasping_frame, ik_frame, hand, hand_n, ik_frame_n, name_n;
+        std::stringstream hand_n, ik_frame_n, name_n;
         name_n << name;
-        group << "group_" << name;
-        eef << "eef_" << name;
-        hand_grasping_frame << "hand_grasping_frame_" << name;
-        ik_frame << "ik_frame_" << name;
-        hand << "hand_" << name;
         hand_n << "hand_" << name.back();
         ik_frame_n << "panda_" << name.back() << "_link8";
 
 
-        map_.insert(std::make_pair<std::string, std::pair<std::string, std::string>>("group", std::make_pair<std::string, std::string>(group.str(), name_n.str())));
-        map_.insert(std::make_pair<std::string, std::pair<std::string, std::string>>("eef", std::make_pair<std::string, std::string>(eef.str(), hand_n.str())));
-        map_.insert(std::make_pair<std::string, std::pair<std::string, std::string>>("hand_grasping_frame", std::make_pair<std::string, std::string>(hand_grasping_frame.str(), ik_frame_n.str())));
-        map_.insert(std::make_pair<std::string, std::pair<std::string, std::string>>("ik_frame", std::make_pair<std::string, std::string>(ik_frame.str(), ik_frame_n.str())));
-        map_.insert(std::make_pair<std::string, std::pair<std::string, std::string>>("hand", std::make_pair<std::string, std::string>(hand.str(), hand_n.str())));
+        map_.insert(std::make_pair<std::string, std::string>("group", name_n.str()));
+        map_.insert(std::make_pair<std::string, std::string>("eef", hand_n.str()));
+        map_.insert(std::make_pair<std::string, std::string>("hand_grasping_frame", ik_frame_n.str()));
+        map_.insert(std::make_pair<std::string, std::string>("ik_frame", ik_frame_n.str()));
+        map_.insert(std::make_pair<std::string, std::string>("hand", hand_n.str()));
     }
 
     inline moveit::planning_interface::MoveGroupInterface* mgi() {return mgi_;}
-    inline std::map<std::string, std::pair <std::string, std::string>>&  map(){return map_;};
+    inline std::map<std::string, std::string>&  map(){return map_;};
 
 
 };
diff --git a/src/mtc/src/impl/moveit_mediator.cpp b/src/mtc/src/impl/moveit_mediator.cpp
index 1d53c0e7b6c34c1d40820fdfbe34a4ad95728eb9..75bf7caca2fc030bb358f60948340953e512bc5f 100644
--- a/src/mtc/src/impl/moveit_mediator.cpp
+++ b/src/mtc/src/impl/moveit_mediator.cpp
@@ -1,8 +1,21 @@
 #include "impl/moveit_mediator.h"
 #include "impl/wing_moveit_decorator.h"
 #include "impl/collision_helper.h"
-#include <yaml_to_mtc.h>
-
+#include <moveit/task_constructor/task.h>
+#include <moveit/task_constructor/stages/compute_ik.h>
+#include <moveit/task_constructor/stages/connect.h>
+#include <moveit/task_constructor/stages/current_state.h>
+#include <moveit/task_constructor/stages/generate_grasp_pose.h>
+#include <moveit/task_constructor/stages/generate_pose.h>
+#include <moveit/task_constructor/stages/generate_place_pose.h>
+#include <moveit/task_constructor/stages/modify_planning_scene.h>
+#include <moveit/task_constructor/stages/move_relative.h>
+#include <moveit/task_constructor/stages/move_to.h>
+#include <moveit/task_constructor/stages/predicate_filter.h>
+#include <moveit/task_constructor/solvers/cartesian_path.h>
+#include <moveit/task_constructor/solvers/pipeline_planner.h>
+#include <moveit_task_constructor_msgs/ExecuteTaskSolutionAction.h>
+#include <eigen_conversions/eigen_msg.h>
 
 
 void Moveit_mediator::publish_tables(moveit::planning_interface::PlanningSceneInterface& psi){
@@ -61,7 +74,7 @@ void Moveit_mediator::mediate(){
     rewrite_task_template(robots_[0], psi.getObjects().at("bottle"), target);
 
 
-    Yaml_Mtc_Parser parser = Yaml_Mtc_Parser();
+    /*Yaml_Mtc_Parser parser = Yaml_Mtc_Parser();
     moveit::task_constructor::Task task = parser.init_task(this->nh_);
     int max_planning_solutions = 1; // default one solution 
     this->nh_.getParam("max_planning_solutions", max_planning_solutions);
@@ -76,6 +89,7 @@ void Moveit_mediator::mediate(){
 		std::cerr << "planning failed with exception" << std::endl << ex << task;
 	}
 	ros::waitForShutdown();
+	*/
 };
 
 void Moveit_mediator::build_wings(std::bitset<3>& wing, int& robot){
@@ -103,17 +117,6 @@ void Moveit_mediator::set_wings(std::vector<std::vector<wing_BP>>& wbp){
 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
-    setup_task();
-
-    XmlRpc::XmlRpcValue task;
-    nh_.getParam("task/stages", task);
-
-    std::stringstream ss;
-    ss << "hand_" << r->name().back();
-    std::string hand = ss.str();
-    std::stringstream sss;
-    sss << "panda_" << r->name().back() << "_link8";
-    std::string last_link = sss.str();
 
     std::string support_surface1 = "nichts";
     std::string support_surface2 = "nichts";
@@ -125,6 +128,8 @@ void Moveit_mediator::rewrite_task_template(Abstract_robot* r, moveit_msgs::Coll
         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());
@@ -202,17 +207,734 @@ void Moveit_mediator::rewrite_task_template(Abstract_robot* r, moveit_msgs::Coll
     task[4]["stages"] = b;
 
     nh_.setParam("task/stages", task);
+
+    */
+    const std::string object = source.id;
+
+	// Reset ROS introspection before constructing the new object
+	// TODO(v4hn): global storage for Introspection services to enable one-liner
+    moveit::task_constructor::Task task_;
+
+
+	task_.stages()->setName("Pick and Place test");
+	task_.loadRobotModel();
+	task_.setRobotModel(mr->mgi()->getRobotModel());
+
+	// Sampling planner
+	auto sampling_planner = std::make_shared<moveit::task_constructor::solvers::PipelinePlanner>();
+	sampling_planner->setProperty("goal_joint_tolerance", 1e-5);
+
+	// Cartesian planner
+	auto cartesian_planner = std::make_shared<moveit::task_constructor::solvers::CartesianPath>();
+	cartesian_planner->setMaxVelocityScaling(1.0);
+	cartesian_planner->setMaxAccelerationScaling(1.0);
+	cartesian_planner->setStepSize(.01);
+
+	// Set task properties
+	task_.setProperty("group", "panda_arm1");
+	task_.setProperty("eef", "hand_1");
+	task_.setProperty("hand", "panda_1_link8");
+	task_.setProperty("hand_grasping_frame", "panda_1_link8");
+	task_.setProperty("ik_frame", "hand_1");
+
+	/****************************************************
+	 *                                                  *
+	 *               Current State                      *
+	 *                                                  *
+	 ***************************************************/
+	moveit::task_constructor::Stage* current_state_ptr = nullptr;  // Forward current_state on to grasp pose generator
+	{
+		auto current_state = std::make_unique< moveit::task_constructor::stages::CurrentState>("current state");
+
+		// Verify that object is not attached
+		auto applicability_filter = std::make_unique< moveit::task_constructor::stages::PredicateFilter>("applicability test", std::move(current_state));
+		applicability_filter->setPredicate([object](const moveit::task_constructor::SolutionBase& s, std::string& comment) {
+			if (s.start()->scene()->getCurrentState().hasAttachedBody(object)) {
+				comment = "object with id '" + object + "' is already attached and cannot be picked";
+				return false;
+			}
+			return true;
+		});
+
+		current_state_ptr = applicability_filter.get();
+		task_.add(std::move(applicability_filter));
+	}
+
+	/****************************************************
+	 *                                                  *
+	 *               Open Hand                          *
+	 *                                                  *
+	 ***************************************************/
+	{  // Open Hand
+		auto stage = std::make_unique< moveit::task_constructor::stages::MoveTo>("open hand", sampling_planner);
+		stage->setGroup("hand_1");
+		stage->setGoal("open");
+		task_.add(std::move(stage));
+	}
+
+	/****************************************************
+	 *                                                  *
+	 *               Move to Pick                       *
+	 *                                                  *
+	 ***************************************************/
+	{  // Move-to pre-grasp
+		auto stage = std::make_unique< moveit::task_constructor::stages::Connect>(
+		    "move to pick",  moveit::task_constructor::stages::Connect::GroupPlannerVector{ { "panda_arm1",  sampling_planner} });
+		stage->setTimeout(5.0);
+		stage->properties().configureInitFrom(moveit::task_constructor::Stage::PARENT);
+		task_.add(std::move(stage));
+	}
+
+	/****************************************************
+	 *                                                  *
+	 *               Pick Object                        *
+	 *                                                  *
+	 ***************************************************/
+	 moveit::task_constructor::Stage* attach_object_stage = nullptr;  // Forward attach_object_stage to place pose generator
+	{
+		auto grasp = std::make_unique<moveit::task_constructor::SerialContainer>("pick object");
+		task_.properties().exposeTo(grasp->properties(), { "eef", "hand", "group", "ik_frame" });
+		grasp->properties().configureInitFrom(moveit::task_constructor::Stage::PARENT, { "eef", "hand", "group", "ik_frame" });
+
+		/****************************************************
+  ---- *               Approach Object                    *
+		 ***************************************************/
+		{
+			auto stage = std::make_unique<moveit::task_constructor::stages::MoveRelative>("approach object", cartesian_planner);
+			stage->properties().set("marker_ns", "approach_object");
+			stage->properties().set("link", "panda_1_link8");
+			stage->properties().configureInitFrom(moveit::task_constructor::Stage::PARENT, { "group" });
+			stage->setMinMaxDistance(0.07, 0.2);
+
+			// Set hand forward direction
+			geometry_msgs::Vector3Stamped vec;
+			vec.header.frame_id = "panda_1_link8";
+			vec.vector.z = 1.0;
+			stage->setDirection(vec);
+			grasp->insert(std::move(stage));
+		}
+
+		/****************************************************
+  ---- *               Generate Grasp Pose                *
+		 ***************************************************/
+		{
+			// Sample grasp pose
+			auto stage = std::make_unique<moveit::task_constructor::stages::GenerateGraspPose>("generate grasp pose");
+			stage->properties().configureInitFrom(moveit::task_constructor::Stage::PARENT);
+			stage->properties().set("marker_ns", "grasp_pose");
+			stage->setPreGraspPose("open");
+			stage->setObject(object);
+			stage->setAngleDelta(M_PI / 2);
+			stage->setMonitoredStage(current_state_ptr);  // Hook into current state
+
+			// Compute IK
+			Eigen::Quaterniond eigen = Eigen::AngleAxisd(1.571f, Eigen::Vector3d::UnitX()) *
+                                   Eigen::AngleAxisd(0.785f, Eigen::Vector3d::UnitY()) *
+                                   Eigen::AngleAxisd(1.571f, Eigen::Vector3d::UnitZ());
+			Eigen::Translation3d trans(0.1f, 0, 0);
+			Eigen::Isometry3d ik = eigen * trans;
+
+			auto wrapper = std::make_unique<moveit::task_constructor::stages::ComputeIK>("grasp pose IK", std::move(stage));
+			wrapper->setMaxIKSolutions(8);
+			wrapper->setMinSolutionDistance(1.0);
+			wrapper->setIKFrame(ik, "panda_1_link8");
+			wrapper->properties().configureInitFrom(moveit::task_constructor::Stage::PARENT, { "eef", "group" });
+			wrapper->properties().configureInitFrom(moveit::task_constructor::Stage::INTERFACE, { "target_pose" });
+			grasp->insert(std::move(wrapper));
+		}
+
+		/****************************************************
+  ---- *               Allow Collision (hand object)   *
+		 ***************************************************/
+		{
+			auto stage = std::make_unique<moveit::task_constructor::stages::ModifyPlanningScene>("allow collision (hand,object)");
+			stage->allowCollisions(
+			    object, task_.getRobotModel()->getJointModelGroup("hand_1")->getLinkModelNamesWithCollisionGeometry(),
+			    true);
+			grasp->insert(std::move(stage));
+		}
+
+		/****************************************************
+  ---- *               Close Hand                      *
+		 ***************************************************/
+		{
+			auto stage = std::make_unique<moveit::task_constructor::stages::MoveTo>("close hand", sampling_planner);
+			stage->setGroup("hand_1");
+			stage->setGoal("close");
+			grasp->insert(std::move(stage));
+		}
+
+		/****************************************************
+  .... *               Attach Object                      *
+		 ***************************************************/
+		{
+			auto stage = std::make_unique<moveit::task_constructor::stages::ModifyPlanningScene>("attach object");
+			stage->attachObject(object, "panda_1_link8");
+			attach_object_stage = stage.get();
+			grasp->insert(std::move(stage));
+		}
+
+		/****************************************************
+  .... *               Allow collision (object support)   *
+		 ***************************************************/
+		{
+			auto stage = std::make_unique<moveit::task_constructor::stages::ModifyPlanningScene>("allow collision (object,support)");
+			stage->allowCollisions({ object }, support_surface1, true);
+			grasp->insert(std::move(stage));
+		}
+
+		/****************************************************
+  .... *               Lift object                        *
+		 ***************************************************/
+		{
+			auto stage = std::make_unique<moveit::task_constructor::stages::MoveRelative>("lift object", cartesian_planner);
+			stage->properties().configureInitFrom(moveit::task_constructor::Stage::PARENT, { "group" });
+			stage->setMinMaxDistance(0.1, 0.2);
+			stage->setIKFrame("panda_1_link8");
+			stage->properties().set("marker_ns", "lift_object");
+
+			// Set upward direction
+			geometry_msgs::Vector3Stamped vec;
+			vec.header.frame_id = "world";
+			vec.vector.z = 1.0;
+			stage->setDirection(vec);
+			grasp->insert(std::move(stage));
+		}
+
+		/****************************************************
+  .... *               Forbid collision (object support)  *
+		 ***************************************************/
+		{
+			auto stage = std::make_unique<moveit::task_constructor::stages::ModifyPlanningScene>("forbid collision (object,surface)");
+			stage->allowCollisions({ object }, support_surface1, false);
+			grasp->insert(std::move(stage));
+		}
+
+		// Add grasp container to task
+		task_.add(std::move(grasp));
+	}
+
+	/******************************************************
+	 *                                                    *
+	 *          Move to Place                             *
+	 *                                                    *
+	 *****************************************************/
+	{
+		auto stage = std::make_unique<moveit::task_constructor::stages::Connect>(
+		    "move to place", moveit::task_constructor::stages::Connect::GroupPlannerVector{ { "panda_arm1", sampling_planner } });
+		stage->setTimeout(5.0);
+		stage->properties().configureInitFrom(moveit::task_constructor::Stage::PARENT);
+		task_.add(std::move(stage));
+	}
+
+	/******************************************************
+	 *                                                    *
+	 *          Place Object                              *
+	 *                                                    *
+	 *****************************************************/
+	{
+		auto place = std::make_unique<moveit::task_constructor::SerialContainer>("place object");
+		task_.properties().exposeTo(place->properties(), { "eef", "hand", "group" });
+		place->properties().configureInitFrom(moveit::task_constructor::Stage::PARENT, { "eef", "hand", "group" });
+
+				/****************************************************
+  .... *               Forbid collision (object support)  *
+		 ***************************************************/
+		{
+			auto stage = std::make_unique<moveit::task_constructor::stages::ModifyPlanningScene>("forbid collision (object,surface)");
+			stage->allowCollisions({ object }, support_surface2, true);
+			place->insert(std::move(stage));
+		}
+
+		/******************************************************
+  ---- *          Lower Object                              *
+		 *****************************************************/
+		{
+			auto stage = std::make_unique<moveit::task_constructor::stages::MoveRelative>("lower object", cartesian_planner);
+			stage->properties().set("marker_ns", "lower_object");
+			stage->properties().set("link", "panda_1_link8");
+			stage->properties().configureInitFrom(moveit::task_constructor::Stage::PARENT, { "group" });
+			stage->setMinMaxDistance(.03, .13);
+
+			// Set downward direction
+			geometry_msgs::Vector3Stamped vec;
+			vec.header.frame_id = "world";
+			vec.vector.z = -1.0;
+			stage->setDirection(vec);
+			place->insert(std::move(stage));
+		}
+
+		/******************************************************
+  ---- *          Generate Place Pose                       *
+		 *****************************************************/
+		{
+			// Generate Place Pose
+			auto stage = std::make_unique<moveit::task_constructor::stages::GeneratePlacePose>("generate place pose");
+			stage->properties().configureInitFrom(moveit::task_constructor::Stage::PARENT, { "ik_frame" });
+			stage->properties().set("marker_ns", "place_pose");
+			stage->setObject(object);
+
+			// Set target pose
+			geometry_msgs::PoseStamped p;
+			p.header.frame_id = "world";
+			p.pose.position.x = target.getOrigin().getX();
+			p.pose.position.y = target.getOrigin().getY();
+			p.pose.position.z = target.getOrigin().getZ();
+			p.pose.orientation.x = target.getRotation().getX();
+			p.pose.orientation.y = target.getRotation().getY();
+			p.pose.orientation.z = target.getRotation().getZ();
+			p.pose.orientation.w = target.getRotation().getW();
+
+
+
+			stage->setPose(p);
+			stage->setMonitoredStage(attach_object_stage);  // Hook into attach_object_stage
+
+			// Compute IK
+			Eigen::Quaterniond eigen = Eigen::AngleAxisd(1.571f, Eigen::Vector3d::UnitX()) *
+                                   Eigen::AngleAxisd(0.785f, Eigen::Vector3d::UnitY()) *
+                                   Eigen::AngleAxisd(1.571f, Eigen::Vector3d::UnitZ());
+			Eigen::Translation3d trans(0.1f, 0, 0);
+			Eigen::Isometry3d ik = eigen * trans;
+			auto wrapper = std::make_unique<moveit::task_constructor::stages::ComputeIK>("place pose IK", std::move(stage));
+			wrapper->setMaxIKSolutions(2);
+			wrapper->setIKFrame(ik, "panda_1_link8");
+			wrapper->properties().configureInitFrom(moveit::task_constructor::Stage::PARENT, { "eef", "group" });
+			wrapper->properties().configureInitFrom(moveit::task_constructor::Stage::INTERFACE, { "target_pose" });
+			place->insert(std::move(wrapper));
+		}
+
+		/******************************************************
+  ---- *          Open Hand                              *
+		 *****************************************************/
+		{
+			auto stage = std::make_unique<moveit::task_constructor::stages::MoveTo>("open hand", sampling_planner);
+			stage->setGroup("hand_1");
+			stage->setGoal("open");
+			place->insert(std::move(stage));
+		}
+
+		/******************************************************
+  ---- *          Forbid collision (hand, object)        *
+		 *****************************************************/
+		{
+			auto stage = std::make_unique<moveit::task_constructor::stages::ModifyPlanningScene>("allow collision (hand,object)");
+			stage->allowCollisions(
+			    object, task_.getRobotModel()->getJointModelGroup("hand_1")->getLinkModelNamesWithCollisionGeometry(),
+			    false);
+			place->insert(std::move(stage));
+		}
+
+		/******************************************************
+  ---- *          Detach Object                             *
+		 *****************************************************/
+		{
+			auto stage = std::make_unique<moveit::task_constructor::stages::ModifyPlanningScene>("detach object");
+			stage->detachObject(object, "panda_1_link8");
+			place->insert(std::move(stage));
+		}
+
+		/******************************************************
+  ---- *          Retreat Motion                            *
+		 *****************************************************/
+		{
+			auto stage = std::make_unique<moveit::task_constructor::stages::MoveRelative>("retreat after place", cartesian_planner);
+			stage->properties().configureInitFrom(moveit::task_constructor::Stage::PARENT, { "group" });
+			stage->setMinMaxDistance(.12, .25);
+			stage->setIKFrame("panda_1_link8");
+			stage->properties().set("marker_ns", "retreat");
+			geometry_msgs::Vector3Stamped vec;
+			vec.header.frame_id = "panda_1_link8";
+			vec.vector.z = -1.0;
+			stage->setDirection(vec);
+			place->insert(std::move(stage));
+		}
+
+		// Add place container to task
+		task_.add(std::move(place));
+	}
+
+	/******************************************************
+	 *                                                    *
+	 *          Move to Home                              *
+	 *                                                    *
+	 *****************************************************/
+	{
+		auto stage = std::make_unique<moveit::task_constructor::stages::MoveTo>("move home", sampling_planner);
+		stage->properties().configureInitFrom(moveit::task_constructor::Stage::PARENT, { "group" });
+		stage->setGoal("ready");
+		stage->restrictDirection(moveit::task_constructor::stages::MoveTo::FORWARD);
+		task_.add(std::move(stage));
+	}
+	
+	// ------------------
+
+	Moveit_robot* mr2 = dynamic_cast<Moveit_robot*>(robots_[1]);
+	moveit::task_constructor::Task task;
+
+
+	task.stages()->setName("Pick and Place test1");
+	task.loadRobotModel();
+	task.setRobotModel(mr2->mgi()->getRobotModel());
+
+
+
+	// Set task properties
+	task.setProperty("group", "panda_arm2");
+	task.setProperty("eef", "hand_2");
+	task.setProperty("hand", "panda_2_link8");
+	task.setProperty("hand_grasping_frame", "panda_2_link8");
+	task.setProperty("ik_frame", "hand_2");
+
+	/****************************************************
+	 *                                                  *
+	 *               Current State                      *
+	 *                                                  *
+	 ***************************************************/
+	current_state_ptr = nullptr;  // Forward current_state on to grasp pose generator
+	{
+		auto current_state = std::make_unique< moveit::task_constructor::stages::CurrentState>("current state");
+
+		// Verify that object is not attached
+		auto applicability_filter = std::make_unique< moveit::task_constructor::stages::PredicateFilter>("applicability test", std::move(current_state));
+		applicability_filter->setPredicate([object](const moveit::task_constructor::SolutionBase& s, std::string& comment) {
+			if (s.start()->scene()->getCurrentState().hasAttachedBody(object)) {
+				comment = "object with id '" + object + "' is already attached and cannot be picked";
+				return false;
+			}
+			return true;
+		});
+
+		current_state_ptr = applicability_filter.get();
+		task.add(std::move(applicability_filter));
+	}
+
+	/****************************************************
+	 *                                                  *
+	 *               Open Hand                          *
+	 *                                                  *
+	 ***************************************************/
+	{  // Open Hand
+		auto stage = std::make_unique< moveit::task_constructor::stages::MoveTo>("open hand", sampling_planner);
+		stage->setGroup("hand_2");
+		stage->setGoal("open");
+		task.add(std::move(stage));
+	}
+
+	/****************************************************
+	 *                                                  *
+	 *               Move to Pick                       *
+	 *                                                  *
+	 ***************************************************/
+	{  // Move-to pre-grasp
+		auto stage = std::make_unique< moveit::task_constructor::stages::Connect>(
+		    "move to pick",  moveit::task_constructor::stages::Connect::GroupPlannerVector{ { "panda_arm2",  sampling_planner} });
+		stage->setTimeout(5.0);
+		stage->properties().configureInitFrom(moveit::task_constructor::Stage::PARENT);
+		task.add(std::move(stage));
+	}
+
+	/****************************************************
+	 *                                                  *
+	 *               Pick Object                        *
+	 *                                                  *
+	 ***************************************************/
+	 attach_object_stage = nullptr;  // Forward attach_object_stage to place pose generator
+	{
+		auto grasp = std::make_unique<moveit::task_constructor::SerialContainer>("pick object");
+		task.properties().exposeTo(grasp->properties(), { "eef", "hand", "group", "ik_frame" });
+		grasp->properties().configureInitFrom(moveit::task_constructor::Stage::PARENT, { "eef", "hand", "group", "ik_frame" });
+
+		/****************************************************
+  ---- *               Approach Object                    *
+		 ***************************************************/
+		{
+			auto stage = std::make_unique<moveit::task_constructor::stages::MoveRelative>("approach object", cartesian_planner);
+			stage->properties().set("marker_ns", "approach_object");
+			stage->properties().set("link", "panda_2_link8");
+			stage->properties().configureInitFrom(moveit::task_constructor::Stage::PARENT, { "group" });
+			stage->setMinMaxDistance(0.07, 0.2);
+
+			// Set hand forward direction
+			geometry_msgs::Vector3Stamped vec;
+			vec.header.frame_id = "panda_2_link8";
+			vec.vector.z = 1.0;
+			stage->setDirection(vec);
+			grasp->insert(std::move(stage));
+		}
+
+		/****************************************************
+  ---- *               Generate Grasp Pose                *
+		 ***************************************************/
+		{
+			// Sample grasp pose
+			auto stage = std::make_unique<moveit::task_constructor::stages::GenerateGraspPose>("generate grasp pose");
+			stage->properties().configureInitFrom(moveit::task_constructor::Stage::PARENT);
+			stage->properties().set("marker_ns", "grasp_pose");
+			stage->setPreGraspPose("open");
+			stage->setObject(object);
+			stage->setAngleDelta(M_PI / 2);
+			stage->setMonitoredStage(current_state_ptr);  // Hook into current state
+
+			// Compute IK
+			Eigen::Quaterniond eigen = Eigen::AngleAxisd(1.571f, Eigen::Vector3d::UnitX()) *
+                                   Eigen::AngleAxisd(0.785f, Eigen::Vector3d::UnitY()) *
+                                   Eigen::AngleAxisd(1.571f, Eigen::Vector3d::UnitZ());
+			Eigen::Translation3d trans(0.1f, 0, 0);
+			Eigen::Isometry3d ik = eigen * trans;
+
+			auto wrapper = std::make_unique<moveit::task_constructor::stages::ComputeIK>("grasp pose IK", std::move(stage));
+			wrapper->setMaxIKSolutions(8);
+			wrapper->setMinSolutionDistance(1.0);
+			wrapper->setIKFrame(ik, "panda_2_link8");
+			wrapper->properties().configureInitFrom(moveit::task_constructor::Stage::PARENT, { "eef", "group" });
+			wrapper->properties().configureInitFrom(moveit::task_constructor::Stage::INTERFACE, { "target_pose" });
+			grasp->insert(std::move(wrapper));
+		}
+
+		/****************************************************
+  ---- *               Allow Collision (hand object)   *
+		 ***************************************************/
+		{
+			auto stage = std::make_unique<moveit::task_constructor::stages::ModifyPlanningScene>("allow collision (hand,object)");
+			stage->allowCollisions(
+			    object, task.getRobotModel()->getJointModelGroup("hand_2")->getLinkModelNamesWithCollisionGeometry(),
+			    true);
+			grasp->insert(std::move(stage));
+		}
+
+		/****************************************************
+  ---- *               Close Hand                      *
+		 ***************************************************/
+		{
+			auto stage = std::make_unique<moveit::task_constructor::stages::MoveTo>("close hand", sampling_planner);
+			stage->setGroup("hand_2");
+			stage->setGoal("close");
+			grasp->insert(std::move(stage));
+		}
+
+		/****************************************************
+  .... *               Attach Object                      *
+		 ***************************************************/
+		{
+			auto stage = std::make_unique<moveit::task_constructor::stages::ModifyPlanningScene>("attach object");
+			stage->attachObject(object, "panda_2_link8");
+			attach_object_stage = stage.get();
+			grasp->insert(std::move(stage));
+		}
+
+		/****************************************************
+  .... *               Allow collision (object support)   *
+		 ***************************************************/
+		{
+			auto stage = std::make_unique<moveit::task_constructor::stages::ModifyPlanningScene>("allow collision (object,support)");
+			stage->allowCollisions({ object }, support_surface1, true);
+			grasp->insert(std::move(stage));
+		}
+
+		/****************************************************
+  .... *               Lift object                        *
+		 ***************************************************/
+		{
+			auto stage = std::make_unique<moveit::task_constructor::stages::MoveRelative>("lift object", cartesian_planner);
+			stage->properties().configureInitFrom(moveit::task_constructor::Stage::PARENT, { "group" });
+			stage->setMinMaxDistance(0.1, 0.2);
+			stage->setIKFrame("panda_2_link8");
+			stage->properties().set("marker_ns", "lift_object");
+
+			// Set upward direction
+			geometry_msgs::Vector3Stamped vec;
+			vec.header.frame_id = "world";
+			vec.vector.z = 1.0;
+			stage->setDirection(vec);
+			grasp->insert(std::move(stage));
+		}
+
+		/****************************************************
+  .... *               Forbid collision (object support)  *
+		 ***************************************************/
+		{
+			auto stage = std::make_unique<moveit::task_constructor::stages::ModifyPlanningScene>("forbid collision (object,surface)");
+			stage->allowCollisions({ object }, support_surface1, false);
+			grasp->insert(std::move(stage));
+		}
+
+		// Add grasp container to task
+		task.add(std::move(grasp));
+	}
+
+	/******************************************************
+	 *                                                    *
+	 *          Move to Place                             *
+	 *                                                    *
+	 *****************************************************/
+	{
+		auto stage = std::make_unique<moveit::task_constructor::stages::Connect>(
+		    "move to place", moveit::task_constructor::stages::Connect::GroupPlannerVector{ { "panda_arm2", sampling_planner } });
+		stage->setTimeout(5.0);
+		stage->properties().configureInitFrom(moveit::task_constructor::Stage::PARENT);
+		task.add(std::move(stage));
+	}
+
+	/******************************************************
+	 *                                                    *
+	 *          Place Object                              *
+	 *                                                    *
+	 *****************************************************/
+	{
+		auto place = std::make_unique<moveit::task_constructor::SerialContainer>("place object");
+		task.properties().exposeTo(place->properties(), { "eef", "hand", "group" });
+		place->properties().configureInitFrom(moveit::task_constructor::Stage::PARENT, { "eef", "hand", "group" });
+
+				/****************************************************
+  .... *               Forbid collision (object support)  *
+		 ***************************************************/
+		{
+			auto stage = std::make_unique<moveit::task_constructor::stages::ModifyPlanningScene>("forbid collision (object,surface)");
+			stage->allowCollisions({ object }, support_surface2, true);
+			place->insert(std::move(stage));
+		}
+
+		/******************************************************
+  ---- *          Lower Object                              *
+		 *****************************************************/
+		{
+			auto stage = std::make_unique<moveit::task_constructor::stages::MoveRelative>("lower object", cartesian_planner);
+			stage->properties().set("marker_ns", "lower_object");
+			stage->properties().set("link", "panda_2_link8");
+			stage->properties().configureInitFrom(moveit::task_constructor::Stage::PARENT, { "group" });
+			stage->setMinMaxDistance(.03, .13);
+
+			// Set downward direction
+			geometry_msgs::Vector3Stamped vec;
+			vec.header.frame_id = "world";
+			vec.vector.z = -1.0;
+			stage->setDirection(vec);
+			place->insert(std::move(stage));
+		}
+
+		/******************************************************
+  ---- *          Generate Place Pose                       *
+		 *****************************************************/
+		{
+			// Generate Place Pose
+			auto stage = std::make_unique<moveit::task_constructor::stages::GeneratePlacePose>("generate place pose");
+			stage->properties().configureInitFrom(moveit::task_constructor::Stage::PARENT, { "ik_frame" });
+			stage->properties().set("marker_ns", "place_pose");
+			stage->setObject(object);
+
+			// Set target pose
+			geometry_msgs::PoseStamped p;
+			p.header.frame_id = "world";
+			p.pose.position.x = target.getOrigin().getX();
+			p.pose.position.y = target.getOrigin().getY();
+			p.pose.position.z = target.getOrigin().getZ();
+			p.pose.orientation.x = target.getRotation().getX();
+			p.pose.orientation.y = target.getRotation().getY();
+			p.pose.orientation.z = target.getRotation().getZ();
+			p.pose.orientation.w = target.getRotation().getW();
+
+
+
+			stage->setPose(p);
+			stage->setMonitoredStage(attach_object_stage);  // Hook into attach_object_stage
+
+			// Compute IK
+			Eigen::Quaterniond eigen = Eigen::AngleAxisd(1.571f, Eigen::Vector3d::UnitX()) *
+                                   Eigen::AngleAxisd(0.785f, Eigen::Vector3d::UnitY()) *
+                                   Eigen::AngleAxisd(1.571f, Eigen::Vector3d::UnitZ());
+			Eigen::Translation3d trans(0.1f, 0, 0);
+			Eigen::Isometry3d ik = eigen * trans;
+			auto wrapper = std::make_unique<moveit::task_constructor::stages::ComputeIK>("place pose IK", std::move(stage));
+			wrapper->setMaxIKSolutions(2);
+			wrapper->setIKFrame(ik, "panda_2_link8");
+			wrapper->properties().configureInitFrom(moveit::task_constructor::Stage::PARENT, { "eef", "group" });
+			wrapper->properties().configureInitFrom(moveit::task_constructor::Stage::INTERFACE, { "target_pose" });
+			place->insert(std::move(wrapper));
+		}
+
+		/******************************************************
+  ---- *          Open Hand                              *
+		 *****************************************************/
+		{
+			auto stage = std::make_unique<moveit::task_constructor::stages::MoveTo>("open hand", sampling_planner);
+			stage->setGroup("hand_2");
+			stage->setGoal("open");
+			place->insert(std::move(stage));
+		}
+
+		/******************************************************
+  ---- *          Forbid collision (hand, object)        *
+		 *****************************************************/
+		{
+			auto stage = std::make_unique<moveit::task_constructor::stages::ModifyPlanningScene>("allow collision (hand,object)");
+			stage->allowCollisions(
+			    object, task.getRobotModel()->getJointModelGroup("hand_2")->getLinkModelNamesWithCollisionGeometry(),
+			    false);
+			place->insert(std::move(stage));
+		}
+
+		/******************************************************
+  ---- *          Detach Object                             *
+		 *****************************************************/
+		{
+			auto stage = std::make_unique<moveit::task_constructor::stages::ModifyPlanningScene>("detach object");
+			stage->detachObject(object, "panda_2_link8");
+			place->insert(std::move(stage));
+		}
+
+		/******************************************************
+  ---- *          Retreat Motion                            *
+		 *****************************************************/
+		{
+			auto stage = std::make_unique<moveit::task_constructor::stages::MoveRelative>("retreat after place", cartesian_planner);
+			stage->properties().configureInitFrom(moveit::task_constructor::Stage::PARENT, { "group" });
+			stage->setMinMaxDistance(.12, .25);
+			stage->setIKFrame("panda_2_link8");
+			stage->properties().set("marker_ns", "retreat");
+			geometry_msgs::Vector3Stamped vec;
+			vec.header.frame_id = "panda_2_link8";
+			vec.vector.z = -1.0;
+			stage->setDirection(vec);
+			place->insert(std::move(stage));
+		}
+
+		// Add place container to task
+		task.add(std::move(place));
+	}
+
+	/******************************************************
+	 *                                                    *
+	 *          Move to Home                              *
+	 *                                                    *
+	 *****************************************************/
+	{
+		auto stage = std::make_unique<moveit::task_constructor::stages::MoveTo>("move home", sampling_planner);
+		stage->properties().configureInitFrom(moveit::task_constructor::Stage::PARENT, { "group" });
+		stage->setGoal("ready");
+		stage->restrictDirection(moveit::task_constructor::stages::MoveTo::FORWARD);
+		task.add(std::move(stage));
+	}
+
+	int max_planning_solution = 1;
+	if (task_.plan(max_planning_solution)){
+	moveit_msgs::MoveItErrorCodes execute_result;
+
+	execute_result = task_.execute(*task_.solutions().front());
+	//task_.introspection().publishSolution(*task_.solutions().front());
+	}
+
+
+	if (task.plan(max_planning_solution)){
+	moveit_msgs::MoveItErrorCodes execute_result;
+
+	execute_result = task.execute(*task.solutions().front());
+	//task_.introspection().publishSolution(*task_.solutions().front());
+	}
+
 }
 
 
 void Moveit_mediator::setup_task (){
-    for (Abstract_robot* robot : robots_){
-        Moveit_robot* mr = dynamic_cast<Moveit_robot*>(robot);
-
-        properties_[mr->map()["group"].first] = mr->map()["group"].second;
-        properties_[mr->map()["eef"].first] = mr->map()["eef"].second;
-        properties_[mr->map()["hand_grasping_frame"].first] = mr->map()["hand_grasping_frame"].second;
-        properties_[mr->map()["ik_frame"].first] = mr->map()["ik_frame"].second;
-        properties_[mr->map()["hand"].first] = mr->map()["hand"].second;
-    }
+ 
 }