diff --git a/.catkin_tools/profiles/default/devel_collisions.txt b/.catkin_tools/profiles/default/devel_collisions.txt
index b7bf02b8284aa2b2cb28399b9d43e30082b16dbc..cef6793205b81f7a69dd392904303a17fbbe18bf 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 8726
+/home/matteo/reachability/devel/./cmake.lock 8732
 /home/matteo/reachability/devel/lib/libmoveit_grasps.so 66
 /home/matteo/reachability/devel/lib/libmoveit_grasps_filter.so 66
diff --git a/src/mtc/include/impl/abstract_mediator.h b/src/mtc/include/impl/abstract_mediator.h
index 759969f76b5feb081f8d0283668d364a94eacd09..2b84eda571bf7794e26bc3c267c25d494f3e422d 100644
--- a/src/mtc/include/impl/abstract_mediator.h
+++ b/src/mtc/include/impl/abstract_mediator.h
@@ -3,16 +3,57 @@
 
 #include "ros/ros.h"
 #include "impl/abstract_robot.h"
+#include "impl/abstract_robot_element.h"
+#include "impl/robot.h"
 
 class Abstract_mediator{
     protected:
     std::vector<Abstract_robot*> robots_;
     std::vector<std::vector<tf2::Vector3>> objects_;
+    std::vector<std::vector<std::vector<tf2::Transform>>> relative_bounds_;
+    ros::Publisher* pub_;
+
 
 
     public:
-    Abstract_mediator(std::vector<std::vector<tf2::Vector3>> objects) : objects_(objects){};
-    virtual void connect_robots(Abstract_robot* robot) {robots_.push_back(robot); ROS_INFO("%s connected...", robot->name().c_str());};
+    Abstract_mediator(std::vector<std::vector<tf2::Vector3>> objects, ros::Publisher* pub) : objects_(objects), pub_(pub){}
+    inline void connect_robots(Abstract_robot* robot) {
+        robots_.push_back(robot); ROS_INFO("%s connected...", robot->name().c_str());
+        Robot* ceti = dynamic_cast<Robot*>(robot);
+        std::vector<tf2::Transform> plane;
+        plane.push_back(tf2::Transform(tf2::Quaternion(0,0,0,1), tf2::Vector3(0.4f, 0.4f, ceti->tf().getOrigin().getZ())));
+        plane.push_back(tf2::Transform(tf2::Quaternion(0,0,0,1), tf2::Vector3(-0.4f, 0.4f, ceti->tf().getOrigin().getZ())));
+        plane.push_back(tf2::Transform(tf2::Quaternion(0,0,0,1), tf2::Vector3(0.4f, -0.4f, ceti->tf().getOrigin().getZ())));
+        plane.push_back(tf2::Transform(tf2::Quaternion(0,0,0,1), tf2::Vector3(-0.4f, -0.4f, ceti->tf().getOrigin().getZ())));
+        std::vector<std::vector<tf2::Transform>> planes;
+
+        for(Abstract_robot_element* wing : ceti->observers()){
+            plane.clear();
+            if (wing->relative_tf().getOrigin().getY() > 0){
+                plane.push_back(tf2::Transform(tf2::Quaternion(0,0,0,1), tf2::Vector3(right.getX()/2.f, right.getY()/2.f,0)));
+                plane.push_back(tf2::Transform(tf2::Quaternion(0,0,0,1), tf2::Vector3(right.getX()/2.f, right.getY()/-2.f,0)));
+                plane.push_back(tf2::Transform(tf2::Quaternion(0,0,0,1), tf2::Vector3(right.getX()/-2.f, right.getY()/2.f,0)));
+                plane.push_back(tf2::Transform(tf2::Quaternion(0,0,0,1), tf2::Vector3(right.getX()/-2.f, right.getY()/-2.f,0)));
+            } else 
+            if (wing->relative_tf().getOrigin().getY() < 0){
+                plane.push_back(tf2::Transform(tf2::Quaternion(0,0,0,1), tf2::Vector3(left.getX()/2.f, left.getY()/2.f,0)));
+                plane.push_back(tf2::Transform(tf2::Quaternion(0,0,0,1), tf2::Vector3(left.getX()/2.f, left.getY()/-2.f,0)));
+                plane.push_back(tf2::Transform(tf2::Quaternion(0,0,0,1), tf2::Vector3(left.getX()/-2.f, left.getY()/2.f,0)));
+                plane.push_back(tf2::Transform(tf2::Quaternion(0,0,0,1), tf2::Vector3(left.getX()/-2.f, left.getY()/-2.f,0)));
+            } else
+            if (wing->relative_tf().getOrigin().getY() == 0){
+                plane.push_back(tf2::Transform(tf2::Quaternion(0,0,0,1), tf2::Vector3(mid.getX()/2.f, mid.getY()/2.f,0)));
+                plane.push_back(tf2::Transform(tf2::Quaternion(0,0,0,1), tf2::Vector3(mid.getX()/2.f, mid.getY()/-2.f,0)));
+                plane.push_back(tf2::Transform(tf2::Quaternion(0,0,0,1), tf2::Vector3(mid.getX()/-2.f, mid.getY()/2.f,0)));
+                plane.push_back(tf2::Transform(tf2::Quaternion(0,0,0,1), tf2::Vector3(mid.getX()/-2.f, mid.getY()/-2.f,0)));
+            }
+            planes.push_back(plane);
+        }
+        relative_bounds_.push_back(planes);
+    }
+
+    virtual void mediate()=0;
+
 };
 
 
