diff --git a/src/test/gtest_processorIMU_jacobians.cpp b/src/test/gtest_processorIMU_jacobians.cpp
index 834d93b86cbdfe508f2e0b798d3abf0ed962af0c..21f46597a778b2faeda72c3aa12dd53e268bcadb 100644
--- a/src/test/gtest_processorIMU_jacobians.cpp
+++ b/src/test/gtest_processorIMU_jacobians.cpp
@@ -98,6 +98,80 @@ class ProcessorIMU_jacobians : public testing::Test
         deltas_jac = deltas_jac_c;
     }
 
+    virtual void TearDown()
+    {
+        // code here will be called just after the test completes
+        // ok to through exceptions from here if need be
+        /*
+            You can do deallocation of resources in TearDown or the destructor routine. 
+                However, if you want exception handling you must do it only in the TearDown code because throwing an exception 
+                from the destructor results in undefined behavior.
+            The Google assertion macros may throw exceptions in platforms where they are enabled in future releases. 
+                Therefore, it's a good idea to use assertion macros in the TearDown code for better maintenance.
+        */
+    }
+};
+
+
+class ProcessorIMU_jacobians_Dq : public testing::Test
+{
+    public:
+        TimeStamp t;
+        Eigen::Vector6s data_;
+        Eigen::Matrix<wolf::Scalar,10,1> Delta0;
+        wolf::Scalar ddelta_bias2;
+        wolf::Scalar dt;
+        struct IMU_jac_bias bias_jac2;
+
+        void remapJacDeltas_quat0(IMU_jac_deltas& _jac_delta, Eigen::Map<Eigen::Quaternions>& _Dq0, Eigen::Map<Eigen::Quaternions>& _dq0){
+
+            new (&_Dq0) Eigen::Map<const Eigen::Quaternions>(_jac_delta.Delta0_.data() + 3);
+            new (&_dq0) Eigen::Map<const Eigen::Quaternions>(_jac_delta.delta0_.data() + 3);
+        }
+
+        void remapJacDeltas_quat(IMU_jac_deltas& _jac_delta, Eigen::Map<Eigen::Quaternions>& _Dq, Eigen::Map<Eigen::Quaternions>& _dq, const int& place ){
+    
+            assert(place < _jac_delta.Delta_noisy_vect_.size());
+            new (&_Dq) Eigen::Map<const Eigen::Quaternions>(_jac_delta.Delta_noisy_vect_(place).data() + 3);
+            new (&_dq) Eigen::Map<const Eigen::Quaternions>(_jac_delta.delta_noisy_vect_(place).data() + 3);
+        }
+
+    virtual void SetUp()
+    {
+        //SetUp for jacobians 
+        wolf::Scalar deg_to_rad = M_PI/180.0;
+        data_ << 10,0.5,3, 100*deg_to_rad,110*deg_to_rad,30*deg_to_rad;
+
+        // Wolf problem
+        ProblemPtr wolf_problem_ptr_ = Problem::create(FRM_PQVBB_3D);
+        Eigen::VectorXs IMU_extrinsics(7);
+        IMU_extrinsics << 0,0,0, 0,0,0,1; // IMU pose in the robot
+
+        ProcessorIMU_UnitTester processor_imu;
+        ddelta_bias2 = 0.0001;
+        dt = 0.001;
+
+        //defining a random Delta to begin with (not to use Origin point)
+        Eigen::Matrix<wolf::Scalar,10,1> Delta0;
+        Delta0 = Eigen::Matrix<wolf::Scalar,10,1>::Random();
+        Delta0.head<3>() = Delta0.head<3>()*100;
+        Delta0.tail<3>() = Delta0.tail<3>()*10;
+        Eigen::Vector3s ang0, ang;
+        ang0 << 120.08*deg_to_rad, 12.36*deg_to_rad, 54.32*deg_to_rad; 
+
+        Eigen::Map<Eigen::Quaternions> Delta0_quat(Delta0.data()+3);
+        Delta0_quat = v2q(ang0);
+        Delta0_quat.normalize();
+        ang = q2v(Delta0_quat);
+
+        //std::cout << "\ninput Delta0 : " << Delta0 << std::endl;
+        //std::cout << "\n rotation vector we start with :\n" << ang << std::endl;
+
+        //get data to compute jacobians
+        struct IMU_jac_bias bias_jac_c = processor_imu.finite_diff_ab(dt, data_, ddelta_bias2, Delta0);
+        bias_jac2.copyfrom(bias_jac_c);
+    }
+
     virtual void TearDown()
     {
         // code here will be called just after the test completes
@@ -207,7 +281,7 @@ TEST_F(ProcessorIMU_jacobians, dDq_dab)
     EXPECT_TRUE(dDq_dab.isZero(wolf::Constants::EPS)) << "\t\tdDq_dab_ jacobian is not Zero :" << dDq_dab << std::endl;
 }
 
-TEST_F(ProcessorIMU_jacobians, dDq_dwb)
+TEST_F(ProcessorIMU_jacobians, dDq_dwb_noise_1Em8_)
 {
     using namespace wolf;
     Eigen::Map<Eigen::Quaternions> q_in_1(NULL), q_in_2(NULL);
@@ -219,8 +293,24 @@ TEST_F(ProcessorIMU_jacobians, dDq_dwb)
         dDq_dwb.block<3,1>(0,i) = R2v( q_in_1.matrix().transpose() * q_in_2.matrix())/ddelta_bias;
     }
 
-    EXPECT_TRUE((dDq_dwb - bias_jac.dDq_dwb_).isMuchSmallerThan(1,0.000001)) << "dDq_dwb : \n" << dDq_dwb << "\n bias_jac.dDq_dwb_ :\n" << bias_jac.dDq_dwb_ <<
-     "\ndDq_dwb_a - dDq_dwb_ : \n" << bias_jac.dDq_dwb_ - dDq_dwb << std::endl;
+    EXPECT_FALSE((dDq_dwb - bias_jac.dDq_dwb_).isMuchSmallerThan(1,0.000001)) << "dDq_dwb : \n" << dDq_dwb << "\n bias_jac.dDq_dwb_ :\n" << bias_jac.dDq_dwb_ <<
+     "\ndDq_dwb_a - dDq_dwb_ : \n" << bias_jac.dDq_dwb_ - dDq_dwb << "\n R1^T * R2 : \n"  << q_in_1.matrix().transpose() * q_in_2.matrix() << std::endl;
+}
+
+TEST_F(ProcessorIMU_jacobians_Dq, dDq_dwb_noise_1Em4_precision_1Em3_)
+{
+    using namespace wolf;
+    Eigen::Map<Eigen::Quaternions> q_in_1(NULL), q_in_2(NULL);
+    Eigen::Matrix3s dDq_dwb;
+
+    new (&q_in_1) Eigen::Map<Eigen::Quaternions>(bias_jac2.Delta0_.data() + 3);
+    for(int i=0;i<3;i++){
+        new (&q_in_2) Eigen::Map<Eigen::Quaternions>(bias_jac2.Deltas_noisy_vect_(i+3).data() + 3);
+        dDq_dwb.block<3,1>(0,i) = R2v( q_in_1.matrix().transpose() * q_in_2.matrix())/ddelta_bias2;
+    }
+
+    EXPECT_TRUE((dDq_dwb - bias_jac2.dDq_dwb_).isMuchSmallerThan(1,0.001)) << "dDq_dwb : \n" << dDq_dwb << "\n bias_jac2.dDq_dwb_ :\n" << bias_jac2.dDq_dwb_ <<
+     "\ndDq_dwb_a - dDq_dwb_ : \n" << bias_jac2.dDq_dwb_ - dDq_dwb << "\n R1^T * R2 : \n"  << q_in_1.matrix().transpose() * q_in_2.matrix() << std::endl;
 }
 
                                 ///Perturbation TESTS