diff --git a/include/IMU/processor/processor_IMU.h b/include/IMU/processor/processor_IMU.h
index e90affda5cd952abe0412bf1c6bcbe4cac839018..5795fbd38bee0e64ec20c73a13e9beb49c41c37f 100644
--- a/include/IMU/processor/processor_IMU.h
+++ b/include/IMU/processor/processor_IMU.h
@@ -52,14 +52,17 @@ class ProcessorIMU : public ProcessorMotion{
                                    Motion& _motion,
                                    TimeStamp& _ts) override;
         virtual bool voteForKeyFrame() override;
-        virtual CaptureMotionPtr createCapture(const TimeStamp& _ts,
-                                               const SensorBasePtr& _sensor,
-                                               const VectorXs& _data,
-                                               const MatrixXs& _data_cov,
-                                               const FrameBasePtr& _frame_origin) override;
-        virtual FeatureBasePtr createFeature(CaptureMotionPtr _capture_motion) override;
+        virtual CaptureMotionPtr emplaceCapture(const FrameBasePtr& _frame_own,
+                                                const SensorBasePtr& _sensor,
+                                                const TimeStamp& _ts,
+                                                const VectorXs& _data,
+                                                const MatrixXs& _data_cov,
+                                                const VectorXs& _calib,
+                                                const VectorXs& _calib_preint,
+                                                const FrameBasePtr& _frame_origin) override;
+        virtual FeatureBasePtr emplaceFeature(CaptureMotionPtr _capture_motion) override;
         virtual FactorBasePtr emplaceFactor(FeatureBasePtr _feature_motion,
-                                                    CaptureBasePtr _capture_origin) override;
+                                            CaptureBasePtr _capture_origin) override;
 
     protected:
         ProcessorParamsIMUPtr params_motion_IMU_;
diff --git a/src/processor/processor_IMU.cpp b/src/processor/processor_IMU.cpp
index ac38037cd0750ec93b58821017ee579d34b559ac..5621d2c2d3321d8e79e65a28b34cd0b9d121acdc 100644
--- a/src/processor/processor_IMU.cpp
+++ b/src/processor/processor_IMU.cpp
@@ -185,27 +185,34 @@ Motion ProcessorIMU::interpolate(const Motion& _motion_ref, Motion& _motion_seco
 
 }
 
-CaptureMotionPtr ProcessorIMU::createCapture(const TimeStamp& _ts,
-                                             const SensorBasePtr& _sensor,
-                                             const VectorXs& _data,
-                                             const MatrixXs& _data_cov,
-                                             const FrameBasePtr& _frame_origin)
+CaptureMotionPtr ProcessorIMU::emplaceCapture(const FrameBasePtr& _frame_own,
+                                              const SensorBasePtr& _sensor,
+                                              const TimeStamp& _ts,
+                                              const VectorXs& _data,
+                                              const MatrixXs& _data_cov,
+                                              const VectorXs& _calib,
+                                              const VectorXs& _calib_preint,
+                                              const FrameBasePtr& _frame_origin)
 {
-    CaptureIMUPtr capture_imu = std::make_shared<CaptureIMU>(_ts,
-                                                             _sensor,
-                                                             _data,
-                                                             _data_cov,
-                                                             _frame_origin);
-    return capture_imu;
+    auto cap_motion = std::static_pointer_cast<CaptureMotion>(CaptureBase::emplace<CaptureIMU>(_frame_own,
+                                                                                               _ts,
+                                                                                               _sensor,
+                                                                                               _data,
+                                                                                               _data_cov,
+                                                                                               _frame_origin));
+    cap_motion->setCalibration(_calib);
+    cap_motion->setCalibrationPreint(_calib_preint);
+
+    return cap_motion;
 }
 
-FeatureBasePtr ProcessorIMU::createFeature(CaptureMotionPtr _capture_motion)
+FeatureBasePtr ProcessorIMU::emplaceFeature(CaptureMotionPtr _capture_motion)
 {
-    FeatureIMUPtr feature = std::make_shared<FeatureIMU>(
-            _capture_motion->getBuffer().get().back().delta_integr_,
-            _capture_motion->getBuffer().get().back().delta_integr_cov_ + unmeasured_perturbation_cov_,
-            _capture_motion->getBuffer().getCalibrationPreint(),
-            _capture_motion->getBuffer().get().back().jacobian_calib_);
+    auto feature = FeatureBase::emplace<FeatureIMU>(_capture_motion,
+                                                    _capture_motion->getBuffer().get().back().delta_integr_,
+                                                    _capture_motion->getBuffer().get().back().delta_integr_cov_ + unmeasured_perturbation_cov_,
+                                                    _capture_motion->getBuffer().getCalibrationPreint(),
+                                                    _capture_motion->getBuffer().get().back().jacobian_calib_);
     return feature;
 }
 
@@ -213,13 +220,8 @@ FactorBasePtr ProcessorIMU::emplaceFactor(FeatureBasePtr _feature_motion, Captur
 {
     CaptureIMUPtr cap_imu = std::static_pointer_cast<CaptureIMU>(_capture_origin);
     FeatureIMUPtr ftr_imu = std::static_pointer_cast<FeatureIMU>(_feature_motion);
-    // FactorIMUPtr fac_imu = std::make_shared<FactorIMU>(ftr_imu, cap_imu, shared_from_this());
-    auto fac_imu = FactorBase::emplace<FactorIMU>(_feature_motion, ftr_imu, cap_imu, shared_from_this());
 
-    // link ot wolf tree
-    // _feature_motion->addFactor(fac_imu);
-    // _capture_origin->addConstrainedBy(fac_imu);
-    // _capture_origin->getFrame()->addConstrainedBy(fac_imu);
+    auto fac_imu = FactorBase::emplace<FactorIMU>(_feature_motion, ftr_imu, cap_imu, shared_from_this());
 
     return fac_imu;
 }