diff --git a/drape_frontend/navigator.cpp b/drape_frontend/navigator.cpp
index 93abf9bbd6..07f48a8382 100644
--- a/drape_frontend/navigator.cpp
+++ b/drape_frontend/navigator.cpp
@@ -176,9 +176,28 @@ bool Navigator::ScaleImpl(m2::PointD const & newPt1, m2::PointD const & newPt2,
   math::Matrix<double, 3, 3> const newM =
       screen.GtoPMatrix() * ScreenBase::CalcTransform(oldPt1 + offset, oldPt2 + offset,
                                                       newPt1 + offset, newPt2 + offset,
-                                                      doRotateScreen);
+                                                      doRotateScreen,
+                                                      true);
   ScreenBase tmp = screen;
   tmp.SetGtoPMatrix(newM);
+
+  if (!CheckMaxScale(tmp))
+  {
+    if (doRotateScreen)
+    {
+      math::Matrix<double, 3, 3> const tmpM =
+        screen.GtoPMatrix() * ScreenBase::CalcTransform(oldPt1 + offset, oldPt2 + offset,
+                                                        newPt1 + offset, newPt2 + offset,
+                                                        doRotateScreen,
+                                                        false);
+      tmp.SetGtoPMatrix(tmpM);
+    }
+    else
+    {
+      return false;
+    }
+  }
+
   if (tmp.isPerspective())
     tmp.MatchGandP3d(centerG, center3d);
 
@@ -195,9 +214,6 @@ bool Navigator::ScaleImpl(m2::PointD const & newPt1, m2::PointD const & newPt2,
       return false;
   }
 
-  if (!CheckMaxScale(tmp))
-    return false;
-
   // re-checking the borders, as we might violate them a bit (don't know why).
   if (!CheckBorders(tmp))
     tmp = ScaleInto(tmp, worldR);
diff --git a/geometry/geometry_tests/screen_test.cpp b/geometry/geometry_tests/screen_test.cpp
index 8bdd8c9300..3d561ba921 100644
--- a/geometry/geometry_tests/screen_test.cpp
+++ b/geometry/geometry_tests/screen_test.cpp
@@ -151,7 +151,8 @@ UNIT_TEST(ScreenBase_CalcTransform)
                                           m2::PointD(0, 1), m2::PointD(1, 1),
                                           m2::PointD(             s * sin(a) + dx,               s * cos(a) + dy),
                                           m2::PointD(s * cos(a) + s * sin(a) + dx, -s * sin(a) + s * cos(a) + dy),
-                                          true /* allow rotate */);
+                                          true /* allow rotate */,
+                                          true /* allow scale*/);
 
   ScreenBase::ExtractGtoPParams(m, a1, s1, dx1, dy1);
 
diff --git a/geometry/screenbase.cpp b/geometry/screenbase.cpp
index a79cfec33e..79172cbdc9 100644
--- a/geometry/screenbase.cpp
+++ b/geometry/screenbase.cpp
@@ -225,9 +225,12 @@ int ScreenBase::GetHeight() const { return base::SignedRound(m_PixelRect.SizeY()
 ScreenBase::MatrixT const ScreenBase::CalcTransform(m2::PointD const & oldPt1,
                                                     m2::PointD const & oldPt2,
                                                     m2::PointD const & newPt1,
-                                                    m2::PointD const & newPt2, bool allowRotate)
+                                                    m2::PointD const & newPt2, 
+                                                    bool allowRotate,
+                                                    bool allowScale)
 {
-  double const s = newPt1.Length(newPt2) / oldPt1.Length(oldPt2);
+  
+  double const s = allowScale ? newPt1.Length(newPt2) / oldPt1.Length(oldPt2) : 1.0;
   double const a = allowRotate ? ang::AngleTo(newPt1, newPt2) - ang::AngleTo(oldPt1, oldPt2) : 0.0;
 
   MatrixT m = math::Shift(
diff --git a/geometry/screenbase.hpp b/geometry/screenbase.hpp
index d0418031ee..3174eda08a 100644
--- a/geometry/screenbase.hpp
+++ b/geometry/screenbase.hpp
@@ -124,7 +124,7 @@ public:
   /// newPt2)
   static MatrixT const CalcTransform(m2::PointD const & oldPt1, m2::PointD const & oldPt2,
                                      m2::PointD const & newPt1, m2::PointD const & newPt2,
-                                     bool allowRotate);
+                                     bool allowRotate, bool allowScale);
 
   /// Setting GtoP matrix extracts the Angle and m_Org parameters, leaving PixelRect intact
   void SetGtoPMatrix(MatrixT const & m);