diff --git a/eeschema/sch_line.cpp b/eeschema/sch_line.cpp
index 947d85ce77..10a2c3d43d 100644
--- a/eeschema/sch_line.cpp
+++ b/eeschema/sch_line.cpp
@@ -446,7 +446,7 @@ int SCH_LINE::GetAngleFrom( const VECTOR2I& aPoint ) const
     else
         vec = m_start - aPoint;
 
-    return KiROUND( ArcTangente( vec.y, vec.x ) );
+    return KiROUND( EDA_ANGLE( vec ).AsDegrees() );
 }
 
 
@@ -459,7 +459,7 @@ int SCH_LINE::GetReverseAngleFrom( const VECTOR2I& aPoint ) const
     else
         vec = m_end - aPoint;
 
-    return KiROUND( ArcTangente( vec.y, vec.x ) );
+    return KiROUND( EDA_ANGLE( vec ).AsDegrees() );
 }
 
 
diff --git a/libs/kimath/include/trigo.h b/libs/kimath/include/trigo.h
index 9a49d54b3d..758b13f53a 100644
--- a/libs/kimath/include/trigo.h
+++ b/libs/kimath/include/trigo.h
@@ -59,73 +59,44 @@ bool SegmentIntersectsSegment( const VECTOR2I& a_p1_l1, const VECTOR2I& a_p2_l1,
                                VECTOR2I* aIntersectionPoint = nullptr );
 
 /*
- * Calculate the new point of coord coord pX, pY,
- * for a rotation center 0, 0, and angle in (1/10 degree)
+ * Calculate the new point of coord coord pX, pY, for a rotation center 0, 0
  */
-void RotatePoint( int *pX, int *pY, double angle );
+void RotatePoint( int *pX, int *pY, const EDA_ANGLE& aAngle );
 
-inline void RotatePoint( int *pX, int *pY, const EDA_ANGLE& angle )
+inline void RotatePoint( VECTOR2I& point, const EDA_ANGLE& aAngle )
 {
-    RotatePoint( pX, pY, angle.AsTenthsOfADegree() );
+    RotatePoint( &point.x, &point.y, aAngle );
 }
 
+
 /*
- * Calculate the new point of coord coord pX, pY,
- * for a rotation center cx, cy, and angle in (1/10 degree)
+ * Calculate the new point of coord coord pX, pY, for a rotation center cx, cy
  */
-void RotatePoint( int *pX, int *pY, int cx, int cy, double angle );
+void RotatePoint( int *pX, int *pY, int cx, int cy, const EDA_ANGLE& aAngle );
 
-inline void RotatePoint( int *pX, int *pY, int cx, int cy, const EDA_ANGLE& angle )
+inline void RotatePoint( VECTOR2I& point, const VECTOR2I& centre, const EDA_ANGLE& aAngle )
 {
-    RotatePoint( pX, pY, cx, cy, angle.AsTenthsOfADegree() );
+    RotatePoint( &point.x, &point.y, centre.x, centre.y, aAngle );
 }
 
+
 /*
- * Calculate the new coord point point for a rotation angle in (1/10 degree).
- */
-inline void RotatePoint( VECTOR2I& point, double angle )
-{
-    RotatePoint( &point.x, &point.y, angle );
-}
-
-inline void RotatePoint( VECTOR2I& point, const EDA_ANGLE& angle )
-{
-    RotatePoint( &point.x, &point.y, angle.AsTenthsOfADegree() );
-}
-
-void RotatePoint( VECTOR2I& point, const VECTOR2I& centre, double angle );
-
-inline void RotatePoint( VECTOR2I& point, const VECTOR2I& centre, const EDA_ANGLE& angle )
-{
-    RotatePoint( point, centre, angle.AsTenthsOfADegree() );
-}
-
-/*
- * Calculate the new coord point point for a center rotation center and angle in (1/10 degree).
+ * Calculate the new coord point point for a rotation center 0, 0
  */
 
-void RotatePoint( double* pX, double* pY, double angle );
+void RotatePoint( double* pX, double* pY, const EDA_ANGLE& aAngle );
 
