diff --git a/include/laser/sensor/sensor_laser_2D.h b/include/laser/sensor/sensor_laser_2D.h
index 89d3ce7687247615237b4bfcd0f1055d047c3ce7..64caa44e3fd96f374c90b08faa7f1b0336a3c218 100644
--- a/include/laser/sensor/sensor_laser_2D.h
+++ b/include/laser/sensor/sensor_laser_2D.h
@@ -31,11 +31,11 @@ class SensorLaser2D : public SensorBase
 
     public:
         /** \brief Constructor with extrinsics
-         * 
+         *
          * \param _p_ptr StateBlock pointer to the sensor position
          * \param _o_ptr StateBlock pointer to the sensor orientation
-         * 
-         **/        
+         *
+         **/
         SensorLaser2D(StateBlockPtr _p_ptr, StateBlockPtr _o_ptr);
 
         /** \brief Constructor with extrinsics and scan parameters
@@ -58,25 +58,26 @@ class SensorLaser2D : public SensorBase
         SensorLaser2D(StateBlockPtr _p_ptr, StateBlockPtr _o_ptr, IntrinsicsLaser2DPtr _params);
 
         virtual ~SensorLaser2D();
-        
+
         void setDefaultScanParams();
-        
+
         /** \brief Set scanner intrinsic parameters
-         * 
+         *
          * \param _params struct with scanner intrinsic parameters. See laser_scan_utils library API for reference.
-         * 
-         **/                
+         *
+         **/
         void setScanParams(const laserscanutils::LaserScanParams & _params);
 
         /** \brief Get scanner intrinsic parameters
-         * 
+         *
          * Get scanner intrinsic parameters
-         * 
-         **/                        
+         *
+         **/
         const laserscanutils::LaserScanParams & getScanParams() const;
 
     public:
         static SensorBasePtr create(const std::string& _unique_name, const Eigen::VectorXs& _extrinsics_po, const IntrinsicsBasePtr _intrinsics);
+        static SensorBasePtr createAutoConf(const std::string& _unique_name, const paramsServer& _server);
         static IntrinsicsBasePtr createParams(const std::string& _filename_dot_yaml);
 
 };
