diff --git a/CMakeLists.txt b/CMakeLists.txt
index 80a9f2404d851bb255d3754777ed6c491e44052c..96f0efa8a76ebcfd5da19b986309d49324f28ebf 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -202,7 +202,7 @@ SET(HDRS_PROCESSOR
   # include/core/processor/processor_fixed_wing_model.h
   # include/core/processor/processor_loop_closure.h
   include/core/processor/processor_motion.h
-  # include/core/processor/processor_odom_2d.h
+  include/core/processor/processor_odom_2d.h
   # include/core/processor/processor_odom_3d.h
   # include/core/processor/processor_pose.h
   include/core/processor/processor_tracker.h
@@ -311,7 +311,7 @@ SET(SRCS_PROCESSOR
   # src/processor/processor_fixed_wing_model.cpp
   # src/processor/processor_loop_closure.cpp
   src/processor/processor_motion.cpp
-  # src/processor/processor_odom_2d.cpp
+  src/processor/processor_odom_2d.cpp
   # src/processor/processor_odom_3d.cpp
   # src/processor/processor_pose.cpp
   src/processor/processor_tracker.cpp
diff --git a/demos/hello_wolf/sensor_range_bearing.cpp b/demos/hello_wolf/sensor_range_bearing.cpp
index 24dfc14b97a20d5fc9e4c9861da8cf32f0305f45..d81740193f2ff343cbd2cd592d7c717c07c11c0a 100644
--- a/demos/hello_wolf/sensor_range_bearing.cpp
+++ b/demos/hello_wolf/sensor_range_bearing.cpp
@@ -61,5 +61,4 @@ SensorRangeBearing::~SensorRangeBearing()
 namespace wolf
 {
 WOLF_REGISTER_SENSOR(SensorRangeBearing)
-WOLF_REGISTER_SENSOR_YAML(SensorRangeBearing)
 } // namespace wolf
diff --git a/demos/hello_wolf/yaml/hello_wolf_config.yaml b/demos/hello_wolf/yaml/hello_wolf_config.yaml
index 4260a8c8efb26928a6d2242edbd43830b4467875..f01ad2b227a8824025d6d1aa0b2f415cde34c2c6 100644
--- a/demos/hello_wolf/yaml/hello_wolf_config.yaml
+++ b/demos/hello_wolf/yaml/hello_wolf_config.yaml
@@ -36,15 +36,11 @@ config:
     - type:               "SensorOdom2d"
       plugin:             "core"
       name:               "sen odom"
-      extrinsic: 
-        pose:             [0,0, 0]
       follow:             "demos/hello_wolf/yaml/sensor_odom_2d.yaml"         # config parameters in this file
 
     - type:               "SensorRangeBearing"
       plugin:             "core"
       name:               "sen rb"  
-      extrinsic:
-        pose:             [1,1, 0]
       noise_range_metres_std: 0.2                                       # parser only considers first appearence so the following file parsing will not overwrite this param
       follow:             demos/hello_wolf/yaml/sensor_range_bearing.yaml     # config parameters in this file
           
diff --git a/demos/hello_wolf/yaml/sensor_odom_2d.yaml b/demos/hello_wolf/yaml/sensor_odom_2d.yaml
index 0f724c780c41c708b0b5a63a0e429cbd3319cb1e..1480abfef83b8dff429879a74ee7340a6e9ae358 100644
--- a/demos/hello_wolf/yaml/sensor_odom_2d.yaml
+++ b/demos/hello_wolf/yaml/sensor_odom_2d.yaml
@@ -3,3 +3,13 @@
 k_disp_to_disp:   0.1  # m^2   / m
 k_rot_to_rot:     0.1  # rad^2 / rad
 apply_loss_function: true
+
+states:
+  P:
+    mode: fix
+    state: [0,0]
+    dynamic: false
+  O:
+    mode: fix
+    state: [0]
+    dynamic: false
\ No newline at end of file
diff --git a/demos/hello_wolf/yaml/sensor_range_bearing.yaml b/demos/hello_wolf/yaml/sensor_range_bearing.yaml
index 7f81091db16c74fb479684a171256a91dd425f66..bf221a21af8db1a1fcb256c85d6020981de728ea 100644
--- a/demos/hello_wolf/yaml/sensor_range_bearing.yaml
+++ b/demos/hello_wolf/yaml/sensor_range_bearing.yaml
@@ -3,3 +3,13 @@
 noise_range_metres_std:     0.1
 noise_bearing_degrees_std:  0.5
 apply_loss_function: true
+
+states:
+  P:
+    mode: fix
+    state: [1,1]
+    dynamic: false
+  O:
+    mode: fix
+    state: [0]
+    dynamic: false
\ No newline at end of file
diff --git a/include/core/problem/problem.h b/include/core/problem/problem.h
index 9c70f894f700413c035462e449dc9be64579d760..147a04430dd803e62321b143c194cfa6ac7f0e50 100644
--- a/include/core/problem/problem.h
+++ b/include/core/problem/problem.h
@@ -39,6 +39,7 @@ struct ParamsProcessorBase;
 #include "core/common/wolf.h"
 #include "core/utils/params_server.h"
 #include "core/frame/frame_base.h"
+#include "core/state_block/prior.h"
 #include "core/state_block/state_block.h"
 #include "core/state_block/state_composite.h"
 #include "core/processor/motion_provider.h"
diff --git a/include/core/sensor/factory_sensor.h b/include/core/sensor/factory_sensor.h
index a1c7b77a4a4abce394410335cd16607a5fc265be..0cd4418a68d052423c03f581d99bd1075821a4aa 100644
--- a/include/core/sensor/factory_sensor.h
+++ b/include/core/sensor/factory_sensor.h
@@ -33,11 +33,14 @@ namespace wolf
 {
 class SensorBase;
 struct ParamsSensorBase;
+class ParamsServer;
+class Prior;
 }
 
+#include <unordered_map>
+
 // wolf
 #include "core/common/factory.h"
-#include "core/utils/params_server.h"
 
 namespace wolf
 {
@@ -224,14 +227,24 @@ typedef Factory<SensorBase,
 typedef Factory<SensorBase,
                 const std::string&,
                 SizeEigen,
-                ParamsSensorBasePtr,
-                const Priors&> FactorySensorPriors;
+                std::shared_ptr<ParamsSensorBase>,
+                const std::unordered_map<char,Prior>& > FactorySensorPriors;
 
 template<>
 inline std::string FactorySensor::getClass() const
 {
   return "FactorySensor";
 }
+template<>
+inline std::string FactorySensorYaml::getClass() const
+{
+  return "FactorySensorYaml";
+}
+template<>
+inline std::string FactorySensorPriors::getClass() const
+{
+  return "FactorySensorPriors";
+}
 
 #define WOLF_REGISTER_SENSOR(SensorType)                                     \
   namespace{ const bool WOLF_UNUSED SensorType##Registered =                 \
diff --git a/include/core/sensor/sensor_base.h b/include/core/sensor/sensor_base.h
index 13c5a77d60bac6100d13f7e0d06cc4f90870b595..3059521df8e6c6a47b169372396dc8c49a6b40ff 100644
--- a/include/core/sensor/sensor_base.h
+++ b/include/core/sensor/sensor_base.h
@@ -101,18 +101,15 @@ struct ParamsSensorBase: public ParamsBase
 {
     std::string prefix = "sensor/";
 
-    Eigen::VectorXd noise_std;
-
     ParamsSensorBase() = default;
     ParamsSensorBase(std::string _unique_name, const wolf::ParamsServer& _server)
     {
-        noise_std = _server.getParam<Eigen::VectorXd>(prefix + _unique_name + "/noise_std");
     }
     ~ParamsSensorBase() override = default;
 
     std::string print() const override
     {
-        return "noise_std: " + toString(noise_std) + "\n";
+        return "";
     }
 };
 
@@ -276,15 +273,17 @@ class SensorBase : public NodeBase, public HasStateBlocks, public std::enable_sh
                                 const Eigen::MatrixXd& _cov,
                                 unsigned int _start_idx = 0);
 
-        void setNoiseStd(const Eigen::VectorXd & _noise_std);
-        void setNoiseCov(const Eigen::MatrixXd & _noise_cov);
+        // drift
         void setDriftStd(char _key, const Eigen::VectorXd & _drift_rate_std);
         void setDriftCov(char _key, const Eigen::MatrixXd & _drift_rate_cov);
-        Eigen::VectorXd getNoiseStd() const;
-        Eigen::MatrixXd getNoiseCov() const;
         Eigen::VectorXd getDriftStd(char) const;
         Eigen::MatrixXd getDriftCov(char) const;
 
+        // noise
+        virtual void setNoiseStd(const Eigen::VectorXd & _noise_std) = 0;
+        virtual Eigen::VectorXd getNoiseStd() const = 0;
+        virtual Eigen::MatrixXd getNoiseCov() const = 0;
+
         virtual void printHeader(int depth, //
                                  bool constr_by, //
                                  bool metric, //
diff --git a/src/sensor/sensor_odom_2d.cpp b/src/sensor/sensor_odom_2d.cpp
index b5d0946059c44d191e4e13cf244e1b443ac5f950..fae0fe9a75c6f08d57ed7604b461ca3a1c0ac455 100644
--- a/src/sensor/sensor_odom_2d.cpp
+++ b/src/sensor/sensor_odom_2d.cpp
@@ -87,5 +87,4 @@ Eigen::Matrix2d SensorOdom2d::computeCovFromMotion (const VectorXd& _data) const
 #include "core/sensor/factory_sensor.h"
 namespace wolf {
 WOLF_REGISTER_SENSOR(SensorOdom2d);
-WOLF_REGISTER_SENSOR_YAML(SensorOdom2d);
 } // namespace wolf
diff --git a/test/dummy/sensor_dummy.h b/test/dummy/sensor_dummy.h
index 8b37639c862202dab8014f3f4ad2ef472ee3ad3b..e73f7d3c7837fa6583b26f6639c6f4220468dfe5 100644
--- a/test/dummy/sensor_dummy.h
+++ b/test/dummy/sensor_dummy.h
@@ -35,20 +35,23 @@ struct ParamsSensorDummy : public ParamsSensorBase
 {
     ~ParamsSensorDummy() override = default;
 
-    double param1;
+    double noise_p_std;
+    double noise_o_std;
     int param2;
     
     ParamsSensorDummy(std::string _unique_name, const ParamsServer& _server):
         ParamsSensorBase(_unique_name, _server)
     {
-        param1 = _server.getParam<double>(prefix + _unique_name + "/param1");
+        noise_p_std = _server.getParam<double>(prefix + _unique_name + "/noise_p_std");
+        noise_o_std = _server.getParam<double>(prefix + _unique_name + "/noise_o_std");
         param2 = _server.getParam<int>(prefix + _unique_name + "/param2");
     }
     std::string print() const override
     {
-        return ParamsSensorBase::print()                    + "\n"
-                + "param1: "    + std::to_string(param1)    + "\n"
-                + "param2: "    + std::to_string(param2)    + "\n";
+        return ParamsSensorBase::print()                        + "\n"
+                + "noise_p_std: "   + toString(noise_p_std)     + "\n"
+                + "noise_o_std: "   + toString(noise_o_std)     + "\n"
+                + "param2: "        + toString(param2)          + "\n";
     }
 };
 
@@ -56,6 +59,10 @@ WOLF_PTR_TYPEDEFS(SensorDummy);
 
 class SensorDummy : public SensorBase
 {
+    private:
+        ParamsSensorDummyPtr params_dummy_;
+        SizeEigen dim_;
+
     public:
         SensorDummy(const std::string& _unique_name, 
                     SizeEigen _dim, 
@@ -66,7 +73,8 @@ class SensorDummy : public SensorBase
                        _dim,
                        _params,
                        _server,
-                       std::unordered_map<char, std::string>{{'I',"StateBlock"},{'A',"StateQuaternion"}})
+                       std::unordered_map<char, std::string>{{'I',"StateBlock"},{'A',"StateQuaternion"}}),
+            params_dummy_(_params)
         {
         }
         WOLF_SENSOR_CREATE(SensorDummy, ParamsSensorDummy);
@@ -80,11 +88,41 @@ class SensorDummy : public SensorBase
                        _unique_name,
                        _dim,
                        _params,
-                       _priors)
+                       _priors),
+            params_dummy_(_params)
         {
         }
 
         virtual ~SensorDummy(){};
+
+        void setNoiseStd(const Eigen::VectorXd & _noise_std) override
+        {
+            assert(_noise_std.size() == (dim_ == 2 ? 3 : 6));
+
+            params_dummy_->noise_p_std = _noise_std(1);
+            params_dummy_->noise_o_std = _noise_std((dim_ == 2 ? 2 : 3));
+        }
+
+        Eigen::VectorXd getNoiseStd() const override
+        {
+            if (dim_ == 2)
+                return (Eigen::VectorXd() << params_dummy_->noise_p_std, 
+                                             params_dummy_->noise_p_std, 
+                                             params_dummy_->noise_o_std).finished();
+            else
+                return (Eigen::VectorXd() << params_dummy_->noise_p_std, 
+                                             params_dummy_->noise_p_std,
+                                             params_dummy_->noise_p_std, 
+                                             params_dummy_->noise_o_std, 
+                                             params_dummy_->noise_o_std, 
+                                             params_dummy_->noise_o_std).finished();
+        }
+
+        Eigen::MatrixXd getNoiseCov() const override
+        {
+            return getNoiseStd().cwiseAbs2().asDiagonal();
+        }
+
 };
 
 }
@@ -93,6 +131,5 @@ class SensorDummy : public SensorBase
 #include "core/sensor/factory_sensor.h"
 namespace wolf {
 WOLF_REGISTER_SENSOR(SensorDummy);
-WOLF_REGISTER_SENSOR_YAML(SensorDummy);
 } // namespace wolf
 #endif