-inline void RotatePoint( double* pX, double* pY, const EDA_ANGLE& angle )
+inline void RotatePoint( VECTOR2D& point, const EDA_ANGLE& aAngle )
 {
-    RotatePoint( pX, pY, angle.AsTenthsOfADegree() );
+    RotatePoint( &point.x, &point.y, aAngle );
 }
 
-inline void RotatePoint( VECTOR2D& point, const EDA_ANGLE& angle )
-{
-    RotatePoint( &point.x, &point.y, angle.AsTenthsOfADegree() );
-}
 
-void RotatePoint( double* pX, double* pY, double cx, double cy, double angle );
+void RotatePoint( double* pX, double* pY, double cx, double cy, const EDA_ANGLE& aAngle );
 
-inline void RotatePoint( double* pX, double* pY, double cx, double cy, const EDA_ANGLE& angle )
+inline void RotatePoint( VECTOR2D& point, const VECTOR2D& aCenter, const EDA_ANGLE& aAngle )
 {
-    RotatePoint( pX, pY, cx, cy, angle.AsTenthsOfADegree() );
-}
-
-inline void RotatePoint( VECTOR2D& point, const VECTOR2D& aCenter, const EDA_ANGLE& angle )
-{
-    RotatePoint( &point.x, &point.y, aCenter.x, aCenter.y, angle.AsTenthsOfADegree() );
+    RotatePoint( &point.x, &point.y, aCenter.x, aCenter.y, aAngle );
 }
 
 /**
@@ -155,16 +126,6 @@ const VECTOR2I CalcArcCenter( const VECTOR2I& aStart, const VECTOR2I& aEnd,
 const VECTOR2I CalcArcMid( const VECTOR2I& aStart, const VECTOR2I& aEnd, const VECTOR2I& aCenter,
                            bool aMinArcAngle = true );
 
-/* Return the arc tangent of 0.1 degrees coord vector dx, dy
- * between -1800 and 1800
- * Equivalent to atan2 (but faster for calculations if
- * the angle is 0 to -1800, or + - 900)
- * Lorenzo: In fact usually atan2 already has to do these optimizations
- * (due to the discontinuity in tan) but this function also returns
- * in decidegrees instead of radians, so it's handier
- */
-double ArcTangente( int dy, int dx );
-
 inline double EuclideanNorm( const VECTOR2I& vector )
 {
     // this is working with doubles
@@ -179,10 +140,9 @@ inline double EuclideanNorm( const VECTOR2I& vector )
 inline double DistanceLinePoint( const VECTOR2I& linePointA, const VECTOR2I& linePointB,
                                  const VECTOR2I& referencePoint )
 {
-    // Some of the multiple double casts are redundant. However in the previous
-    // definition the cast was (implicitly) done too late, just before
-    // the division (EuclideanNorm gives a double so from int it would
-    // be promoted); that means that the whole expression were
+    // Some of the multiple double casts are redundant. However in the previous definition
+    // the cast was (implicitly) done too late, just before the division (EuclideanNorm gives
+    // a double so from int it would be promoted); that means that the whole expression were
     // vulnerable to overflow during int multiplications
     return fabs( ( static_cast<double>( linePointB.x - linePointA.x ) *
                    static_cast<double>( linePointA.y - referencePoint.y ) -
@@ -200,8 +160,8 @@ inline bool HitTestPoints( const VECTOR2I& pointA, const VECTOR2I& pointB, doubl
 {
     VECTOR2I vectorAB = pointB - pointA;
 
-    // Compare the distances squared. The double is needed to avoid
-    // overflow during int multiplication
+    // Compare the distances squared. The double is needed to avoid overflow during int
+    // multiplication
     double sqdistance = (double)vectorAB.x * vectorAB.x + (double)vectorAB.y * vectorAB.y;
 
     return sqdistance < threshold * threshold;
diff --git a/libs/kimath/src/trigo.cpp b/libs/kimath/src/trigo.cpp
index dd4a8a0c38..40cfc3d8df 100644
--- a/libs/kimath/src/trigo.cpp
+++ b/libs/kimath/src/trigo.cpp
@@ -180,93 +180,45 @@ const VECTOR2I CalcArcMid( const VECTOR2I& aStart, const VECTOR2I& aEnd, const V
 }
 
 
-double ArcTangente( int dy, int dx )
+void RotatePoint( int* pX, int* pY, const EDA_ANGLE& aAngle )
 {
+    VECTOR2I  pt;
+    EDA_ANGLE angle = aAngle;
 
-    /* gcc is surprisingly smart in optimizing these conditions in
-       a tree! */
-
-    if( dx == 0 && dy == 0 )
-        return 0;
-
-    if( dy == 0 )
-    {
-        if( dx >= 0 )
-            return 0;
-        else
-            return -1800;
-    }
-
-    if( dx == 0 )
-    {
-        if( dy >= 0 )
-            return 900;
-        else
-            return -900;
-    }
-
-    if( dx == dy )
-    {
-        if( dx >= 0 )
-            return 450;
-        else
-            return -1800 + 450;
-    }
-
-    if( dx == -dy )
-    {
-        if( dx >= 0 )
-            return -450;
-        else
-            return 1800 - 450;
-    }
-
-    // Of course dy and dx are treated as double
-    return RAD2DECIDEG( std::atan2( (double) dy, (double) dx ) );
-}
-
-
-void RotatePoint( int* pX, int* pY, double angle )
-{
-    int tmp;
-
-    NORMALIZE_ANGLE_POS( angle );
+    angle.Normalize();
 
     // Cheap and dirty optimizations for 0, 90, 180, and 270 degrees.
-    if( angle == 0 )
-        return;
-
-    if( angle == 900 )          /* sin = 1, cos = 0 */
+    if( angle == ANGLE_0 )
     {
-        tmp = *pX;
-        *pX = *pY;
-        *pY = -tmp;
+        pt = VECTOR2I( *pX, *pY );
     }
-    else if( angle == 1800 )    /* sin = 0, cos = -1 */
+    else if( angle == ANGLE_90 )          /* sin = 1, cos = 0 */
     {
-        *pX = -*pX;
-        *pY = -*pY;
+        pt = VECTOR2I( *pY, -*pX );
     }
-    else if( angle == 2700 )    /* sin = -1, cos = 0 */
+    else if( angle == ANGLE_180 )    /* sin = 0, cos = -1 */
     {
-        tmp = *pX;
-        *pX = -*pY;
-        *pY = tmp;
+        pt = VECTOR2I( -*pX, -*pY );
+    }
+    else if( angle == ANGLE_270 )    /* sin = -1, cos = 0 */
+    {
+        pt = VECTOR2I( -*pY, *pX );
     }
     else
     {
-        double fangle = DECIDEG2RAD( angle );
-        double sinus = sin( fangle );
-        double cosinus = cos( fangle );
-        double fpx = (*pY * sinus ) + (*pX * cosinus );
-        double fpy = (*pY * cosinus ) - (*pX * sinus );
-        *pX = KiROUND( fpx );
-        *pY = KiROUND( fpy );
+        double sinus = angle.Sin();
+        double cosinus = angle.Cos();
+
+        pt.x = KiROUND( ( *pY * sinus ) + ( *pX * cosinus ) );
+        pt.y = KiROUND( ( *pY * cosinus ) - ( *pX * sinus ) );
     }
+
+    *pX = pt.x;
+    *pY = pt.y;
 }
 
 
-void RotatePoint( int* pX, int* pY, int cx, int cy, double angle )
+void RotatePoint( int* pX, int* pY, int cx, int cy, const EDA_ANGLE& angle )
 {
     int ox, oy;
 
@@ -280,7 +232,7 @@ void RotatePoint( int* pX, int* pY, int cx, int cy, double angle )
 }
 
 
-void RotatePoint( wxPoint* point, const wxPoint& centre, double angle )
+void RotatePoint( wxPoint* point, const wxPoint& centre, const EDA_ANGLE& angle )
 {
     int ox, oy;
 
@@ -288,24 +240,13 @@ void RotatePoint( wxPoint* point, const wxPoint& centre, double angle )
     oy = point->y - centre.y;
 
     RotatePoint( &ox, &oy, angle );
+
     point->x = ox + centre.x;
     point->y = oy + centre.y;
 }
 
-void RotatePoint( VECTOR2I& point, const VECTOR2I& centre, double angle )
-{
-    int ox, oy;
 
-    ox = point.x - centre.x;
-    oy = point.y - centre.y;
-
-    RotatePoint( &ox, &oy, angle );
-    point.x = ox + centre.x;
-    point.y = oy + centre.y;
-}
-
-
-void RotatePoint( double* pX, double* pY, double cx, double cy, double angle )
+void RotatePoint( double* pX, double* pY, double cx, double cy, const EDA_ANGLE& angle )
 {
     double ox, oy;
 
@@ -319,44 +260,41 @@ void RotatePoint( double* pX, double* pY, double cx, double cy, double angle )
 }
 
 
-void RotatePoint( double* pX, double* pY, double angle )
+void RotatePoint( double* pX, double* pY, const EDA_ANGLE& aAngle )
 {
-    double tmp;
+    EDA_ANGLE angle = aAngle;
+    VECTOR2D  pt;
 
-    NORMALIZE_ANGLE_POS( angle );
+    angle.Normalize();
 
     // Cheap and dirty optimizations for 0, 90, 180, and 270 degrees.
-    if( angle == 0 )
-        return;
-
-    if( angle == 900 )          /* sin = 1, cos = 0 */
+    if( angle == ANGLE_0 )
     {
-        tmp = *pX;
-        *pX = *pY;
-        *pY = -tmp;
+        pt = VECTOR2D( *pX, *pY );
     }
-    else if( angle == 1800 )    /* sin = 0, cos = -1 */
+    else if( angle == ANGLE_90 )          /* sin = 1, cos = 0 */
     {
-        *pX = -*pX;
-        *pY = -*pY;
+        pt = VECTOR2D( *pY, -*pX );
     }
-    else if( angle == 2700 )    /* sin = -1, cos = 0 */
+    else if( angle == ANGLE_180 )    /* sin = 0, cos = -1 */
     {
-        tmp = *pX;
-        *pX = -*pY;
-        *pY = tmp;
+        pt = VECTOR2D( -*pX, -*pY );
+    }
+    else if( angle == ANGLE_270 )    /* sin = -1, cos = 0 */
+    {
+        pt = VECTOR2D( -*pY, *pX );
     }
     else
     {
-        double fangle = DECIDEG2RAD( angle );
-        double sinus = sin( fangle );
-        double cosinus = cos( fangle );
+        double sinus = angle.Sin();
+        double cosinus = angle.Cos();
 
-        double fpx = (*pY * sinus ) + (*pX * cosinus );
-        double fpy = (*pY * cosinus ) - (*pX * sinus );
-        *pX = fpx;
-        *pY = fpy;
+        pt.x = ( *pY * sinus ) + ( *pX * cosinus );
+        pt.y = ( *pY * cosinus ) - ( *pX * sinus );
     }
+
+    *pX = pt.x;
+    *pY = pt.y;
 }
 
 
diff --git a/pcbnew/autorouter/ar_matrix.cpp b/pcbnew/autorouter/ar_matrix.cpp
index 2e66a445c3..fd8d8da922 100644
--- a/pcbnew/autorouter/ar_matrix.cpp
+++ b/pcbnew/autorouter/ar_matrix.cpp
@@ -591,7 +591,7 @@ void AR_MATRIX::traceArc( int ux0, int uy0, int ux1, int uy1, double ArcAngle, i
 
     x0 = ux1 - ux0;
     y0 = uy1 - uy0;
-    StAngle = ArcTangente( uy1 - uy0, ux1 - ux0 );
+    StAngle = EDA_ANGLE( VECTOR2I( ux1, uy1 ) - VECTOR2I( ux0, uy0 ) ).AsTenthsOfADegree();
 
     if( lg < 1 )
         lg = 1;