diff --git a/src/constraint_imu.h b/src/constraint_imu.h
index ae08626c3c6e59c77745bd0bae22d479bae94a1b..7465c1dc323364d89bc474a8a42ab6a1f1d25a39 100644
--- a/src/constraint_imu.h
+++ b/src/constraint_imu.h
@@ -7,6 +7,8 @@
 #include "frame_imu.h"
 #include "rotations.h"
 
+//Eigen include
+
 
 namespace wolf {
     
@@ -45,9 +47,9 @@ class ConstraintIMU : public ConstraintSparse<9, 3, 4, 3, 3, 3, 3, 4, 3>
          * Vector3s _v2 : velocity in current frame
          * Matrix<10,1, wolf::Scalar> _expectation : to retrieve resulting expectation (PVQ)
         */
-        template<typename D1>
-        void expectation(const Eigen::MatrixBase<D1> & _p1, const Eigen::QuaternionBase<D1> & _q1, const Eigen::MatrixBase<D1> & _v1, const Eigen::MatrixBase<D1> & _ab, const Eigen::MatrixBase<D1> & _wb,
-                        const Eigen::MatrixBase<D1> & _p2, const Eigen::MatrixBase<D1> & _q2, const Eigen::MatrixBase<D1> & _v2, const Eigen::Matrix<D1,10,1> & _result) const;
+        template<typename D1, typename D2, typename D3>
+        void expectation(const Eigen::MatrixBase<D1> & _p1, const Eigen::QuaternionBase<D2> & _q1, const Eigen::MatrixBase<D1> & _v1, const Eigen::MatrixBase<D1> & _ab, const Eigen::MatrixBase<D1> & _wb,
+                        const Eigen::MatrixBase<D1> & _p2, const Eigen::QuaternionBase<D2> & _q2, const Eigen::MatrixBase<D1> & _v2, const Eigen::MatrixBase<D3> & _result) const;
 
         /* \brief : return the expected value given the state blocks in the wolf tree
             current frame data is taken from constraintIMU object.
@@ -65,11 +67,13 @@ class ConstraintIMU : public ConstraintSparse<9, 3, 4, 3, 3, 3, 3, 4, 3>
             const Eigen::Vector3s frame_current_vel  = dv_preint_;
             const Eigen::Vector3s frame_current_ab  = acc_bias_preint_;
             const Eigen::Vector3s frame_current_wb  = gyro_bias_preint_;
-            const Eigen::VectorXs frame_imu_pos   = (frm_imu->getPPtr()->getVector());
-            const Eigen::VectorXs frame_imu_ori   = (frm_imu->getOPtr()->getVector());
-            const Eigen::VectorXs frame_imu_vel  = (frm_imu->getVPtr()->getVector());
+            const Eigen::Vector3s frame_imu_pos   = (frm_imu->getPPtr()->getVector());
+            const Eigen::Vector4s frame_imu_ori   = (frm_imu->getOPtr()->getVector());
+            const Eigen::Vector3s frame_imu_vel  = (frm_imu->getVPtr()->getVector());
+
+            Eigen::Quaternions frame_imu_ori_q(frame_imu_ori);
             
-            expectation(frame_current_pos, frame_current_ori, frame_current_vel, frame_current_ab, frame_current_wb, frame_imu_pos, frame_imu_ori, frame_imu_vel, exp);
+            expectation(frame_current_pos, frame_current_ori, frame_current_vel, frame_current_ab, frame_current_wb, frame_imu_pos, frame_imu_ori_q, frame_imu_vel, exp);
             std::cout << frame_current_pos << std::endl;
             std::cout << frame_current_ori.w() << std::endl;
             std::cout << frame_current_vel << std::endl;
@@ -182,32 +186,29 @@ inline bool ConstraintIMU::operator ()(const T* const _p1, const T* const _q1, c
     return true;
 }
 
-template<typename D1>
-inline void ConstraintIMU::expectation(const Eigen::MatrixBase<D1> & _p1, const Eigen::QuaternionBase<D1> & _q1, const Eigen::MatrixBase<D1> & _v1, const Eigen::MatrixBase<D1> & _ab, const Eigen::MatrixBase<D1> & _wb,
-                        const Eigen::MatrixBase<D1> & _p2, const Eigen::MatrixBase<D1> & _q2, const Eigen::MatrixBase<D1> & _v2, const Eigen::Matrix<D1,10,1> & _result) const
+template<typename D1, typename D2, typename D3>
+inline void ConstraintIMU::expectation(const Eigen::MatrixBase<D1> & _p1, const Eigen::QuaternionBase<D2> & _q1, const Eigen::MatrixBase<D1> & _v1, const Eigen::MatrixBase<D1> & _ab, const Eigen::MatrixBase<D1> & _wb,
+                        const Eigen::MatrixBase<D1> & _p2, const Eigen::QuaternionBase<D2> & _q2, const Eigen::MatrixBase<D1> & _v2, const Eigen::MatrixBase<D3> & _result) const
 {
-    // MAPS
-
-    Eigen::Map<const Eigen::Matrix<D1,3,1> > p1(_p1);
-    Eigen::Map<const Eigen::Quaternion<D1> > q1(_q1);
-    Eigen::Map<const Eigen::Matrix<D1,3,1> > v1(_v1);
-    Eigen::Map<const Eigen::Matrix<D1,3,1> > ab(_ab);
-    Eigen::Map<const Eigen::Matrix<D1,3,1> > wb(_wb);
-
-    Eigen::Map<const Eigen::Matrix<D1,3,1> > p2(_p2);
-    Eigen::Map<const Eigen::Quaternion<D1> > q2(_q2);
-    Eigen::Map<const Eigen::Matrix<D1,3,1> > v2(_v2);
-    
-    //Eigen::Map<Eigen::Matrix<D1,10,1> > result(_result);
+    //needed typedefs
+    typedef typename D2::Vector3 Vector3Map;
+    typedef typename D2::Scalar DataType;
+    typedef Eigen::Map <Eigen::Matrix<DataType,4,1> > ConstVector4Map;
+
+    //instead of maps we use static_asserts from eigen to detect size at compile time
+    //check entry sizes
+    EIGEN_STATIC_ASSERT_VECTOR_SPECIFIC_SIZE(D1, 3)
+    EIGEN_STATIC_ASSERT_VECTOR_SPECIFIC_SIZE(D3, 10)
     
     // Predict delta: d_pred = x2 (-) x1
-    Eigen::Matrix<D1,3,1> dp_predict = q1.conjugate() * ( p2 - p1 - v1 * (D1)dt_ - (D1)0.5 * g_.cast<D1>() * (D1)dt_2_ );
-    Eigen::Matrix<D1,3,1> dv_predict = q1.conjugate() * ( v2 - v1 - g_.cast<D1>() * (D1)dt_ );
-    Eigen::Quaternion<D1> dq_predict = q1.conjugate() * q2;
-
-    const_cast< Eigen::MatrixBase<D1> > (_result).head(3) = dp_predict;
-    const_cast< Eigen::MatrixBase<D1> > (_result).segment(3,4) = dq_predict;
-    const_cast< Eigen::MatrixBase<D1> > (_result).tail(3) = dv_predict;
+    Vector3Map dp_predict = (_q1.conjugate() * ( _p2 - _p1 - _v1 * (DataType)dt_ - (DataType)0.5 * g_.cast<DataType>() * (DataType)dt_2_ ));
+    Vector3Map dv_predict (_q1.conjugate() * ( _v2 - _v1 - g_.cast<DataType>() * (DataType)dt_ ));
+    Eigen::Quaternion<DataType> dq_predict (_q1.conjugate() * _q2);
+    ConstVector4Map dq_vec4(dq_predict.coeffs().data());
+
+    const_cast< Eigen::MatrixBase<D3>& > (_result).head(3) = dp_predict;
+    const_cast< Eigen::MatrixBase<D3>& > (_result).segment(3,4) = dq_vec4;
+    const_cast< Eigen::MatrixBase<D3>& > (_result).tail(3) = dv_predict;
 }
 
 inline JacobianMethod ConstraintIMU::getJacobianMethod() const