diff --git a/src/mtc/include/impl/abstract_robot.h b/src/mtc/include/impl/abstract_robot.h
index 350814df4c83fda5d846417470f7d0200899213b..059745c3abc2a5ac9c56082ed8a31bc22b6a4775 100644
--- a/src/mtc/include/impl/abstract_robot.h
+++ b/src/mtc/include/impl/abstract_robot.h
@@ -7,6 +7,9 @@
 #include "impl/abstract_strategy.h"
 #include "impl/abstract_robot_element.h"
 
+#define right tf2::Vector3(0.7f, 0.5f, 0.01f)
+#define left tf2::Vector3(0.7f, 0.5f, 0.01f)
+#define mid tf2::Vector3(0.5f, 0.7f, 0.01f)
 
 class Abstract_robot {
     protected:
diff --git a/src/mtc/include/impl/mediator.h b/src/mtc/include/impl/mediator.h
index 73e1896824e6137200ba9359cec40076b719a228..7548dca02346db2e04a4eb4410b917e6d8228044 100644
--- a/src/mtc/include/impl/mediator.h
+++ b/src/mtc/include/impl/mediator.h
@@ -3,10 +3,25 @@
 
 #include "ros/ros.h"
 #include "impl/abstract_mediator.h"
+#include "impl/abstract_robot.h"
+#include "impl/robot.h"
 
 class Mediator : public Abstract_mediator{
     public:
-    Mediator(std::vector<std::vector<tf2::Vector3>> objects) : Abstract_mediator(objects){};
+    Mediator(std::vector<std::vector<tf2::Vector3>> objects, ros::Publisher* pub) : Abstract_mediator(objects, pub){};
+    void mediate() override {
+        ros::Rate loop_rate(1);
+        for (Abstract_robot* robot : robots_){
+            Robot* ceti = dynamic_cast<Robot*>(robot);
+            while (ros::ok()){
+                for (visualization_msgs::MarkerArray* markers : ceti->rviz_markers()) markers->markers.clear();
+                ceti->rotate(-M_PI/4);
+                ceti->notify();
+                for (visualization_msgs::MarkerArray* markers : ceti->rviz_markers())pub_->publish(*markers);
+                loop_rate.sleep();
+            }
+        }
+    }
 };
 
 
diff --git a/src/mtc/src/base_routine.cpp b/src/mtc/src/base_routine.cpp
index 814cc751b5d358374c8f1e67a7e0d5e7df75c7f6..9bf48965bd09aac3a0cab5eee13e05f466c67f52 100644
--- a/src/mtc/src/base_routine.cpp
+++ b/src/mtc/src/base_routine.cpp
@@ -19,9 +19,6 @@
 #include "impl/wing_rviz_decorator.cpp"
 #include "impl/field_rviz_decorator.cpp"
 
-#define right tf2::Vector3(0.7f, 0.5f, 0.01f)
-#define left tf2::Vector3(0.7f, 0.5f, 0.01f)
-#define mid tf2::Vector3(0.5f, 0.7f, 0.01f)
 
 
 
@@ -99,20 +96,9 @@ int main(int argc, char **argv){
     map_loader->base_calculation();
     */
 
-    Abstract_mediator* mediator = new Mediator(map_loader->task_grasps());
+    Abstract_mediator* mediator = new Mediator(map_loader->task_grasps(), new ros::Publisher(n.advertise< visualization_msgs::MarkerArray >("visualization_marker_array", 1)));
     mediator->connect_robots(robo);
-
-    ros::Rate loop_rate(1);
-    ros::Publisher* pub = new ros::Publisher(n.advertise< visualization_msgs::MarkerArray >("visualization_marker_array", 1));
-
-    while (ros::ok()){
-        fields->markers.clear(); 
-        wings->markers.clear();
-        ceti->rotate(-M_PI/4);
-        ceti->notify();
-        for (visualization_msgs::MarkerArray* markers : ceti->rviz_markers())pub->publish(*markers);
-        loop_rate.sleep();
-    }
+    mediator->mediate();
     
     free(rviz_right);
     free(rviz_mid);
@@ -121,7 +107,6 @@ int main(int argc, char **argv){
     // free(map_loader);
     // free(strategy);
 
-    free(pub);
     free(robo);
     free(right_wing);
     free(left_wing);