diff --git a/GeoModelCore/GeoModelKernel/src/GeoXF.cxx b/GeoModelCore/GeoModelKernel/src/GeoXF.cxx
index 6341bcf20d85f6c453dab6f832b1fc642b0f4583..23cac3f8806844d230ec637264e52b1bfcb85f0b 100755
--- a/GeoModelCore/GeoModelKernel/src/GeoXF.cxx
+++ b/GeoModelCore/GeoModelKernel/src/GeoXF.cxx
@@ -231,25 +231,23 @@ __attribute__ ((flatten))
     //
     // Get the translation part and the rotation part:
     //
-    Eigen::Matrix3d linear = m_xf.linear ();
-    Eigen::EigenSolver<GeoTrf::RotationMatrix3D> solver(linear);
-    Eigen::MatrixXcd D = solver.eigenvalues().asDiagonal();
-    Eigen::MatrixXcd V = solver.eigenvectors();
-        
+    GeoTrf::RotationMatrix3D rotate = m_xf.rotation ();
     GeoTrf::Vector3D translate = m_xf.translation ();
+    Eigen::AngleAxis<double> aa(rotate);
+    //
+    // Evaluate the function
+    //
     double nTimes = (*m_function) (x);
     //
     // Modify:
     //
     translate *= nTimes;
-    Eigen::Matrix3cd DPowN=Eigen::Matrix3cd::Zero();
-    for (unsigned int i=0;i<3;i++) DPowN(i,i)=pow(D(i,i),nTimes);
+    double& delta = aa.angle();
+    delta *= nTimes;
     //
     // Now compose these and return a result:
     //
-    GeoTrf::Transform3D tRPowN = GeoTrf::Transform3D::Identity();
-    tRPowN.linear()=(V*DPowN*V.inverse()).real();
-    return GeoTrf::Translation3D (translate) * tRPowN;
+    return GeoTrf::Translation3D (translate) * GeoTrf::Transform3D(aa);
   }
 
   GeoTrf::Transform3D Pow::operator        () (const GeoGenfun::Argument & argument) const