diff --git a/include/imu/processor/processor_imu.h b/include/imu/processor/processor_imu.h
index 080fb3dcb51017f1c065a586acd04bb683b28c80..1c03c1b41371b0fdbc412fdb3391c063c7f90c5c 100644
--- a/include/imu/processor/processor_imu.h
+++ b/include/imu/processor/processor_imu.h
@@ -122,8 +122,7 @@ class ProcessorImu : public ProcessorMotion{
                                         const VectorXd&       _calib,
                                         const VectorXd&       _calib_preint,
                                         const CaptureBasePtr& _capture_origin) override;
-        FeatureBasePtr   emplaceFeature(CaptureMotionPtr _capture_motion) override;
-        FactorBasePtr    emplaceFactor(FeatureBasePtr _feature_motion, CaptureBasePtr _capture_origin) override;
+        virtual void emplaceFeaturesAndFactors(CaptureBasePtr _capture_origin, CaptureMotionPtr _capture_own) override;
 
       public:
         /** \brief Enable bootstrapping process
diff --git a/include/imu/processor/processor_imu2d.h b/include/imu/processor/processor_imu2d.h
index 726666f48ab2878d2f86712a4fc35b79e7f7e31a..44f418140aec1b066a8a07600e4ec535d6c1f01f 100644
--- a/include/imu/processor/processor_imu2d.h
+++ b/include/imu/processor/processor_imu2d.h
@@ -92,9 +92,8 @@ class ProcessorImu2d : public ProcessorMotion{
                                                 const VectorXd& _calib,
                                                 const VectorXd& _calib_preint,
                                                 const CaptureBasePtr& _capture_origin) override;
-        FeatureBasePtr emplaceFeature(CaptureMotionPtr _capture_motion) override;
-        FactorBasePtr emplaceFactor(FeatureBasePtr _feature_motion,
-                                            CaptureBasePtr _capture_origin) override;
+        virtual void emplaceFeaturesAndFactors(CaptureBasePtr _capture_origin, CaptureMotionPtr _capture_own) override;
+
 
     protected:
         ParamsProcessorImu2dPtr params_motion_Imu_;
diff --git a/src/processor/processor_imu.cpp b/src/processor/processor_imu.cpp
index 2fe42636bf35da2a9b285e1214542e2941777d70..b0b5c56497cadc61f0c83e0735be58952dc2dabe 100644
--- a/src/processor/processor_imu.cpp
+++ b/src/processor/processor_imu.cpp
@@ -93,16 +93,6 @@ CaptureMotionPtr ProcessorImu::emplaceCapture(const FrameBasePtr& _frame_own,
     return cap_motion;
 }
 
-FeatureBasePtr ProcessorImu::emplaceFeature(CaptureMotionPtr _capture_motion)
-{
-    auto feature = FeatureBase::emplace<FeatureImu>(_capture_motion,
-                                                    _capture_motion->getBuffer().back().delta_integr_,
-                                                    _capture_motion->getBuffer().back().delta_integr_cov_ + unmeasured_perturbation_cov_,
-                                                    _capture_motion->getCalibrationPreint(),
-                                                    _capture_motion->getBuffer().back().jacobian_calib_);
-    return feature;
-}
-
 VectorXd ProcessorImu::getCalibration (const CaptureBaseConstPtr _capture) const
 {
     if (_capture)
@@ -116,12 +106,18 @@ void ProcessorImu::setCalibration (const CaptureBasePtr _capture, const VectorXd
     _capture->getSensorIntrinsic()->setState(_calibration);
 }
 
-FactorBasePtr ProcessorImu::emplaceFactor(FeatureBasePtr _feature_motion, CaptureBasePtr _capture_origin)
+void ProcessorImu::emplaceFeaturesAndFactors(CaptureBasePtr _capture_origin, CaptureMotionPtr _capture_own)
 {
+    auto feature = FeatureBase::emplace<FeatureImu>(_capture_own,
+                                                    _capture_own->getBuffer().back().delta_integr_,
+                                                    _capture_own->getBuffer().back().delta_integr_cov_ + unmeasured_perturbation_cov_,
+                                                    _capture_own->getCalibrationPreint(),
+                                                    _capture_own->getBuffer().back().jacobian_calib_);
+
     CaptureImuPtr cap_imu = std::static_pointer_cast<CaptureImu>(_capture_origin);
-    FeatureImuPtr ftr_imu = std::static_pointer_cast<FeatureImu>(_feature_motion);
+    FeatureImuPtr ftr_imu = std::static_pointer_cast<FeatureImu>(feature);
 
-    auto fac_imu = FactorBase::emplace<FactorImu>(_feature_motion, ftr_imu, cap_imu, shared_from_this(), params_->apply_loss_function);
+    auto fac_imu = FactorBase::emplace<FactorImu>(feature, ftr_imu, cap_imu, shared_from_this(), params_->apply_loss_function);
 
     if (bootstrapping_) 
     {
@@ -129,7 +125,6 @@ FactorBasePtr ProcessorImu::emplaceFactor(FeatureBasePtr _feature_motion, Captur
         bootstrap_factor_list_.push_back(fac_imu);
     }
 
-    return fac_imu;
 }
 
 void ProcessorImu::computeCurrentDelta(const Eigen::VectorXd& _data,
diff --git a/src/processor/processor_imu2d.cpp b/src/processor/processor_imu2d.cpp
index dc35d28c0a43844868505597948fed1315b83af3..23fbbd222c60e28df1eb36ba9742c7efb83b6604 100644
--- a/src/processor/processor_imu2d.cpp
+++ b/src/processor/processor_imu2d.cpp
@@ -101,16 +101,6 @@ namespace wolf {
     return cap_motion;
   }
 
-  FeatureBasePtr ProcessorImu2d::emplaceFeature(CaptureMotionPtr _capture_motion)
-  {
-    auto feature = FeatureBase::emplace<FeatureImu2d>(_capture_motion,
-                                                      _capture_motion->getBuffer().back().delta_integr_,
-                                                      _capture_motion->getBuffer().back().delta_integr_cov_ + unmeasured_perturbation_cov_,
-                                                      _capture_motion->getCalibrationPreint(),
-                                                      _capture_motion->getBuffer().back().jacobian_calib_);
-    return feature;
-  }
-
   VectorXd ProcessorImu2d::getCalibration (const CaptureBaseConstPtr _capture) const
   {
       if (_capture)
@@ -124,15 +114,22 @@ namespace wolf {
     _capture->getSensorIntrinsic()->setState(_calibration);
   }
 
-  FactorBasePtr ProcessorImu2d::emplaceFactor(FeatureBasePtr _feature_motion, CaptureBasePtr _capture_origin)
+  void ProcessorImu2d::emplaceFeaturesAndFactors(CaptureBasePtr _capture_origin, CaptureMotionPtr _capture_own)
   {
-    CaptureImuPtr cap_imu = std::static_pointer_cast<CaptureImu>(_capture_origin);
-    FeatureImu2dPtr ftr_imu = std::static_pointer_cast<FeatureImu2d>(_feature_motion);
+      auto feature = FeatureBase::emplace<FeatureImu2d>(
+          _capture_own, _capture_own->getBuffer().back().delta_integr_,
+          _capture_own->getBuffer().back().delta_integr_cov_ + unmeasured_perturbation_cov_,
+          _capture_own->getCalibrationPreint(), _capture_own->getBuffer().back().jacobian_calib_);
 
-    if( std::static_pointer_cast<SensorImu2d>(getSensor())->isGravityOrthogonal() ) 
-      return FactorBase::emplace<FactorImu2d>(_feature_motion, ftr_imu, cap_imu, shared_from_this(), params_->apply_loss_function);
-    else 
-      return FactorBase::emplace<FactorImu2dWithGravity>(_feature_motion, ftr_imu, cap_imu, shared_from_this(), params_->apply_loss_function);
+      CaptureImuPtr   cap_imu = std::static_pointer_cast<CaptureImu>(_capture_origin);
+      FeatureImu2dPtr ftr_imu = std::static_pointer_cast<FeatureImu2d>(feature);
+
+      if (std::static_pointer_cast<SensorImu2d>(getSensor())->isGravityOrthogonal())
+          FactorBase::emplace<FactorImu2d>(ftr_imu, ftr_imu, cap_imu, shared_from_this(),
+                                           params_->apply_loss_function);
+      else
+          FactorBase::emplace<FactorImu2dWithGravity>(ftr_imu, ftr_imu, cap_imu, shared_from_this(),
+                                                      params_->apply_loss_function);
   }
 
   void ProcessorImu2d::computeCurrentDelta(const Eigen::VectorXd& _data,