diff --git a/CMakeLists.txt b/CMakeLists.txt
index 9c208bff20e0dc367bc9a20dc42d45681450c847..472609c81198b0a9cf9fbc07cf19c8858ca8bafa 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -25,9 +25,11 @@ find_package(catkin REQUIRED COMPONENTS
   trajectory_msgs
   pcl_ros
 
+  ccf
   gb_grasp
   moveit_grasps
   behaviortree_cpp_v3
+  paho_mqtt
 )
 
 find_package(rostest REQUIRED)
@@ -153,6 +155,43 @@ src/mediator/moveit_mediator.cpp
 src/mediator/grasp_mediator.cpp
 
 
+src/reader/abstract_param_reader.cpp
+src/reader/cuboid_reader.cpp
+src/reader/job_reader.cpp
+src/reader/map_reader.cpp
+src/reader/robot_reader.cpp
+src/reader/task_space_reader.cpp
+src/reader/ts_reader.cpp
+src/reader/wing_reader.cpp
+
+src/robot/decorators/panda_decorator.cpp
+src/robot/decorators/ur5_decorator.cpp
+src/robot/decorators/ur10_decorator.cpp
+src/robot/abstract_robot.cpp
+src/robot/ceti_robot.cpp
+
+src/robot_element/decorators/abstract_robot_element_decorator.cpp
+src/robot_element/decorators/log_decorator.cpp
+src/robot_element/observers/moveit_panel.cpp
+src/robot_element/observers/panel.cpp
+src/robot_element/observers/rviz_panel.cpp
+)
+
+add_executable(mg_routine src/mg_routine.cpp
+src/base_bridge/simple_base_implementation.cpp
+src/base_bridge/simple_base.cpp
+
+src/bt/execution.cpp
+src/bt/position_condition.cpp
+src/bt/parallel_robot.cpp
+
+src/mediator/abstract_mediator.cpp
+src/mediator/base_calculation_mediator.cpp
+src/mediator/moveit_mediator.cpp
+src/mediator/grasp_mediator.cpp
+src/mediator/mg_mediator.cpp
+
+
 src/reader/abstract_param_reader.cpp
 src/reader/cuboid_reader.cpp
 src/reader/job_reader.cpp
@@ -193,6 +232,7 @@ add_dependencies(config_routine ${config_routine_EXPORTED_TARGETS} ${catkin_EXPO
 add_dependencies(cell_routine ${cell_routine_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS})
 add_dependencies(mtc2taskspace ${mtc2taskspace_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS})
 add_dependencies(robot_base_calculation_approach ${robot_base_calculation_approach_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS})
+add_dependencies(mg_routine ${mg_routine_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS})
 
 
 target_link_libraries(robot_base_calculation_approach 
@@ -203,6 +243,14 @@ target_link_libraries(robot_base_calculation_approach
   yaml-cpp
 )
 
+target_link_libraries(mg_routine 
+  ${catkin_LIBRARIES}
+  ${OCTOMAP_LIBRARIES}
+  ${PCL_LIBRARY_DIRS}
+  ${BEHAVIOR_TREE_LIBRARY}
+  yaml-cpp
+)
+
 target_link_libraries(config_routine 
   ${catkin_LIBRARIES}
   ${OCTOMAP_LIBRARIES}
diff --git a/include/mediator/mg_mediator.h b/include/mediator/mg_mediator.h
new file mode 100644
index 0000000000000000000000000000000000000000..98eadbf7eb516a8dc98a4b2a01ba3db546de0a6c
--- /dev/null
+++ b/include/mediator/mg_mediator.h
@@ -0,0 +1,51 @@
+#ifndef MG_MEDIATOR_
+#define MG_MEDIATOR_
+
+#include <ros/ros.h>
+#include "mediator/abstract_mediator.h"
+#include "robot_element/observers/moveit_panel.h"
+#include "robot_element/decorators/log_decorator.h"
+#include <ccf/connection/MqttConnection.h>
+#include <ccf/controller/Controller.h>
+
+
+//should be a mix between MG, bahvior tree, moveit task constructor
+class MGMediator: public AbstractMediator, virtual Controller{
+    protected:
+    std::vector<std::unique_ptr<Connection>> connections_;
+
+    std::shared_ptr<moveit_visual_tools::MoveItVisualTools> visual_tools_; //!< MoveItVisualTools
+    std::shared_ptr<planning_scene_monitor::PlanningSceneMonitor> planning_scene_monitor_; //!< Planningscene monitor
+
+    std::unique_ptr<moveit::planning_interface::PlanningSceneInterface> psi_; //!< PlanningSceneInteface to manage Scene Objects
+    std::map<std::string, std::vector<uint8_t>> acm_; //!< shared allowed collision matrix between robots
+    std::map<std::string, std::vector<uint8_t>> rs_; //!< shared robot state between all robots
+
+
+    std::string referenceRobot_; //!< Reference Robot
+    std::string resultPath_;//!< path to the result
+    std::map<const std::string, Cuboid> relevant_boxes_;
+
+    public:
+    MGMediator(std::shared_ptr<ros::NodeHandle> const& nh);
+
+    //! mediator function
+    /*!
+    Construction of robots and planning scenes. Calculate plans in preor to chain them so that they can be executed in parallel.
+    */
+    void mediate() override;
+
+    //! connect robot and initialize Moveit components
+    /*!
+    Set up acm_ and rs_ members to track, merge, and publish changes during execution.
+    \param robot RobotDecorator of Robot
+    */
+    void connectRobots(std::unique_ptr<AbstractRobotDecorator> robot) override; 
+
+    //!  Sets panels for robots
+    void setPanel() override;
+
+    void publishTables();
+
+};
+#endif
\ No newline at end of file
diff --git a/src/mediator/mg_mediator.cpp b/src/mediator/mg_mediator.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..fd87e8cb167ae59acd8511e361d87b75f48ea1f9
--- /dev/null
+++ b/src/mediator/mg_mediator.cpp
@@ -0,0 +1,103 @@
+#include "mediator/mg_mediator.h"
+
+MGMediator::MGMediator(std::shared_ptr<ros::NodeHandle> const& nh) 
+: AbstractMediator(nh)
+, Controller(*nh.get())
+{   
+    addConnection(std::make_shared<MqttConnection>("", "super"));
+}
+
+void MGMediator::mediate(){
+    setPanel();
+    publishTables();
+
+
+};
+
+//! connect robot and initialize Moveit components
+/*!
+Set up acm_ and rs_ members to track, merge, and publish changes during execution.
+\param robot RobotDecorator of Robot
+*/
+void MGMediator::connectRobots(std::unique_ptr<AbstractRobotDecorator> robot){
+    ROS_INFO("connecting %s...", robot->name().c_str());
+	robot->spezifieRobotGroups();
+	acm_.insert(std::pair<std::string, std::vector<uint8_t>>(robot->map().at("base").c_str(), std::vector<uint8_t>()));
+
+	for(auto name: robot->mgi()->getLinkNames()) acm_.insert(std::pair<std::string, std::vector<uint8_t>>(name.c_str(), std::vector<uint8_t>()));
+	for(auto name: robot->mgiHand()->getLinkNames()) acm_.insert(std::pair<std::string, std::vector<uint8_t>>(name.c_str(), std::vector<uint8_t>()));
+
+	for (auto link : robot->mgi()->getLinkNames()) rs_.insert_or_assign(link, std::vector<std::uint8_t>());
+	rs_.insert_or_assign(robot->map()["left_finger"], std::vector<std::uint8_t>());
+	rs_.insert_or_assign(robot->map()["right_finger"], std::vector<std::uint8_t>());
+	rs_.insert_or_assign(robot->map()["hand_link"], std::vector<std::uint8_t>());
+	rs_.insert_or_assign(robot->map()["base"], std::vector<std::uint8_t>());
+
+	robots_.insert_or_assign(robot->name(), std::move(robot)); 
+}; 
+
+void MGMediator::publishTables(){
+    ros::WallDuration sleep_time(1.0);
+
+	for (const auto& s_r : robots_){
+		auto ceti_bot = dynamic_cast<CetiRobot*>(s_r.second->next());
+
+		for (std::size_t k = 0; k < ceti_bot->observerMask().size(); k++){
+			if(ceti_bot->observerMask()[k]){
+				auto wmd = dynamic_cast<MoveitPanel*>(ceti_bot->observers()[k]->next());
+				psi_->applyCollisionObject(wmd->marker());
+				acm_.insert(std::pair<std::string, std::vector<uint8_t>>(wmd->marker().id.c_str(), std::vector<uint8_t>()));
+				sleep_time.sleep();
+			}
+        }
+    }
+
+    std::string str;
+    std::map<const std::string, std::vector<Cuboid>> robot_to_cuboid;
+    std::bitset<3> panel_mask;
+
+    for (const auto& pair : robots_) {        
+        robot_to_cuboid.insert_or_assign(pair.first,  std::vector<Cuboid>());
+        for (auto& c: cuboid_reader_->cuboidBox()){
+            tf2::Transform trans(tf2::Quaternion(0,0,0,1), tf2::Vector3(c.Pose.position.x, c.Pose.position.y, c.Pose.position.z));
+            if(pair.second->checkSingleObjectCollision(trans, str, panel_mask)) robot_to_cuboid[pair.first].push_back(c);
+        }
+    }
+}
+
+void MGMediator::setPanel(){
+	auto wd = wing_reader_->wingData();
+
+	for (const auto& s_r : robots_){
+        try{
+            auto ceti_bot = dynamic_cast<CetiRobot*>(s_r.second->next());
+            ceti_bot->setObserverMask(static_cast<wing_config>(wd.at(s_r.first).second));
+        } catch(const std::out_of_range& oor) {
+            ROS_INFO("No mask data for %s", s_r.first.c_str());
+        }
+    }
+
+	for (const auto& s_r : robots_){
+        auto ceti_bot = dynamic_cast<CetiRobot*>(s_r.second->next());
+        std::vector<std::unique_ptr<AbstractRobotElementDecorator>> panels(3);
+            
+        for (std::size_t j = 0; j < ceti_bot->observerMask().size(); j++){
+            if (ceti_bot->observerMask()[j]){
+                try{
+                    tf2::Transform relative_tf = ceti_bot->tf().inverse() * wd.at(ceti_bot->name()).first[j].pose_;
+
+                    std::unique_ptr<AbstractRobotElement> panel = std::make_unique<MoveitPanel>(wd.at(s_r.first).first[j].name_, relative_tf, wd.at(s_r.first).first[j].size_);
+                    std::unique_ptr<AbstractRobotElementDecorator> log = std::make_unique<LogDecorator>(std::move(panel));
+                    panels[j] = std::move(log);
+                } catch (std::out_of_range &oor){
+                    ROS_INFO("OOR in set_panel");
+                }
+            }
+        }
+        ceti_bot->setObservers(panels);
+    }
+
+	for (const auto& s_r : robots_){
+		s_r.second->notify();
+	}
+}
diff --git a/src/mg_routine.cpp b/src/mg_routine.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..811cdf5d3b486fa97796c9c99db4a280a3f8c57f
--- /dev/null
+++ b/src/mg_routine.cpp
@@ -0,0 +1,39 @@
+#include <xmlrpcpp/XmlRpc.h>
+
+#include "mediator/mg_mediator.h"
+#include "mediator/abstract_mediator.h"
+#include "robot/decorators/panda_decorator.h"
+
+#include "reader/abstract_param_reader.h"
+#include "reader/robot_reader.h"
+#include "reader/wing_reader.h"
+#include "reader/cuboid_reader.h"
+
+#include "robot/abstract_robot.h"
+#include "robot/decorators/panda_decorator.h"
+#include "robot_element/observers/moveit_panel.h"
+
+
+int main(int argc, char **argv){
+    ros::init(argc, argv, "mg_routine");
+    std::shared_ptr<ros::NodeHandle> n(new ros::NodeHandle);
+
+    ros::AsyncSpinner spinner(1);
+    spinner.start();
+
+    std::shared_ptr<MGMediator> mediator = std::make_shared<MGMediator>(n);
+
+    auto rd = mediator->robotReader()->robotData();
+    for (int i = 0; i < rd.size() ;i++){
+        std::unique_ptr<AbstractRobot> ceti = std::make_unique<CetiRobot>(rd[i].name_, rd[i].pose_, rd[i].size_);
+        std::unique_ptr<PandaDecorator> ceti_panda = std::make_unique<PandaDecorator>(std::move(ceti));
+        mediator->connectRobots(std::move(ceti_panda));
+    }
+
+    //mediator->set_dirname(filename);    
+    mediator->mediate();
+
+    while (ros::ok()){
+        ros::spinOnce();
+    }
+}
\ No newline at end of file