diff --git a/src/common_obj.h b/src/common_obj.h
index 65843b3098e886d0db899a349f432a7c48209d83..722021ac5c4fa2c267b659d65f339d8b476659b7 100644
--- a/src/common_obj.h
+++ b/src/common_obj.h
@@ -86,6 +86,7 @@ class CHT{
     Eigen::Matrix4d cam_in_baselink;     // Camera in base_link frames.
     Eigen::Matrix4d tip_in_baselink;     // Arm forward kinematics (from base_link to arm link frame).
     Eigen::Matrix4d armbase_in_baselink; // Camera in base_link frames.
+    Eigen::Matrix4d link1_in_armbase;    // Arm link 1 in arm base frame.
     Eigen::Matrix4d baselink_in_w;       // base_link in World frames.
     Eigen::Matrix4d cam_in_w;            // Camera in World frames.
 
diff --git a/src/tasks/cog.cpp b/src/tasks/cog.cpp
index 74b9dd8e7836052bba39b64f9bd1995f3f0079f7..9283a370d15d6d95f8e9a319d2c279d6321bee9d 100644
--- a/src/tasks/cog.cpp
+++ b/src/tasks/cog.cpp
@@ -119,9 +119,7 @@ void CTaskCOG::CoGCommon(UAM::CArm& arm, const UAM::CHT& HT, Eigen::MatrixXd& co
   // std::cout << "cog: " << arm_cog_data.arm_cog << std::endl;
 
   // Rotation between quadrotor body and inertial frames  
-  // TODO: If attitude is estimated, then it could be roll and pitch
-  // Rib = AngleAxisd(0, Vector3d::UnitZ()) * AngleAxisd(this->ctrl_params_.q_rollpitch(1,0), Vector3d::UnitY()) * AngleAxisd(this->ctrl_params_.q_rollpitch(0,0), Vector3d::UnitX());
-  Rib = Eigen::MatrixXd::Identity(3,3);
+  Rib = HT.baselink_in_w.block(0,0,3,3)*HT.armbase_in_baselink.block(0,0,3,3);
 
   // X and Y values of CoG in quadrotor inertial frame
   cog_arm = arm_cog_data.arm_cog.block(0,0,3,1);
@@ -143,15 +141,7 @@ void CTaskCOG::CoGCommon(UAM::CArm& arm, const UAM::CHT& HT, Eigen::MatrixXd& co
 
     if(partial_mass!=0){
       CoG_partial = partial_arm_cg/partial_mass;
-
-      Eigen::Matrix3d screw_rot = Eigen::Matrix3d::Zero();
-      screw_rot(0,1) = -IIIrdcolRot_b_x.at(jj)(2);
-      screw_rot(0,2) = IIIrdcolRot_b_x.at(jj)(1);
-      screw_rot(1,0) = IIIrdcolRot_b_x.at(jj)(2);
-      screw_rot(0,2) = -IIIrdcolRot_b_x.at(jj)(0);
-      screw_rot(2,0) = -IIIrdcolRot_b_x.at(jj)(1);
-      screw_rot(2,1) = IIIrdcolRot_b_x.at(jj)(0);
-
+      Eigen::Matrix3d screw_rot = CCommon_Fc::Skew(IIIrdcolRot_b_x.at(jj));
       Jj_cog.col(jj) = (partial_mass/arm.mass)*screw_rot*CoG_partial.block(0,0,3,1);
     }
     else Jj_cog.col(jj) = Eigen::MatrixXd::Zero(3,1);
@@ -161,19 +151,26 @@ void CTaskCOG::CoGCommon(UAM::CArm& arm, const UAM::CHT& HT, Eigen::MatrixXd& co
 void CTaskCOG::TaskErrorJacFull(UAM::CArm& arm, const UAM::CHT& HT, Eigen::MatrixXd& cog_PGxy, Eigen::MatrixXd& cog_arm, Eigen::MatrixXd& sigmaG, Eigen::MatrixXd& JG, Eigen::MatrixXd& JG_pseudo, UAM::ArmCogData& arm_cog_data)
 {
   Eigen::Matrix3d Rib;
-  Eigen::MatrixXd Jj_cog(3,arm.nj);  
+  Eigen::MatrixXd Jj_cog(3,arm.nj);
   CoGCommon(arm, HT, cog_PGxy, cog_arm, Rib, Jj_cog, arm_cog_data);
+  // Task Error
+  sigmaG = -cog_PGxy.array();
 
+  // Task Jacobian
+  JG = Eigen::MatrixXd::Zero(2,4+arm.nj);
+  Eigen::Matrix3d Rb_in_w = HT.baselink_in_w.block(0,0,3,3);
+  Eigen::Matrix3d Rarmb_in_b = HT.armbase_in_baselink.block(0,0,3,3);
+  Eigen::Matrix3d Rl1_in_armb = HT.link1_in_armbase.block(0,0,3,3); 
+  Eigen::Matrix3d skew_rot = UAM::CCommon_Fc::Skew(Rb_in_w*Rl1_in_armb*arm_cog_data.arm_cog.block(0,0,3,1));
+  JG.block(0,3,2,1) = skew_rot.block(0,2,2,1);
   Eigen::MatrixXd Jacob_temp(3,arm.nj);
   for (unsigned int ii = 0; ii < arm.nj; ++ii)
-    Jacob_temp.col(ii) = Rib * Jj_cog.col(ii);
+    Jacob_temp.col(ii) = Rb_in_w * Rarmb_in_b * Rl1_in_armb * Jj_cog.col(ii);
+
+  JG.block(0,4,2,arm.nj)=Jacob_temp.block(0,0,2,arm.nj);
 
-  JG = Eigen::MatrixXd::Zero(2,4+arm.nj);
-  JG.block(0,4,2,arm.nj) = Jacob_temp.block(0,0,2,arm.nj);
   //JG_pseudo = UAM::CCommon_Fc::CalcPinv(JG);
   JG_pseudo = JG.transpose();
-
-  sigmaG = -cog_PGxy;
 }
 
 void CTaskCOG::TaskErrorJac(UAM::CArm& arm, const UAM::CHT& HT, Eigen::MatrixXd& cog_PGxy, Eigen::MatrixXd& cog_arm, Eigen::MatrixXd& sigmaG, Eigen::MatrixXd& JG, Eigen::MatrixXd& JG_pseudo, UAM::ArmCogData& arm_cog_data)
@@ -181,19 +178,22 @@ void CTaskCOG::TaskErrorJac(UAM::CArm& arm, const UAM::CHT& HT, Eigen::MatrixXd&
   Eigen::Matrix3d Rib;
   Eigen::MatrixXd Jj_cog(3,arm.nj);
   CoGCommon(arm, HT, cog_PGxy, cog_arm, Rib, Jj_cog, arm_cog_data);
+  // Task Error
+  sigmaG = -(cog_PGxy.transpose()*cog_PGxy);
 
+  // Task Jacobian
   JG = Eigen::MatrixXd::Zero(1,4+arm.nj);
-  JG.block(0,0,1,4) = Eigen::MatrixXd::Zero(1,4);
+  Eigen::Matrix3d Rb_in_w = HT.baselink_in_w.block(0,0,3,3);
+  Eigen::Matrix3d Rarmb_in_b = HT.armbase_in_baselink.block(0,0,3,3);
+  Eigen::Matrix3d Rl1_in_armb = HT.link1_in_armbase.block(0,0,3,3); 
   Eigen::MatrixXd Jacob_temp(3,arm.nj);
   for (unsigned int ii = 0; ii < arm.nj; ++ii)
-    Jacob_temp.col(ii) = Rib * Jj_cog.col(ii);
+    Jacob_temp.col(ii) = Rb_in_w * Rarmb_in_b * Rl1_in_armb * Jj_cog.col(ii);
 
   JG.block(0,4,1,arm.nj)=2*cog_PGxy.transpose()*Jacob_temp.block(0,0,2,arm.nj);
-
+  
   //JG_pseudo = UAM::CCommon_Fc::CalcPinv(JG);
-  JG_pseudo = JG.transpose();
-
-  sigmaG = -(cog_PGxy.transpose()*cog_PGxy);
+  JG_pseudo = JG.transpose();  
 }
 
 } // End of UAM namespace
\ No newline at end of file
diff --git a/src/tasks/cog.h b/src/tasks/cog.h
index de41becce7f22971564087695fa8b3f4acb71ea7..d3c5afe1601b74dece50fd5c0af70bdf0389315f 100644
--- a/src/tasks/cog.h
+++ b/src/tasks/cog.h
@@ -6,6 +6,7 @@
 
 // Own
 #include <common_obj.h>
+#include <common_fc.h>
 
 namespace UAM {
 
@@ -55,7 +56,6 @@ class CTaskCOG
     *
     */  
     static void TaskErrorJacFull(UAM::CArm& arm, const UAM::CHT& HT, Eigen::MatrixXd& cog_PGxy, Eigen::MatrixXd& cog_arm, Eigen::MatrixXd& sigmaG, Eigen::MatrixXd& JG, Eigen::MatrixXd& JG_pseudo, UAM::ArmCogData& arm_cog_data);
-
 };
 
 } // End of UAM namespace
diff --git a/src/tasks/eepos.cpp b/src/tasks/eepos.cpp
index 9433c9e78087845f3073b7b2a74001ad643f3d79..29c9d90f609ae0670857a381c3780b97e2654d29 100644
--- a/src/tasks/eepos.cpp
+++ b/src/tasks/eepos.cpp
@@ -149,9 +149,10 @@ void CTaskEEPOS::TaskErrorJac(const UAM::CHT& HT, UAM::CArm& arm, const Eigen::M
   Eigen::MatrixXd ArmJac = UAM::CKinematics::ArmJac(arm);
 
   Eigen::MatrixXd RRb_in_w = Eigen::MatrixXd::Zero(6,6);
-  Eigen::Matrix3d Rarmb_in_b = Eigen::Vector3d(-1, 1,-1).asDiagonal();
-  RRb_in_w.block(0,0,3,3) = Rb_in_w*Rarmb_in_b;
-  RRb_in_w.block(3,3,3,3) = Rb_in_w*Rarmb_in_b;
+  Eigen::Matrix3d Rarmb_in_b = HT.armbase_in_baselink.block(0,0,3,3);
+  Eigen::Matrix3d Rl1_in_armb = HT.link1_in_armbase.block(0,0,3,3);
+  RRb_in_w.block(0,0,3,3) = Rb_in_w * Rarmb_in_b * Rl1_in_armb;
+  RRb_in_w.block(3,3,3,3) = RRb_in_w.block(0,0,3,3);
   JEEPOS_omw.block(0,6,6,arm.nj) = RRb_in_w * ArmJac;
 
   Eigen::MatrixXd omega2euldiff_in_w = Eigen::MatrixXd::Zero(6,6);