diff --git a/CMakeLists.txt b/CMakeLists.txt
index dfcaa53b07ca67374b0676942b0e7c79643caf8b..32e74b5ad40d95ab55b9372ac449564119885d3e 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -32,6 +32,8 @@ find_package(Boost REQUIRED COMPONENTS filesystem)
 
 find_package(PkgConfig REQUIRED)
 pkg_check_modules(JSONCPP jsoncpp)
+pkg_check_modules(SDF sdformat REQUIRED)
+
 message(${JSONCPP_LIBRARIES})
 
 # ################################################################################################################################
@@ -54,14 +56,14 @@ catkin_package(CATKIN_DEPENDS
 # ################################################################################################################################
 
 # Specify additional locations of header files Your package locations should be listed before other locations
-include_directories(${catkin_INCLUDE_DIRS})
+include_directories(${catkin_INCLUDE_DIRS} ${SDF_INCLUDE_DIRS})
 
 add_executable(robot_control_node src/robot_control_node.cpp)
 add_executable(box_publisher_node src/box_publisher.cpp)
 add_executable(robot_state_initializer_node src/robot_state_initializer.cpp)
 add_executable(move_group_interface_tutorial src/move_group_interface_tutorial.cpp)
 
-target_link_libraries(robot_control_node ${catkin_LIBRARIES} boost_filesystem ${JSONCPP_LIBRARIES})
+target_link_libraries(robot_control_node ${catkin_LIBRARIES} boost_filesystem ${JSONCPP_LIBRARIES} ${SDF_LIBRARIES})
 target_link_libraries(box_publisher_node ${catkin_LIBRARIES})
 target_link_libraries(robot_state_initializer_node ${catkin_LIBRARIES})
 target_link_libraries(move_group_interface_tutorial ${catkin_LIBRARIES} ${Boost_LIBRARIES})
diff --git a/models/box.sdf b/models/box.sdf
new file mode 100644
index 0000000000000000000000000000000000000000..ce165a33b0bf00e6dd43ada6551c4945364b5eec
--- /dev/null
+++ b/models/box.sdf
@@ -0,0 +1,22 @@
+<?xml version="1.0" ?>
+<sdf version="1.5">
+    <model name="box">
+        <static>true</static>
+        <link name="link">
+            <visual name="visual">
+                <material>
+                    <script>
+                        <uri>/usr/share/gazebo-9/media/materials/scripts/gazebo.material</uri>
+                        <name>Gazebo/DarkMagentaTransparent</name>
+                    </script>
+                </material>
+                <pose>2 3 0.5 0 0 0</pose>
+                <geometry>
+                    <box>
+                        <size>1 1 1</size>
+                    </box>
+                </geometry>
+            </visual>
+        </link>
+    </model>
+</sdf>
\ No newline at end of file
diff --git a/package.xml b/package.xml
index d614468f8a79fb242b96b56952b679235fc44af0..c84368b2fac744171c915b27eebe3b7829d34b94 100644
--- a/package.xml
+++ b/package.xml
@@ -20,7 +20,8 @@
 
   <depend>controller_manager</depend>
   <depend>effort_controllers</depend>
-  <depend>gazebo_ros</depend>
+<!--  <depend>gazebo_ros</depend>-->
+  <depend>gazebo_plugins</depend>
   <depend>gazebo_ros_control</depend>
   <depend>joint_state_controller</depend>
   <depend>joint_state_publisher</depend>
@@ -41,10 +42,17 @@
   <depend>controller_interface</depend>
   <depend>hardware_interface</depend>
 
+
+  <build_depend>sdformat</build_depend>
+  <exec_depend>sdformat</exec_depend>
+
+  <exec_depend>gazebo_ros</exec_depend>
+
   <exec_depend>pluginlib</exec_depend>
 
   <!-- The export tag contains other, unspecified, tags -->
   <export>
     <controller_interface plugin="${prefix}/controller_plugins.xml" />
+    <gazebo_ros gazebo_media_path="/usr/share/gazebo-9/media/materials/scripts"/>
   </export>
 </package>
diff --git a/src/robot_control_node.cpp b/src/robot_control_node.cpp
index beb175b32de85e11c68c7227be65ff7dcdcb068c..bfe1f44e9941c46086af5b96eb8afdccd422eb25 100644
--- a/src/robot_control_node.cpp
+++ b/src/robot_control_node.cpp
@@ -6,9 +6,63 @@
 #include <ros/ros.h>
 #include <boost/filesystem.hpp>
 
+#include <sdformat-6.0/sdf/sdf.hh>  // for sdf model parsing
+#include <gazebo_msgs/SpawnModel.h> // for spawning stuff in gazebo
+
 static const std::string PLANNING_GROUP_ARM = "panda_arm";
 static const std::string APP_DIRECTORY_NAME = ".panda_simulation";
 
+
+void spawnCollisionBox(shape_msgs::SolidPrimitive shape, geometry_msgs::Pose pose) {
+  if (shape.type != shape.BOX) {
+    ROS_ERROR("Safety-zone could not be created due to wrong shape-type");
+    return;
+  }
+
+  sdf::SDFPtr sdf(new sdf::SDF());
+  sdf::init(sdf);
+
+  auto sdfFileName = ros::package::getPath(ROS_PACKAGE_NAME) + "/models/box.sdf";
+
+  assert(sdf::readFile(sdfFileName, sdf));
+
+  ROS_INFO_NAMED("model-loader", "successfully read SDF file: %s", sdf->ToString().c_str());
+
+  auto visualElement = sdf->Root()->GetElement("model")->GetElement("link")->GetElement("visual");
+  auto poseElement = visualElement->GetElement("pose");
+  auto sizeElement = visualElement->GetElement("geometry")->GetElement("box")->GetElement("size");
+
+  std::ostringstream poseStream;
+  poseStream << pose.position.x << " " << pose.position.y << " " << pose.position.z << " 0 0 0";
+  poseElement->Set(poseStream.str());
+
+  ROS_INFO_NAMED("model-loader", "successfully changed SDF file, pose is: %s", poseElement->GetValue()->GetAsString().c_str());
+
+  std::ostringstream sizeStream;
+  sizeStream << shape.dimensions[0] << " " << shape.dimensions[1] << " " << shape.dimensions[2];
+  sizeElement->Set(sizeStream.str());
+
+  ROS_INFO_NAMED("model-loader", "successfully changed SDF file, size is: '%s', should be '%s'", sizeElement->GetValue()->GetAsString().c_str(), sizeStream.str().c_str());
+
+  ros::NodeHandle n;
+  ros::ServiceClient client = n.serviceClient<gazebo_msgs::SpawnModel>("/gazebo/spawn_sdf_model");
+  gazebo_msgs::SpawnModel spawnModelService;
+  spawnModelService.request.robot_namespace = "box space";
+  // spawnModelService.request.initial_pose = pose; // not required here
+  spawnModelService.request.model_name = sdf->Root()->GetElement("model")->GetAttribute("name")->GetAsString();
+  spawnModelService.request.model_xml = sdf->ToString().c_str();
+  // spawnModelService.request.reference_frame = ; // if left empty, world is used
+  if (client.call(spawnModelService))
+  {
+    ROS_INFO("result: %s", spawnModelService.response.success ? "success!" : "failed!");
+    ROS_INFO("result: %s", spawnModelService.response.status_message.c_str());
+  }
+  else
+  {
+    ROS_ERROR("Failed to call service '/gazebo/spawn_sdf_model'");
+  }
+}
+
 moveit_msgs::CollisionObject extractObstacleFromJson(Json::Value &root, std::string name)
 {
   moveit_msgs::CollisionObject collision_object;
@@ -47,6 +101,8 @@ moveit_msgs::CollisionObject extractObstacleFromJson(Json::Value &root, std::str
   collision_object.primitive_poses.push_back(box_pose);
   collision_object.operation = collision_object.ADD;
 
+  spawnCollisionBox(primitive, box_pose);
+
   return std::move(collision_object);
 }