diff --git a/include/core/processor/processor_odom_2d.h b/include/core/processor/processor_odom_2d.h
index a626833c99d6b5e6987fab4259f68bf466bd6570..567c739200d7effaece6fe95cc6f17ce36f50c0c 100644
--- a/include/core/processor/processor_odom_2d.h
+++ b/include/core/processor/processor_odom_2d.h
@@ -42,7 +42,7 @@ class ProcessorOdom2d : public ProcessorMotion
     public:
         ProcessorOdom2d(ParamsProcessorOdom2dPtr _params);
         virtual ~ProcessorOdom2d();
-        virtual void configure(SensorBasePtr _sensor) override;
+        virtual void configure(SensorBasePtr _sensor) override { };
 
         // Factory method for high level API
         WOLF_PROCESSOR_CREATE(ProcessorOdom2d, ParamsProcessorOdom2d);
diff --git a/include/core/yaml/parser_yaml.h b/include/core/yaml/parser_yaml.h
index 1b6f659ebd609dffef4f3c472800cf32714f22e1..1e11cb86aeb89932815e38708f3cbf36530e2006 100644
--- a/include/core/yaml/parser_yaml.h
+++ b/include/core/yaml/parser_yaml.h
@@ -30,6 +30,7 @@ class ParserYAML {
         YAML::Node n_;
     };
     struct PublisherManager{
+        std::string package_;
         std::string subscriber_;
         std::string topic_;
         std::string period_;
diff --git a/src/problem/problem.cpp b/src/problem/problem.cpp
index 9e63f71a1b2fa1a257c209cee391ab84f352a264..7acce5acb13de2ec58e52f76197932119e7a86a1 100644
--- a/src/problem/problem.cpp
+++ b/src/problem/problem.cpp
@@ -134,6 +134,13 @@ ProblemPtr Problem::autoSetup(ParamsServer &_server)
         l->load();
         loaders.push_back(l);
     }
+    for (auto it : _server.getParam<std::vector<std::string>>("packages")) {
+        std::string subscriber = packages_path + "/libpublisher_" + it + lib_extension;
+        WOLF_TRACE("Loading publisher " + subscriber);
+        auto l = new LoaderRaw(subscriber);
+        l->load();
+        loaders.push_back(l);
+    }
     std::vector<std::string> raw_libs;
     try {
         raw_libs = _server.getParam<std::vector<std::string>>("raw_libs");
diff --git a/src/processor/processor_diff_drive.cpp b/src/processor/processor_diff_drive.cpp
index 1bd0ca0ef6cacb1c90d0a7cdf843593bb38ac5ab..6993332c3e23dec79c7697abe6f56a1feb531ce7 100644
--- a/src/processor/processor_diff_drive.cpp
+++ b/src/processor/processor_diff_drive.cpp
@@ -36,8 +36,7 @@ void ProcessorDiffDrive::configure(SensorBasePtr _sensor)
 {
     assert(_sensor && "Provided sensor is nullptr");
 
-    SensorDiffDriveConstPtr sensor_diff_drive = std::dynamic_pointer_cast<SensorDiffDrive>(_sensor);
-    assert(sensor_diff_drive != nullptr && "Sensor is not of type SensorDiffDrive");
+    SensorDiffDriveConstPtr sensor_diff_drive = std::static_pointer_cast<SensorDiffDrive>(_sensor);
 
     radians_per_tick_ = sensor_diff_drive->getRadiansPerTick();
 }
diff --git a/src/processor/processor_motion.cpp b/src/processor/processor_motion.cpp
index 6945b82ea7391816cd4cf924b42d682662263cf9..bc11469c5c8aa5a5bb4c26c5a41f632c3f89312f 100644
--- a/src/processor/processor_motion.cpp
+++ b/src/processor/processor_motion.cpp
@@ -90,7 +90,8 @@ void ProcessorMotion::processCapture(CaptureBasePtr _incoming_ptr)
         return;
     }
 
-    incoming_ptr_ = std::static_pointer_cast<CaptureMotion>(_incoming_ptr);
+    incoming_ptr_ = std::dynamic_pointer_cast<CaptureMotion>(_incoming_ptr);
+    assert(incoming_ptr_ != nullptr && ("Capture type mismatch. Processor " + getName() + " can only process captures of type CaptureMotion").c_str());
 
     preProcess(); // Derived class operations
 
diff --git a/src/processor/processor_odom_2d.cpp b/src/processor/processor_odom_2d.cpp
index 4a126d901eb291a9d5fc8537b5429b294bfdc025..04265e964c385bdbe591e84c650f8c7d99c36eeb 100644
--- a/src/processor/processor_odom_2d.cpp
+++ b/src/processor/processor_odom_2d.cpp
@@ -16,11 +16,6 @@ ProcessorOdom2d::~ProcessorOdom2d()
 {
 }
 
