diff --git a/CMakeLists.txt b/CMakeLists.txt
index b8fa448312e146b9956a5c0396e0802f8c99dbf6..b32a36ea21f9332c366feb59d0e5ad45f88e35df 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -1,5 +1,5 @@
 # Pre-requisites about cmake itself
-CMAKE_MINIMUM_REQUIRED(VERSION 3.10)
+CMAKE_MINIMUM_REQUIRED(VERSION 3.16)
 
 # MAC OSX RPATH
 SET(CMAKE_MACOSX_RPATH 1)
diff --git a/include/imu/math/imu2d_tools.h b/include/imu/math/imu2d_tools.h
index dc126140ff15c1e4fcaa97231b515c6e66b6c6f3..f725aa9d5c21041e7713fab10fd11f7499a67474 100644
--- a/include/imu/math/imu2d_tools.h
+++ b/include/imu/math/imu2d_tools.h
@@ -183,7 +183,6 @@ inline void compose(const MatrixBase<D1>& d1,
     Map<const Matrix<typename D2::Scalar, 2, 1> >   dp2    ( & d2( 0 ) );
     Map<const Matrix<typename D2::Scalar, 2, 1> >   dv2    ( & d2( 3 ) );
     Map<Matrix<typename D3::Scalar, 2, 1> >         sum_p  ( & sum( 0 ) );
-    sum(2)                                          =       d1(2) + d2(2);
     Map<Matrix<typename D3::Scalar, 2, 1> >         sum_v  ( & sum( 3 ) );
 
     compose(dp1, d1(2), dv1, dp2, d2(2), dv2, dt, sum_p, sum(2), sum_v);
diff --git a/test/gtest/CMakeLists.txt b/test/gtest/CMakeLists.txt
index 6209d341bcd32308bd522ab1990eb0cc82692012..f7bcca73296dc380b6c5232e6078c0e453e9b5a9 100644
--- a/test/gtest/CMakeLists.txt
+++ b/test/gtest/CMakeLists.txt
@@ -1,73 +1,31 @@
-if(${CMAKE_VERSION} VERSION_LESS "3.11.0") 
-  message("CMake version less than 3.11.0")
 
-  # Enable ExternalProject CMake module
-  include(ExternalProject)
+include(FetchContent)
 
-  set(GTEST_FORCE_SHARED_CRT ON)
-  set(GTEST_DISABLE_PTHREADS ON) # without this in ubuntu 18.04 we get linking errors
+FetchContent_Declare(
+  googletest
+  GIT_REPOSITORY https://github.com/google/googletest.git 
+  GIT_TAG main)
 
-  # Download GoogleTest
-  ExternalProject_Add(googletest
-      GIT_REPOSITORY https://github.com/google/googletest.git
-      GIT_TAG        v1.8.x
-      # TIMEOUT 1 # We'll try this
-      CMAKE_ARGS -DCMAKE_ARCHIVE_OUTPUT_DIRECTORY_DEBUG:PATH=DebugLibs
-      -DCMAKE_ARCHIVE_OUTPUT_DIRECTORY_RELEASE:PATH=ReleaseLibs
-      -DCMAKE_CXX_FLAGS=${MSVC_COMPILER_DEFS}
-      -Dgtest_force_shared_crt=${GTEST_FORCE_SHARED_CRT}
-      -Dgtest_disable_pthreads=${GTEST_DISABLE_PTHREADS}
-      -DBUILD_GTEST=ON
-      PREFIX "${CMAKE_CURRENT_BINARY_DIR}"
-      # Disable install step
-      INSTALL_COMMAND ""
-      UPDATE_DISCONNECTED 1 # 1: do not update googletest; 0: update googletest via github
-  )
+SET(INSTALL_GTEST OFF) # Disable installation of googletest
+FetchContent_MakeAvailable(googletest)
 
-  # Get GTest source and binary directories from CMake project
-
-  # Specify include dir
-  ExternalProject_Get_Property(googletest source_dir)
-  set(GTEST_INCLUDE_DIRS ${source_dir}/googletest/include PARENT_SCOPE)
-
-  # Specify MainTest's link libraries
-  ExternalProject_Get_Property(googletest binary_dir)
-  set(GTEST_LIBS_DIR ${binary_dir}/googlemock/gtest PARENT_SCOPE)
-
-  # Create a libgtest target to be used as a dependency by test programs
-  add_library(libgtest IMPORTED STATIC GLOBAL)
-  add_dependencies(libgtest googletest)
-
-  # Set libgtest properties
-  set_target_properties(libgtest PROPERTIES
-      "IMPORTED_LOCATION" "${binary_dir}/googlemock/gtest/libgtest.a"
-      "IMPORTED_LINK_INTERFACE_LIBRARIES" "${CMAKE_THREAD_LIBS_INIT}"
-  )
-
-else()
-
-  message("CMake version equal or greater than 3.11.0")
+function(wolf_add_gtest target)
+  add_executable(${target} ${ARGN})
+  target_link_libraries(${target} gtest_main ${PLUGIN_NAME})
+  add_test(NAME ${target} COMMAND ${target})
+endfunction()
+include(FetchContent)
 
-  include(FetchContent)
+FetchContent_Declare(
+  googletest
+  GIT_REPOSITORY https://github.com/google/googletest.git 
+  GIT_TAG main)
 
-  FetchContent_Declare(
-    googletest
-    GIT_REPOSITORY https://github.com/google/googletest.git 
-    GIT_TAG main)
+SET(INSTALL_GTEST OFF) # Disable installation of googletest
+FetchContent_MakeAvailable(googletest)
 
-  SET(INSTALL_GTEST OFF) # Disable installation of googletest
-  FetchContent_MakeAvailable(googletest)
-    
-endif()
-  
 function(wolf_add_gtest target)
   add_executable(${target} ${ARGN})
-  if(${CMAKE_VERSION} VERSION_LESS "3.11.0") 
-    add_dependencies(${target} libgtest)
-    target_link_libraries(${target} libgtest ${PLUGIN_NAME})
-    target_include_directories(${target} PUBLIC ${GTEST_INCLUDE_DIRS})
-  else()
-    target_link_libraries(${target} gtest_main ${PLUGIN_NAME})
-  endif()
+  target_link_libraries(${target} gtest_main ${PLUGIN_NAME})
   add_test(NAME ${target} COMMAND ${target})
 endfunction()
diff --git a/test/gtest_feature_imu.cpp b/test/gtest_feature_imu.cpp
index db97ac421990fc3b5848f1878eb057a5e57324aa..8b56e378d438a83efea77268209571fe4fbd3352 100644
--- a/test/gtest_feature_imu.cpp
+++ b/test/gtest_feature_imu.cpp
@@ -81,15 +81,13 @@ class FeatureImu_test : public testing::Test
         origin_frame = problem->setPriorFactor(x0, s0, t);
         processor_motion_ptr_->setOrigin(origin_frame);
 
-    // Emplace one capture to store the Imu data arriving from (sensor / callback / file / etc.)
+    // Create one capture to store the Imu data arriving from (sensor / callback / file / etc.)
     // give the capture a big covariance, otherwise it will be so small that it won't pass following assertions
-        imu_ptr = std::static_pointer_cast<CaptureImu>(
-                CaptureBase::emplace<CaptureImu>(origin_frame,
-                                                 t,
-                                                 sensor_ptr,
-                                                 data_,
-                                                 Eigen::Matrix6d::Identity(),
-                                                 Eigen::Vector6d::Zero().eval()) );
+    imu_ptr = std::make_shared<CaptureImu>( t,
+                                            sensor_ptr,
+                                            data_,
+                                            Eigen::Matrix6d::Identity(),
+                                            Eigen::Vector6d::Zero().eval());
 
     //process data
         data_ << 2, 0, 9.8, 0, 0, 0;
@@ -102,22 +100,21 @@ class FeatureImu_test : public testing::Test
     // process data in capture
         sensor_ptr->process(imu_ptr);
 
-    //emplace Frame
-        ts          = problem->getTimeStamp();
-        state_vec   = problem->getState().vector(problem->getFrameStructure());
-        last_frame  = problem->emplaceFrame(ts, state_vec);
 
     //emplace a feature
         delta_preint            = processor_motion_ptr_->getMotion().delta_integr_;
         delta_preint_cov        = processor_motion_ptr_->getMotion().delta_integr_cov_ + MatrixXd::Identity(9,9)*1e-08;
         VectorXd calib_preint   = processor_motion_ptr_->getLast()->getCalibrationPreint();
         dD_db_jacobians         = processor_motion_ptr_->getMotion().jacobian_calib_;
-        feat_imu                = FeatureBase::emplace<FeatureImu>(imu_ptr,
+        feat_imu                = FeatureBase::emplace<FeatureImu>(processor_motion_ptr_->getOrigin(),
                                                                    delta_preint,
                                                                    delta_preint_cov,
                                                                    calib_preint,
                                                                    dD_db_jacobians,
-                                                                   imu_ptr) ;
+                                                                   processor_motion_ptr_->getOrigin()) ;
+
+        problem->print(4,1,1,1);        
+
     }
 
     void TearDown() override
@@ -155,7 +152,7 @@ TEST_F(FeatureImu_test, check_frame)
     left_vptr = left_frame->getV();
 
     ASSERT_MATRIX_APPROX(origin_pptr->getState(), left_pptr->getState(), wolf::Constants::EPS_SMALL);
-    Eigen::Map<const Eigen::Quaterniond> origin_Quat(origin_optr->getState().data()), left_Quat(left_optr->getState().data());
+    Eigen::Quaterniond origin_Quat(origin_optr->getState().data()), left_Quat(left_optr->getState().data());
     ASSERT_QUATERNION_APPROX(origin_Quat, left_Quat, wolf::Constants::EPS_SMALL);
     ASSERT_MATRIX_APPROX(origin_vptr->getState(), left_vptr->getState(), wolf::Constants::EPS_SMALL);