diff --git a/src/sensor/sensor_GPS.cpp b/src/sensor/sensor_GPS.cpp
deleted file mode 100644
index 666788225c5c7b3c1a35ae8004569f38053e1573..0000000000000000000000000000000000000000
--- a/src/sensor/sensor_GPS.cpp
+++ /dev/null
@@ -1,56 +0,0 @@
-
-#include "core/sensor/sensor_GPS.h"
-#include "core/state_block/state_block.h"
-#include "core/state_block/state_quaternion.h"
-
-namespace wolf {
-
-SensorGPS::SensorGPS(StateBlockPtr _p_ptr, //GPS sensor position with respect to the car frame (base frame)
-                     StateBlockPtr _o_ptr, //GPS sensor orientation with respect to the car frame (base frame)
-                     StateBlockPtr _bias_ptr,  //GPS sensor time bias
-                     StateBlockPtr _map_p_ptr, //initial position of vehicle's frame with respect to starting point frame
-                     StateBlockPtr _map_o_ptr) //initial orientation of vehicle's frame with respect to the starting point frame
-        :
-        SensorBase("GPS", _p_ptr, _o_ptr, _bias_ptr, 0)
-{
-    getStateBlockVec().resize(5);
-    setStateBlockPtrStatic(3, _map_p_ptr); // Map position
-    setStateBlockPtrStatic(4, _map_o_ptr); // Map orientation
-    //
-}
-
-SensorGPS::~SensorGPS()
-{
-    //
-}
-
-StateBlockPtr SensorGPS::getMapP() const
-{
-    return getStateBlockPtrStatic(3);
-}
-
-StateBlockPtr SensorGPS::getMapO() const
-{
-    return getStateBlockPtrStatic(4);
-}
-
-// Define the factory method
-SensorBasePtr SensorGPS::create(const std::string& _unique_name, const Eigen::VectorXs& _extrinsics_p,
-                              const IntrinsicsBasePtr _intrinsics)
-{
-    // decode extrinsics vector
-    assert(_extrinsics_p.size() == 3 && "Bad extrinsics vector length. Should be 3 for 3D.");
-    StateBlockPtr pos_ptr = std::make_shared<StateBlock>(_extrinsics_p, true);
-    StateBlockPtr ori_ptr = nullptr;
-    SensorBasePtr sen = std::make_shared<SensorGPS>(pos_ptr, ori_ptr, nullptr, nullptr, nullptr);
-    sen->setName(_unique_name);
-    return sen;
-}
-
-} // namespace wolf
-
-// Register in the SensorFactory
-#include "core/sensor/sensor_factory.h"
-namespace wolf {
-WOLF_REGISTER_SENSOR("GPS",SensorGPS)
-} // namespace wolf
diff --git a/src/sensor/sensor_GPS_fix.cpp b/src/sensor/sensor_GPS_fix.cpp
deleted file mode 100644
index ca204f36449afda97c38c4e5278859a3e752a036..0000000000000000000000000000000000000000
--- a/src/sensor/sensor_GPS_fix.cpp
+++ /dev/null
@@ -1,43 +0,0 @@
-#include "core/sensor/sensor_GPS_fix.h"
-#include "core/state_block/state_block.h"
-#include "core/state_block/state_quaternion.h"
-
-namespace wolf {
-
-SensorGPSFix::SensorGPSFix(const Eigen::VectorXs & _extrinsics, const IntrinsicsGPSFix& _intrinsics) :
-        SensorBase("GPS FIX", std::make_shared<StateBlock>(_extrinsics.head(3), true), std::make_shared<StateQuaternion>(_extrinsics.tail(4), true), nullptr, _intrinsics.noise_std)
-{
-    assert((_extrinsics.size() == 2 || _extrinsics.size() == 3)
-           && "Bad extrinsic vector size. Should be 2 for 2D, 3 for 3D.");
-}
-
-SensorGPSFix::SensorGPSFix(const Eigen::VectorXs & _extrinsics, IntrinsicsGPSFixPtr _intrinsics_ptr) :
-        SensorGPSFix(_extrinsics, *_intrinsics_ptr)
-{
-    //
-}
-
-SensorGPSFix::~SensorGPSFix()
-{
-    //
-}
-
-// Define the factory method
-SensorBasePtr SensorGPSFix::create(const std::string& _unique_name, const Eigen::VectorXs& _extrinsics,
-                                 const IntrinsicsBasePtr _intrinsics)
-{
-    assert((_extrinsics.size() == 2 || _extrinsics.size() == 3)
-            && "Bad extrinsic vector size. Should be 2 for 2D, 3 for 3D.");
-    SensorGPSFixPtr sen = std::make_shared<SensorGPSFix>(_extrinsics, std::static_pointer_cast<IntrinsicsGPSFix>(_intrinsics));
-    sen->getP()->fix();
-    sen->setName(_unique_name);
-    return sen;
-}
-
-} // namespace wolf
-
-// Register in the SensorFactory
-#include "core/sensor/sensor_factory.h"
-namespace wolf {
-WOLF_REGISTER_SENSOR("GPS FIX", SensorGPSFix)
-} // namespace wolf
diff --git a/src/sensor/sensor_IMU.cpp b/src/sensor/sensor_IMU.cpp
deleted file mode 100644
index de0146784289081c2adb55bd272982d9c86bd797..0000000000000000000000000000000000000000
--- a/src/sensor/sensor_IMU.cpp
+++ /dev/null
@@ -1,49 +0,0 @@
-#include "core/sensor/sensor_IMU.h"
-#include "core/state_block/state_block.h"
-#include "core/state_block/state_quaternion.h"
-
-namespace wolf {
-
-SensorIMU::SensorIMU(const Eigen::VectorXs& _extrinsics, IntrinsicsIMUPtr _params) :
-        SensorIMU(_extrinsics, *_params)
-{
-    //
-}
-
-SensorIMU::SensorIMU(const Eigen::VectorXs& _extrinsics, const IntrinsicsIMU& _params) :
-        SensorBase("IMU", std::make_shared<StateBlock>(_extrinsics.head(3), true), std::make_shared<StateQuaternion>(_extrinsics.tail(4), true), std::make_shared<StateBlock>(6, false, nullptr), (Eigen::Vector6s()<<_params.a_noise,_params.a_noise,_params.a_noise,_params.w_noise,_params.w_noise,_params.w_noise).finished(), false, true),
-        a_noise(_params.a_noise),
-        w_noise(_params.w_noise),
-        ab_initial_stdev(_params.ab_initial_stdev),
-        wb_initial_stdev(_params.wb_initial_stdev),
-        ab_rate_stdev(_params.ab_rate_stdev),
-        wb_rate_stdev(_params.wb_rate_stdev)
-{
-    assert(_extrinsics.size() == 7 && "Wrong extrinsics vector size! Should be 7 for 2D.");
-}
-
-SensorIMU::~SensorIMU()
-{
-    //
-}
-
-// Define the factory method
-SensorBasePtr SensorIMU::create(const std::string& _unique_name, const Eigen::VectorXs& _extrinsics_pq,
-                              const IntrinsicsBasePtr _intrinsics)
-{
-    // decode extrinsics vector
-    assert(_extrinsics_pq.size() == 7 && "Bad extrinsics vector length. Should be 7 for 3D.");
-
-    IntrinsicsIMUPtr params = std::static_pointer_cast<IntrinsicsIMU>(_intrinsics);
-    SensorIMUPtr sen = std::make_shared<SensorIMU>(_extrinsics_pq, params);
-    sen->setName(_unique_name);
-    return sen;
-}
-
-} // namespace wolf
-
-// Register in the SensorFactory
-#include "core/sensor/sensor_factory.h"
-namespace wolf {
-WOLF_REGISTER_SENSOR("IMU", SensorIMU)
-} // namespace wolf
diff --git a/src/sensor/sensor_base.cpp b/src/sensor/sensor_base.cpp
deleted file mode 100644
index 26238eb8dcdf059a440b82ce149f5daef8ae20d7..0000000000000000000000000000000000000000
--- a/src/sensor/sensor_base.cpp
+++ /dev/null
@@ -1,407 +0,0 @@
-#include "core/sensor/sensor_base.h"
-#include "core/state_block/state_block.h"
-#include "core/state_block/state_quaternion.h"
-#include "core/factor/factor_block_absolute.h"
-#include "core/factor/factor_quaternion_absolute.h"
-
-
-namespace wolf {
-
-unsigned int SensorBase::sensor_id_count_ = 0;
-
-SensorBase::SensorBase(const std::string& _type,
-                       StateBlockPtr _p_ptr,
-                       StateBlockPtr _o_ptr,
-                       StateBlockPtr _intr_ptr,
-                       const unsigned int _noise_size,
-                       const bool _extr_dyn,
-                       const bool _intr_dyn) :
-        NodeBase("SENSOR", _type),
-        hardware_ptr_(),
-        state_block_vec_(3), // allow for 3 state blocks by default. Resize in derived constructors if needed.
-        calib_size_(0),
-        sensor_id_(++sensor_id_count_), // simple ID factory
-        extrinsic_dynamic_(_extr_dyn),
-        intrinsic_dynamic_(_intr_dyn),
-        has_capture_(false),
-        noise_std_(_noise_size),
-        noise_cov_(_noise_size, _noise_size)
-{
-    noise_std_.setZero();
-    noise_cov_.setZero();
-    state_block_vec_[0] = _p_ptr;
-    state_block_vec_[1] = _o_ptr;
-    state_block_vec_[2] = _intr_ptr;
-    updateCalibSize();
-}
-
-SensorBase::SensorBase(const std::string& _type,
-                       StateBlockPtr _p_ptr,
-                       StateBlockPtr _o_ptr,
-                       StateBlockPtr _intr_ptr,
-                       const Eigen::VectorXs & _noise_std,
-                       const bool _extr_dyn,
-                       const bool _intr_dyn) :
-        NodeBase("SENSOR", _type),
-        hardware_ptr_(),
-        state_block_vec_(3), // allow for 3 state blocks by default. Resize in derived constructors if needed.
-        calib_size_(0),
-        sensor_id_(++sensor_id_count_), // simple ID factory
-        extrinsic_dynamic_(_extr_dyn),
-        intrinsic_dynamic_(_intr_dyn),
-        has_capture_(false),
-        noise_std_(_noise_std),
-        noise_cov_(_noise_std.size(), _noise_std.size())
-{
-    state_block_vec_[0] = _p_ptr;
-    state_block_vec_[1] = _o_ptr;
-    state_block_vec_[2] = _intr_ptr;
-    setNoiseStd(_noise_std);
-    updateCalibSize();
-}
-
-SensorBase::~SensorBase()
-{
-    // Remove State Blocks
-    removeStateBlocks();
-}
-
-void SensorBase::removeStateBlocks()
-{
-    for (unsigned int i = 0; i < state_block_vec_.size(); i++)
-    {
-        auto sbp = getStateBlockPtrStatic(i);
-        if (sbp != nullptr)
-        {
-            if (getProblem() != nullptr && !extrinsic_dynamic_)
-            {
-                getProblem()->removeStateBlock(sbp);
-            }
-            setStateBlockPtrStatic(i, nullptr);
-        }
-    }
-}
-
-void SensorBase::fix()
-{
-    for( auto sbp : state_block_vec_)
-        if (sbp != nullptr)
-            sbp->fix();
-    updateCalibSize();
-}
-
-void SensorBase::unfix()
-{
-    for( auto sbp : state_block_vec_)
-        if (sbp != nullptr)
-            sbp->unfix();
-    updateCalibSize();
-}
-
-void SensorBase::fixExtrinsics()
-{
-    for (unsigned int i = 0; i < 2; i++)
-    {
-        auto sbp = state_block_vec_[i];
-        if (sbp != nullptr)
-            sbp->fix();
-    }
-    updateCalibSize();
-}
-
-void SensorBase::unfixExtrinsics()
-{
-    for (unsigned int i = 0; i < 2; i++)
-    {
-        auto sbp = state_block_vec_[i];
-        if (sbp != nullptr)
-            sbp->unfix();
-    }
-    updateCalibSize();
-}
-
-void SensorBase::fixIntrinsics()
-{
-    for (unsigned int i = 2; i < state_block_vec_.size(); i++)
-    {
-        auto sbp = state_block_vec_[i];
-        if (sbp != nullptr)
-            sbp->fix();
-    }
-    updateCalibSize();
-}
-
-void SensorBase::unfixIntrinsics()
-{
-    for (unsigned int i = 2; i < state_block_vec_.size(); i++)
-    {
-        auto sbp = state_block_vec_[i];
-        if (sbp != nullptr)
-            sbp->unfix();
-    }
-    updateCalibSize();
-}
-
-void SensorBase::addPriorParameter(const unsigned int _i, const Eigen::VectorXs& _x, const Eigen::MatrixXs& _cov, unsigned int _start_idx, int _size)
-{
-    assert(!isStateBlockDynamic(_i) && "SensorBase::addPriorParameter only allowed for static parameters");
-    assert(_i < state_block_vec_.size() && "State block not found");
-
-    StateBlockPtr _sb = getStateBlockPtrStatic(_i);
-    bool is_quaternion = (std::dynamic_pointer_cast<StateQuaternion>(_sb) != nullptr);
-
-    assert(((!is_quaternion && _x.size() == _cov.rows() && _x.size() == _cov.cols()) ||
-            (is_quaternion && _x.size() == 4 &&_cov.rows() == 3 && _cov.cols() == 3)) && "bad prior/covariance dimensions");
-    assert((_size == -1 && _start_idx == 0) || (_size+_start_idx <= _sb->getSize()));
-    assert(_size == -1 || _size == _x.size());
-    assert(!(_size != -1 && is_quaternion) && "prior of a segment of state not available for quaternion");
-
-    // set StateBlock state
-    if (_size == -1)
-        _sb->setState(_x);
-    else
-    {
-        Eigen::VectorXs new_x = _sb->getState();
-        new_x.segment(_start_idx,_size) = _x;
-        _sb->setState(new_x);
-    }
-
-    // remove previous prior (if any)
-    if (params_prior_map_.find(_i) != params_prior_map_.end())
-        params_prior_map_[_i]->remove();
-
-    // create feature
-    FeatureBasePtr ftr_prior = std::make_shared<FeatureBase>("ABSOLUTE",_x,_cov);
-
-    // set feature problem
-    ftr_prior->setProblem(getProblem());
-
-    // create & add factor absolute
-    if (is_quaternion)
-        ftr_prior->addFactor(std::make_shared<FactorQuaternionAbsolute>(_sb));
-    else
-        ftr_prior->addFactor(std::make_shared<FactorBlockAbsolute>(_sb, _start_idx, _size));
-
-    // store feature in params_prior_map_
-    params_prior_map_[_i] = ftr_prior;
-}
-
-void SensorBase::registerNewStateBlocks()
-{
-    if (getProblem() != nullptr)
-    {
-        for (unsigned int i = 0; i < getStateBlockVec().size(); i++)
-        {
-            if (i < 2 && !isExtrinsicDynamic())
-            {
-                auto sbp = getStateBlockPtrStatic(i);
-                if (sbp != nullptr)
-                    getProblem()->addStateBlock(sbp);
-            }
-            if (i >= 2 && !isIntrinsicDynamic())
-            {
-                auto sbp = getStateBlockPtrStatic(i);
-                if (sbp != nullptr)
-                    getProblem()->addStateBlock(sbp);
-            }
-        }
-    }
-}
-
-void SensorBase::setNoiseStd(const Eigen::VectorXs& _noise_std) {
-    noise_std_ = _noise_std;
-    noise_cov_ = _noise_std.array().square().matrix().asDiagonal();
-}
-
-void SensorBase::setNoiseCov(const Eigen::MatrixXs& _noise_cov) {
-    noise_std_ = _noise_cov.diagonal().array().sqrt();
-    noise_cov_ = _noise_cov;
-}
-
-CaptureBasePtr SensorBase::lastKeyCapture(void)
-{
-    // we search for the most recent Capture of this sensor which belongs to a KeyFrame
-    CaptureBasePtr capture = nullptr;
-    FrameBasePtrList frame_list = getProblem()->getTrajectory()->getFrameList();
-    FrameBaseRevIter frame_rev_it = frame_list.rbegin();
-    while (frame_rev_it != frame_list.rend())
-    {
-        if ((*frame_rev_it)->isKey())
-        {
-            capture = (*frame_rev_it)->getCaptureOf(shared_from_this());
-            if (capture)
-                // found the most recent Capture made by this sensor !
-                break;
-        }
-        frame_rev_it++;
-    }
-    return capture;
-}
-
-CaptureBasePtr SensorBase::lastCapture(const TimeStamp& _ts)
-{
-    // we search for the most recent Capture of this sensor before _ts
-    CaptureBasePtr capture = nullptr;
-    FrameBasePtrList frame_list = getProblem()->getTrajectory()->getFrameList();
-
-    // We iterate in reverse since we're likely to find it close to the rbegin() place.
-    FrameBaseRevIter frame_rev_it = frame_list.rbegin();
-    while (frame_rev_it != frame_list.rend())
-    {
-        if ((*frame_rev_it)->getTimeStamp() <= _ts)
-        {
-            CaptureBasePtr capture = (*frame_rev_it)->getCaptureOf(shared_from_this());
-            if (capture)
-                // found the most recent Capture made by this sensor !
-                break;
-        }
-        frame_rev_it++;
-    }
-    return capture;
-}
-
-StateBlockPtr SensorBase::getP(const TimeStamp _ts)
-{
-    return getStateBlock(0, _ts);
-}
-
-StateBlockPtr SensorBase::getO(const TimeStamp _ts)
-{
-    return getStateBlock(1, _ts);
-}
-
-StateBlockPtr SensorBase::getIntrinsic(const TimeStamp _ts)
-{
-    return getStateBlock(2, _ts);
-}
-
-StateBlockPtr SensorBase::getP()
-{
-    return getStateBlock(0);
-}
-
-StateBlockPtr SensorBase::getO()
-{
-    return getStateBlock(1);
-}
-
-StateBlockPtr SensorBase::getIntrinsic()
-{
-    return getStateBlock(2);
-}
-
-SizeEigen SensorBase::computeCalibSize() const
-{
-    SizeEigen sz = 0;
-    for (unsigned int i = 0; i < state_block_vec_.size(); i++)
-    {
-        auto sb = state_block_vec_[i];
-        if (sb && !sb->isFixed())
-            sz += sb->getSize();
-    }
-    return sz;
-}
-
-Eigen::VectorXs SensorBase::getCalibration() const
-{
-    SizeEigen index = 0;
-    SizeEigen sz = getCalibSize();
-    Eigen::VectorXs calib(sz);
-    for (unsigned int i = 0; i < state_block_vec_.size(); i++)
-    {
-        auto sb = getStateBlockPtrStatic(i);
-        if (sb && !sb->isFixed())
-        {
-            calib.segment(index, sb->getSize()) = sb->getState();
-            index += sb->getSize();
-        }
-    }
-    return calib;
-}
-
-bool SensorBase::process(const CaptureBasePtr capture_ptr)
-{
-    capture_ptr->setSensor(shared_from_this());
-
-    for (const auto processor : processor_list_)
-    {
-        processor->process(capture_ptr);
-    }
-
-    return true;
-}
-
-ProcessorBasePtr SensorBase::addProcessor(ProcessorBasePtr _proc_ptr)
-{
-    processor_list_.push_back(_proc_ptr);
-    _proc_ptr->setSensor(shared_from_this());
-    _proc_ptr->setProblem(getProblem());
-    return _proc_ptr;
-}
-
-StateBlockPtr SensorBase::getStateBlock(unsigned int _i)
-{
-    CaptureBasePtr cap;
-
-    if (isStateBlockDynamic(_i, cap))
-        return cap->getStateBlock(_i);
-
-    return getStateBlockPtrStatic(_i);
-}
-
-StateBlockPtr SensorBase::getStateBlock(unsigned int _i, const TimeStamp& _ts)
-{
-    CaptureBasePtr cap;
-
-    if (isStateBlockDynamic(_i, _ts, cap))
-        return cap->getStateBlock(_i);
-
-    return getStateBlockPtrStatic(_i);
-}
-
-bool SensorBase::isStateBlockDynamic(unsigned int _i, CaptureBasePtr& cap)
-{
-    if ((_i<2 && this->extrinsicsInCaptures()) || (_i>=2 && intrinsicsInCaptures()))
-    {
-        cap = lastKeyCapture();
-
-        return cap != nullptr;
-    }
-    else
-        return false;
-}
-
-bool SensorBase::isStateBlockDynamic(unsigned int _i, const TimeStamp& _ts, CaptureBasePtr& cap)
-{
-    if ((_i<2 && this->extrinsicsInCaptures()) || (_i>=2 && intrinsicsInCaptures()))
-    {
-        cap = lastCapture(_ts);
-
-        return cap != nullptr;
-    }
-    else
-        return false;
-}
-
-bool SensorBase::isStateBlockDynamic(unsigned int _i)
-{
-    CaptureBasePtr cap;
-
-    return isStateBlockDynamic(_i,cap);
-}
-
-bool SensorBase::isStateBlockDynamic(unsigned int _i, const TimeStamp& _ts)
-{
-    CaptureBasePtr cap;
-
-    return isStateBlockDynamic(_i,_ts,cap);
-}
-
-void SensorBase::setProblem(ProblemPtr _problem)
-{
-    NodeBase::setProblem(_problem);
-    for (auto prc : processor_list_)
-        prc->setProblem(_problem);
-}
-
-} // namespace wolf
diff --git a/src/sensor/sensor_diff_drive.cpp b/src/sensor/sensor_diff_drive.cpp
deleted file mode 100644
index 3e07aea5750b77c76f3abdb2bddab92ddb69d2f9..0000000000000000000000000000000000000000
--- a/src/sensor/sensor_diff_drive.cpp
+++ /dev/null
@@ -1,133 +0,0 @@
-#include "core/sensor/sensor_diff_drive.h"
-#include "core/state_block/state_block.h"
-#include "core/capture/capture_motion.h"
-#include "core/utils/eigen_assert.h"
-
-namespace wolf {
-
-SensorDiffDrive::SensorDiffDrive(const StateBlockPtr& _p_ptr,
-                                 const StateBlockPtr& _o_ptr,
-                                 const StateBlockPtr& _i_ptr,
-                                 const IntrinsicsDiffDrivePtr& _intrinsics) :
-  SensorBase("DIFF DRIVE", _p_ptr, _o_ptr, _i_ptr, 2, false, false),
-  intrinsics_ptr_{_intrinsics}
-{
-  //
-}
-
-// Define the factory method
-SensorBasePtr SensorDiffDrive::create(const std::string& _unique_name,
-                                      const Eigen::VectorXs& _extrinsics_po,
-                                      const IntrinsicsBasePtr _intrinsics)
-{
-  Eigen::VectorSizeCheck<3>::check(_extrinsics_po);
-
-  // cast intrinsics into derived type
-  IntrinsicsDiffDrivePtr params = std::dynamic_pointer_cast<IntrinsicsDiffDrive>(_intrinsics);
-
-  if (params == nullptr)
-  {
-    WOLF_ERROR("SensorDiffDrive::create expected IntrinsicsDiffDrive !");
-    return nullptr;
-  }
-
-  StateBlockPtr pos_ptr = std::make_shared<StateBlock>(_extrinsics_po.head(2), true);
-  StateBlockPtr ori_ptr = std::make_shared<StateBlock>(_extrinsics_po.tail(1), true);
-  StateBlockPtr int_ptr = std::make_shared<StateBlock>(params->factors_,       true);
-
-  SensorBasePtr odo = std::make_shared<SensorDiffDrive>(pos_ptr, ori_ptr, int_ptr, params);
-
-  odo->setName(_unique_name);
-
-  /// @todo make calibration optional at creation
-  //if (calibrate)
-  //  odo->unfixIntrinsics();
-
-  return odo;
-}
-
-/// @todo Further work to enforce wheel model
-
-//const IntrinsicsDiffDrive& SensorDiffDrive::getIntrinsics()
-//{
-////  if (intrinsic_ptr_)
-////  {
-////    const auto& intrinsics = intrinsic_ptr_->getVector();
-
-////    intrinsics_.left_radius_factor_  = intrinsics(0);
-////    intrinsics_.right_radius_factor_ = intrinsics(1);
-////    intrinsics_.separation_factor_   = intrinsics(2);
-////  }
-
-//  return intrinsics_;
-//}
-
-//void SensorDiffDrive::initIntrisics()
-//{
-//  assert(intrinsic_ptr_ == nullptr &&
-//         "SensorDiffDrive::initIntrisicsPtr should only be called once at construction.");
-
-//  Eigen::Vector3s state;
-//  state << intrinsics_.left_radius_factor_,
-//           intrinsics_.right_radius_factor_,
-//           intrinsics_.separation_factor_;
-
-//  assert(state(0) > 0 && "The left_radius_factor should be rather close to 1.");
-//  assert(state(1) > 0 && "The right_radius_factor should be rather close to 1.");
-//  assert(state(2) > 0 && "The separation_factor should be rather close to 1.");
-
-//  intrinsic_ptr_ = new StateBlock(state);
-//}
-
-//void SensorDiffDrive::computeDataCov(const Eigen::Vector2s &_data, Eigen::Matrix2s &_data_cov)
-//{
-//  const double dp_std_l = intrinsics_.left_gain_  * _data(0);
-//  const double dp_std_r = intrinsics_.right_gain_ * _data(1);
-
-//  const double dp_var_l = dp_std_l * dp_std_l;
-//  const double dp_var_r = dp_std_r * dp_std_r;
-
-//  /// Wheel resolution covariance, which is like a DC offset equal to half of
-//  /// the resolution, which is the theoretical average error:
-//  const double dp_std_avg = Scalar(0.5) * intrinsics_.left_resolution_;
-//  const double dp_var_avg = dp_std_avg * dp_std_avg;
-
-//  /// Set covariance matrix (diagonal):
-//  _data_cov.diagonal() << dp_var_l + dp_var_avg,
-//                          dp_var_r + dp_var_avg;
-//}
-
-// This overload is probably not the best solution as it forces
-// me to call addCapture from a SensorDiffDrivePtr whereas
-// problem->installSensor() return a SensorBasePtr.
-//bool SensorDiffDrive::addCapture(CaptureBasePtr _capture_ptr)
-//{
-//  if (intrinsics_.data_is_position_)
-//  {
-//    Eigen::Vector2s data = _capture_ptr->getData();
-
-//    // dt is set to one as we are dealing with wheel position
-//    data = pose_inc_(data, intrinsics_.left_radius_, intrinsics_.right_radius_,
-//                     intrinsics_.separation_, 1);
-
-//    _capture_ptr->setData(data);
-
-//    Eigen::Matrix2s data_cov;
-//    data_cov << 0.00001, 0, 0, 0.00001; // Todo
-
-//    computeDataCov(data, data_cov);
-
-//    _capture_ptr->setDataCovariance(data_cov);
-//  }
-
-//  /// @todo tofix
-//  return false;//SensorBase::addCapture(_capture_ptr);
-//}
-
-} // namespace wolf
-
-// Register in the SensorFactory
-#include "core/sensor/sensor_factory.h"
-namespace wolf {
-WOLF_REGISTER_SENSOR("DIFF DRIVE", SensorDiffDrive)
-} // namespace wolf
diff --git a/src/sensor/sensor_laser_2D.cpp b/src/sensor/sensor_laser_2D.cpp
index 41c5fb00058dacf4172dc1ed8ee741a1dde50768..f1ddf33abe02f9d732a62e6182f7dcec8d1b1dbc 100644
--- a/src/sensor/sensor_laser_2D.cpp
+++ b/src/sensor/sensor_laser_2D.cpp
@@ -50,7 +50,7 @@ void SensorLaser2D::setDefaultScanParams()
     scan_params_.range_min_ = 0.2;
     scan_params_.range_max_ = 100;
     scan_params_.range_std_dev_ = 0.01;
