diff --git a/test/gtest_processor_odom_icp_3d.cpp b/test/gtest_processor_odom_icp_3d.cpp
index 00313cade8eba4eb10f234c696789d4560076d15..a372ecb11087c23302eb41b37a155e9d52f6b09d 100644
--- a/test/gtest_processor_odom_icp_3d.cpp
+++ b/test/gtest_processor_odom_icp_3d.cpp
@@ -39,7 +39,6 @@
 #include <core/utils/utils_gtest.h>
 #include <core/utils/logging.h>
 
-
 // pcl includes
 #include <pcl/point_cloud.h>
 #include <pcl/io/pcd_io.h>
@@ -60,121 +59,68 @@ void loadData(std::string fname, pcl::PointCloud<pcl::PointXYZ>& cloud)
 class Test_ProcessorOdomIcp3D_yaml : public testing::Test
 {
   public:
-    ProblemPtr                           P;
-    SensorLaser3dPtr                     S;
-    ProcessorOdomIcp3dPtr                p;
-    FrameBasePtr                         F0, F1, F;
-    CaptureLaser3dPtr                    C0, C1, C2, C3;
-    
-    VectorXd              data;
-    MatrixXd              data_cov;
+    ProblemPtr            P;
+    SensorLaser3dPtr      S;
+    ProcessorOdomIcp3dPtr p;
+    FrameBasePtr          F0, F1, F;
+    CaptureLaser3dPtr     C0, C1, C2, C3;
+
+    VectorXd data;
+    MatrixXd data_cov;
 
   protected:
     void SetUp() override
     {
-
         WOLF_INFO(laser_root_dir);
 
-        ParserYaml   parser    = ParserYaml("problem_odom_icp_3d.yaml", laser_root_dir + "/test/yaml/");
-        ParamsServer server    = ParamsServer(parser.getParams());
-        P                      = Problem::autoSetup(server);
+        ParserYaml   parser = ParserYaml("problem_odom_icp_3d.yaml", laser_root_dir + "/test/yaml/");
+        ParamsServer server = ParamsServer(parser.getParams());
+        P                   = Problem::autoSetup(server);
 
         S = std::static_pointer_cast<SensorLaser3d>(P->getHardware()->getSensorList().front());
         p = std::static_pointer_cast<ProcessorOdomIcp3d>(S->getProcessorList().front());
 
-
-        P->print(4,1,1,1);
-/* 
-        data     = VectorXd::Zero(12);  // [ a, w, f, t ]
-        data_cov = MatrixXd::Identity(12, 12);
-        C        = std::make_shared<CaptureMotion>("CaptureMotion", 0.0, S, data, data_cov, nullptr);
-
-        C->process();
-
-        C0 = std::static_pointer_cast<CaptureMotion>(p->getOrigin());
-        F0 = C0->getFrame();
-
-        ASSERT_EQ(C0->getTimeStamp(), F0->getTimeStamp());
-        ASSERT_EQ(C0->getTimeStamp(), F0->getCaptureOf(S)->getTimeStamp());
-
-        C = std::make_shared<CaptureMotion>("CaptureMotion", 1.0, S, data, data_cov, nullptr);
-        C->process();
-
-        C1 = std::static_pointer_cast<CaptureMotion>(p->getLast());
-        F1 = C1->getFrame();
-
-        F1->link(P);  // by the face
-
-        VectorXd delta_preint(VectorXd::Zero(19));
-        delta_preint.head<3>()     = -0.5 * gravity();
-        delta_preint.segment<3>(3) = -gravity();
-        delta_preint.segment<3>(6) = -0.5 * gravity();
-        delta_preint.segment<3>(9) = -gravity();
-        delta_preint(18)           = 1;
-        MatrixXd delta_preint_cov(MatrixXd::Identity(18, 18));
-        VectorXd calib_preint(VectorXd::Zero(13));
-        MatrixXd jacobian_calib(MatrixXd::Zero(18, 13));
-        f1 = FeatureBase::emplace<FeatureMotion>(
-            C1, "FeatureMotion", delta_preint, delta_preint_cov, calib_preint, jacobian_calib);
-
-        c1 = FactorBase::emplace<FactorForceTorqueInertialDynamics>(f1, f1, C0, p, false);
-
-        F1->getStateBlock('P')->setState(Vector3d(0, 0, 0));
-        F1->getStateBlock('V')->setState(Vector3d(0, 0, 0));
-        F1->getStateBlock('O')->setState(Vector4d(0, 0, 0, 1));
-        F1->getStateBlock('L')->setState(Vector3d(0, 0, 0));
-        */
+        P->print(4, 1, 1, 1);
     }
 };
-    
 
 TEST(Init, register_in_factories)
 {
-FactorySensor::registerCreator("SensorLaser3d", SensorLaser3d::create);
-AutoConfFactorySensor::registerCreator("SensorLaser3d", SensorLaser3d::create);
-FactoryProcessor::registerCreator("ProcessorOdomIcp3d", ProcessorOdomIcp3d::create);
-AutoConfFactoryProcessor::registerCreator("ProcessorOdomIcp3d", ProcessorOdomIcp3d::create);
-
+    FactorySensor::registerCreator("SensorLaser3d", SensorLaser3d::create);
+    AutoConfFactorySensor::registerCreator("SensorLaser3d", SensorLaser3d::create);
+    FactoryProcessor::registerCreator("ProcessorOdomIcp3d", ProcessorOdomIcp3d::create);
+    AutoConfFactoryProcessor::registerCreator("ProcessorOdomIcp3d", ProcessorOdomIcp3d::create);
 }
 
