diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 84449032ae000d3f008236521ec96325ef8321d4..8e9b97fcd99909926fcb12ddbcab4309bc3cc62f 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -152,6 +152,8 @@ deploy_imu:
   stage: deploy_plugins
   rules: 
     - if: $CI_COMMIT_BRANCH != "main"
+    - if: $CI_PIPELINE_SOURCE == "merge_request_event"
+      when: never
   variables:
     WOLF_CORE_BRANCH: $CI_COMMIT_BRANCH
     DEPLOY_CI_ROS: "false"
@@ -164,6 +166,8 @@ deploy_gnss:
   stage: deploy_plugins
   rules: 
     - if: $CI_COMMIT_BRANCH != "main"
+    - if: $CI_PIPELINE_SOURCE == "merge_request_event"
+      when: never
   variables:
     WOLF_CORE_BRANCH: $CI_COMMIT_BRANCH
     GNSSUTILS_BRANCH: $GNSSUTILS_BRANCH
@@ -177,6 +181,8 @@ deploy_vision:
   stage: deploy_plugins
   rules: 
     - if: $CI_COMMIT_BRANCH != "main"
+    - if: $CI_PIPELINE_SOURCE == "merge_request_event"
+      when: never
   variables:
     WOLF_CORE_BRANCH: $CI_COMMIT_BRANCH
     DEPLOY_CI_ROS: "false"
@@ -189,6 +195,8 @@ deploy_laser:
   stage: deploy_plugins
   rules: 
     - if: $CI_COMMIT_BRANCH != "main"
+    - if: $CI_PIPELINE_SOURCE == "merge_request_event"
+      when: never
   variables:
     WOLF_CORE_BRANCH: $CI_COMMIT_BRANCH
     LASERSCANUTILS_BRANCH: $LASERSCANUTILS_BRANCH
@@ -202,6 +210,8 @@ deploy_apriltag:
   stage: deploy_plugins
   rules: 
     - if: $CI_COMMIT_BRANCH != "main"
+    - if: $CI_PIPELINE_SOURCE == "merge_request_event"
+      when: never
   variables:
     WOLF_CORE_BRANCH: $CI_COMMIT_BRANCH
     WOLF_VISION_BRANCH: $WOLF_VISION_BRANCH
@@ -215,6 +225,8 @@ deploy_bodydynamics:
   stage: deploy_plugins
   rules: 
     - if: $CI_COMMIT_BRANCH != "main"
+    - if: $CI_PIPELINE_SOURCE == "merge_request_event"
+      when: never
   variables:
     WOLF_CORE_BRANCH: $CI_COMMIT_BRANCH
     WOLF_IMU_BRANCH: $WOLF_IMU_BRANCH
@@ -229,6 +241,8 @@ deploy_imu_main:
   stage: deploy_plugins
   rules: 
     - if: $CI_COMMIT_BRANCH == "main"
+    - if: $CI_PIPELINE_SOURCE == "merge_request_event"
+      when: never
   variables:
     WOLF_CORE_BRANCH: main
     DEPLOY_CI_ROS: "false"
@@ -241,6 +255,8 @@ deploy_gnss_main:
   stage: deploy_plugins
   rules: 
     - if: $CI_COMMIT_BRANCH == "main"
+    - if: $CI_PIPELINE_SOURCE == "merge_request_event"
+      when: never
   variables:
     WOLF_CORE_BRANCH: main
     GNSSUTILS_BRANCH: $GNSSUTILS_BRANCH
@@ -254,6 +270,8 @@ deploy_vision_main:
   stage: deploy_plugins
   rules: 
     - if: $CI_COMMIT_BRANCH == "main"
+    - if: $CI_PIPELINE_SOURCE == "merge_request_event"
+      when: never
   variables:
     WOLF_CORE_BRANCH: main
     DEPLOY_CI_ROS: "false"
@@ -266,6 +284,8 @@ deploy_laser_main:
   stage: deploy_plugins
   rules: 
     - if: $CI_COMMIT_BRANCH == "main"
+    - if: $CI_PIPELINE_SOURCE == "merge_request_event"
+      when: never
   variables:
     WOLF_CORE_BRANCH: main
     LASERSCANUTILS_BRANCH: $LASERSCANUTILS_BRANCH
@@ -279,6 +299,8 @@ deploy_apriltag_main:
   stage: deploy_plugins
   rules: 
     - if: $CI_COMMIT_BRANCH == "main"
+    - if: $CI_PIPELINE_SOURCE == "merge_request_event"
+      when: never
   variables:
     WOLF_CORE_BRANCH: main
     WOLF_VISION_BRANCH: main