-    
+
     setNoiseStd(Eigen::VectorXs::Constant(1,scan_params_.range_std_dev_));
 }
 
@@ -79,6 +79,23 @@ SensorBasePtr SensorLaser2D::create(const std::string& _unique_name, const Eigen
     return sen;
 }
 
+SensorBasePtr SensorLaser2D::createAutoConf(const std::string& _unique_name, const paramsServer& _server)
+{
+    // decode extrinsics vector
+    Eigen::VectorXs _extrinsics_po = _server.getParam<Eigen::VectorXs>(_unique_name + "/extrinsic/pos", "[0,0,0]");
+    assert(_extrinsics_po.size() == 3 && "Bad extrinsics vector length. Should be 3 for 2D.");
+    StateBlockPtr pos_ptr = std::make_shared<StateBlock>(_extrinsics_po.head(2), true);
+    StateBlockPtr ori_ptr = std::make_shared<StateBlock>(_extrinsics_po.tail(1), true);
+
+    SensorLaser2DPtr sen;
+    IntrinsicsLaser2D params;
+
+    sen = std::make_shared<SensorLaser2D>(pos_ptr, ori_ptr, params.scan_params);
+
+    sen->setName(_unique_name);
+    return sen;
+}
+
 } // namespace wolf
 
 // Register in the SensorFactory and the ParameterFactory