-TEST_F(Test_ProcessorOdomIcp3D_yaml, align_known_transform)
+TEST_F(Test_ProcessorOdomIcp3D_yaml, process_make_keyframes_always_same_pcl)
 {
-    // Load data
-    pcl::PointCloud<pcl::PointXYZ>::Ptr pcl_ref0 = pcl::make_shared<pcl::PointCloud<pcl::PointXYZ>>();
-    loadData(laser_root_dir + "/test/data/1.pcd", *pcl_ref0);
-    C0 = std::make_shared<CaptureLaser3d>(0.0, S, pcl_ref0);
-    C0->process();
-
-    VectorComposite x0 = P->getState();
-
-    // Load data
-    pcl::PointCloud<pcl::PointXYZ>::Ptr pcl_ref1 = pcl::make_shared<pcl::PointCloud<pcl::PointXYZ>>();
-    loadData(laser_root_dir + "/test/data/2.pcd", *pcl_ref1);
-    C1 = std::make_shared<CaptureLaser3d>(1.0, S, pcl_ref1);
-    C1->process();
-
-    VectorComposite x1 = P->getState();
-
-    // Load data
-    pcl::PointCloud<pcl::PointXYZ>::Ptr pcl_ref2 = pcl::make_shared<pcl::PointCloud<pcl::PointXYZ>>();
-    loadData(laser_root_dir + "/test/data/2.pcd", *pcl_ref2);
-    C2 = std::make_shared<CaptureLaser3d>(2.0, S, pcl_ref2);
-    C2->process();
-    
-    VectorComposite x2 = P->getState();
-
-    // Load data
-    pcl::PointCloud<pcl::PointXYZ>::Ptr pcl_ref3 = pcl::make_shared<pcl::PointCloud<pcl::PointXYZ>>();
-    loadData(laser_root_dir + "/test/data/2.pcd", *pcl_ref3);
-    C3 = std::make_shared<CaptureLaser3d>(3.0, S, pcl_ref3);
-    C3->process();
-    
-    VectorComposite x3 = P->getState();
-
-    ASSERT_MATRIX_APPROX(x1.vector("PO"), x2.vector("PO"), 1e-8); // pointclouds 1 and 2 are the same
-    ASSERT_MATRIX_APPROX(x2.vector("PO"), x3.vector("PO"), 1e-8); // pointclouds 2 and 3 are the same
-
-    P->print(4,1,1,1);
+    std::vector<VectorComposite> X(10);
+    unsigned int                 i = 0;
+    for (TimeStamp t = 0; t < 6; t += 0.5)  // will make one KF every 2 captures
+    {
+        // Load pointcloud from file
+        pcl::PointCloud<pcl::PointXYZ>::Ptr pcl_ref0 = pcl::make_shared<pcl::PointCloud<pcl::PointXYZ>>();
+        loadData(laser_root_dir + "/test/data/1.pcd", *pcl_ref0);
+
+        // make Capture and process
+        C0 = std::make_shared<CaptureLaser3d>(t, S, pcl_ref0);
+        C0->process();
+
+        // store state at integer timestamps (where the KFs are)
+        if (std::fabs(t.get() - (double)i) < 0.1)
+        {
+            X[i] = p->getLast()->getFrame()->getState("PO");
+            i++;
+        }
+    }
+
+    P->print(4, 1, 1, 1);
+
+    ASSERT_MATRIX_APPROX(X.at(0).vector("PO"), X.at(1).vector("PO"), 1e-8);  // pointclouds are the same
+    ASSERT_MATRIX_APPROX(X.at(0).vector("PO"), X.at(2).vector("PO"), 1e-8);  // pointclouds are the same
+    ASSERT_MATRIX_APPROX(X.at(0).vector("PO"), X.at(3).vector("PO"), 1e-8);  // pointclouds are the same
+    ASSERT_MATRIX_APPROX(X.at(0).vector("PO"), X.at(4).vector("PO"), 1e-8);  // pointclouds are the same
+    ASSERT_MATRIX_APPROX(X.at(0).vector("PO"), X.at(5).vector("PO"), 1e-8);  // pointclouds are the same
 }
 
 // // Test to see if the constructor works (not yaml files)
@@ -332,7 +278,7 @@ TEST_F(Test_ProcessorOdomIcp3D_yaml, align_known_transform)
 //     ASSERT_MATRIX_APPROX(res_exp, res, 1e-8);
 // }
 
-int main(int argc, char **argv)
+int main(int argc, char** argv)
 {
     testing::InitGoogleTest(&argc, argv);
     //::testing::GTEST_FLAG(filter) = "Test_FactorForceTorqueInertialDynamics_yaml.residual";