@@ -292,6 +314,8 @@ deploy_bodydynamics_main:
   stage: deploy_plugins
   rules: 
     - if: $CI_COMMIT_BRANCH == "main"
+    - if: $CI_PIPELINE_SOURCE == "merge_request_event"
+      when: never
   variables:
     WOLF_CORE_BRANCH: main
     WOLF_IMU_BRANCH: main
@@ -312,6 +336,8 @@ deploy_wolf_ros_node:
   stage: deploy_ros
   rules: 
     - if: $CI_COMMIT_BRANCH != "main" && $DEPLOY_CI_ROS == "true"
+    - if: $CI_PIPELINE_SOURCE == "merge_request_event"
+      when: never
   variables:
     WOLF_CORE_BRANCH: $CI_COMMIT_BRANCH
     WOLF_IMU_BRANCH: $WOLF_IMU_BRANCH
@@ -337,6 +363,8 @@ deploy_wolf_ros_node_main:
   stage: deploy_ros
   rules: 
     - if: $CI_COMMIT_BRANCH == "main" && $DEPLOY_CI_ROS == "true"
+    - if: $CI_PIPELINE_SOURCE == "merge_request_event"
+      when: never
   variables:
     WOLF_CORE_BRANCH: $CI_COMMIT_BRANCH
     WOLF_IMU_BRANCH: main
diff --git a/include/core/sensor/sensor_base.h b/include/core/sensor/sensor_base.h
index 482dff8644d9ade38612bfd29cab879e63955275..454fb800063780f68b64f3e2564e63a0f59e4c87 100644
--- a/include/core/sensor/sensor_base.h
+++ b/include/core/sensor/sensor_base.h
@@ -26,7 +26,6 @@ namespace wolf{
 class HardwareBase;
 class ProcessorBase;
 class StateBlock;
-class ParamsServer;
 }
 
 //Wolf includes
@@ -98,7 +97,7 @@ struct ParamsSensorBase: public ParamsBase
         name = _input_node["name"].as<std::string>();
     }
     ~ParamsSensorBase() override = default;
-
+    using ParamsBase::ParamsBase;
     std::string print() const override
     {
         return "name: " + name;
diff --git a/include/core/sensor/sensor_pose.h b/include/core/sensor/sensor_pose.h
index 4bafeb5ff67cfc36d5eccea46fa4c549ec275542..c303e3cfb8c9f8e2aae62ff4355642064bf75314 100644
--- a/include/core/sensor/sensor_pose.h
+++ b/include/core/sensor/sensor_pose.h
@@ -31,21 +31,24 @@ WOLF_STRUCT_PTR_TYPEDEFS(ParamsSensorPose);
 
 struct ParamsSensorPose : public ParamsSensorBase
 {
-    double std_p = 1;  // m
-    double std_o = 1;  // rad
+    Eigen::VectorXd std_noise;
+    // double std_p = 1;  // m
+    // double std_o = 1;  // rad
     ParamsSensorPose() = default;
     ParamsSensorPose(const YAML::Node& _input_node):
         ParamsSensorBase(_input_node)
     {
-        std_p = _input_node["std_p"].as<double>();
-        std_o = _input_node["std_o"].as<double>();
+        std_noise = _input_node["std_noise"].as<Eigen::VectorXd>();
+        // std_p = _input_node["std_p"].as<double>();
+        // std_o = _input_node["std_o"].as<double>();
     }
     ~ParamsSensorPose() override = default;
     std::string print() const override
     {
       return ParamsSensorBase::print()     + "\n"
-        + "std_p: "    + toString(std_p)   + "\n"
-        + "std_o: "    + toString(std_o)   + "\n";
+        + "std_p: "    + toString(std_noise)   + "\n";
+        // + "std_p: "    + toString(std_p)   + "\n"
+        // + "std_o: "    + toString(std_o)   + "\n";
     }
 };
 
@@ -65,45 +68,22 @@ class SensorPose : public SensorBase
             params_pose_(_params)
         {
             static_assert(DIM == 2 or DIM == 3);
+            if (DIM == 2 and params_pose_->std_noise.size() != 3)
+                throw std::runtime_error("SensorBase: wrong std_noise size for 2D: " + toString(params_pose_->std_noise.size()) + "(should be 3)");
+            if (DIM == 3 and params_pose_->std_noise.size() != 6)
+                throw std::runtime_error("SensorBase: wrong std_noise size for 3D: " + toString(params_pose_->std_noise.size()) + "(should be 6)");
         }
         WOLF_SENSOR_CREATE(SensorPose<DIM>, ParamsSensorPose);
 
         ~SensorPose() override = default;
 
-        double getStdP() const;
-        double getStdO() const;
-
         Eigen::MatrixXd computeNoiseCov(const Eigen::VectorXd & _data) const override;
 };
 
 template <unsigned int DIM>