@@ -88,3 +105,7 @@ namespace wolf {
 WOLF_REGISTER_SENSOR("LASER 2D", SensorLaser2D)
 //const bool registered_laser_params = IntrinsicsFactory::get().registerCreator("LASER 2D", createIntrinsicsLaser2D);
 } // namespace wolf
+#include "core/sensor/autoconf_sensor_factory.h"
+namespace wolf {
+WOLF_REGISTER_SENSOR_AUTO("LASER 2D", SensorLaser2D)
+} // namespace wolf
diff --git a/src/sensor/sensor_odom_2D.cpp b/src/sensor/sensor_odom_2D.cpp
deleted file mode 100644
index e3e5d860f2960f8775a292c371b345d51d2dd70f..0000000000000000000000000000000000000000
--- a/src/sensor/sensor_odom_2D.cpp
+++ /dev/null
@@ -1,67 +0,0 @@
-#include "core/sensor/sensor_odom_2D.h"
-#include "core/state_block/state_block.h"
-#include "core/state_block/state_angle.h"
-
-namespace wolf {
-
-SensorOdom2D::SensorOdom2D(Eigen::VectorXs _extrinsics, const IntrinsicsOdom2D& _intrinsics) :
-        SensorBase("ODOM 2D", std::make_shared<StateBlock>(_extrinsics.head(2), true), std::make_shared<StateAngle>(_extrinsics(2), true), nullptr, 2),
-        k_disp_to_disp_(_intrinsics.k_disp_to_disp),
-        k_rot_to_rot_(_intrinsics.k_rot_to_rot)
-{
-    assert(_extrinsics.size() == 3 && "Wrong extrinsics vector size! Should be 3 for 2D.");
-    //
-}
-
-SensorOdom2D::SensorOdom2D(Eigen::VectorXs _extrinsics, IntrinsicsOdom2DPtr _intrinsics) :
-        SensorOdom2D(_extrinsics, *_intrinsics)
-{
-    //
-}
-
-SensorOdom2D::~SensorOdom2D()
-{
-    //
-}
-
-Scalar SensorOdom2D::getDispVarToDispNoiseFactor() const
-{
-    return k_disp_to_disp_;
-}
-
-Scalar SensorOdom2D::getRotVarToRotNoiseFactor() const
-{
-    return k_rot_to_rot_;
-}
-
-// Define the factory method
-SensorBasePtr SensorOdom2D::create(const std::string& _unique_name, const Eigen::VectorXs& _extrinsics_po,
-                                 const IntrinsicsBasePtr _intrinsics)
-{
-    // decode extrinsics vector
-    assert(_extrinsics_po.size() == 3 && "Bad extrinsics vector length. Should be 3 for 2D.");
-
-    SensorOdom2DPtr odo;
-    if (_intrinsics)
-    {
-        std::shared_ptr<IntrinsicsOdom2D> params = std::static_pointer_cast<IntrinsicsOdom2D>(_intrinsics);
-        odo = std::make_shared<SensorOdom2D>(_extrinsics_po, params);
-    }
-    else
-    {
-        IntrinsicsOdom2D params;
-        params.k_disp_to_disp = 1;
-        params.k_rot_to_rot   = 1;
-        odo = std::make_shared<SensorOdom2D>(_extrinsics_po, params);
-    }
-    odo->setName(_unique_name);
-    return odo;
-}
-
-} // namespace wolf
-
-// Register in the SensorFactory
-#include "core/sensor/sensor_factory.h"
-namespace wolf {
-WOLF_REGISTER_SENSOR("ODOM 2D", SensorOdom2D)
-} // namespace wolf
diff --git a/src/sensor/sensor_odom_3D.cpp b/src/sensor/sensor_odom_3D.cpp
deleted file mode 100644
index cf6431489efb45c0e0bf4599899bc9c850ebf902..0000000000000000000000000000000000000000
--- a/src/sensor/sensor_odom_3D.cpp
+++ /dev/null
@@ -1,63 +0,0 @@
-/**
- * \file sensor_odom_3D.cpp
- *
- *  Created on: Oct 7, 2016
- *      \author: jsola
- */
-
-#include "core/sensor/sensor_odom_3D.h"
-
-#include "core/state_block/state_block.h"
-#include "core/state_block/state_quaternion.h"
-
-namespace wolf {
-
-SensorOdom3D::SensorOdom3D(const Eigen::VectorXs& _extrinsics_pq, const IntrinsicsOdom3D& _intrinsics) :
-                        SensorBase("ODOM 3D", std::make_shared<StateBlock>(_extrinsics_pq.head(3), true), std::make_shared<StateQuaternion>(_extrinsics_pq.tail(4), true), nullptr, 6),
-                        k_disp_to_disp_(_intrinsics.k_disp_to_disp),
-                        k_disp_to_rot_(_intrinsics.k_disp_to_rot),
-                        k_rot_to_rot_(_intrinsics.k_rot_to_rot),
-                        min_disp_var_(_intrinsics.min_disp_var),
-                        min_rot_var_(_intrinsics.min_rot_var)
-{
-    assert(_extrinsics_pq.size() == 7 && "Bad extrinsics vector size! Should be 7 for 3D.");
-
-    noise_cov_ = (Eigen::Vector6s() << min_disp_var_, min_disp_var_, min_disp_var_, min_rot_var_, min_rot_var_, min_rot_var_).finished().asDiagonal();
-    setNoiseCov(noise_cov_); // sets also noise_std_
-}
-
-SensorOdom3D::SensorOdom3D(const Eigen::VectorXs& _extrinsics_pq, IntrinsicsOdom3DPtr _intrinsics) :
-        SensorOdom3D(_extrinsics_pq, *_intrinsics)
-{
-    //
-}
-
-SensorOdom3D::~SensorOdom3D()
-{
-    //
-}
-
-// Define the factory method
-SensorBasePtr SensorOdom3D::create(const std::string& _unique_name, const Eigen::VectorXs& _extrinsics_pq,
-                                 const IntrinsicsBasePtr _intrinsics)
-{
-    // decode extrinsics vector
-    assert(_extrinsics_pq.size() == 7 && "Bad extrinsics vector length. Should be 7 for 3D.");
-
-    // cast intrinsics into derived type
-    IntrinsicsOdom3DPtr params = std::static_pointer_cast<IntrinsicsOdom3D>(_intrinsics);
-
-    // Call constructor and finish
-    SensorBasePtr odo = std::make_shared<SensorOdom3D>(_extrinsics_pq, params);
-    odo->setName(_unique_name);
-
-    return odo;
-}
-
-} // namespace wolf
-
-// Register in the SensorFactory
-#include "core/sensor/sensor_factory.h"
-namespace wolf {
-WOLF_REGISTER_SENSOR("ODOM 3D", SensorOdom3D)
-}