-void ProcessorOdom2d::configure(SensorBasePtr _sensor)
-{
-    auto sensor_       = std::dynamic_pointer_cast<SensorOdom2d>(_sensor);
-    assert(sensor_ != nullptr && "Sensor is not of type SensorOdom2d");
-}
 void ProcessorOdom2d::computeCurrentDelta(const Eigen::VectorXd& _data, const Eigen::MatrixXd& _data_cov,
                                           const Eigen::VectorXd& _calib, const double _dt, Eigen::VectorXd& _delta,
                                           Eigen::MatrixXd& _delta_cov, Eigen::MatrixXd& _jacobian_calib) const
diff --git a/src/processor/processor_odom_3d.cpp b/src/processor/processor_odom_3d.cpp
index 71c77e1e16f9cc3b5b5b76885b64cd67b891bb7b..4bce5f885a2104ee45c646e3a2a4e45a9d840b49 100644
--- a/src/processor/processor_odom_3d.cpp
+++ b/src/processor/processor_odom_3d.cpp
@@ -21,8 +21,8 @@ ProcessorOdom3d::~ProcessorOdom3d()
 void ProcessorOdom3d::configure(SensorBasePtr _sensor)
 {
     assert (_sensor && "Trying to configure processor with a sensor but provided sensor is nullptr.");
-    auto sen_ptr = std::dynamic_pointer_cast<SensorOdom3d>(_sensor);
-    assert(sen_ptr != nullptr && "Sensor is not of type SensorOdom3d");
+
+    SensorOdom3dPtr sen_ptr = std::static_pointer_cast<SensorOdom3d>(_sensor);
 
     // we steal the parameters from the provided odom3d sensor.
     k_disp_to_disp_ = sen_ptr->getDispVarToDispNoiseFactor();
@@ -151,7 +151,7 @@ void ProcessorOdom3d::deltaPlusDelta(const Eigen::VectorXd& _delta1, const Eigen
 
 void ProcessorOdom3d::statePlusDelta(const Eigen::VectorXd& _x, const Eigen::VectorXd& _delta, const double _Dt,
                                  Eigen::VectorXd& _x_plus_delta) const
-{
+{   
     assert(_x.size() >= x_size_ && "Wrong _x vector size"); //we need a state vector which size is at least x_size_
     assert(_delta.size() == delta_size_ && "Wrong _delta vector size");
     assert(_x_plus_delta.size() >= x_size_ && "Wrong _x_plus_delta vector size");
diff --git a/src/yaml/parser_yaml.cpp b/src/yaml/parser_yaml.cpp
index 267d0c9da2024abd59ed5b529d13de7680d14472..f2dd93e7443c78f7714e15c567ce7980b3406be2 100644
--- a/src/yaml/parser_yaml.cpp
+++ b/src/yaml/parser_yaml.cpp
@@ -430,12 +430,12 @@ void ParserYAML::parseFirstLevel(std::string _file)
     {
         for (const auto& kv : n_config["ROS publisher"])
         {
-            WOLF_DEBUG("WHAT");
             PublisherManager pPublisherManager = {
-                kv["type"].Scalar(), kv["topic"].Scalar(), kv["period"].Scalar(), kv
+            kv["package"].Scalar(), kv["type"].Scalar(), kv["topic"].Scalar(), kv["period"].Scalar(), kv
             };
             publisher_managers_.push_back(pPublisherManager);
-            map_container.push_back(std::map<std::string, std::string>({ { "type", kv["type"].Scalar() },
+            map_container.push_back(std::map<std::string, std::string>({ { "package", kv["package"].Scalar() },
+                                                                         { "type", kv["type"].Scalar() },
                                                                          { "topic", kv["topic"].Scalar() },
                                                                          { "period", kv["period"].Scalar() } }));
         }
@@ -445,7 +445,7 @@ void ParserYAML::parseFirstLevel(std::string _file)
     catch (YAML::InvalidNode& e)
     {
         throw std::runtime_error("Error parsing publisher @" + generatePath(_file) +
-                                 ". Please make sure that each manager has 'type', 'topic' and 'period' entries.");
+                                 ". Please make sure that each manager has 'package', 'type', 'topic' and 'period' entries.");
     }
 }
 std::map<std::string, std::string> ParserYAML::getParams()
@@ -482,6 +482,8 @@ void ParserYAML::parse()
         plugins.push_back(it.plugin_);
     for (const auto& it : subscriber_managers_)
         packages.push_back(it.package_);
+    for (const auto& it : publisher_managers_)
+        packages.push_back(it.package_);
     plugins.sort();
     plugins.unique();
     packages.sort();