-inline double SensorPose<DIM>::getStdP() const
-{
-    return params_pose_->std_p;
-}
-
-template <unsigned int DIM>
-inline double SensorPose<DIM>::getStdO() const
-{
-    return params_pose_->std_o;
-}
-
-template <>
-inline Eigen::MatrixXd SensorPose<2>::computeNoiseCov(const Eigen::VectorXd & _data) const
-{
-    return (Eigen::Vector3d() << params_pose_->std_p, 
-                                 params_pose_->std_p,
-                                 params_pose_->std_o).finished().cwiseAbs2().asDiagonal();
-}
-template <>
-inline Eigen::MatrixXd SensorPose<3>::computeNoiseCov(const Eigen::VectorXd & _data) const
+inline Eigen::MatrixXd SensorPose<DIM>::computeNoiseCov(const Eigen::VectorXd & _data) const
 {
-    return (Eigen::Vector6d() << params_pose_->std_p, 
-                                 params_pose_->std_p,
-                                 params_pose_->std_p, 
-                                 params_pose_->std_o, 
-                                 params_pose_->std_o, 
-                                 params_pose_->std_o).finished().cwiseAbs2().asDiagonal();
+    return params_pose_->std_noise.cwiseAbs2().asDiagonal();
 }
 
 typedef SensorPose<2> SensorPose2d;
diff --git a/schema/sensor/SensorPose2d.schema b/schema/sensor/SensorPose2d.schema
index 3e8557e3737c1541e0a6731dcef12aa0e5db3732..5863bd1bdcd83c96b2ef109913633ebb97309665 100644
--- a/schema/sensor/SensorPose2d.schema
+++ b/schema/sensor/SensorPose2d.schema
@@ -1,14 +1,9 @@
 follow: SensorBase.schema
 
-std_p:
+std_noise:
   _mandatory: true
-  _type: double
-  _doc: standard deviation of the position measurement.
-
-std_o:
-  _mandatory: true
-  _type: double
-  _doc: standard deviation of the orientation measurement.
+  _type: Eigen::Vector3d
+  _doc: Vector containing the standard deviation of the position and orientation measurements (square root of the covariance matrix diagonal).
 
 states:
   P:
diff --git a/schema/sensor/SensorPose3d.schema b/schema/sensor/SensorPose3d.schema
index f00a9ef433301bff8b49835a7a03e5affac8f045..8c1b7d2081825abc24c7177fc3ba70ce58fdcd4e 100644
--- a/schema/sensor/SensorPose3d.schema
+++ b/schema/sensor/SensorPose3d.schema
@@ -1,14 +1,9 @@
 follow: SensorBase.schema
 
-std_p:
+std_noise:
   _mandatory: true
-  _type: double
-  _doc: standard deviation of the position measurement.
-
-std_o:
-  _mandatory: true
-  _type: double
-  _doc: standard deviation of the orientation measurement.
+  _type: Eigen::Vector6d
+  _doc: Vector containing the standard deviation of the position and orientation measurements (square root of the covariance matrix diagonal).
 
 states:
   P:
diff --git a/test/gtest_factor_relative_pose_3d_with_extrinsics.cpp b/test/gtest_factor_relative_pose_3d_with_extrinsics.cpp
index d5f2b0b04782ec0e2c45f9a4ccbbee35b2048c9f..b35f00900c03eafbd1bde420ff02439a53367537 100644
--- a/test/gtest_factor_relative_pose_3d_with_extrinsics.cpp
+++ b/test/gtest_factor_relative_pose_3d_with_extrinsics.cpp
@@ -116,8 +116,10 @@ class FactorRelativePose3dWithExtrinsics_class : public testing::Test{
             solver = std::make_shared<SolverCeres>(problem);
 
             // Create sensor to be able to initialize
+            auto S_params = std::make_shared<ParamsSensorPose>();
+            S_params->std_noise = Eigen::Vector6d::Ones();
             S = SensorBase::emplace<SensorPose3d>(problem->getHardware(), 
-                                                  std::make_shared<ParamsSensorPose>(),
+                                                  S_params,
                                                   SpecSensorComposite{{'P',SpecStateSensor("StatePoint3d",pos_camera)},
                                                                       {'O',SpecStateSensor("StateQuaternion",vquat_camera)}});
 
diff --git a/test/gtest_processor_and_factor_pose_3d_with_extrinsics.cpp b/test/gtest_processor_and_factor_pose_3d_with_extrinsics.cpp
index b5e8188673f1ba77d38e984a14472da22d7b628f..de8205cd0b1dd9084bbdbf2fa1677038a81823ef 100644
--- a/test/gtest_processor_and_factor_pose_3d_with_extrinsics.cpp
+++ b/test/gtest_processor_and_factor_pose_3d_with_extrinsics.cpp
@@ -120,8 +120,7 @@ class FactorPose3dWithExtrinsicsBase_Test : public testing::Test
         // pose sensor and proc (to get extrinsics in the prb)
         auto params_sp = std::make_shared<ParamsSensorPose>();
         params_sp->name = "pose sensor";
-        params_sp->std_p = 1;
-        params_sp->std_o = 1;
+        params_sp->std_noise = Vector6d::Ones();
         sensor_pose_ = SensorBase::emplace<SensorPose3d>(problem_->getHardware(), 
                                                          params_sp, 
                                                          SpecSensorComposite{{'P',SpecStateSensor("StatePoint3d",b_p_bm_,"initial_guess")},
diff --git a/test/gtest_sensor_pose.cpp b/test/gtest_sensor_pose.cpp
index e2d17acbcd62c7f9413328913aa7ceaceed874cf..2f57e54a57d3311d1f4fce3386525650b92ead2c 100644
--- a/test/gtest_sensor_pose.cpp
+++ b/test/gtest_sensor_pose.cpp
@@ -19,12 +19,6 @@
 // along with this program.  If not, see <http://www.gnu.org/licenses/>.
 //
 //--------LICENSE_END--------
-/**
- * \file gtest_sensor_pose.cpp
- *
- *  Created on: Feb 18, 2020
- *      \author: mfourmy
- */
 
 #include "core/sensor/sensor_pose.h"
 #include "core/sensor/factory_sensor.h"
@@ -42,17 +36,16 @@ Vector2d p_state_2D = (Vector2d() << 1,2).finished();
 Vector3d p_state_3D = (Vector3d() << 1,2,3).finished();
 Vector1d o_state_2D = (Vector1d() << 3).finished();
 Vector4d o_state_3D = (Vector4d() << .5,.5,.5,.5).finished();
-double std_p = 0.2;
-double std_o = 0.1;
-Matrix3d noise_cov_2D = (Vector3d() << std_p, std_p, std_o).finished().cwiseAbs2().asDiagonal();
-Matrix6d noise_cov_3D = (Vector6d() << std_p, std_p, std_p, std_o, std_o, std_o).finished().cwiseAbs2().asDiagonal();
+Vector3d std_noise_2D = (Vector3d() << 0.1, 0.2, 0.3).finished();
+Vector6d std_noise_3D = (Vector6d() << 0.1, 0.2, 0.3, 0.4, 0.5, 0.6).finished();
+Matrix3d noise_cov_2D = std_noise_2D.cwiseAbs2().asDiagonal();
+Matrix6d noise_cov_3D = std_noise_3D.cwiseAbs2().asDiagonal();
 
 TEST(Pose, constructor_priors_2D)
 {
     auto param = std::make_shared<ParamsSensorPose>();
     param->name = "a not so cool sensor";
-    param->std_p = std_p;
-    param->std_o = std_o;
+    param->std_noise = std_noise_2D;
 
     SpecSensorComposite priors{{'P',SpecStateSensor("StatePoint2d", p_state_2D)}, //default "fix", not dynamic
                                {'O',SpecStateSensor("StateAngle", o_state_2D)}}; //default "fix", not dynamic
@@ -67,9 +60,6 @@ TEST(Pose, constructor_priors_2D)
     ASSERT_MATRIX_APPROX(sen->getP()->getState(), p_state_2D, Constants::EPS);
     ASSERT_MATRIX_APPROX(sen->getO()->getState(), o_state_2D, Constants::EPS);
 
-    ASSERT_EQ(sen->getStdP(), std_p); 
-    ASSERT_EQ(sen->getStdO(), std_o); 
-
     ASSERT_MATRIX_APPROX(sen->computeNoiseCov(VectorXd(0)), noise_cov_2D, Constants::EPS)
 }
 
@@ -77,8 +67,7 @@ TEST(Pose, constructor_priors_3D)
 {
     auto param = std::make_shared<ParamsSensorPose>();
     param->name = "a not so cool sensor";
-    param->std_p = std_p;
-    param->std_o = std_o;
+    param->std_noise = std_noise_3D;
 
     SpecSensorComposite priors{{'P',SpecStateSensor("StatePoint3d", p_state_3D)}, //default "fix", not dynamic
                                {'O',SpecStateSensor("StateQuaternion", o_state_3D)}}; //default "fix", not dynamic
@@ -93,9 +82,6 @@ TEST(Pose, constructor_priors_3D)
     ASSERT_MATRIX_APPROX(sen->getP()->getState(), p_state_3D, Constants::EPS);
     ASSERT_MATRIX_APPROX(sen->getO()->getState(), o_state_3D, Constants::EPS);
 
-    ASSERT_EQ(sen->getStdP(), std_p); 
-    ASSERT_EQ(sen->getStdO(), std_o); 
-
     ASSERT_MATRIX_APPROX(sen->computeNoiseCov(VectorXd(0)), noise_cov_3D, Constants::EPS)
 }
 
@@ -117,9 +103,6 @@ TEST(Pose, factory_2D)
     ASSERT_MATRIX_APPROX(sen->getP()->getState(), p_state_2D, Constants::EPS);
     ASSERT_MATRIX_APPROX(sen->getO()->getState(), o_state_2D, Constants::EPS);
 
-    ASSERT_EQ(sen->getStdP(), std_p); 
-    ASSERT_EQ(sen->getStdO(), std_o); 
-
     ASSERT_MATRIX_APPROX(sen->computeNoiseCov(VectorXd(0)), noise_cov_2D, Constants::EPS)
 }
 
@@ -141,9 +124,6 @@ TEST(Pose, factory_3D)
     ASSERT_MATRIX_APPROX(sen->getP()->getState(), p_state_3D, Constants::EPS);
     ASSERT_MATRIX_APPROX(sen->getO()->getState(), o_state_3D, Constants::EPS);
 
-    ASSERT_EQ(sen->getStdP(), std_p); 
-    ASSERT_EQ(sen->getStdO(), std_o); 
-
     ASSERT_MATRIX_APPROX(sen->computeNoiseCov(VectorXd(0)), noise_cov_3D, Constants::EPS)
 }
 
@@ -161,9 +141,6 @@ TEST(Pose, factory_yaml_2D)
     ASSERT_MATRIX_APPROX(sen->getP()->getState(), p_state_2D, Constants::EPS);
     ASSERT_MATRIX_APPROX(sen->getO()->getState(), o_state_2D, Constants::EPS);
 
-    ASSERT_EQ(sen->getStdP(), std_p); 
-    ASSERT_EQ(sen->getStdO(), std_o); 
-
     ASSERT_MATRIX_APPROX(sen->computeNoiseCov(VectorXd(0)), noise_cov_2D, Constants::EPS)
 }
 
@@ -181,9 +158,6 @@ TEST(Pose, factory_yaml_3D)
     ASSERT_MATRIX_APPROX(sen->getP()->getState(), p_state_3D, Constants::EPS);
     ASSERT_MATRIX_APPROX(sen->getO()->getState(), o_state_3D, Constants::EPS);
 
-    ASSERT_EQ(sen->getStdP(), std_p); 
-    ASSERT_EQ(sen->getStdO(), std_o); 
-
     ASSERT_MATRIX_APPROX(sen->computeNoiseCov(VectorXd(0)), noise_cov_3D, Constants::EPS)
 }
 
diff --git a/test/yaml/sensor_pose_2d.yaml b/test/yaml/sensor_pose_2d.yaml
index 10c6003e44afdd3a6d3d5762f3318be380fffc35..78d84857f7d3309cc12ca02eb7196d8367ddbefd 100644
--- a/test/yaml/sensor_pose_2d.yaml
+++ b/test/yaml/sensor_pose_2d.yaml
@@ -9,6 +9,4 @@ states:
     state: [3]
     dynamic: false
     
-std_p: 0.2
-std_o: 0.1
-
+std_noise: [0.1, 0.2, 0.3]
diff --git a/test/yaml/sensor_pose_3d.yaml b/test/yaml/sensor_pose_3d.yaml
index 249af7bfb925cc97f943e6136b39c2dc08b5b1d3..128461a53abd981d9b85ee9a339e6e3fb99c79b2 100644
--- a/test/yaml/sensor_pose_3d.yaml
+++ b/test/yaml/sensor_pose_3d.yaml
@@ -9,5 +9,4 @@ states:
     state: [0.5, 0.5, 0.5, 0.5]
     dynamic: false
     
-std_p: 0.2
-std_o: 0.1
+std_noise: [0.1, 0.2, 0.3, 0.4, 0.5, 0.6]