diff --git a/.github/ISSUE_TEMPLATE/2-faq-report.md b/.github/ISSUE_TEMPLATE/2-faq-report.md index fbc18c4381..531d263d7f 100644 --- a/.github/ISSUE_TEMPLATE/2-faq-report.md +++ b/.github/ISSUE_TEMPLATE/2-faq-report.md @@ -1,8 +1,8 @@ --- name: "📚 Outdated FAQ" about: Report an issue in FAQ - --- + 🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑 Please do not file FAQ issues on the GitHub issues tracker. diff --git a/.github/ISSUE_TEMPLATE/3-bug-report.md b/.github/ISSUE_TEMPLATE/3-bug-report.md index d12ea14578..ecf870be10 100644 --- a/.github/ISSUE_TEMPLATE/3-bug-report.md +++ b/.github/ISSUE_TEMPLATE/3-bug-report.md @@ -2,6 +2,7 @@ name: "\U0001F41E Bug report" about: Report a bug in OsmAnd --- + Yes, the previous version in which this bug was not present was: .... - ### Description - A clear and concise description of the problem... - + ## 🔬 Minimal Reproduction + 1. Open app, and click on ... ## 🔥 Exception or Error +

 
 
 
 
- -## 🌍 Your Environment +## 🌍 Your Environment **OsmAnd Version:** +

 
 
@@ -60,10 +61,11 @@ If the bug is reproducible, please describe steps below:
 **Device and Android/iOS version:**
 
 **Maps used (online or offline):**
+
 
-- [ ] Offline maps offered within the OsmAnd app for download. 
-  
+
+- [ ] Offline maps offered within the OsmAnd app for download.
+
 - [ ] Online (tile / raster) maps 
 
-
 **Anything else relevant?**
diff --git a/.github/ISSUE_TEMPLATE/4-routing-report.md b/.github/ISSUE_TEMPLATE/4-routing-report.md
index 4c1e68c11a..216cd4b402 100644
--- a/.github/ISSUE_TEMPLATE/4-routing-report.md
+++ b/.github/ISSUE_TEMPLATE/4-routing-report.md
@@ -2,6 +2,7 @@
 name: "\U0001F6A9 Routing report"
 about: Report a routing issue in OsmAnd
 ---
+
 
+
 - [ ] OsmAnd's in-app offline routing
 - [ ] Any online routing provider (YOURS, OpenRouteService, OSRM, etc.)
 
 ### Routing Profile
+
 
 
 ### Start and end points
@@ -38,6 +41,7 @@ Please give us the following information so that we can try to **reproduce** you
 Also, a permalink from [openstreetmap.org](https://www.openstreetmap.org/) can be helpful. -->
 
 ### Actual and expected routes
+
 
 
 ### Is this a regression?
@@ -45,9 +49,10 @@ Also, a permalink from [openstreetmap.org](https://www.openstreetmap.org/) can b
 
  Yes, the previous version in which this bug was not present was: ....
 
-## 🌍  Your Environment
+## 🌍 Your Environment
 
 **OsmAnd Version:**
+
 

 
 
@@ -57,10 +62,11 @@ Also, a permalink from [openstreetmap.org](https://www.openstreetmap.org/) can b
 **Device and Android/iOS version:**
 
 **Maps used (online or offline):**
+
 
-- [ ] Offline maps offered within the OsmAnd app for download. 
-  
+
+- [ ] Offline maps offered within the OsmAnd app for download.
+
 - [ ] Online (tile / raster) maps 
 
-
 **Anything else relevant?**
diff --git a/.github/ISSUE_TEMPLATE/5-feature-request.md b/.github/ISSUE_TEMPLATE/5-feature-request.md
index 046fb3a90f..9c46069f8c 100644
--- a/.github/ISSUE_TEMPLATE/5-feature-request.md
+++ b/.github/ISSUE_TEMPLATE/5-feature-request.md
@@ -1,11 +1,11 @@
 ---
 name: "\U0001F680 Feature request"
 about: Suggest a feature for OsmAnd
-
 ---
+
  A clear and concise description of the problem or missing capability...
 
+
 
 ### Describe the solution you'd like
+
  If you have a solution in mind, please describe it.
 
-
 ### Describe alternatives you've considered
+
  Have you considered any alternative solutions or workarounds?
diff --git a/OsmAnd-java/src/main/java/net/osmand/IndexConstants.java b/OsmAnd-java/src/main/java/net/osmand/IndexConstants.java
index 0dea2d42fb..93569dfddd 100644
--- a/OsmAnd-java/src/main/java/net/osmand/IndexConstants.java
+++ b/OsmAnd-java/src/main/java/net/osmand/IndexConstants.java
@@ -45,6 +45,9 @@ public class IndexConstants {
 
 	public static final String GPX_FILE_EXT = ".gpx"; //$NON-NLS-1$
 
+	public static final String WPT_CHART_FILE_EXT = ".wpt.chart";
+	public static final String SQLITE_CHART_FILE_EXT = ".3d.chart";
+
 	public final static String POI_TABLE = "poi"; //$NON-NLS-1$
 	
 	public static final String INDEX_DOWNLOAD_DOMAIN = "download.osmand.net";
diff --git a/OsmAnd-java/src/main/java/net/osmand/osm/io/Base64.java b/OsmAnd-java/src/main/java/net/osmand/osm/io/Base64.java
index 0a3da9bee2..0def1af562 100644
--- a/OsmAnd-java/src/main/java/net/osmand/osm/io/Base64.java
+++ b/OsmAnd-java/src/main/java/net/osmand/osm/io/Base64.java
@@ -1,93 +1,104 @@
 package net.osmand.osm.io;
 
+
 /**
  * @source http://www.javaworld.com/javaworld/javatips/jw-javatip47.html -- 24.11.2008, (mb)
  */
 public class Base64 {
-        /*******************************************************************************************************************
-         * BASE 64 encoding of a String or an array of bytes. See also RFC 1421.
-         *
-         * @author Unknown
-         * @author David W. Croft
-         * @version 1998-06-08
-         ******************************************************************************************************************/
+	/*******************************************************************************************************************
+	 * BASE 64 encoding of a String or an array of bytes. See also RFC 1421.
+	 *
+	 * @author Unknown
+	 * @author David W. Croft
+	 * @version 1998-06-08
+	 ******************************************************************************************************************/
 
-        //////////////////////////////////////////////////////////////////////
-        //////////////////////////////////////////////////////////////////////
-        public static final char[] alphabet = { 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', //  0 to  7
-                        'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', //  8 to 15
-                        'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', // 16 to 23
-                        'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f', // 24 to 31
-                        'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', // 32 to 39
-                        'o', 'p', 'q', 'r', 's', 't', 'u', 'v', // 40 to 47
-                        'w', 'x', 'y', 'z', '0', '1', '2', '3', // 48 to 55
-                        '4', '5', '6', '7', '8', '9', '+', '/' }; // 56 to 63
+	//////////////////////////////////////////////////////////////////////
+	//////////////////////////////////////////////////////////////////////
+	public static final char[] alphabet = { 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', // 0 to 7
+			'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', // 8 to 15
+			'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', // 16 to 23
+			'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f', // 24 to 31
+			'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', // 32 to 39
+			'o', 'p', 'q', 'r', 's', 't', 'u', 'v', // 40 to 47
+			'w', 'x', 'y', 'z', '0', '1', '2', '3', // 48 to 55
+			'4', '5', '6', '7', '8', '9', '+', '/' }; // 56 to 63
 
-        //////////////////////////////////////////////////////////////////////
-        //////////////////////////////////////////////////////////////////////
+	//////////////////////////////////////////////////////////////////////
+	//////////////////////////////////////////////////////////////////////
 
-        public static String encode(final String s)
-        //////////////////////////////////////////////////////////////////////
-        {
-                return encode(s.getBytes());
-        }
+	public static int indexOf(char c) {
+		for (int i = 0; i < alphabet.length; i++) {
+			if (alphabet[i] == c) {
+				return i;
+			}
+		}
+		return -1;
+	}
 
-        public static String encode(final byte[] octetString)
-        //////////////////////////////////////////////////////////////////////
-        {
-                int bits24;
-                int bits6;
 
-                final char[] out = new char[((octetString.length - 1) / 3 + 1) * 4];
+	public static String encode(final String s)
+	//////////////////////////////////////////////////////////////////////
+	{
+		return encode(s.getBytes());
+	}
 
-                int outIndex = 0;
-                int i = 0;
+	public static String encode(final byte[] octetString)
+	//////////////////////////////////////////////////////////////////////
+	{
+		int bits24;
+		int bits6;
 
-                while ((i + 3) <= octetString.length) {
-                        // store the octets
-                        bits24 = (octetString[i++] & 0xFF) << 16;
-                        bits24 |= (octetString[i++] & 0xFF) << 8;
-                        bits24 |= (octetString[i++] & 0xFF);
+		final char[] out = new char[((octetString.length - 1) / 3 + 1) * 4];
 
-                        bits6 = (bits24 & 0x00FC0000) >> 18;
-                        out[outIndex++] = alphabet[bits6];
-                        bits6 = (bits24 & 0x0003F000) >> 12;
-                        out[outIndex++] = alphabet[bits6];
-                        bits6 = (bits24 & 0x00000FC0) >> 6;
-                        out[outIndex++] = alphabet[bits6];
-                        bits6 = (bits24 & 0x0000003F);
-                        out[outIndex++] = alphabet[bits6];
-                }
+		int outIndex = 0;
+		int i = 0;
 
-                if (octetString.length - i == 2) {
-                        // store the octets
-                        bits24 = (octetString[i] & 0xFF) << 16;
-                        bits24 |= (octetString[i + 1] & 0xFF) << 8;
+		while ((i + 3) <= octetString.length) {
+			// store the octets
+			bits24 = (octetString[i++] & 0xFF) << 16;
+			bits24 |= (octetString[i++] & 0xFF) << 8;
+			bits24 |= (octetString[i++] & 0xFF);
 
-                        bits6 = (bits24 & 0x00FC0000) >> 18;
-                        out[outIndex++] = alphabet[bits6];
-                        bits6 = (bits24 & 0x0003F000) >> 12;
-                        out[outIndex++] = alphabet[bits6];
-                        bits6 = (bits24 & 0x00000FC0) >> 6;
-                        out[outIndex++] = alphabet[bits6];
+			bits6 = (bits24 & 0x00FC0000) >> 18;
+			out[outIndex++] = alphabet[bits6];
+			bits6 = (bits24 & 0x0003F000) >> 12;
+			out[outIndex++] = alphabet[bits6];
+			bits6 = (bits24 & 0x00000FC0) >> 6;
+			out[outIndex++] = alphabet[bits6];
+			bits6 = (bits24 & 0x0000003F);
+			out[outIndex++] = alphabet[bits6];
+		}
 
-                        // padding
-                        out[outIndex++] = '=';
-                } else if (octetString.length - i == 1) {
-                        // store the octets
-                        bits24 = (octetString[i] & 0xFF) << 16;
+		if (octetString.length - i == 2) {
+			// store the octets
+			bits24 = (octetString[i] & 0xFF) << 16;
+			bits24 |= (octetString[i + 1] & 0xFF) << 8;
 
-                        bits6 = (bits24 & 0x00FC0000) >> 18;
-                        out[outIndex++] = alphabet[bits6];
-                        bits6 = (bits24 & 0x0003F000) >> 12;
-                        out[outIndex++] = alphabet[bits6];
+			bits6 = (bits24 & 0x00FC0000) >> 18;
+			out[outIndex++] = alphabet[bits6];
+			bits6 = (bits24 & 0x0003F000) >> 12;
+			out[outIndex++] = alphabet[bits6];
+			bits6 = (bits24 & 0x00000FC0) >> 6;
+			out[outIndex++] = alphabet[bits6];
 
-                        // padding
-                        out[outIndex++] = '=';
-                        out[outIndex++] = '=';
-                }
+			// padding
+			out[outIndex++] = '=';
+		} else if (octetString.length - i == 1) {
+			// store the octets
+			bits24 = (octetString[i] & 0xFF) << 16;
 
-                return new String(out);
-        }
+			bits6 = (bits24 & 0x00FC0000) >> 18;
+			out[outIndex++] = alphabet[bits6];
+			bits6 = (bits24 & 0x0003F000) >> 12;
+			out[outIndex++] = alphabet[bits6];
+
+			// padding
+			out[outIndex++] = '=';
+			out[outIndex++] = '=';
+		}
+
+		return new String(out);
+	}
 
 }
\ No newline at end of file
diff --git a/OsmAnd-java/src/main/java/net/osmand/router/RouteCalculationProgress.java b/OsmAnd-java/src/main/java/net/osmand/router/RouteCalculationProgress.java
index eb93e95699..2e6db09022 100644
--- a/OsmAnd-java/src/main/java/net/osmand/router/RouteCalculationProgress.java
+++ b/OsmAnd-java/src/main/java/net/osmand/router/RouteCalculationProgress.java
@@ -49,14 +49,16 @@ public class RouteCalculationProgress {
 			pr = Math.min(p * p / (all * all), 1);
 		}
 		float progress = INITIAL_PROGRESS;
-		if (totalIterations > 1) {
+		if (totalIterations <= 1) {
+			progress = INITIAL_PROGRESS + pr * (1 - INITIAL_PROGRESS);
+		} else if (totalIterations <= 2) {
 			if (iteration < 1) {
 				progress = pr * FIRST_ITERATION + INITIAL_PROGRESS;
 			} else {
 				progress = (INITIAL_PROGRESS + FIRST_ITERATION) + pr * (1 - FIRST_ITERATION - INITIAL_PROGRESS);
 			}
 		} else {
-			progress = INITIAL_PROGRESS + pr * (1 - INITIAL_PROGRESS);
+			progress = (float) ((iteration + Math.min(pr, 0.7)) / totalIterations);
 		}
 		return Math.min(progress * 100f, 99);
 	}
diff --git a/OsmAnd-java/src/main/java/net/osmand/router/RoutePlannerFrontEnd.java b/OsmAnd-java/src/main/java/net/osmand/router/RoutePlannerFrontEnd.java
index f284a205aa..5aefb2ac44 100644
--- a/OsmAnd-java/src/main/java/net/osmand/router/RoutePlannerFrontEnd.java
+++ b/OsmAnd-java/src/main/java/net/osmand/router/RoutePlannerFrontEnd.java
@@ -64,8 +64,6 @@ public class RoutePlannerFrontEnd {
 		public int routeGapDistance;
 		public int routeDistanceUnmatched;
 
-		public boolean calculationCancelled;
-		private boolean calculationDone;
 
 		public GpxRouteApproximation(RoutingContext ctx) {
 			this.ctx = ctx;
@@ -82,10 +80,6 @@ public class RoutePlannerFrontEnd {
 					routeCalculations, routeDistCalculations, routePointsSearched, routeDistance, routeDistanceUnmatched);
 		}
 
-		public boolean isCalculationDone() {
-			return calculationDone;
-		}
-
 		public double distFromLastPoint(LatLon startPoint) {
 			if (result.size() > 0) {
 				return MapUtils.getDistance(getLastPoint(), startPoint);
@@ -239,18 +233,22 @@ public class RoutePlannerFrontEnd {
 	public GpxRouteApproximation searchGpxRoute(GpxRouteApproximation gctx, List gpxPoints, ResultMatcher resultMatcher) throws IOException, InterruptedException {
 		long timeToCalculate = System.nanoTime();
 		gctx.ctx.keepNativeRoutingContext = true;
+		if (gctx.ctx.calculationProgress == null) {
+			gctx.ctx.calculationProgress = new RouteCalculationProgress();
+		}
 		GpxPoint start = null;
 		GpxPoint prev = null;
 		if (gpxPoints.size() > 0) {
 			gctx.ctx.calculationProgress.totalIterations = (int) (gpxPoints.get(gpxPoints.size() - 1).cumDist / gctx.MAXIMUM_STEP_APPROXIMATION + 1); 
 			start = gpxPoints.get(0); 
 		}
-		while (start != null && !gctx.calculationCancelled) {
+		while (start != null && !gctx.ctx.calculationProgress.isCancelled) {
 			double routeDist = gctx.MAXIMUM_STEP_APPROXIMATION;
 			GpxPoint next = findNextGpxPointWithin(gctx, gpxPoints, start, routeDist);
 			boolean routeFound = false;
-			gctx.ctx.calculationProgress.nextIteration();
 			if (next != null && initRoutingPoint(start, gctx, gctx.MINIMUM_POINT_APPROXIMATION)) {
+				gctx.ctx.calculationProgress.totalEstimatedDistance = 0;
+				gctx.ctx.calculationProgress.iteration = (int) (next.cumDist / gctx.MAXIMUM_STEP_APPROXIMATION);
 				while (routeDist >= gctx.MINIMUM_STEP_APPROXIMATION && !routeFound) {
 					routeFound = initRoutingPoint(next, gctx, gctx.MINIMUM_POINT_APPROXIMATION);
 					if (routeFound) {
@@ -299,20 +297,19 @@ public class RoutePlannerFrontEnd {
 			}
 			start = next;
 		}
-		if(gctx.ctx.calculationProgress != null) {
-			 gctx.ctx.calculationProgress.timeToCalculate = System.nanoTime() - timeToCalculate;
+		if (gctx.ctx.calculationProgress != null) {
+			gctx.ctx.calculationProgress.timeToCalculate = System.nanoTime() - timeToCalculate;
 		}
 		gctx.ctx.deleteNativeRoutingContext();
 		BinaryRoutePlanner.printDebugMemoryInformation(gctx.ctx);
 		calculateGpxRoute(gctx, gpxPoints);
-		if (!gctx.result.isEmpty() && !gctx.calculationCancelled) {
+		if (!gctx.result.isEmpty() && !gctx.ctx.calculationProgress.isCancelled) {
 			new RouteResultPreparation().printResults(gctx.ctx, gpxPoints.get(0).loc, gpxPoints.get(gpxPoints.size() - 1).loc, gctx.result);
 			System.out.println(gctx);
 		}
 		if (resultMatcher != null) {
-			resultMatcher.publish(gctx.calculationCancelled ? null : gctx);
+			resultMatcher.publish(gctx.ctx.calculationProgress.isCancelled ? null : gctx);
 		}
-		gctx.calculationDone = true;
 		return gctx;
 	}
 
@@ -365,7 +362,7 @@ public class RoutePlannerFrontEnd {
 		reg.initRouteEncodingRule(0, "highway", RouteResultPreparation.UNMATCHED_HIGHWAY_TYPE);
 		List lastStraightLine = null;
 		GpxPoint straightPointStart = null;
-		for (int i = 0; i < gpxPoints.size() && !gctx.calculationCancelled; ) {
+		for (int i = 0; i < gpxPoints.size() && !gctx.ctx.calculationProgress.isCancelled; ) {
 			GpxPoint pnt = gpxPoints.get(i);
 			if (pnt.routeToTarget != null && !pnt.routeToTarget.isEmpty()) {
 				LatLon startPoint = pnt.routeToTarget.get(0).getStartPoint();
@@ -459,7 +456,7 @@ public class RoutePlannerFrontEnd {
 	private void cleanupResultAndAddTurns(GpxRouteApproximation gctx) {
 		// cleanup double joints
 		int LOOK_AHEAD = 4;
-		for(int i = 0; i < gctx.result.size() && !gctx.calculationCancelled; i++) {
+		for(int i = 0; i < gctx.result.size() && !gctx.ctx.calculationProgress.isCancelled; i++) {
 			RouteSegmentResult s = gctx.result.get(i);
 			for(int j = i + 2; j <= i + LOOK_AHEAD && j < gctx.result.size(); j++) {
 				RouteSegmentResult e = gctx.result.get(j);
@@ -476,7 +473,7 @@ public class RoutePlannerFrontEnd {
 			r.setTurnType(null);
 			r.setDescription("");
 		}
-		if (!gctx.calculationCancelled) {
+		if (!gctx.ctx.calculationProgress.isCancelled) {
 			preparation.prepareTurnResults(gctx.ctx, gctx.result);
 		}
 	}
diff --git a/OsmAnd-java/src/main/java/net/osmand/search/core/SearchCoreFactory.java b/OsmAnd-java/src/main/java/net/osmand/search/core/SearchCoreFactory.java
index a4916d4187..360fafbdf9 100644
--- a/OsmAnd-java/src/main/java/net/osmand/search/core/SearchCoreFactory.java
+++ b/OsmAnd-java/src/main/java/net/osmand/search/core/SearchCoreFactory.java
@@ -33,6 +33,7 @@ import net.osmand.util.LocationParser.ParsedOpenLocationCode;
 import net.osmand.util.MapUtils;
 
 import java.io.IOException;
+import java.text.DecimalFormat;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collection;
@@ -1407,6 +1408,7 @@ public class SearchCoreFactory {
 		private LatLon olcPhraseLocation;
 		private ParsedOpenLocationCode cachedParsedCode;
 		private final List citySubTypes = Arrays.asList("city", "town", "village");
+		private final DecimalFormat latLonFormatter = new DecimalFormat("#.0####");
 
 		public SearchLocationAndUrlAPI() {
 			super(ObjectType.LOCATION, ObjectType.PARTIAL_LOCATION);
@@ -1498,7 +1500,7 @@ public class SearchCoreFactory {
 						sp.priority = SEARCH_LOCATION_PRIORITY;
 
 						sp.object = sp.location = ll;
-						sp.localeName = ((float) sp.location.getLatitude()) + ",  ";
+						sp.localeName = formatLatLon(sp.location.getLatitude()) + ",  ";
 						sp.objectType = ObjectType.PARTIAL_LOCATION;
 						resultMatcher.publish(sp);
 					}
@@ -1510,7 +1512,7 @@ public class SearchCoreFactory {
 			SearchResult sp = new SearchResult(phrase);
 			sp.priority = SEARCH_LOCATION_PRIORITY;
 			sp.object = sp.location = l;
-			sp.localeName = ((float) sp.location.getLatitude()) + ", " + ((float) sp.location.getLongitude());
+			sp.localeName = formatLatLon(sp.location.getLatitude()) + ", " + formatLatLon(sp.location.getLongitude());
 			sp.objectType = ObjectType.LOCATION;
 			sp.wordsSpan = lw;
 			resultMatcher.publish(sp);
@@ -1525,7 +1527,7 @@ public class SearchCoreFactory {
 				sp.object = pnt;
 				sp.wordsSpan = text;
 				sp.location = new LatLon(pnt.getLatitude(), pnt.getLongitude());
-				sp.localeName = ((float)pnt.getLatitude()) +", " + ((float) pnt.getLongitude());
+				sp.localeName = formatLatLon(pnt.getLatitude()) +", " + formatLatLon(pnt.getLongitude());
 				if (pnt.getZoom() > 0) {
 					sp.preferredZoom = pnt.getZoom();
 				}
@@ -1555,6 +1557,10 @@ public class SearchCoreFactory {
 			}
 			return cachedParsedCode == null ? SEARCH_LOCATION_PRIORITY : SEARCH_MAX_PRIORITY;
 		}
+
+		private String formatLatLon(double latLon) {
+			return latLonFormatter.format(latLon);
+		}
 	}
 
 	private static String stripBraces(String localeName) {
diff --git a/OsmAnd-java/src/main/java/net/osmand/util/Algorithms.java b/OsmAnd-java/src/main/java/net/osmand/util/Algorithms.java
index 21e7fbd58c..ea2869aaa3 100644
--- a/OsmAnd-java/src/main/java/net/osmand/util/Algorithms.java
+++ b/OsmAnd-java/src/main/java/net/osmand/util/Algorithms.java
@@ -119,7 +119,7 @@ public class Algorithms {
 	}
 
 	public static String getFileNameWithoutExtension(String name) {
-		int i = name.indexOf('.');
+		int i = name.lastIndexOf('.');
 		if (i >= 0) {
 			name = name.substring(0, i);
 		}
diff --git a/OsmAnd-java/src/main/java/net/osmand/util/GeoPointParserUtil.java b/OsmAnd-java/src/main/java/net/osmand/util/GeoPointParserUtil.java
index 9b2ce834b5..1383f4ae4a 100644
--- a/OsmAnd-java/src/main/java/net/osmand/util/GeoPointParserUtil.java
+++ b/OsmAnd-java/src/main/java/net/osmand/util/GeoPointParserUtil.java
@@ -3,6 +3,8 @@ package net.osmand.util;
 import java.net.URI;
 import java.net.URLDecoder;
 import java.net.URLEncoder;
+import java.util.Arrays;
+import java.util.Base64;
 import java.util.HashSet;
 import java.util.LinkedHashMap;
 import java.util.Locale;
@@ -11,6 +13,9 @@ import java.util.Set;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 
+import net.osmand.data.LatLon;
+import net.osmand.util.GeoPointParserUtil.GeoParsedPoint;
+
 public class GeoPointParserUtil {
 
 
@@ -69,6 +74,31 @@ public class GeoPointParserUtil {
 		}
 		return map;
 	}
+	
+	private static int kMaxPointBytes = 10;
+	private static int kMaxCoordBits = kMaxPointBytes * 3;
+	public static LatLon decodeMapsMeLatLonToInt(String s) {
+		// 44TvlEGXf-
+		int lat = 0, lon = 0;
+		int shift = kMaxCoordBits - 3;
+		for (int i = 0; i < s.length(); ++i, shift -= 3) {
+			int a = net.osmand.osm.io.Base64.indexOf(s.charAt(i));
+			if (a < 0)
+				return null;
+
+			int lat1 = (((a >> 5) & 1) << 2 | ((a >> 3) & 1) << 1 | ((a >> 1) & 1));
+			int lon1 = (((a >> 4) & 1) << 2 | ((a >> 2) & 1) << 1 | (a & 1));
+			lat |= lat1 << shift;
+			lon |= lon1 << shift;
+		}
+		double middleOfSquare = 1 << (3 * (kMaxPointBytes - s.length()) - 1);
+		lat += middleOfSquare;
+		lon += middleOfSquare;
+
+		double dlat = ((double) lat) / ((1 << kMaxCoordBits) - 1) * 180 - 90;
+		double dlon = ((double) lon) / ((1 << kMaxCoordBits) - 1 + 1) * 360.0 - 180;
+		return new LatLon(dlat, dlon);
+	}
 
 	/**
 	 * Parses geo and map intents:
@@ -190,6 +220,31 @@ public class GeoPointParserUtil {
 						int zoom = parseZoom(zm);
 						return new GeoParsedPoint(lat, lon, zoom);
 					}
+				} else if (host.equals("ge0.me")) {
+					// http:///44TvlEGXf-/Kyiv
+					if (path.startsWith("/")) {
+						path = path.substring(1);
+					}
+					String[] pms = path.split("/");
+					String label = "";
+					if (pms.length > 1) {
+						label = pms[1];
+					}
+					String qry = pms[0];
+					if (qry.length() < 10) {
+						return null;
+					}
+					int indZoom = net.osmand.osm.io.Base64.indexOf(qry.charAt(0));
+					int zoom = 15;
+					if (indZoom >= 0) {
+						zoom = indZoom / 4 + 4;
+					}
+					LatLon l = decodeMapsMeLatLonToInt(qry.substring(1).replace('-', '/'));
+					if (l == null) {
+						return null;
+					}
+					return new GeoParsedPoint(l.getLatitude(), l.getLongitude(), zoom, label);
+
 				} else if (simpleDomains.contains(host)) {
 					if (uri.getQuery() == null && params.size() == 0) {
 						// DOUBLE check this may be wrong test of openstreetmap.de (looks very weird url and server doesn't respond)
@@ -221,7 +276,6 @@ public class GeoPointParserUtil {
 					String z = String.valueOf(GeoParsedPoint.NO_ZOOM);
 
 					if (params.containsKey("q")) {
-						System.out.println("q=" + params.get("q"));
 						Matcher matcher = commaSeparatedPairPattern.matcher(params.get("q"));
 						if (matcher.matches()) {
 							latString = matcher.group(1);
diff --git a/OsmAnd-java/src/test/java/net/osmand/util/GeoPointParserUtilTest.java b/OsmAnd-java/src/test/java/net/osmand/util/GeoPointParserUtilTest.java
index c869779c4d..2131bebcfd 100644
--- a/OsmAnd-java/src/test/java/net/osmand/util/GeoPointParserUtilTest.java
+++ b/OsmAnd-java/src/test/java/net/osmand/util/GeoPointParserUtilTest.java
@@ -43,6 +43,13 @@ public class GeoPointParserUtilTest {
 				"https://www.google.co.in/maps/place/data=!3m2!1e3!4b1!4m6!3m5!1s0x0:0x0!7e2!8m2!3d10.1213237!4d76.348392?shorturl=1");
 		assertGeoPoint(actual, new GeoParsedPoint(10.1213237, 76.348392));
 	}
+	
+	@Test
+	public void testMapsMeParser() {
+		GeoParsedPoint actual = GeoPointParserUtil.parse(
+				"http://ge0.me/44TvlEGXf-/Kyiv");
+		assertGeoPoint(actual, new GeoParsedPoint(50.45003, 30.52414, 18, "Kyiv"));
+	}
 
 	@Test
 	public void testGeoPoint() {
@@ -449,21 +456,21 @@ public class GeoPointParserUtilTest {
 		actual = GeoPointParserUtil.parse(url);
 		assertGeoPoint(actual, new GeoParsedPoint("paris"));
 
-		// TODO this URL does not work, where is it used?
+		// LEGACY this URL does not work, where is it used?
 		// http://maps.google.com/maps/q=loc:34,-106&z=11
 		url = "http://maps.google.com/maps/q=loc:" + ilat + "," + ilon + "&z=" + z;
 		System.out.println("url: " + url);
 		actual = GeoPointParserUtil.parse(url);
 		assertGeoPoint(actual, new GeoParsedPoint(ilat, ilon, z));
 
-		// TODO this URL does not work, where is it used?
+		// LEGACY this URL does not work, where is it used?
 		// http://maps.google.com/maps/q=loc:34.99393,-106.61568&z=11
 		url = "http://maps.google.com/maps/q=loc:" + dlat + "," + dlon + "&z=" + z;
 		System.out.println("url: " + url);
 		actual = GeoPointParserUtil.parse(url);
 		assertGeoPoint(actual, new GeoParsedPoint(dlat, dlon, z));
 
-		// TODO this URL does not work, where is it used?
+		// LEGACY  this URL does not work, where is it used?
 		// whatsapp
 		// http://maps.google.com/maps/q=loc:34,-106 (You)
 		z = GeoParsedPoint.NO_ZOOM;
@@ -472,7 +479,7 @@ public class GeoPointParserUtilTest {
 		actual = GeoPointParserUtil.parse(url);
 		assertGeoPoint(actual, new GeoParsedPoint(ilat, ilon, z));
 
-		// TODO this URL does not work, where is it used?
+		// LEGACY this URL does not work, where is it used?
 		// whatsapp
 		// http://maps.google.com/maps/q=loc:34.99393,-106.61568 (You)
 		z = GeoParsedPoint.NO_ZOOM;
diff --git a/OsmAnd-telegram/res/values-eu/strings.xml b/OsmAnd-telegram/res/values-eu/strings.xml
index dc3e7d7c1c..1aa22910d7 100644
--- a/OsmAnd-telegram/res/values-eu/strings.xml
+++ b/OsmAnd-telegram/res/values-eu/strings.xml
@@ -210,7 +210,7 @@
     OsmAnd aztarnaria atzeko planoan exekutatzen da pantaila itzalita dagoenean.
     Hautatu kokapen-hornitzaileetako bat zure kokapena partekatzeko.
     Aplikazioak ez du kokapena atzitzeko baimenik.
-    "Telegramek kode bat bidali dizu OsmAnd-ek  zure kontuan saioa hasteko."
+    Telegramek kode bat bidali dizu OsmAnd-ek zure kontuan saioa hasteko.
     Bilaketa: Taldea edo kontaktua
     Hautatu kokapena partekatzeko kontaktuak eta taldeak.
     Ezarri denbora
@@ -232,14 +232,14 @@
     Ezarri kokapena partekatzeko gutxieneko tartea.
     Ez da mugitzen
     Kontaktu bat mugitu zen azken aldia.
-    Ezkutatu denbora jakin batean mugitu ez diren kontaktuak
+    Ezkutatu denbora jakin batean mugitu ez diren kontaktuak.
     OsmAnd konexioa
     Aukeratu OsmAnd aztarnariak posizioak bistaratzeko erabiliko duen OsmAnd bertsioa.
     %1$s-n
     Nola itzali OsmAnd aztarnaria Telegram-etik
     Nola itzali OsmAnd aztarnaria Telegram-etik
     Kokapena partekatzeko sarbidea baliogabetzeko. Ireki Telegram, joan Ezarpenak → Pribatutasuna eta segurtasuna → Saioak eta amaitu OsmAnd aztarnariaren saioa atalera.
-    "Konektatu Internetera Telegram saioa behar bezala  amaiatzeko."
+    Konektatu Internetera Telegram saioa behar bezala amaiatzeko.
     Azken erantzuna
     Kokapena partekatzea itzaltzen du hautatutako txat guztietan (%1$d).
     Hautatu kontaktuak mapan bistaratzeko OsmAnd bertsioa.
diff --git a/OsmAnd-telegram/res/values-fa/strings.xml b/OsmAnd-telegram/res/values-fa/strings.xml
index 824443b2c5..af2e8f441c 100644
--- a/OsmAnd-telegram/res/values-fa/strings.xml
+++ b/OsmAnd-telegram/res/values-fa/strings.xml
@@ -73,4 +73,9 @@
     یکاهای طول را تغییر دهید.
     یکاهای طول
     ظاهر
+    آخرین پاسخ:٪ 1 $ s پیش
+    آخرین به روزرسانی از تلگرام:٪ 1 $ s پیش
+    آخرین پاسخ: %1$s
+    آخرین به روز رسانی در تلگرام:%1$s
+    اشتباه بودن
 
\ No newline at end of file
diff --git a/OsmAnd-telegram/res/values-pt/strings.xml b/OsmAnd-telegram/res/values-pt/strings.xml
index 8b114893d7..6076bfee91 100644
--- a/OsmAnd-telegram/res/values-pt/strings.xml
+++ b/OsmAnd-telegram/res/values-pt/strings.xml
@@ -163,7 +163,7 @@
     Por favor, instale o Telegram e configure uma conta.
     Então pode usar esta app.
     Todos
-    Desativado
+    Desligado
     Precisa de uma conta e número de telefone registados no Telegram
     Não tenho uma conta do Telegram
     Digite o número de telefone
@@ -204,7 +204,7 @@
     A app não tem permissão para acessar os dados de localização.
     Por favor, ligue \"Localização\" nas configurações do sistema
     Selecione um dos provedores de localização para compartilhar sua localização.
-    Modo em segundo plano
+    Modo de fundo
     OsmAnd Tracker é executado em segundo plano com o ecrã desligado.
     Distância
     Compartilhar localização
@@ -230,15 +230,15 @@
     m/s
     km/h
     mph
-    Quilômetros por hora
+    Quilómetros por hora
     Milhas por hora
     Metros por segundo
-    Minutos por quilômetro
+    Minutos por quilómetro
     Minutos por milha
     Milhas náuticas por hora (nó)
     Milhas/pés
     Milhas/jardas
-    Quilômetros/metros
+    Quilómetros/metros
     Milhas náuticas
     Milhas/metros
     h
@@ -252,7 +252,7 @@
     Selecione o fuso horário a mostrar nas suas mensagens de localização.
     Fuso horário
     Unidades e formatos
-    Alterar unidade de distância.
+    Alterar a unidade de medida de distância.
     Unidades de comprimento
     Definir unidade de velocidade.
     Unidade de velocidade
diff --git a/OsmAnd/AndroidManifest.xml b/OsmAnd/AndroidManifest.xml
index e1508f6ba2..2c6d6b6463 100644
--- a/OsmAnd/AndroidManifest.xml
+++ b/OsmAnd/AndroidManifest.xml
@@ -371,6 +371,72 @@
 				
 			
 
+			
+				
+				
+				
+				
+				
+				
+				
+				
+				
+				
+				
+			
+
+			
+				
+				
+				
+				
+				
+				
+				
+				
+				
+				
+				
+				
+			
+
+			
+				
+				
+				
+				
+				
+				
+				
+				
+				
+				
+				
+			
+
+			
+				
+				
+				
+				
+				
+				
+				
+				
+				
+				
+				
+				
+			
+
 			
 			
 				
@@ -488,6 +554,13 @@
 				
 				
 			
+			
+				
+				
+				
+				
+				
+			
 			
 				
 				
diff --git a/OsmAnd/res/drawable/bottom_sheet_buttons_bg_dark.xml b/OsmAnd/res/drawable/bottom_sheet_buttons_bg_dark.xml
new file mode 100644
index 0000000000..1322edb6cb
--- /dev/null
+++ b/OsmAnd/res/drawable/bottom_sheet_buttons_bg_dark.xml
@@ -0,0 +1,11 @@
+
+
+	
+		
+	
+	
+		
+			
+		
+	
+
\ No newline at end of file
diff --git a/OsmAnd/res/drawable/bottom_sheet_buttons_bg_light.xml b/OsmAnd/res/drawable/bottom_sheet_buttons_bg_light.xml
new file mode 100644
index 0000000000..cfc0b32c50
--- /dev/null
+++ b/OsmAnd/res/drawable/bottom_sheet_buttons_bg_light.xml
@@ -0,0 +1,11 @@
+
+
+	
+		
+	
+	
+		
+			
+		
+	
+
\ No newline at end of file
diff --git a/OsmAnd/res/layout/bottom_sheet_behaviour_base.xml b/OsmAnd/res/layout/bottom_sheet_behaviour_base.xml
new file mode 100644
index 0000000000..1f54a2b8d1
--- /dev/null
+++ b/OsmAnd/res/layout/bottom_sheet_behaviour_base.xml
@@ -0,0 +1,50 @@
+
+
+
+	
+
+		
+
+			
+
+		
+
+	
+
+	
+
+		
+
+		
+
+	
+
+
\ No newline at end of file
diff --git a/OsmAnd/res/layout/bottom_sheet_plan_route_select_file.xml b/OsmAnd/res/layout/bottom_sheet_plan_route_select_file.xml
index da5f1dff61..362dacf2c6 100644
--- a/OsmAnd/res/layout/bottom_sheet_plan_route_select_file.xml
+++ b/OsmAnd/res/layout/bottom_sheet_plan_route_select_file.xml
@@ -1,66 +1,59 @@
 
-
 
-	
+
+	
+
+	
+		android:clipToPadding="false"
+		android:orientation="horizontal"
+		android:paddingStart="@dimen/content_padding"
+		android:paddingLeft="@dimen/content_padding"
+		android:paddingEnd="@dimen/content_padding"
+		android:paddingRight="@dimen/content_padding"
+		tools:itemCount="3"
+		tools:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"
+		tools:listitem="@layout/point_editor_icon_category_item"
+		tools:orientation="horizontal" />
 
-		
+	
 
-		
-
-		
-
-		
-
-	
-
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/OsmAnd/res/layout/bottom_sheet_plan_route_start.xml b/OsmAnd/res/layout/bottom_sheet_plan_route_start.xml
index a4aa9f312e..d43c589a9d 100644
--- a/OsmAnd/res/layout/bottom_sheet_plan_route_start.xml
+++ b/OsmAnd/res/layout/bottom_sheet_plan_route_start.xml
@@ -1,47 +1,40 @@
 
-
 
 	
+		android:orientation="horizontal"
+		android:paddingStart="@dimen/content_padding"
+		android:paddingLeft="@dimen/content_padding"
+		android:paddingTop="@dimen/bottom_sheet_title_padding_top"
+		android:paddingEnd="@dimen/content_padding"
+		android:paddingRight="@dimen/content_padding"
+		android:paddingBottom="@dimen/bottom_sheet_title_padding_bottom">
 
-		
-
-			
-
-		
-
-		
+			android:letterSpacing="@dimen/description_letter_spacing"
+			android:text="@string/plan_route_last_edited"
+			android:textColor="?attr/active_color_basic"
+			android:textSize="@dimen/default_desc_text_size"
+			osmand:typeface="@string/font_roboto_medium" />
 
 	
 
-
\ No newline at end of file
+	
+
+
\ No newline at end of file
diff --git a/OsmAnd/res/layout/custom_color_picker.xml b/OsmAnd/res/layout/custom_color_picker.xml
index db6c3a254c..f2133e410b 100644
--- a/OsmAnd/res/layout/custom_color_picker.xml
+++ b/OsmAnd/res/layout/custom_color_picker.xml
@@ -46,9 +46,11 @@
 				android:id="@+id/color_hex_edit_text"
 				android:layout_width="match_parent"
 				android:layout_height="wrap_content"
-				android:inputType="textMultiLine"
-				android:maxLines="4"
+				android:inputType="text"
+				android:maxLines="1"
 				android:minHeight="@dimen/bottom_sheet_list_item_height"
+				android:paddingTop="@dimen/content_padding_small"
+				android:paddingBottom="@dimen/content_padding_small"
 				android:paddingStart="@dimen/content_padding_small"
 				android:paddingLeft="@dimen/content_padding_small"
 				android:paddingEnd="@dimen/content_padding_small"
diff --git a/OsmAnd/res/layout/fragment_measurement_tool.xml b/OsmAnd/res/layout/fragment_measurement_tool.xml
index 425717f98a..fe1ba9b1d7 100644
--- a/OsmAnd/res/layout/fragment_measurement_tool.xml
+++ b/OsmAnd/res/layout/fragment_measurement_tool.xml
@@ -180,7 +180,10 @@
                     android:ellipsize="end"
                     android:gravity="center_vertical"
                     android:maxLines="1"
-                    android:padding="@dimen/measurement_tool_text_button_padding_small"
+                    android:paddingStart="@dimen/measurement_tool_text_button_padding_small"
+                    android:paddingLeft="@dimen/measurement_tool_text_button_padding_small"
+                    android:paddingEnd="@dimen/measurement_tool_text_button_padding_small"
+                    android:paddingRight="@dimen/measurement_tool_text_button_padding_small"
                     android:text="@string/shared_string_options"
                     android:textColor="?attr/color_dialog_buttons"
                     osmand:typeface="@string/font_roboto_medium"/>
diff --git a/OsmAnd/res/layout/fragment_plan_route_warning.xml b/OsmAnd/res/layout/fragment_plan_route_warning.xml
new file mode 100644
index 0000000000..3b7019dd9e
--- /dev/null
+++ b/OsmAnd/res/layout/fragment_plan_route_warning.xml
@@ -0,0 +1,119 @@
+
+
+
+	
+
+		
+
+			
+
+			
+
+		
+
+		
+
+		
+
+		
+
+			
+
+			
+
+		
+
+
+	
+
+
+	
+
+		
+
+	
+
+
\ No newline at end of file
diff --git a/OsmAnd/res/layout/fragment_route_between_points_bottom_sheet_dialog.xml b/OsmAnd/res/layout/fragment_route_between_points_bottom_sheet_dialog.xml
index 99b4cf41ff..49a09730d6 100644
--- a/OsmAnd/res/layout/fragment_route_between_points_bottom_sheet_dialog.xml
+++ b/OsmAnd/res/layout/fragment_route_between_points_bottom_sheet_dialog.xml
@@ -1,36 +1,32 @@
 
-
+	android:layout_height="wrap_content"
+	android:background="?attr/bg_color"
+	android:orientation="vertical">
 
 	
+		android:orientation="vertical"
+		android:paddingBottom="@dimen/bottom_sheet_content_padding_small">
 
-		
-
-			
+			android:gravity="center_vertical"
+			android:paddingStart="@dimen/content_padding"
+			android:paddingLeft="@dimen/content_padding"
+			android:paddingTop="@dimen/measurement_tool_menu_title_padding_top"
+			android:paddingEnd="@dimen/content_padding"
+			android:paddingRight="@dimen/content_padding"
+			android:paddingBottom="@dimen/measurement_tool_menu_title_padding_bottom"
+			android:text="@string/route_between_points"
+			android:textAppearance="@style/TextAppearance.ListItemTitle"
+			osmand:typeface="@string/font_roboto_medium" />
 
 			
 
-			
+		
 
 			
 		
 
-	
-
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/OsmAnd/res/layout/map_hud_bottom.xml b/OsmAnd/res/layout/map_hud_bottom.xml
index 81dc6fbd28..dc4be05d64 100644
--- a/OsmAnd/res/layout/map_hud_bottom.xml
+++ b/OsmAnd/res/layout/map_hud_bottom.xml
@@ -116,13 +116,20 @@
                 tools:src="@drawable/ic_action_remove_dark"
                 android:contentDescription="@string/snap_to_road" />
 
-            
+                android:layout_gravity="bottom">
+
+                
+            
 
         
 
diff --git a/OsmAnd/res/layout/point_editor_fragment_new.xml b/OsmAnd/res/layout/point_editor_fragment_new.xml
index a3a8000b0a..6e00c48bfd 100644
--- a/OsmAnd/res/layout/point_editor_fragment_new.xml
+++ b/OsmAnd/res/layout/point_editor_fragment_new.xml
@@ -239,7 +239,7 @@
 				
 
 	
 
 				
 
 		
+		android:orientation="vertical"
+		android:paddingBottom="@dimen/content_padding">
 
 		إدارة أوضاع التطبيق …
     لكامل التطبيق
     الإعدادات
-    نسخ من وضع آخر
+    نسخة من ملف تعريف آخر
     قم بتشغيل الشاشة
     خريطة أثناء التنقل
     خريطة أثناء التنقل
@@ -3301,7 +3301,7 @@
     لايمكن حذف الأوضاع الأساسية
     حفظ التغييرات
     احفظ تغييرات الوضع أولاً
-    حذف الوضع
+    حذف الملف الشخصي
     هل تريد حذف الوضع \"%s\"
     حدد وضع أساسي
     إسناد الوضع المخصص الخاص بك إلى أحد أوضاع التطبيق الافتراضية ، يحدد الإعداد الأساسي مثل الرؤية الافتراضية لعناصر واجهة المستخدم ووحدات السرعة والمسافة. وهذه هي أوضاع التطبيق الافتراضية ، إلى جانب أمثلة لأوضاع مخصصة يمكن تمديدها إلى:
@@ -3806,24 +3806,22 @@
     استيراد المسار
     فتح المسار الموجود
     إنشاء مسار جديد
-    حدد ملف المسار للفتح.
+    حدد المسار للفتح.
     تم
     الكتابة فوق المسار
     ملف تعريف التنقل
-    حدد ملف المسار الذي سيتم إضافة مقطع جديد إليه.
+    حدد ملف المسار الذي سيتم إضافة مقطع جديد إليه.
     حفظ كمسار جديد
     عكس الطريق
-    سيتم إعادة حساب المقطع التالي فقط باستخدام ملف التعريف المحدد.
-    سيتم إعادة حساب المقطع التالي فقط باستخدام ملف التعريف المحدد.
-    حدد كيفية توصيل النقاط، بخط مستقيم، أو حساب مسار بينها مع ملف التعريف المحدد.
+    سيتم إعادة حساب المقطع التالي فقط باستخدام ملف التعريف المحدد.
+    سيتم إعادة حساب المقطع التالي فقط باستخدام ملف التعريف المحدد.
+    حدد كيفية توصيل النقاط، بخط مستقيم، أو حساب مسار بينها على النحو المحدد أدناه.
     مسار كامل
     المقطع التالي
-    لاستخدام هذا الخيارتحتاج إلى محاذاة المسار الخاص بك إلى خريطة الطرق.
-\n
-\nفي الخطوة التالية ، ستحتاج إلى تحديد ملف تعريف الملاحة لاكتشاف الطرق المسموح بها وبداية المسافة لتقريب تتبعك بالطرق.
+    بعد ذلك ، ألقط مسارك بأقرب طريق مسموح به باستخدام أحد ملفات تعريف التنقل الخاصة بك لاستخدام هذا الخيار.
     بداية المسافة
     صور للشارع
-    هل أنت متأكد أنك تريد إغلاق مسار الخطة دون حفظ؟ سوف تفقد كل التغييرات.
+    هل أنت متأكد أنك تريد إغلاق مسار الخطة دون حفظ؟ سوف تفقد كل التغييرات؟
     في حالة الاتجاه المعاكس
     تسجيل المسار أثناء الملاحة
     حفظ كملف مسار جديد
@@ -3875,4 +3873,19 @@
     اسم الملف
     الرجاء إضافة نقطتين على الأقل.
     إعادة
+    • ميزة تخطيط المسار المحدثة: تسمح باستخدام أنواع الملاحة المختلفة لكل جزء وكذا اظافة طرق
+\n
+\n• قائمة مظهر جديدة للمسارات: تحديد اللون، السماكة، اظهار أسهم التوجيه، أيقونات الانطلاق والنهاية
+\n
+\n• تحسين رؤية عقد الدراجات
+\n
+\n• المسارات قابلة للنقر عليها الان وقائمة سياق بمعلومات أساسية
+\n
+\n• خوارزميات بحث محسنة
+\n
+\n• تم تحسين خيارات متابعة المسار خلال الملاحة
+\n
+\n• تم إصلاح المشكلات المتعلقة باستيراد/تصدير إعدادات الملف الشخصي
+\n
+\n
 
\ No newline at end of file
diff --git a/OsmAnd/res/values-b+kab/strings.xml b/OsmAnd/res/values-b+kab/strings.xml
index 9023496916..8a49267439 100644
--- a/OsmAnd/res/values-b+kab/strings.xml
+++ b/OsmAnd/res/values-b+kab/strings.xml
@@ -1337,6 +1337,7 @@
     Abrid yettin
     Aḥric i d-itteddun
     Amaɣnu n tunigin
-    Fren afaylu n uḍfar iɣer ara yernu uḥric amaynut.
+    Fren afaylu n uḍfar iɣer ara yernu uḥric amaynut.
     Tebɣiḍ s tidet ad tmedleḍ abrid n uɣawas war asekles\? Ad tesruḥeḍ akk ibeddilen.
+    Ittwasekles
 
\ No newline at end of file
diff --git a/OsmAnd/res/values-be/phrases.xml b/OsmAnd/res/values-be/phrases.xml
index f3672f5b22..b801ecedb5 100644
--- a/OsmAnd/res/values-be/phrases.xml
+++ b/OsmAnd/res/values-be/phrases.xml
@@ -3810,7 +3810,7 @@
     Труба
     Сетка папаўнення пітной вадой
     Папаўненне пітной вадой: не
-    Папаўненне пітной вадой: так
+    Так
     Перашкода
     Узровень вады: ніжэй сярэдняга ўзроўню
     Узровень вады: вышэй сярэдняга ўзроўню
@@ -3834,4 +3834,13 @@
     Так
     Цэнтр дайвінгу
     Паляўнічая база
+    Папаўненне пітной вады
+    Так
+    Расклад адпраўленняў: не
+    Расклад адпраўленняў
+    Расклад
+    Рэальны час
+    Затрымка
+    Маленькія электрапрыборы
+    Вулей
 
\ No newline at end of file
diff --git a/OsmAnd/res/values-be/strings.xml b/OsmAnd/res/values-be/strings.xml
index fb4e8d5b75..c80bd4dfe0 100644
--- a/OsmAnd/res/values-be/strings.xml
+++ b/OsmAnd/res/values-be/strings.xml
@@ -2014,7 +2014,7 @@
     Адчынена 24/7
     Шукаць
     ад
-    Суседства
+    Ваколіцы
     Раён
     Верхнялужыцкая
     Катэгорыі
@@ -3609,7 +3609,7 @@
     Ліміт даўжыні
     Арыентацыя
     Выдалена: %1$s
-    Перазапуск патрабуецца для поўнага выдалення даных камер кантролю хуткасці.
+    Перазапусціце праграму для поўнага выдалення даных камер кантролю хуткасці.
     Кіраванне ўзроўнем маштабавання мапы пры дапамозе кнопак рэгулявання гучнасці.
     Інфармацыя пра славутасці з Вікіпедыі. Гэта ваш кішэнны даведнік - уключыце ўбудову вікіпедыі і чытайце артыкулы пра аб’екты вакол вас.
     Матацыкл Эндура
@@ -3697,24 +3697,22 @@
     Перазапісаць след
     Захаваць як новы след
     Зваротны маршрут
-    Увесь след будзе пералічаны з выкарыстаннем абранага профілю.
-    Толькі наступны сегмент будзе пералічаны паводле абранага профілю.
-    Абярыце спосаб злучэння пунктаў. Варыянты: прамая лінія; разлік маршруту паводле абранага профілю.
+    Увесь след будзе пералічаны з выкарыстаннем абранага профілю.
+    Толькі наступны сегмент будзе пералічаны паводле абранага профілю.
+    Абярыце спосаб злучэння пунктаў. Варыянты: прамая лінія; разлік маршруту як вызначана ніжэй.
     Увесь след
     Наступны сегмент
-    Для выкарыстання гэтага параметру OsmAnd пракладзе ваш след па дарогах.
-\n
-\n Пасля вам патрэбна абраць профіль навігацыі для вызначэння маршруту з улікам параметраў і абмежаванняў гэтага профілю.
+    Пасля вам патрэбна абраць профіль навігацыі для вызначэння маршруту з улікам параметраў і абмежаванняў гэтага профілю.
     Максімальная дыстанцыя
     Профіль навігацыі
-    Абраць файл следу, да якога будзе дададзены новы сегмент.
+    Абраць файл следу, да якога будзе дададзены новы сегмент.
     Выявы на ўзроўні вуліц
-    Сапраўды закрыць план маршруту без захавання\? Усе змены страцяцца.
+    Усе змены страцяцца. Закрыць план маршруту\?
     У выпадку адваротнага кірунку
     Маршрут следу
     Кіравацца следу
     Абярыце файл следу
-    Абярыце альбо імпартуйце файл следу.
+    Абярыце альбо імпартуйце файл следу са сваёй прылады.
     Абраць іншы след
     Перайдзіце ад маёй пазіцыі да следу
     Пункт следу для навігацыі
@@ -3941,4 +3939,19 @@
 \nАдзін месяц - 43 829 хвілін.
     Абярыце спосаб захоўвання спампаваных фрагментаў.
     Вярнуць
+    • Абноўлены рэжым планавання маршруту дазваляе выкарыстоўваць розныя тыпы навігацыі для кожнага сегмента і прымацоўвае любы шлях да дарог
+\n
+\n • Новыя варыянты выгляду для дарожак: абраць колер, таўшчыню, уключыць стрэлкі кірунку і адзнакі старту/фінішу
+\n
+\n • Палепшаная бачнасць роварных вузлоў
+\n
+\n • Кантэкстнае меню для слядоў з асноўнай інфармацыяй
+\n
+\n • Палепшаны алгарытмы пошуку
+\n
+\n • Палепшаны параметры адсочвання ў навігацыі
+\n
+\n • Выпраўлены праблемы з імпартам / экспартам налад профілю
+\n
+\n
 
\ No newline at end of file
diff --git a/OsmAnd/res/values-ca/strings.xml b/OsmAnd/res/values-ca/strings.xml
index a0e9408104..4ae94a57c7 100644
--- a/OsmAnd/res/values-ca/strings.xml
+++ b/OsmAnd/res/values-ca/strings.xml
@@ -3713,17 +3713,17 @@ Abasta l\'àrea: %1$s x %2$s
     Afegir a una ruta
     Mostrar icones d\'inici final
     Triar amplària
-    Trieu un arxiu de ruta al qual s\'afegirà un nou segment.
-    Per usar aquesta opció OsmAnd ha d\'ajustar la seua ruta a les vies del mapa.
+    Trieu un arxiu de ruta al qual s\'afegirà un nou segment.
+    Per usar aquesta opció OsmAnd ha d\'ajustar la seua ruta a les vies del mapa.
 \n
 \nEn el pas següent cal que elegiu el perfil de navegació per detectar vies permeses i el llindar de distància per aproximar la ruta a les vies.
-    Trieu com connectar els punts, amb una línia recta, o calcular la ruta entre ells d\'acord amb el perfil seleccionat.
+    Trieu com connectar els punts, amb una línia recta, o calcular la ruta entre ells d\'acord amb el perfil seleccionat.
     Trieu l\'interval a què les marques de distància o temps sobre la ruta es mostraran.
     Personalitzat
     Desar com a una ruta nova
     Ruta inversa
-    La ruta sencera serà recalculada fent ús del perfil seleccionat.
-    Només el següent segment serà recalculat fent ús del perfil seleccionat.
+    La ruta sencera serà recalculada fent ús del perfil seleccionat.
+    Només el següent segment serà recalculat fent ús del perfil seleccionat.
     Ruta sencera
     Següent segment
     Llindar de distància
@@ -3800,4 +3800,19 @@ Abasta l\'àrea: %1$s x %2$s
     s\'ha desat
     Afegiu almenys dos punts.
     Torna a fer
+    Manté la pantalla desactivada
+    Moto enduro
+    Esteu segur que voleu tancar la ruta planificada sense desar-la\? Perdreu tots els canvis.
+    Afegeix a un fitxer de traces
+    Traces
+    Enregistra el trajecte a un fitxer GPX
+    Navegua des de la meva ubicació fins a la traça
+    Afegeix una adreça
+    Nom del fitxer
+    REC
+    Aturarà l\'enregistrament de traces quan es mati l\'aplicació (mitjançant aplicacions recents). (La indicació de fons OsmAnd desapareix de la barra de notificacions d\'Android.)
+    Trieu l\'interval d\'enregistrament general dels desplaçaments (s\'activa mitjançant el giny de gravació del mapa).
+    Traça simplificada
+    Només es desarà la línia del trajecte, les fites s\'esborraran.
+    %s arxius de traces seleccionats
 
\ No newline at end of file
diff --git a/OsmAnd/res/values-da/strings.xml b/OsmAnd/res/values-da/strings.xml
index 54fad8d47e..058b72d771 100644
--- a/OsmAnd/res/values-da/strings.xml
+++ b/OsmAnd/res/values-da/strings.xml
@@ -3731,8 +3731,8 @@
     Overskriv spor
     Gem som nyt spor
     Omvendt rute
-    Hele sporet genberegnes ved hjælp af den valgte profil.
-    Kun det næste segment genberegnes ved hjælp af den valgte profil.
+    Hele sporet genberegnes ved hjælp af den valgte profil.
+    Kun det næste segment genberegnes ved hjælp af den valgte profil.
     Hele sporet
     Næste segment
     Tærskelafstand
diff --git a/OsmAnd/res/values-de/phrases.xml b/OsmAnd/res/values-de/phrases.xml
index 2224f8adf5..53f9e13926 100644
--- a/OsmAnd/res/values-de/phrases.xml
+++ b/OsmAnd/res/values-de/phrases.xml
@@ -3817,7 +3817,7 @@
     Wasserstand: über dem mittleren Wasserstand
     Wasserstand: unter dem mittleren Wasserstand
     Hindernis
-    Trinkwassernachfüllung: ja
+    ja
     Trinkwassernachfüllung: nein
     Trinkwasser-Nachfüllnetz
     Internetzugangsgebühr für Kunden
@@ -3827,7 +3827,7 @@
     Rohr
     Druck
     Pumpenzustand: fehlender Arm
-    Ja
+    ja
     ja
     kein Vibrieren
     Pfeil
@@ -3835,4 +3835,13 @@
     Give box
     Stadtteil
     Bezirk
+    Aufzug
+    Fahrplan
+    Echtzeit
+    Verspätung
+    ja
+    Anzeige der Abreisezeiten: nein
+    Abbiegepfeil: nein
+    Anzeige der Abreisezeiten
+    Nachfüllen von Trinkwasser
 
\ No newline at end of file
diff --git a/OsmAnd/res/values-de/strings.xml b/OsmAnd/res/values-de/strings.xml
index 296430c488..730f97c489 100644
--- a/OsmAnd/res/values-de/strings.xml
+++ b/OsmAnd/res/values-de/strings.xml
@@ -2015,7 +2015,7 @@
     Erforderlich, um Karten herunterzuladen.
     Standort wird gesucht …
     Freier Speicherplatz
-    OsmAnd speichert Daten (Karten, GPX-Dateien usw.) in \'%1$s\'.
+    OsmAnd speichert Daten (Karten, Track-Dateien usw.) in \'%1$s\'.
     Berechtigung erteilen
     Standortbestimmung zulassen
     Erhalten Sie Wegbeschreibungen und entdecken Sie neue Orte ohne Internetverbindung
@@ -2072,8 +2072,8 @@
     Benachrichtigungen
     Aussehen
     Routenberechnung
-    Sie haben noch keine GPX-Dateien
-    GPX-Dateien können dem Ordner hinzugefügt werden
+    Sie haben noch keine Track-Dateien
+    Track-Dateien können dem Ordner hinzugefügt werden
     Weitere hinzufügen …
     POI hochladen
     Nehmen Sie die %1$d Ausfahrt
@@ -2785,7 +2785,7 @@
     Als Track speichern
     Sie haben %1$s Punkte hinzugefügt. Geben Sie einen Dateinamen ein und klicken Sie auf „Speichern“.
     Punkt %1$s gelöscht
-    Ihre Suchanfrage wird an: \"%1 s\" gesendet, zusammen mit Ihrem Standort.
+    Ihre Suchanfrage wird an: \"%1$s\" gesendet, zusammen mit Ihrem Standort.
 \n
 \nPersönliche Informationen werden nicht gesammelt, sondern nur Suchdaten, die zur Verbesserung der Suche benötigt werden.
     Keine Ergebnisse?
@@ -2901,10 +2901,10 @@
     Von %1$s
     Schritt für Schritt
     Straßentypen
-    GPX-Tracks ein-/ausblenden
-    Eine Schaltfläche zum Ein- oder Ausblenden ausgewählter GPX-Tracks auf der Karte.
-    GPX-Tracks ausblenden
-    GPX-Tracks einblenden
+    Tracks ein-/ausblenden
+    Eine Schaltfläche zum Ein- oder Ausblenden ausgewählter Tracks auf der Karte.
+    Tracks ausblenden
+    Tracks einblenden
     Aussteigen bei
     Zusteigen an Haltestelle
     Aktivierung von OsmAnd Live für Änderungen bei öffentlichen Verkehrsmitteln.
@@ -3829,13 +3829,13 @@
     Schwellenwert-Distanz
     Als neuen Track speichern
     Route umkehren
-    Der gesamte Track wird mit dem ausgewählten Profil neu berechnet.
-    Nur das nächste Segment wird mit dem ausgewählten Profil neu berechnet.
-    Wählen Sie, wie Punkte mit einer geraden Linie verbunden werden sollen, oder berechnen Sie eine Route zwischen ihnen mit dem ausgewählten Profil.
+    Der gesamte Track wird mit dem ausgewählten Profil neu berechnet.
+    Nur das nächste Segment wird mit dem ausgewählten Profil neu berechnet.
+    Wählen Sie, wie Punkte mit einer geraden Linie verbunden werden sollen, oder berechnen Sie eine Route zwischen ihnen mit dem ausgewählten Profil.
     Ganzer Track
     Nächstes Segment
     Navigationsprofil
-    Wählen Sie eine Trackdatei, für die ein neues Segment hinzugefügt werden soll.
+    Wählen Sie eine Trackdatei, für die ein neues Segment hinzugefügt werden soll.
     Track auswählen, der verfolgt werden soll
     Adresse löschen
     Adresse hinzufügen
@@ -3876,7 +3876,7 @@
     Track Datei zum Folgen auswählen, oder importieren.
     Die GPX-Aufzeichnung wird angehalten, wenn OsmAnd beendet wird (über „zuletzt verwendete Apps“). (Die Hintergrunddienst-Anzeige verschwindet aus der Android-Benachrichtigungsleiste.)
     Aufzeichnungsintervall für die generelle Track-Aufzeichnung festlegen (via Schaltfläche \'GPX\' auf dem Kartenbildschirm).
-    Um diese Option nutzen zu können, muss OsmAnd den Track auf die Straßen der Karte einrasten.
+    Um diese Option nutzen zu können, muss OsmAnd den Track auf die Straßen der Karte einrasten.
 \n
 \n Wählen Sie im nächsten Schritt ein Navigationsprofil um festzulegen, welche Straßentypen verwendet werden sollen, und wählen Sie einen Wert für die maximal zulässige Entfernung zwischen Track und Straße.
     Track-Wegpunkt hinzufügen
@@ -3891,4 +3891,5 @@
     Anderen Track wählen
     Track-Punkt, zu dem navigiert werden soll
     Nächstgelegener Punkt
+    Wiederholen
 
\ No newline at end of file
diff --git a/OsmAnd/res/values-el/strings.xml b/OsmAnd/res/values-el/strings.xml
index d97fabeee7..9ef59f2e76 100644
--- a/OsmAnd/res/values-el/strings.xml
+++ b/OsmAnd/res/values-el/strings.xml
@@ -3708,17 +3708,17 @@
     Σημειώστε τις επιλογές αφύπνισης της οθόνης (εξασφαλίστε ότι το OsmAnd είναι στο προσκήνιο όταν η συσκευή κλειδώνεται):
     Αποθήκευση ως νέου ίχνους
     Αντιστροφή διαδρομής
-    Ολόκληρο το ίχνος θα επανυπολογιστεί χρησιμοποιώντας την επιλεγμένη κατατομή (προφίλ).
-    Μόνο το επόμενο τμήμα θα επανυπολογιστεί χρησιμοποιώντας την επιλεγμένη κατατομή (προφίλ).
-    Επιλέξτε πώς να συνδέσετε τα σημεία, με ευθεία γραμμή, ή να υπολογίσετε μια διαδρομή μεταξύ τους με την επιλεγμένη κατατομή (προφίλ).
-    Για να χρησιμοποιήσετε αυτήν την επιλογή το OsmAnd χρειάζεται να προσκολλήσει το ίχνος σας στους δρόμους του χάρτη.
+    Ολόκληρο το ίχνος θα επανυπολογιστεί χρησιμοποιώντας την επιλεγμένη κατατομή (προφίλ).
+    Μόνο το επόμενο τμήμα θα επανυπολογιστεί χρησιμοποιώντας την επιλεγμένη κατατομή (προφίλ).
+    Επιλέξτε πώς να συνδέσετε τα σημεία, με ευθεία γραμμή, ή να υπολογίσετε μια διαδρομή μεταξύ τους με την επιλεγμένη κατατομή (προφίλ).
+    Για να χρησιμοποιήσετε αυτήν την επιλογή το OsmAnd χρειάζεται να προσκολλήσει το ίχνος σας στους δρόμους του χάρτη.
 \n
 \nΣτο επόμενο βήμα θα χρειαστείτε να επιλέξετε κατατομή (προφίλ) πλοήγησης για να εντοπίσετε τους επιτρεπόμενους δρόμους και την απόσταση κατωφλίου για να προσεγγίσετε το ίχνος σας με τους δρόμους.
     Ολόκληρο το ίχνος
     Επόμενο τμήμα
     Απόσταση κατωφλίου
     Κατατομή (προφίλ) πλοήγησης
-    Επιλέξτε ένα αρχείο ίχνους στο οποίο θα προστεθεί νέο τμήμα.
+    Επιλέξτε ένα αρχείο ίχνους στο οποίο θα προστεθεί νέο τμήμα.
     Τατζίκικα
     Μερικά άρθρα της Wikipedia μπορεί να μην είναι διαθέσιμα στη γλώσσα σας.
     Καντονέζικα
diff --git a/OsmAnd/res/values-eo/phrases.xml b/OsmAnd/res/values-eo/phrases.xml
index 41115a7aed..cc31985829 100644
--- a/OsmAnd/res/values-eo/phrases.xml
+++ b/OsmAnd/res/values-eo/phrases.xml
@@ -2335,7 +2335,7 @@
     Akvokrano
     Butonprema: jes
     Butonprema: ne
-    Bicikla mem-riparejo;memriparejo bicikla;riparejo bicikla;pumpilo bicikla;aerpumpilo bicikla
+    Bicikla memriparejo;memriparejo bicikla;riparejo bicikla;pumpilo bicikla;aerpumpilo bicikla
     Aersportoj
     elteriĝejo
     surteriĝejo
diff --git a/OsmAnd/res/values-eo/strings.xml b/OsmAnd/res/values-eo/strings.xml
index e5480958a6..304dea0021 100644
--- a/OsmAnd/res/values-eo/strings.xml
+++ b/OsmAnd/res/values-eo/strings.xml
@@ -3821,17 +3821,17 @@
     Superskribi kurson
     Konservi kiel novan spuron
     Inversigi kurson
-    Tuta kurso estos rekalkulita uzante la elektitan profilon.
-    Nur sekva segmento estos rekalkulita uzante la elektitan profilon.
-    Elektu kiel konekti punktojn: ĉu per rekta linio, ĉu kalkuli kurson inter ilin uzante la elektitan profilon.
+    Tuta kurso estos rekalkulita uzante la elektitan profilon.
+    Nur sekva segmento estos rekalkulita uzante la elektitan profilon.
+    Elektu kiel konekti punktojn: ĉu per rekta linio, ĉu kalkuli kurson inter ilin uzante la elektitan profilon.
     Tuta kurso
     Sekva segmento
-    Por uzi tiun ĉi agordon, OsmAnd postulas ĝustigi vian kurson al vojoj sur la mapo.
+    Por uzi tiun ĉi agordon, OsmAnd postulas ĝustigi vian kurson al vojoj sur la mapo.
 \n
 \n Sekve vi devos elekti profilon de navigo (por trovi permesatajn vojojn) kaj sojlan distancon (por alproksimigi vian kurson al vojoj).
     Sojla distanco
     Profilo de navigo
-    Elektu dosieron de spuro al kiu nova segmento estos aldonita.
+    Elektu dosieron de spuro al kiu nova segmento estos aldonita.
     Strat-nivela fotaro
     Ĉu vi certe volas fermi planadon de kurso sen konservi\? Ĉiuj viaj ŝanĝoj perdiĝos.
     Kiam en inversa direkto
diff --git a/OsmAnd/res/values-es-rAR/phrases.xml b/OsmAnd/res/values-es-rAR/phrases.xml
index a90d059b97..e1839d42f2 100644
--- a/OsmAnd/res/values-es-rAR/phrases.xml
+++ b/OsmAnd/res/values-es-rAR/phrases.xml
@@ -3822,7 +3822,7 @@
     Nivel del agua: por encima del nivel medio del agua
     Nivel del agua: por debajo del nivel medio del agua
     Obstrucción
-    Recarga de agua potable: sí
+    
     Recarga de agua potable: no
     Red de recarga de agua potable
     Succión
@@ -3841,4 +3841,13 @@
     Municipio
     Flecha: no
     Ascensor
+    A horario
+    En tiempo real
+    Con retraso
+    
+    Tablero de partidas: no
+    Tablero de partidas
+    Recarga de agua potable
+    Pequeños electrodomésticos
+    Panal de abejas
 
\ No newline at end of file
diff --git a/OsmAnd/res/values-es-rAR/strings.xml b/OsmAnd/res/values-es-rAR/strings.xml
index 53987c3a28..6b55481e6e 100644
--- a/OsmAnd/res/values-es-rAR/strings.xml
+++ b/OsmAnd/res/values-es-rAR/strings.xml
@@ -2337,7 +2337,8 @@
 \n • Medio Oriente: **
 \n • África: **
 \n • Antártida: *
-\n ¡Más países alrededor del globo están disponibles para descargar! Desde Afganistán a Zimbabue, desde Australia a Estados Unidos. Argentina, Brasil, Canadá, Francia, Alemania, México, Reino Unido, España, …
+\n ¡Más países alrededor del globo están disponibles para descargar!
+\nDesde Afganistán a Zimbabue, desde Australia a Estados Unidos. Argentina, Brasil, Canadá, Francia, Alemania, México, Reino Unido, España, …
 \n
     OsmAnd+ (OSM Automated Navigation Directions, y en español, Guía de Navegación Automatizada de OSM) es una aplicación de mapa y navegación con acceso a los datos libres de OSM, en todo el mundo y de alta calidad. 
 \n Disfruta del navegador por voz y óptico, la visualización de PDI (puntos de interés), la creación y gestión de trazas GPX, utiliza la información de visualización y la altitud de las curvas de nivel (mediante un complemento), elige entre modos de automóvil, bicicleta o peatón, edita en OSM y mucho más. 
@@ -3776,7 +3777,7 @@
 \nPulsa en «%2$s», para borrar todos los datos relacionados con los radares de velocidad (alertas, notificaciones y PDI) hasta reinstalar OsmAnd completamente.
     Desinstalar radares de velocidad
     PDI de los radares de velocidad
-    Se debe reiniciar para borrar completamente los datos de los radares de velocidad.
+    Reiniciar la aplicación para borrar todos los datos de los radares de velocidad.
     Legal
     Mantener
     Desinstalar
@@ -3791,10 +3792,10 @@
     Límite de longitud
     Este dispositivo no tiene radares de velocidad.
     Patines en línea
-    Permite controlar el nivel de zoom del mapa con los botones de volumen del dispositivo.
+    Controla el nivel de zoom del mapa usando los botones de volumen del dispositivo.
     Botones de volumen como zoom
     Proporciona la longitud del vehículo, se pueden aplicar algunas restricciones de rutas para vehículos largos.
-    Borrar el siguiente punto de destino
+    Borrar el punto de destino más cercano
     Proporciona un nombre para el punto
     El punto de destino actual de la ruta será borrado. Si será el destino, la navegación se detendrá.
     Descargar datos de Wikipedia
@@ -3805,7 +3806,7 @@
     Go-kart
     Nota de OSM cerrada
     Silla de ruedas (hacia adelante)
-    Debes definir los días laborales para continuar
+    Definir los días laborales para continuar
     Ruta entre puntos
     Crear una ruta
     Añadir a una traza
@@ -3821,24 +3822,22 @@
     Importar traza
     Abrir traza existente
     Crear nueva ruta
-    Marca un archivo de traza para abrir.
+    Marcar un archivo de traza para abrir.
     Listo
     Sobrescribir traza
     Guardar como nueva traza
     Ruta inversa
-    Recalcular sólo el siguiente segmento usando el perfil elegido.
-    Recalcular toda la traza usando el perfil elegido.
-    Marca cómo conectar los puntos, con una línea recta o calcular una ruta entre ellos con el perfil elegido.
+    Recalcular sólo el siguiente segmento usando el perfil elegido.
+    Recalcular toda la traza usando el perfil elegido.
+    Marca cómo conectar los puntos, con una línea recta o calcular una ruta entre ellos como se detalla a continuación.
     Traza completa
     Siguiente segmento
-    Para utilizar esta opción, OsmAnd debe ajustar su traza a los caminos del mapa.
-\n
-\n En el siguiente paso se debe elegir el perfil de navegación para detectar los caminos permitidos y el umbral de distancia para aproximar la traza a los caminos.
+    A continuación, ajusta la traza al camino permitido más cercano con un perfil de navegación.
     Distancia de umbral
     Perfil de navegación
-    Elige un archivo de traza al que se añadirá un nuevo segmento.
+    Elige un archivo de traza al que se añadirá un nuevo segmento.
     Imágenes a nivel de calle
-    ¿Cerrar el plan de ruta sin guardar\? Se perderán todos los cambios.
+    ¿Cerrar el plan de ruta sin guardar\?, se descartarán todos los cambios.
     En caso de dirección inversa
     Grabar la traza automáticamente al navegar
     Trazas
@@ -3856,7 +3855,7 @@
     Guardar como archivo de traza
     Seguir traza
     Elige el archivo de la traza a seguir
-    Elige el archivo de la traza a seguir o importa una.
+    Elige el archivo de la traza a seguir o impórtala desde el dispositivo.
     Elegir otra traza
     Navegar desde mi ubicación a la traza
     Punto de la traza para navegar
@@ -3872,7 +3871,7 @@
     Cambiar el tipo de ruta posterior
     Traza simplificada
     Nombre del archivo
-    GRABAR
+    Grabar
     La grabación de la traza se pausará al cerrar la aplicación (mediante aplicaciones recientes). (La indicación de fondo de OsmAnd, desaparecerá de la barra de notificaciones de Android.)
     Intervalo de registro para la grabación general de trazas (activar mediante el widget de grabación de viaje sobre el mapa).
     Pausar grabación del viaje
@@ -3890,4 +3889,19 @@
     %s archivo(s) de trazas marcado(s)
     Añade al menos dos puntos.
     Rehacer
+    • Se ha actualizado la función «Planificar ruta»: permite utilizar diferentes tipos de navegación por segmento y la inclusión de trazas
+\n
+\n • Nuevo menú con el aspecto de las trazas: elegir el color, el grosor, mostrar las flechas de dirección y los iconos de inicio/fin.
+\n
+\n • Mejoras en la visibilidad de los nodos de bicicleta.
+\n
+\n • Las trazas ahora se pueden pulsar, contiene un menú contextual con información básica.
+\n
+\n • Algoritmos de búsqueda mejorados
+\n
+\n • Mejoras en las opciones de seguimiento de la navegación
+\n
+\n • Se han solucionado los problemas de la importación y exportación en los ajustes de los perfiles
+\n
+\n
 
\ No newline at end of file
diff --git a/OsmAnd/res/values-es-rUS/phrases.xml b/OsmAnd/res/values-es-rUS/phrases.xml
index b59c0ec06b..d12ccb5eef 100644
--- a/OsmAnd/res/values-es-rUS/phrases.xml
+++ b/OsmAnd/res/values-es-rUS/phrases.xml
@@ -333,7 +333,7 @@
     Doctor
     Clínica
     Primeros auxilios
-    Dentista;Odontólogo
+    Dentista;Odontología
     Asilo de ancianos;Geriátrico
     Escotilla de bebé
     Veterinaria
@@ -2309,7 +2309,7 @@
     Cirugía maxilofacial
     Radiología diagnóstica
     Gastroenterología
-    Odontología
+    Dentista;Odontología
     Nefrología (enfermedades renales)
     Neurocirugía
     Neuropsiquiatría
@@ -3822,7 +3822,7 @@
     Nivel del agua: por encima del nivel medio del agua
     Nivel del agua: por debajo del nivel medio del agua
     Obstrucción
-    Recarga de agua potable: sí
+    
     Recarga de agua potable: no
     Red de recarga de agua potable
     Succión
@@ -3841,4 +3841,12 @@
     Municipio
     Ascensor
     Flecha: no
+    Pequeños electrodomésticos
+    Recarga de agua potable
+    
+    A horario
+    En tiempo real
+    Tablero de partidas: no
+    Con retraso
+    Tablero de partidas
 
\ No newline at end of file
diff --git a/OsmAnd/res/values-es-rUS/strings.xml b/OsmAnd/res/values-es-rUS/strings.xml
index 608cb6e866..bb6fe37c9e 100644
--- a/OsmAnd/res/values-es-rUS/strings.xml
+++ b/OsmAnd/res/values-es-rUS/strings.xml
@@ -2014,7 +2014,7 @@
     Necesario para descargar mapas.
     Buscando la ubicación…
     Espacio libre
-    Almacenamiento de datos de OsmAnd (para mapas, archivos GPX, etc.): %1$s.
+    Almacenamiento de datos de OsmAnd (para mapas, archivos de trazas, etc.): %1$s.
     Conceder permiso
     Permitir el acceso a la ubicación
     Obtén direcciones y descubre sitios nuevos sin una conexión a Internet
@@ -2066,8 +2066,8 @@
     Activar la grabación rápida
     Muestra una notificación del sistema que permite iniciar la grabación del viaje.
     Notificaciones
-    Sin archivos GPX aún
-    También puedes añadir archivos GPX a la carpeta
+    Sin archivos de trazas aún
+    También puedes añadir archivos de trazas a la carpeta
     Añadir GPX
     Aspecto
     Muy fino
@@ -2337,7 +2337,8 @@
 \n • Medio Oriente: **
 \n • África: **
 \n • Antártida: *
-\n ¡Más países alrededor del globo están disponibles para descargar! Desde Afganistán a Zimbabue, desde Australia a Estados Unidos. Argentina, Brasil, Canadá, Francia, Alemania, México, Reino Unido, España, …
+\n ¡Más países alrededor del globo están disponibles para descargar!
+\nDesde Afganistán a Zimbabue, desde Australia a Estados Unidos. Argentina, Brasil, Canadá, Francia, Alemania, México, Reino Unido, España, …
 \n
     OsmAnd+ (OSM Automated Navigation Directions, y en español, Guía de Navegación Automatizada de OSM) es una aplicación de mapa y navegación con acceso a los datos libres de OSM, en todo el mundo y de alta calidad. 
 \n Disfruta del navegador por voz y óptico, la visualización de PDI (puntos de interés), la creación y gestión de trazas GPX, utiliza la información de visualización y la altitud de las curvas de nivel (mediante un complemento), elige entre modos de automóvil, bicicleta o peatón, edita en OSM y mucho más. 
@@ -2625,7 +2626,7 @@
     Archivo GPX con coordenadas y datos de todas las notas.
     Acciones
     Marcador
-    \'%1$s ediciones, suman %2$s mBTC\'
+    %1$s ediciones, suman %2$s mBTC
     Destinatarios de OSM
     Total de donaciones
     Sin nombre
@@ -2897,10 +2898,10 @@
     Tipos de caminos
     Bajar en
     Esperar en la parada
-    Mostrar u ocultar trazas GPX
-    Un botón que muestra u oculta las trazas GPX elegidas en el mapa.
-    Ocultar trazas GPX
-    Mostrar trazas GPX
+    Mostrar u ocultar trazas
+    Un botón que muestra u oculta las trazas elegidas en el mapa.
+    Ocultar trazas
+    Mostrar trazas
     • Nueva pantalla «Direcciones»: Muestra los botones de destino «Casa» y «Trabajo», el atajo de la «ruta anterior», la lista de trazas, marcadores GPX activos y el historial de búsqueda.
 \n
 \n • Información adicional en «Detalles de la ruta»: Tipos de caminos, superficie, pendiente y suavidad
@@ -3782,17 +3783,17 @@
     Un botón que alterna la capa de Mapillary en el mapa.
     Rumbo
     %1$s borrado
-    Se debe reiniciar para borrar completamente los datos de los radares de velocidad.
+    Reiniciar la aplicación para borrar todos los datos de los radares de velocidad.
     Desinstalar y reiniciar
     Indica la longitud permitida del vehículo en rutas.
     Límite de longitud
     Este dispositivo no tiene radares de velocidad.
     Patines en línea
-    Permite controlar el nivel de zoom del mapa con los botones de volumen del dispositivo.
+    Controla el nivel de zoom del mapa usando los botones de volumen del dispositivo.
     Botones de volumen como zoom
     Descargar datos de Wikipedia
     El punto de destino actual de la ruta será borrado. Si será el destino, la navegación se detendrá.
-    Borrar el siguiente punto de destino
+    Borrar el punto de destino más cercano
     Obtén información sobre los puntos de interés de Wikipedia. Es tu guía de bolsillo sin conexión - sólo activa el complemento de Wikipedia y disfruta los artículos sobre los objetos de alrededor.
     Proporciona un nombre para el punto
     Proporciona la longitud del vehículo, se pueden aplicar algunas restricciones de rutas para vehículos largos.
@@ -3801,7 +3802,7 @@
     Mostrar los iconos de inicio y fin
     Sólido
     Personalizado
-    Debes definir los días laborales para continuar
+    Definir los días laborales para continuar
     Elegir la anchura
     Ruta entre puntos
     Crear una ruta
@@ -3834,23 +3835,21 @@
     Grabar la traza automáticamente al navegar
     Intervalo de registro para la grabación general de trazas (activar mediante el widget de grabación de viaje sobre el mapa).
     Guardar como nueva traza
-    Recalcular toda la traza usando el perfil elegido.
-    Para utilizar esta opción, OsmAnd debe ajustar su traza a los caminos del mapa.
-\n
-\n En el siguiente paso se debe elegir el perfil de navegación para detectar los caminos permitidos y el umbral de distancia para aproximar la traza a los caminos.
-    Recalcular sólo el siguiente segmento usando el perfil elegido.
-    Marca cómo conectar los puntos, con una línea recta o calcular una ruta entre ellos con el perfil elegido.
-    Elige un archivo de traza al que se añadirá un nuevo segmento.
+    Recalcular toda la traza usando el perfil elegido.
+    A continuación, ajusta la traza al camino permitido más cercano con un perfil de navegación.
+    Recalcular sólo el siguiente segmento usando el perfil elegido.
+    Marca cómo conectar los puntos, con una línea recta o calcular una ruta entre ellos con el perfil elegido.
+    Elige un archivo de traza al que se añadirá un nuevo segmento.
     Ruta inversa
     Añadir punto de referencia de la traza
     Segmento anterior
     Recortar antes
     Recortar después
-    Marca un archivo de traza para abrir.
+    Marcar un archivo de traza para abrir.
     Abrir traza existente
     Última edición
     Importar traza
-    ¿Cerrar el plan de ruta sin guardar\? Se perderán todos los cambios.
+    ¿Cerrar el plan de ruta sin guardar\?, se descartarán todos los cambios.
     Crear nueva ruta
     Cambiar el tipo de ruta anterior
     Cambiar el tipo de ruta posterior
@@ -3863,12 +3862,12 @@
     Punto más cercano
     Perfil de navegación
     Navegar desde mi ubicación a la traza
-    GRABAR
+    Grabar
     Guardar como archivo de traza
     Grabación del viaje
     Trazas
     En caso de dirección inversa
-    Elige el archivo de la traza a seguir o importa una.
+    Elige el archivo de la traza a seguir o impórtala desde el dispositivo.
     Pausar grabación del viaje
     Reanudar grabación del viaje
     Elige el archivo de la traza a seguir
@@ -3886,4 +3885,20 @@
     Añadir a un archivo de trazas
     Añadir dirección
     Ingresar dirección
+    Rehacer
+    • Se ha actualizado el modo «Planificar ruta»: ahora permite usar diferentes tipos de navegación para cada segmento y adjunta cualquier traza a los caminos
+\n
+\n • Nuevas opciones en el aspecto de las trazas: elegir el color, cambiar el grosor de las flechas de dirección y las marcas de inicio/fin.
+\n
+\n • Mejoras en la visibilidad de los nodos de bicicleta
+\n
+\n • Menú contextual con información básica para las trazas
+\n
+\n • Algoritmos de búsqueda mejorados
+\n
+\n • Mejoras en las opciones de seguimiento de la navegación
+\n
+\n • Se han solucionado los problemas de la importación y exportación en los ajustes de los perfiles
+\n
+\n
 
\ No newline at end of file
diff --git a/OsmAnd/res/values-et/phrases.xml b/OsmAnd/res/values-et/phrases.xml
index 629a0b4e08..226d25f3ad 100644
--- a/OsmAnd/res/values-et/phrases.xml
+++ b/OsmAnd/res/values-et/phrases.xml
@@ -3792,7 +3792,7 @@
     SMS
     Joogivee täitmise võrgustik
     Joogivee täitmine: ei
-    Joogivee täitmine: jah
+    Jah
     Takistus
     Veetase: alla keskmise veetaseme
     Veetase: üle keskmise veetaseme
@@ -3816,4 +3816,13 @@
     Surve
     Nool: ei
     Lift
+    Sõiduplaan
+    Reaalajas
+    Viivitus
+    Jah
+    Väljuvate reiside tabloo: ei
+    Väljuvate reiside tabloo
+    Joogivee täitmine
+    Väikesed elektriseadmed
+    Mesitaru
 
\ No newline at end of file
diff --git a/OsmAnd/res/values-et/strings.xml b/OsmAnd/res/values-et/strings.xml
index a879df55f8..2c829dcfd0 100644
--- a/OsmAnd/res/values-et/strings.xml
+++ b/OsmAnd/res/values-et/strings.xml
@@ -166,7 +166,7 @@
     Näita OSM märkmed
     Peida OSM Notes
     Täname sind tagasiside eest
-    Punkti või teed ei leitud.
+    Sõlme või teed ei leidunud.
     Otsingutulemused puuduvad\?
 \nJaga tagasisidet
     Laienda otsingu raadiust kuni %1$s
@@ -601,10 +601,10 @@
     Pöörangupõhine
     Välju
     Sisene peatuses
-    Kuva/peida GPX rajad
-    Nupp valitud GPX radade kaardil kuvamiseks või peitmiseks.
-    Peida GPX rajad
-    Kuva GPX rajad
+    Kuva/peida rajad
+    Nupp valitud radade kaardil kuvamiseks või peitmiseks.
+    Peida rajad
+    Kuva rajad
     Palun määra esmalt sihtkoht
     Luba ühistransport OsmAnd Live muudatustele.
     OsmAnd Live ühistransport
@@ -891,7 +891,7 @@
     Hoiatused kuvatakse navigeerimise ajal all vasakul.
     Vaheta profiili
     Keel ja väljund
-    Taasta vaikeseaded
+    Taasta algväärtused
     Loo, impordi, muuda profiile
     Halda rakenduse profiile…
     Jõus kogu rakenduses
@@ -2673,7 +2673,7 @@
     Laiuspiirang
     Määra teedel lubatud sõiduki laius.
     Simuleeri oma asukohta kasutades salvestatud GPX rada.
-    Nupp ekraani keskkoha lähtekohaks muutmiseks ja sihtkohta teekonna arvutamiseks või sihtkoha valimise dialoogi avamiseks kui sihtkoha marker puudub kaardil.
+    Nupp ekraani keskkoha lähtekohaks muutmiseks. Seejärel on kas võimalik valida sihtkohta või alustada teekonna arvutamist.
     See lisa aktiveerib radade salvestamise funktsionaalsuse, puudutades käsitsi kaardil GPX logimisvidinat või logides automaatselt kõik oma navigeerimise marsruudid GPX faili.
 \n
 \nSalvestatud radu saab jagada oma sõpradega või kasutada OSM kaastöödeks. Sportlased saavad kasutada salvestatud radu oma treeningute jälgimiseks. Mõningast raja põhianalüüsi saab teha otse OsmAnd sees, näiteks ringiajad, keskmine kiirus jne. Lisaks muidugi saab radu hiljem analüüsia ka spetsiaalsetete 3. osapoolte analüüsitööriistadega.
@@ -2706,7 +2706,7 @@
     Võimaldab registreerida oma auto parkimiskoha ja jälgida järelejäänud parkimisaega.
 \nNii asukoht kui aeg on nähtavad nii OsmAnd armatuurlaual kui kaardi vidinas. Meeldetuletust saab lisada Androidi kalendrisse.
     Muuda kauguse mõõtmise ühikuid.
-    See lisa annab kaardi vidina, mis võimaldab teekondade loomist kaarti koputades või olemasolevaid GPX-faile kasutades, et reise kavandada ja punktide vahelist kaugust mõõta. Tulemusi saab salvestada GPX-failina, mida saab hiljem juhendamiseks kasutada.
+    Selleks, et reise kavandada ja punktide vahelist kaugust mõõta, loo teekondi kaardil koputades või olemasolevaid GPX-faile kasutades, Tulemusi saad salvestada GPX-failina, mida on hiljem võimalik juhendamiseks kasutada.
     See lisa teeb seadme erivajadusega kasutajatele mõeldud funktsioonid otse OsmAndis kättesaadavaks. See lihtsustab nt. kõnesünteesi häälte kõnekiiruse reguleerimist, ekraanil navigeerimise suuna seadistamist, rulliku kasutamist suurenduse juhtimiseks või kõnesünteesi tagasisidet, näiteks oma asukoha automaatseks teatamiseks.
     See lisa võimaldab OsmAnd abil OSM kaastöid teha, näiteks OSM huvipunkte luua või muuta, OSM märkmeid avada või kommenteerida ning salvestatud GPX faile lisada. OSM on kogukonna juhitud globaalne üldkasutatav kaardistamisprojekt. Üksikasju leiad https://openstreetmap.org. Aktiivset osalemist hinnatakse ja panust saab teha otse OsmAnd rakendusest, kui seadistada rakenduses oma isiklikud OSM kasutajatunnused.
     See lisa kuvab arendus- ja silumisfunktsioonide sätteid nagu teekonna arvutamine, renderdamise jõudlus või hääljuhiste testimine ja simuleerimine. Need seaded on mõeldud arendajatele ja pole tavakasutaja jaoks vajalikud.
@@ -3495,7 +3495,7 @@
     Aragoni
     Lombardi
     Kohandatud värv
-    Jätkamiseks pead valima tööpäevad
+    Jätkamiseks vali tööpäevad
     Teekond punktide vahel
     Kavanda teekonda
     Lisa rajale
@@ -3552,8 +3552,8 @@
     Nupp, mis näitab või peidab kaardil Mapillary kihti.
     Eemalda ja taaskäivita
     Rulluisud
-    Kustuta järgmine sihtpunkt
-    Sisselülitades saad seadme helitugevuse nuppudega kontrollida kaardi suumi taset.
+    Kustuta lähim sihtpunkt
+    Nutiseadme helitugevuse nuppudega kontrollida saad kaardi suumi taset.
     Helitugevuse nupud toimivad suumina
     Palun sisestage punkti nimi
     Lae alla Vikipeedia kaardid
@@ -3582,7 +3582,7 @@
     Pikkuse piirang
     Kurss
     %1$s on kustutatud
-    Selleks, et eemaldada kõik kiiruskaamerate andmed on vajalik seadme taaskäivitamine.
+    Kiiruskaamerate kõikide andmete eemaldamiseks on vajalik nutiseadme taaskäivitamine.
     Siin seadmes puudub teave liikluskaamerate kohta.
     Lisa profiil
     Muuda rakenduse profiili
@@ -3644,9 +3644,9 @@
     Terve rada
     Järgmine segment
     Navigeerimisprofiil
-    Vali rajafail, millele lisame uue segmendi.
+    Vali rajafail, millele lisame uue segmendi.
     Tänavataseme vaated
-    Kas sa oled kindel et soovid sulgeda teekonna planeerija ilma seda salvestamata\? Kõik muudatused lähevad kaotsi.
+    Kas sa oled kindel et soovid sulgeda teekonna planeerija ilma seda salvestamata\?
     Vastupidise suuna korral
     Muuda järjekorda või peida kirjed %1$s\'st.
     Need kirjed on menüüs peidetuna, kuid tehtud valikud või lisaprogrammid on jätkuvalt kasutatavad.
@@ -3662,7 +3662,7 @@
     „Lähtesta vaikeseadeteks“ taastab paigaldusjärgse vaikimisi sortimisjärjekorra.
     Lisaprogramm arendajale
     Toiming %1$s ei ole toetatud
-    Terve rada arvutatakse valitud profiili abil uuesti.
+    Terve rada arvutatakse valitud profiili abil uuesti.
     Salvesta uue rajana
     Kirjuta rada üle
     Veebipõhine OSM kaartide klassifikatsioon piltidega.
@@ -3682,7 +3682,7 @@
     Salvesta rada failina
     Jälgi rada
     Vali rajafail, mida soovid kasutada
-    Vali rajafail, mida soovid kasutada või impordi see.
+    Vali rajafail, mida soovid kasutada või impordi see oma nutiseadmest.
     Vali muu rada
     Navigeeri minu asukohast rajale
     Asukoht rajal, kuhu me liigume
@@ -3712,4 +3712,45 @@
     Läve kaugus
     Palun lisa vähemalt kaks punkti.
     Korda tegevust
+    Järjesta kategooriad ümber
+    Visualiseerimise stiil
+    Mõnedes riikides või piirkondades on kiiruskaamerate eest hoiatavad rakendused seadusega keelatud,
+\n
+\nVastavalt oma maa seadustele pead sa otsuse tegema.
+\n
+\nValides %1$s sa saad kiiruskaamerate-kohaseid teateid ja hoiatusi.
+\n 
+\nValides %s$s kustutatakse kõik kiiruskaameratega seotud andmed, nagu hoiatused, teated ja huvipunktid seniks, kuni sa OsmAnd\'ile ei tee täiesti uut paigaldust.
+    Praegune teekonna vahepunkt saab kustutatud. Kui ta osutub sihtkohaks, siis navigatsioon lõppeb.
+    Muuda teekonna tüüpi pärast
+    Muuda teekonna tüüpi enne
+    Kärbi pärast
+    Kärbi enne
+    Kinnita teede külge
+    Selle valiku kasutamiseks mõne oma navigeerimisprofiili kasutamisel kinnita oma rada lähimale lubatud teele.
+    Valitud profiili alusel arvutatakse uus teekond vaid järgmise segmendi osas.
+    Põhitegevused
+    Ostu kinnitusel võetakse sinu Google Play kontolt tasu.
+\n
+\nTellimus uuendatakse automaatselt, kui sa seda enne uuendamise kuupäeva ei tühista. Sonu kontolt võetakse pikendamisperioodi eest (kuu/kolm kuud/aasta) tasu ainult uuendamise kuupäeval.
+\n
+\nTellimuste haldamiseks ja tühistamiseks ava Google Play seadistused.
+    Kiirtegevusi saad eksportida või importida koos rakenduse profiilidega.
+    Kas sa oled kindel, et soovid pöördumatult kustutada %d kiirtegevust\?
+    Vali kas soovid ühendada punkte sirge joonega või arvutada nendevahelist teekonda vastavalt oma valitud profiilile.
+    • Uuendatud teekonnaplaneerija: võimaldab kasutada igal segmendil erinevat liikumisviisi ning radade kaasamist
+\n
+\n • Uus radade kujunduse seadistamise menüü: valida saad värve, joone paksust, suunanoolte kuvamist ning alguse ja lõpu ikoone
+\n
+\n • Rattasõlmede parandatud nähtavus
+\n
+\n • Radasid saad nüüd puudutada, misjärel kuvatakse põhiteabega kontekstimenüü
+\n
+\n • Parandatud on otsingualgoritme
+\n
+\n • Parandatud raja jälgimise valikud navigeerimisel
+\n
+\n • Parandatud on profiili seadistuste impordi ja ekspordiga seotud vead
+\n
+\n
 
\ No newline at end of file
diff --git a/OsmAnd/res/values-eu/strings.xml b/OsmAnd/res/values-eu/strings.xml
index bd2cfbcd31..abd30d80ff 100644
--- a/OsmAnd/res/values-eu/strings.xml
+++ b/OsmAnd/res/values-eu/strings.xml
@@ -3781,7 +3781,7 @@ Area honi dagokio: %1$s x %2$s
     Norabideko geziak
     Sortu ibilbide berria
     Distantzia margena
-    Aukera hau erabiltzeko OsmAnd-ek zure arrastoak mapako errepideetara atxiki behar ditu.
+    Aukera hau erabiltzeko OsmAnd-ek zure arrastoak mapako errepideetara atxiki behar ditu.
 \n
 \nHurrengo urratsean, nabigazio profila hautatu beharko duzu baimendutako errepideak eta zure arrastoa errepideetara hurbiltzeko distantzia tartea atzemateko.
     Editatutako azkena
@@ -3791,12 +3791,12 @@ Area honi dagokio: %1$s x %2$s
     Gainidatzi arrastoa
     Gorde arrasto berri gisa
     Alderantzizko ibilbidea
-    Arrasto osoa birkalkulatuko da hautatutako profilaren bidez.
-    Bakarrik hurrengo segmentua birkalkulatuko da hautatutako profilaren bidez.
-    Hautatu nola konektatu puntuak, lerro zuzen batez, edo kalkulatu horien arteko ibilbidea hautatutako profilarekin.
+    Arrasto osoa birkalkulatuko da hautatutako profilaren bidez.
+    Bakarrik hurrengo segmentua birkalkulatuko da hautatutako profilaren bidez.
+    Hautatu nola konektatu puntuak, lerro zuzen batez, edo kalkulatu horien arteko ibilbidea hautatutako profilarekin.
     Arrasto osoa
     Hurrengo segmentua
     Nabigazio profila
-    Hautatu zein arrasto fitxategiari gehituko zaion segmentu berria.
+    Hautatu zein arrasto fitxategiari gehituko zaion segmentu berria.
     Ezarri behar dituzu lanegunak jarraitzeko
 
\ No newline at end of file
diff --git a/OsmAnd/res/values-fa/strings.xml b/OsmAnd/res/values-fa/strings.xml
index 14fd623bee..dec0c68cd6 100644
--- a/OsmAnd/res/values-fa/strings.xml
+++ b/OsmAnd/res/values-fa/strings.xml
@@ -3843,4 +3843,23 @@
     یک فایل رد انتخاب کنید تا باز شود.
     تمام
     بَرنویسی رد
+    بازکردن رد ذخیره‌شده
+    ذخیره شد
+    لطفاً حداقل دو نقطه اضافه کنید.
+    ازنو
+    • قابلیت «طرح‌ریزی مسیر» روزآمد شد: امکان استفاده از شیوهٔ ناوبری متفاوت برای هر پاره از مسیر و در کار آوردن ردها اضافه شده است.
+\n
+\n• منوی جدید «ظاهر» برای ردها: رنگ و ضخامت را مشخص کنید، فلش‌های جهت‌نما و نمادهای آغاز/پایان را نمایش دهید.
+\n
+\n• پدیداری گره‌های شبکهٔ دوچرخه بهبود یافته است.
+\n
+\n• اکنون می‌توان ردها را لمس کرد و منوی زمینه با اطلاعات پایه را مشاهده کرد.
+\n
+\n• الگوریتم «جستجو» بهبود یافته است.
+\n
+\n• گزینه‌های «دنبال‌کردن رد» در ناوبری بهبود یافته است.
+\n
+\n• مشکلاتی مربوط به درون‌برد/برون‌برد تنظیمات پروفایل برطرف شده است.
+\n
+\n
 
\ No newline at end of file
diff --git a/OsmAnd/res/values-fi/strings.xml b/OsmAnd/res/values-fi/strings.xml
index 734015792a..c848f4392b 100644
--- a/OsmAnd/res/values-fi/strings.xml
+++ b/OsmAnd/res/values-fi/strings.xml
@@ -2543,5 +2543,21 @@ Jos pidät OsmAndista ja OSMsta ja haluat tukea niitä, on tämä täydellinen t
     OsmAnd + mapillary
     Pikatoiminto
     Sädeviivain
-    Toimintoa ei tuettu %1$s
+    Ei tuettu toiminto %1$s
+    Matkailu (Wikivoyage ja Wikipedia)
+    "Valitse reitti tiedosto "
+    Lisäkarttoja tarvitaan Wikipedian erikoiskohteiden tarkastelemiseen kartalla.
+    Valitse kielet, joilla Wikipedia-artikkelit näkyvät kartalla. Voit vaihtaa kaikkien käytettävissä olevien kielten välillä lukiessasi artikkelia.
+    Jotkut Wikipedia-artikkelit eivät välttämättä ole saatavilla omalla kielelläsi.
+    Kantoninkiina
+    uzbekki
+    tataari
+    skotti
+    nepali
+    Etsi POI-tyyppejä
+    Muokattu OsmAnd-laajennus
+    Muutokset lisätty \'%1$s\' profiiliin.
+    Ei voitu lukea \'%1$s\'.
+    Ei voitu kirjoittaa \'%1$s\'.
+    Ei voitu tuoda kohteesta \'%1$s\'.
 
\ No newline at end of file
diff --git a/OsmAnd/res/values-fr/strings.xml b/OsmAnd/res/values-fr/strings.xml
index f1540493df..b116563f71 100644
--- a/OsmAnd/res/values-fr/strings.xml
+++ b/OsmAnd/res/values-fr/strings.xml
@@ -3231,7 +3231,7 @@
     Apparence de la carte
     Apparence de la carte
     Thème de l\'application, unités, région
-    Restaurer les valeurs par défaut
+    Rétablir les paramètres par défaut
     Alertes visuelles
     Définir les paramètres de l\'itinéraire
     Paramètres de l\'itinéraire
@@ -3755,7 +3755,7 @@
 \n
 \nSélectionnez %2$s. Toutes les données relatives aux radars (alertes, notifications, PI) seront supprimées.
     Garder actif
-    Un redémarrage est nécessaire pour supprimer complètement les données des radars.
+    Redémarrez l\'application pour supprimer les données radars.
     Désinstaller les radars
     Légal
     PI radars
@@ -3769,12 +3769,12 @@
     Cet appareil n\'a pas de radars.
     Patins à roulettes en ligne
     Zoomer avec les boutons de volume
-    Activer pour contrôler le niveau de zoom de la carte avec les boutons de réglage du volume sonore.
+    Contrôler le niveau de zoom de la carte avec les boutons de réglage du volume sonore.
     Le prochain point sur la route va être supprimé. S\'il s\'agit de la destination finale, la navigation s\'arrêtera.
     Indiquez la longueur de votre véhicule, certaines restrictions d\'itinéraire peuvent s\'appliquer aux véhicules longs.
     Supprimer le prochain point
     Merci de renseigner un nom pour le point
-    Utilisez un guide de poche hors ligne grâce à Wikipédia. Activez le plugin Wikipédia : des points d\'intérêt seront affichés, ils vous permettrons d\'obtenir des informations sur les lieux qui vous entourent.
+    Utilisez le guide Wikipédia hors ligne. Activez le plugin Wikipédia : des points d\'intérêt seront affichés, ils vous permettrons d\'obtenir des informations sur les lieux qui vous entourent.
     Télécharger les cartes Wikipédia
     Scooter
     Moto enduro
@@ -3782,7 +3782,7 @@
     Note OSM fermée
     Fauteuil roulant
     Fauteuil roulant vers l\'avant
-    Vous devez définir les jours travaillés avant de poursuivre
+    Définissez les jours travaillés pour continuer
     Itinéraire entre points
     Planifier un itinéraire
     Ajouter à une trace
@@ -3801,13 +3801,11 @@
     Sélectionnez un fichier de trace à ouvrir.
     Terminé
     Remplacer la trace
-    Sélectionnez comment relier les points : par une ligne droite ou en calculant un itinéraire avec le profil sélectionné.
-    Toute la trace sera recalculée en utilisant le profil sélectionné.
-    Seul le prochain segment sera recalculé en utilisant le profil sélectionné.
-    Pour utiliser cette option, OsmAnd doit aligner votre trace sur les routes de la carte.
-\n
-\n À l\'étape suivante, vous devrez sélectionner le profil de navigation pour détecter les routes autorisées et le seuil de distance pour rapprocher votre trace des routes.
-    Sélectionnez un fichier de trace auquel ajouter un nouveau segment.
+    Sélectionnez comment relier les points : par une ligne droite ou en calculant un itinéraire reliant les points comme indiqué ci-dessous.
+    Toute la trace sera recalculée en utilisant le profil sélectionné.
+    Seul le prochain segment sera recalculé en utilisant le profil sélectionné.
+    Ensuite, sélectionnez le profil de navigation pour détecter les routes autorisées et le seuil de distance afin de déplacer votre trace.
+    Sélectionnez un fichier de trace auquel ajouter un nouveau segment.
     Enregistrer comme nouvelle trace
     Inverser l\'itinéraire
     Trace entière
@@ -3815,7 +3813,7 @@
     Seuil de distance
     Profil de navigation
     Photos des rues
-    Voulez-vous vraiment fermer l\'itinéraire planifié sans enregistrer \? Vous perdrez toutes les modifications.
+    Voulez-vous vraiment fermer l\'itinéraire planifié sans enregistrer \? (vous perdrez vos modifications)
     Si inversion du sens
     Point de la trace vers lequel naviguer
     Enregistrer le parcours
@@ -3831,14 +3829,14 @@
     Traces
     Traces
     Traces
-    REC
+    ENR
     Enregistrer le parcours dans un fichier GPX
     Enregistrement du parcours
     Enregistrer comme fichier de trace
     Suivre la trace
     Sélectionner un fichier de trace à suivre
     Sélectionner une autre trace
-    Naviguez de ma position vers la trace
+    Naviguer de ma position vers la trace
     Point le plus proche
     Supprimer l\'adresse
     Ajouter une adresse
@@ -3850,9 +3848,36 @@
     Ouvrir une trace enregistrée
     a été enregistré
     Veuillez ajouter au moins deux points.
-    Sélectionnez le fichier de trace à suivre ou importez-en un.
+    Sélectionnez le fichier de trace à suivre ou importez-le depuis votre appareil.
     Reprendre l\'enregistrement du trajet
     Suspendre l\'enregistrement du trajet
     Définit la fréquence d’enregistrement du parcours (enregistrement activé depuis le gadget sur la carte).
     Suspend l\'enregistrement du parcours lorsque l\'application est arrêtée via Applications récentes ; les indications OsmAnd ne seront plus affichées dans la barre de notifications.
+    Tous les segments suivants seront recalculés avec le profil sélectionné.
+    Tous les segments précédents seront recalculés avec le profil sélectionné.
+    Tous les segments suivants
+    Segment précédent
+    Tous les segments précédents
+    Seul le segment sélectionné sera recalculé avec le profil sélectionné.
+    • Mise à jour du mode de planification d\'itinéraire autorisant différents types de navigation pour chaque segment et permettant de déplacer n\'importe quelle trace sur les routes
+\n
+\n• Nouvelles options pour l\'apparence des traces : choix de la couleur et de l\'épaisseur des flèches de direction et affichage des marques de départ et d\'arrivée
+\n
+\n• Amélioration de \"bicycle nodes visibility\"
+\n
+\n• Nouveau menu contextuel pour les traces affichant des informations basiques
+\n
+\n• Amélioration de l\'algorithme de recherche
+\n
+\n• Amélioration du suivi des traces lors de la Navigation
+\n
+\n• Correction de l\'import / export des profils
+\n
+\n
+    Couper avant
+    Couper après
+    Modifier le type d’itinéraire avant
+    Modifier le type d’itinéraire après
+    Seule la ligne d\'itinéraire sera enregistrée, les points de passage seront supprimés.
+    Rétablir
 
\ No newline at end of file
diff --git a/OsmAnd/res/values-gl/strings.xml b/OsmAnd/res/values-gl/strings.xml
index 283c4ba01c..9b411b0d7f 100644
--- a/OsmAnd/res/values-gl/strings.xml
+++ b/OsmAnd/res/values-gl/strings.xml
@@ -3839,4 +3839,17 @@ Lon %2$s
     Personalizado
     Frechas de dirección
     Sólido
+    Deter a gravación da viaxe
+    Retomar a gravación da viaxe
+    Predefinido do sistema
+    Todos os segmentos seguintes
+    Segmento anterior
+    Todos os segmentos anteriores
+    Só o segmento marcado será recalculado empregando o perfil escollido.
+    Todos os segmentos seguintes serán recalculados empregando o perfil escollido.
+    Todos os segmentos anteriores serán recalculados empregando o perfil escollido.
+    Abrir pista gardada
+    está gardado
+    Engade polo menos dous puntos.
+    Refacer
 
\ No newline at end of file
diff --git a/OsmAnd/res/values-hu/phrases.xml b/OsmAnd/res/values-hu/phrases.xml
index 320b77276e..891959e0b0 100644
--- a/OsmAnd/res/values-hu/phrases.xml
+++ b/OsmAnd/res/values-hu/phrases.xml
@@ -1863,7 +1863,7 @@
     Cserkésztáborhely
     Nomád
     Típus
-    Autós
+    Autós (drive-in)
     Szolgáltatás
     Típus
     Elfogadott hulladék
@@ -3050,7 +3050,7 @@
     Dagadóláp (palsa-láp)
     Avgas 100LL repülőbenzin
     Jet A-1 kerozin
-    AdBlue adalékanyag
+    Diesel kipufogó-folyadék
     Szolgáltatóközpont hátrányos helyzetűeknek
     Erődítmény típusa: földsánc
     Erődítmény típusa: újkőkori körárok
@@ -3797,7 +3797,7 @@
     Bowling
     Biztonságtechnikai szaküzlet
     Hegyimentő
-    Nincs
+    Van
     Van
     Rezgés nincs
     Adománygyűjtő doboz
@@ -3808,7 +3808,7 @@
     Cső
     Ivóvíz-utántöltő hálózat
     Ivóvíz-utántöltés nincs
-    Ivóvíz-utántöltés
+    van
     Vízszint: közepes vízszint alatt
     Vízszint: közepes vízszint fölött
     Vízszint: lebegő
@@ -3821,4 +3821,16 @@
     Félrevezető
     Véletlenül használható más elemek
     Kontrasztos színű
+    Menetrend
+    Valós idejű
+    Késés
+    van
+    Indulásiidő-kijelző nincs
+    Lift
+    Nyíl nincs
+    Szivattyú állapota: hiányzik a kar
+    Szívás
+    Kis elektronikus készülékek
+    Indulásiidő-kijelző
+    Ivóvíz-utántöltés
 
\ No newline at end of file
diff --git a/OsmAnd/res/values-hu/strings.xml b/OsmAnd/res/values-hu/strings.xml
index 8d3b6bc0eb..4c6a6e4877 100644
--- a/OsmAnd/res/values-hu/strings.xml
+++ b/OsmAnd/res/values-hu/strings.xml
@@ -134,11 +134,11 @@
     Térképforrás beállítások
     Vektoros térkép beállítások
     Biztosan törli: %1$s\?
-    településrész
-    falucska
-    község
-    város
-    város
+    Településrész
+    Falucska
+    Község
+    Kisváros
+    Város
     Szimuláció leállítása
     Szimuláció indítása
     Nem sikerült átnevezni a fájlt.
@@ -350,7 +350,7 @@
     Megjelenítési stílus kiválasztása
     POI weboldal megtekintése
     POI telefonszám megtekintése
-    weboldal
+    Weboldal
     telefon
     szűrés
     Nagy felbontású kijelző
@@ -901,7 +901,7 @@
     Lejátszás
     Felvétel
     Indítás
-    hang/videojegyzetek
+    Hang/videojegyzetek
     OsmAnd-bővítmény offline szintvonalakhoz
     Távolságmérés
     Készítsen hang/fénykép/videó jegyzeteket utazás közben egy térképen lévő gomb vagy egy pozíció helyi menüjének használatával.
@@ -1727,7 +1727,7 @@
     Telepítés és hibaelhárítás
     Technikai cikkek
     Verziók
-    szavazás
+    Visszajelzés
     Kapcsolat
     Bővebben
     Újdonságok
@@ -2006,7 +2006,7 @@
     A térképek letöltéséhez szükséges.
     Hely keresése…
     Szabad hely
-    Az OsmAnd tárolt adatai (térképek, GPX fájlok, stb.): %1$s.
+    Az OsmAnd tárolt adatai (térképek, nyomvonalfájlok, stb.): %1$s.
     Engedélyezés
     Hozzáférés a pozíciódhoz engedélyezése
     Pozícióm meghatározása
@@ -2037,8 +2037,8 @@
     Hajts ki a(z) %1$d kijáraton és menj
     POI feltöltése
     Útvonalszámítás
-    Még nincsenek GPX fájljaid
-    A mappához GPX-fájlokat is hozzáadhat
+    Még nincsenek nyomvonalfájljai
+    A mappához ön is adhat nyomvonalfájlokat
     Továbbiak hozzáadása…
     Megjelenés
     Gyors rögzítés bekapcsolása
@@ -2493,9 +2493,9 @@
     A csoport összes pontja
     Nyitva ekkortól:
     Nyitva eddig:
-    Ekkor fog bezárni:
-    Ekkor fog kinyitni:
-    Ekkor fog kinyitni:
+    Bezár ekkor:
+    Kinyit ekkor:
+    Kinyit ekkor:
     További műveletek
     GPX fájl a kijelölt jegyzetek koordinátáival és adataival.
     GPX fájl az összes jegyzet koordinátáival és adataival.
@@ -2747,8 +2747,8 @@
     Köztes célpont hozzáadása
     Kiindulópont megadása
     Köztes célpont
-    átszállások
-    gyalog
+    Átszállások
+    Gyalog
     Út
     Érdekes helyek (POI)
     Útvonal tervezése…
@@ -2849,10 +2849,10 @@
     Részletes navigáció
     Úttípusok
     Szálljon le itt:
-    GPX-nyomvonalak megjelenítése/elrejtése
-    Gomb, amely a térképen megjeleníti vagy elrejti a GPX-nyomvonalakat.
-    GPX nyomvonalak elrejtése
-    GPX nyomvonalak megjelenítése
+    Nyomvonalak megjelenítése/elrejtése
+    Gomb, amely a térképen megjeleníti vagy elrejti a nyomvonalakat.
+    Nyomvonalak elrejtése
+    Nyomvonalak megjelenítése
     Először adjon meg egy célpontot
     "• Új \'Navigáció\' képernyő:  Új gomb az Otthon és Munkahely célpontokhoz, \'előző útvonal\' gyors gomb, az aktív GPX útvonalak és jelölők listája, keresési előzmények
 \n
@@ -3314,7 +3314,7 @@
     Profilok listájának szerkesztése
     Kiválasztott profil
     A létrehozandó egyedi profil az alkalmazás egyik alapprofilján fog alapulni, ez határozza meg az alapvető beállításokat, mint például a widgetek láthatóságát vagy a sebesség és távolság mértékegységeit. Ezek az alapprofilok, néhány pédával az egyedi profilokra, amikre kiterjeszthetők:
-    Szerezze meg %1$d %2$s %3$s kedvezménnyel
+    Szerezze meg %1$d %2$s %3$s kedvezménnyel.
     %1$s az első %2$s
     %1$s az első %2$s
     utána %1$s
@@ -3702,7 +3702,7 @@
     Bizonyos országokban a traffipax riasztások törvényileg tiltottak.
     Tájolás
     %1$s törölve
-    A traffipax adatok végleges eltávolításához újraindítás szükséges.
+    A traffipaxadatok végleges törléséhez indítsa újra az alkalmazást.
     Eltávolítás és Újraindítás
     Adja meg az útvonalakon a járművekre vonatkozó hosszkorlátozást.
     Hosszkorlátozás
@@ -3728,12 +3728,12 @@
     Legkisebb pontosság
     Legkisebb elmozdulás
     Bővítménybeállítások visszaállítása alapértelmezettre
-    Engedélyezésével a térkép nagyítási szintje az eszköz hangerőgombjaival állítható.
+    A térképnagyítás szintjének vezérlése a készülék hangerőgombjaival.
     Hangerőgombok használata nagyításhoz
     Görkorcsolya
     Kérem, adjon nevet a pontnak
     Adja meg a járműve hosszát (a hosszú járművekre útvonalkorlátozások vonatkozhatnak).
-    Következő célpont törlése
+    Legközelebbi célpont törlése
     Wikipédia térképek letöltése
     További adatokat is kijelölhet exportálásra a profillal együtt.
     Kiegészítő adatok átvétele
@@ -3745,14 +3745,14 @@
 \n
 \nAz előfizetéseit a Google Play beállításainál tudja kezelni és lemondani.
     Törli az útvonal soron következő célpontját. Amennyiben ez a végző célpont, a navigáció megáll.
-    Szerezzen információt az érdekes helyekkel kapcsolatban a Wikipédiáról. Ez az ön offline zseb útikönyve - egyszerűen engedélyezze a Wikipédia bővítményt és élvezze az ön körül lévő objektumokról szóló cikkeket.
+    Tudjon meg többet az érdekes pontokról a Wikipédiából. Ez az Ön offline zsebútikönyve – egyszerűen kapcsolja be a Wikipédia-bővítményt, és élvezze az Ön körüli objektumokról szóló cikkeket.
     Salakmotor
     Robogó
     Kerekesszék
     Gokart
     Lezárt OSM-jegyzet
     Előre döntött kerekesszék
-    A folytatáshoz adja meg a munkanapokat
+    A folytatáshoz állítsa be a munkanapokat
     Útvonal pontok között
     Útvonaltervezés
     Hozzáadás nyomvonalhoz
@@ -3785,7 +3785,7 @@
     Válassza ki, hogy a nyomvonalon milyen távolság- vagy időintervallumok jelzései jelenjenek meg.
     Ez a szűrő kiküszöböli az ismétlődő pontok rögzítését ott, ahol túl kevés tényleges mozgás történhetett, így szebb lesz a később utólag fel nem dolgozott nyomvonalak térbeli megjelenése.
     Felvétel vágása
-    Szünetelteti a nyomvonal naplózását, amikor az alkalmazást (később megnyitott alkalmazások) bezárják. (Az OsmAnd háttérjelzése eltűnik az Android értesítési sávjáról.)
+    Szünetelteti a nyomvonal naplózását, amikor az alkalmazást bezárják (a \'mostanában használt alkalmazások\' felületen). (Az OsmAnd háttérjelzése eltűnik az Android értesítési sávjáról.)
     Javaslat: Először próbálja meg a mozgásérzékelést használni a legkisebb elmozdulást naplózó szűrővel (B). Ez jobb eredményeket hozhat, és kevesebb adatot veszít. Ha a nyomvonalak alacsony sebességnél továbbra is zajosak, próbálkozzon itt nullától eltérő értékekkel. Felhívjuk figyelmét, hogy egyes (hálózatalapú módszereket használó) mérőeszközök egyáltalán nem adnak sebességértéket, így ebben az esetben semmi sem fog rögzülni.
     Utcaszintű képek
     Csak az út vonala lesz elmentve, az útpontok törlődnek.
@@ -3826,7 +3826,7 @@
     Mentés nyomvonalfájlként
     Másik nyomvonal kiválasztása
     Elmentett nyomvonal megnyitása
-    Válassza ki a követni kívánt nyomvonalfájlt, vagy importáljon egyet.
+    Válassza ki a követni kívánt nyomvonalfájlt, vagy importáljon egyet a készülékéről.
     Irányt mutató nyilak
     Javaslat: Az 5 méteres beállítás megfelelő lehet, ha nem szükséges ennél finomabb részleteket rögzítenie, és nyugalmi állapotban sem akar kifejezetten adatokat rögzíteni.
     Következő szakasz
@@ -3834,7 +3834,7 @@
     Egyszerűsített nyomvonal
     Kész
     elmentve
-    Jelölje ki, hogyan legyenek összekötve a pontok: egyenes vonallal vagy a kiválasztott profilnak megfelelően kiszámított útvonallal.
+    Jelölje ki, hogyan legyenek összekötve a pontok: egyenes vonallal vagy az alábbiak szerint kiszámított útvonallal.
     Teljes nyomvonal
     Megjegyzés: Ha a GPS közvetlenül a felvétel előtt ki volt kapcsolva, akkor rosszabb lehet az első mért pont pontossága. A kódban ezért szeretnénk majd talán várni egy-két másodpercet egy pont rögzítése előtt (vagy a 3 egymást követő pont közül a legjobbat rögzíteni vagy valami hasonló), de ezt még nem programoztuk le.
     Cím törlése
@@ -3847,10 +3847,8 @@
     Meglévő nyomvonal megnyitása
     Tömör
     Adja meg a címet
-    Csak a következő szakasz lesz újraszámítva a kiválasztott profilnak megfelelően.
-    Ennek a beállításnak a használatához az OsmAndnak hozzá kell tördelnie a nyomvonalát a térképen található utakhoz.
-\n
-\n A következő lépésben ki kell választania a navigációs profilt az engedélyezett utak és a küszöbtávolság észleléséhez, hogy a nyomvonalát közelíteni lehessen az utakhoz.
+    Csak a következő szakasz lesz újraszámítva a kiválasztott profilnak megfelelően.
+    Ezután a beállítás használatához igazítsa a nyomvonalat a legközelebbi úthoz az egyik navigációs profil segítségével.
     Egyedi
     Utazás rögzítésének szüneteltetése
     Mentés új nyomvonalfájlként
@@ -3861,13 +3859,13 @@
     Navigációs profil
     Megjegyzés a „sebesség > 0” ellenőrzéséhez: A legtöbb GPS lapkakészlet (chipset) csak akkor mutat sebességértéket, ha az algoritmus megállapítja, hogy mozgásban van. Ha nincs mozgás, akkor nem mutatnak sebességet. Ezért ebben a szűrőben a „> 0” beállítás bizonyos értelemben a GPS lapkakészlet mozgásérzékelését használja. De – még ha a rögzítés ideje alatt itt nem is szűrjük – a GPX elemzése során mégis használjuk ezt a funkciót a korrigált távolság meghatározásához, vagyis az abban a mezőben megjelenített érték a mozgás közben rögzített távolság.
     Csak a kijelölt szakasz lesz újraszámítva a kiválasztott profilnak megfelelően.
-    Biztos, hogy mentés nélkül bezárja az útvonaltervezőt\? Minden változást elveszít.
+    Biztos, hogy mentés nélkül bezárja az útvonaltervezőt\? Minden változást elvész.
     Válassza ki a követendő nyomvonalfájlt
     A felsorolt %1$s már létezik az OsmAndban.
     Minden korábbi szakasz
     Válassza ki a megnyitni kívánt nyomvonalfájlt.
     Útvonaltípus módosítása ez előtt:
-    A teljes útvonal újra lesz számítva a kiválasztott profilnak megfelelően.
+    A teljes útvonal újra lesz számítva a kiválasztott profilnak megfelelően.
     Mentés új nyomvonalként
     Útvonal megfordítása
     Cím hozzáadása
@@ -3877,6 +3875,22 @@
     Mellékhatások: A nyugalmi periódusok egyáltalán nem vagy csak egy ponttal rögzülnek. Kiszűrhetők a kis (valós) mozgások (pl. az út során egy átvezető út jelzése céljából megtett kitérők). A fájl kevesebb információt tartalmaz az utófeldolgozáshoz és rosszabb a statisztikája, mivel a felvételkor kiszűri a nyilvánvalóan felesleges pontokat, miközben megtarthatja a rossz vétel vagy a GPS lapkakészlet által okozott hibás mintázatok.
     Minden későbbi szakasz
     %s nyomvonalfájl kijelölve
-    Jelölje ki azt a nyomvonalfájlt, amelyhez az új szakasz hozzáadódjék.
+    Jelölje ki azt a nyomvonalfájlt, amelyhez az új szakasz hozzáadódjék.
     Nyomvonalak
+    Mégis
+    • A Tervezett útvonal mód frissítésével különböző navigációtípusok is használathatók az egyes szakaszokhoz, és bármilyen nyomvonal az utakhoz köthető
+\n
+\n • Új megjelenési lehetőségek a nyomvonalakhoz: válassza ki a színt, a vastagságot, kapcsolja be az iránynyilakat és a kezdő / befejező jeleket
+\n
+\n • A kerékpáros csomópontok jobb láthatósága
+\n
+\n • Helyi menü a nyomvonalak az alapvető adataival
+\n
+\n • Továbbfejlesztett keresési algoritmusok
+\n
+\n • Javított nyomvonalkövetési beállítások a Navigációban
+\n
+\n • Javítva a profilbeállítások importálásával / exportálásával kapcsolatos problémák
+\n
+\n
 
\ No newline at end of file
diff --git a/OsmAnd/res/values-is/strings.xml b/OsmAnd/res/values-is/strings.xml
index 97a4c5bcf6..d2404aaba2 100644
--- a/OsmAnd/res/values-is/strings.xml
+++ b/OsmAnd/res/values-is/strings.xml
@@ -3776,9 +3776,9 @@
 \nVeldu %1$s og þú munt fá aðvaranir og ábendingar um hraðamyndavélar. 
 \n
 \nVeldu %2$s: öllum gögnum sem tengjast hraðamyndavélum; t.d. aðvaranir, tilkynningar, staðsetningar o.fl. verður eytt þar til OsmAnd er sett inn aftur frá grunni.
-    Veldu ferilskrá þar sem nýjum bút verður bætt inn.
-    Veldu hvernig eigi að tengja punkta; með beinni línu eða reikna leið milli þeirra með þessu sniði.
-    Allur ferillinn verður endurreiknaður með völdu sniði.
+    Veldu ferilskrá þar sem nýjum bút verður bætt inn.
+    Veldu hvernig eigi að tengja punkta; með beinni línu eða reikna leið milli þeirra með þessu sniði.
+    Allur ferillinn verður endurreiknaður með völdu sniði.
     Lokaður OSM-minnispunktur
     Allur ferillinn
     Sýna tákn fyrir upphaf/enda
@@ -3792,7 +3792,7 @@
     Virkja þetta til að hægt sé að stýra aðdráttarstigi korts með hljóðstyrkshnöppum.
     Tilgreindu lengd farartækis sem leyfð er á leiðum.
     Ef stefna er öfug
-    Aðeins næsti bútur verður endurreiknaður með völdu sniði.
+    Aðeins næsti bútur verður endurreiknaður með völdu sniði.
     Enduro-mótorhjól
     Leið milli punkta
     Næsti bútur
@@ -3858,7 +3858,7 @@
     Settu inn heimilisfang
     Veldu ferilskrá til að fylgja eða flyttu inn úr tæki.
     Bæta í ferilskrá
-    Til að nota þennan valkost þarf OsmAnd að festa ferilinn þinn við vegi á kortinu.
+    Til að nota þennan valkost þarf OsmAnd að festa ferilinn þinn við vegi á kortinu.
 \n
 \nÍ næsta skrefi þarftu að velja leiðsagnarsnið svo hægt sé að finna hvaða vegir séu leyfilegir og hvaða þolvik vegalengdar eigi að miða við til að nálga ferilinn þinn við fyrirliggjandi vegi.
     Bæta við ferilskrám
diff --git a/OsmAnd/res/values-it/strings.xml b/OsmAnd/res/values-it/strings.xml
index 764e5959fe..505d5ee27f 100644
--- a/OsmAnd/res/values-it/strings.xml
+++ b/OsmAnd/res/values-it/strings.xml
@@ -563,9 +563,7 @@
     Componenti aggiuntivi
     I plugin abilitano funzionalità aggiuntive e impostazioni avanzate.
     Componenti aggiuntivi
-    Realizza contributi OSM come la creazione o la modifica di PDI OSM, aprendo o commentando note OSM, 
-\ne contribuendo i file GPX registrati in OsmAnd inserendo il tuo nome utente e password.
-\nOpenStreetMap.org è un progetto collaborativo di mappatura globale di dominio pubblico.
+    Realizza contributi OSM come la creazione o la modifica di PDI OSM, aprendo o commentando note OSM, e contribuendo i file GPX registrati in OsmAnd inserendo il tuo nome utente e password. OpenStreetMap.org è un progetto collaborativo di mappatura globale di dominio pubblico.
     Le mappe vettoriali dovrebbero apparire più velocemente. Su certi dispositivi potrebbero non funzionare bene.
     Seleziona una voce e provane gli annunci vocali:
     Sviluppo di OsmAnd
@@ -3823,21 +3821,19 @@
     Scegli il file di una traccia da aprire.
     Fatto
     Profilo di navigazione
-    Per utilizzare questa opzione OsmAnd ha bisogno di bloccare la traccia alle strade della mappa.
-\n
-\n Nel prossimo passaggio avrai bisogno di selezionare il profilo di navigazione per determinare le strade permesse e la soglia della distanza per approssimare la strada alle strade.
-    Scegli come collegare i punti, con una linea retta, o calcolando un percorso che li colleghi utilizzando il profilo scelto.
+    Poi approssima la traccia alle strade più vicine permesse da uno dei tuoi profili di navigazione per utilizzare questa opzione.
+    Scegli come collegare i punti, con una linea retta, o calcolando un percorso che li colleghi utilizzando il profilo scelto.
     Sovrascrivi traccia
     Salva come nuova Traccia
     Inverti il percorso
-    Solo il nuovo segmento sarà ricalcolato utilizzando il profilo scelto.
-    Tutta la traccia sarà ricalcolata utilizzando il profilo scelto.
+    Solo il nuovo segmento sarà ricalcolato utilizzando il profilo scelto.
+    Tutta la traccia sarà ricalcolata utilizzando il profilo scelto.
     Tutta la traccia
     Nuovo segmento
     Soglia distanza
-    Seleziona un file traccia a cui verrà aggiunto un nuovo segmento.
+    Seleziona un file traccia a cui verrà aggiunto un nuovo segmento.
     Immagini stradali
-    Sei sicuro di voler chiudere la Pianificazione del percorso senza salvare\? Perderai tutti i cambiamenti.
+    Sei sicuro di voler chiudere la Pianificazione del percorso perdendo così le modifiche effettuate\?
     In caso di direzione inversa
     Registra automaticamente la traccia durante la navigazione
     Salva come un nuovo file traccia
@@ -3845,18 +3841,18 @@
     Tracce
     Tracce
     Tracce
-    GPX
+    REG
     Registra la traccia in un file GPX
     Traccia di un percorso
     Aggiungi dei file traccia
     Importa o registra dei file traccia
     Aggiungi un punto intermedio alla traccia
     Aggiungi un punto intermedio alla traccia
-    Registrazione viaggio
+    Registrazione percorso
     Salva come un file traccia
     Segui la traccia
     Scegli il file della traccia da seguire
-    Scegli il file della traccia da seguire o importala dal dispositivo.
+    Scegli il file della traccia da seguire o importare dal dispositivo.
     Seleziona un\'altra traccia
     Naviga dalla mia posizione alla traccia
     Punto della traccia da navigare
@@ -3868,6 +3864,40 @@
     Immetti un indirizzo
     Taglia prima
     Taglia dopo
-    Cambia il tipo di percorso prima
-    Cambia il tipo di percorso dopo
+    Cambia il tipo di percorso precedente
+    Cambia il tipo di percorso seguente
+    Solo la linea del percorso verrà salvata, i punti intermedi saranno cancellati.
+    Nome del file
+    %s file traccia selezionati
+    Metterà in pausa la registrazione della traccia quando l\'applicazione viene terminata (attraverso le app recenti). (L\'indicazione di OsmAnd in background scomparirà dalla barra delle notifiche di Android.)
+    Specifica l\'intervallo di registrazione per la registrazione delle tracce (abilitata attraverso il pulsante di Registrazione del viaggio sulla mappa).
+    Sospendi la registrazione del viaggio
+    Riprendi la registrazione del viaggio
+    Preimpostazioni di sistema
+    Tutti i segmenti successivi
+    Segmento precedente
+    Tutti i segmenti precedenti
+    Solo il segmento selezionato verrà ricalcolato con il profilo selezionato.
+    Tutti i segmenti successivi verranno ricalcolati con il profilo selezionato.
+    Tutti i segmenti precedenti verranno ricalcolati con il profilo selezionato.
+    Apri una traccia salvata
+    è stato salvato
+    Per favore aggiungi almeno due punti.
+    Ripeti
+    • Aggiornata la modalità Pianificazione dell\'Itinerario che permette l\'utilizzo di diversi profili di navigazione per ogni segmento e incolla le tracce alle strade
+\n
+\n •Nuove opzioni per l\'Aspetto delle tracce: scegli il colore, lo spessore, la visualizzazione delle frecce di direzione, e i marcatori di inizio e fine
+\n
+\n • Migliorata la visibilità dei nodi ciclistici
+\n
+\n • Menù contestuale con informazioni di base
+\n
+\n • Migliorato l\'algoritmo di ricerca
+\n
+\n • Migliorate le opzioni Segui traccia in Navigazione
+\n
+\n • Corretto il problema all\'importa/esporta le impostazioni dei profili
+\n
+\n
+    Traccia semplificata
 
\ No newline at end of file
diff --git a/OsmAnd/res/values-iw/strings.xml b/OsmAnd/res/values-iw/strings.xml
index e418440ed8..1e25024941 100644
--- a/OsmAnd/res/values-iw/strings.xml
+++ b/OsmAnd/res/values-iw/strings.xml
@@ -3782,7 +3782,7 @@
     אזהרות מפני מצלמות מהירות אסורות על פי חוק בחלק מהמדינות.
     תכווין
     %1$s נמחקו
-    נדרשת הפעלה מחדש כדי למחוק לחלוטין את נתוני מצלמות המהירות.
+    הפעלת היישומון מחדש תמחק את כל נתוני מצלמות המהירות.
     הסרה והפעלה מחדש
     בחלק מהמדינות או האזורים השימוש ביישומוני אזהרה מפני מצלמות מהירות אסור על פי חוק.
 \n
@@ -3795,10 +3795,10 @@
     נא לציין את אורך כלי הרכב כדי לבדוק מסלולים מורשים.
     מגבלת אורך
     למכשיר הזה אין מצלמות מהירות.
-    מאפשר לשלוח ברמת התקריב של המפה עם כפתורי עצמת השמע של המכשיר.
+    ניתן לשלוט ברמת התקריב של המפה עם כפתורי עצמת השמע של המכשיר.
     כפתורי עצמת שמע כתקריב
     נא לספק את אורך כלי הרכב שלך, מגבלות מסלול מסוימות עשויות לחול על כלי רכב ארוכים.
-    מחיקת נקודת היעד הבאה
+    מחיקת נקודת היעד הקרובה ביותר
     נא לספק שם לנקודה
     נקודת היעד הנוכחית במסלול תימחק. אם זה יהיה היעד, הניווט ייעצר.
     הורדת מפות ויקיפדיה
@@ -3809,7 +3809,7 @@
     כסא גלגלים ספורטיבי
     קארטינג
     הערת OSM סגורה
-    עליך להגדיר ימי עבודה כדי להמשיך
+    יש להגדיר ימי עבודה כדי להמשיך
     מסלול בין נקודות
     תכנון מסלול
     הוספה למסלול
@@ -3834,15 +3834,15 @@
     המקטע הבא
     סף מרחק
     פרופיל ניווט
-    נא לבחור קובץ מסלול שבו יתווסף המקטע החדש.
-    כל המסלול יחושב מחדש באמצעות הפרופיל הנבחר.
-    רק המקטע הבא יחושב מחודש באמצעות הפרופיל הנבחר.
-    נא לבחור כיצד לחבר נקודות, בקו ישר, או לחבר מסלול ביניהן עם הפרופיל הנבחר.
-    כדי להשתמש באפשרות זו על OsmAnd להצמיד את המסלול שלך לדרכים שעל המפה.
+    נא לבחור קובץ מסלול שבו יתווסף המקטע החדש.
+    כל המסלול יחושב מחדש באמצעות הפרופיל הנבחר.
+    רק המקטע הבא יחושב מחודש באמצעות הפרופיל הנבחר.
+    נא לבחור כיצד לחבר נקודות, בקו ישר, או לחבר מסלול ביניהן עם הפרופיל הנבחר.
+    כדי להשתמש באפשרות זו על OsmAnd להצמיד את המסלול שלך לדרכים שעל המפה.
 \n
 \n בשלב הבא יהיה עליך לבחור בפרופיל ניווט כדי לזהות את הדרכים המורשות ואת סף המרחק כדי להעריך את המסלול שלך ביחס לדרכים.
     תמונות ברמת רחוב
-    לסגור את תכנון המסלול בלי לשמור\? כל השינויים שלך יאבדו.
+    להתעלם מהשינויים במסלול המתוכנן על ידי סגירתו\?
     במקרה של כיוון הפוך
     שמירה כקובץ מסלול חדש
     הוספה לקובץ מסלול
@@ -3860,7 +3860,7 @@
     שמירה כקובץ מסלול
     מעקב אחר מסלול
     בחירת קובץ מסלול למעקב
-    נא לבחור בקובץ מסלול לעקוב אחריו או לייבא אחד כזה.
+    נא לבחור בקובץ מסלול לעקוב אחריו או לייבא אותו מהמכשיר שלך.
     בחירת מסלול אחר
     לנווט מהמיקום שלי אל המסלול
     נקודה במסלול לניווט
diff --git a/OsmAnd/res/values-ja/strings.xml b/OsmAnd/res/values-ja/strings.xml
index 3f0cdf866d..636fc3995b 100644
--- a/OsmAnd/res/values-ja/strings.xml
+++ b/OsmAnd/res/values-ja/strings.xml
@@ -472,7 +472,7 @@ POIの更新は利用できません
     POI 変更
     他のタグは全て保存されました
     コミット
-    削除する
+    削除
     フィルタ
     名前をつけて保存
     選択したフィルタを削除しますか?
@@ -2703,7 +2703,7 @@ POIの更新は利用できません
     インターネットへ接続せずにOsmAnd上で地球上のあらゆる興味深いスポットのガイドを利用することができます。
     アプリ内課金
     1回払い
-    買いきり購入の場合、期限を気にせず利用できるようになります。
+    買いきりの場合、期限を問わず利用可能です。
     購入 - %1$s
     Wikivoyageオフライン
     等高線と陰影起伏図
@@ -3733,17 +3733,17 @@ POIの更新は利用できません
     経路を上書き
     新しい経路として保存
     ルート反転
-    選択したプロファイルを使用して、次のセグメントのみ再計算します。
-    選択したプロファイルを使用して、経路全体が再計算されます。
-    直線で地点間をつなげる方法をとるか、選択したプロファイルで地点間のルートを計算します。
+    選択したプロファイルを使用して、次のセグメントのみ再計算します。
+    選択したプロファイルを使用して、経路全体が再計算されます。
+    直線で地点間をつなげる方法をとるか、選択したプロファイルで地点間のルートを計算します。
     全経路
     次のセグメント
-    このオプションを使用するには、OsmAndで経路をマップ上の道路にスナップする必要があります。
+    このオプションを使用するには、OsmAndで経路をマップ上の道路にスナップする必要があります。
 \n
 \n次にナビゲーションプロファイルを選択して、利用予定の道路(一般道、高速道路)と、道路を追跡するおおよその距離を検出する必要があります。
     限界距離
     ナビゲーションプロファイル
-    新しいセグメントを追加するための経路ファイルを選択します。
+    新しいセグメントを追加するための経路ファイルを選択します。
     ストリート画像
     保存せずにルート計画を終了した場合すべての変更が失われます。よろしいですか?
     エンデューロバイク
@@ -3797,7 +3797,7 @@ POIの更新は利用できません
 \n%1$sを選択すると、スピードカメラに関するアラートと警告が表示されます。
 \n
 \n%2$sを選択すると、スピードカメラに関するすべてのデータ(警告、通知、POI)が、OsmAndの再インストールを行うまで削除されます。
-    アクティブを維持
+    機能を維持
     アンインストール
     一部の国では、スピードカメラの事前警告は法律で禁止されています。
     \"%1$s\"がオンの場合、設定された動作時間はそちらに依存します。
@@ -3820,7 +3820,7 @@ POIの更新は利用できません
     長さ制限
     ベアリング
     %1$sを削除しました
-    スピードカメラのデータを完全に削除するには、再起動が必要です。
+    アプリを再起動し、すべてのスピードカメラデータを削除します。
     アンインストールして再起動
     このアプリには、スピードカメラに関する情報はありません。
     インラインスケート
@@ -3835,7 +3835,7 @@ POIの更新は利用できません
     経路
     経路
     経路
-    GPX
+    REC
     GPXファイルへの経路ログ
     ルート経路
     経路ファイルを追加
@@ -3860,4 +3860,40 @@ POIの更新は利用できません
     後でトリミング
     先にルートタイプを変更
     後でルートタイプを変更
+    次年度以降 %1$s
+    初%2$s度 %1$s
+    初%2$s度 %1$s
+    ルート記録を一時停止
+    ルート記録を続行
+    システムのデフォルト
+    以後のすべてのセグメントは、選択したプロファイルを使用して再計算されます。
+    以後のすべてのセグメント
+    前のセグメント
+    以前のすべてのセグメント
+    選択したセグメントのみ、選択したプロファイルを使用して再計算されます。
+    以前のセグメントは、選択したプロファイルを使用して再計算されます。
+    保存した経路を開く
+    少なくとも2つの地点を追加してください。
+    繰り返し
+    • ルート計画機能を更新 : セグメントごとに異なるナビゲーションタイプを使用し、経路として反映することが可能に
+\n
+\n• 経路の新しい外観オプション : 色、太さ、表示方向矢印、開始/終了アイコン選択
+\n
+\n• 自転車ノードの視認性を向上
+\n
+\n• 経路のタップで、基本情報を含むコンテキストメニューの表示
+\n
+\n• 検索アルゴリズムの改善
+\n
+\n• ナビゲーションの追跡オプションの改善
+\n
+\n• プロファイル設定のインポート/エクスポートに関する問題を修正
+\n
+\n
+    簡略化された経路
+    ルートライン(経路)のみが保存され、経由地点は削除されます。
+    %s個の経路ファイルが選択されました
+    ファイル名
+    (最近使用したアプリを介して) OsmAndを終了すると、GPXの記録が一時停止されます(バックグラウンドサービスインジケーターがAndroid通知バーから消えます。)
+    一般的な経路記録の記録間隔を定義します(マップ画面の\'GPX\'ボタンを使用)
 
\ No newline at end of file
diff --git a/OsmAnd/res/values-nb/strings.xml b/OsmAnd/res/values-nb/strings.xml
index aa1ff19745..e52dad60d0 100644
--- a/OsmAnd/res/values-nb/strings.xml
+++ b/OsmAnd/res/values-nb/strings.xml
@@ -3705,18 +3705,45 @@
     Velg en sporfil for åpning.
     Snu rute
     Overskriv spor
-    Hele sporet vil bli omregnet ved bruk av valgt profil.
-    Velg hvordan punkter skal knyttes sammen, i rett linje, eller utregnet rute mellom dem med valgt profil.
-    Kun neste segment vil bli omregnet ved bruk av valgt profil.
+    Hele sporet vil bli omregnet ved bruk av valgt profil.
+    Velg hvordan punkter skal knyttes sammen, i rett linje, eller utregnet rute mellom dem med valgt profil.
+    Kun neste segment vil bli omregnet ved bruk av valgt profil.
     Hele sporet
     Neste segment
-    For å bruke dette valget må OsmAnd rute sporet ditt til kartveiene.
+    For å bruke dette valget må OsmAnd rute sporet ditt til kartveiene.
 \n
 \n På neste steg vil du måtte velge navigasjonsprofil for oppdagelse av tillatte veier, og terskeldistanse for å anslå sporet ditt til veier.
-    Velg en sporfil å legge til det nye segmentet i.
+    Velg en sporfil å legge til det nye segmentet i.
     Lagre som nytt spor
     Opprett ny rute
     Ferdig
     Terskeldistanse
     Navigeringsprofil
+    Lukket OSM-notat
+    Legg til sporfiler
+    Importer eller ta opp sporfiler
+    Følg spor
+    Velg sporfil å følge
+    Velg sporfil å følge, eller importer en.
+    Velg et annet spor
+    Starten av sporet
+    Nærmeste punkt
+    Slett adresse
+    Legg til adresse
+    Skriv inn adresse
+    Endre rutetype før
+    Endre rutetype etter
+    Forenklet spor
+    Filnavn
+    Systemforvalg
+    Alle påfølgende segmenter
+    Alle foregående segmenter
+    Forrige segment
+    Kun valgt segment vil bli utregnet på ny i valgt profil.
+    Alle påfølgende segmenter vil bli utregnet på ny i valgt profil.
+    Alle tidligere segmenter vil bli utregnet på ny i valgt profil.
+    Åpne lagret spor
+    har blitt lagret
+    Legg til minst to punkter.
+    Gjenta
 
\ No newline at end of file
diff --git a/OsmAnd/res/values-night/colors.xml b/OsmAnd/res/values-night/colors.xml
index 86193d0cc0..a4e7a08ec9 100644
--- a/OsmAnd/res/values-night/colors.xml
+++ b/OsmAnd/res/values-night/colors.xml
@@ -1,4 +1,4 @@
 
 
-    @color/map_background_color_dark
+    @color/list_background_color_dark
 
\ No newline at end of file
diff --git a/OsmAnd/res/values-pl/strings.xml b/OsmAnd/res/values-pl/strings.xml
index 7ec21316d4..5250a19bc4 100644
--- a/OsmAnd/res/values-pl/strings.xml
+++ b/OsmAnd/res/values-pl/strings.xml
@@ -3833,11 +3833,11 @@
     Nowy segment
     Odległość graniczna
     Profil nawigacji
-    Wybierz plik śladu do którego zostanie dodany nowy segment.
-    Cała trasa zostanie ponownie wyznaczona przy użyciu wybranego profilu.
-    Tylko następny segment zostanie ponownie obliczony przy użyciu wybranego profilu.
-    Wybierz sposób łączenia punktów linią prostą lub obliczania trasy między nimi z wybranym profilem.
-    Aby skorzystać z tej opcji, OsmAnd musi przyciągnąć ślad do dróg mapy.
+    Wybierz plik śladu do którego zostanie dodany nowy segment.
+    Cała trasa zostanie ponownie wyznaczona przy użyciu wybranego profilu.
+    Tylko następny segment zostanie ponownie obliczony przy użyciu wybranego profilu.
+    Wybierz sposób łączenia punktów linią prostą lub obliczania trasy między nimi z wybranym profilem.
+    Aby skorzystać z tej opcji, OsmAnd musi przyciągnąć ślad do dróg mapy.
 \n
 \nW następnym kroku należy wybrać profil nawigacji w celu wykrycia dozwolonych dróg i odległości progowej w celu przybliżenia śledzenia drogi.
     Zdjęcia z poziomu ulicy
diff --git a/OsmAnd/res/values-pt-rBR/phrases.xml b/OsmAnd/res/values-pt-rBR/phrases.xml
index 08c57f9a39..c6eea35aa5 100644
--- a/OsmAnd/res/values-pt-rBR/phrases.xml
+++ b/OsmAnd/res/values-pt-rBR/phrases.xml
@@ -3815,7 +3815,7 @@
     Nível de água: acima do nível médio da água
     Nível de água: abaixo do nível médio da água
     Obstrução
-    Recarga de água potável: sim
+    Sim
     Recarga de água potável: não
     Rede de recarga de água potável
     Sucção
@@ -3834,4 +3834,13 @@
     Burgo
     Flecha: não
     Elevador
+    Calendário
+    Demora
+    Tempo real
+    Sim
+    Quadro de partidas: não
+    Quadro de partidas
+    Recarga de água potável
+    Pequenos aparelhos elétricos
+    Colmeia
 
\ No newline at end of file
diff --git a/OsmAnd/res/values-pt-rBR/strings.xml b/OsmAnd/res/values-pt-rBR/strings.xml
index 5e320024f5..1182d20a65 100644
--- a/OsmAnd/res/values-pt-rBR/strings.xml
+++ b/OsmAnd/res/values-pt-rBR/strings.xml
@@ -3776,20 +3776,20 @@
     Os alertas de radares de velocidade em alguns países são proibidos por lei.
     Rolamento
     %1$s excluído
-    É necessário reiniciar para excluir completamente os dados da câmera de velocidade.
+    Reinicie o aplicativo para excluir todos os dados da câmera de velocidade.
     Desinstalar e reiniciar
     Especifique o comprimento do veículo a ser permitido nas rotas.
     Limite de comprimento
     Este dispositivo não possui câmeras de velocidade.
     Patins em linha
-    Ativar para controlar o nível de zoom do mapa com os botões de volume do dispositivo.
+    Controle o nível de zoom do mapa usando os botões de volume do dispositivo.
     Botões de volume como zoom
     Forneça o comprimento do seu veículo. Algumas restrições de rotas podem ser aplicadas a veículos longos.
-    Excluir próximo ponto de destino
+    Apagar o ponto de destino mais próximo
     Forneça um nome para o ponto
     O ponto de destino atual na rota será excluído. Se for o destino, a navegação será interrompida.
     Baixar mapas da Wikipédia
-    Obter informações sobre pontos de interesse da Wikipédia. É o seu guia de bolso off-line - só ativar o complemento Wikipédia e desfrutar de artigos sobre os elementos ao seu redor.
+    Obtenha informações sobre pontos de interesse na Wikipédia. É o seu guia offline de bolso - basta ativar o plug-in da Wikipédia e desfrutar dos artigos sobre os objetos ao seu redor.
     Motocicleta enduro
     Motoneta
     Cadeira de rodas
@@ -3797,11 +3797,11 @@
     Carrinho de compras
     Nota OSM fechada
     Adicionar a uma trilha
-    Você precisa definir dias úteis para continuar
+    Defina dias úteis para continuar
     Rota entre pontos
     Planejar uma rota
     O ponto adicionado não será visível no mapa, já que o grupo selecionado está oculto, você pode encontrá-lo em \"%s\".
-    Mostrar ícones de início e término
+    Mostrar ícones de início e fim
     Selecionar largura
     Selecione o intervalo no qual as marcas com distância ou tempo na pista serão exibidas.
     Selecione a opção de divisão desejada: por tempo ou por distância.
@@ -3812,24 +3812,24 @@
     Importar trilha
     Abrir trilha existente
     Criar nova rota
-    Selecione um arquivo de faixa para abrir.
+    Selecione um arquivo de trilha para abrir.
     Concluído
     Substituir trilha
     Salvar como nova trilha
     Rota reversa
-    A trilha inteira será recalculada usando o perfil selecionado.
-    Apenas o próximo segmento será recalculado usando o perfil selecionado.
-    Selecione como conectar pontos, com uma linha reta, ou calcular uma rota entre eles com o perfil selecionado.
+    A trilha inteira será recalculada usando o perfil selecionado.
+    Apenas o próximo segmento será recalculado usando o perfil selecionado.
+    Selecione como conectar pontos, por uma linha reta, ou calcular uma rota entre eles conforme especificado abaixo.
     Trilha inteira
     Próximo segmento
-    Para usar esta opção, OsmAnd precisa ajustar sua trilha para as estradas do mapa.
+    Para usar esta opção, OsmAnd precisa ajustar sua trilha para as estradas do mapa.
 \n
 \n Na próxima etapa, você precisará selecionar o perfil de navegação para detectar as estradas permitidas e a distância limite para aproximar o rastreamento das estradas.
     Distância limite
     Perfil de navegação
-    Selecione um arquivo de trilha para o qual um novo segmento será adicionado.
+    Selecione um arquivo de trilha para o qual um novo segmento será adicionado.
     Imagens de rua
-    Tem certeza de que deseja fechar plano de rota sem salvar\? Você perderá todas as alterações.
+    Tem certeza de que deseja descartar todas as alterações no percurso planejado, fechando-o\?
     Em caso de direção reversa
     Salvar como novo arquivo de trilha
     Trilhas
@@ -3847,9 +3847,9 @@
     Salvar como arquivo de trilha
     Seguir a trilha
     Escolha o arquivo de trilha a seguir
-    Escolha o arquivo de trilha a seguir ou importe um.
+    Escolha o arquivo de trilha a seguir ou importe-o de seu dispositivo.
     Selecionar outra trilha
-    Navegue de minha localização até a trilha
+    Navegue da minha posição até a trilha
     Ponto da trilha para navegar
     Início da pista
     Ponto próximo
@@ -3881,4 +3881,19 @@
     está salvo
     Adicione pelo menos dois pontos.
     Refazer
+    "• Função de planejamento de rota atualizada: permite o uso de diferentes tipos de navegação por segmento e a inclusão de trilhas
+\n
+\n  • Novo menu de aparência para trilhas: selecione cor, espessura, setas de direção de exibição, ícones de início / término
+\n
+\n  • Melhor visibilidade dos nós da bicicleta.
+\n
+\n  • As trilhas agora podem ser tocadas, têm menu de contexto com informações básicas.
+\n
+\n  • Algoritmos de pesquisa aprimorados
+\n
+\n  • Opções de acompanhamento de trilha aprimoradas na navegação
+\n
+\n  • Problemas corrigidos com importação/exportação de configurações de perfil
+\n
+\n"
 
\ No newline at end of file
diff --git a/OsmAnd/res/values-pt/phrases.xml b/OsmAnd/res/values-pt/phrases.xml
index 84ebceecad..0eb960c2f2 100644
--- a/OsmAnd/res/values-pt/phrases.xml
+++ b/OsmAnd/res/values-pt/phrases.xml
@@ -3771,7 +3771,7 @@
     Quantidade de erupções
     Rede de reabastecimento de água potável
     Reabastecimento de água potável: não
-    Reabastecimento de água potável: sim
+    Sim
     Obstrução
     Nível da água: abaixo do nível médio da água
     Nível da água: acima do nível médio da água
@@ -3819,4 +3819,13 @@
     Give-box
     Seta: não
     Elevador
+    Calendário
+    Tempo real
+    Atraso
+    Sim
+    Quadro de partidas: não
+    Quadro de partidas
+    Reabastecimento de água potável
+    Pequenos aparelhos elétricos
+    Colmeia
 
\ No newline at end of file
diff --git a/OsmAnd/res/values-pt/strings.xml b/OsmAnd/res/values-pt/strings.xml
index bba5a6aa8b..49f1d72d9e 100644
--- a/OsmAnd/res/values-pt/strings.xml
+++ b/OsmAnd/res/values-pt/strings.xml
@@ -650,7 +650,7 @@
     Linguagem
     Próximo
     Anterior
-    Alterar unidade de medida de distância.
+    Alterar a unidade de medida de distância.
     Unidades de comprimento
     Milhas/pés
     Milhas/jardas
@@ -1908,7 +1908,7 @@
     Widget Mapillary
     Permite contribuir rapidamente para Mapillary.
     Fotos on-line ao nível da rua para todos. Descubra locais, colabore, capture o mundo.
-    Imagens de nível de rua
+    Mapillary
     Fotos ao nível da rua para todos. Descubra locais, colabore, capture o mundo.
     O seu destino está localizado numa área de acesso privado. Permitir uso de estradas privadas para esta viagem\?
     Reiniciar pesquisa
@@ -2042,8 +2042,8 @@
     Use a saída %1$d e continue
     Enviar Pontos de Interesse (POI)
     Cálculo da rota
-    Ainda não tem nenhum percurso
-    Também pode adicionar ficheiros GPX ao diretório
+    Ainda não tem nenhuns ficheiros de trilhos
+    Também pode adicionar ficheiros ao diretório
     Adicionar mais…
     Aparência
     Ativar gravação rápida
@@ -2100,7 +2100,7 @@
     Necessário para descarregar mapas.
     À procura de localização…
     Espaço livre
-    Armazenamento de dados de OsmAnd (para mapas, ficheiros GPX, etc.): %1$s.
+    Armazenamento de dados de OsmAnd (para mapas, ficheiros de trilhos, etc.): %1$s.
     Conceder permissão
     Permitir acesso à localização
     Encontrar a minha posição
@@ -2961,9 +2961,9 @@
     Trocar
     Mostrar mais
     Trilhos mostrados
-    Mostrar/ocultar trajetos GPX
-    Um botão para mostrar ou ocultar trajetos GPX selecionados no mapa.
-    Ocultar trajetos GPX
+    Mostrar/ocultar trilhos
+    Um botão para mostrar ou ocultar trilhos selecionados no mapa.
+    Ocultar trilhos
     Sem elétricos
     Evita elétricos
     Sem autocarros
@@ -2989,7 +2989,7 @@
     Paralelos
     Seixos
     Caminho para cavaleiros
-    Mostrar trajetos GPX
+    Mostrar trilhos
     Por favor defina primeiro o destino
     Rota anterior
     Adicionar casa
@@ -3239,7 +3239,7 @@
     Alertas mostrados no canto inferior esquerdo durante a navegação.
     Mudar de perfil
     Idioma e saída
-    Redefinir para o padrão
+    Redefinir para a predefinição
     Criar, importar, editar perfis
     Gerir perfis de app…
     Afeta toda a app
@@ -3754,15 +3754,15 @@
 \nSelecione %1$s e receberá alertas e avisos sobre radares de velocidade. 
 \n 
 \nSelecione %2$s. Todos os dados relacionados a radares de velocidade: alertas, notificações, POIs serão apagados até que o OsmAnd seja completamente reinstalado.
-    Obter informações sobre pontos de interesse da Wikipédia. É o seu guia de bolso off-line - falta só ativar o suplemento Wikipédia e desfrutar de artigos sobre os elementos ao seu redor.
+    Obter informações sobre pontos de interesse da Wikipédia. É o seu guia de bolso off-line - falta só ativar o suplemento de Wikipédia e desfrutar de artigos sobre os elementos ao seu redor.
     Motoneta
-    Apagar próximo ponto de destino
+    Apagar o ponto de destino mais próximo
     Descarregar mapas da Wikipédia
     Pode acessar essas ações tocando no botão “%1$s”.
     Desinstalar
     Forneça o comprimento do seu veículo. Algumas restrições de rotas podem ser aplicadas a veículos longos.
     Botões de volume como zoom
-    É necessário reiniciar para excluir completamente os dados da câmera de velocidade.
+    Reinicie a app para apagar os dados da câmara de velocidade.
     %1$s apagado
     Uma alternância para mostrar ou ocultar a camada Mapillary no mapa.
     Definir altura da embarcação
@@ -3796,7 +3796,7 @@
     Legal
     Pode definir a altura da embarcação para evitar pontes baixas. Lembre-se, se a ponte for móvel, usaremos sua altura no estado aberto.
     Cadeira de rodas para a frente
-    Ativar para controlar o nível de zoom do mapa com os botões de volume do aparelho.
+    Controlar o nível de ampliação do mapa pelos botões de volume do aparelho.
     Mostrar/ocultar Mapillary
     Desinstalar radares de velocidade
     Anotaçaõ OSM fechada
@@ -3806,7 +3806,7 @@
     POIs de radares de velocidade
     Retomar
     Rolamento
-    Precisa de definir dias úteis para continuar
+    Defina dias úteis para continuar
     Rota entre pontos
     Planejar uma rota
     Adicionar ao trilho
@@ -3827,22 +3827,20 @@
     Sobrescrever trilho
     Gravar como novo trilho
     Rota inversa
-    O trilho inteiro será recalculado a usar o perfil selecionado.
-    Somente o próximo segmento será recalculado a usar o perfil selecionado.
-    Selecione como ligar pontos, com uma linha reta ou calcule uma rota entre eles com o perfil selecionado.
+    O trilho inteiro será recalculado a usar o perfil selecionado.
+    Somente o próximo segmento será recalculado a usar o perfil selecionado.
+    Selecione como ligar pontos, por uma linha reta ou a calcular uma rota entre eles como especificado abaixo.
     Trilho inteiro
     Próximo segmento
-    Para usar esta opção o OsmAnd precisa de encaixar o seu trilho nas estradas do mapa.
-\n
-\n No passo seguinte, terá de selecionar o perfil de navegação para detetar estradas permitidas e a distância limiar para se aproximar do seu trilho com as estradas.
+    Em seguida, encaixe a sua pista na estrada mais próxima permitida com um dos seus perfis de navegação para usar esta opção.
     Distância limiar
     Perfil de navegação
-    Selecione um ficheiro de faixa para o qual um novo segmento será adicionado.
+    Selecione um ficheiro de faixa para o qual um novo segmento será adicionado.
     Seguir a trilha
     Escolha o ficheiro de trilha a seguir
-    Escolha o ficheiro de trilha a seguir ou importe-o do aparelho.
+    Escolha o ficheiro de trilho a seguir ou importe um do seu aparelho.
     Selecionar outra trilha
-    Navegue de minha localização até a trilha
+    Navegue de minha posição até ao trilho
     Ponto da trilha para navegar
     Início da pista
     Ponto próximo
@@ -3855,7 +3853,7 @@
     Alterar o tipo de rota antes
     Alterar o tipo de rota após
     Imagens de rua
-    Tem certeza de que deseja fechar plano de rota sem gravar\? Perderá todas as alterações.
+    Tem certeza que quer descartar todas as mudanças na rota planeada a fecha-la\?
     Em caso de direção reversa
     Rota de trilha
     Trilhas
@@ -3870,7 +3868,7 @@
     Trilhas
     Adicionar ponto de passagem de trilha
     Gravação de viagem
-    GPX
+    REC
     Especifique o intervalo de registo para a gravação geral da faixa (ativado através do widget de gravação Trip no mapa).
     Pausar a gravação da viagem
     Retomar a gravação da viagem
@@ -3885,4 +3883,24 @@
     está gravado
     Adicione pelo menos dois pontos.
     Refazer
+    Trilho simplificado
+    Apenas a linha da rota será gravada, os pontos de passagem serão apagados.
+    Nome do ficheiro
+    %s ficheiros de faixa selecionados
+    Vai pausar o registo de faixas quando a aplicação for morta (através de aplicações recentes). (indicação de fundo de OsmAnd desaparece da barra de notificação do Android.)
+    - Função atualizada de Planear uma rota: permite utilizar diferentes tipos de navegação por segmento e a inclusão de faixas
+\n
+\n - Novo menu Aparência para trilhos: selecionar cor, espessura, setas de direção de visualização, ícones de início/fim
+\n
+\n - Melhoria da visibilidade dos nós da bicicleta.
+\n
+\n - Os trilhos agora podem ser tocados, ter menu de contexto com informações básicas.
+\n
+\n - Algoritmos de pesquisa melhorados
+\n
+\n - Opções de seguir faixas melhoradas na navegação
+\n
+\n - Problemas com as configurações de importação/exportação de perfis resolvidos
+\n
+\n
 
\ No newline at end of file
diff --git a/OsmAnd/res/values-ru/phrases.xml b/OsmAnd/res/values-ru/phrases.xml
index 5799269936..2f7dba711d 100644
--- a/OsmAnd/res/values-ru/phrases.xml
+++ b/OsmAnd/res/values-ru/phrases.xml
@@ -3730,7 +3730,7 @@
     Только если разрешена ходьба
     Сеть заправки питьевой воды
     Заправка питьевой водой: нет
-    Заправка питьевой водой: да
+    Да
     Тип 3
     Тип 2 комбинированный
     Тип 2
@@ -3822,4 +3822,12 @@
     Подарочная коробка
     Стрелка: нет
     Лифт
+    Да
+    Расписание отправлений: нет
+    Расписание отправлений
+    Заправка питьевой воды
+    Реальное время
+    Задержка
+    Расписание
+    Малые электроприборы
 
\ No newline at end of file
diff --git a/OsmAnd/res/values-ru/strings.xml b/OsmAnd/res/values-ru/strings.xml
index c0e8e7e7a6..bfceebc942 100644
--- a/OsmAnd/res/values-ru/strings.xml
+++ b/OsmAnd/res/values-ru/strings.xml
@@ -35,7 +35,7 @@
     Файл GPX с координатами и данными выбранных заметок.
     Файл GPX с координатами и данными всех заметок.
     Место
-    Ваш пункт назначения находится на частной территории. Разрешить использование частных дорог для этой поездки\?
+    Пункт назначения находится на частной территории. Разрешить использование частных дорог на этом маршруте\?
     Искать снова
     Увеличить радиус поиска
     Ничего не найдено
@@ -57,8 +57,8 @@
     Включить анимацию прокрутки карты с моим положением во время навигации.
     Масштаб: %1$s
     Имя группы
-    Изменить цвет
-    Изменить имя
+    Выбрать цвет
+    Задать имя
     Для больших расстояний: добавьте промежуточные пункты, если маршрут не построен в течение 10 минут.
     Разрешить частный доступ
     Разрешить доступ на частную территорию.
@@ -99,12 +99,12 @@
     Кнопка переключения автомасштабирования на основе скорости.
     Включение автомасштаба
     Выключение автомасштаба
-    Установить пункт назначения
+    Добавить точку маршрута
     Заменить пункт назначения
     Добавить первую промежуточную точку
     Кнопка для установки центра экрана пунктом назначения маршрута, любой ранее выбранный пункт назначения станет последним промежуточным пунктом.
     Кнопка для установки центра экрана пунктом отправления. Затем будет предложено установить пункт назначения или запустить расчёт маршрута.
-    Кнопка для установки центра экрана пунктом назначения, заменив ранее выбранный пункт назначения (если такой был задан).
+    Кнопка для установки центра экрана пунктом назначения с заменой предыдущего (если был задан).
     Кнопка для установки центра экрана первой промежуточной точкой маршрута.
     Нет покрытия
     Нет подложки
@@ -139,11 +139,11 @@
     Средняя высота
     Время
     Длина маршрута
-    Стиль вождения
+    Стиль езды
     Выберите пересечённость местности
     Использовать данные о высотах
     Фактор рельефа местности (по данным SRTM, ASTER и EU-DEM).
-    Название быстрого действия было изменено на %1$s, чтобы избежать дублирования.
+    Действие переименовано в %1$s, чтобы избежать дублирования.
     Обнаружен дубликат имени
     Переключатель, чтобы показать или скрыть избранные точки на карте.
     Переключатель, чтобы показать или скрыть POI на карте.
@@ -181,7 +181,7 @@
     Толщина горизонталей
     Толщина горизонталей
     Воду
-    Скрыть воду
+    Водные объекты
     Старый поиск
     Показывать старый поиск
     Добавить старый поиск в меню.
@@ -194,7 +194,7 @@
     Построение маршрута
     У вас пока нет файлов треков
     Вы также можете добавить файлы треков в папку
-    Добавь ещё…
+    Добавить…
     Внешний вид
     Включить быструю запись
     Отображение системного уведомления, позволяющего начать запись поездки.
@@ -233,18 +233,18 @@
     Сохранить фильтр
     Удалить фильтр
     Новый фильтр
-    Изменить положение маркера
+    Изменить положение
     Текущий путь
     Навигация OsmAnd Live
     Уровень заряда батареи
-    Переместите карту, чтобы изменить положение маркера
+    Двигайте карту, чтобы изменить позицию маркера
     
     Магнитный пеленг
     Курсовой угол
     Режим карты
     Тонко
     Средне
-    Толстый
+    Жирно
     Выберите маркеры
     Верхняя панель
     Правок: %1$s, ранг: %2$s, всего правок: %3$s
@@ -261,7 +261,7 @@
     Выберите качество видео.
     Подтвердить
     Поиск адреса
-    Пожалуйста, укажите корректный тип POI или оставьте его пустым.
+    Укажите правильный тип POI или пропустите его.
     Формат аудио
     Выберите формат аудио.
     Битрейт аудио
@@ -317,8 +317,8 @@
     Открыть внешний проигрыватель
     Удалить эту запись?
     недоступно
-    Создать аудиозаметку
-    Создать видеозаметку
+    Записать аудио
+    Записать видео
     Слой аудиозаписей
     Запись не может быть воспроизведена.
     Удалить запись
@@ -390,7 +390,7 @@
     Видимость
     Теги
     Описание
-    Пожалуйста, укажите имя и пароль пользователя OSM для отправки файлов GPX.
+    Укажите ваши имя пользователя OSM и пароль для отправки файлов GPX.
     Поддержка
     Поддержать разработку новых функций
     Показывать масштаб
@@ -434,7 +434,7 @@
     Голосовые подсказки (TTS, предпочтительно)
     Википедия (локально)
     Пользовательские
-    Файл, содержащий ранее экспортированные избранные, уже существует. Заменить его?
+    Файл экспорта сохранённых точек уже существует. Заменить его\?
     Настройки профиля
     Профиль по умолчанию
     Вид карты и настройки навигации сохраняются для каждого отдельного профиля. Установите ваш профиль по умолчанию.
@@ -446,7 +446,7 @@
     Прозрачная тема
     Нативная библиотека не поддерживается на этом устройстве.
     Инициализация нативной библиотеки…
-    Центрировать карту автоматически
+    Автовозврат к позиции на карте
     Выберите время, через которое карта вернётся к текущей позиции.
     Автовозврат карты только при следовании по маршруту
     Возвращать карту в текущее положение только при следовании по маршруту.
@@ -457,7 +457,7 @@
     Данные POI «%1$s» устарели и могут быть удалены.
     Файл с обновляемыми POI не найден и не может быть создан.
     Обновить до OsmAnd+
-    На сервере данных были найдены файлы, не совместимые с данной версией программы. Для их использования, пожалуйста, обновите приложение.
+    На сервере данных были найдены файлы, не совместимые с данной версией программы. Чтобы их использовать, обновите приложение.
     Nominatim (Интернет)
     Определение положения…
     Моё местоположение (найдено)
@@ -482,8 +482,8 @@
     Места
     Другое
     Не нужно
-    Отсутствует базовая карта, покрывающая весь мир на мелком масштабе. Пожалуйста загрузите World_basemap_x.obf для полноценный работы приложения.
-    На устройстве отсутствуют локальные данные. Пожалуйста, загрузите их для того, чтобы использовать приложение без интернета.
+    Загрузите базовую карту мира, чтобы получить обзор всего мира с низким уровнем масштабирования.
+    На устройстве отсутствуют локальные данные. Загрузите их, чтобы использовать приложение без интернета.
     "
 \n
 \nУдерживайте для вызова настроек"
@@ -518,9 +518,9 @@
     Обратное направление GPX
     Использовать текущий пункт назначения
     Пройти весь путь
-    Для этого региона доступны локальные векторные карты. 
-\n\t 
-\n\tДля их использования выберите в «Меню» → «Настройки карты» → «Источник карты…» → «Векторные карты».
+    Для этого региона есть локальные векторные карты.
+\n\t
+\n\tМеню → Настройки карты → Источник карты → Векторные карты.
     Голосовые инструкции
     Выберите канал вывода голосовых подсказок.
     Канал голосовых звонков (прерывает автомобильную Bluetooth стереосистему)
@@ -531,14 +531,14 @@
     Прозрачность наложения
     Отрегулируйте прозрачность основной карты.
     Прозрачность основной карты
-    Карта подложки…
+    Карта подложки
     Карта подложки
     Выберите карту подложки
-    Карта наложения…
+    Карта наложения
     Карта наложения
     Выберите слой наложения поверх основной карты
     Карта уже установлена, настройки будут обновлены.
-    Выберите (тайловые) карты для установки или обновления.
+    Выберите тайловые карты для установки или обновления.
     Для данной операции требуется подключение к интернету, но оно недоступно.
     Загрузить ещё…
     Минимальный масштаб для использования векторных карт.
@@ -565,7 +565,7 @@
     Отправить местоположение
     Поделиться местоположением
     Путевая точка GPX «{0}» добавлена
-    Добавить путевую точку к записанному треку GPX
+    Добавить точку в записанный трек
     Административное
     Препятствие
     Образование
@@ -610,7 +610,7 @@
 \nНавигация временно переключена на онлайн-сервис CloudMade.
     Невозможно найти указанную папку.
     Папка хранилища данных
-    У вас имеется предыдущая версия OsmAnd. Все локальные данные поддерживаются новой версией. Однако избранные точки нужно выгрузить из предыдущей версии приложения и загрузить в новую.
+    У вас установлена предыдущая версия OsmAnd. Все локальные данные поддерживаются новой версией. Однако избранные точки нужно выгрузить из предыдущей версии приложения и загрузить в новую.
     Сборка {0} успешно установлена ({1}).
     Загружается сборка…
     Установить OsmAnd — {0} из {1} {2} МБ\?
@@ -676,8 +676,8 @@
     Ориентация карты
     Детали маршрута
     Избранные точки успешно импортированы
-    Файл GPX, содержащий избранные точки, не был найден в {0}
-    Избранные точки сохранены в {0}
+    GPX-файл с сохранёнными точками отсутствует в {0}
+    Точки сохранены в {0}
     Нет избранных точек для сохранения
     Не удалось загрузить GPX.
     Отправить отчёт
@@ -689,7 +689,7 @@
     Маршрут
     Заметки OSM (онлайн)
     POI…
-    Источник карты…
+    Источник карты
     Слои
     Искать POI
     Использовать трекбол для перемещения по карте.
@@ -801,7 +801,7 @@
     Только показать
     Запуск сопровождения
     Вид транспорта:
-    Сначала выберите пункт назначения
+    Сначала задайте пункт назначения
     Маршрут
     Приложение «Статус GPS» не найдено. Искать в магазине приложений\?
     Рабочие часы
@@ -819,7 +819,7 @@
     POI
     Не удалось сохранить файл GPX.
     Не удалось рассчитать маршрут.
-    Не удалось рассчитать маршрут.
+    Не удалось рассчитать маршрут
     Невозможно построить маршрут.
     Проложен новый маршрут, расстояние
     Вы прибыли.
@@ -864,7 +864,7 @@
     3D вид
     Показать последние использованные POI на карте.
     Показывать POI
-    Выберите источник онлайн или кешированных тайлов карты.
+    Выберите ресурс с картами онлайн или в кеше.
     Растровые карты
     Источник карты
     Использовать интернет
@@ -905,13 +905,13 @@
     Да
     Отмена
     Нет
-    Введите имя избранной точки
+    Название точки
     Избранная
     Точка «{0}» была успешно добавлена к избранным.
-    Редактировать точку
-    Удалить точку
+    Редактировать место
+    Удалить из моих
     Удалить точку «%s» из избранных\?
-    Точка {0} была успешно удалена из избранных.
+    Точка {0} удалена.
     Комментарий добавлен
     Не удалось добавить комментарий.
     Комментарий
@@ -1033,7 +1033,7 @@
     Частный
     Забрать автомобиль со стоянки
     Предупреждение
-    Напоминание о необходимости забрать автомобиль добавлено в ваш календарь, где оно может быть изменено или удалено.
+    Напоминание забрать авто добавлено в календарь, там его можно изменить или удалить.
     Задайте максимальное время стоянки
     Удалить отметку места парковки?
     Удалить точку парковки
@@ -1051,7 +1051,7 @@
     Запись места и времени парковки вашего авто.
 \nИ место, и время отображаются на панели управления или как виджет на карте. Можно добавить напоминание в календаре Android.
     Место парковки
-    Пометить место парковки
+    Отметить парковку
     Удалить метку места парковки
     Точка отправления слишком далеко от ближайшей дороги.
     Общие места
@@ -1181,9 +1181,9 @@
     Добавить последним промежуточным пунктом
     Добавить первым промежуточным пунктом
     Заменить пункт назначения
-    Пункт назначения уже установлен:
+    Пункт назначения уже задан:
     Пункт %1$s
-    Пункты назначения
+    Точки маршрута
     Промежуточный пункт %1$s
     Удалить пункт
     Службы мониторинга
@@ -1210,7 +1210,7 @@
 \nГлобальные данные (между 70° на севере и 70° на юге) основываются на измерениях SRTM (Shuttle Radar Topography Mission) и ASTER (Advanced Spaceborne Thermal Emission and Reflection Radiometer), инструментом визуализации Terra, флагманского спутника Земли системы наблюдения NASA. ASTER является результатом совместных усилий NASA, министерства экономики Японии, торговли и промышленности (METI), космических систем Японии (J-spacesystems).
     Фото %1$s %2$s
     Аудио/видеоданные
-    Вы уверены, что хотите остановить навигацию?
+    Остановить навигацию\?
     Вы уверены, что хотите удалить пункт назначения (и промежуточные пункты)?
     Точный маршрут (альфа)
     Пожертвуйте, чтобы увидеть новые функции реализованными в приложении.
@@ -1258,16 +1258,16 @@
     Отменить маршрут
     Очистить пункт назначения
     Искать улицу в ближайших населённых пунктах
-    Сортировать от двери до двери
+    В порядке следования домов
     Доступно %1$d файлов для скачивания
     осталось %1$d файлов
-    Пожалуйста, подождите, пока завершится текущая операция
+    Подождите, пока завершится текущая операция
     Открыть существующий файл GPX
     Начать новый подтрек
     Имя файла GPX
     Файл GPX сохранён в {0}
     Инструмент расчёта дистанции и планирования
-    Промежуточные пункты выстроены в оптимальный маршрут от текущего местоположения до пункта назначения.
+    Оптимальный порядок точек маршрута по пути к месту назначения.
     Не удалось выполнить резервное копирование изменений OSM.
     Резервное копирование как правка OSM
     высота
@@ -1281,7 +1281,7 @@
     Контурные линии
     Загрузка…
     Создание маршрутов по нажатию на карте, а также использование или изменение существующих файлов GPX, планирование поездки и измерение расстояния между точками. Результаты могут быть сохранены в виде файла GPX, который впоследствии может быть использован для навигации.
-    Установить как пункт назначения
+    Сделать пунктом назначения
     Сначала установите город или улицу
     Пункт назначения %1$s
     Тип фокусировки камеры
@@ -1304,11 +1304,11 @@
     К:
     Через:
     От:
-    У вас уже установлены промежуточные пункты.
+    Промежуточные пункты уже заданы.
     Названия улиц (TTS)
     Объявлять…
     Настройки озвучивания названий улиц, предупреждений о дорожном движении (принудительные остановки, искусственные неровности), камер контроля скорости и ограничений скорости.
-    Пожалуйста, укажите в настройках пароль и имя пользователя OSM
+    Укажите в настройках пароль и имя пользователя OSM
     Карта: 
     Пароль OSM (необязательно)
     Выберите регион вождения: США, Европа, Великобритания, Азия и другие.
@@ -1341,14 +1341,14 @@
     Пеший туризм
     Мотоцикл
     Вы уверены, что желаете удалить %1$d изменений OSM\?
-    Пожалуйста, сначала рассчитайте маршрут
+    Сначала постройте маршрут
     Симуляция использования рассчитанного маршрута 
     Симуляция использования трека GPX
     Без автомасштаба
     Ближний план
     Средний план
     Дальний план
-    Избегать автомагистрали
+    Избегать автомагистралей
     Без автомагистралей
     Предпочитать автомагистрали
     Предпочитать автомагистрали
@@ -1357,7 +1357,7 @@
     Без грунтовых дорог
     Избегать грунтовых дорог
     Без паромов
-    Избегать паромные переправы
+    Исключить паромные переправы
     Максимальная масса
     Укажите допустимый предел массы автомобиля для учёта при построении маршрута.
     Отображение карты
@@ -1383,7 +1383,7 @@
     Быстрое построение маршрута не удалось (%s), отмените для возврата к медленному построению.
     Масштаб
     Выберите GPX…
-    Установить пункт назначения
+    Задать пункт назначения
     Предпочтения маршрута
     Информация про маршрут
     Добавить следующим пунктом назначения
@@ -1455,12 +1455,12 @@
     Повторять навигационные инструкции
     Объявление прибытия
     Как скоро следует сообщать о прибытии?
-    Избранные точки, опубликованные через OsmAnd
+    Места, отправленные в OsmAnd
     Рассчитать маршрут между точками
     Мировые пункты обмена bitcoin
     дней
     Соединение
-    Сохранить данные как файл GPX или импортировать путевые точки в избранные\?
+    Сохранить данные как трек файл или импортировать путевые точки в избранные\?
     Розовый
     Коричневый
     Пустой файл GPX
@@ -1483,7 +1483,7 @@
     Интервал разбиения
     Старт навигации автоматически
     Сохранить как группу избранных
-    Установить пункты назначения
+    Задать точки маршрута
     Метки точек
     "
 \n
@@ -1556,8 +1556,8 @@
     Скачать недостающие карты %1$s (%2$d МБ)\?
     Путевые точки
     Дорожные предупреждения
-    Избранные поблизости
-    POI поблизости
+    Мои места рядом
+    Ближайшие POI
     Туры
     Все
     Расстояние
@@ -1579,7 +1579,7 @@
     Платный проезд
     Знак остановки
     Снизьте скорость
-    Скоростной радар
+    Камера скорости
     Дорожные предупреждения
     Выберите допустимое значение превышения скорости выше которого вы получите голосовое предупреждение.
     Допустимое превышение скорости
@@ -1594,7 +1594,7 @@
     Анонимному пользователю недоступно:\n- создание групп;\n- синхронизация групп и устройств с сервером;\n- управление группами и устройствами в личном кабинете.
     Вы вошли как %1$s
     Маршруты
-    Подробности
+    Детали
     Транспорт
     Другие атрибуты карты
     Настройки карты
@@ -1650,7 +1650,7 @@
     Пешеходный переход
     Пешеходные переходы
     Начать навигацию по треку?
-    Запуск альтернативного маршрута путём указания дорог, которых следует избегать
+    Запуск альтернативного маршрута путём исключения указанных дорог
     Запись трека по требованию
     Прокси-сервер
     Укажите прокси-сервер.
@@ -1719,9 +1719,9 @@
     Выход
     Показать
     Показать все
-    Показать на карте
+    Показывать на карте
     Карта
-    Избранные
+    Сохранено
     Избранные
     Добавить к избранным
     Аудио
@@ -1741,7 +1741,7 @@
     Мои места
     Избранные
     Треки
-    Текущий пишущийся трек
+    Текущий трек
     Поделиться заметкой
     Дата выпуска
     Настройки навигации
@@ -1781,12 +1781,12 @@
 \nВ случае активации этого вида, стиль карты меняется на «Зимний/лыжный», показывая все детали пейзажа так, как они выглядят зимой. Такой (зимний) вид может быть отменён либо путём деактивации здесь, либо если вы поменяете «Стиль карты» в меню «Настройки карты» на желаемый вид.
     Текущий маршрут
     Скачать карты
-    Для правильного отображения дорожных знаков и правил, пожалуйста, выберите свой регион вождения:
+    Для правильного отображения дорожных знаков и правил выберите свой регион вождения:
     Добро пожаловать
     Отметить для удаления
     OsmAnd обеспечивает глобальный локальный просмотр карт и локальную навигацию.
     OSM изменения добавлены в локальную базу данных
-    Во многих странах (Германия, Франция, Италия и другие) использование предупреждения о камерах контроля скорости не допускается законом. OsmAnd не несёт никакой ответственности, если вы нарушите закон. Пожалуйста, нажмите «Да» только если вы имеете право использовать эту функцию.
+    Во многих странах (Германия, Франция, Италия и другие) использование предупреждений о камерах контроля скорости незаконно. OsmAnd не несёт никакой ответственности, если вы нарушите закон. Нажимайте «Да» только если вы имеете право использовать эту функцию.
     Информация A-GPS
     Данные A-GPS загружены: %1$s
     Сообщение
@@ -1815,11 +1815,11 @@
     Переместить файлы данных Osmand в новое место назначения\?
     Напечатайте для поиска
     Номера домов
-    Избегать пересечение национальных границ
+    Избегать перехода границы
     Максимальная высота
     Укажите высоту транспортного средства для учёта при построении маршрута.
-    Умный перерасчёт маршрута
-    Перерасчёт только начальной части маршрута для длительных поездок.
+    Умный пересчёт маршрута
+    Для больших маршрутов пересчитывать только начало.
     Удалить правки OSM
     Выключено
     Раскраска по сетевой принадлежности
@@ -1889,8 +1889,8 @@
     Для применения изменения требуется перезапуск.
     Нравится ли вам приложение?
     Оценить приложение
-    Пожалуйста, дайте оценку OsmAnd на Google Play
-    Пожалуйста, дайте нам знать о любых предложениях.
+    Пожалуйста, оцените OsmAnd в Google Play
+    Отправляйте нам любые предложения.
     Цвет трека GPX
     Толщина трека GPX
     Нет доступных обновлений
@@ -1922,7 +1922,7 @@
     Добавить часы работы
     Тип POI
     Количество строк на странице %1$s
-    Пожалуйста, укажите тип POI.
+    Укажите тип POI.
     Жирный контур
     Рабочие дни
     Избранные
@@ -1936,7 +1936,7 @@
     Все несохранённые изменения будут потеряны. Продолжить\?
     Моделировать ваше местоположение, используя рассчитанный маршрут или записанный трек GPX.
     Остановить моделирование своего местоположения.
-    Добавить новую
+    Создать новую
     Выберите категорию
     Выберите единицы измерения скорости.
     Единицы измерения скорости
@@ -1960,9 +1960,9 @@
     Карты мира
     Добавить в избранные
     Региональные карты
-    Пожалуйста, используйте название категории, которое ещё не существует.
+    Задайте название, которое ещё не используется.
     Название категории
-    Добавить новую категорию
+    Добавить категорию
     Слой рельефа местности выключен
     Контурные линии выключены
     Дороги
@@ -1988,7 +1988,7 @@
     Карта загружена
     QR-код
     Показать карту
-    Мировая обзорная карта (охватывающая весь мир при низком уровне масштабирования) отсутствует или устарела. Пожалуйста, загрузите её для глобального обзора.
+    Базовая карта мира (покрывающая весь мир с низким уровнем масштабирования) отсутствует или устарела. Загрузите её для глобального обзора.
     Карта %1$s готова к использованию.
     Имитировать первый запуск
     Устанавливает признак первого запуска приложения, не изменяет других настроек.
@@ -2029,7 +2029,7 @@
     Удалить путевую точку GPX\?
     Редактировать путевую точку GPX
     Без лестниц
-    Избегать лестницы и ступеньки
+    Избегать ступеней и лестниц
     Без пересечений границ
     Обновлять
     Загружать только по Wi-Fi
@@ -2050,7 +2050,7 @@
     Еженедельно
     Месяц и страна:
     Открыть повторно
-    Выберите дороги, которых следует избегать при навигации.
+    Укажите дороги, которых следует избегать при навигации.
     Отменить все
     Тип
     Правки OSM отправлены через OsmAnd
@@ -2080,11 +2080,11 @@
     Не показывать моё имя в отчётах
     Стоимость в месяц
     Ежемесячный платёж
-    Пожалуйста, введите действительный адрес электронной почты
+    Введите действительный адрес электронной почты
     Спасибо за поддержку OsmAnd!
 \nЧтобы активировать все новые возможности вам нужно перезапустить приложение.
     Параметры подписки
-    Пожалуйста, сначала приобретите подписку на OsmAnd Live
+    Сначала приобретите подписку на OsmAnd Live
     Эта подписка позволяет получать ежечасное обновление для всех карт мира.
 \nЧасть доходов переводится сообществу OSM и выплачивается за каждый вклад в OSM.
 \nЕсли вы любите OsmAnd и OSM и хотите поддержать их, данная подписка — отличный способ сделать это.
@@ -2110,9 +2110,9 @@
     Запись удалена
     элементы удалены
     Автообновления
-    Выберите или скачайте голосовые оповещения для вашего языка.
+    Выберите или скачайте голосовые подсказки для вашего языка.
     Полный отчёт
-    Пересчитать маршрут
+    Пересчёт маршрута
     Имя пользователя и пароль OSM
     Количество получателей
     Активные
@@ -2134,18 +2134,18 @@
     Переместить ↑
     Переместить ↓
     Завершить навигацию
-    Избегать дорог
+    Исключить из маршрута
     Публичное имя
     Поддерживаемый регион
     Пожалуйста, введите публичное имя
     Предлагается выбрать, прежде всего, управление приложением через гибкую панель управления или статическое меню. Ваш выбор всегда может быть изменён в настройках панели управления.
     Просмотр
-    Пожалуйста, добавьте маркеры на карте
+    Добавьте маркеры на карте
     Путевых точек не найдено
     Добавить маркеры для всех точек?
     Добавить к маркерам
     Активирует функцию маркеров карты.
-    Переключено на внутреннее хранилище, так как выбранная папка хранения данных защищена от записи. Пожалуйста, выберите папку, доступную для записи.
+    Переключено на внутреннюю память, поскольку выбранная папка хранения данных защищена от записи. Выберите папку, доступную для записи.
     Общее хранилище
     Сортировать
     Перейти вверх
@@ -2170,7 +2170,7 @@
     Не пересчитывать маршрут при обратном направлении движения
     Предотвращает автоматический пересчёт маршрута при обратном направлении движения.
     Пункт назначения не задан
-    Звуковая индикация направления
+    Озвучивать направление
     Индицировать звуком направление на целевую точку.
     Тактильная индикация направления
     Индицировать вибрацией направление на целевую точку.
@@ -2205,7 +2205,7 @@
     Не показывать новые версии
     Обновить все карты сейчас?
     Очистить всю плитку
-    Топливно-эффективный способ
+    Снижать расход топлива
     Использование топливо-сберегающего пути (обычно короче).
     Вы уверены, что хотите заменить избранные %1$s\?
     Изменить
@@ -2216,7 +2216,7 @@
     Скачать {0} файл(ов)\?
 \nИспользуется {3} МБ временного хранилища и {1} МБ постоянного. (Из {2} МБ)
     Найти моё местоположение
-    Прокладывайте маршруты и открывайте новые для себя места без подключения к интернету
+    Стройте маршруты и открывайте новые места без подключения к интернету
     Разрешить доступ к местоположению
     Дать разрешение
     Хранилище данных OsmAnd (для карт, файлов треков и пр.): %1$s.
@@ -2235,7 +2235,7 @@
     Получить
     Получайте неограниченное количество загрузок карт, вдобавок к еженедельным, ежедневным и даже почасовым обновлениям.
     Неограниченный доступ к картам, обновлениям и плагину «Википедия».
-    Выберите голосовое сопровождение
+    Голосовое сопровождение
     Абонентская плата взимается за выбранный период. Отменить подписку можно в Google Play в любой момент.
     Пожертвование для сообщества OSM
     Часть вашего пожертвования будет отправлена участникам OSM. Стоимость подписки при этом остаётся прежней.
@@ -2249,7 +2249,7 @@
     Некорректный OLC
 \n
     Короткий OLC
-\nПожалуйста, введите полный код
+\nВведите полный код
     Корректный полный OLC
 \nОписывает область: %1$s x %2$s
     Начать новый сегмент после 6 минутного перерыва, новый трек после 2 часового перерыва, или новый файл после длительного перерыва (если изменилась дата).
@@ -2269,7 +2269,7 @@
     Удалить действие
     Вы уверены, что хотите удалить действие «%s»\?
     Показать избранные
-    Скрыть избранные
+    Скрыть сохранённые
     Показать/скрыть POI
     Показать %1$s
     Скрыть %1$s
@@ -2296,11 +2296,11 @@
     Фото с улиц онлайн для каждого. Открывайте места, взаимодействуйте, запечатлейте весь мир.
     Mapillary
     Уличные фотографии для всех. Открывайте для себя места, сотрудничайте, снимайте мир.
-    Название содержит слишком много заглавных букв. Вы хотите продолжить?
-    Переключатель, чтобы приостановить или возобновить навигацию.
+    В названии слишком много заглавных букв. Продолжить\?
+    Кнопка приостановки и возобновления навигации.
     Показывать диалог завершения навигации
     Запуск/остановка навигации
-    Переключатель, чтобы начать или остановить навигацию.
+    Кнопка запуска и остановки навигации.
     Сохранять записанные треки в папках помесячно
     Сохранять записанные треки в подпапках с записью месяца (например, 2018-01).
     Кеш тайлов
@@ -2320,14 +2320,14 @@
     Макс/Мин
     Мин/Макс
     Пауза/возобновление навигации
-    Перезагрузка тайлов для отображения актуальных данных.
+    Перезагрузить тайлы для актуализации данных.
     Введите имя пользователя
     Сбросить
     До
     От
-    Перезагрузить
+    Обновить
     Фильтровать фотографии по отправителю, дате или типу. Фильтры применяются только для больших масштабов.
-    Не удалось импортировать файл. Пожалуйста, убедитесь что OsmAnd имеет разрешение на его чтение.
+    Не удалось импортировать файл. Убедитесь, что OsmAnd имеет разрешение на его чтение.
     Откорректированное расстояние
     Установите Mapillary, чтобы добавить фотографии этого места.
     Высота маршрута
@@ -2335,14 +2335,14 @@
     Показать на карте после сохранения
     Просмотрите карту и добавьте точки
     Измерить расстояние
-    Необходимо добавить хотя бы одну точку.
+    Добавьте хотя бы одну точку.
     Фотография Mapillary
     Улучшить фотопокрытие через Mapillary
     Скрыть, начиная с уровня масштабирования
     Прозрачно-розовый
     Берберский
     Переместить все в историю
-    Сортировать по
+    Сортировка
     Без анимации
     Выключение анимации карты.
     Выйти без сохранения?
@@ -2385,7 +2385,7 @@
     Маркеры
     Изменить заметку
     Изменить заметку OSM
-    Добавить копию пункта отправления в качестве пункта назначения.
+    Добавить пункт отправления в качестве пункта назначения.
     Сделать маршрут круговым
     Использовать местоположение
     Добавлено
@@ -2447,7 +2447,7 @@
     Неправильный формат
     Введите новое имя
     Назад
-    Внешний вид на карте
+    Вид на карте
     Выберите категорию избранных для добавления к маркерам.
     Категория избранных
     Добавить группу
@@ -2470,23 +2470,23 @@
     Полноэкранный режим
     Отметить пройденным
     Файл %1$s не содержит путевых точек, импортировать его как трек?
-    Выберите трек, чтобы добавить свои путевые точки к маркерам.
+    Выберите трек, чтобы добавить в маркеры его точки.
     Трек путевых точек
     Направо
     Налево
     Показать цифровую панель
     Нажатие на карте переключает кнопки управления и виджеты.
-    могут быть импортированы как избранные точки или как файл GPX.
+    возможен импорт в избранные точки или как трек файл.
     Больше
     Импортировать как файл GPX
-    Импортировать как избранные
+    Импортировать в Мои места
     Импорт файла
     Неправильный ввод
     Просмотр
     Путевые точки добавлены в маркеры карты
     Маршрут рассчитан
     Путешествие
-    Добавить ваше местоположение как точку отправления при планировании маршрута.
+    Добавьте свою позицию в качестве точки отправления, чтобы построить идеальный маршрут.
     Показать пройденные
     Скрыть пройденные
     Удалить из «Маркеров карты»
@@ -2669,8 +2669,8 @@
     Место без названия
     Текущий
     Добавляет промежуточную остановку
-    Добавляет первую остановку
-    Перемещает пункт назначения и создаёт промежуточную остановку
+    Добавляет начальную остановку
+    Добавляет в конец точку в качестве нового пункта назначения
     Показать закрытые заметки
     Показать/скрыть заметки OSM на карте.
     GPX — подходит для экспорта в JOSM и другие OSM редакторы.
@@ -2678,7 +2678,7 @@
     Файл GPX
     OSC файл
     Выберите тип файла
-    Экспортировать как: заметки OSM, POI или оба.
+    Экспортировать в виде POI, заметок OSM или обоих вариантов.
     Все данные
     Заметки OSM
     Впереди туннель
@@ -2701,10 +2701,10 @@
     З
     Ю
     С
-    Необязательное имя точки
+    Имя точки (необязательно)
     Спортивные сплавы
-    Сначала дальнее
-    Сначала ближнее
+    Сначала дальние
+    Сначала ближние
     Группа удалена
     Очистить все промежуточные точки
     Использовать двузначную долготу
@@ -2808,7 +2808,7 @@
     Редактировать точку
     Добавить точку
     Сохранить как трек
-    Добавлено вами точек — %1$s. Введите имя файла и нажмите «Сохранить».
+    Добавлено точек: %1$s. Введите имя файла и нажмите «Сохранить».
     Точка %1$s удалена
     Мир
     Ваш поисковый запрос будет отправлен: «%1$s», вместе с вашим местоположением.
@@ -2884,7 +2884,7 @@
     Гуарани
     Вы используете {0} карту, которая поставляется OsmAnd. Хотите запустить полную версию Osmand\?
     Запустить OsmAnd\?
-    Установить пункт назначения
+    Добавить точку маршрута
     Добавить промежуточный пункт
     Установить отправную точку
     Путь
@@ -2915,7 +2915,7 @@
     Работа
     Ровность
     Предыдущий маршрут
-    Пожалуйста, сначала установите пункт назначения
+    Сначала задайте пункт назначения
     Поменять
     Показать больше
     Отображаемые треки
@@ -2998,28 +2998,28 @@
     Государственная дорога
     Пешком
     Сократите длину тега «%s» до менее чем 255 символов.
-    Выберите виды общественного транспорта, которые следует избегать при навигации:
-    Избегать виды транспорта…
+    Выберите виды транспорта, которых следует избегать при навигации:
+    Исключить виды транспорта…
     Длина значения «%s»
     Режим %s
     Без булыжников или брусчатки
-    Избегать булыжники и брусчатку
+    Избегать мощёных улиц и брусчатки
     Миллирадианы
     Угловые единицы
     Изменить, в чём измеряется азимут.
     Градусы
     Без трамваев
-    Избегать трамваи
+    Исключить трамваи
     Без автобусов
-    Избегать автобусы и троллейбусы
+    Исключить автобусы и троллейбусы
     Без маршрутных такси
-    Избегать маршрутные такси
+    Исключить маршрутные такси
     Без поездов
-    Избегать поезда
+    Исключить поезда
     Без метро
-    Избегать метро и лёгкий железнодорожный транспорт
+    Исключить метро и рельсовый транспорт
     Без паромов
-    Избегать паромы
+    Исключить паромы
     • Отображение времени между пересадками в общественном транспорте
 \n
 \n• Исправлен пользовательский интерфейс для \"Детали маршрута\"
@@ -3043,7 +3043,7 @@
     %1$d файлов (%2$s) присутствуют в предыдущем местоположении «%3$s».
     Переместить карты
     Не перемещать
-    Маршрут пешком составляет около %1$s, и может быть быстрее общественного транспорта
+    Маршрут пешком составляет около %1$s и может быть быстрее общественного транспорта
     Политика конфиденциальности
     Помогите нам сделать OsmAnd лучше
     Разрешите OsmAnd собирать и обрабатывать анонимные данные об использовании приложения. Мы не собираем и не храним данные о вашем местоположении или о любых местах, которые вы просматриваете на карте.
@@ -3067,12 +3067,12 @@
     Лошадь
     Вертолёт
     Вы можете добавить собственную модифицированную версию routing.xml в ..osmand/routing
-    Выберите значок
+    Значок
     Лыжи
     Тип: %s
     Базовый профиль
     Выберите тип навигации
-    Пожалуйста, выберите тип навигации для нового приложения
+    Выберите тип навигации для нового профиля
     Введите имя профиля
     Сначала необходимо указать имя профиля.
     Уже есть профиль с таким именем
@@ -3112,7 +3112,7 @@
     Лыжные туры
     Сани
     Склоны для катания на санях.
-    Более сложные маршруты с крутыми участками. Возможны препятствия, которых следует избегать.
+    Более сложные маршруты с крутыми участками дороги. В целом, препятствия, которых следует избегать.
     Сложные маршруты, с опасными препятствиями и крутыми участками.
     Предпочитаемая сложность
     Служба скачивания OsmAnd
@@ -3162,7 +3162,7 @@
     Выбор настроек навигации для профиля
     Выбор верхней границы изменений
     Использовать бесконтактный датчик (сенсорный выключатель)
-    Пожалуйста, включите хотя бы один профиль приложения, чтобы использовать эту настройку.
+    Включите хотя бы один профиль, чтобы использовать эту настройку.
     %s сохранено
     Навигация OsmAnd
     Пользовательский профиль навигации
@@ -3254,7 +3254,7 @@
     Переместить в новое место назначения
     Внутреннее хранилище, скрытое от пользователя и других приложений.
     Изменение папки хранилища
-    Избегать определённых маршрутов и типов дорог
+    Исключить определённые маршруты и типы дорог
     Использовано %1$s ТБ
     Использовано %1$s ГБ
     Использовано %1$s МБ
@@ -3405,14 +3405,14 @@
     Все настройки профиля будут сброшены в значения по умолчанию после установки.
     Сбросить все настройки профиля\?
     %1$s: %2$s
-    Нет правил маршрутизации в «%1$s». Пожалуйста, выберите другой файл.
+    Нет правил маршрутизации в «%1$s». Выберите другой файл.
     Для использования этой функции требуется разрешение.
     Это низкоскоростной фильтр отсечки, чтобы не записывать точки ниже определённой скорости. Это может сделать записанные треки более гладкими при просмотре на карте.
     Упорядочить категории
     Изменяйте порядок сортировки списка, скрывайте категории. Вы можете импортировать или экспортировать все изменения с профилями.
-    Вы можете добавить новую пользовательскую категорию, выбрав одну или несколько категорий.
+    Вы можете создать свою категорию, выбрав одну или несколько категорий из списка.
     Сброс к настройкам по умолчанию приведёт к возврату порядка сортировки по умолчанию.
-    Добавить пользовательскую категорию
+    Создать свою категорию
     Показывать только ночью
     Все настройки плагина восстановлены до состояния по умолчанию.
     Все настройки профиля восстановлены до состояния по умолчанию.
@@ -3454,9 +3454,9 @@
     Укажите имя профиля
     Открыть настройки
     Плагин отключён
-    Этот плагин представляет собой отдельное приложение, вам нужно будет удалить его отдельно, если вы больше не планируете его использовать.
+    Плагин является отдельным приложением, удалите его отдельно, если больше не собираетесь использовать.
 \n
-\nПлагин останется на устройстве после удаления OsmAnd.
+\nПосле удаления OsmAnd плагин останется на устройстве.
     Меню
     %1$s — %2$s — %3$s
     Маршрутизация
@@ -3464,8 +3464,8 @@
     Импортируемый профиль содержит дополнительные данные. Нажмите «Импорт», чтобы импортировать только данные профиля, или выберите дополнительные данные.
     Вы можете выбрать дополнительные данные для экспорта вместе с профилем.
     Приложение по умолчанию (%s)
-    Отключить перерасчёт
-    Минимальное расстояние для перерасчёта маршрута
+    Не перестраивать
+    Минимальное отклонение для перестроения маршрута
     Маршрут будет пересчитан, если расстояние до него больше заданного параметра
     Пользовательский профиль
     Угол: %s°
@@ -3501,7 +3501,7 @@
     Ваши заметки OSM находятся в %1$s.
     Видеозаметки
     Фотозаметки
-    Перерасчёт маршрута
+    Пересчёт маршрута
     Имя пользователя и пароль
     Эти настройки применяются ко всем профилям.
     Редактирование OSM
@@ -3537,7 +3537,7 @@
     Побочный эффект: в записи трека будут отсутствовать все участки, где критерий минимальной скорости не был соблюдён (например, когда вы толкаете велосипед вверх по крутому склону). Также не будет информации о периодах покоя, например, во время отдыха. Это влияет на любой анализ или последующую обработку, например, при попытке определить общую продолжительность поездки, время в движении или среднюю скорость.
     Побочный эффект: в результате фильтрации по точности, точки могут быть полностью пропущены, например, под мостами, под деревьями, между высокими зданиями или при определённых погодных условиях.
     Примечание: при включении GPS непосредственно перед записью точность определения первой точки может быть снижена, поэтому мы рассматриваем добавление секундной задержки перед записью точки (либо записи лучшей из трёх последовательных точек и т. д.), но пока это не реализовано.
-    Этот фильтр позволяет избежать записи повторяющихся точек, между которыми могло произойти очень малое фактическое перемещение, и создаёт более приятный визуальный вид треков без последующей обработки.
+    Фильтр предотвращает запись точек при отсутствии фактического перемещения и улучшает вид треков без обработки.
     Побочные эффекты: периоды в состоянии покоя не записываются вообще или только по одной точке каждый. Небольшие (в реальности) перемещения (например, в сторону, указывающие возможное изменение направления движения) могут быть отфильтрованы. Файл содержит меньше информации для последующей обработки и имеет худшую статистику, отфильтровывая явно избыточные точки во время записи, при этом потенциально сохраняя артефакты, вызванные плохим приёмом или эффектами модуля GPS.
     Рекомендация: настройка 5 метров может должна вас устроить, если нет необходимости учитывать более короткие перемещения, и вы точное не хотите записывать данные в состоянии покоя.
     Указанные %1$s уже существуют в OsmAnd.
@@ -3571,9 +3571,9 @@
     Пользовательский плагин
     Удалить описание
     Добавить описание
-    Выберите группу
+    Категории
     Квадрат
-    Выберите фигуру
+    Форма
     Круг
     Восьмиугольник
     Сообщение о доступности
@@ -3588,7 +3588,7 @@
     Затенение рельефа использует тёмные оттенки для отображения склонов, вершин и низменностей.
     Для отображения склонов на карте необходимы дополнительные карты.
     Склоны
-    Заменить другую точку на эту.
+    Заменить этой точкой другую.
     Изменения применены к профилю «%1$s».
     Невозможно прочитать из «%1$s».
     Невозможно записать в «%1$s».
@@ -3598,9 +3598,9 @@
     Язык
     Все языки
     Для просмотра POI Википедии на карте необходимы дополнительные карты.
-    Настройка количества элементов в разделах «Панель», «Настройка карты» и контекстном меню. 
-\n 
-\nМожно отключить неиспользуемые плагины, чтобы скрыть их элементы управления. %1$s.
+    Настройка элементов в разделах «Панель», «Настройка карты» и контекстном меню.
+\n
+\nОтключите неиспользуемые плагины, чтобы скрыть их элементы управления. %1$s.
     Элементы панели, контекстное меню
     Боковое меню
     Элементы ниже разделённые делителем.
@@ -3691,10 +3691,10 @@
     Скрыть общественный транспорт
     Показать общественный транспорт
     Показать/скрыть общественный транспорт
-    Добавить/редактировать избранные
+    Добавить/изменить место
     Создать/изменить POI
     Возврат к редактированию
-    Место стоянки
+    Парковки
     Переключатель, чтобы показать или скрыть общественный транспорт на карте.
     Восстановить исходный порядок
     Нажатие кнопки «Действия» переключает между выбранными профилями.
@@ -3721,7 +3721,7 @@
     Держать экран отключённым
     Держать экран включённым
     Файл SQLiteDB
-    Укажите имя источника онлайн-карты.
+    Название ресурса с онлайн-картами.
     Введите или вставьте URL онлайн-источника.
     Время устаревания
     Проекция Меркатора
@@ -3779,20 +3779,20 @@
     Оповещение о камерах контроля скорости в некоторых странах запрещено законом.
     Ориентация
     Удалено: %1$s
-    Перезапуск необходим для полного удаления данных камер контроля скорости.
+    Перезапустите приложение, чтобы удалить все данные о камерах контроля скорости.
     Удалить и перезапустить
     Удалить
     Укажите длину транспортного средства, разрешённую для движения по маршрутам.
     Предельная длина
     В этом устройстве нет камер контроля скорости.
     Роликовые коньки
-    Управление уровнем масштабирования карты с помощью кнопок регулировки громкости устройства.
+    Изменение масштаба карты кнопками громкости.
     Масштабирование кнопками громкости
     Укажите длину автомобиля, для длинных транспортных средств могут применяться ограничения на маршруте.
     Удалить следующий пункт
-    Пожалуйста, укажите название точки
-    Текущий пункт назначения на маршруте будет удалён. Если это пункт назначения, навигация остановится.
-    Информация о достопримечательностях из Википедии. Это ваш карманный автономный гид — просто включите плагин Википедии и наслаждайтесь статьями об объектах вокруг вас.
+    Задайте название точки
+    Следующая точка маршрута будет удалена. Если это конечный пункт, навигация завершится.
+    Информация о достопримечательностях из Википедии. Ваш карманный офлайн-путеводитель — просто включите плагин Википедии и читайте об объектах вокруг вас.
     Скачать карты Википедии
     Эндуро мотоцикл
     Мотороллер
@@ -3801,11 +3801,11 @@
     В карту
     Инвалидное кресло впереди
     Добавить к треку
-    Необходимо указать рабочие дни для продолжения
-    Маршрут между пунктами
+    Установите рабочие дни, чтобы продолжить
+    Маршрут между точками
     План маршрута
     Выберите нужный вариант разбиения: по времени или по расстоянию.
-    Выберите интервал с которым будут отображаться метки с расстоянием или временем на треке.
+    Интервал между метками расстояния или времени на треке.
     Своё
     Добавленная точка не будет видна на карте, так как выбранная группа скрыта, найти её можно в «%s».
     Показывать значки старта и финиша
@@ -3819,22 +3819,22 @@
     Выберите файл трека для открытия.
     Готово
     Перезаписать трек
-    Выбрать трек, к которому будет добавлен новый сегмент.
+    Выбрать трек, к которому будет добавлен новый сегмент.
     Профиль
     Предельная дистанция
     Сохранить как новый трек
     Обратный маршрут
-    Весь трек будет перестроен с использованием выбранного профиля.
-    Только следующий сегмент будет перестроен с использованием выбранного профиля.
+    Профиль будет примёнен ко всему маршруту.
+    Профиль будет применён только к следующему сегменту.
     Следующий сегмент
     Весь трек
-    Для использования данной возможности OsmAnd проложит ваш трек по дорогам.
+    Для использования данной возможности OsmAnd необходимо привязать ваш трек по дорогам.
 \n
-\nДалее вам следует выбрать профиль для построения маршрута с учётом ограничений этого профиля.
-    Выберите как соединять точки: по прямой линии или построением маршрута.
-    В случае обратного направления
-    Закрыть план маршрута без сохранения\? Все изменения будут потеряны.
-    Изображения на уровне улиц
+\nНа следующем шаге необходимо выбрать профиль навигации для определения разрешенных дорог и пороговое расстояние, чтобы приблизительно привязать маршрут к дорогам.
+    Выберите способ соединения точек: прямой линией или прокладкой маршрута с выбранным профилем.
+    При обратном направлении
+    Все изменения будут утеряны. Закрыть план маршрута\?
+    Съёмка уличного уровня
     Сохранить как новый файл трека
     Добавить в файл трека
     Треки
@@ -3846,14 +3846,14 @@
     Добавить файлы треков
     Импортируйте или запишите файлы треков
     Добавить путевую точку
-    Добавить путевую точку
+    Добавить точку к треку
     Запись поездки
     Сохранить как файл трека
     Следовать по маршруту
     Выберите файл маршрута для следования
-    Выберите или импортируйте файл маршрута.
+    Выберите файл трека или импортируйте его со своего устройства.
     Выбрать другой трек
-    Перейдите от моего местоположения к треку
+    Ведение от моей позиции к треку
     Точка трека для навигации
     Начало трека
     Ближайшая точка
@@ -3873,7 +3873,7 @@
     Укажите интервал общей записи трека (включается через виджет «Запись GPX» на карте).
     Остановить запись
     Возобновить запись поездки
-    По умолчанию системы
+    По выбору системы
     Все последующие сегменты
     Предыдущий сегмент
     Все предыдущие сегменты
@@ -3882,7 +3882,22 @@
     Все предыдущие сегменты будут пересчитаны с использованием выбранного профиля.
     Открыть сохранённый трек
     Остановка записи GPX при принудительном закрытии (через последние приложения). (Из панели уведомлений Android исчезнет значок фонового режима.)
-    сохраняется
-    Добавьте как минимум два пункта.
+    сохранен
+    Добавьте хотя бы две точки.
     ПОВТОРИТЬ
+    • Обновленный режим планирования маршрута позволяет использовать разные типы навигации для каждого сегмента и прикрепляет любой трек к дорогам
+\n
+\n • Новые параметры внешнего вида для треков: выберите цвет, толщину, включите стрелки направления и отметки начала/окончания
+\n
+\n • Улучшена видимость велосипедных узлов
+\n
+\n • Контекстное меню для треков с основной информацией
+\n
+\n • Улучшенные алгоритмы поиска
+\n
+\n • Улучшены параметры следования по треку в навигации
+\n
+\n • Исправлены проблемы с импортом/экспортом настроек профиля
+\n
+\n
 
\ No newline at end of file
diff --git a/OsmAnd/res/values-sc/strings.xml b/OsmAnd/res/values-sc/strings.xml
index e6308e5cb2..4036899b1a 100644
--- a/OsmAnd/res/values-sc/strings.xml
+++ b/OsmAnd/res/values-sc/strings.xml
@@ -3783,27 +3783,27 @@
     Disinstalla
     Orientamentu
     %1$s iscantzelladu
-    Depes torrare a allùghere pro iscantzellare de su totu sos datos de sos autovelox.
+    Torra a allùghere s\'aplicatzione pro iscantzellare totu sos datos de sos autovelox.
     Disinstalla e torra a allùghere
     Dillinda sa longària de su veìculu permìtida in sas àndalas.
     Lìmite de longària
     Custu dispositivu non tenet autovelox.
     Pàtinos in lìnia
-    Abìlita pro controllare su livellu de ismanniamentu cun sos butones de su volume de su dispositivu.
+    Controlla su livellu de ismanniamentu de sa mapa cun sos butones de su volume de su dispositivu.
     Butones de su volume pro s\'ismanniamentu
     Inserta sa longària de su veìculu tuo. Bi diant pòdere èssere unas cantas restritziones de sas àndalas pro sos veìculos longos.
-    Iscantzella su puntu de destinatzione imbeniente
+    Iscantzella su puntu de destinatzione prus a curtzu
     Fruni unu nùmene pro su puntu
     Su puntu de destinatzione atuale in s\'àndala at a èssere iscantzelladu. Si at a èssere sa destinatzione, sa navigatzione s\'at a firmare.
     Iscàrriga sas mapas de Wikipedia
-    Otene informatziones a pitzu de puntos de interesse dae Wikipedia. Est sa ghia non in lìnia tua de mantènnere in butzaca - abìlita s\'estensione Wikipedia e ispassia·ti cun sos artìculos a pitzu de sos ogetos a fùrriu de tie.
+    Otene informatziones a pitzu de puntos de interesse dae Wikipedia. Est sa ghia non in lìnia tua de mantènnere in butzaca - allughe s\'estensione Wikipedia e ispassia·ti cun sos artìculos a pitzu de sos ogetos a fùrriu de tie.
     Moto enduro
     Motorinu
     Cadira a rodas cara a in antis
     Cadira a rodas
     Go-kart
     Nota de OSM serrada
-    Depes impostare sas dies de traballu pro sighire
+    Imposta sas dies de traballu pro sighire
     Àndala intre puntos
     Pranìfica un\'àndala
     Annanghe a una rasta
@@ -3824,19 +3824,19 @@
     Subraiscrie sa rasta
     Sarva comente una rasta noa
     Fùrria s\'àndala
-    Sa rasta intrea at a èssere torrada a calculare impreende su profilu ischertadu.
-    Petzi su segmentu imbeniente at a èssere torradu a calculare impreende su profilu ischertadu.
-    Ischerta comente connètere sos puntos: cun una lìnia reta o calculende un\'àndala intre issos cun su profilu ischertadu.
+    Sa rasta intrea at a èssere torrada a calculare impreende su profilu ischertadu.
+    Petzi su segmentu imbeniente at a èssere torradu a calculare impreende su profilu ischertadu.
+    Ischerta comente connètere sos puntos: cun una lìnia reta o calculende un\'àndala intre issos comente dislindadu inoghe in suta.
     Rasta intrea
     Segmentu imbeniente
-    Pro impreare custa optzione OsmAnd tenet bisòngiu de alliniare sa rasta tua a sos caminos de sa mapa.
+    Pro impreare custa optzione OsmAnd tenet bisòngiu de alliniare sa rasta tua a sos caminos de sa mapa.
 \n
 \n In su passu chi benit as a dèpere ischertare su profilu de navigatzione pro rilevare sos caminos permìtidos e su lìmite de distàntzia pro aprossimare sa rasta tua cun sos caminos.
     Lìmite de distàntzia
     Profilu de navigatzione
-    Ischerta unu documentu de rasta in ue annànghere su segmentu nou.
+    Ischerta unu documentu de rasta in ue annànghere su segmentu nou.
     Fotografias a livellu de sas carreras
-    Ses seguru de chèrrere serrare sa pianificatzione de s\'àndala chene sarvare\? As a pèrdere totu sas modìficas.
+    Ses seguru de chèrrere serrare sa pianificatzione de s\'àndala e pèrdere totu sas modìficas\?
     In casu de diretzione furriada
     Rastas
     Càrriga sa rasta in unu documentu GPX
@@ -3859,7 +3859,7 @@
     Àndala de una rasta
     Sighi sa rasta
     Issèbera su documentu de sa rasta de sighire
-    Issèbera su documentu de sa rasta de sighire, o importa·nde unu.
+    Issèbera su documentu de sa rasta de sighire o importa·lu dae su dispositivu tuo.
     Ischerta un\'àtera rasta
     Nàviga dae sa positzione mea a sa rasta
     Puntu de sa rasta de navigare
diff --git a/OsmAnd/res/values-sk/strings.xml b/OsmAnd/res/values-sk/strings.xml
index 883aec744d..454bf3203b 100644
--- a/OsmAnd/res/values-sk/strings.xml
+++ b/OsmAnd/res/values-sk/strings.xml
@@ -3780,17 +3780,17 @@
     Prepínač pre zobrazenie alebo skrytie vrstvy Mapillary na mape.
     Smerovanie
     %1$s vymazané
-    Pre úplné odstránenie údajov o rýchlostných radaroch je potrebný reštart.
+    Reštartovať aplikáciu pre úplné odstránenie údajov o rýchlostných radaroch.
     Odinštalovať a reštartovať
     Odinštalovať
     Zadajte aká dĺžka vozidla musí byť povolená na trase.
     Limit dĺžky
     Toto zariadenie neobsahuje rýchlostné radary.
     Kolieskové korčule
-    Umožní ovládať priblíženie mapy tlačidlami hlasitosti zariadenia.
+    Ovládať priblíženie mapy tlačidlami hlasitosti zariadenia.
     Tlačidlá hlasitosti na približovanie
     Zadajte dĺžku vášho vozidla, pretože na trase môžu byť obmedzenia pre dlhé vozidlá.
-    Vymazať ďalší cieľový bod
+    Vymazať najbližší cieľový bod
     Prosím zadajte názov pre bod
     Aktuálny cieľový bod na trase bude vymazaný. Ak je to posledný cieľ, navigácia sa zastaví.
     Stiahnuť mapy Wikipédia
@@ -3800,8 +3800,8 @@
     Invalidný vozík
     Invalidný vozík dopredu
     Motokára
-    Zatvorená OSM poznámka
-    Pre pokračovanie musíte zadať pracovné dni
+    OSM poznámka zatvorená
+    Zadať pracovné dni pre pokračovanie
     Trasa medzi bodmi
     Naplánovať trasu
     Pridať do stopy
@@ -3822,25 +3822,23 @@
     Prepísať stopu
     Uložiť ako novú stopu
     Otočiť trasu
-    Celá stopa bude prepočítaná pomocou zvoleného profilu.
-    Len nasledujúci úsek bude prepočítaný pomocou zvoleného profilu.
-    Zvoľte ako spojiť body, priamou čiarou alebo vypočítať trasu medzi nimi pomocou zvoleného profilu.
+    Celá stopa bude prepočítaná pomocou zvoleného profilu.
+    Len nasledujúci úsek bude prepočítaný pomocou zvoleného profilu.
+    Zvoľte ako spojiť body, priamou čiarou alebo vypočítať trasu medzi nimi ako je určené ďalej.
     Celá stopa
     Ďalší úsek
-    Pre použitie tejto možnosti musí OsmAnd prichytiť vašu stopu na cesty v mape.
-\n
-\n V ďalšom kroku budete musieť zvoliť navigačný profil pre detekciu povolených ciest a hraničnú vzdialenosť pre aproximovanie vašej stopy cestami.
+    Ďalej, pre použitie tejto možnosti pripojte vašu stopu k najbližšej povolenej ceste s niektorým vaším navigačným profilom.
     Hraničná vzdialenosť
     Navigačný profil
-    Zvoľte súbor stopy, pre ktorú bude pridaný nový úsek.
+    Zvoľte súbor stopy, pre ktorú bude pridaný nový úsek.
     Snímky z úrovne ulice
-    Naozaj chcete zatvoriť plánovanie trasy bez uloženia\? Všetky zmeny sa stratia.
+    Naozaj chcete zahodiť všetky zmeny v plánovanej trasy jej zatvorením\?
     V prípade opačného smeru
     Trasa zo stopy
     Pridať prechodný bod stopy
     Nasledovať stopu
     Zvoľte súbor stopy pre nasledovanie
-    Zvoľte súbor stopy pre nasledovanie, alebo nejaký importujte.
+    Zvoľte súbor stopy pre nasledovanie alebo nejaký importujte z vášho zariadenia.
     Zvoliť inú stopu
     Navigovať z mojej polohy k stope
     Bod stopy pre navigovanie
@@ -3886,4 +3884,19 @@
     Pokračovať v nahrávaní výletu
     Prosím pridajte aspoň dva body.
     Vykonať znova
+    • Vylepšená funkcia plánovania trasy: umožňuje použiť rôzne typy navigácie pre úseky trasy a začlenenie stôp
+\n
+\n • Nové menu pre vzhľad stôp: zvoľte farbu, hrúbku, smerové šípky, ikony štartu a cieľa
+\n
+\n • Zlepšená viditeľnosť bodov pre bicykle.
+\n
+\n • Stopy je teraz možné aktivovať, pre kontextové menu sú základnými údajmi.
+\n
+\n • Zlepšený algoritmus vyhľadávania
+\n
+\n • Zlepšené možnosti nasledovania stopy v navigácii
+\n
+\n • Opravené problému s importom a exportom nastavení profilov
+\n
+\n
 
\ No newline at end of file
diff --git a/OsmAnd/res/values-sr/strings.xml b/OsmAnd/res/values-sr/strings.xml
index 98d62e33e4..fb598f330b 100644
--- a/OsmAnd/res/values-sr/strings.xml
+++ b/OsmAnd/res/values-sr/strings.xml
@@ -3819,17 +3819,17 @@
     Замени стазу
     Сачувај као нову стазу
     Обрнута рута
-    Читава стаза ће се прерачунати користећи одабрани профил.
-    Само ће се следећи сегмент прерачунати користећи одабрани профил.
-    Изаберите како повезати тачке, са правом линијом, или израчунајте руту између њих са одабраним профилом.
+    Читава стаза ће се прерачунати користећи одабрани профил.
+    Само ће се следећи сегмент прерачунати користећи одабрани профил.
+    Изаберите како повезати тачке, са правом линијом, или израчунајте руту између њих са одабраним профилом.
     Цела стаза
     Следећи сегмент
-    Да бисте користили ову опцију, ОсмАнд мора да прилагоди вашу стазу путевима на мапи.
+    Да бисте користили ову опцију, ОсмАнд мора да прилагоди вашу стазу путевима на мапи.
 \n
 \n На следећем кораку мора ћете одабрати навигацијски профил како бисте открили дозвољене путеве и праг удаљености и тиме приближили вашу стазу путевима.
     Праг удаљености
     Навигацијски профил
-    Изаберите датотеку записа којој ће се додати нови сегмент.
+    Изаберите датотеку записа којој ће се додати нови сегмент.
     Слике на нивоу улице
     Јесте ли сигурни да желите затворити План руте без чувања\? Изгуби ћете све промене.
     У случају обрнутог правца
diff --git a/OsmAnd/res/values-tr/strings.xml b/OsmAnd/res/values-tr/strings.xml
index b5c6b9300e..1498c8591c 100644
--- a/OsmAnd/res/values-tr/strings.xml
+++ b/OsmAnd/res/values-tr/strings.xml
@@ -154,7 +154,7 @@
     Yollar-sadece haritalar
     Trafik uyarıları (hız sınırları, zorunlu duruşlar, hız tümsekleri, tüneller), hız kamerası uyarıları ve şerit bilgilerini ayarlayın.
     Başka bir başlık algılanmadığında pusulayı kullan.
-    Navigasyon sırasında konumu yola uydur.
+    Navigasyon sırasında konumu yola tuttur.
     Yola tuttur
     OsmAnd (OSM Automated Navigation Directions) 
 \n 
@@ -1238,8 +1238,8 @@
     Seçimini kaldırın
     Tüm Seçimleri Kaldır
     Daralt
-    Benim İzlerim
-    Mevcut kaydedilen izim
+    İzlenen yollar
+    Şu anda kaydedilen yol
     Rota noktaları
     İz bölümü
     İz noktası
@@ -1658,7 +1658,7 @@
     min/m
     min/km
     m/s
-    Seyahat kayıt
+    Seyahat kaydetme
     Navigasyon
     Arka planda çalıştır
     GPS uyanma aralığı
@@ -1960,7 +1960,7 @@
     Konum aranıyor…
     OsmAnd\'ın konumunuzu bulmasına ve o bölge için harita indirmeyi önermesine izin verin.
     Başka bölge seç
-    OsmAnd\'ın veri deposu (haritalar, GPX dosyaları vb. için): %1$s.
+    OsmAnd\'ın veri deposu (haritalar, yol dosyaları vb. için): %1$s.
     Değiştir
     Al
     Mil/metre
@@ -2317,8 +2317,8 @@
     Arazi kotunda faktör (SRTM, ASTER ve EU-DEM verileri aracılığıyla).
     Şehir veya bölge
     %1$d çıkışa gir ve ilerle
-    Henüz GPX dosyanız yok
-    Ayrıca klasöre GPX dosyaları ekleyebilirsiniz
+    Henüz yol dosyanız yok
+    Ayrıca klasöre yol dosyaları ekleyebilirsiniz
     Daha fazla ekle…
     Görünüm
     Hızlı kaydı aç
@@ -2450,9 +2450,9 @@
     Yol türleri
     Takas
     Daha fazla görüntüle
-    GPX yollarını göster/gizle
-    GPX Yollarını Gizle
-    GPX Yollarını Göster
+    Yolları göster/gizle
+    Yolları Gizle
+    Yolları Göster
     Ev ekle
     Iş ekle
     İş
@@ -2920,7 +2920,7 @@
     Adım adım
     Burada çık
     Durakta bin
-    Seçilen GPX yollarını haritada göstermek veya gizlemek için bir düğme.
+    Seçilen yolları haritada göstermek veya gizlemek için bir düğme.
     Lütfen önce hedefi ayarlayın
     • Yeni \'Yol Tarifleri\' ekranı: Ev ve İş hedefi düğmelerini, \'önceki rota\' kısayolunu, etkin GPX yol-izlerinin ve işaretleyicilerin listesini, arama geçmişini görüntüler
 \n
@@ -3739,7 +3739,7 @@
     Kaldır
     Kerteriz
     %1$s silindi
-    Hız kamerası verilerini tamamen silmek için yeniden başlatma gerekmektedir.
+    Tüm hız kamerası verilerini silmek için uygulamayı yeniden başlatın.
     Kaldır ve Yeniden Başlat
     Bu aygıtta hız kameraları yok.
     Paten
@@ -3748,8 +3748,8 @@
     Güzergahdaki geçerli hedef noktası silinecektir. Eğer bu varış noktası olacaksa, navigasyon duracaktır.
     Lütfen nokta için bir ad belirtin
     Aracınızın uzunluğunu belirtin, uzun araçlar için bazı güzergah kısıtlamaları geçerli olabilir.
-    Sonraki varış noktasını sil
-    Harita yakınlaştırma seviyesini cihaz ses seviyesi düğmeleriyle denetlemeyi etkinleştirin.
+    En yakın varış noktasını sil
+    Harita yakınlaştırma seviyesini cihaz ses seviyesi düğmelerini kullanarak denetleyin.
     Yakınlaştırma için ses seviyesi düğmeleri
     Wikipedia haritalarını indir
     Wikipedia\'dan ilgi çekici yerler hakkında bilgi alın. Bu sizin çevrim dışı cep rehberinizdir - sadece Wikipedia eklentisini etkinleştirin ve etrafınızdaki nesneler hakkında makalelerin tadını çıkarın.
@@ -3758,13 +3758,13 @@
     Tekerlekli sandalye
     İleri tekerlekli sandalye
     Go-kart
-    Kapatılmış OSM Notu
+    Kapatılmış OSM notu
     İzlemeye ekle
-    Devam etmek için çalışma günlerini ayarlamalısınız
+    Devam etmek için çalışma günlerini ayarla
     Noktalar arasındaki güzergah
     Güzergah planla
     Seçilen grup gizli olduğu için eklenen nokta haritada görünmeyecek, \"%s\" içinde bulabilirsiniz.
-    Başlangıç bitiş simgelerini göster
+    Başlangıç ve bitiş simgelerini göster
     Genişlik seç
     Yol üzerinde mesafe veya zaman işaretlerinin görüntüleneceği aralığı seçin.
     İstediğiniz bölme seçeneğini seçin: zamana veya mesafeye göre.
@@ -3778,21 +3778,53 @@
     Açmak için bir yol dosyası seçin.
     Bitti
     Yolun üzerine yaz
-    Bu seçeneği kullanmak için OsmAnd\'ın izlediğiniz yolu harita yollarına eşleştirmesi gereklidir.
-\n
-\n Sonraki adımda, izin verilen yolları tespit etmek için navigasyon profilini ve izlediğiniz yolu yaklaşık olarak belirlemek için eşik mesafesini seçmeniz gerekecektir.
-    Yeni bir Yol olarak kaydet
+    Ardından, bu seçeneği kullanmak için navigasyon profillerinizden biriyle izlenen yolunuzu izin verilen en yakın yola tutturun.
+    Yeni bir yol olarak kaydet
     Ters güzergah
-    Tüm yol, seçilen profil kullanılarak yeniden hesaplanacaktır.
-    Sadece sonraki bölüm, seçilen profil kullanılarak yeniden hesaplanacaktır.
-    Düz bir çizgi ile noktaları nasıl birleştireceğinizi veya seçili profille aralarında nasıl güzergah hesaplayacağınızı seçin.
+    Tüm yol, seçilen profil kullanılarak yeniden hesaplanacaktır.
+    Sadece sonraki bölüm, seçilen profil kullanılarak yeniden hesaplanacaktır.
+    Düz bir çizgi ile noktaları nasıl birleştireceğinizi veya aşağıda belirtildiği gibi aralarında nasıl güzergah hesaplayacağınızı seçin.
     Tüm yol
     Sonraki bölüm
     Eşik mesafesi
     Navigasyon profili
-    Kendisine yeni bir bölümün ekleneceği bir yol dosyası seçin.
+    Kendisine yeni bir bölümün ekleneceği bir yol dosyası seçin.
     Sokak seviyesi görüntüleri
-    Kaydetmeden güzergah planlamayı kapatmak istediğinize emin misiniz\? Tüm değişiklikleri kaybedeceksiniz.
+    Planlanan güzergahtaki tüm değişiklikleri kapatarak atmak istediğinizden emin misiniz\?
     Ters yön durumunda
     REC
+    Kaydedilen yolu aç
+    kaydedildi
+    Lütfen en az iki nokta ekleyin.
+    Yeniden yap
+    İzlenen yollar
+    Yolu GPX dosyasına kaydet
+    Yol dosyalarını içe aktarın veya kaydedin
+    Yeni yol dosyası olarak kaydet
+    Bir yol dosyasına ekle
+    İzlenen yollar
+    İzlenen yollar
+    Yol dosyaları ekle
+    Yol ara noktası ekle
+    Yol ara noktası ekle
+    Seyahat kaydetme
+    Yol dosyası olarak kaydet
+    %s yol dosyası seçildi
+    (Son uygulamalar aracılığıyla) uygulama kapatıldığında yol kaydını duraklatacaktır. (OsmAnd arka plan göstergesi Android bildirim çubuğundan kaybolur.)
+    Genel yol kaydı için kayıt aralığını seçin (haritadaki seyahat kayıt widget\'ı aracılığıyla etkin).
+    Seyahat kaydetmeyi duraklat
+    Seyahat kaydetmeyi devam ettir
+    En yakın nokta
+    Adres sil
+    Adres ekle
+    Adres girin
+    Sadece güzergah hattı kaydedilecek, ara noktalar silinecektir.
+    Dosya adı
+    Sistem öntanımlı değeri
+    Sonraki tüm bölümler
+    Önceki bölüm
+    Önceki tüm bölümler
+    Sadece seçili bölüm, seçilen profil kullanılarak yeniden hesaplanacaktır.
+    Sonraki tüm bölümler, seçilen profil kullanılarak yeniden hesaplanacaktır.
+    Önceki tüm bölümler, seçilen profil kullanılarak yeniden hesaplanacaktır.
 
\ No newline at end of file
diff --git a/OsmAnd/res/values-uk/phrases.xml b/OsmAnd/res/values-uk/phrases.xml
index 22b9d46dbc..1bcbb91957 100644
--- a/OsmAnd/res/values-uk/phrases.xml
+++ b/OsmAnd/res/values-uk/phrases.xml
@@ -3803,7 +3803,7 @@
     Рівень води: вище середнього
     Рівень води: нижче середнього
     Завада
-    Поповнення питної води: так
+    Так
     Поповнення питної води: ні
     Мережа поповнення питної води
     Під тиском
@@ -3822,4 +3822,13 @@
     Подарункова коробка
     Ліфт
     Стрілка: ні
+    Розклад
+    Реальний час
+    Затримка
+    Так
+    Дошка відправлень: немає
+    Дошка відправлень
+    Поповнення питної води
+    Невеликі електроприлади
+    Вулик
 
\ No newline at end of file
diff --git a/OsmAnd/res/values-uk/strings.xml b/OsmAnd/res/values-uk/strings.xml
index c41205713a..678d5dfc72 100644
--- a/OsmAnd/res/values-uk/strings.xml
+++ b/OsmAnd/res/values-uk/strings.xml
@@ -1072,7 +1072,7 @@
     Порожній GPX-файл
     Треки
     Закладки
-    Місця та треки
+    Мої місця
     рожевий
     Коричневий
     Колір
@@ -3779,33 +3779,33 @@
     Попередження про камери контролю швидкості в деяких країнах заборонено законом.
     Орієнтація
     %1$s видалено
-    Для вилучення даних про камери контролю швидкості потрібен перезапуск.
+    Перезапустіть застосунок для видалення даних про камери контролю швидкості.
     Видалити та перезапустити
     Вкажіть довжину транспортного засобу для розрахунку маршрутів.
     Обмеження довжини
     На цьому пристрої немає камер контролю швидкості.
     Роликові ковзани
-    Увімкнути для зміни масштабу мапи кнопками гучності пристрою.
+    Зміна масштабу мапи кнопками гучності пристрою.
     Масштабування кнопками гучності
     Вкажіть довжину вашого автомобіля, для довгих транспортних засобів можуть застосовуватися деякі обмеження на маршрутах.
-    Видалити наступну точку призначення
+    Видалити найближчу точку призначення
     Вкажіть назву пункту
     Поточну точку призначення на маршруті буде видалено. Якщо це буде місце призначення, навігація припиниться.
     Завантажити мапи Вікіпедії
-    Отримайте відомості про визначні місця у Вікіпедії. Це ваш автономний кишеньковий посібник - просто ввімкніть втулок \"Вікіпедія\" і насолоджуйтеся статтями про об\'єкти навколо вас.
+    Отримайте відомості про визначні місця у Вікіпедії. Це ваш автономний кишеньковий посібник - просто ввімкніть втулок \"Вікіпедія\" і насолоджуйтеся статтями про об\'єкти довкола вас.
     Моторолер
     Спортивний мотоцикл
     Інвалідне крісло
     Інвалідне крісло попереду
     Картинг
-    Закрита нотатка OSM
+    Закрита примітка OSM
     Власне
     Додану точку не буде показано на мапі, вся вибрана група є прихованою, ви можете побачити її в \"%s\".
     Зазначте робочі дні, щоб продовжити
     Маршрут між точками
     Планування маршруту
     Додати до треку
-    Показувати старт та фініш
+    Показувати піктограми старт та фініш
     Встановити ширину
     Виберіть інтервал показу міток часу або відстані для показу поверх треку.
     Виберіть власний варіант поділу: за часом чи відстанню.
@@ -3815,24 +3815,22 @@
     Імпортувати трек
     Переглянути наявний трек
     Створити новий маршрут
-    Оберіть файл з треком для перегляду.
+    Виберіть який файл з треком відкрити.
     Готово
     Перезаписати трек
-    Для користування цією функцією, OsmAnd необхідно прив\'язати цей трек до мапи доріг.
-\n
-\nДалі вам потрібно вибрати профіль навігації для виявлення дозволених доріг та обмеження відстані наближення вашого треку до доріг.
+    Далі, пов\'яжіть трек до найближчої дозволеної дороги з одним із профілів навігації, щоб скористатися цим параметром.
     Зворотний маршрут
     Весь трек
     Наступний сегмент
     Обмеження відстані
     Профіль навігації
-    Виберіть файл треку, до якого буде додано новий сегмент.
+    Виберіть файл треку, до якого буде додано новий сегмент.
     Зберегти як новий трек
-    Весь трек буде перераховано за допомогою вибраного профілю.
-    Лише наступний сегмент буде перераховано за допомогою обраного профілю.
-    Виберіть спосіб з\'єднання точок: прямою лінією чи розраховувати маршрут між ними за допомогою вибраного профілю.
+    Весь трек буде перераховано за допомогою вибраного профілю.
+    Лише наступний сегмент буде перераховано за допомогою обраного профілю.
+    Виберіть спосіб з\'єднання точок: прямою лінією чи обчислити маршрут між ними за, як зазначено далі.
     Зображення вулиць
-    Ви дійсно бажаєте закрити планування маршруту без збереження\? Внесені зміни буде втрачено.
+    Ви дійсно бажаєте відхилити всі зміни у запланованому маршруті, закривши його\?
     Для зворотного напрямку
     Зберегти як новий файл треку
     Додати у файл треку
@@ -3850,7 +3848,7 @@
     Зберегти як файл треку
     Стежити за треком
     Виберіть файл треку для перегляду
-    Виберіть файл треку для його перегляду або імпортуйте його.
+    Виберіть файл треку для перегляду або імпортуйте його з пристрою.
     Обрати інший трек
     Перехід від мого розташування до треку
     Точка треку для навігації
@@ -3883,4 +3881,19 @@
     Буде збережено лише лінію маршруту, а проміжні точки буде видалено.
     Назва файлу
     Повторити
+    • Оновлено функції планування маршруту: дозволено застосувати різні типи переходів для кожного сегмента і прив\'язати будь-який трек до доріг
+\n
+\n• Нове меню вигляду треків: вибір кольору, товщина, вигляд стрілки напрямку, піктограми початку/завершення
+\n
+\n• Покращено оглядовість велосипедних вузлів
+\n
+\n• На треки тепер можна натискати, є контекстне меню з основною інформацією.
+\n
+\n• Вдосконалено алгоритми пошуку
+\n
+\n• Вдосконалено параметри стеження за треками в навігації
+\n
+\n• Виправлено вади перенесення налаштувань профілю
+\n
+\n
 
\ No newline at end of file
diff --git a/OsmAnd/res/values-zh-rCN/strings.xml b/OsmAnd/res/values-zh-rCN/strings.xml
index 962d8cc4fe..6de13e20e3 100644
--- a/OsmAnd/res/values-zh-rCN/strings.xml
+++ b/OsmAnd/res/values-zh-rCN/strings.xml
@@ -3121,7 +3121,7 @@
     添加的点在地图上不可见,因为选定的组是隐藏的,您可以在\"%s\"中找到它。
     选择显示轨迹上带有距离或时间标记的间隔。
     选择所需的拆分选项:“按时间”或“按距离”。
-    新的配置文件将在下一段路线计算时生效。
+    新的配置文件将在下一段路线计算时生效。
     整个轨迹
     最后更改
     导入轨迹
@@ -3133,15 +3133,15 @@
     保存为新的轨迹
     你确定在不保存的情况下退出计划路线吗?所有的更改均会丢失。
     反转路线
-    全部路线会以选择的配置文件进行重新计算。
-    选择以直线或以选择的导航文件来计算路线的方式去连接导航点。
+    全部路线会以选择的配置文件进行重新计算。
+    选择以直线或以选择的导航文件来计算路线的方式去连接导航点。
     下一段
-    要使用这个选项,OsmAnd 会跟踪你在地图道路上的轨迹。
+    要使用这个选项,OsmAnd 会跟踪你在地图道路上的轨迹。
 \n
 \n在进行下一步时,你需要选择导航文件来检测与你的起始点相近的道路。
     起始距离
     导航文件
-    选择一个要添加新片段的跟踪文件。
+    选择一个要添加新片段的跟踪文件。
     街道等级图像
     防止相反的方向
     删除地址
diff --git a/OsmAnd/res/values-zh-rTW/phrases.xml b/OsmAnd/res/values-zh-rTW/phrases.xml
index 6c2fe92bb8..352282d071 100644
--- a/OsmAnd/res/values-zh-rTW/phrases.xml
+++ b/OsmAnd/res/values-zh-rTW/phrases.xml
@@ -3814,7 +3814,7 @@
     水位:高於平均水位
     水位:低於平均水位
     堵塞
-    飲用水填充:是
+    
     飲用水填充:否
     飲用水填充網路
     吸力
@@ -3833,4 +3833,13 @@
     自治市鎮
     箭頭:否
     電梯
+    時刻表
+    即時
+    間隔時間
+    
+    時刻表:否
+    時刻表
+    飲用水補充
+    小電器
+    蜂箱
 
\ No newline at end of file
diff --git a/OsmAnd/res/values-zh-rTW/strings.xml b/OsmAnd/res/values-zh-rTW/strings.xml
index bbc2ef6d57..33b644b362 100644
--- a/OsmAnd/res/values-zh-rTW/strings.xml
+++ b/OsmAnd/res/values-zh-rTW/strings.xml
@@ -3778,27 +3778,27 @@
     某些國家禁止使用測速照相的警報裝置。
     方向
     %1$s 已刪除
-    必須重新啟動才能完全刪除測速照相的資料。
+    重新啟動應用程式以刪除所有測速照相的資料。
     解除安裝並重新啟動
     指定路線上允許的車輛長度。
     長度限制
     此裝置沒有測速照相機。
     直排輪鞋
-    啟用裝置音量按鈕控制地圖縮放等級。
+    使用裝置音量按鈕控制地圖縮放等級。
     音量按鈕以縮放
     提供您的車輛長度,某些路徑限制可能適用於較長的車輛。
-    刪除下一個目的地點
+    刪除最近的目的地點
     請提供點的名稱
     目前路徑上的目的地點將會被刪除。如果其將為目的地,導航就會停止。
     下載維基百科地圖
-    從維基百科取得關於興趣點的資訊。這是您的離線口袋指南 ── 只要啟用維基百科外掛程式並享受有關於您周圍景點的文章。
+    從維基百科取得關於興趣點的資訊。這是您的離線口袋指南 ── 只要開啟維基百科外掛程式並享受有關於您周圍景點的文章。
     耐力賽摩托車
     小型摩托車
     輪椅
     輪椅向前
     卡丁車
     已關閉的 OSM 註記
-    您必須設定工作天以繼續
+    設定工作天以繼續
     點與點之間的路線
     規劃路線
     新增到軌跡
@@ -3819,19 +3819,17 @@
     覆寫軌跡
     儲存為新軌跡
     反向路線
-    整個軌跡都會使用選定的設定檔重新計算。
-    僅下一個片段會使用選定的設定檔重新計算。
-    選取如何連接點,用直線或以選定的設定檔計算其間的路徑。
+    整個軌跡都會使用選定的設定檔重新計算。
+    僅下一個片段會使用選定的設定檔重新計算。
+    選取如何連接點,透過直線或以下面選定的方法計算其間的路徑。
     整個軌道
     下一段
-    要使用此選項,OsmAnd 必須將您的軌跡捕捉到地圖道路上。
-\n
-\n在下一步,您只需要選取設定檔以偵測允許的道路與距離門檻以追蹤道路。
+    接下來,使用您其中一個導航設定檔來將路線貼齊到最近可用的道路上以使用此選項。
     門檻距離
     導航設定檔
-    選取要加入新片段的軌道檔案。
+    選取要加入新片段的軌道檔案。
     街道級照片
-    您確定要不儲存就關閉計劃錄線嗎?您將會失去所有變更。
+    您確定要關閉計畫路線來放棄所有變更嗎?
     反向時
     儲存為新的軌跡檔案
     新增到軌跡檔案
@@ -3849,7 +3847,7 @@
     儲存為軌跡檔案
     跟隨軌跡
     選擇要跟隨的軌跡檔案
-    選擇要跟隨的軌跡檔案,或是匯入一個。
+    選擇要跟隨的軌跡檔案,或是從您的裝置匯入。
     選取其他軌跡
     從我的位置導航到軌跡
     要導航的軌跡點
@@ -3883,4 +3881,19 @@
     已儲存
     請至少新增兩個點。
     重做
+    • 更新「規劃路線」功能:允許每個路段使用不同的導航類型並包含軌跡
+\n
+\n • 新的軌跡外觀選項:選取顏色、厚度、開啟方向箭頭與開始/結束圖示
+\n
+\n • 改善自行車節點的能見度
+\n
+\n • 軌跡現在是可點擊的,且有包含基本資訊的內容選單
+\n
+\n • 改進了搜尋演算法
+\n
+\n • 改進了導航中的「跟隨軌跡」選項
+\n
+\n • 修復設定檔的匯入/匯出問題
+\n
+\n
 
\ No newline at end of file
diff --git a/OsmAnd/res/values/phrases.xml b/OsmAnd/res/values/phrases.xml
index be0b7a5b20..3f4394578a 100644
--- a/OsmAnd/res/values/phrases.xml
+++ b/OsmAnd/res/values/phrases.xml
@@ -136,6 +136,8 @@
 	Pressure
 	Vibration
 	Arrow
+	Drinking water refill
+	Departures board
 
 
 	Store
@@ -496,6 +498,7 @@
 	Magazines
 	Paper packaging
 	Small appliances
+	Small electrical appliances
 	Wood
 	Books
 	Shoes
@@ -4220,7 +4223,7 @@
 	Water level: below mean water level
 	Obstruction
 
-	Drinking water refill: yes
+	Yes
 	Drinking water refill: no
 	Drinking water refill network
 
@@ -4243,5 +4246,16 @@
 
 	Elevator
 
+	Departures board: no
+
+	Yes
+	Delay
+	Realtime
+	Timetable
+
+	Beehive
+
+	Nut store
+
 
 
diff --git a/OsmAnd/res/values/strings.xml b/OsmAnd/res/values/strings.xml
index ae510a0ab3..3f8159283b 100644
--- a/OsmAnd/res/values/strings.xml
+++ b/OsmAnd/res/values/strings.xml
@@ -11,6 +11,15 @@
 	Thx - Hardy
 
 -->
+    
+    • Updated "Plan a route" function: allows using different navigation types per segment and the inclusion of tracks\n\n
+    • New "Appearance" menu for tracks: select color, thickness, display direction arrows, start/finish icons\n\n
+    • Improved visibility of bicycle nodes.\n\n
+    • Tracks are now tappable, have context menu with basic info.\n\n
+    • Improved "Search" algorithms\n\n
+    • Improved "Follow track" options in Navigation\n\n
+    • Fixed issues with import/export of profile settings\n\n
+    
     Redo
     Please add at least two points.
     is saved
@@ -42,9 +51,9 @@
     Nearest point
     Start of the track
     Point of the track to navigate
-    Navigate from my location to the track
+    Navigate from my position to the track
     Select another track
-    Choose track file to follow, or import one.
+    Choose track file to follow or import it from your device.
     Choose track file to follow
     Follow track
     Save as track file
@@ -61,22 +70,22 @@
     Add to a track file
     Save as new track file
     In case of reverse direction
-    Are you sure you want to close Plan route without saving? You will lose all changes.
+    Are you sure you want discard all changes in the planned route by closing it?
     Street-level imagery
-    Select a track file for which a new segment will be added.
+    Select a track file to add the new segment to.
     Navigation profile
     Threshold distance
-    To use this option OsmAnd need to snap your track to the map roads. \n\n On the next step you will need to select navigation profile to detect allowed roads and threshold distance to approximate you track with roads.
+    Next, snap your track to the nearest allowed road with one of your navigation profiles to use this option.
     Next segment
     Whole track
-    Select how to connect points, with a straight line, or calculate a route between them with selected profile.
-    Only next segment will be recalculated using selected profile.
-    Whole track will be recalculated using selected profile.
+    Select how to connect points, by a straight line, or calculate a route between them as specified below.
+    Only the next segment will be recalculated using the selected profile.
+    The whole track will be recalculated using the selected profile.
     Reverse route
-    Save as new Track
+    Save as new track
     Overwrite track
     Done
-    Select a track file for open.
+    Select a track file to open.
     Create new route
     Open existing track
     Import track
@@ -87,29 +96,29 @@
     Select the desired splitting option: by time or by distance.
     Select the interval at which marks with distance or time on the track will be displayed.
     Select width
-    Show start finish icons
-    Add to a Track
+    Show start and finish icons
+    Add to a track
     Plan a route
     Route between points
-    You need to set working days to continue
-    Closed OSM Note
+    Set working days to continue
+    Closed OSM note
     Go-cart
     Wheelchair forward
     Wheelchair
     Motor scooter
     Enduro motorcycle
     The added point will not be visible on the map, since the selected group is hidden, you can find it in \"%s\".
-    Get information about points of interest from Wikipedia. It is your pocket offline guide - just enable Wikipedia plugin and enjoy articles about objects around you.
+    Get info about points of interest from Wikipedia. It is your pocket offline guide - just turn on the Wikipedia plugin and enjoy articles about objects around you.
     Download Wikipedia maps
     The current destination point on the route will be deleted. If it will be the Destination, navigation will stop.
     Please provide a name for the point
     Volume buttons as zoom
-    Enable to control the map zoom level with device volume buttons.
-    Delete next destination point
+    Control the map-zoom level using the volume buttons on the device.
+    Delete nearest destination point
     Inline skates
     This device doesn\'t have speed cameras.
     Uninstall and Restart
-    Restart is needed to completely delete speed camera data.
+    Restart the app to delete all speed camera data.
     %1$s deleted
     Bearing
     Length limit
diff --git a/OsmAnd/src/net/osmand/FileUtils.java b/OsmAnd/src/net/osmand/FileUtils.java
index 661bf81f75..59fb36c88d 100644
--- a/OsmAnd/src/net/osmand/FileUtils.java
+++ b/OsmAnd/src/net/osmand/FileUtils.java
@@ -8,6 +8,7 @@ import android.view.View;
 import android.widget.EditText;
 import android.widget.Toast;
 
+import androidx.annotation.NonNull;
 import androidx.appcompat.app.AlertDialog;
 
 import net.osmand.plus.GpxSelectionHelper;
@@ -165,6 +166,18 @@ public class FileUtils {
 		return dest;
 	}
 
+	public static String createUniqueFileName(@NonNull OsmandApplication app, String name, String dirName, String extension) {
+		String uniqueFileName = name;
+		File dir = app.getAppPath(dirName);
+		File fout = new File(dir, name + extension);
+		int ind = 0;
+		while (fout.exists()) {
+			uniqueFileName = name + "_" + (++ind);
+			fout = new File(dir, uniqueFileName + extension);
+		}
+		return uniqueFileName;
+	}
+
 	public interface RenameCallback {
 		void renamedTo(File file);
 	}
diff --git a/OsmAnd/src/net/osmand/SecondSplashScreenFragment.java b/OsmAnd/src/net/osmand/SecondSplashScreenFragment.java
index 4a7dd7be9f..72618ace8a 100644
--- a/OsmAnd/src/net/osmand/SecondSplashScreenFragment.java
+++ b/OsmAnd/src/net/osmand/SecondSplashScreenFragment.java
@@ -34,6 +34,8 @@ public class SecondSplashScreenFragment extends BaseOsmAndFragment {
 	public static boolean SHOW = true;
 	public static boolean VISIBLE = false;
 
+	private boolean systemDefaultNightMode;
+
 	public MapActivity getMapActivity() {
 		return (MapActivity) getActivity();
 	}
@@ -77,14 +79,14 @@ public class SecondSplashScreenFragment extends BaseOsmAndFragment {
 		OsmandApplication app = requireMyApplication();
 		FragmentActivity activity = requireActivity();
 		UiUtilities iconsCache = app.getUIUtilities();
-		boolean systemDefaultNightMode = app.getSettings().isSupportSystemDefaultTheme() &&
+		systemDefaultNightMode = app.getSettings().isSupportSystemDefaultTheme() &&
 				!app.getSettings().isLightSystemDefaultTheme();
 
 		RelativeLayout view = new RelativeLayout(activity);
 		view.setOnClickListener(null);
 
 		int backgroundColorId = systemDefaultNightMode ?
-				R.color.map_background_color_dark :
+				R.color.list_background_color_dark :
 				R.color.map_background_color_light;
 		view.setBackgroundColor(getResources().getColor(backgroundColorId));
 
@@ -184,6 +186,8 @@ public class SecondSplashScreenFragment extends BaseOsmAndFragment {
 
 	@Override
 	public int getStatusBarColorId() {
-		return R.color.status_bar_transparent_light;
+		return systemDefaultNightMode ?
+				R.color.status_bar_color_dark :
+				R.color.status_bar_transparent_light;
 	}
 }
diff --git a/OsmAnd/src/net/osmand/data/FavouritePoint.java b/OsmAnd/src/net/osmand/data/FavouritePoint.java
index 72cde20159..e5f4f6c8ea 100644
--- a/OsmAnd/src/net/osmand/data/FavouritePoint.java
+++ b/OsmAnd/src/net/osmand/data/FavouritePoint.java
@@ -7,6 +7,7 @@ import android.graphics.BitmapFactory;
 
 import androidx.annotation.DrawableRes;
 import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
 import androidx.annotation.StringRes;
 
 import net.osmand.GPXUtilities.WptPt;
@@ -89,6 +90,7 @@ public class FavouritePoint implements Serializable, LocationPoint {
 			return color;
 	}
 
+	@Nullable
 	public String getAddress() {
 		return address;
 	}
diff --git a/OsmAnd/src/net/osmand/plus/AppInitializer.java b/OsmAnd/src/net/osmand/plus/AppInitializer.java
index 7bccdd599f..2837bff6f8 100644
--- a/OsmAnd/src/net/osmand/plus/AppInitializer.java
+++ b/OsmAnd/src/net/osmand/plus/AppInitializer.java
@@ -103,7 +103,7 @@ public class AppInitializer implements IProgress {
 	private static final String VECTOR_INDEXES_CHECK = "VECTOR_INDEXES_CHECK"; //$NON-NLS-1$
 	private static final String EXCEPTION_FILE_SIZE = "EXCEPTION_FS"; //$NON-NLS-1$
 
-	public static final String LATEST_CHANGES_URL = "https://osmand.net/blog/osmand-3-7-released";
+	public static final String LATEST_CHANGES_URL = "https://osmand.net/blog/osmand-3-8-released";
 //	public static final String LATEST_CHANGES_URL = null; // not enough to read
 	public static final int APP_EXIT_CODE = 4;
 	public static final String APP_EXIT_KEY = "APP_EXIT_KEY";
diff --git a/OsmAnd/src/net/osmand/plus/GpxSelectionHelper.java b/OsmAnd/src/net/osmand/plus/GpxSelectionHelper.java
index 8281a127e4..7217e8af5f 100644
--- a/OsmAnd/src/net/osmand/plus/GpxSelectionHelper.java
+++ b/OsmAnd/src/net/osmand/plus/GpxSelectionHelper.java
@@ -9,6 +9,7 @@ import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
 import androidx.core.content.ContextCompat;
 
+import net.osmand.CallbackWithObject;
 import net.osmand.GPXUtilities;
 import net.osmand.GPXUtilities.GPXFile;
 import net.osmand.GPXUtilities.GPXTrackAnalysis;
@@ -19,6 +20,7 @@ import net.osmand.GPXUtilities.WptPt;
 import net.osmand.IProgress;
 import net.osmand.IndexConstants;
 import net.osmand.PlatformUtil;
+import net.osmand.StateChangedListener;
 import net.osmand.data.LatLon;
 import net.osmand.plus.GPXDatabase.GpxDataItem;
 import net.osmand.plus.MapMarkersHelper.MapMarkersGroup;
@@ -26,6 +28,7 @@ import net.osmand.plus.activities.SavingTrackHelper;
 import net.osmand.plus.helpers.GpxUiHelper;
 import net.osmand.plus.helpers.GpxUiHelper.GPXDataSetAxisType;
 import net.osmand.plus.helpers.GpxUiHelper.GPXDataSetType;
+import net.osmand.plus.routing.RouteProvider;
 import net.osmand.plus.settings.backend.OsmandSettings.MetricsConstants;
 import net.osmand.plus.track.GpxSplitType;
 import net.osmand.plus.track.GradientScaleType;
@@ -40,6 +43,7 @@ import java.io.File;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Collections;
+import java.util.HashMap;
 import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
@@ -48,6 +52,8 @@ import java.util.Set;
 
 public class GpxSelectionHelper {
 
+	private final static Log LOG = PlatformUtil.getLog(GpxSelectionHelper.class);
+
 	public static final String CURRENT_TRACK = "currentTrack";
 	private static final String FILE = "file";
 	private static final String BACKUP = "backup";
@@ -61,15 +67,18 @@ public class GpxSelectionHelper {
 
 	private OsmandApplication app;
 	@NonNull
-	private List selectedGPXFiles = new java.util.ArrayList<>();
-	private Map selectedGpxFilesBackUp = new java.util.HashMap<>();
+	private List selectedGPXFiles = new ArrayList<>();
+	private Map selectedGpxFilesBackUp = new HashMap<>();
 	private SavingTrackHelper savingTrackHelper;
-	private final static Log LOG = PlatformUtil.getLog(GpxSelectionHelper.class);
 	private SelectGpxTask selectGpxTask;
+	private SelectedGpxFile trackToFollow;
+	private StateChangedListener followTrackListener;
+	private boolean shouldHideTrackToFollow;
 
-	public GpxSelectionHelper(OsmandApplication osmandApplication, SavingTrackHelper trackHelper) {
-		this.app = osmandApplication;
+	public GpxSelectionHelper(OsmandApplication app, SavingTrackHelper trackHelper) {
+		this.app = app;
 		savingTrackHelper = trackHelper;
+		app.getSettings().FOLLOW_THE_GPX_ROUTE.addListener(getFollowTrackListener());
 	}
 
 	public void clearAllGpxFilesToShow(boolean backupSelection) {
@@ -86,10 +95,18 @@ public class GpxSelectionHelper {
 	public void restoreSelectedGpxFiles() {
 		for (Entry gpxEntry : selectedGpxFilesBackUp.entrySet()) {
 			if (!Algorithms.isEmpty(gpxEntry.getKey().path)) {
-				final File file = new File(gpxEntry.getKey().path);
+				File file = new File(gpxEntry.getKey().path);
 				if (file.exists() && !file.isDirectory()) {
 					if (file.lastModified() > gpxEntry.getValue()) {
-						new GpxFileLoaderTask(file, app).execute();
+						new GpxFileLoaderTask(file, new CallbackWithObject() {
+							@Override
+							public boolean processResult(GPXFile result) {
+								if (result != null) {
+									selectGpxFile(result, true, false);
+								}
+								return true;
+							}
+						}).execute();
 					} else {
 						selectGpxFile(gpxEntry.getKey(), true, false);
 					}
@@ -99,14 +116,52 @@ public class GpxSelectionHelper {
 		}
 	}
 
+	public boolean shouldHideTrackToFollow() {
+		return shouldHideTrackToFollow;
+	}
+
+	private StateChangedListener getFollowTrackListener() {
+		if (followTrackListener == null) {
+			followTrackListener = new StateChangedListener() {
+				@Override
+				public void stateChanged(String gpxRoutePath) {
+					if (trackToFollow != null) {
+						if (shouldHideTrackToFollow) {
+							selectGpxFile(trackToFollow.getGpxFile(), false, false);
+							shouldHideTrackToFollow = false;
+						}
+						trackToFollow = null;
+					}
+					if (!Algorithms.isEmpty(gpxRoutePath)) {
+						trackToFollow = getSelectedFileByPath(gpxRoutePath);
+						if (trackToFollow == null) {
+							shouldHideTrackToFollow = true;
+							File file = new File(gpxRoutePath);
+							if (file.exists() && !file.isDirectory()) {
+								new GpxFileLoaderTask(file, new CallbackWithObject() {
+									@Override
+									public boolean processResult(GPXFile result) {
+										trackToFollow = selectGpxFile(result, true, false);
+										return true;
+									}
+								}).execute();
+							}
+						}
+					}
+				}
+			};
+		}
+		return followTrackListener;
+	}
+
 	private static class GpxFileLoaderTask extends AsyncTask {
 
-		File fileToLoad;
-		GpxSelectionHelper helper;
+		private File fileToLoad;
+		private CallbackWithObject callback;
 
-		GpxFileLoaderTask(File fileToLoad, OsmandApplication app) {
+		GpxFileLoaderTask(File fileToLoad, CallbackWithObject callback) {
 			this.fileToLoad = fileToLoad;
-			this.helper = app.getSelectedGpxHelper();
+			this.callback = callback;
 		}
 
 		@Override
@@ -116,8 +171,8 @@ public class GpxSelectionHelper {
 
 		@Override
 		protected void onPostExecute(GPXFile gpxFile) {
-			if (gpxFile != null) {
-				helper.selectGpxFile(gpxFile, true, false);
+			if (callback != null) {
+				callback.processResult(gpxFile);
 			}
 		}
 	}
@@ -875,7 +930,13 @@ public class GpxSelectionHelper {
 			this.displayGroups = displayGroups;
 		}
 
-
+		public boolean isFollowTrack(OsmandApplication app) {
+			RouteProvider.GPXRouteParamsBuilder routeParams = app.getRoutingHelper().getCurrentGPXRoute();
+			if (routeParams != null) {
+				return gpxFile.path.equals(routeParams.getFile().path);
+			}
+			return false;
+		}
 	}
 
 	public enum GpxDisplayItemType {
diff --git a/OsmAnd/src/net/osmand/plus/MapMarkersHelper.java b/OsmAnd/src/net/osmand/plus/MapMarkersHelper.java
index 322c19e8e4..636fcddb72 100644
--- a/OsmAnd/src/net/osmand/plus/MapMarkersHelper.java
+++ b/OsmAnd/src/net/osmand/plus/MapMarkersHelper.java
@@ -9,6 +9,7 @@ import androidx.annotation.Nullable;
 import androidx.core.content.ContextCompat;
 
 import net.osmand.AndroidUtils;
+import net.osmand.FileUtils;
 import net.osmand.GPXUtilities;
 import net.osmand.GPXUtilities.GPXFile;
 import net.osmand.GPXUtilities.WptPt;
@@ -1005,15 +1006,14 @@ public class MapMarkersHelper {
 	}
 
 	public String generateGpx(String fileName) {
-		final File dir = ctx.getAppPath(IndexConstants.GPX_INDEX_DIR + IndexConstants.MAP_MARKERS_INDEX_DIR);
+		String dirName = IndexConstants.GPX_INDEX_DIR + IndexConstants.MAP_MARKERS_INDEX_DIR;
+		File dir = ctx.getAppPath(dirName);
 		if (!dir.exists()) {
 			dir.mkdirs();
 		}
-		File fout = new File(dir, fileName + IndexConstants.GPX_FILE_EXT);
-		int ind = 1;
-		while (fout.exists()) {
-			fout = new File(dir, fileName + "_" + (++ind) + IndexConstants.GPX_FILE_EXT);
-		}
+		String uniqueFileName = FileUtils.createUniqueFileName(ctx, fileName, dirName, IndexConstants.GPX_FILE_EXT);
+		File fout = new File(dir, uniqueFileName + IndexConstants.GPX_FILE_EXT);
+
 		GPXFile file = new GPXFile(Version.getFullVersion(ctx));
 		for (MapMarker marker : mapMarkers) {
 			WptPt wpt = new WptPt();
diff --git a/OsmAnd/src/net/osmand/plus/UiUtilities.java b/OsmAnd/src/net/osmand/plus/UiUtilities.java
index 24ffd9c6f7..8dc59eccc9 100644
--- a/OsmAnd/src/net/osmand/plus/UiUtilities.java
+++ b/OsmAnd/src/net/osmand/plus/UiUtilities.java
@@ -230,8 +230,12 @@ public class UiUtilities {
 	}
 
 	@ColorInt
-	public static int mixTwoColors(@ColorInt int color1, @ColorInt int color2, float amount )
-	{
+	public static int removeAlpha(@ColorInt int color) {
+		return Color.rgb(Color.red(color), Color.green(color), Color.blue(color));
+	}
+
+	@ColorInt
+	public static int mixTwoColors(@ColorInt int color1, @ColorInt int color2, float amount) {
 		final byte ALPHA_CHANNEL = 24;
 		final byte RED_CHANNEL   = 16;
 		final byte GREEN_CHANNEL =  8;
diff --git a/OsmAnd/src/net/osmand/plus/activities/FavoritesTreeFragment.java b/OsmAnd/src/net/osmand/plus/activities/FavoritesTreeFragment.java
index 6228d67569..91bf4ffbf9 100644
--- a/OsmAnd/src/net/osmand/plus/activities/FavoritesTreeFragment.java
+++ b/OsmAnd/src/net/osmand/plus/activities/FavoritesTreeFragment.java
@@ -128,6 +128,7 @@ public class FavoritesTreeFragment extends OsmandExpandableListFragment implemen
 
 				@Override
 				public void onFavoriteDataUpdated(@NonNull FavouritePoint favouritePoint) {
+					favouritesAdapter.notifyDataSetChanged();
 				}
 			});
 		}
diff --git a/OsmAnd/src/net/osmand/plus/activities/MapActivity.java b/OsmAnd/src/net/osmand/plus/activities/MapActivity.java
index f71a6c0fb6..e23e596dcf 100644
--- a/OsmAnd/src/net/osmand/plus/activities/MapActivity.java
+++ b/OsmAnd/src/net/osmand/plus/activities/MapActivity.java
@@ -86,7 +86,6 @@ import net.osmand.plus.base.FailSafeFuntions;
 import net.osmand.plus.base.MapViewTrackingUtilities;
 import net.osmand.plus.chooseplan.OsmLiveCancelledDialog;
 import net.osmand.plus.dashboard.DashboardOnMap;
-import net.osmand.plus.dashboard.DashboardOnMap.DashboardType;
 import net.osmand.plus.dialogs.CrashBottomSheetDialogFragment;
 import net.osmand.plus.dialogs.ImportGpxBottomSheetDialogFragment;
 import net.osmand.plus.dialogs.RateUsBottomSheetDialogFragment;
@@ -109,21 +108,15 @@ import net.osmand.plus.helpers.ScrollHelper.OnScrollEventListener;
 import net.osmand.plus.mapcontextmenu.AdditionalActionsBottomSheetDialogFragment;
 import net.osmand.plus.mapcontextmenu.MapContextMenu;
 import net.osmand.plus.mapcontextmenu.MenuController;
-import net.osmand.plus.mapcontextmenu.MenuController.MenuState;
 import net.osmand.plus.mapcontextmenu.builders.cards.dialogs.ContextMenuCardDialogFragment;
-import net.osmand.plus.mapcontextmenu.editors.FavoritePointEditor;
-import net.osmand.plus.mapcontextmenu.editors.PointEditorFragmentNew;
-import net.osmand.plus.mapcontextmenu.editors.WptPtEditor;
 import net.osmand.plus.mapcontextmenu.other.DestinationReachedMenu;
 import net.osmand.plus.mapcontextmenu.other.TrackDetailsMenu;
-import net.osmand.plus.mapmarkers.MapMarkersDialogFragment;
 import net.osmand.plus.mapmarkers.PlanRouteFragment;
 import net.osmand.plus.measurementtool.GpxApproximationFragment;
 import net.osmand.plus.measurementtool.GpxData;
 import net.osmand.plus.measurementtool.MeasurementEditingContext;
 import net.osmand.plus.measurementtool.MeasurementToolFragment;
-import net.osmand.plus.measurementtool.SnapTrackWarningBottomSheet;
-import net.osmand.plus.quickaction.QuickActionListFragment;
+import net.osmand.plus.measurementtool.SnapTrackWarningFragment;
 import net.osmand.plus.render.RendererRegistry;
 import net.osmand.plus.resources.ResourceManager;
 import net.osmand.plus.routepreparationmenu.ChooseRouteFragment;
@@ -141,12 +134,8 @@ import net.osmand.plus.settings.backend.OsmAndAppCustomization.OsmAndAppCustomiz
 import net.osmand.plus.settings.backend.OsmandSettings;
 import net.osmand.plus.settings.fragments.BaseSettingsFragment;
 import net.osmand.plus.settings.fragments.BaseSettingsFragment.SettingsScreenType;
-import net.osmand.plus.settings.fragments.ConfigureMenuItemsFragment;
 import net.osmand.plus.settings.fragments.ConfigureProfileFragment;
 import net.osmand.plus.settings.fragments.DataStorageFragment;
-import net.osmand.plus.settings.fragments.ImportCompleteFragment;
-import net.osmand.plus.settings.fragments.ImportSettingsFragment;
-import net.osmand.plus.settings.fragments.ProfileAppearanceFragment;
 import net.osmand.plus.track.TrackAppearanceFragment;
 import net.osmand.plus.views.AddGpxPointBottomSheetHelper.NewGpxPoint;
 import net.osmand.plus.views.AnimateDraggingMapThread;
@@ -158,7 +147,6 @@ import net.osmand.plus.views.OsmandMapTileView.OnDrawMapListener;
 import net.osmand.plus.views.corenative.NativeCoreContext;
 import net.osmand.plus.views.layers.MapControlsLayer;
 import net.osmand.plus.views.layers.MapInfoLayer;
-import net.osmand.plus.views.layers.MapQuickActionLayer;
 import net.osmand.plus.views.mapwidgets.MapInfoWidgetsFactory.TopToolbarController;
 import net.osmand.plus.views.mapwidgets.MapInfoWidgetsFactory.TopToolbarControllerType;
 import net.osmand.render.RenderingRulesStorage;
@@ -669,85 +657,17 @@ public class MapActivity extends OsmandActionBarActivity implements DownloadEven
 			closeDrawer();
 			return;
 		}
-		if (getQuickSearchDialogFragment() != null) {
-			showQuickSearch(ShowQuickSearchMode.CURRENT, false);
-			return;
-		}
-		if (trackDetailsMenu.isVisible()) {
-			trackDetailsMenu.hide(true);
-			if (mapContextMenu.isActive() && mapContextMenu.getPointDescription() != null
-					&& mapContextMenu.getPointDescription().isGpxPoint()) {
-				mapContextMenu.show();
-				return;
-			}
-			if (prevActivityIntent == null) {
-				return;
-			}
-		}
-		PlanRouteFragment planRouteFragment = getPlanRouteFragment();
-		if (planRouteFragment != null) {
-			if (planRouteFragment.quit(true)) {
-				MapMarkersDialogFragment.showInstance(this);
-			}
-			return;
-		}
-
-		SnapTrackWarningBottomSheet snapTrackWarningBottomSheet = getSnapTrackWarningBottomSheet();
-		if (snapTrackWarningBottomSheet != null) {
-			snapTrackWarningBottomSheet.dismiss();
-			return;
-		}
-
-		GpxApproximationFragment gpxApproximationFragment = getGpxApproximationFragment();
-		if (gpxApproximationFragment != null) {
-			gpxApproximationFragment.dismissImmediate();
-			return;
-		}
-
-		MeasurementToolFragment measurementToolFragment = getMeasurementToolFragment();
-		if (measurementToolFragment != null) {
-			measurementToolFragment.quit(true);
-			return;
-		}
-		ChooseRouteFragment chooseRouteFragment = getChooseRouteFragment();
-		if (chooseRouteFragment != null) {
-			chooseRouteFragment.dismiss(true);
-			return;
-		}
-		ProfileAppearanceFragment profileAppearanceFragment = getProfileAppearanceFragment();
-		if (profileAppearanceFragment != null) {
-			if (profileAppearanceFragment.isProfileAppearanceChanged()) {
-				return;
-			}
-		}
-
-		PointEditorFragmentNew pointEditorFragmentNew = getPointEditorFragmentNew();
-		if (pointEditorFragmentNew != null) {
-			pointEditorFragmentNew.showExitDialog();
-			return;
-		}
-
-		TrackAppearanceFragment trackAppearanceFragment = getTrackAppearanceFragment();
-		if (trackAppearanceFragment != null) {
-			trackAppearanceFragment.dismissImmediate();
-			if (prevActivityIntent == null) {
-				return;
-			}
-		}
-
-
-		if (mapContextMenu.isVisible() && mapContextMenu.isClosable()) {
-			if (mapContextMenu.getCurrentMenuState() != MenuState.HEADER_ONLY && !isLandscapeLayout()) {
-				mapContextMenu.openMenuHeaderOnly();
-			} else {
-				mapContextMenu.close();
-			}
-			return;
-		}
 		if (getMapLayers().getContextMenuLayer().isInAddGpxPointMode()) {
 			quitAddGpxPointMode();
 		}
-		if (prevActivityIntent != null && getSupportFragmentManager().getBackStackEntryCount() == 0) {
+		if (getSupportFragmentManager().getBackStackEntryCount() == 0 && launchPrevActivityIntent()) {
+			return;
+		}
+		super.onBackPressed();
+	}
+
+	public boolean launchPrevActivityIntent() {
+		if (prevActivityIntent != null) {
 			prevActivityIntent.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
 			LatLon loc = getMapLocation();
 			prevActivityIntent.putExtra(SearchActivity.SEARCH_LAT, loc.getLatitude());
@@ -755,40 +675,13 @@ public class MapActivity extends OsmandActionBarActivity implements DownloadEven
 			if (mapViewTrackingUtilities.isMapLinkedToLocation()) {
 				prevActivityIntent.putExtra(SearchActivity.SEARCH_NEARBY, true);
 			}
-			this.startActivity(prevActivityIntent);
+			startActivity(prevActivityIntent);
 			prevActivityIntent = null;
-			return;
+			return true;
 		}
-		QuickActionListFragment quickActionListFragment = getQuickActionListFragment();
-		if (quickActionListFragment != null && quickActionListFragment.isVisible()) {
-			if (quickActionListFragment.fromDashboard()) {
-				this.getDashboard().setDashboardVisibility(true, DashboardType.CONFIGURE_SCREEN, null);
-			} else {
-				getMapView().getLayerByClass(MapQuickActionLayer.class).onBackPressed();
-			}
-		} else if (getMapView().getLayerByClass(MapQuickActionLayer.class).onBackPressed()) {
-			return;
-		}
-		ImportSettingsFragment importSettingsFragment = getImportSettingsFragment();
-		if (importSettingsFragment != null) {
-			importSettingsFragment.showExitDialog();
-			return;
-		}
-		ImportCompleteFragment importCompleteFragment = getImportCompleteFragment();
-		if (importCompleteFragment != null) {
-			importCompleteFragment.dismissFragment();
-			return;
-		}
-		ConfigureMenuItemsFragment configureMenuItemsFragment = getConfigureMenuItemsFragment();
-		if (configureMenuItemsFragment != null) {
-			configureMenuItemsFragment.exitFragment();
-			return;
-		}
-
-		super.onBackPressed();
+		return false;
 	}
 
-
 	private void quitAddGpxPointMode() {
 		getMapLayers().getContextMenuLayer().getAddGpxPointBottomSheetHelper().hide();
 		getMapLayers().getContextMenuLayer().quitAddGpxPoint();
@@ -930,7 +823,7 @@ public class MapActivity extends OsmandActionBarActivity implements DownloadEven
 						DataStoragePlaceDialogFragment.showInstance(getSupportFragmentManager(), true);
 					} else {
 						ActivityCompat.requestPermissions(this,
-								new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},
+								new String[] {Manifest.permission.WRITE_EXTERNAL_STORAGE},
 								DownloadActivity.PERMISSIONS_REQUEST_WRITE_EXTERNAL_STORAGE);
 					}
 				}
@@ -2301,45 +2194,12 @@ public class MapActivity extends OsmandActionBarActivity implements DownloadEven
 		return getFragment(ChooseRouteFragment.TAG);
 	}
 
-	public ProfileAppearanceFragment getProfileAppearanceFragment() {
-		return getFragment(ProfileAppearanceFragment.TAG);
-	}
-
-	public QuickActionListFragment getQuickActionListFragment() {
-		return  getFragment(QuickActionListFragment.TAG);
-	}
-
-	public ImportSettingsFragment getImportSettingsFragment() {
-		return getFragment(ImportSettingsFragment.TAG);
-	}
-
-	public ImportCompleteFragment getImportCompleteFragment() {
-		return getFragment(ImportCompleteFragment.TAG);
-	}
-
-	public ConfigureMenuItemsFragment getConfigureMenuItemsFragment() {
-		return getFragment(ConfigureMenuItemsFragment.TAG);
-	}
-
-	public TrackAppearanceFragment getTrackAppearanceFragment() {
-		return getFragment(TrackAppearanceFragment.TAG);
-	}
-
 	public GpxApproximationFragment getGpxApproximationFragment() {
 		return getFragment(GpxApproximationFragment.TAG);
 	}
 
-	private SnapTrackWarningBottomSheet getSnapTrackWarningBottomSheet() {
-		return getFragment(SnapTrackWarningBottomSheet.TAG);
-	}
-
-	public PointEditorFragmentNew getPointEditorFragmentNew() {
-		PointEditorFragmentNew pointEditorFragmentNew;
-		pointEditorFragmentNew = getFragment(FavoritePointEditor.TAG);
-		if (pointEditorFragmentNew == null) {
-			pointEditorFragmentNew = getFragment(WptPtEditor.TAG);
-		}
-		return pointEditorFragmentNew;
+	public SnapTrackWarningFragment getSnapTrackWarningBottomSheet() {
+		return getFragment(SnapTrackWarningFragment.TAG);
 	}
 
 	public void backToConfigureProfileFragment() {
@@ -2353,7 +2213,7 @@ public class MapActivity extends OsmandActionBarActivity implements DownloadEven
 		}
 	}
 
-	 T getFragment(String fragmentTag){
+	 T getFragment(String fragmentTag) {
 		Fragment fragment = getSupportFragmentManager().findFragmentByTag(fragmentTag);
 		return fragment != null && !fragment.isDetached() && !fragment.isRemoving() ? (T) fragment : null;
 	}
diff --git a/OsmAnd/src/net/osmand/plus/activities/MapActivityActions.java b/OsmAnd/src/net/osmand/plus/activities/MapActivityActions.java
index d1096c74c4..ea597558e1 100644
--- a/OsmAnd/src/net/osmand/plus/activities/MapActivityActions.java
+++ b/OsmAnd/src/net/osmand/plus/activities/MapActivityActions.java
@@ -59,7 +59,9 @@ import net.osmand.plus.mapcontextmenu.AdditionalActionsBottomSheetDialogFragment
 import net.osmand.plus.mapmarkers.MapMarkersDialogFragment;
 import net.osmand.plus.mapmarkers.MarkersPlanRouteContext;
 import net.osmand.plus.measurementtool.MeasurementToolFragment;
+import net.osmand.plus.measurementtool.StartPlanRouteBottomSheet;
 import net.osmand.plus.monitoring.OsmandMonitoringPlugin;
+import net.osmand.plus.profiles.RoutingProfileDataObject;
 import net.osmand.plus.routepreparationmenu.MapRouteInfoMenu;
 import net.osmand.plus.routepreparationmenu.WaypointsFragment;
 import net.osmand.plus.routing.RouteProvider.GPXRouteParamsBuilder;
@@ -85,6 +87,7 @@ import java.text.MessageFormat;
 import java.util.ArrayList;
 import java.util.Date;
 import java.util.List;
+import java.util.Map;
 
 import static net.osmand.IndexConstants.GPX_FILE_EXT;
 import static net.osmand.aidlapi.OsmAndCustomizationConstants.DRAWER_CONFIGURE_MAP_ID;
@@ -114,6 +117,7 @@ import static net.osmand.aidlapi.OsmAndCustomizationConstants.MAP_CONTEXT_MENU_S
 import static net.osmand.plus.ContextMenuAdapter.PROFILES_CHOSEN_PROFILE_TAG;
 import static net.osmand.plus.ContextMenuAdapter.PROFILES_CONTROL_BUTTON_TAG;
 import static net.osmand.plus.ContextMenuAdapter.PROFILES_NORMAL_PROFILE_TAG;
+import static net.osmand.plus.settings.fragments.NavigationFragment.getRoutingProfiles;
 
 
 public class MapActivityActions implements DialogProvider {
@@ -293,7 +297,7 @@ public class MapActivityActions implements DialogProvider {
 					dlg.findViewById(R.id.DuplicateFileName).setVisibility(View.VISIBLE);
 				} else {
 					dlg.dismiss();
-					new SaveDirectionsAsyncTask(app).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, toSave);
+					new SaveDirectionsAsyncTask(app, false).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, toSave);
 				}
 			}
 		});
@@ -309,33 +313,42 @@ public class MapActivityActions implements DialogProvider {
 		return dlg;
 	}
 
-	private static class SaveDirectionsAsyncTask extends AsyncTask {
+	public static class SaveDirectionsAsyncTask extends AsyncTask {
 
 		private final OsmandApplication app;
+		boolean showOnMap;
 
-		public SaveDirectionsAsyncTask(OsmandApplication app) {
+		public SaveDirectionsAsyncTask(OsmandApplication app, boolean showOnMap) {
 			this.app = app;
+			this.showOnMap = showOnMap;
 		}
 
 		@Override
-		protected String doInBackground(File... params) {
+		protected GPXFile doInBackground(File... params) {
 			if (params.length > 0) {
 				File file = params[0];
-				String fileName = file.getName();
-				GPXFile gpx = app.getRoutingHelper().generateGPXFileWithRoute(fileName.substring(0,fileName.length()-GPX_FILE_EXT.length()));
-				GPXUtilities.writeGpxFile(file, gpx);
-				return app.getString(R.string.route_successfully_saved_at, file.getName());
+				String fileName = Algorithms.getFileNameWithoutExtension(file);
+				GPXFile gpx = app.getRoutingHelper().generateGPXFileWithRoute(fileName);
+				gpx.error = GPXUtilities.writeGpxFile(file, gpx);
+				return gpx;
 			}
 			return null;
 		}
 
 		@Override
-		protected void onPostExecute(String result) {
-			if (result != null) {
+		protected void onPostExecute(GPXFile gpxFile) {
+			if (gpxFile.error == null) {
+				app.getSelectedGpxHelper().selectGpxFile(gpxFile, showOnMap, false);
+				String result = app.getString(R.string.route_successfully_saved_at, gpxFile.tracks.get(0).name);
 				Toast.makeText(app, result, Toast.LENGTH_LONG).show();
+			} else {
+				String errorMessage = gpxFile.error.getMessage();
+				if (errorMessage == null) {
+					errorMessage = app.getString(R.string.error_occurred_saving_gpx);
+				}
+				Toast.makeText(app, errorMessage, Toast.LENGTH_LONG).show();
 			}
 		}
-
 	}
 
 	public void addActionsToAdapter(final double latitude,
@@ -475,6 +488,7 @@ public class MapActivityActions implements DialogProvider {
 				} else if (standardId == R.string.avoid_road) {
 					getMyApplication().getAvoidSpecificRoads().addImpassableRoad(mapActivity, new LatLon(latitude, longitude), true, false, null);
 				} else if (standardId == R.string.shared_string_add || standardId == R.string.favourites_context_menu_edit) {
+					mapActivity.getContextMenu().hide();
 					mapActivity.getContextMenu().buttonFavoritePressed();
 				} else if (standardId == R.string.shared_string_marker || standardId == R.string.shared_string_edit) {
 					mapActivity.getContextMenu().buttonWaypointPressed();
@@ -720,11 +734,11 @@ public class MapActivityActions implements DialogProvider {
 		ApplicationMode currentMode = app.getSettings().APPLICATION_MODE.get();
 
 		String modeDescription;
-		
+
+		Map profilesObjects = getRoutingProfiles(app);
 		for (final ApplicationMode appMode : activeModes) {
 			if (appMode.isCustomProfile()) {
-				modeDescription = String.format(app.getString(R.string.profile_type_descr_string),
-						Algorithms.capitalizeFirstLetterAndLowercase(appMode.getParent().toHumanString()));
+				modeDescription = getCustomProfileDescription(app, appMode, profilesObjects);
 			} else {
 				modeDescription = getString(R.string.profile_type_base_string);
 			}
@@ -929,7 +943,7 @@ public class MapActivityActions implements DialogProvider {
 				.setListener(new ItemClickListener() {
 					@Override
 					public boolean onContextMenuClick(ArrayAdapter adapter, int itemId, int position, boolean isChecked, int[] viewCoordinates) {
-						MeasurementToolFragment.showInstance(mapActivity.getSupportFragmentManager());
+						StartPlanRouteBottomSheet.showInstance(mapActivity.getSupportFragmentManager());
 						return true;
 					}
 				}).createItem());
@@ -1034,8 +1048,8 @@ public class MapActivityActions implements DialogProvider {
 		ApplicationMode currentMode = app.getSettings().APPLICATION_MODE.get();
 		String modeDescription;
 		if (currentMode.isCustomProfile()) {
-			modeDescription = String.format(app.getString(R.string.profile_type_descr_string),
-					Algorithms.capitalizeFirstLetterAndLowercase(currentMode.getParent().toHumanString()));
+			Map profilesObjects = getRoutingProfiles(app);
+			modeDescription = getCustomProfileDescription(app, currentMode, profilesObjects);
 		} else {
 			modeDescription = getString(R.string.profile_type_base_string);
 		}
@@ -1070,6 +1084,21 @@ public class MapActivityActions implements DialogProvider {
 				.createItem());
 	}
 
+	private String getCustomProfileDescription(OsmandApplication app, ApplicationMode mode,
+	                                           Map profilesObjects){
+		String	description = getString(R.string.profile_type_custom_string);
+
+		String routingProfileKey = mode.getRoutingProfile();
+		if (!Algorithms.isEmpty(routingProfileKey)) {
+			RoutingProfileDataObject profileDataObject = profilesObjects.get(routingProfileKey);
+			if (profileDataObject != null) {
+				description = String.format(app.getString(R.string.profile_type_descr_string),
+						Algorithms.capitalizeFirstLetterAndLowercase(profileDataObject.getName()));
+			}
+		}
+		return description;
+	}
+
 	public void openIntermediatePointsDialog() {
 		mapActivity.hideContextAndRouteInfoMenues();
 		WaypointsFragment.showInstance(mapActivity.getSupportFragmentManager());
diff --git a/OsmAnd/src/net/osmand/plus/base/BottomSheetBehaviourDialogFragment.java b/OsmAnd/src/net/osmand/plus/base/BottomSheetBehaviourDialogFragment.java
new file mode 100644
index 0000000000..332fb5be0e
--- /dev/null
+++ b/OsmAnd/src/net/osmand/plus/base/BottomSheetBehaviourDialogFragment.java
@@ -0,0 +1,282 @@
+package net.osmand.plus.base;
+
+import android.app.Activity;
+import android.app.Dialog;
+import android.content.Context;
+import android.content.DialogInterface;
+import android.graphics.drawable.Drawable;
+import android.os.Bundle;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.view.Window;
+import android.view.WindowManager;
+import android.widget.LinearLayout;
+
+import androidx.annotation.ColorInt;
+import androidx.annotation.ColorRes;
+import androidx.annotation.DrawableRes;
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.annotation.StringRes;
+import androidx.core.content.ContextCompat;
+import androidx.fragment.app.FragmentActivity;
+
+import com.google.android.material.bottomsheet.BottomSheetBehavior;
+
+import net.osmand.plus.OsmandApplication;
+import net.osmand.plus.R;
+import net.osmand.plus.UiUtilities;
+import net.osmand.plus.UiUtilities.DialogButtonType;
+import net.osmand.plus.base.bottomsheetmenu.BaseBottomSheetItem;
+import net.osmand.plus.helpers.AndroidUiHelper;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public abstract class BottomSheetBehaviourDialogFragment extends BottomSheetDialogFragment {
+
+	private static final String USED_ON_MAP_KEY = "used_on_map";
+	private static final int DEFAULT_VALUE = -1;
+
+	protected List items = new ArrayList<>();
+
+	protected boolean usedOnMap = true;
+	protected boolean nightMode;
+	protected boolean portrait;
+
+	protected View dismissButton;
+	protected View rightButton;
+
+	private LinearLayout itemsContainer;
+
+	public void setUsedOnMap(boolean usedOnMap) {
+		this.usedOnMap = usedOnMap;
+	}
+
+	@Override
+	public void onCreate(Bundle savedInstanceState) {
+		super.onCreate(savedInstanceState);
+		if (savedInstanceState != null) {
+			usedOnMap = savedInstanceState.getBoolean(USED_ON_MAP_KEY);
+		}
+		nightMode = isNightMode(requiredMyApplication());
+		portrait = AndroidUiHelper.isOrientationPortrait(requireActivity());
+	}
+
+	@Nullable
+	@Override
+	public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup parent, Bundle savedInstanceState) {
+		LayoutInflater themedInflater = UiUtilities.getInflater(requireContext(), nightMode);
+		View mainView = themedInflater.inflate(R.layout.bottom_sheet_behaviour_base, parent, false);
+		itemsContainer = (LinearLayout) mainView.findViewById(R.id.items_container);
+
+		View scrollView = mainView.findViewById(R.id.bottom_sheet_scroll_view);
+		final BottomSheetBehavior behavior = BottomSheetBehavior.from(scrollView);
+		behavior.setPeekHeight(getPeekHeight());
+
+		LinearLayout buttonsContainer = (LinearLayout) mainView.findViewById(R.id.buttons_container);
+		buttonsContainer.setBackgroundResource(getButtonsContainerBg());
+
+		if (!portrait) {
+			Dialog dialog = getDialog();
+			if (dialog != null) {
+				dialog.setOnShowListener(new DialogInterface.OnShowListener() {
+					@Override
+					public void onShow(DialogInterface dialog) {
+						behavior.setState(BottomSheetBehavior.STATE_EXPANDED);
+					}
+				});
+			}
+		}
+
+		createMenuItems(savedInstanceState);
+		inflateMenuItems();
+
+		dismissButton = mainView.findViewById(R.id.dismiss_button);
+		UiUtilities.setupDialogButton(nightMode, dismissButton, getDismissButtonType(), getDismissButtonTextId());
+		dismissButton.setOnClickListener(new View.OnClickListener() {
+			@Override
+			public void onClick(View v) {
+				onDismissButtonClickAction();
+				dismiss();
+			}
+		});
+		if (hideButtonsContainer()) {
+			mainView.findViewById(R.id.buttons_container).setVisibility(View.GONE);
+		} else {
+			int rightBottomButtonTextId = getRightBottomButtonTextId();
+			if (rightBottomButtonTextId != DEFAULT_VALUE) {
+				mainView.findViewById(R.id.buttons_divider).setVisibility(View.VISIBLE);
+				rightButton = mainView.findViewById(R.id.right_bottom_button);
+				UiUtilities.setupDialogButton(nightMode, rightButton, getRightBottomButtonType(), rightBottomButtonTextId);
+				rightButton.setVisibility(View.VISIBLE);
+				rightButton.setOnClickListener(new View.OnClickListener() {
+					@Override
+					public void onClick(View v) {
+						onRightBottomButtonClick();
+					}
+				});
+			}
+		}
+		updateBackground();
+		updateBottomButtons();
+		return mainView;
+	}
+
+	@Override
+	public void onStart() {
+		super.onStart();
+		FragmentActivity activity = requireActivity();
+		if (!AndroidUiHelper.isOrientationPortrait(activity)) {
+			Dialog dialog = getDialog();
+			Window window = dialog != null ? dialog.getWindow() : null;
+			if (window != null) {
+				WindowManager.LayoutParams params = window.getAttributes();
+				params.width = activity.getResources().getDimensionPixelSize(R.dimen.landscape_bottom_sheet_dialog_fragment_width);
+				window.setAttributes(params);
+			}
+		}
+	}
+
+	@Override
+	public void onSaveInstanceState(@NonNull Bundle outState) {
+		super.onSaveInstanceState(outState);
+		outState.putBoolean(USED_ON_MAP_KEY, usedOnMap);
+	}
+
+	@Override
+	public void onDestroyView() {
+		super.onDestroyView();
+		items.clear();
+		if (itemsContainer != null) {
+			itemsContainer.removeAllViews();
+		}
+	}
+
+	public abstract void createMenuItems(Bundle savedInstanceState);
+
+	protected void inflateMenuItems() {
+		Activity activity = requireActivity();
+		for (BaseBottomSheetItem item : items) {
+			item.inflate(activity, itemsContainer, nightMode);
+		}
+	}
+
+	@Override
+	protected Drawable getContentIcon(@DrawableRes int id) {
+		return getIcon(id, nightMode ? R.color.icon_color_default_dark : R.color.icon_color_default_light);
+	}
+
+	protected Drawable getActiveIcon(@DrawableRes int id) {
+		return getIcon(id, getActiveColorId());
+	}
+
+	@ColorRes
+	protected int getActiveColorId() {
+		return nightMode ? R.color.osmand_orange : R.color.color_myloc_distance;
+	}
+
+	@ColorInt
+	protected int getResolvedColor(@ColorRes int colorId) {
+		Context ctx = getContext();
+		return ctx != null ? ContextCompat.getColor(ctx, colorId) : 0;
+	}
+
+	private void updateBackground() {
+		if (portrait) {
+			itemsContainer.setBackgroundResource(getPortraitBgResId());
+		} else {
+			itemsContainer.setBackgroundResource(getLandscapeTopsidesBgResId());
+		}
+	}
+
+	protected int getPeekHeight() {
+		return DEFAULT_VALUE;
+	}
+
+	protected boolean hideButtonsContainer() {
+		return false;
+	}
+
+	@StringRes
+	protected int getDismissButtonTextId() {
+		return R.string.shared_string_cancel;
+	}
+
+	protected DialogButtonType getDismissButtonType() {
+		return DialogButtonType.SECONDARY;
+	}
+
+	protected void onDismissButtonClickAction() {
+
+	}
+
+	@StringRes
+	protected int getRightBottomButtonTextId() {
+		return DEFAULT_VALUE;
+	}
+
+	protected DialogButtonType getRightBottomButtonType() {
+		return DialogButtonType.PRIMARY;
+	}
+
+	protected void onRightBottomButtonClick() {
+
+	}
+
+	protected boolean isDismissButtonEnabled() {
+		return true;
+	}
+
+	protected boolean isRightBottomButtonEnabled() {
+		return true;
+	}
+
+	protected void updateBottomButtons() {
+		if (dismissButton != null) {
+			boolean enabled = isDismissButtonEnabled();
+			dismissButton.setEnabled(enabled);
+			dismissButton.findViewById(R.id.button_text).setEnabled(enabled);
+		}
+		if (rightButton != null) {
+			boolean enabled = isRightBottomButtonEnabled();
+			rightButton.setEnabled(enabled);
+			rightButton.findViewById(R.id.button_text).setEnabled(enabled);
+		}
+	}
+
+	@ColorRes
+	protected int getBgColorId() {
+		return nightMode ? R.color.list_background_color_dark : R.color.list_background_color_light;
+	}
+
+	@DrawableRes
+	protected int getPortraitBgResId() {
+		return nightMode ? R.drawable.bg_bottom_menu_dark : R.drawable.bg_bottom_menu_light;
+	}
+
+	@DrawableRes
+	protected int getLandscapeTopsidesBgResId() {
+		return nightMode ? R.drawable.bg_bottom_sheet_topsides_landscape_dark : R.drawable.bg_bottom_sheet_topsides_landscape_light;
+	}
+
+	@DrawableRes
+	protected int getLandscapeSidesBgResId() {
+		return nightMode ? R.drawable.bg_bottom_sheet_sides_landscape_dark : R.drawable.bg_bottom_sheet_sides_landscape_light;
+	}
+
+	private int getButtonsContainerBg() {
+		if (portrait) {
+			return getBgColorId();
+		}
+		return nightMode ? R.drawable.bottom_sheet_buttons_bg_dark : R.drawable.bottom_sheet_buttons_bg_light;
+	}
+
+	protected boolean isNightMode(@NonNull OsmandApplication app) {
+		if (usedOnMap) {
+			return app.getDaynightHelper().isNightModeForMapControls();
+		}
+		return !app.getSettings().isLightContent();
+	}
+}
\ No newline at end of file
diff --git a/OsmAnd/src/net/osmand/plus/base/ContextMenuFragment.java b/OsmAnd/src/net/osmand/plus/base/ContextMenuFragment.java
index 57928eac50..e1436bb400 100644
--- a/OsmAnd/src/net/osmand/plus/base/ContextMenuFragment.java
+++ b/OsmAnd/src/net/osmand/plus/base/ContextMenuFragment.java
@@ -46,6 +46,7 @@ import net.osmand.plus.activities.MapActivity;
 import net.osmand.plus.helpers.AndroidUiHelper;
 import net.osmand.plus.mapcontextmenu.InterceptorLinearLayout;
 import net.osmand.plus.views.controls.HorizontalSwipeConfirm;
+import net.osmand.plus.views.controls.SingleTapConfirm;
 
 import static net.osmand.plus.mapcontextmenu.MapContextMenuFragment.CURRENT_Y_UNDEFINED;
 
@@ -315,7 +316,8 @@ public abstract class ContextMenuFragment extends BaseOsmAndFragment {
 		processScreenHeight(container);
 		minHalfY = getMinHalfY(mapActivity);
 
-		final GestureDetector swipeDetector = new GestureDetector(app, new HorizontalSwipeConfirm(true));
+		final GestureDetector singleTapDetector = new GestureDetector(view.getContext(), new SingleTapConfirm());
+		final GestureDetector swipeDetector = new GestureDetector(view.getContext(), new HorizontalSwipeConfirm(true));
 
 		final OnTouchListener slideTouchListener = new OnTouchListener() {
 			private float dy;
@@ -330,6 +332,8 @@ public abstract class ContextMenuFragment extends BaseOsmAndFragment {
 			private boolean slidingUp;
 			private boolean slidingDown;
 
+			private boolean hasMoved;
+
 			{
 				OsmandApplication app = requireMyApplication();
 				scroller = new OverScroller(app);
@@ -340,7 +344,15 @@ public abstract class ContextMenuFragment extends BaseOsmAndFragment {
 
 			@Override
 			public boolean onTouch(View v, MotionEvent event) {
+				if (!hasMoved && getHeaderViewHeight() > 0 && event.getY() <= getHeaderViewHeight()) {
+					if (singleTapDetector.onTouchEvent(event)) {
+						moving = false;
+						onHeaderClick();
 
+						recycleVelocityTracker();
+						return true;
+					}
+				}
 				if (!portrait) {
 					if (swipeDetector.onTouchEvent(event)) {
 						dismiss();
@@ -352,6 +364,7 @@ public abstract class ContextMenuFragment extends BaseOsmAndFragment {
 
 				switch (event.getAction()) {
 					case MotionEvent.ACTION_DOWN:
+						hasMoved = false;
 						mDownY = event.getRawY();
 						dy = event.getY();
 						dyMain = getViewY();
@@ -365,6 +378,7 @@ public abstract class ContextMenuFragment extends BaseOsmAndFragment {
 							moving = true;
 						}
 						if (moving) {
+							hasMoved = true;
 							float y = event.getY();
 							float newY = getViewY() + (y - dy);
 							if (!portrait && newY > topScreenPosY) {
@@ -390,6 +404,7 @@ public abstract class ContextMenuFragment extends BaseOsmAndFragment {
 					case MotionEvent.ACTION_UP:
 						if (moving) {
 							moving = false;
+							hasMoved = false;
 							int currentY = getViewY();
 							int fullScreenTopPosY = getMenuStatePosY(MenuState.FULL_SCREEN);
 							final VelocityTracker velocityTracker = this.velocityTracker;
@@ -417,6 +432,7 @@ public abstract class ContextMenuFragment extends BaseOsmAndFragment {
 						break;
 					case MotionEvent.ACTION_CANCEL:
 						moving = false;
+						hasMoved = false;
 						recycleVelocityTracker();
 						break;
 
@@ -612,6 +628,10 @@ public abstract class ContextMenuFragment extends BaseOsmAndFragment {
 		}
 	}
 
+	protected boolean isHideable() {
+		return true;
+	}
+
 	private void processScreenHeight(ViewParent parent) {
 		View container = (View) parent;
 		MapActivity mapActivity = getMapActivity();
@@ -783,7 +803,7 @@ public abstract class ContextMenuFragment extends BaseOsmAndFragment {
 
 
 	private int getPosY(final int currentY, boolean needCloseMenu, int previousState) {
-		if (needCloseMenu) {
+		if (needCloseMenu && isHideable()) {
 			return screenHeight;
 		}
 		MapActivity mapActivity = getMapActivity();
@@ -858,7 +878,7 @@ public abstract class ContextMenuFragment extends BaseOsmAndFragment {
 							@Override
 							public void onAnimationEnd(Animator animation) {
 								if (!canceled) {
-									if (needCloseMenu) {
+									if (needCloseMenu && isHideable()) {
 										dismiss();
 									} else {
 										updateMainViewLayout(posY);
@@ -870,7 +890,7 @@ public abstract class ContextMenuFragment extends BaseOsmAndFragment {
 							}
 						}).start();
 			} else {
-				if (needCloseMenu) {
+				if (needCloseMenu && isHideable()) {
 					dismiss();
 				} else {
 					mainView.setY(posY);
@@ -899,6 +919,10 @@ public abstract class ContextMenuFragment extends BaseOsmAndFragment {
 		runLayoutListener();
 	}
 
+	protected void onHeaderClick() {
+
+	}
+
 	@TargetApi(Build.VERSION_CODES.JELLY_BEAN)
 	protected void runLayoutListener() {
 		if (view != null) {
diff --git a/OsmAnd/src/net/osmand/plus/base/FailSafeFuntions.java b/OsmAnd/src/net/osmand/plus/base/FailSafeFuntions.java
index d47eb92724..d898505b76 100644
--- a/OsmAnd/src/net/osmand/plus/base/FailSafeFuntions.java
+++ b/OsmAnd/src/net/osmand/plus/base/FailSafeFuntions.java
@@ -14,13 +14,13 @@ import net.osmand.GPXUtilities.GPXFile;
 import net.osmand.PlatformUtil;
 import net.osmand.data.LatLon;
 import net.osmand.plus.OsmandApplication;
-import net.osmand.plus.settings.backend.OsmandSettings;
 import net.osmand.plus.R;
 import net.osmand.plus.TargetPointsHelper;
 import net.osmand.plus.TargetPointsHelper.TargetPoint;
 import net.osmand.plus.activities.MapActivity;
 import net.osmand.plus.routing.RouteProvider.GPXRouteParamsBuilder;
 import net.osmand.plus.routing.RoutingHelper;
+import net.osmand.plus.settings.backend.OsmandSettings;
 
 import org.apache.commons.logging.Log;
 
@@ -161,9 +161,8 @@ public class FailSafeFuntions {
 		OsmandApplication app = ma.getMyApplication();
 		ma.getMapViewTrackingUtilities().backToLocationImpl();
 		RoutingHelper routingHelper = app.getRoutingHelper();
-		if(gpxRoute == null) {
-			app.getSettings().FOLLOW_THE_GPX_ROUTE.set(null);
-		}
+		app.getSettings().FOLLOW_THE_GPX_ROUTE.set(gpxRoute != null ? gpxRoute.getFile().path : null);
+
 		routingHelper.setGpxParams(gpxRoute);
 		if (app.getTargetPointsHelper().getPointToStart() == null) {
 			app.getTargetPointsHelper().setStartPoint(null, false, null);
diff --git a/OsmAnd/src/net/osmand/plus/base/bottomsheetmenu/BottomSheetItemWithDescription.java b/OsmAnd/src/net/osmand/plus/base/bottomsheetmenu/BottomSheetItemWithDescription.java
index b138bee19f..afb6319e41 100644
--- a/OsmAnd/src/net/osmand/plus/base/bottomsheetmenu/BottomSheetItemWithDescription.java
+++ b/OsmAnd/src/net/osmand/plus/base/bottomsheetmenu/BottomSheetItemWithDescription.java
@@ -53,6 +53,7 @@ public class BottomSheetItemWithDescription extends SimpleBottomSheetItem {
 	public void setDescription(CharSequence description) {
 		this.description = description;
 		descriptionTv.setText(description);
+		changeDescriptionVisibility();
 	}
 
 	public void setDescriptionMaxLines(int maxLines) {
@@ -76,11 +77,7 @@ public class BottomSheetItemWithDescription extends SimpleBottomSheetItem {
 		super.inflate(context, container, nightMode);
 		descriptionTv = view.findViewById(R.id.description);
 		if (descriptionTv != null) {
-			if (Algorithms.isEmpty(description)) {
-				descriptionTv.setVisibility(View.GONE);
-			} else {
-				descriptionTv.setVisibility(View.VISIBLE);
-			}
+			changeDescriptionVisibility();
 			descriptionTv.setText(description);
 			if (descriptionColorId != INVALID_ID) {
 				descriptionTv.setTextColor(ContextCompat.getColor(context, descriptionColorId));
@@ -94,6 +91,14 @@ public class BottomSheetItemWithDescription extends SimpleBottomSheetItem {
 		}
 	}
 
+	private void changeDescriptionVisibility() {
+		if (Algorithms.isEmpty(description)) {
+			descriptionTv.setVisibility(View.GONE);
+		} else {
+			descriptionTv.setVisibility(View.VISIBLE);
+		}
+	}
+
 	public static class Builder extends SimpleBottomSheetItem.Builder {
 
 		protected CharSequence description;
diff --git a/OsmAnd/src/net/osmand/plus/dialogs/GpxAppearanceAdapter.java b/OsmAnd/src/net/osmand/plus/dialogs/GpxAppearanceAdapter.java
index abfb18bd49..1a1e873b95 100644
--- a/OsmAnd/src/net/osmand/plus/dialogs/GpxAppearanceAdapter.java
+++ b/OsmAnd/src/net/osmand/plus/dialogs/GpxAppearanceAdapter.java
@@ -113,30 +113,27 @@ public class GpxAppearanceAdapter extends ArrayAdapter() {
 			ProgressDialog progress = null;
 
@@ -343,8 +352,7 @@ public class ImportHelper {
 				if (AndroidUtils.isActivityNotDestroyed(activity)) {
 					progress.dismiss();
 				}
-
-				importGpxOrFavourites(result, fileName, save, useImportDir, forceImportFavourites);
+				importGpxOrFavourites(result, fileName, save, useImportDir, forceImportFavourites, forceImportGpx);
 			}
 		}.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
 	}
@@ -1108,11 +1116,7 @@ public class ImportHelper {
 		}
 
 		private void showPlanRouteFragment() {
-			MeasurementToolFragment fragment = (MeasurementToolFragment) activity.getSupportFragmentManager()
-					.findFragmentByTag(MeasurementToolFragment.TAG);
-			if (fragment != null && !fragment.isDetached() && !fragment.isRemoving()) {
-				fragment.addNewGpxData(result);
-			}
+			MeasurementToolFragment.showInstance(activity.getSupportFragmentManager(), result);
 		}
 	}
 
@@ -1148,7 +1152,8 @@ public class ImportHelper {
 	}
 
 	private void importGpxOrFavourites(final GPXFile gpxFile, final String fileName, final boolean save,
-									   final boolean useImportDir, final boolean forceImportFavourites) {
+									   final boolean useImportDir, final boolean forceImportFavourites,
+									   final boolean forceImportGpx) {
 		if (gpxFile == null || gpxFile.isPointsEmpty()) {
 			if (forceImportFavourites) {
 				final DialogInterface.OnClickListener importAsTrackListener = new DialogInterface.OnClickListener() {
@@ -1181,16 +1186,20 @@ public class ImportHelper {
 		if (forceImportFavourites) {
 			importFavoritesImpl(gpxFile, fileName, true);
 		} else if (fileName != null) {
-			ImportGpxBottomSheetDialogFragment fragment = new ImportGpxBottomSheetDialogFragment();
-			fragment.setUsedOnMap(true);
-			fragment.setImportHelper(this);
-			fragment.setGpxFile(gpxFile);
-			fragment.setFileName(fileName);
-			fragment.setSave(save);
-			fragment.setUseImportDir(useImportDir);
-			activity.getSupportFragmentManager().beginTransaction()
-					.add(fragment, ImportGpxBottomSheetDialogFragment.TAG)
-					.commitAllowingStateLoss();
+			if (forceImportGpx) {
+				handleResult(gpxFile, fileName, save, useImportDir, false);
+			} else {
+				ImportGpxBottomSheetDialogFragment fragment = new ImportGpxBottomSheetDialogFragment();
+				fragment.setUsedOnMap(true);
+				fragment.setImportHelper(this);
+				fragment.setGpxFile(gpxFile);
+				fragment.setFileName(fileName);
+				fragment.setSave(save);
+				fragment.setUseImportDir(useImportDir);
+				activity.getSupportFragmentManager().beginTransaction()
+						.add(fragment, ImportGpxBottomSheetDialogFragment.TAG)
+						.commitAllowingStateLoss();
+			}
 		}
 	}
 
@@ -1212,6 +1221,7 @@ public class ImportHelper {
 				if (p.desc != null) {
 					fp.setDescription(p.desc);
 				}
+				fp.setAddress(p.getExtensionsToRead().get("address"));
 				fp.setColor(p.getColor(0));
 				fp.setIconIdFromName(app, p.getIconName());
 				fp.setBackgroundType(BackgroundType.getByTypeName(p.getBackgroundType(), DEFAULT_BACKGROUND_TYPE));
diff --git a/OsmAnd/src/net/osmand/plus/inapp/InAppPurchaseHelper.java b/OsmAnd/src/net/osmand/plus/inapp/InAppPurchaseHelper.java
index 2fe36e624d..ac7e2c77fb 100644
--- a/OsmAnd/src/net/osmand/plus/inapp/InAppPurchaseHelper.java
+++ b/OsmAnd/src/net/osmand/plus/inapp/InAppPurchaseHelper.java
@@ -63,6 +63,7 @@ public class InAppPurchaseHelper {
 
 	private InAppPurchases purchases;
 	private long lastValidationCheckTime;
+	private boolean inventoryRequested;
 
 	private static final long PURCHASE_VALIDATION_PERIOD_MSEC = 1000 * 60 * 60 * 24; // daily
 	// (arbitrary) request code for the purchase flow
@@ -333,8 +334,8 @@ public class InAppPurchaseHelper {
 	}
 
 	public boolean needRequestInventory() {
-		return (isSubscribedToLiveUpdates(ctx) && Algorithms.isEmpty(ctx.getSettings().BILLING_PURCHASE_TOKENS_SENT.get()))
-				|| System.currentTimeMillis() - lastValidationCheckTime > PURCHASE_VALIDATION_PERIOD_MSEC;
+		return !inventoryRequested && ((isSubscribedToLiveUpdates(ctx) && Algorithms.isEmpty(ctx.getSettings().BILLING_PURCHASE_TOKENS_SENT.get()))
+				|| System.currentTimeMillis() - lastValidationCheckTime > PURCHASE_VALIDATION_PERIOD_MSEC);
 	}
 
 	public void requestInventory() {
@@ -803,6 +804,7 @@ public class InAppPurchaseHelper {
 		protected void onPostExecute(String response) {
 			logDebug("Response=" + response);
 			if (response != null) {
+				inventoryRequested = true;
 				try {
 					JSONObject obj = new JSONObject(response);
 					JSONArray names = obj.names();
diff --git a/OsmAnd/src/net/osmand/plus/mapcontextmenu/MapContextMenuFragment.java b/OsmAnd/src/net/osmand/plus/mapcontextmenu/MapContextMenuFragment.java
index 44748e36bb..5f88a13607 100644
--- a/OsmAnd/src/net/osmand/plus/mapcontextmenu/MapContextMenuFragment.java
+++ b/OsmAnd/src/net/osmand/plus/mapcontextmenu/MapContextMenuFragment.java
@@ -37,6 +37,7 @@ import android.widget.OverScroller;
 import android.widget.ProgressBar;
 import android.widget.TextView;
 
+import androidx.activity.OnBackPressedCallback;
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
 import androidx.appcompat.content.res.AppCompatResources;
@@ -108,11 +109,8 @@ public class MapContextMenuFragment extends BaseOsmAndFragment implements Downlo
 	private InterceptorLinearLayout mainView;
 
 	private View toolbarContainer;
-	private View toolbarView;
-	private ImageView toolbarBackButton;
 	private TextView toolbarTextView;
 	private View topButtonContainer;
-	private LockableScrollView menuScrollView;
 
 	private LinearLayout mainRouteBadgeContainer;
 	private LinearLayout nearbyRoutesLayout;
@@ -123,8 +121,6 @@ public class MapContextMenuFragment extends BaseOsmAndFragment implements Downlo
 	private TextView localRoutesMoreTv;
 
 	private View zoomButtonsView;
-	private ImageButton zoomInButtonView;
-	private ImageButton zoomOutButtonView;
 
 	private MapContextMenu menu;
 	private OnLayoutChangeListener containerLayoutListener;
@@ -149,7 +145,6 @@ public class MapContextMenuFragment extends BaseOsmAndFragment implements Downlo
 	private int topScreenPosY;
 	private int bottomToolbarPosY;
 	private int minHalfY;
-	private int shadowHeight;
 	private int zoomPaddingTop;
 
 	private OsmandMapTileView map;
@@ -164,13 +159,32 @@ public class MapContextMenuFragment extends BaseOsmAndFragment implements Downlo
 	private boolean wasDrawerDisabled;
 	private boolean zoomIn;
 
-	private int screenOrientation;
 	private boolean created;
 
 	private boolean transportBadgesCreated;
 
 	private UpdateLocationViewCache updateLocationViewCache;
 
+	@Override
+	public void onCreate(@Nullable Bundle savedInstanceState) {
+		super.onCreate(savedInstanceState);
+		MapActivity mapActivity = getMapActivity();
+		if (mapActivity != null) {
+			boolean enabled = mapActivity.getQuickSearchDialogFragment() == null;
+			mapActivity.getOnBackPressedDispatcher().addCallback(this, new OnBackPressedCallback(enabled) {
+				public void handleOnBackPressed() {
+					if (menu.isVisible() && menu.isClosable()) {
+						if (menu.getCurrentMenuState() != MenuState.HEADER_ONLY && !menu.isLandscapeLayout()) {
+							menu.openMenuHeaderOnly();
+						} else {
+							menu.close();
+						}
+					}
+				}
+			});
+		}
+	}
+
 	@Override
 	public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container,
 	                         Bundle savedInstanceState) {
@@ -188,7 +202,7 @@ public class MapContextMenuFragment extends BaseOsmAndFragment implements Downlo
 
 		markerPaddingPx = dpToPx(MARKER_PADDING_DP);
 		markerPaddingXPx = dpToPx(MARKER_PADDING_X_DP);
-		shadowHeight = dpToPx(SHADOW_HEIGHT_TOP_DP);
+		int shadowHeight = dpToPx(SHADOW_HEIGHT_TOP_DP);
 		topScreenPosY = addStatusBarHeightIfNeeded(-shadowHeight);
 		bottomToolbarPosY = addStatusBarHeightIfNeeded(getResources().getDimensionPixelSize(R.dimen.dashboard_map_toolbar));
 		minHalfY = viewHeight - (int) (viewHeight * menu.getHalfScreenMaxHeightKoef());
@@ -204,8 +218,7 @@ public class MapContextMenuFragment extends BaseOsmAndFragment implements Downlo
 		mainView = view.findViewById(R.id.context_menu_main);
 
 		toolbarContainer = view.findViewById(R.id.context_menu_toolbar_container);
-		toolbarView = view.findViewById(R.id.context_menu_toolbar);
-		toolbarBackButton = view.findViewById(R.id.context_menu_toolbar_back);
+		ImageView toolbarBackButton = view.findViewById(R.id.context_menu_toolbar_back);
 		toolbarTextView = (TextView) view.findViewById(R.id.context_menu_toolbar_text);
 		updateVisibility(toolbarContainer, 0);
 		toolbarBackButton.setOnClickListener(new View.OnClickListener() {
@@ -510,9 +523,9 @@ public class MapContextMenuFragment extends BaseOsmAndFragment implements Downlo
 
 		// Zoom buttons
 		zoomButtonsView = view.findViewById(R.id.context_menu_zoom_buttons);
-		zoomInButtonView = (ImageButton) view.findViewById(R.id.context_menu_zoom_in_button);
-		zoomOutButtonView = (ImageButton) view.findViewById(R.id.context_menu_zoom_out_button);
 		if (menu.zoomButtonsVisible()) {
+			ImageButton zoomInButtonView = view.findViewById(R.id.context_menu_zoom_in_button);
+			ImageButton zoomOutButtonView = view.findViewById(R.id.context_menu_zoom_out_button);
 			AndroidUtils.updateImageButton(app, zoomInButtonView, R.drawable.ic_zoom_in, R.drawable.ic_zoom_in,
 					R.drawable.btn_circle_trans, R.drawable.btn_circle_night, nightMode);
 			AndroidUtils.updateImageButton(app, zoomOutButtonView, R.drawable.ic_zoom_out, R.drawable.ic_zoom_out,
@@ -2302,5 +2315,4 @@ public class MapContextMenuFragment extends BaseOsmAndFragment implements Downlo
 		updateAdditionalInfoVisibility();
 		runLayoutListener();
 	}
-}
-
+}
\ No newline at end of file
diff --git a/OsmAnd/src/net/osmand/plus/mapcontextmenu/controllers/FavouritePointMenuController.java b/OsmAnd/src/net/osmand/plus/mapcontextmenu/controllers/FavouritePointMenuController.java
index c6b07ba60c..a6a84bee67 100644
--- a/OsmAnd/src/net/osmand/plus/mapcontextmenu/controllers/FavouritePointMenuController.java
+++ b/OsmAnd/src/net/osmand/plus/mapcontextmenu/controllers/FavouritePointMenuController.java
@@ -28,6 +28,7 @@ import net.osmand.plus.mapcontextmenu.editors.FavoritePointEditorFragment;
 import net.osmand.plus.mapcontextmenu.editors.FavoritePointEditorFragmentNew;
 import net.osmand.plus.transport.TransportStopRoute;
 import net.osmand.plus.widgets.style.CustomTypefaceSpan;
+import net.osmand.util.Algorithms;
 import net.osmand.util.OpeningHoursParser;
 import net.osmand.view.GravityDrawable;
 
@@ -160,9 +161,12 @@ public class FavouritePointMenuController extends MenuController {
 	@NonNull
 	@Override
 	public CharSequence getSubtypeStr() {
-		if (fav.getAddress() != null) {Typeface typeface = FontCache.getRobotoRegular(getMapActivity());
+		MapActivity mapActivity = getMapActivity();
+		if (mapActivity != null && !Algorithms.isEmpty(fav.getAddress())) {
+			Typeface typeface = FontCache.getRobotoRegular(mapActivity);
 			SpannableString addressSpannable = new SpannableString(fav.getAddress());
 			addressSpannable.setSpan(new CustomTypefaceSpan(typeface), 0, addressSpannable.length(), 0);
+
 			return addressSpannable;
 		} else {
 			return "";
diff --git a/OsmAnd/src/net/osmand/plus/mapcontextmenu/editors/PointEditorFragmentNew.java b/OsmAnd/src/net/osmand/plus/mapcontextmenu/editors/PointEditorFragmentNew.java
index 76ef9cdd38..9856f907e1 100644
--- a/OsmAnd/src/net/osmand/plus/mapcontextmenu/editors/PointEditorFragmentNew.java
+++ b/OsmAnd/src/net/osmand/plus/mapcontextmenu/editors/PointEditorFragmentNew.java
@@ -25,6 +25,7 @@ import android.widget.ImageView;
 import android.widget.ScrollView;
 import android.widget.TextView;
 
+import androidx.activity.OnBackPressedCallback;
 import androidx.annotation.ColorInt;
 import androidx.annotation.DrawableRes;
 import androidx.annotation.NonNull;
@@ -38,6 +39,7 @@ import androidx.fragment.app.FragmentActivity;
 import androidx.recyclerview.widget.LinearLayoutManager;
 import androidx.recyclerview.widget.RecyclerView;
 
+import com.google.android.material.textfield.TextInputEditText;
 import com.google.android.material.textfield.TextInputLayout;
 
 import net.osmand.AndroidUtils;
@@ -48,6 +50,7 @@ import net.osmand.plus.activities.MapActivity;
 import net.osmand.plus.base.BaseOsmAndFragment;
 import net.osmand.plus.helpers.AndroidUiHelper;
 import net.osmand.plus.helpers.ColorDialogs;
+import net.osmand.plus.mapcontextmenu.MapContextMenu;
 import net.osmand.plus.mapcontextmenu.other.HorizontalSelectionAdapter;
 import net.osmand.plus.widgets.FlowLayout;
 import net.osmand.util.Algorithms;
@@ -98,6 +101,19 @@ public abstract class PointEditorFragmentNew extends BaseOsmAndFragment {
 	private EditText addressEdit;
 	private int layoutHeightPrevious = 0;
 
+	@Override
+	public void onCreate(@Nullable Bundle savedInstanceState) {
+		super.onCreate(savedInstanceState);
+		requireMyActivity().getOnBackPressedDispatcher().addCallback(this, new OnBackPressedCallback(true) {
+			public void handleOnBackPressed() {
+				MapActivity mapActivity = getMapActivity();
+				if (mapActivity != null) {
+					showExitDialog();
+				}
+			}
+		});
+	}
+
 	@SuppressLint("ClickableViewAccessibility")
 	@Override
 	public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container,
@@ -296,12 +312,12 @@ public abstract class PointEditorFragmentNew extends BaseOsmAndFragment {
 			public void onClick(View v) {
 				if (addressCaption.getVisibility() != View.VISIBLE) {
 					addressCaption.setVisibility(View.VISIBLE);
-					addAddressBtn.setText(view.getResources().getString(R.string.delete_address));
+					TextInputEditText addressEdit = view.findViewById(R.id.address_edit);
 					View row = view.findViewById(R.id.address_row);
 					row.setVisibility(View.GONE);
 					addAddressBtn.setText(getString(R.string.add_address));
-					View addressEdit = view.findViewById(R.id.address_edit);
 					addressEdit.requestFocus();
+					addressEdit.setSelection(addressEdit.getText().length());
 					AndroidUtils.softKeyboardDelayed(requireActivity(),addressEdit);
 				} else {
 					addressCaption.setVisibility(View.GONE);
@@ -906,14 +922,28 @@ public abstract class PointEditorFragmentNew extends BaseOsmAndFragment {
 			dismissDialog.setPositiveButton(R.string.shared_string_exit, new DialogInterface.OnClickListener() {
 				@Override
 				public void onClick(DialogInterface dialog, int which) {
-					cancelled = true;
-					dismiss();
+					exitEditing();
 				}
 			});
 			dismissDialog.show();
 		} else {
-			cancelled = true;
-			dismiss();
+			exitEditing();
+		}
+	}
+
+	private void exitEditing() {
+		cancelled = true;
+		dismiss();
+		showContextMenu();
+	}
+
+	private void showContextMenu() {
+		MapActivity mapActivity = getMapActivity();
+		if (mapActivity != null) {
+			MapContextMenu mapContextMenu = mapActivity.getContextMenu();
+			if (!mapContextMenu.isVisible() && mapContextMenu.isActive()) {
+				mapContextMenu.show();
+			}
 		}
 	}
 
diff --git a/OsmAnd/src/net/osmand/plus/mapcontextmenu/other/TrackDetailsMenuFragment.java b/OsmAnd/src/net/osmand/plus/mapcontextmenu/other/TrackDetailsMenuFragment.java
index f456ba0360..2a06fe71a7 100644
--- a/OsmAnd/src/net/osmand/plus/mapcontextmenu/other/TrackDetailsMenuFragment.java
+++ b/OsmAnd/src/net/osmand/plus/mapcontextmenu/other/TrackDetailsMenuFragment.java
@@ -12,6 +12,7 @@ import android.widget.ImageButton;
 import android.widget.ImageView;
 import android.widget.TextView;
 
+import androidx.activity.OnBackPressedCallback;
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
 import androidx.fragment.app.FragmentActivity;
@@ -49,11 +50,33 @@ public class TrackDetailsMenuFragment extends BaseOsmAndFragment implements OsmA
 		return (MapActivity) requireMyActivity();
 	}
 
+	@Override
+	public void onCreate(@Nullable Bundle savedInstanceState) {
+		super.onCreate(savedInstanceState);
+		final MapActivity mapActivity = requireMapActivity();
+		menu = mapActivity.getTrackDetailsMenu();
+
+		mapActivity.getOnBackPressedDispatcher().addCallback(this, new OnBackPressedCallback(true) {
+			public void handleOnBackPressed() {
+				if (menu.isVisible()) {
+					menu.hide(true);
+
+					MapContextMenu contextMenu = mapActivity.getContextMenu();
+					if (contextMenu.isActive() && contextMenu.getPointDescription() != null
+							&& contextMenu.getPointDescription().isGpxPoint()) {
+						contextMenu.show();
+					} else {
+						mapActivity.launchPrevActivityIntent();
+					}
+				}
+			}
+		});
+	}
+
 	@Override
 	public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container,
 							 Bundle savedInstanceState) {
 		MapActivity mapActivity = requireMapActivity();
-		menu = mapActivity.getTrackDetailsMenu();
 		nightMode = mapActivity.getMyApplication().getDaynightHelper().isNightModeForMapControls();
 		View view = UiUtilities.getInflater(mapActivity, nightMode).inflate(R.layout.track_details, container, false);
 		if (!AndroidUiHelper.isOrientationPortrait(mapActivity)) {
diff --git a/OsmAnd/src/net/osmand/plus/mapmarkers/CoordinateInputDialogFragment.java b/OsmAnd/src/net/osmand/plus/mapmarkers/CoordinateInputDialogFragment.java
index 8c36930451..a68bd4c714 100644
--- a/OsmAnd/src/net/osmand/plus/mapmarkers/CoordinateInputDialogFragment.java
+++ b/OsmAnd/src/net/osmand/plus/mapmarkers/CoordinateInputDialogFragment.java
@@ -43,7 +43,6 @@ import androidx.annotation.DrawableRes;
 import androidx.annotation.IdRes;
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
-import androidx.appcompat.app.AppCompatDelegate;
 import androidx.appcompat.content.res.AppCompatResources;
 import androidx.appcompat.widget.PopupMenu;
 import androidx.core.content.ContextCompat;
@@ -57,6 +56,7 @@ import androidx.recyclerview.widget.RecyclerView;
 import com.google.android.material.snackbar.Snackbar;
 
 import net.osmand.AndroidUtils;
+import net.osmand.FileUtils;
 import net.osmand.GPXUtilities;
 import net.osmand.GPXUtilities.GPXFile;
 import net.osmand.GPXUtilities.WptPt;
@@ -67,7 +67,6 @@ import net.osmand.plus.MapMarkersHelper;
 import net.osmand.plus.OsmAndLocationProvider.OsmAndCompassListener;
 import net.osmand.plus.OsmAndLocationProvider.OsmAndLocationListener;
 import net.osmand.plus.OsmandApplication;
-import net.osmand.plus.settings.backend.OsmandSettings;
 import net.osmand.plus.R;
 import net.osmand.plus.UiUtilities;
 import net.osmand.plus.Version;
@@ -79,6 +78,7 @@ import net.osmand.plus.mapmarkers.CoordinateInputFormats.DDM;
 import net.osmand.plus.mapmarkers.CoordinateInputFormats.DMS;
 import net.osmand.plus.mapmarkers.CoordinateInputFormats.Format;
 import net.osmand.plus.mapmarkers.adapters.CoordinateInputAdapter;
+import net.osmand.plus.settings.backend.OsmandSettings;
 import net.osmand.plus.widgets.EditTextEx;
 import net.osmand.util.Algorithms;
 import net.osmand.util.LocationParser;
@@ -1498,15 +1498,13 @@ public class CoordinateInputDialogFragment extends DialogFragment implements Osm
 		protected Void doInBackground(Void... params) {
 			if (Algorithms.isEmpty(gpx.path)) {
 				if (!Algorithms.isEmpty(fileName)) {
-					final File dir = app.getAppPath(IndexConstants.GPX_INDEX_DIR + IndexConstants.MAP_MARKERS_INDEX_DIR);
+					String dirName = IndexConstants.GPX_INDEX_DIR + IndexConstants.MAP_MARKERS_INDEX_DIR;
+					File dir = app.getAppPath(dirName);
 					if (!dir.exists()) {
 						dir.mkdirs();
 					}
-					File fout = new File(dir, fileName + IndexConstants.GPX_FILE_EXT);
-					int ind = 1;
-					while (fout.exists()) {
-						fout = new File(dir, fileName + "_" + (++ind) + IndexConstants.GPX_FILE_EXT);
-					}
+					String uniqueFileName = FileUtils.createUniqueFileName(app, fileName, dirName, IndexConstants.GPX_FILE_EXT);
+					File fout = new File(dir, uniqueFileName + IndexConstants.GPX_FILE_EXT);
 					GPXUtilities.writeGpxFile(fout, gpx);
 				}
 			} else {
diff --git a/OsmAnd/src/net/osmand/plus/mapmarkers/PlanRouteFragment.java b/OsmAnd/src/net/osmand/plus/mapmarkers/PlanRouteFragment.java
index 89a1016ea0..60399c3872 100644
--- a/OsmAnd/src/net/osmand/plus/mapmarkers/PlanRouteFragment.java
+++ b/OsmAnd/src/net/osmand/plus/mapmarkers/PlanRouteFragment.java
@@ -17,6 +17,7 @@ import android.widget.LinearLayout;
 import android.widget.ProgressBar;
 import android.widget.TextView;
 
+import androidx.activity.OnBackPressedCallback;
 import androidx.annotation.DrawableRes;
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
@@ -57,8 +58,8 @@ import net.osmand.plus.measurementtool.SnapToRoadBottomSheetDialogFragment.SnapT
 import net.osmand.plus.routing.RoutingHelper;
 import net.osmand.plus.settings.backend.ApplicationMode;
 import net.osmand.plus.settings.backend.OsmandSettings;
-import net.osmand.plus.views.layers.MapMarkersLayer;
 import net.osmand.plus.views.OsmandMapTileView;
+import net.osmand.plus.views.layers.MapMarkersLayer;
 import net.osmand.plus.views.mapwidgets.MapInfoWidgetsFactory;
 import net.osmand.plus.views.mapwidgets.MapInfoWidgetsFactory.TopToolbarController;
 import net.osmand.util.MapUtils;
@@ -96,6 +97,19 @@ public class PlanRouteFragment extends BaseOsmAndFragment implements OsmAndLocat
 	private View mainView;
 	private RecyclerView markersRv;
 
+	@Override
+	public void onCreate(@Nullable Bundle savedInstanceState) {
+		super.onCreate(savedInstanceState);
+		requireMyActivity().getOnBackPressedDispatcher().addCallback(this, new OnBackPressedCallback(true) {
+			public void handleOnBackPressed() {
+				MapActivity mapActivity = getMapActivity();
+				if (mapActivity != null && quit(true)) {
+					MapMarkersDialogFragment.showInstance(mapActivity);
+				}
+			}
+		});
+	}
+
 	@Nullable
 	@Override
 	public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
diff --git a/OsmAnd/src/net/osmand/plus/mapmarkers/SaveAsTrackBottomSheetDialogFragment.java b/OsmAnd/src/net/osmand/plus/mapmarkers/SaveAsTrackBottomSheetDialogFragment.java
index f176437ebd..a2a72d3f64 100644
--- a/OsmAnd/src/net/osmand/plus/mapmarkers/SaveAsTrackBottomSheetDialogFragment.java
+++ b/OsmAnd/src/net/osmand/plus/mapmarkers/SaveAsTrackBottomSheetDialogFragment.java
@@ -21,6 +21,7 @@ import androidx.core.content.ContextCompat;
 import com.google.android.material.textfield.TextInputLayout;
 
 import net.osmand.AndroidUtils;
+import net.osmand.FileUtils;
 import net.osmand.IndexConstants;
 import net.osmand.plus.OsmandApplication;
 import net.osmand.plus.R;
@@ -28,7 +29,6 @@ import net.osmand.plus.base.BottomSheetDialogFragment;
 import net.osmand.plus.helpers.AndroidUiHelper;
 import net.osmand.plus.widgets.OsmandTextFieldBoxes;
 
-import java.io.File;
 import java.util.Date;
 
 import static net.osmand.plus.mapmarkers.CoordinateInputDialogFragment.ADDED_POINTS_NUMBER_KEY;
@@ -85,21 +85,13 @@ public class SaveAsTrackBottomSheetDialogFragment extends BottomSheetDialogFragm
 			}
 		}
 
-		final File dir = app.getAppPath(IndexConstants.GPX_INDEX_DIR + "/map markers");
-		if (!dir.exists()) {
-			dir.mkdirs();
-		}
 		Date date = new Date();
-		final String suggestedName = app.getString(R.string.markers) + "_" + DateFormat.format("yyyy-MM-dd", date).toString();
-		String displayedName = suggestedName;
-		File fout = new File(dir, suggestedName + IndexConstants.GPX_FILE_EXT);
-		int ind = 1;
-		while (fout.exists()) {
-			displayedName = suggestedName + "_" + (++ind);
-			fout = new File(dir, displayedName + IndexConstants.GPX_FILE_EXT);
-		}
-		final EditText nameEditText = (EditText) mainView.findViewById(R.id.name_edit_text);
-		nameEditText.setText(displayedName);
+		String dirName = IndexConstants.GPX_INDEX_DIR + IndexConstants.MAP_MARKERS_INDEX_DIR;
+		String suggestedName = app.getString(R.string.markers) + "_" + DateFormat.format("yyyy-MM-dd", date).toString();
+		String uniqueFileName = FileUtils.createUniqueFileName(app, suggestedName, dirName, IndexConstants.GPX_FILE_EXT);
+
+		final EditText nameEditText = mainView.findViewById(R.id.name_edit_text);
+		nameEditText.setText(uniqueFileName);
 		nameEditText.setTextColor(ContextCompat.getColor(getContext(), textPrimaryColor));
 
 		mainView.findViewById(R.id.save_button).setOnClickListener(new View.OnClickListener() {
diff --git a/OsmAnd/src/net/osmand/plus/measurementtool/GpxApproximationFragment.java b/OsmAnd/src/net/osmand/plus/measurementtool/GpxApproximationFragment.java
index 4217faf1c9..393e43b31b 100644
--- a/OsmAnd/src/net/osmand/plus/measurementtool/GpxApproximationFragment.java
+++ b/OsmAnd/src/net/osmand/plus/measurementtool/GpxApproximationFragment.java
@@ -9,6 +9,7 @@ import android.widget.FrameLayout;
 import android.widget.LinearLayout;
 import android.widget.ProgressBar;
 
+import androidx.activity.OnBackPressedCallback;
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
 import androidx.fragment.app.Fragment;
@@ -56,6 +57,8 @@ public class GpxApproximationFragment extends ContextMenuScrollFragment
 	private View cancelButton;
 	private View applyButton;
 
+	private SliderCard sliderCard;
+
 	@Override
 	public int getMainLayoutId() {
 		return R.layout.fragment_gpx_approximation_bottom_sheet_dialog;
@@ -87,7 +90,7 @@ public class GpxApproximationFragment extends ContextMenuScrollFragment
 
 	@Override
 	public int getSupportedMenuStatesPortrait() {
-		return MenuState.HALF_SCREEN | MenuState.FULL_SCREEN;
+		return MenuState.HEADER_ONLY | MenuState.HALF_SCREEN | MenuState.FULL_SCREEN;
 	}
 
 	@Override
@@ -95,6 +98,16 @@ public class GpxApproximationFragment extends ContextMenuScrollFragment
 		return MenuState.HALF_SCREEN;
 	}
 
+	@Override
+	public void onCreate(@Nullable Bundle savedInstanceState) {
+		super.onCreate(savedInstanceState);
+		requireMyActivity().getOnBackPressedDispatcher().addCallback(this, new OnBackPressedCallback(true) {
+			public void handleOnBackPressed() {
+				dismissImmediate();
+			}
+		});
+	}
+
 	@Nullable
 	@Override
 	public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
@@ -165,7 +178,6 @@ public class GpxApproximationFragment extends ContextMenuScrollFragment
 			params.gravity = Gravity.BOTTOM | Gravity.START;
 			mainView.findViewById(R.id.control_buttons).setLayoutParams(params);
 		}
-		enterGpxApproximationMode();
 		runLayoutListener();
 
 		calculateGpxApproximation();
@@ -175,11 +187,17 @@ public class GpxApproximationFragment extends ContextMenuScrollFragment
 
 	@Override
 	protected void calculateLayout(View view, boolean initLayout) {
+		int sliderHeight = sliderCard != null ? sliderCard.getViewHeight() : 0;
 		menuTitleHeight = view.findViewById(R.id.control_buttons).getHeight()
-				- view.findViewById(R.id.buttons_shadow).getHeight();
+				- view.findViewById(R.id.buttons_shadow).getHeight() + sliderHeight;
 		super.calculateLayout(view, initLayout);
 	}
 
+	@Override
+	protected boolean isHideable() {
+		return false;
+	}
+
 	@Override
 	public void onSaveInstanceState(@NonNull Bundle outState) {
 		super.onSaveInstanceState(outState);
@@ -193,7 +211,6 @@ public class GpxApproximationFragment extends ContextMenuScrollFragment
 		if (gpxApproximator != null) {
 			gpxApproximator.cancelApproximation();
 		}
-		exitGpxApproximationMode();
 		if (!applyApproximation) {
 			Fragment fragment = getTargetFragment();
 			if (fragment instanceof GpxApproximationFragmentListener) {
@@ -265,7 +282,7 @@ public class GpxApproximationFragment extends ContextMenuScrollFragment
 			cardsContainer.removeAllViews();
 
 			if (getTopView() != null) {
-				SliderCard sliderCard = new SliderCard(mapActivity, distanceThreshold);
+				sliderCard = new SliderCard(mapActivity, distanceThreshold);
 				sliderCard.setListener(this);
 				getTopView().addView(sliderCard.build(mapActivity));
 			}
@@ -276,28 +293,6 @@ public class GpxApproximationFragment extends ContextMenuScrollFragment
 		}
 	}
 
-	private void enterGpxApproximationMode() {
-		MapActivity mapActivity = getMapActivity();
-		if (mapActivity != null) {
-			boolean portrait = AndroidUiHelper.isOrientationPortrait(mapActivity);
-			AndroidUiHelper.setVisibility(mapActivity, portrait ? View.INVISIBLE : View.GONE,
-					R.id.map_left_widgets_panel,
-					R.id.map_right_widgets_panel,
-					R.id.map_center_info);
-		}
-	}
-
-	private void exitGpxApproximationMode() {
-		MapActivity mapActivity = getMapActivity();
-		if (mapActivity != null) {
-			AndroidUiHelper.setVisibility(mapActivity, View.VISIBLE,
-					R.id.map_left_widgets_panel,
-					R.id.map_right_widgets_panel,
-					R.id.map_center_info,
-					R.id.map_search_button);
-		}
-	}
-
 	@Override
 	public boolean shouldShowMapControls(int menuState) {
 		return (menuState & (MenuState.HEADER_ONLY | MenuState.HALF_SCREEN)) != 0;
diff --git a/OsmAnd/src/net/osmand/plus/measurementtool/MeasurementEditingContext.java b/OsmAnd/src/net/osmand/plus/measurementtool/MeasurementEditingContext.java
index 88ec9f7975..105c947ddc 100644
--- a/OsmAnd/src/net/osmand/plus/measurementtool/MeasurementEditingContext.java
+++ b/OsmAnd/src/net/osmand/plus/measurementtool/MeasurementEditingContext.java
@@ -43,7 +43,7 @@ import java.util.Map;
 import java.util.concurrent.ConcurrentHashMap;
 
 import static net.osmand.plus.measurementtool.MeasurementEditingContext.CalculationMode.WHOLE_TRACK;
-import static net.osmand.plus.measurementtool.command.MeasurementModeCommand.MeasurementCommandType.*;
+import static net.osmand.plus.measurementtool.command.MeasurementModeCommand.MeasurementCommandType.APPROXIMATE_POINTS;
 
 public class MeasurementEditingContext {
 
@@ -249,8 +249,10 @@ public class MeasurementEditingContext {
 				Pair pair = new Pair<>(points.get(i), points.get(i + 1));
 				RoadSegmentData data = this.roadSegmentData.get(pair);
 				if (data == null) {
-					distance += MapUtils.getDistance(pair.first.getLatitude(), pair.first.getLongitude(),
-							pair.second.getLatitude(), pair.second.getLongitude());
+					if (appMode != MeasurementEditingContext.DEFAULT_APP_MODE || !pair.first.lastPoint || !pair.second.firstPoint) {
+						distance += MapUtils.getDistance(pair.first.getLatitude(), pair.first.getLongitude(),
+								pair.second.getLatitude(), pair.second.getLongitude());
+					}
 				} else {
 					distance += data.getDistance();
 				}
@@ -741,7 +743,7 @@ public class MeasurementEditingContext {
 					locations.add(l);
 				}
 				pair.second.setTrkPtIndex(locations.size() - 1);
-				if (i < size - 2) {
+				if (i < size - 2 && !locations.isEmpty()) {
 					locations.remove(locations.size() - 1);
 				}
 				route.addAll(data.segments);
diff --git a/OsmAnd/src/net/osmand/plus/measurementtool/MeasurementToolFragment.java b/OsmAnd/src/net/osmand/plus/measurementtool/MeasurementToolFragment.java
index 3bbc3214d1..d80eddb6b7 100644
--- a/OsmAnd/src/net/osmand/plus/measurementtool/MeasurementToolFragment.java
+++ b/OsmAnd/src/net/osmand/plus/measurementtool/MeasurementToolFragment.java
@@ -4,31 +4,26 @@ import android.annotation.SuppressLint;
 import android.app.Activity;
 import android.app.ProgressDialog;
 import android.content.Context;
-import android.content.DialogInterface;
 import android.content.Intent;
 import android.graphics.drawable.Drawable;
 import android.os.AsyncTask;
 import android.os.Build;
 import android.os.Bundle;
-import android.text.Editable;
-import android.text.TextWatcher;
 import android.util.TypedValue;
 import android.view.LayoutInflater;
 import android.view.View;
 import android.view.View.OnClickListener;
 import android.view.ViewGroup;
-import android.widget.EditText;
 import android.widget.ImageButton;
 import android.widget.ImageView;
 import android.widget.ProgressBar;
 import android.widget.TextView;
 import android.widget.Toast;
 
+import androidx.activity.OnBackPressedCallback;
 import androidx.annotation.DrawableRes;
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
-import androidx.appcompat.app.AlertDialog;
-import androidx.appcompat.widget.SwitchCompat;
 import androidx.core.content.ContextCompat;
 import androidx.core.widget.TextViewCompat;
 import androidx.fragment.app.Fragment;
@@ -46,7 +41,6 @@ import net.osmand.GPXUtilities.GPXFile;
 import net.osmand.GPXUtilities.Track;
 import net.osmand.GPXUtilities.TrkSegment;
 import net.osmand.GPXUtilities.WptPt;
-import net.osmand.IndexConstants;
 import net.osmand.LocationsHolder;
 import net.osmand.data.LatLon;
 import net.osmand.data.QuadRect;
@@ -100,13 +94,12 @@ import java.util.List;
 import java.util.Locale;
 
 import static net.osmand.IndexConstants.GPX_FILE_EXT;
+import static net.osmand.IndexConstants.GPX_INDEX_DIR;
 import static net.osmand.plus.measurementtool.MeasurementEditingContext.CalculationMode;
 import static net.osmand.plus.measurementtool.MeasurementEditingContext.SnapToRoadProgressListener;
 import static net.osmand.plus.measurementtool.SaveAsNewTrackBottomSheetDialogFragment.SaveAsNewTrackFragmentListener;
 import static net.osmand.plus.measurementtool.SelectFileBottomSheet.Mode.ADD_TO_TRACK;
-import static net.osmand.plus.measurementtool.SelectFileBottomSheet.Mode.OPEN_TRACK;
 import static net.osmand.plus.measurementtool.SelectFileBottomSheet.SelectFileListener;
-import static net.osmand.plus.measurementtool.StartPlanRouteBottomSheet.StartPlanRouteListener;
 import static net.osmand.plus.measurementtool.command.ClearPointsCommand.ClearCommandMode;
 import static net.osmand.plus.measurementtool.command.ClearPointsCommand.ClearCommandMode.AFTER;
 import static net.osmand.plus.measurementtool.command.ClearPointsCommand.ClearCommandMode.ALL;
@@ -117,6 +110,7 @@ public class MeasurementToolFragment extends BaseOsmAndFragment implements Route
 		SaveAsNewTrackFragmentListener {
 
 	public static final String TAG = MeasurementToolFragment.class.getSimpleName();
+	public static final String TAPS_DISABLED_KEY = "taps_disabled_key";
 
 	private RecyclerView pointsRv;
 	private String previousToolBarTitle = "";
@@ -156,7 +150,7 @@ public class MeasurementToolFragment extends BaseOsmAndFragment implements Route
 		LINE
 	}
 
-	private enum SaveAction {
+	private enum FinalSaveAction {
 		SHOW_SNACK_BAR_AND_CLOSE,
 		SHOW_TOAST,
 		SHOW_IS_SAVED_FRAGMENT
@@ -174,6 +168,20 @@ public class MeasurementToolFragment extends BaseOsmAndFragment implements Route
 		this.planRouteMode = planRouteMode;
 	}
 
+	private void setDirectionMode(boolean directionMode) {
+		this.directionMode = directionMode;
+	}
+
+	@Override
+	public void onCreate(@Nullable Bundle savedInstanceState) {
+		super.onCreate(savedInstanceState);
+		requireMyActivity().getOnBackPressedDispatcher().addCallback(this, new OnBackPressedCallback(true) {
+			public void handleOnBackPressed() {
+				quit(true);
+			}
+		});
+	}
+
 	@Nullable
 	@Override
 	public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container,
@@ -413,13 +421,24 @@ public class MeasurementToolFragment extends BaseOsmAndFragment implements Route
 		toolBarController.setOnBackButtonClickListener(new OnClickListener() {
 			@Override
 			public void onClick(View v) {
-				quit(false);
+				MapActivity mapActivity = getMapActivity();
+				if (mapActivity != null) {
+					GpxApproximationFragment gpxApproximationFragment = mapActivity.getGpxApproximationFragment();
+					SnapTrackWarningFragment snapTrackWarningFragment = mapActivity.getSnapTrackWarningBottomSheet();
+					if (gpxApproximationFragment != null) {
+						gpxApproximationFragment.dismissImmediate();
+					} else if (snapTrackWarningFragment != null) {
+						snapTrackWarningFragment.dismissImmediate();
+					} else {
+						quit(false);
+					}
+				}
 			}
 		});
 		toolBarController.setOnSaveViewClickListener(new OnClickListener() {
 			@Override
 			public void onClick(View v) {
-				saveChanges(SaveAction.SHOW_SNACK_BAR_AND_CLOSE);
+				saveChanges(FinalSaveAction.SHOW_SNACK_BAR_AND_CLOSE, false);
 			}
 		});
 		updateToolbar();
@@ -453,25 +472,16 @@ public class MeasurementToolFragment extends BaseOsmAndFragment implements Route
 		if (savedInstanceState == null) {
 			if (fileName != null) {
 				addNewGpxData(getGpxFile(fileName));
-			} else if (editingCtx.isNewData() && planRouteMode && initialPoint == null) {
-				StartPlanRouteBottomSheet.showInstance(mapActivity.getSupportFragmentManager(),
-						createStartPlanRouteListener());
 			} else if (!editingCtx.isNewData() && !editingCtx.hasRoutePoints() && !editingCtx.hasRoute() && editingCtx.getPointsCount() > 1) {
 				enterApproximationMode(mapActivity);
 			}
+		} else {
+			measurementLayer.setTapsDisabled(savedInstanceState.getBoolean(TAPS_DISABLED_KEY));
 		}
 
 		return view;
 	}
 
-	private void enterApproximationMode(MapActivity mapActivity) {
-		MeasurementToolLayer layer = getMeasurementLayer();
-		if (layer != null) {
-			layer.setTapsDisabled(true);
-			SnapTrackWarningBottomSheet.showInstance(mapActivity.getSupportFragmentManager(), this);
-		}
-	}
-
 	public boolean isInEditMode() {
 		return !planRouteMode && !editingCtx.isNewData() && !directionMode;
 	}
@@ -623,17 +633,19 @@ public class MeasurementToolFragment extends BaseOsmAndFragment implements Route
 		}
 	}
 
-	public void saveChanges(SaveAction saveAction) {
+	public void saveChanges(FinalSaveAction finalSaveAction, boolean showDialog) {
 		MapActivity mapActivity = getMapActivity();
 		if (mapActivity != null) {
 			if (editingCtx.getPointsCount() > 0) {
 				GpxData gpxData = editingCtx.getGpxData();
-				if (editingCtx.isNewData()) {
-					saveAsGpx(SaveType.ROUTE_POINT, saveAction);
-				} else if (isInEditMode() && gpxData.getActionType() == ActionType.EDIT_SEGMENT) {
-					openSaveAsNewTrackMenu(mapActivity);
+				if (editingCtx.isNewData() || (isInEditMode() && gpxData.getActionType() == ActionType.EDIT_SEGMENT)) {
+					if (showDialog) {
+						openSaveAsNewTrackMenu(mapActivity);
+					} else {
+						saveNewGpx(null, getSuggestedFileName(), true, false, finalSaveAction);
+					}
 				} else {
-					addToGpx(mapActivity, saveAction);
+					addToGpx(mapActivity, finalSaveAction);
 				}
 			} else {
 				Toast.makeText(mapActivity, getString(R.string.none_point_error), Toast.LENGTH_SHORT).show();
@@ -645,15 +657,15 @@ public class MeasurementToolFragment extends BaseOsmAndFragment implements Route
 	public void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
 		super.onActivityResult(requestCode, resultCode, data);
 		switch (requestCode) {
-			case SnapTrackWarningBottomSheet.REQUEST_CODE:
+			case SnapTrackWarningFragment.REQUEST_CODE:
 				switch (resultCode) {
-					case SnapTrackWarningBottomSheet.CANCEL_RESULT_CODE:
+					case SnapTrackWarningFragment.CANCEL_RESULT_CODE:
 						toolBarController.setSaveViewVisible(true);
 						directionMode = false;
 						exitApproximationMode();
 						updateToolbar();
 						break;
-					case SnapTrackWarningBottomSheet.CONTINUE_RESULT_CODE:
+					case SnapTrackWarningFragment.CONTINUE_RESULT_CODE:
 						MapActivity mapActivity = getMapActivity();
 						if (mapActivity != null) {
 							GpxApproximationFragment.showInstance(mapActivity.getSupportFragmentManager(),
@@ -748,7 +760,7 @@ public class MeasurementToolFragment extends BaseOsmAndFragment implements Route
 
 	@Override
 	public void saveChangesOnClick() {
-		saveChanges(SaveAction.SHOW_TOAST);
+		saveChanges(FinalSaveAction.SHOW_TOAST, true);
 	}
 
 	@Override
@@ -912,7 +924,7 @@ public class MeasurementToolFragment extends BaseOsmAndFragment implements Route
 
 	@Override
 	public void onChangeApplicationMode(ApplicationMode mode, RouteBetweenPointsDialogType dialogType,
-										RouteBetweenPointsDialogMode dialogMode) {
+	                                    RouteBetweenPointsDialogMode dialogMode) {
 		MeasurementToolLayer measurementLayer = getMeasurementLayer();
 		if (measurementLayer != null) {
 			ChangeRouteType changeRouteType = ChangeRouteType.NEXT_SEGMENT;
@@ -939,45 +951,13 @@ public class MeasurementToolFragment extends BaseOsmAndFragment implements Route
 		}
 	}
 
-	private StartPlanRouteListener createStartPlanRouteListener() {
-		return new StartPlanRouteListener() {
-			@Override
-			public void openExistingTrackOnClick() {
-				MapActivity mapActivity = getMapActivity();
-				if (mapActivity != null) {
-					SelectFileBottomSheet.showInstance(mapActivity.getSupportFragmentManager(),
-							createSelectFileListener(), OPEN_TRACK);
-				}
-			}
-
-			@Override
-			public void openLastEditTrackOnClick(String gpxFileName) {
-				addNewGpxData(getGpxFile(gpxFileName));
-			}
-
-			@Override
-			public void dismissButtonOnClick() {
-				quit(true);
-			}
-		};
-	}
-
-	private SelectFileListener createSelectFileListener() {
-		return new SelectFileListener() {
-			@Override
-			public void selectFileOnCLick(String gpxFileName) {
-				addNewGpxData(getGpxFile(gpxFileName));
-			}
-
-			@Override
-			public void dismissButtonOnClick() {
-				MapActivity mapActivity = getMapActivity();
-				if (mapActivity != null) {
-					StartPlanRouteBottomSheet.showInstance(mapActivity.getSupportFragmentManager(),
-							createStartPlanRouteListener());
-				}
-			}
-		};
+	@Override
+	public void onSaveInstanceState(@NonNull Bundle outState) {
+		super.onSaveInstanceState(outState);
+		MeasurementToolLayer measurementLayer = getMeasurementLayer();
+		if (measurementLayer != null) {
+			outState.putBoolean(TAPS_DISABLED_KEY, measurementLayer.isTapsDisabled());
+		}
 	}
 
 	private GPXFile getGpxFile(String gpxFileName) {
@@ -988,8 +968,7 @@ public class MeasurementToolFragment extends BaseOsmAndFragment implements Route
 			if (selectedGpxFile != null) {
 				gpxFile = selectedGpxFile.getGpxFile();
 			} else {
-				gpxFile = GPXUtilities.loadGPXFile(new File(
-						getMyApplication().getAppPath(IndexConstants.GPX_INDEX_DIR), gpxFileName));
+				gpxFile = GPXUtilities.loadGPXFile(new File(app.getAppPath(GPX_INDEX_DIR), gpxFileName));
 			}
 
 		}
@@ -1012,7 +991,7 @@ public class MeasurementToolFragment extends BaseOsmAndFragment implements Route
 							.getSelectedFileByPath(gpxFile.path);
 					boolean showOnMap = selectedGpxFile != null;
 					saveExistingGpx(gpxFile, showOnMap, ActionType.ADD_SEGMENT,
-							editingCtx.hasRoute() ? SaveType.ROUTE_POINT : SaveType.LINE, SaveAction.SHOW_TOAST);
+							editingCtx.hasRoute() ? SaveType.ROUTE_POINT : SaveType.LINE, FinalSaveAction.SHOW_TOAST);
 				}
 			}
 
@@ -1050,13 +1029,21 @@ public class MeasurementToolFragment extends BaseOsmAndFragment implements Route
 
 	@Override
 	public void onSaveAsNewTrack(String folderName, String fileName, boolean showOnMap, boolean simplifiedTrack) {
-		File dir = getMyApplication().getAppPath(IndexConstants.GPX_INDEX_DIR);
-		if (folderName != null) {
-			dir = new File(dir, folderName);
+		saveNewGpx(folderName, fileName, showOnMap, simplifiedTrack, FinalSaveAction.SHOW_IS_SAVED_FRAGMENT);
+	}
+
+	private void saveNewGpx(String folderName, String fileName, boolean showOnMap, boolean simplifiedTrack,
+	                        FinalSaveAction finalSaveAction) {
+		OsmandApplication app = getMyApplication();
+		if (app != null) {
+			File dir = getMyApplication().getAppPath(GPX_INDEX_DIR);
+			if (folderName != null) {
+				dir = new File(dir, folderName);
+			}
+			fileName += GPX_FILE_EXT;
+			SaveType saveType = simplifiedTrack ? SaveType.LINE : SaveType.ROUTE_POINT;
+			saveNewGpx(dir, fileName, showOnMap, saveType, finalSaveAction);
 		}
-		fileName = fileName + GPX_FILE_EXT;
-		SaveType saveType = simplifiedTrack ? SaveType.LINE : SaveType.ROUTE_POINT;
-		saveNewGpx(dir, fileName, showOnMap, saveType, SaveAction.SHOW_IS_SAVED_FRAGMENT);
 	}
 
 	private MeasurementAdapterListener createMeasurementAdapterListener(final ItemTouchHelper touchHelper) {
@@ -1132,10 +1119,14 @@ public class MeasurementToolFragment extends BaseOsmAndFragment implements Route
 		final ApplicationMode appMode = editingCtx.getAppMode();
 		if (mapActivity != null) {
 			Drawable icon;
-			if (appMode == MeasurementEditingContext.DEFAULT_APP_MODE) {
-				icon = getActiveIcon(R.drawable.ic_action_split_interval);
+			if (editingCtx.isTrackSnappedToRoad() || editingCtx.isNewData()) {
+				if (appMode == MeasurementEditingContext.DEFAULT_APP_MODE) {
+					icon = getActiveIcon(R.drawable.ic_action_split_interval);
+				} else {
+					icon = getIcon(appMode.getIconRes(), appMode.getIconColorInfo().getColor(nightMode));
+				}
 			} else {
-				icon = getIcon(appMode.getIconRes(), appMode.getIconColorInfo().getColor(nightMode));
+				icon = getContentIcon(R.drawable.ic_action_help);
 			}
 			ImageButton snapToRoadBtn = (ImageButton) mapActivity.findViewById(R.id.snap_to_road_image_button);
 			snapToRoadBtn.setImageDrawable(icon);
@@ -1183,7 +1174,7 @@ public class MeasurementToolFragment extends BaseOsmAndFragment implements Route
 		if (mapActivity != null) {
 			if (editingCtx.getPointsCount() > 0) {
 				SaveAsNewTrackBottomSheetDialogFragment.showInstance(mapActivity.getSupportFragmentManager(),
-						this, getSuggestedFileName());
+						this, "", getSuggestedFileName(), true, true);
 			} else {
 				Toast.makeText(mapActivity, getString(R.string.none_point_error), Toast.LENGTH_SHORT).show();
 			}
@@ -1450,7 +1441,7 @@ public class MeasurementToolFragment extends BaseOsmAndFragment implements Route
 		}
 	}
 
-	private void addToGpx(MapActivity mapActivity, SaveAction saveAction) {
+	private void addToGpx(MapActivity mapActivity, FinalSaveAction finalSaveAction) {
 		GpxData gpxData = editingCtx.getGpxData();
 		GPXFile gpx = gpxData != null ? gpxData.getGpxFile() : null;
 		if (gpx != null) {
@@ -1458,84 +1449,7 @@ public class MeasurementToolFragment extends BaseOsmAndFragment implements Route
 					mapActivity.getMyApplication().getSelectedGpxHelper().getSelectedFileByPath(gpx.path);
 			boolean showOnMap = selectedGpxFile != null;
 			saveExistingGpx(gpx, showOnMap, gpxData.getActionType(),
-					editingCtx.hasRoute() ? SaveType.ROUTE_POINT : SaveType.LINE, saveAction);
-		}
-	}
-
-	private void saveAsGpx(final SaveType saveType, final SaveAction saveAction) {
-		MapActivity mapActivity = getMapActivity();
-		if (mapActivity != null) {
-			final File dir = mapActivity.getMyApplication().getAppPath(IndexConstants.GPX_INDEX_DIR);
-			final View view = UiUtilities.getInflater(mapActivity, nightMode).inflate(R.layout.save_gpx_dialog, null);
-			final EditText nameEt = (EditText) view.findViewById(R.id.gpx_name_et);
-			final TextView warningTextView = (TextView) view.findViewById(R.id.file_exists_text_view);
-			final View buttonView = view.findViewById(R.id.button_view);
-			final SwitchCompat showOnMapToggle = (SwitchCompat) view.findViewById(R.id.toggle_show_on_map);
-			UiUtilities.setupCompoundButton(showOnMapToggle, nightMode, UiUtilities.CompoundButtonType.GLOBAL);
-			buttonView.setOnClickListener(new OnClickListener() {
-				@Override
-				public void onClick(View v) {
-					showOnMapToggle.setChecked(!showOnMapToggle.isChecked());
-				}
-			});
-			showOnMapToggle.setChecked(true);
-
-			String displayedName = getSuggestedFileName();
-			nameEt.setText(displayedName);
-			nameEt.setSelection(displayedName.length());
-			final boolean[] textChanged = new boolean[1];
-
-			AlertDialog.Builder builder = new AlertDialog.Builder(UiUtilities.getThemedContext(mapActivity, nightMode))
-					.setTitle(R.string.enter_gpx_name)
-					.setView(view)
-					.setPositiveButton(R.string.shared_string_save, new DialogInterface.OnClickListener() {
-						@Override
-						public void onClick(DialogInterface dialog, int which) {
-							final String name = nameEt.getText().toString();
-							String fileName = name + GPX_FILE_EXT;
-							if (textChanged[0]) {
-								File fout = new File(dir, fileName);
-								int ind = 1;
-								while (fout.exists()) {
-									fileName = name + "_" + (++ind) + GPX_FILE_EXT;
-									fout = new File(dir, fileName);
-								}
-							}
-							saveNewGpx(dir, fileName, showOnMapToggle.isChecked(), saveType, saveAction);
-						}
-					})
-					.setNegativeButton(R.string.shared_string_cancel, null);
-			final AlertDialog dialog = builder.create();
-			dialog.show();
-
-			nameEt.addTextChangedListener(new TextWatcher() {
-				@Override
-				public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {
-
-				}
-
-				@Override
-				public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
-
-				}
-
-				@Override
-				public void afterTextChanged(Editable editable) {
-					if (new File(dir, editable.toString() + GPX_FILE_EXT).exists()) {
-						warningTextView.setVisibility(View.VISIBLE);
-						warningTextView.setText(R.string.file_with_name_already_exists);
-						dialog.getButton(AlertDialog.BUTTON_POSITIVE).setEnabled(true);
-					} else if (editable.toString().trim().isEmpty()) {
-						warningTextView.setVisibility(View.VISIBLE);
-						warningTextView.setText(R.string.enter_the_file_name);
-						dialog.getButton(AlertDialog.BUTTON_POSITIVE).setEnabled(false);
-					} else {
-						warningTextView.setVisibility(View.INVISIBLE);
-						dialog.getButton(AlertDialog.BUTTON_POSITIVE).setEnabled(true);
-					}
-					textChanged[0] = true;
-				}
-			});
+					editingCtx.hasRoute() ? SaveType.ROUTE_POINT : SaveType.LINE, finalSaveAction);
 		}
 	}
 
@@ -1543,31 +1457,21 @@ public class MeasurementToolFragment extends BaseOsmAndFragment implements Route
 		GpxData gpxData = editingCtx.getGpxData();
 		String displayedName;
 		if (gpxData == null) {
-			final String suggestedName = new SimpleDateFormat("EEE dd MMM yyyy", Locale.US).format(new Date());
-			displayedName = suggestedName;
-			OsmandApplication app = getMyApplication();
-			if (app != null) {
-				File dir = app.getAppPath(IndexConstants.GPX_INDEX_DIR);
-				File fout = new File(dir, suggestedName + GPX_FILE_EXT);
-				int ind = 0;
-				while (fout.exists()) {
-					displayedName = suggestedName + "_" + (++ind);
-					fout = new File(dir, displayedName + GPX_FILE_EXT);
-				}
-			}
+			String suggestedName = new SimpleDateFormat("EEE dd MMM yyyy", Locale.US).format(new Date());
+			displayedName = FileUtils.createUniqueFileName(requireMyApplication(), suggestedName, GPX_INDEX_DIR, GPX_FILE_EXT);
 		} else {
 			displayedName = AndroidUtils.trimExtension(new File(gpxData.getGpxFile().path).getName());
 		}
 		return displayedName;
 	}
 
-	private void saveNewGpx(File dir, String fileName, boolean showOnMap, SaveType saveType, SaveAction saveAction) {
-		saveGpx(dir, fileName, showOnMap, null, null, saveType, saveAction);
+	private void saveNewGpx(File dir, String fileName, boolean showOnMap, SaveType saveType, FinalSaveAction finalSaveAction) {
+		saveGpx(dir, fileName, showOnMap, null, null, saveType, finalSaveAction);
 	}
 
 	private void saveExistingGpx(GPXFile gpx, boolean showOnMap, ActionType actionType, SaveType saveType,
-	                             SaveAction saveAction) {
-		saveGpx(null, null, showOnMap, gpx, actionType, saveType, saveAction);
+	                             FinalSaveAction finalSaveAction) {
+		saveGpx(null, null, showOnMap, gpx, actionType, saveType, finalSaveAction);
 	}
 
 	@SuppressLint("StaticFieldLeak")
@@ -1577,7 +1481,7 @@ public class MeasurementToolFragment extends BaseOsmAndFragment implements Route
 	                     final GPXFile gpxFile,
 	                     final ActionType actionType,
 	                     final SaveType saveType,
-	                     final SaveAction saveAction) {
+	                     final FinalSaveAction finalSaveAction) {
 
 		new AsyncTask() {
 
@@ -1748,25 +1652,13 @@ public class MeasurementToolFragment extends BaseOsmAndFragment implements Route
 					if (isInEditMode()) {
 						dismiss(mapActivity);
 					} else {
-						switch (saveAction) {
+						switch (finalSaveAction) {
 							case SHOW_SNACK_BAR_AND_CLOSE:
 								final WeakReference mapActivityRef = new WeakReference<>(mapActivity);
 								snackbar = Snackbar.make(mapActivity.getLayout(),
 										MessageFormat.format(getString(R.string.gpx_saved_sucessfully), toSave.getName()),
 										Snackbar.LENGTH_LONG)
-										.setAction(R.string.shared_string_rename, new OnClickListener() {
-											@Override
-											public void onClick(View view) {
-												MapActivity mapActivity = mapActivityRef.get();
-												if (AndroidUtils.isActivityNotDestroyed(mapActivity)) {
-													FileUtils.renameFile(mapActivity, toSave, new FileUtils.RenameCallback() {
-														@Override
-														public void renamedTo(File file) {
-														}
-													});
-												}
-											}
-										});
+										.setAction(R.string.shared_string_rename, getRenameListener(mapActivityRef));
 								snackbar.getView().findViewById(com.google.android.material.R.id.snackbar_action)
 										.setAllCaps(false);
 								UiUtilities.setupSnackbar(snackbar, nightMode);
@@ -1790,6 +1682,22 @@ public class MeasurementToolFragment extends BaseOsmAndFragment implements Route
 					Toast.makeText(mapActivity, warning.getMessage(), Toast.LENGTH_LONG).show();
 				}
 			}
+
+			private OnClickListener getRenameListener(final WeakReference mapActivityRef) {
+				return new OnClickListener() {
+					@Override
+					public void onClick(View view) {
+						MapActivity mapActivity = mapActivityRef.get();
+						String parentFolder = toSave.getParentFile().getName();
+						if (GPX_INDEX_DIR.equals(parentFolder + File.separator)) {
+							parentFolder = null;
+						}
+						SaveAsNewTrackBottomSheetDialogFragment.showInstance(
+								mapActivity.getSupportFragmentManager(), null, parentFolder,
+								AndroidUtils.trimExtension(toSave.getName()), false, showOnMap);
+					}
+				};
+			}
 		}.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
 	}
 
@@ -1985,10 +1893,19 @@ public class MeasurementToolFragment extends BaseOsmAndFragment implements Route
 		return showFragment(fragment, fragmentManager);
 	}
 
-	public static boolean showInstance(FragmentManager fragmentManager, MeasurementEditingContext editingCtx, boolean planRoute) {
+	public static boolean showInstance(FragmentManager fragmentManager, GPXFile gpxFile) {
+		MeasurementToolFragment fragment = new MeasurementToolFragment();
+		fragment.addNewGpxData(gpxFile);
+		fragment.setPlanRouteMode(true);
+		return showFragment(fragment, fragmentManager);
+	}
+
+	public static boolean showInstance(FragmentManager fragmentManager, MeasurementEditingContext editingCtx,
+	                                   boolean planRoute, boolean directionMode) {
 		MeasurementToolFragment fragment = new MeasurementToolFragment();
 		fragment.setEditingCtx(editingCtx);
 		fragment.setPlanRouteMode(planRoute);
+		fragment.setDirectionMode(directionMode);
 		return showFragment(fragment, fragmentManager);
 	}
 
@@ -2050,8 +1967,7 @@ public class MeasurementToolFragment extends BaseOsmAndFragment implements Route
 			layoutParams.leftMargin = ctx.getResources().getDimensionPixelSize(R.dimen.context_menu_padding_margin_large);
 			layoutParams.rightMargin = ctx.getResources().getDimensionPixelSize(R.dimen.context_menu_padding_margin_large);
 			int paddingH = ctx.getResources().getDimensionPixelSize(R.dimen.context_menu_padding_margin_large);
-			int paddingV = ctx.getResources().getDimensionPixelSize(R.dimen.context_menu_padding_margin_small);
-			done.setPadding(paddingH, paddingV, paddingH, paddingV);
+			done.setPadding(paddingH, done.getPaddingTop(), paddingH, done.getPaddingBottom());
 			AndroidUtils.setBackground(ctx, done, nightMode, R.drawable.purchase_dialog_outline_btn_bg_light,
 					R.drawable.purchase_dialog_outline_btn_bg_dark);
 		}
@@ -2112,11 +2028,28 @@ public class MeasurementToolFragment extends BaseOsmAndFragment implements Route
 		updateToolbar();
 	}
 
+	private void enterApproximationMode(MapActivity mapActivity) {
+		MeasurementToolLayer layer = getMeasurementLayer();
+		if (layer != null) {
+			FragmentManager manager = mapActivity.getSupportFragmentManager();
+			manager.beginTransaction()
+					.hide(this).commit();
+			layer.setTapsDisabled(true);
+			SnapTrackWarningFragment.showInstance(mapActivity.getSupportFragmentManager(), this);
+			AndroidUiHelper.setVisibility(mapActivity, View.GONE, R.id.map_ruler_container);
+		}
+	}
+
 	private void exitApproximationMode() {
 		editingCtx.setInApproximationMode(false);
 		MeasurementToolLayer layer = getMeasurementLayer();
-		if (layer != null) {
+		MapActivity mapActivity = getMapActivity();
+		if (layer != null && mapActivity != null) {
+			FragmentManager manager = mapActivity.getSupportFragmentManager();
+			manager.beginTransaction()
+					.show(this).commit();
 			layer.setTapsDisabled(false);
+			AndroidUiHelper.setVisibility(mapActivity, View.VISIBLE, R.id.map_ruler_container);
 		}
 	}
 }
diff --git a/OsmAnd/src/net/osmand/plus/measurementtool/MeasurementToolLayer.java b/OsmAnd/src/net/osmand/plus/measurementtool/MeasurementToolLayer.java
index 63d10688dc..fdb8dc8887 100644
--- a/OsmAnd/src/net/osmand/plus/measurementtool/MeasurementToolLayer.java
+++ b/OsmAnd/src/net/osmand/plus/measurementtool/MeasurementToolLayer.java
@@ -107,6 +107,10 @@ public class MeasurementToolLayer extends OsmandMapLayer implements ContextMenuL
 		this.tapsDisabled = tapsDisabled;
 	}
 
+	public boolean isTapsDisabled() {
+		return tapsDisabled;
+	}
+
 	@Override
 	public boolean onSingleTap(PointF point, RotatedTileBox tileBox) {
 		if (inMeasurementMode && !tapsDisabled && editingCtx.getSelectedPointPosition() == -1) {
diff --git a/OsmAnd/src/net/osmand/plus/measurementtool/ProfileCard.java b/OsmAnd/src/net/osmand/plus/measurementtool/ProfileCard.java
index 98d180e48f..8fc3be3037 100644
--- a/OsmAnd/src/net/osmand/plus/measurementtool/ProfileCard.java
+++ b/OsmAnd/src/net/osmand/plus/measurementtool/ProfileCard.java
@@ -8,6 +8,8 @@ import android.widget.LinearLayout;
 import android.widget.RadioButton;
 import android.widget.TextView;
 
+import androidx.annotation.NonNull;
+
 import net.osmand.plus.R;
 import net.osmand.plus.UiUtilities;
 import net.osmand.plus.activities.MapActivity;
@@ -23,7 +25,7 @@ public class ProfileCard extends BaseCard {
 	private ApplicationMode selectedMode;
 	private ProfileCardListener listener;
 
-	public ProfileCard(MapActivity mapActivity, ApplicationMode selectedMode) {
+	public ProfileCard(@NonNull MapActivity mapActivity, @NonNull ApplicationMode selectedMode) {
 		super(mapActivity);
 		this.selectedMode = selectedMode;
 	}
@@ -75,7 +77,10 @@ public class ProfileCard extends BaseCard {
 	}
 
 	private void resetSelected(List modes) {
-		((RadioButton) view.findViewWithTag(selectedMode.getStringKey()).findViewById(R.id.compound_button)).setChecked(true);
+		View profileView = view.findViewWithTag(selectedMode.getStringKey());
+		if (profileView != null) {
+			((RadioButton) profileView.findViewById(R.id.compound_button)).setChecked(true);
+		}
 	}
 
 	private void addProfileView(LinearLayout container, View.OnClickListener onClickListener, Object tag,
diff --git a/OsmAnd/src/net/osmand/plus/measurementtool/RouteBetweenPointsBottomSheetDialogFragment.java b/OsmAnd/src/net/osmand/plus/measurementtool/RouteBetweenPointsBottomSheetDialogFragment.java
index f57cbd4e04..77f3909e62 100644
--- a/OsmAnd/src/net/osmand/plus/measurementtool/RouteBetweenPointsBottomSheetDialogFragment.java
+++ b/OsmAnd/src/net/osmand/plus/measurementtool/RouteBetweenPointsBottomSheetDialogFragment.java
@@ -13,11 +13,12 @@ import androidx.annotation.NonNull;
 import androidx.fragment.app.Fragment;
 import androidx.fragment.app.FragmentManager;
 
+import net.osmand.AndroidUtils;
 import net.osmand.PlatformUtil;
 import net.osmand.plus.OsmandApplication;
 import net.osmand.plus.R;
 import net.osmand.plus.UiUtilities;
-import net.osmand.plus.base.MenuBottomSheetDialogFragment;
+import net.osmand.plus.base.BottomSheetBehaviourDialogFragment;
 import net.osmand.plus.base.bottomsheetmenu.BaseBottomSheetItem;
 import net.osmand.plus.settings.backend.ApplicationMode;
 
@@ -29,8 +30,9 @@ import java.util.List;
 import static net.osmand.plus.UiUtilities.CustomRadioButtonType.LEFT;
 import static net.osmand.plus.UiUtilities.CustomRadioButtonType.RIGHT;
 import static net.osmand.plus.measurementtool.MeasurementEditingContext.DEFAULT_APP_MODE;
+import static net.osmand.plus.measurementtool.SelectFileBottomSheet.BOTTOM_SHEET_HEIGHT_DP;
 
-public class RouteBetweenPointsBottomSheetDialogFragment extends MenuBottomSheetDialogFragment {
+public class RouteBetweenPointsBottomSheetDialogFragment extends BottomSheetBehaviourDialogFragment {
 
 	private static final Log LOG = PlatformUtil.getLog(RouteBetweenPointsBottomSheetDialogFragment.class);
 	public static final String TAG = RouteBetweenPointsBottomSheetDialogFragment.class.getSimpleName();
@@ -93,9 +95,9 @@ public class RouteBetweenPointsBottomSheetDialogFragment extends MenuBottomSheet
 			case WHOLE_ROUTE_CALCULATION:
 				switch (dialogMode) {
 					case SINGLE:
-						return getString(R.string.rourte_between_points_next_segment_button_desc);
+						return getString(R.string.route_between_points_next_segment_button_desc);
 					case ALL:
-						return getString(R.string.rourte_between_points_whole_track_button_desc);
+						return getString(R.string.route_between_points_whole_track_button_desc);
 				}
 				break;
 			case NEXT_ROUTE_CALCULATION:
@@ -225,6 +227,11 @@ public class RouteBetweenPointsBottomSheetDialogFragment extends MenuBottomSheet
 		items.add(new BaseBottomSheetItem.Builder().setCustomView(mainView).create());
 	}
 
+	@Override
+	protected int getPeekHeight() {
+		return AndroidUtils.dpToPx(getContext(), BOTTOM_SHEET_HEIGHT_DP);
+	}
+
 	@Override
 	protected int getDismissButtonTextId() {
 		return R.string.shared_string_close;
diff --git a/OsmAnd/src/net/osmand/plus/measurementtool/SaveAsNewTrackBottomSheetDialogFragment.java b/OsmAnd/src/net/osmand/plus/measurementtool/SaveAsNewTrackBottomSheetDialogFragment.java
index d786417301..fb1badf2aa 100644
--- a/OsmAnd/src/net/osmand/plus/measurementtool/SaveAsNewTrackBottomSheetDialogFragment.java
+++ b/OsmAnd/src/net/osmand/plus/measurementtool/SaveAsNewTrackBottomSheetDialogFragment.java
@@ -2,11 +2,14 @@ package net.osmand.plus.measurementtool;
 
 import android.content.res.ColorStateList;
 import android.graphics.Color;
+import android.graphics.drawable.Drawable;
 import android.graphics.drawable.GradientDrawable;
 import android.os.Bundle;
 import android.text.Editable;
 import android.text.TextWatcher;
 import android.view.View;
+import android.widget.EditText;
+import android.widget.Toast;
 
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
@@ -19,6 +22,8 @@ import com.google.android.material.textfield.TextInputEditText;
 import com.google.android.material.textfield.TextInputLayout;
 
 import net.osmand.AndroidUtils;
+import net.osmand.GPXUtilities;
+import net.osmand.IndexConstants;
 import net.osmand.PlatformUtil;
 import net.osmand.plus.OsmandApplication;
 import net.osmand.plus.R;
@@ -33,6 +38,8 @@ import net.osmand.plus.measurementtool.adapter.FolderListAdapter;
 
 import org.apache.commons.logging.Log;
 
+import java.io.File;
+
 public class SaveAsNewTrackBottomSheetDialogFragment extends MenuBottomSheetDialogFragment {
 
 	public static final String TAG = SaveAsNewTrackBottomSheetDialogFragment.class.getSimpleName();
@@ -41,12 +48,19 @@ public class SaveAsNewTrackBottomSheetDialogFragment extends MenuBottomSheetDial
 	public static final String SIMPLIFIED_TRACK_KEY = "simplified_track_key";
 	public static final String FOLDER_NAME_KEY = "folder_name_key";
 	public static final String FILE_NAME_KEY = "file_name_key";
+	public static final String SOURCE_FILE_NAME_KEY = "source_file_name_key";
+	public static final String SOURCE_FOLDER_NAME_KEY = "source_folder_name_key";
+	public static final String SHOW_SIMPLIFIED_BUTTON_KEY = "show_simplified_button_key";
 
 	private boolean showOnMap;
 	private boolean simplifiedTrack;
 	private String fileName;
+	private String sourceFileName;
+	private String sourceFolderName;
 	private String folderName;
 	private boolean rightButtonEnabled = true;
+	private boolean showSimplifiedButton = true;
+	private TextInputLayout nameTextBox;
 
 	@Override
 	public void createMenuItems(Bundle savedInstanceState) {
@@ -59,13 +73,16 @@ public class SaveAsNewTrackBottomSheetDialogFragment extends MenuBottomSheetDial
 			simplifiedTrack = savedInstanceState.getBoolean(SIMPLIFIED_TRACK_KEY);
 			folderName = savedInstanceState.getString(FOLDER_NAME_KEY);
 			fileName = savedInstanceState.getString(FILE_NAME_KEY);
+			sourceFileName = savedInstanceState.getString(SOURCE_FILE_NAME_KEY);
+			sourceFolderName = savedInstanceState.getString(SOURCE_FOLDER_NAME_KEY);
+			showSimplifiedButton = savedInstanceState.getBoolean(SHOW_SIMPLIFIED_BUTTON_KEY);
 		}
 
-		items.add(new TitleItem(getString(R.string.shared_string_save_as_gpx)));
+		items.add(new TitleItem(getString(R.string.save_as_new_track)));
 
 		View editNameView = View.inflate(UiUtilities.getThemedContext(app, nightMode),
 				R.layout.track_name_edit_text, null);
-		final TextInputLayout nameTextBox = editNameView.findViewById(R.id.name_text_box);
+		nameTextBox = editNameView.findViewById(R.id.name_text_box);
 		nameTextBox.setBoxBackgroundColorResource(R.color.material_text_input_layout_bg);
 		nameTextBox.setHint(app.getString(R.string.ltr_or_rtl_combine_via_colon,
 				app.getString(R.string.shared_string_file_name), "").trim());
@@ -85,7 +102,7 @@ public class SaveAsNewTrackBottomSheetDialogFragment extends MenuBottomSheetDial
 
 			@Override
 			public void afterTextChanged(Editable s) {
-				checkEmptyName(s, nameTextBox);
+				checkEmptyName(s.toString());
 			}
 		});
 		BaseBottomSheetItem editFileName = new BaseBottomSheetItem.Builder()
@@ -113,46 +130,38 @@ public class SaveAsNewTrackBottomSheetDialogFragment extends MenuBottomSheetDial
 
 			items.add(new DividerSpaceItem(app, app.getResources().getDimensionPixelSize(R.dimen.dialog_content_margin)));
 		}
+
 		int activeColorRes = nightMode ? R.color.active_color_primary_dark : R.color.active_color_primary_light;
-		int backgroundColor = AndroidUtils.getColorFromAttr(UiUtilities.getThemedContext(app, nightMode),
-				R.attr.activity_background_color);
-		GradientDrawable background = (GradientDrawable) AppCompatResources.getDrawable(app,
-				R.drawable.bg_select_group_button_outline);
-		if (background != null) {
-			background = (GradientDrawable) background.mutate();
-			background.setStroke(0, Color.TRANSPARENT);
-			background.setColor(backgroundColor);
-		}
-		final BottomSheetItemWithCompoundButton[] simplifiedTrackItem = new BottomSheetItemWithCompoundButton[1];
-		simplifiedTrackItem[0] = (BottomSheetItemWithCompoundButton) new BottomSheetItemWithCompoundButton.Builder()
-				.setChecked(simplifiedTrack)
-				.setCompoundButtonColorId(activeColorRes)
-				.setDescription(getString(R.string.simplified_track_description))
-				.setBackground(background)
-				.setTitle(getString(R.string.simplified_track))
-				.setLayoutId(R.layout.bottom_sheet_item_with_switch_and_descr)
-				.setOnClickListener(new View.OnClickListener() {
-					@Override
-					public void onClick(View v) {
-						simplifiedTrack = !simplifiedTrack;
-						simplifiedTrackItem[0].setChecked(simplifiedTrack);
-					}
-				})
-				.create();
-		items.add(simplifiedTrackItem[0]);
 
-		items.add(new DividerSpaceItem(app, app.getResources().getDimensionPixelSize(R.dimen.content_padding)));
+		if (showSimplifiedButton) {
+			final BottomSheetItemWithCompoundButton[] simplifiedTrackItem = new BottomSheetItemWithCompoundButton[1];
+			simplifiedTrackItem[0] = (BottomSheetItemWithCompoundButton) new BottomSheetItemWithCompoundButton.Builder()
+					.setChecked(simplifiedTrack)
+					.setCompoundButtonColorId(activeColorRes)
+					.setDescription(getSimplifiedTrackDescription())
+					.setBackground(getBackground(simplifiedTrack))
+					.setTitle(getString(R.string.simplified_track))
+					.setLayoutId(R.layout.bottom_sheet_item_with_switch_and_descr)
+					.setOnClickListener(new View.OnClickListener() {
+						@Override
+						public void onClick(View v) {
+							simplifiedTrack = !simplifiedTrack;
+							simplifiedTrackItem[0].setChecked(simplifiedTrack);
+							AndroidUtils.setBackground(simplifiedTrackItem[0].getView(), getBackground(simplifiedTrack));
+							simplifiedTrackItem[0].setDescription(getSimplifiedTrackDescription());
+						}
+					})
+					.create();
+			items.add(simplifiedTrackItem[0]);
 
-		background = (GradientDrawable) AppCompatResources.getDrawable(app, R.drawable.bg_select_group_button_outline);
-		if (background != null) {
-			background = (GradientDrawable) background.mutate();
-			background.setStroke(app.getResources().getDimensionPixelSize(R.dimen.map_button_stroke), backgroundColor);
+			items.add(new DividerSpaceItem(app, app.getResources().getDimensionPixelSize(R.dimen.content_padding)));
 		}
+
 		final BottomSheetItemWithCompoundButton[] showOnMapItem = new BottomSheetItemWithCompoundButton[1];
 		showOnMapItem[0] = (BottomSheetItemWithCompoundButton) new BottomSheetItemWithCompoundButton.Builder()
 				.setCompoundButtonColorId(activeColorRes)
 				.setChecked(showOnMap)
-				.setBackground(background)
+				.setBackground(getBackground(showOnMap))
 				.setTitle(getString(R.string.shared_string_show_on_map))
 				.setLayoutId(R.layout.bottom_sheet_item_with_switch_and_descr)
 				.setOnClickListener(new View.OnClickListener() {
@@ -160,6 +169,7 @@ public class SaveAsNewTrackBottomSheetDialogFragment extends MenuBottomSheetDial
 					public void onClick(View v) {
 						showOnMap = !showOnMap;
 						showOnMapItem[0].setChecked(showOnMap);
+						AndroidUtils.setBackground(showOnMapItem[0].getView(), getBackground(showOnMap));
 					}
 				})
 				.create();
@@ -168,11 +178,40 @@ public class SaveAsNewTrackBottomSheetDialogFragment extends MenuBottomSheetDial
 		items.add(new DividerSpaceItem(app, contentPaddingSmall));
 	}
 
+	private String getSimplifiedTrackDescription() {
+		return simplifiedTrack ? getString(R.string.simplified_track_description) : "";
+	}
+
+	private Drawable getBackground(boolean checked) {
+		OsmandApplication app = getMyApplication();
+		if (app != null) {
+			GradientDrawable background = (GradientDrawable) AppCompatResources.getDrawable(app,
+					R.drawable.bg_select_group_button_outline);
+			if (background != null) {
+				int backgroundColor = AndroidUtils.getColorFromAttr(UiUtilities.getThemedContext(app, nightMode),
+						R.attr.activity_background_color);
+				background = (GradientDrawable) background.mutate();
+				if (checked) {
+					background.setStroke(0, Color.TRANSPARENT);
+					background.setColor(backgroundColor);
+				} else {
+					background.setStroke(app.getResources().getDimensionPixelSize(R.dimen.map_button_stroke), backgroundColor);
+				}
+			}
+			return background;
+		}
+		return null;
+	}
+
 	private FolderListAdapter.FolderListAdapterListener createFolderSelectListener() {
 		return new FolderListAdapter.FolderListAdapterListener() {
 			@Override
 			public void onItemSelected(String item) {
 				folderName = item;
+				EditText editText = nameTextBox.getEditText();
+				if (editText != null) {
+					checkEmptyName(editText.getText().toString());
+				}
 			}
 		};
 	}
@@ -183,15 +222,23 @@ public class SaveAsNewTrackBottomSheetDialogFragment extends MenuBottomSheetDial
 		outState.putBoolean(SIMPLIFIED_TRACK_KEY, simplifiedTrack);
 		outState.putString(FOLDER_NAME_KEY, folderName);
 		outState.putString(FILE_NAME_KEY, fileName);
+		outState.putString(SOURCE_FILE_NAME_KEY, sourceFileName);
+		outState.putString(SOURCE_FOLDER_NAME_KEY, sourceFolderName);
+		outState.putBoolean(SHOW_SIMPLIFIED_BUTTON_KEY, showSimplifiedButton);
 		super.onSaveInstanceState(outState);
 	}
 
-	public static void showInstance(@NonNull FragmentManager fm, @Nullable Fragment targetFragment, String fileName) {
+	public static void showInstance(@NonNull FragmentManager fm, @Nullable Fragment targetFragment, String folderName,
+	                                String fileName, boolean showSimplifiedButton, boolean showOnMap) {
 		try {
 			if (!fm.isStateSaved()) {
 				SaveAsNewTrackBottomSheetDialogFragment fragment = new SaveAsNewTrackBottomSheetDialogFragment();
 				fragment.setTargetFragment(targetFragment, 0);
 				fragment.fileName = fileName;
+				fragment.sourceFileName = fileName;
+				fragment.sourceFolderName = folderName;
+				fragment.showSimplifiedButton = showSimplifiedButton;
+				fragment.showOnMap = showOnMap;
 				fragment.show(fm, TAG);
 			}
 		} catch (RuntimeException e) {
@@ -210,29 +257,76 @@ public class SaveAsNewTrackBottomSheetDialogFragment extends MenuBottomSheetDial
 		if (targetFragment instanceof SaveAsNewTrackFragmentListener) {
 			((SaveAsNewTrackFragmentListener) targetFragment).onSaveAsNewTrack(folderName, fileName, showOnMap,
 					simplifiedTrack);
+		} else {
+			renameFile();
 		}
 		dismiss();
 	}
 
+	private void renameFile() {
+		OsmandApplication app = getMyApplication();
+		if (app != null) {
+			File source = getFile(app, sourceFolderName, sourceFileName);
+			File dest = getFile(app, folderName, fileName);
+			if (!source.equals(dest)) {
+				if (dest.exists()) {
+					Toast.makeText(app, R.string.file_with_name_already_exists, Toast.LENGTH_LONG).show();
+				} else {
+					if (source.renameTo(dest)) {
+						app.getGpxDbHelper().rename(source, dest);
+					} else {
+						Toast.makeText(app, R.string.file_can_not_be_moved, Toast.LENGTH_LONG).show();
+					}
+				}
+			}
+			GPXUtilities.GPXFile gpxFile = GPXUtilities.loadGPXFile(dest);
+			if (gpxFile.error != null) {
+				return;
+			}
+			app.getSelectedGpxHelper().selectGpxFile(gpxFile, showOnMap, false);
+		}
+	}
+
+	private File getFile(OsmandApplication app, String folderName, String fileName) {
+		File dir = app.getAppPath(IndexConstants.GPX_INDEX_DIR);
+		File source = dir;
+		if (folderName != null) {
+			source = new File(dir, folderName);
+		}
+		source = new File(source, fileName + IndexConstants.GPX_FILE_EXT);
+		return source;
+	}
+
 	@Override
 	protected boolean isRightBottomButtonEnabled() {
 		return rightButtonEnabled;
 	}
 
-	private void checkEmptyName(Editable name, TextInputLayout nameCaption) {
-		String text = name.toString().trim();
+	private void checkEmptyName(String name) {
+		rightButtonEnabled = false;
+		String text = name.trim();
 		if (text.isEmpty()) {
-			nameCaption.setError(getString(R.string.empty_filename));
-			rightButtonEnabled = false;
+			nameTextBox.setError(getString(R.string.empty_filename));
+		} else if (isFileExist(name)) {
+			nameTextBox.setError(getString(R.string.file_with_name_already_exist));
 		} else {
-			nameCaption.setError(null);
+			nameTextBox.setError(null);
 			fileName = text;
 			rightButtonEnabled = true;
 		}
 		updateBottomButtons();
 	}
 
-	interface SaveAsNewTrackFragmentListener {
+	private boolean isFileExist(String name) {
+		OsmandApplication app = getMyApplication();
+		if (app != null) {
+			File file = getFile(app, folderName, name);
+			return file.exists();
+		}
+		return false;
+	}
+
+	public interface SaveAsNewTrackFragmentListener {
 
 		void onSaveAsNewTrack(String folderName, String fileName, boolean showOnMap, boolean simplifiedTrack);
 
diff --git a/OsmAnd/src/net/osmand/plus/measurementtool/SelectFileBottomSheet.java b/OsmAnd/src/net/osmand/plus/measurementtool/SelectFileBottomSheet.java
index d9619de9d1..c82bc1e9d5 100644
--- a/OsmAnd/src/net/osmand/plus/measurementtool/SelectFileBottomSheet.java
+++ b/OsmAnd/src/net/osmand/plus/measurementtool/SelectFileBottomSheet.java
@@ -15,7 +15,7 @@ import net.osmand.AndroidUtils;
 import net.osmand.IndexConstants;
 import net.osmand.plus.OsmandApplication;
 import net.osmand.plus.R;
-import net.osmand.plus.base.MenuBottomSheetDialogFragment;
+import net.osmand.plus.base.BottomSheetBehaviourDialogFragment;
 import net.osmand.plus.base.bottomsheetmenu.BaseBottomSheetItem;
 import net.osmand.plus.helpers.GpxTrackAdapter;
 import net.osmand.plus.helpers.GpxTrackAdapter.OnItemClickListener;
@@ -32,11 +32,11 @@ import java.util.Map;
 import static net.osmand.plus.helpers.GpxUiHelper.getSortedGPXFilesInfo;
 import static net.osmand.util.Algorithms.collectDirs;
 
-public class SelectFileBottomSheet extends MenuBottomSheetDialogFragment {
+public class SelectFileBottomSheet extends BottomSheetBehaviourDialogFragment {
 
 	enum Mode {
 		OPEN_TRACK(R.string.plan_route_open_existing_track, R.string.plan_route_select_track_file_for_open),
-		ADD_TO_TRACK(R.string.add_to_a_track, R.string.rourte_between_points_add_track_desc);
+		ADD_TO_TRACK(R.string.add_to_a_track, R.string.route_between_points_add_track_desc);
 
 		int title;
 		int description;
@@ -120,12 +120,13 @@ public class SelectFileBottomSheet extends MenuBottomSheetDialogFragment {
 		adapter.setAdapterListener(new OnItemClickListener() {
 			@Override
 			public void onItemClick(int position) {
-				if (position != RecyclerView.NO_POSITION && position < allGpxList.size()) {
+				List gpxList = adapter.getGpxInfoList();
+				if (position != RecyclerView.NO_POSITION && position < gpxList.size()) {
 					String fileName;
 					if (isShowCurrentGpx() && position == 0) {
 						fileName = null;
 					} else {
-						fileName = allGpxList.get(position).getFileName();
+						fileName = gpxList.get(position).getFileName();
 					}
 					if (listener != null) {
 						listener.selectFileOnCLick(fileName);
@@ -173,8 +174,8 @@ public class SelectFileBottomSheet extends MenuBottomSheetDialogFragment {
 	}
 
 	@Override
-	protected int getCustomHeight() {
-		return AndroidUtils.dpToPx(mainView.getContext(), BOTTOM_SHEET_HEIGHT_DP);
+	protected int getPeekHeight() {
+		return AndroidUtils.dpToPx(getContext(), BOTTOM_SHEET_HEIGHT_DP);
 	}
 
 	public static void showInstance(FragmentManager fragmentManager, SelectFileListener listener, Mode mode) {
diff --git a/OsmAnd/src/net/osmand/plus/measurementtool/SnapTrackWarningBottomSheet.java b/OsmAnd/src/net/osmand/plus/measurementtool/SnapTrackWarningBottomSheet.java
deleted file mode 100644
index 42d051bb8c..0000000000
--- a/OsmAnd/src/net/osmand/plus/measurementtool/SnapTrackWarningBottomSheet.java
+++ /dev/null
@@ -1,95 +0,0 @@
-package net.osmand.plus.measurementtool;
-
-import android.app.Activity;
-import android.os.Bundle;
-import android.view.View;
-
-import androidx.fragment.app.Fragment;
-import androidx.fragment.app.FragmentManager;
-
-import net.osmand.PlatformUtil;
-import net.osmand.plus.R;
-import net.osmand.plus.activities.MapActivity;
-import net.osmand.plus.base.MenuBottomSheetDialogFragment;
-import net.osmand.plus.base.bottomsheetmenu.BaseBottomSheetItem;
-import net.osmand.plus.base.bottomsheetmenu.BottomSheetItemWithDescription;
-import net.osmand.plus.base.bottomsheetmenu.simpleitems.DividerSpaceItem;
-import net.osmand.plus.helpers.GpxTrackAdapter;
-
-import org.apache.commons.logging.Log;
-
-public class SnapTrackWarningBottomSheet extends MenuBottomSheetDialogFragment {
-
-	public static final int REQUEST_CODE = 1000;
-	public static final int CANCEL_RESULT_CODE = 2;
-	public static final int CONTINUE_RESULT_CODE = 3;
-
-	public static final String TAG = SnapTrackWarningBottomSheet.class.getSimpleName();
-	private static final Log LOG = PlatformUtil.getLog(SnapTrackWarningBottomSheet.class);
-
-	protected View mainView;
-	protected GpxTrackAdapter adapter;
-	private boolean continued = false;
-
-	@Override
-	public void createMenuItems(Bundle savedInstanceState) {
-		Activity activity = getActivity();
-		if (activity instanceof MapActivity) {
-			activity.findViewById(R.id.snap_to_road_image_button).setVisibility(View.GONE);
-		}
-		BaseBottomSheetItem description = new BottomSheetItemWithDescription.Builder()
-				.setDescription(getString(R.string.rourte_between_points_warning_desc))
-				.setTitle(getString(R.string.route_between_points))
-				.setLayoutId(R.layout.bottom_sheet_item_list_title_with_descr)
-				.create();
-		items.add(description);
-		items.add(new DividerSpaceItem(getContext(), getResources().getDimensionPixelSize(R.dimen.content_padding_half)));
-	}
-
-	@Override
-	protected int getRightBottomButtonTextId() {
-		return R.string.shared_string_continue;
-	}
-
-	@Override
-	protected void onRightBottomButtonClick() {
-		Fragment fragment = getTargetFragment();
-		if (fragment != null) {
-			continued = true;
-			fragment.onActivityResult(REQUEST_CODE, CONTINUE_RESULT_CODE, null);
-		}
-		dismiss();
-	}
-
-	@Override
-	protected int getDismissButtonTextId() {
-		return R.string.shared_string_cancel;
-	}
-
-	@Override
-	public void onDestroyView() {
-		super.onDestroyView();
-		Activity activity = getActivity();
-		if (activity instanceof MapActivity) {
-			activity.findViewById(R.id.snap_to_road_image_button).setVisibility(View.VISIBLE);
-		}
-		Fragment fragment = getTargetFragment();
-		if (fragment != null && !continued) {
-			fragment.onActivityResult(REQUEST_CODE, CANCEL_RESULT_CODE, null);
-		}
-	}
-
-	public static void showInstance(FragmentManager fm, Fragment targetFragment) {
-		try {
-			if (!fm.isStateSaved()) {
-				SnapTrackWarningBottomSheet fragment = new SnapTrackWarningBottomSheet();
-				fragment.setTargetFragment(targetFragment, REQUEST_CODE);
-				fm.beginTransaction()
-						.add(R.id.bottomFragmentContainer, fragment, TAG)
-						.commitAllowingStateLoss();
-			}
-		} catch (RuntimeException e) {
-			LOG.error("showInstance", e);
-		}
-	}
-}
diff --git a/OsmAnd/src/net/osmand/plus/measurementtool/SnapTrackWarningFragment.java b/OsmAnd/src/net/osmand/plus/measurementtool/SnapTrackWarningFragment.java
new file mode 100644
index 0000000000..49e1fa3d65
--- /dev/null
+++ b/OsmAnd/src/net/osmand/plus/measurementtool/SnapTrackWarningFragment.java
@@ -0,0 +1,203 @@
+package net.osmand.plus.measurementtool;
+
+import android.app.Activity;
+import android.os.Bundle;
+import android.util.TypedValue;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.FrameLayout;
+import android.widget.LinearLayout;
+
+import androidx.activity.OnBackPressedCallback;
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.fragment.app.Fragment;
+import androidx.fragment.app.FragmentActivity;
+import androidx.fragment.app.FragmentManager;
+
+import net.osmand.AndroidUtils;
+import net.osmand.PlatformUtil;
+import net.osmand.plus.OsmandApplication;
+import net.osmand.plus.R;
+import net.osmand.plus.UiUtilities;
+import net.osmand.plus.activities.MapActivity;
+import net.osmand.plus.activities.MapActivityLayers;
+import net.osmand.plus.base.BaseOsmAndFragment;
+import net.osmand.plus.helpers.AndroidUiHelper;
+import net.osmand.plus.views.OsmandMapTileView;
+import net.osmand.plus.views.layers.MapControlsLayer;
+import net.osmand.plus.views.layers.MapInfoLayer;
+
+import org.apache.commons.logging.Log;
+
+import static android.view.Gravity.TOP;
+import static android.view.ViewGroup.LayoutParams.MATCH_PARENT;
+import static net.osmand.aidlapi.OsmAndCustomizationConstants.BACK_TO_LOC_HUD_ID;
+import static net.osmand.aidlapi.OsmAndCustomizationConstants.ZOOM_IN_HUD_ID;
+import static net.osmand.aidlapi.OsmAndCustomizationConstants.ZOOM_OUT_HUD_ID;
+import static net.osmand.plus.UiUtilities.DialogButtonType.PRIMARY;
+import static net.osmand.plus.UiUtilities.DialogButtonType.SECONDARY;
+
+public class SnapTrackWarningFragment extends BaseOsmAndFragment {
+
+	public static final int REQUEST_CODE = 1000;
+	public static final int CANCEL_RESULT_CODE = 2;
+	public static final int CONTINUE_RESULT_CODE = 3;
+
+	public static final String TAG = SnapTrackWarningFragment.class.getSimpleName();
+	private static final Log LOG = PlatformUtil.getLog(SnapTrackWarningFragment.class);
+
+	private static final String ZOOM_IN_BUTTON_ID = ZOOM_IN_HUD_ID + TAG;
+	private static final String ZOOM_OUT_BUTTON_ID = ZOOM_OUT_HUD_ID + TAG;
+	private static final String BACK_TO_LOC_BUTTON_ID = BACK_TO_LOC_HUD_ID + TAG;
+
+	protected View mainView;
+	private boolean continued = false;
+	private View cancelButton;
+	private View applyButton;
+	private boolean nightMode;
+	private boolean portrait;
+
+	@Override
+	public void onCreate(@Nullable Bundle savedInstanceState) {
+		super.onCreate(savedInstanceState);
+		requireMyActivity().getOnBackPressedDispatcher().addCallback(this, new OnBackPressedCallback(true) {
+			public void handleOnBackPressed() {
+				dismissImmediate();
+			}
+		});
+	}
+
+	public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
+		OsmandApplication app = getMyApplication();
+		if (app != null) {
+			nightMode = app.getDaynightHelper().isNightModeForMapControls();
+			portrait = AndroidUiHelper.isOrientationPortrait(getMapActivity());
+		}
+		View rootView = UiUtilities.getInflater(getContext(), nightMode)
+				.inflate(R.layout.fragment_plan_route_warning, container, false);
+		if (rootView == null) {
+			return null;
+		}
+		applyButton = rootView.findViewById(R.id.right_bottom_button);
+		cancelButton = rootView.findViewById(R.id.dismiss_button);
+		View mapControlsContainer = rootView.findViewById(R.id.map_controls_container);
+		updateButtons(rootView);
+		if (portrait) {
+			setupControlButtons(rootView);
+			mapControlsContainer.setVisibility(View.VISIBLE);
+		} else {
+			mapControlsContainer.setVisibility(View.GONE);
+			final TypedValue typedValueAttr = new TypedValue();
+			int bgAttrId = AndroidUtils.isLayoutRtl(app) ? R.attr.right_menu_view_bg : R.attr.left_menu_view_bg;
+			getMapActivity().getTheme().resolveAttribute(bgAttrId, typedValueAttr, true);
+			rootView.setBackgroundResource(typedValueAttr.resourceId);
+			LinearLayout mainView = rootView.findViewById(R.id.main_view);
+			FrameLayout.LayoutParams params;
+			params = (FrameLayout.LayoutParams) mainView.getLayoutParams();
+			params.gravity = TOP;
+			int landscapeWidth = getResources().getDimensionPixelSize(R.dimen.dashboard_land_width);
+			rootView.setLayoutParams(new FrameLayout.LayoutParams(landscapeWidth, MATCH_PARENT));
+		}
+		return rootView;
+	}
+
+	private void setupControlButtons(@NonNull View view) {
+		MapActivity mapActivity = getMapActivity();
+		View zoomInButtonView = view.findViewById(R.id.map_zoom_in_button);
+		View zoomOutButtonView = view.findViewById(R.id.map_zoom_out_button);
+		View myLocButtonView = view.findViewById(R.id.map_my_location_button);
+		View mapRulerView = view.findViewById(R.id.map_ruler_layout);
+
+		MapActivityLayers mapLayers = mapActivity.getMapLayers();
+
+		OsmandMapTileView mapTileView = mapActivity.getMapView();
+		View.OnLongClickListener longClickListener = MapControlsLayer.getOnClickMagnifierListener(mapTileView);
+
+		MapControlsLayer mapControlsLayer = mapLayers.getMapControlsLayer();
+		mapControlsLayer.setupZoomInButton(zoomInButtonView, longClickListener, ZOOM_IN_BUTTON_ID);
+		mapControlsLayer.setupZoomOutButton(zoomOutButtonView, longClickListener, ZOOM_OUT_BUTTON_ID);
+		mapControlsLayer.setupBackToLocationButton(myLocButtonView, false, BACK_TO_LOC_BUTTON_ID);
+
+		MapInfoLayer mapInfoLayer = mapLayers.getMapInfoLayer();
+		mapInfoLayer.setupRulerWidget(mapRulerView);
+	}
+
+	private void updateButtons(View view) {
+		View buttonsContainer = view.findViewById(R.id.buttons_container);
+		buttonsContainer.setBackgroundColor(AndroidUtils.getColorFromAttr(view.getContext(), R.attr.list_background_color));
+		applyButton.setOnClickListener(new View.OnClickListener() {
+			@Override
+			public void onClick(View v) {
+				Fragment fragment = getTargetFragment();
+				if (fragment != null) {
+					continued = true;
+					dismissImmediate();
+					fragment.onActivityResult(REQUEST_CODE, CONTINUE_RESULT_CODE, null);
+				}
+			}
+		});
+		cancelButton.setOnClickListener(new View.OnClickListener() {
+			@Override
+			public void onClick(View v) {
+				FragmentActivity activity = getActivity();
+				if (activity != null) {
+					activity.onBackPressed();
+				}
+			}
+		});
+		UiUtilities.setupDialogButton(nightMode, cancelButton, SECONDARY, R.string.shared_string_cancel);
+		UiUtilities.setupDialogButton(nightMode, applyButton, PRIMARY, R.string.shared_string_apply);
+		AndroidUiHelper.updateVisibility(applyButton, true);
+		AndroidUiHelper.updateVisibility(view.findViewById(R.id.buttons_divider), true);
+	}
+
+	@Override
+	public void onDestroyView() {
+		super.onDestroyView();
+		Activity activity = getActivity();
+		if (activity instanceof MapActivity) {
+			activity.findViewById(R.id.snap_to_road_image_button).setVisibility(View.VISIBLE);
+		}
+		Fragment fragment = getTargetFragment();
+		if (fragment != null && !continued) {
+			fragment.onActivityResult(REQUEST_CODE, CANCEL_RESULT_CODE, null);
+		}
+	}
+
+	public MapActivity getMapActivity() {
+		FragmentActivity activity = getActivity();
+		if (activity instanceof MapActivity) {
+			return (MapActivity) activity;
+		} else {
+			return null;
+		}
+	}
+
+	public static void showInstance(FragmentManager fm, Fragment targetFragment) {
+		try {
+			if (!fm.isStateSaved()) {
+				SnapTrackWarningFragment fragment = new SnapTrackWarningFragment();
+				fragment.setTargetFragment(targetFragment, REQUEST_CODE);
+				fm.beginTransaction()
+						.replace(R.id.fragmentContainer, fragment, TAG)
+						.addToBackStack(TAG)
+						.commitAllowingStateLoss();
+			}
+		} catch (RuntimeException e) {
+			LOG.error("showInstance", e);
+		}
+	}
+
+	public void dismissImmediate() {
+		MapActivity mapActivity = getMapActivity();
+		if (mapActivity != null) {
+			try {
+				mapActivity.getSupportFragmentManager().popBackStackImmediate(TAG, FragmentManager.POP_BACK_STACK_INCLUSIVE);
+			} catch (Exception e) {
+				LOG.error(e);
+			}
+		}
+	}
+}
diff --git a/OsmAnd/src/net/osmand/plus/measurementtool/StartPlanRouteBottomSheet.java b/OsmAnd/src/net/osmand/plus/measurementtool/StartPlanRouteBottomSheet.java
index de235b0dc5..666fe4f0a6 100644
--- a/OsmAnd/src/net/osmand/plus/measurementtool/StartPlanRouteBottomSheet.java
+++ b/OsmAnd/src/net/osmand/plus/measurementtool/StartPlanRouteBottomSheet.java
@@ -9,6 +9,7 @@ import android.view.View;
 
 import androidx.appcompat.app.AppCompatActivity;
 import androidx.appcompat.view.ContextThemeWrapper;
+import androidx.fragment.app.FragmentActivity;
 import androidx.fragment.app.FragmentManager;
 import androidx.recyclerview.widget.LinearLayoutManager;
 import androidx.recyclerview.widget.RecyclerView;
@@ -19,7 +20,8 @@ import net.osmand.IndexConstants;
 import net.osmand.PlatformUtil;
 import net.osmand.plus.OsmandApplication;
 import net.osmand.plus.R;
-import net.osmand.plus.base.MenuBottomSheetDialogFragment;
+import net.osmand.plus.activities.MapActivity;
+import net.osmand.plus.base.BottomSheetBehaviourDialogFragment;
 import net.osmand.plus.base.bottomsheetmenu.BaseBottomSheetItem;
 import net.osmand.plus.base.bottomsheetmenu.BottomSheetItemWithDescription;
 import net.osmand.plus.base.bottomsheetmenu.simpleitems.DividerItem;
@@ -37,8 +39,9 @@ import java.util.Comparator;
 import java.util.List;
 
 import static net.osmand.plus.helpers.GpxUiHelper.getSortedGPXFilesInfo;
+import static net.osmand.plus.measurementtool.SelectFileBottomSheet.Mode.OPEN_TRACK;
 
-public class StartPlanRouteBottomSheet extends MenuBottomSheetDialogFragment {
+public class StartPlanRouteBottomSheet extends BottomSheetBehaviourDialogFragment {
 
 	public static final String TAG = StartPlanRouteBottomSheet.class.getSimpleName();
 	private static final Log LOG = PlatformUtil.getLog(StartPlanRouteBottomSheet.class);
@@ -47,13 +50,8 @@ public class StartPlanRouteBottomSheet extends MenuBottomSheetDialogFragment {
 
 	protected View mainView;
 	protected GpxTrackAdapter adapter;
-	private StartPlanRouteListener listener;
 	private ImportHelper importHelper;
 
-	public void setListener(StartPlanRouteListener listener) {
-		this.listener = listener;
-	}
-
 	@Override
 	public void createMenuItems(Bundle savedInstanceState) {
 		importHelper = new ImportHelper((AppCompatActivity) getActivity(), getMyApplication(), null);
@@ -70,6 +68,10 @@ public class StartPlanRouteBottomSheet extends MenuBottomSheetDialogFragment {
 				.setOnClickListener(new View.OnClickListener() {
 					@Override
 					public void onClick(View v) {
+						FragmentActivity activity = getActivity();
+						if (activity != null) {
+							MeasurementToolFragment.showInstance(activity.getSupportFragmentManager());
+						}
 						dismiss();
 					}
 				})
@@ -83,10 +85,12 @@ public class StartPlanRouteBottomSheet extends MenuBottomSheetDialogFragment {
 				.setOnClickListener(new View.OnClickListener() {
 					@Override
 					public void onClick(View v) {
-						if (listener != null) {
-							listener.openExistingTrackOnClick();
+						MapActivity mapActivity = (MapActivity) getActivity();
+						if (mapActivity != null) {
+							hideBottomSheet();
+							SelectFileBottomSheet.showInstance(mapActivity.getSupportFragmentManager(),
+									createSelectFileListener(), OPEN_TRACK);
 						}
-						dismiss();
 					}
 				})
 				.create();
@@ -136,15 +140,16 @@ public class StartPlanRouteBottomSheet extends MenuBottomSheetDialogFragment {
 	}
 
 	@Override
-	protected int getCustomHeight() {
-		return AndroidUtils.dpToPx(mainView.getContext(), BOTTOM_SHEET_HEIGHT_DP);
+	protected int getPeekHeight() {
+		return AndroidUtils.dpToPx(requiredMyApplication(), BOTTOM_SHEET_HEIGHT_DP);
 	}
 
 	private void onItemClick(int position, List gpxInfoList) {
 		if (position != RecyclerView.NO_POSITION && position < gpxInfoList.size()) {
 			String fileName = gpxInfoList.get(position).getFileName();
-			if (listener != null) {
-				listener.openLastEditTrackOnClick(fileName);
+			FragmentActivity activity = getActivity();
+			if (activity != null) {
+				MeasurementToolFragment.showInstance(activity.getSupportFragmentManager(), fileName);
 			}
 		}
 		dismiss();
@@ -189,35 +194,55 @@ public class StartPlanRouteBottomSheet extends MenuBottomSheetDialogFragment {
 		}
 	}
 
-	public static void showInstance(FragmentManager fragmentManager, StartPlanRouteListener listener) {
+	private SelectFileBottomSheet.SelectFileListener createSelectFileListener() {
+		return new SelectFileBottomSheet.SelectFileListener() {
+			@Override
+			public void selectFileOnCLick(String gpxFileName) {
+				dismiss();
+				MapActivity mapActivity = (MapActivity) getActivity();
+				if (mapActivity != null) {
+					MeasurementToolFragment.showInstance(mapActivity.getSupportFragmentManager(), gpxFileName);
+				}
+			}
+
+			@Override
+			public void dismissButtonOnClick() {
+				MapActivity mapActivity = (MapActivity) getActivity();
+				if (mapActivity != null) {
+					showBottomSheet();
+				}
+			}
+		};
+	}
+
+	public static void showInstance(FragmentManager fragmentManager) {
 		if (!fragmentManager.isStateSaved()) {
 			StartPlanRouteBottomSheet fragment = new StartPlanRouteBottomSheet();
-			fragment.setUsedOnMap(true);
 			fragment.setRetainInstance(true);
-			fragment.setListener(listener);
 			fragment.show(fragmentManager, TAG);
 		}
 	}
 
+	protected void hideBottomSheet() {
+		MapActivity mapActivity = (MapActivity) getActivity();
+		if (mapActivity != null) {
+			FragmentManager manager = mapActivity.getSupportFragmentManager();
+			manager.beginTransaction()
+					.hide(this).commit();
+		}
+	}
+
+	protected void showBottomSheet() {
+		MapActivity mapActivity = (MapActivity) getActivity();
+		if (mapActivity != null) {
+			FragmentManager manager = mapActivity.getSupportFragmentManager();
+			manager.beginTransaction()
+					.show(this).commit();
+		}
+	}
+
 	@Override
 	protected int getDismissButtonTextId() {
 		return R.string.shared_string_cancel;
 	}
-
-	@Override
-	protected void onDismissButtonClickAction() {
-		if (listener != null) {
-			listener.dismissButtonOnClick();
-		}
-	}
-
-	interface StartPlanRouteListener {
-
-		void openExistingTrackOnClick();
-
-		void openLastEditTrackOnClick(String fileName);
-
-		void dismissButtonOnClick();
-
-	}
 }
diff --git a/OsmAnd/src/net/osmand/plus/quickaction/QuickActionListFragment.java b/OsmAnd/src/net/osmand/plus/quickaction/QuickActionListFragment.java
index 036b60230f..ef7f8970b1 100644
--- a/OsmAnd/src/net/osmand/plus/quickaction/QuickActionListFragment.java
+++ b/OsmAnd/src/net/osmand/plus/quickaction/QuickActionListFragment.java
@@ -18,6 +18,7 @@ import android.widget.FrameLayout;
 import android.widget.ImageView;
 import android.widget.TextView;
 
+import androidx.activity.OnBackPressedCallback;
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
 import androidx.appcompat.widget.SwitchCompat;
@@ -38,11 +39,12 @@ import net.osmand.plus.R;
 import net.osmand.plus.UiUtilities;
 import net.osmand.plus.activities.MapActivity;
 import net.osmand.plus.base.BaseOsmAndFragment;
+import net.osmand.plus.dashboard.DashboardOnMap;
 import net.osmand.plus.settings.backend.ApplicationMode;
-import net.osmand.plus.views.layers.MapQuickActionLayer;
 import net.osmand.plus.views.controls.ReorderItemTouchHelperCallback;
 import net.osmand.plus.views.controls.ReorderItemTouchHelperCallback.OnItemMoveCallback;
 import net.osmand.plus.views.controls.ReorderItemTouchHelperCallback.UnmovableItem;
+import net.osmand.plus.views.layers.MapQuickActionLayer;
 
 import java.util.ArrayList;
 import java.util.Collections;
@@ -100,6 +102,26 @@ public class QuickActionListFragment extends BaseOsmAndFragment
             }
             screenType = savedInstanceState.getInt(SCREEN_TYPE_KEY, SCREEN_TYPE_REORDER);
         }
+        requireMyActivity().getOnBackPressedDispatcher().addCallback(this, new OnBackPressedCallback(true) {
+            public void handleOnBackPressed() {
+                MapActivity mapActivity = getMapActivity();
+                if (mapActivity != null) {
+                    if (isVisible()) {
+                        if (fromDashboard()) {
+                            mapActivity.getDashboard().setDashboardVisibility(true, DashboardOnMap.DashboardType.CONFIGURE_SCREEN, null);
+                        } else {
+                            mapActivity.getMapView().getLayerByClass(MapQuickActionLayer.class).onBackPressed();
+                        }
+                    } else if (mapActivity.getMapView().getLayerByClass(MapQuickActionLayer.class).onBackPressed()) {
+                        return;
+                    }
+                    FragmentManager fragmentManager = mapActivity.getSupportFragmentManager();
+                    if (!fragmentManager.isStateSaved()) {
+                        fragmentManager.popBackStackImmediate();
+                    }
+                }
+            }
+        });
     }
 
     @Nullable
diff --git a/OsmAnd/src/net/osmand/plus/routepreparationmenu/ChooseRouteFragment.java b/OsmAnd/src/net/osmand/plus/routepreparationmenu/ChooseRouteFragment.java
index c94c6e2968..b7b87f01b2 100644
--- a/OsmAnd/src/net/osmand/plus/routepreparationmenu/ChooseRouteFragment.java
+++ b/OsmAnd/src/net/osmand/plus/routepreparationmenu/ChooseRouteFragment.java
@@ -6,6 +6,7 @@ import android.content.Context;
 import android.content.Intent;
 import android.graphics.drawable.Drawable;
 import android.net.Uri;
+import android.os.AsyncTask;
 import android.os.Build;
 import android.os.Bundle;
 import android.text.Html;
@@ -21,6 +22,7 @@ import android.widget.ImageButton;
 import android.widget.ImageView;
 import android.widget.LinearLayout;
 
+import androidx.activity.OnBackPressedCallback;
 import androidx.annotation.DrawableRes;
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
@@ -33,7 +35,9 @@ import androidx.fragment.app.FragmentPagerAdapter;
 import androidx.viewpager.widget.ViewPager;
 
 import net.osmand.AndroidUtils;
+import net.osmand.FileUtils;
 import net.osmand.GPXUtilities;
+import net.osmand.IndexConstants;
 import net.osmand.data.LatLon;
 import net.osmand.data.PointDescription;
 import net.osmand.plus.GpxSelectionHelper.GpxDisplayItem;
@@ -42,22 +46,23 @@ import net.osmand.plus.OsmAndFormatter;
 import net.osmand.plus.OsmandApplication;
 import net.osmand.plus.R;
 import net.osmand.plus.activities.MapActivity;
-import net.osmand.plus.activities.MapActivityActions;
 import net.osmand.plus.activities.PrintDialogActivity;
 import net.osmand.plus.base.BaseOsmAndFragment;
 import net.osmand.plus.base.ContextMenuFragment;
 import net.osmand.plus.base.ContextMenuFragment.ContextMenuFragmentListener;
 import net.osmand.plus.base.ContextMenuFragment.MenuState;
 import net.osmand.plus.helpers.AndroidUiHelper;
+import net.osmand.plus.measurementtool.SaveAsNewTrackBottomSheetDialogFragment;
 import net.osmand.plus.routepreparationmenu.RouteDetailsFragment.CumulativeInfo;
 import net.osmand.plus.routepreparationmenu.RouteDetailsFragment.RouteDetailsFragmentListener;
 import net.osmand.plus.routepreparationmenu.cards.PublicTransportCard;
 import net.osmand.plus.routing.RouteDirectionInfo;
+import net.osmand.plus.routing.RouteProvider.GPXRouteParamsBuilder;
 import net.osmand.plus.routing.RoutingHelper;
 import net.osmand.plus.routing.TransportRoutingHelper;
 import net.osmand.plus.settings.backend.OsmandSettings;
-import net.osmand.plus.views.layers.MapControlsLayer;
 import net.osmand.plus.views.OsmandMapTileView;
+import net.osmand.plus.views.layers.MapControlsLayer;
 import net.osmand.router.TransportRouteResult;
 import net.osmand.util.Algorithms;
 
@@ -73,12 +78,15 @@ import java.util.Date;
 import java.util.List;
 import java.util.Locale;
 
+import static net.osmand.IndexConstants.GPX_FILE_EXT;
 import static net.osmand.aidlapi.OsmAndCustomizationConstants.BACK_TO_LOC_HUD_ID;
 import static net.osmand.aidlapi.OsmAndCustomizationConstants.ZOOM_IN_HUD_ID;
 import static net.osmand.aidlapi.OsmAndCustomizationConstants.ZOOM_OUT_HUD_ID;
+import static net.osmand.plus.activities.MapActivityActions.SaveDirectionsAsyncTask;
+import static net.osmand.plus.measurementtool.SaveAsNewTrackBottomSheetDialogFragment.SaveAsNewTrackFragmentListener;
 
 public class ChooseRouteFragment extends BaseOsmAndFragment implements ContextMenuFragmentListener,
-		RouteDetailsFragmentListener {
+		RouteDetailsFragmentListener, SaveAsNewTrackFragmentListener {
 
 	public static final String TAG = "ChooseRouteFragment";
 	public static final String ROUTE_INDEX_KEY = "route_index_key";
@@ -111,6 +119,16 @@ public class ChooseRouteFragment extends BaseOsmAndFragment implements ContextMe
 	private boolean publicTransportMode;
 	private boolean needAdjustMap;
 
+	@Override
+	public void onCreate(@Nullable Bundle savedInstanceState) {
+		super.onCreate(savedInstanceState);
+		requireMyActivity().getOnBackPressedDispatcher().addCallback(this, new OnBackPressedCallback(true) {
+			public void handleOnBackPressed() {
+				dismiss(true);
+			}
+		});
+	}
+
 	@Nullable
 	@Override
 	public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
@@ -461,8 +479,19 @@ public class ChooseRouteFragment extends BaseOsmAndFragment implements ContextMe
 			public void onClick(View v) {
 				MapActivity mapActivity = getMapActivity();
 				if (mapActivity != null) {
-					RoutingHelper routingHelper = mapActivity.getMyApplication().getRoutingHelper();
-					MapActivityActions.createSaveDirections(mapActivity, routingHelper).show();
+					OsmandApplication app = mapActivity.getMyApplication();
+					GPXRouteParamsBuilder paramsBuilder = app.getRoutingHelper().getCurrentGPXRoute();
+
+					String fileName;
+					if (paramsBuilder == null || paramsBuilder.getFile() == null || paramsBuilder.getFile().path == null) {
+						String suggestedName = new SimpleDateFormat("EEE dd MMM yyyy", Locale.US).format(new Date());
+						fileName = FileUtils.createUniqueFileName(app, suggestedName, IndexConstants.GPX_INDEX_DIR, GPX_FILE_EXT);
+					} else {
+						fileName = new File(paramsBuilder.getFile().path).getName();
+					}
+					SaveAsNewTrackBottomSheetDialogFragment.showInstance(mapActivity.getSupportFragmentManager(),
+							ChooseRouteFragment.this, null, fileName,
+							false, true);
 				}
 			}
 		};
@@ -861,6 +890,16 @@ public class ChooseRouteFragment extends BaseOsmAndFragment implements ContextMe
 		}
 	}
 
+	@Override
+	public void onSaveAsNewTrack(String folderName, String fileName, boolean showOnMap, boolean simplifiedTrack) {
+		OsmandApplication app = getMyApplication();
+		if (app != null) {
+			File fileDir = new File(app.getAppPath(IndexConstants.GPX_INDEX_DIR), folderName == null ? "" : folderName);
+			File toSave = new File(fileDir, fileName + GPX_FILE_EXT);
+			new SaveDirectionsAsyncTask(app, showOnMap).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, toSave);
+		}
+	}
+
 	public class RoutesPagerAdapter extends FragmentPagerAdapter {
 		private int routesCount;
 
diff --git a/OsmAnd/src/net/osmand/plus/routepreparationmenu/FollowTrackFragment.java b/OsmAnd/src/net/osmand/plus/routepreparationmenu/FollowTrackFragment.java
index 54747b068e..4f9214438e 100644
--- a/OsmAnd/src/net/osmand/plus/routepreparationmenu/FollowTrackFragment.java
+++ b/OsmAnd/src/net/osmand/plus/routepreparationmenu/FollowTrackFragment.java
@@ -27,7 +27,9 @@ import net.osmand.GPXUtilities.GPXFile;
 import net.osmand.GPXUtilities.TrkSegment;
 import net.osmand.IndexConstants;
 import net.osmand.PlatformUtil;
+import net.osmand.ValueHolder;
 import net.osmand.data.QuadRect;
+import net.osmand.data.RotatedTileBox;
 import net.osmand.plus.GpxSelectionHelper.SelectedGpxFile;
 import net.osmand.plus.OsmandApplication;
 import net.osmand.plus.R;
@@ -55,6 +57,7 @@ import net.osmand.plus.routepreparationmenu.cards.ReverseTrackCard;
 import net.osmand.plus.routepreparationmenu.cards.SelectTrackCard;
 import net.osmand.plus.routepreparationmenu.cards.TrackEditCard;
 import net.osmand.plus.routepreparationmenu.cards.TracksToFollowCard;
+import net.osmand.plus.routing.IRouteInformationListener;
 import net.osmand.plus.routing.RouteProvider;
 import net.osmand.plus.routing.RouteProvider.GPXRouteParamsBuilder;
 import net.osmand.plus.routing.RoutingHelper;
@@ -66,7 +69,7 @@ import java.io.File;
 import java.util.List;
 
 
-public class FollowTrackFragment extends ContextMenuScrollFragment implements CardListener {
+public class FollowTrackFragment extends ContextMenuScrollFragment implements CardListener, IRouteInformationListener {
 
 	public static final String TAG = FollowTrackFragment.class.getName();
 
@@ -79,6 +82,7 @@ public class FollowTrackFragment extends ContextMenuScrollFragment implements Ca
 
 	private GPXFile gpxFile;
 
+	private boolean editingTrack;
 	private boolean selectingTrack;
 	private int menuTitleHeight;
 
@@ -264,12 +268,14 @@ public class FollowTrackFragment extends ContextMenuScrollFragment implements Ca
 	@Override
 	public void onResume() {
 		super.onResume();
+		app.getRoutingHelper().addListener(this);
 		MapRouteInfoMenu.followTrackVisible = true;
 	}
 
 	@Override
 	public void onPause() {
 		super.onPause();
+		app.getRoutingHelper().removeListener(this);
 		MapRouteInfoMenu.followTrackVisible = false;
 	}
 
@@ -293,10 +299,56 @@ public class FollowTrackFragment extends ContextMenuScrollFragment implements Ca
 		updateStatusBarColor();
 	}
 
+	@Override
+	protected int applyPosY(int currentY, boolean needCloseMenu, boolean needMapAdjust, int previousMenuState, int newMenuState, int dZoom, boolean animated) {
+		int y = super.applyPosY(currentY, needCloseMenu, needMapAdjust, previousMenuState, newMenuState, dZoom, animated);
+		if (needMapAdjust) {
+			adjustMapPosition(y);
+		}
+		return y;
+	}
+
+	private void adjustMapPosition(int y) {
+		MapActivity mapActivity = getMapActivity();
+		if (mapActivity == null) {
+			return;
+		}
+
+		RoutingHelper rh = app.getRoutingHelper();
+		if (rh.isRoutePlanningMode() && mapActivity.getMapView() != null) {
+			QuadRect rect = mapActivity.getMapRouteInfoMenu().getRouteRect(mapActivity);
+
+			if (gpxFile != null) {
+				QuadRect gpxRect = gpxFile.getRect();
+
+				rect.left = Math.min(rect.left, gpxRect.left);
+				rect.right = Math.max(rect.right, gpxRect.right);
+				rect.top = Math.max(rect.top, gpxRect.top);
+				rect.bottom = Math.min(rect.bottom, gpxRect.bottom);
+			}
+
+			RotatedTileBox tb = mapActivity.getMapView().getCurrentRotatedTileBox().copy();
+			int tileBoxWidthPx = 0;
+			int tileBoxHeightPx = 0;
+
+			if (!isPortrait()) {
+				tileBoxWidthPx = tb.getPixWidth() - getWidth();
+			} else {
+				int fHeight = getViewHeight() - y - AndroidUtils.getStatusBarHeight(app);
+				tileBoxHeightPx = tb.getPixHeight() - fHeight;
+			}
+			if (rect.left != 0 && rect.right != 0) {
+				mapActivity.getMapView().fitRectToMap(rect.left, rect.right, rect.top, rect.bottom,
+						tileBoxWidthPx, tileBoxHeightPx, 0);
+			}
+		}
+	}
+
 	@Override
 	public void onDestroyView() {
 		super.onDestroyView();
 		exitTrackAppearanceMode();
+		onDismiss();
 	}
 
 	@Override
@@ -478,6 +530,7 @@ public class FollowTrackFragment extends ContextMenuScrollFragment implements Ca
 	public void openPlanRoute(boolean useAppMode) {
 		MapActivity mapActivity = getMapActivity();
 		if (mapActivity != null && gpxFile != null) {
+			editingTrack = true;
 			QuadRect rect = gpxFile.getRect();
 			TrkSegment segment = gpxFile.getNonEmptyTrkSegment();
 			ActionType actionType = segment == null ? ActionType.ADD_ROUTE_POINTS : ActionType.EDIT_SEGMENT;
@@ -487,7 +540,7 @@ public class FollowTrackFragment extends ContextMenuScrollFragment implements Ca
 			if (useAppMode) {
 				editingContext.setAppMode(app.getRoutingHelper().getAppMode());
 			}
-			MeasurementToolFragment.showInstance(mapActivity.getSupportFragmentManager(), editingContext, true);
+			MeasurementToolFragment.showInstance(mapActivity.getSupportFragmentManager(), editingContext, true, true);
 		}
 	}
 
@@ -554,4 +607,36 @@ public class FollowTrackFragment extends ContextMenuScrollFragment implements Ca
 			log.error(e);
 		}
 	}
+
+	private void onDismiss() {
+		try {
+			MapActivity mapActivity = getMapActivity();
+			if (mapActivity != null && !editingTrack) {
+				if (!mapActivity.isChangingConfigurations()) {
+					mapActivity.getMapRouteInfoMenu().cancelSelectionFromTracks();
+				}
+				mapActivity.getMapLayers().getMapControlsLayer().showRouteInfoControlDialog();
+			}
+		} catch (Exception e) {
+			log.error(e);
+		}
+	}
+
+	@Override
+	public void newRouteIsCalculated(boolean newRoute, ValueHolder showToast) {
+		MapActivity mapActivity = getMapActivity();
+		if (mapActivity != null && newRoute && app.getRoutingHelper().isRoutePlanningMode()) {
+			adjustMapPosition(getHeight());
+		}
+	}
+
+	@Override
+	public void routeWasCancelled() {
+
+	}
+
+	@Override
+	public void routeWasFinished() {
+
+	}
 }
\ No newline at end of file
diff --git a/OsmAnd/src/net/osmand/plus/routepreparationmenu/MapRouteInfoMenu.java b/OsmAnd/src/net/osmand/plus/routepreparationmenu/MapRouteInfoMenu.java
index d8388d4594..f3576af790 100644
--- a/OsmAnd/src/net/osmand/plus/routepreparationmenu/MapRouteInfoMenu.java
+++ b/OsmAnd/src/net/osmand/plus/routepreparationmenu/MapRouteInfoMenu.java
@@ -43,6 +43,7 @@ import net.osmand.ValueHolder;
 import net.osmand.data.FavouritePoint;
 import net.osmand.data.LatLon;
 import net.osmand.data.PointDescription;
+import net.osmand.data.QuadRect;
 import net.osmand.data.RotatedTileBox;
 import net.osmand.plus.FavouritesDbHelper;
 import net.osmand.plus.FavouritesDbHelper.FavoritesListener;
@@ -95,6 +96,7 @@ import net.osmand.plus.routepreparationmenu.cards.PublicTransportNotFoundWarning
 import net.osmand.plus.routepreparationmenu.cards.SimpleRouteCard;
 import net.osmand.plus.routepreparationmenu.cards.TracksCard;
 import net.osmand.plus.routing.IRouteInformationListener;
+import net.osmand.plus.routing.RouteCalculationResult;
 import net.osmand.plus.routing.RouteProvider.GPXRouteParamsBuilder;
 import net.osmand.plus.routing.RoutingHelper;
 import net.osmand.plus.routing.TransportRoutingHelper;
@@ -147,6 +149,7 @@ public class MapRouteInfoMenu implements IRouteInformationListener, CardListener
 	private PointType selectFromMapPointType;
 	private int selectFromMapMenuState = MenuState.HEADER_ONLY;
 	private boolean selectFromMapWaypoints;
+	private boolean selectFromTracks;
 
 	private boolean showMenu = false;
 	private int showMenuState = DEFAULT_MENU_STATE;
@@ -1392,7 +1395,7 @@ public class MapRouteInfoMenu implements IRouteInformationListener, CardListener
 			});
 			if (item != null) {
 				LinearLayout.LayoutParams layoutParams = getContainerButtonLayoutParams(mapActivity, false);
-				layoutParams.setMargins(margin, 0, margin, 0);
+				AndroidUtils.setMargins(layoutParams, margin, 0, margin, 0);
 				optionsContainer.addView(item, layoutParams);
 			}
 		}
@@ -1402,7 +1405,7 @@ public class MapRouteInfoMenu implements IRouteInformationListener, CardListener
 		if (containerParams) {
 			int margin = AndroidUtils.dpToPx(context, 3);
 			LinearLayout.LayoutParams containerBtnLp = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.MATCH_PARENT);
-			containerBtnLp.setMargins(margin, 0, margin, 0);
+			AndroidUtils.setMargins(containerBtnLp, margin, 0, margin, 0);
 			return containerBtnLp;
 		} else {
 			return new LinearLayout.LayoutParams(AndroidUtils.dpToPx(context, 100), ViewGroup.LayoutParams.MATCH_PARENT);
@@ -1563,8 +1566,8 @@ public class MapRouteInfoMenu implements IRouteInformationListener, CardListener
 					if (mapActivity != null) {
 						GPXRouteParamsBuilder routeParams = mapActivity.getRoutingHelper().getCurrentGPXRoute();
 						if (routeParams != null) {
-							FollowTrackFragment trackOptionsFragment = new FollowTrackFragment();
-							FollowTrackFragment.showInstance(mapActivity, trackOptionsFragment);
+							hide();
+							selectTrack();
 						}
 					}
 				}
@@ -1575,8 +1578,9 @@ public class MapRouteInfoMenu implements IRouteInformationListener, CardListener
 		}
 		setupViaText(mainView);
 
-		FrameLayout viaButton = (FrameLayout) mainView.findViewById(R.id.via_button);
-		AndroidUiHelper.updateVisibility(viaButton, isFinishPointFromTrack());
+		FrameLayout viaButton = mainView.findViewById(R.id.via_button);
+		AndroidUiHelper.updateVisibility(viaButton, routeParams == null || isFinishPointFromTrack());
+
 		viaButton.setOnClickListener(new OnClickListener() {
 			@Override
 			public void onClick(View v) {
@@ -1949,6 +1953,19 @@ public class MapRouteInfoMenu implements IRouteInformationListener, CardListener
 		}
 	}
 
+	public void selectTrack() {
+		selectFromTracks = true;
+		MapActivity mapActivity = getMapActivity();
+		if (mapActivity != null) {
+			FollowTrackFragment trackOptionsFragment = new FollowTrackFragment();
+			FollowTrackFragment.showInstance(mapActivity, trackOptionsFragment);
+		}
+	}
+
+	public void cancelSelectionFromTracks() {
+		selectFromTracks = false;
+	}
+
 	public void setupFields(PointType pointType) {
 		View mainView = getMainView();
 		if (mainView != null) {
@@ -2248,7 +2265,7 @@ public class MapRouteInfoMenu implements IRouteInformationListener, CardListener
 				if (switched) {
 					mapActivity.getMapLayers().getMapControlsLayer().switchToRouteFollowingLayout();
 				}
-				if (mapActivity.getPointToNavigate() == null && !selectFromMapTouch) {
+				if (mapActivity.getPointToNavigate() == null && !selectFromMapTouch && !selectFromTracks) {
 					mapActivity.getMapActions().stopNavigationWithoutConfirm();
 				}
 				mapActivity.updateStatusBarColor();
@@ -2363,6 +2380,32 @@ public class MapRouteInfoMenu implements IRouteInformationListener, CardListener
 		updateMenu();
 	}
 
+	@NonNull
+	public QuadRect getRouteRect(@NonNull MapActivity mapActivity) {
+		OsmandApplication app = mapActivity.getMyApplication();
+		RoutingHelper routingHelper = app.getRoutingHelper();
+		MapRouteInfoMenu menu = mapActivity.getMapRouteInfoMenu();
+
+		QuadRect rect = new QuadRect(0, 0, 0, 0);
+		if (menu.isTransportRouteCalculated()) {
+			TransportRoutingHelper transportRoutingHelper = app.getTransportRoutingHelper();
+			TransportRouteResult result = transportRoutingHelper.getCurrentRouteResult();
+			if (result != null) {
+				QuadRect transportRouteRect = transportRoutingHelper.getTransportRouteRect(result);
+				if (transportRouteRect != null) {
+					rect = transportRouteRect;
+				}
+			}
+		} else if (routingHelper.isRouteCalculated()) {
+			RouteCalculationResult result = routingHelper.getRoute();
+			QuadRect routeRect = routingHelper.getRouteRect(result);
+			if (routeRect != null) {
+				rect = routeRect;
+			}
+		}
+		return rect;
+	}
+
 	public enum MapRouteMenuType {
 		ROUTE_INFO,
 		ROUTE_DETAILS
diff --git a/OsmAnd/src/net/osmand/plus/routepreparationmenu/MapRouteInfoMenuFragment.java b/OsmAnd/src/net/osmand/plus/routepreparationmenu/MapRouteInfoMenuFragment.java
index 537901f6f2..bd1d382677 100644
--- a/OsmAnd/src/net/osmand/plus/routepreparationmenu/MapRouteInfoMenuFragment.java
+++ b/OsmAnd/src/net/osmand/plus/routepreparationmenu/MapRouteInfoMenuFragment.java
@@ -16,23 +16,16 @@ import androidx.annotation.Nullable;
 import androidx.core.content.ContextCompat;
 
 import net.osmand.AndroidUtils;
-import net.osmand.Location;
 import net.osmand.data.QuadRect;
 import net.osmand.data.RotatedTileBox;
-import net.osmand.plus.settings.backend.ApplicationMode;
 import net.osmand.plus.OsmandApplication;
 import net.osmand.plus.R;
-import net.osmand.plus.TargetPointsHelper.TargetPoint;
 import net.osmand.plus.activities.MapActivity;
 import net.osmand.plus.base.ContextMenuFragment;
 import net.osmand.plus.helpers.AndroidUiHelper;
 import net.osmand.plus.routing.RoutingHelper;
-import net.osmand.plus.routing.TransportRoutingHelper;
+import net.osmand.plus.settings.backend.ApplicationMode;
 import net.osmand.plus.widgets.TextViewExProgress;
-import net.osmand.router.TransportRouteResult;
-import net.osmand.util.MapUtils;
-
-import java.util.List;
 
 public class MapRouteInfoMenuFragment extends ContextMenuFragment {
 	public static final String TAG = MapRouteInfoMenuFragment.class.getName();
@@ -289,36 +282,7 @@ public class MapRouteInfoMenuFragment extends ContextMenuFragment {
 
 		RoutingHelper rh = app.getRoutingHelper();
 		if (rh.isRoutePlanningMode() && mapActivity.getMapView() != null) {
-			QuadRect r = new QuadRect(0, 0, 0, 0);
-			if (menu.isTransportRouteCalculated()) {
-				TransportRoutingHelper transportRoutingHelper = app.getTransportRoutingHelper();
-				TransportRouteResult result = transportRoutingHelper.getCurrentRouteResult();
-				if (result != null) {
-					QuadRect transportRouteRect = transportRoutingHelper.getTransportRouteRect(result);
-					if (transportRouteRect != null) {
-						r = transportRouteRect;
-					}
-				}
-			} else if (rh.isRouteCalculated()) {
-				Location lt = rh.getLastProjection();
-				if (lt == null) {
-					lt = app.getTargetPointsHelper().getPointToStartLocation();
-				}
-				if (lt == null) {
-					lt = app.getLocationProvider().getLastKnownLocation();
-				}
-				if (lt != null) {
-					MapUtils.insetLatLonRect(r, lt.getLatitude(), lt.getLongitude());
-				}
-				List list = rh.getCurrentCalculatedRoute();
-				for (Location l : list) {
-					MapUtils.insetLatLonRect(r, l.getLatitude(), l.getLongitude());
-				}
-				List targetPoints = app.getTargetPointsHelper().getIntermediatePointsWithTarget();
-				for (TargetPoint l : targetPoints) {
-					MapUtils.insetLatLonRect(r, l.getLatitude(), l.getLongitude());
-				}
-			}
+			QuadRect r = menu.getRouteRect(mapActivity);
 			RotatedTileBox tb = mapActivity.getMapView().getCurrentRotatedTileBox().copy();
 			int tileBoxWidthPx = 0;
 			int tileBoxHeightPx = 0;
diff --git a/OsmAnd/src/net/osmand/plus/routepreparationmenu/RouteOptionsBottomSheet.java b/OsmAnd/src/net/osmand/plus/routepreparationmenu/RouteOptionsBottomSheet.java
index c6d3df05ca..0d23e78673 100644
--- a/OsmAnd/src/net/osmand/plus/routepreparationmenu/RouteOptionsBottomSheet.java
+++ b/OsmAnd/src/net/osmand/plus/routepreparationmenu/RouteOptionsBottomSheet.java
@@ -5,7 +5,6 @@ import android.content.Intent;
 import android.graphics.drawable.Drawable;
 import android.os.Build;
 import android.os.Bundle;
-import android.view.MenuItem;
 import android.view.View;
 import android.widget.CompoundButton;
 import android.widget.ImageView;
@@ -13,14 +12,10 @@ import android.widget.LinearLayout;
 import android.widget.TextView;
 
 import androidx.annotation.ColorRes;
-import androidx.appcompat.view.ContextThemeWrapper;
-import androidx.appcompat.widget.PopupMenu;
 import androidx.core.content.ContextCompat;
 import androidx.fragment.app.FragmentManager;
 
 import net.osmand.AndroidUtils;
-import net.osmand.CallbackWithObject;
-import net.osmand.GPXUtilities;
 import net.osmand.StateChangedListener;
 import net.osmand.plus.OsmAndLocationSimulation;
 import net.osmand.plus.OsmandApplication;
@@ -35,7 +30,6 @@ import net.osmand.plus.base.bottomsheetmenu.BottomSheetItemWithDescription;
 import net.osmand.plus.base.bottomsheetmenu.SimpleBottomSheetItem;
 import net.osmand.plus.base.bottomsheetmenu.simpleitems.DividerStartItem;
 import net.osmand.plus.base.bottomsheetmenu.simpleitems.TitleItem;
-import net.osmand.plus.helpers.GpxUiHelper;
 import net.osmand.plus.routepreparationmenu.RoutingOptionsHelper.AvoidPTTypesRoutingParameter;
 import net.osmand.plus.routepreparationmenu.RoutingOptionsHelper.AvoidRoadsRoutingParameter;
 import net.osmand.plus.routepreparationmenu.RoutingOptionsHelper.DividerItem;
@@ -367,8 +361,9 @@ public class RouteOptionsBottomSheet extends MenuBottomSheetDialogFragment {
 				.setOnClickListener(new View.OnClickListener() {
 					@Override
 					public void onClick(View view) {
-						FollowTrackFragment trackOptionsFragment = new FollowTrackFragment();
-						FollowTrackFragment.showInstance(mapActivity, trackOptionsFragment);
+						MapRouteInfoMenu mapRouteInfoMenu = mapActivity.getMapRouteInfoMenu();
+						mapRouteInfoMenu.hide();
+						mapRouteInfoMenu.selectTrack();
 						dismiss();
 					}
 				})
@@ -500,58 +495,6 @@ public class RouteOptionsBottomSheet extends MenuBottomSheetDialogFragment {
 		f.show(fragmentManager, RouteOptionsBottomSheet.TAG);
 	}
 
-	protected void openGPXFileSelection() {
-		GpxUiHelper.selectGPXFile(mapActivity, false, false, new CallbackWithObject() {
-
-			@Override
-			public boolean processResult(GPXUtilities.GPXFile[] result) {
-				mapActivity.getMapActions().setGPXRouteParams(result[0]);
-				app.getTargetPointsHelper().updateRouteAndRefresh(true);
-				updateParameters();
-				routingHelper.recalculateRouteDueToSettingsChange();
-				return true;
-			}
-		}, nightMode);
-	}
-
-	private void showOptionsMenu(View view) {
-		RouteProvider.GPXRouteParamsBuilder rp = mapActivity.getRoutingHelper().getCurrentGPXRoute();
-		final PopupMenu optionsMenu = new PopupMenu(new ContextThemeWrapper(view.getContext(), themeRes), view);
-		MenuItem item = optionsMenu.getMenu().add(
-				mapActivity.getString(R.string.shared_string_none));
-		item.setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() {
-			@Override
-			public boolean onMenuItemClick(MenuItem item) {
-				if (mapActivity.getRoutingHelper().getCurrentGPXRoute() != null) {
-					mapActivity.getRoutingHelper().setGpxParams(null);
-					settings.FOLLOW_THE_GPX_ROUTE.set(null);
-					mapActivity.getRoutingHelper().recalculateRouteDueToSettingsChange();
-				}
-				updateParameters();
-				return true;
-			}
-		});
-		item = optionsMenu.getMenu().add(mapActivity.getString(R.string.select_gpx));
-		item.setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() {
-			@Override
-			public boolean onMenuItemClick(MenuItem item) {
-				openGPXFileSelection();
-				return true;
-			}
-		});
-		if (rp != null) {
-			item = optionsMenu.getMenu().add(new File(rp.getFile().path).getName());
-			item.setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() {
-				@Override
-				public boolean onMenuItemClick(MenuItem item) {
-					// nothing to change
-					return true;
-				}
-			});
-		}
-		optionsMenu.show();
-	}
-
 	public void updateParameters() {
 		Activity activity = getActivity();
 		View mainView = getView();
diff --git a/OsmAnd/src/net/osmand/plus/routing/GpxApproximator.java b/OsmAnd/src/net/osmand/plus/routing/GpxApproximator.java
index a3fb41c2f2..7e6b089620 100644
--- a/OsmAnd/src/net/osmand/plus/routing/GpxApproximator.java
+++ b/OsmAnd/src/net/osmand/plus/routing/GpxApproximator.java
@@ -140,13 +140,13 @@ public class GpxApproximator {
 
 	public void cancelApproximation() {
 		if (gctx != null) {
-			gctx.calculationCancelled = true;
+			gctx.ctx.calculationProgress.isCancelled = true;
 		}
 	}
 
 	public void calculateGpxApproximation(@NonNull final ResultMatcher resultMatcher) {
 		if (gctx != null) {
-			gctx.calculationCancelled = true;
+			gctx.ctx.calculationProgress.isCancelled = true;
 		}
 		final GpxRouteApproximation gctx = getNewGpxApproximationContext(this.gctx);
 		this.gctx = gctx;
@@ -187,10 +187,10 @@ public class GpxApproximator {
 				@Override
 				public void run() {
 					RouteCalculationProgress calculationProgress = gctx.ctx.calculationProgress;
-					if (gctx.isCalculationDone() && GpxApproximator.this.gctx == gctx) {
+					if (!gctx.result.isEmpty() && GpxApproximator.this.gctx == gctx) {
 						finishProgress();
 					}
-					if (!gctx.isCalculationDone() && calculationProgress != null && !calculationProgress.isCancelled) {
+					if (gctx.result.isEmpty() && calculationProgress != null && !calculationProgress.isCancelled) {
 						float pr = calculationProgress.getLinearProgress();
 						approximationProgress.updateProgress((int) pr);
 						if (GpxApproximator.this.gctx != gctx) {
diff --git a/OsmAnd/src/net/osmand/plus/routing/RouteProvider.java b/OsmAnd/src/net/osmand/plus/routing/RouteProvider.java
index c1aa605955..eb7765e9af 100644
--- a/OsmAnd/src/net/osmand/plus/routing/RouteProvider.java
+++ b/OsmAnd/src/net/osmand/plus/routing/RouteProvider.java
@@ -469,7 +469,9 @@ public class RouteProvider {
 			List gpxRouteLocations = result.getImmutableAllLocations();
 			int gpxNextIndex = calcWholeRoute ? 0 : findStartIndexFromRoute(gpxRouteLocations, routeParams.start, calculateOsmAndRouteParts);
 			Location gpxNextLocation = null;
+			Location gpxLastLocation = !gpxRouteLocations.isEmpty() ? gpxRouteLocations.get(gpxRouteLocations.size() - 1) : null;
 			List firstSegmentRoute = null;
+			List lastSegmentRoute = null;
 			List gpxRoute;
 			if (gpxNextIndex > 0) {
 				gpxNextLocation = gpxRouteLocations.get(gpxNextIndex);
@@ -486,14 +488,25 @@ public class RouteProvider {
 			if (calculateOsmAndRouteParts
 					&& routeParams.start != null && gpxNextLocation != null
 					&& gpxNextLocation.distanceTo(routeParams.start) > MIN_DISTANCE_FOR_INSERTING_ROUTE_SEGMENT) {
-				RouteCalculationResult firstSegmentResult = findOfflineRouteSegment(routeParams, routeParams.start, new LatLon(gpxNextLocation.getLatitude(), gpxNextLocation.getLongitude()));
+				RouteCalculationResult firstSegmentResult = findOfflineRouteSegment(
+						routeParams, routeParams.start, new LatLon(gpxNextLocation.getLatitude(), gpxNextLocation.getLongitude()));
 				firstSegmentRoute = firstSegmentResult.getOriginalRoute();
 			}
+			if (calculateOsmAndRouteParts
+					&& routeParams.end != null && gpxLastLocation != null
+					&& MapUtils.getDistance(gpxLastLocation.getLatitude(), gpxLastLocation.getLongitude(),
+					routeParams.end.getLatitude(), routeParams.end.getLongitude()) > MIN_DISTANCE_FOR_INSERTING_ROUTE_SEGMENT) {
+				RouteCalculationResult lastSegmentResult = findOfflineRouteSegment(routeParams, gpxLastLocation, routeParams.end);
+				lastSegmentRoute = lastSegmentResult.getOriginalRoute();
+			}
 			List newGpxRoute = new ArrayList<>();
 			if (firstSegmentRoute != null && !firstSegmentRoute.isEmpty()) {
 				newGpxRoute.addAll(firstSegmentRoute);
 			}
 			newGpxRoute.addAll(gpxRoute);
+			if (lastSegmentRoute != null && !lastSegmentRoute.isEmpty()) {
+				newGpxRoute.addAll(lastSegmentRoute);
+			}
 			return new RouteCalculationResult(newGpxRoute, routeParams.start, routeParams.end,
 					routeParams.intermediates, routeParams.ctx, routeParams.leftSide, null, null, routeParams.mode, true);
 		}
diff --git a/OsmAnd/src/net/osmand/plus/routing/RoutingHelper.java b/OsmAnd/src/net/osmand/plus/routing/RoutingHelper.java
index 57becfe9a6..4fd5b1dd65 100644
--- a/OsmAnd/src/net/osmand/plus/routing/RoutingHelper.java
+++ b/OsmAnd/src/net/osmand/plus/routing/RoutingHelper.java
@@ -1,9 +1,10 @@
 package net.osmand.plus.routing;
 
 
-import net.osmand.GPXUtilities;
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+
 import net.osmand.GPXUtilities.GPXFile;
-import net.osmand.GPXUtilities.WptPt;
 import net.osmand.Location;
 import net.osmand.LocationsHolder;
 import net.osmand.PlatformUtil;
@@ -12,14 +13,11 @@ import net.osmand.ValueHolder;
 import net.osmand.binary.RouteDataObject;
 import net.osmand.data.LatLon;
 import net.osmand.data.QuadPoint;
-import net.osmand.plus.routing.RouteProvider.RoutingEnvironment;
-import net.osmand.plus.settings.backend.ApplicationMode;
+import net.osmand.data.QuadRect;
 import net.osmand.plus.NavigationService;
-import net.osmand.plus.settings.backend.OsmAndAppCustomization.OsmAndAppCustomizationListener;
 import net.osmand.plus.OsmAndFormatter;
 import net.osmand.plus.OsmandApplication;
 import net.osmand.plus.OsmandPlugin;
-import net.osmand.plus.settings.backend.OsmandSettings;
 import net.osmand.plus.R;
 import net.osmand.plus.TargetPointsHelper;
 import net.osmand.plus.TargetPointsHelper.TargetPoint;
@@ -27,9 +25,12 @@ import net.osmand.plus.notifications.OsmandNotification.NotificationType;
 import net.osmand.plus.routing.RouteCalculationResult.NextDirectionInfo;
 import net.osmand.plus.routing.RouteProvider.GPXRouteParamsBuilder;
 import net.osmand.plus.routing.RouteProvider.RouteService;
+import net.osmand.plus.routing.RouteProvider.RoutingEnvironment;
+import net.osmand.plus.settings.backend.ApplicationMode;
+import net.osmand.plus.settings.backend.OsmAndAppCustomization.OsmAndAppCustomizationListener;
+import net.osmand.plus.settings.backend.OsmandSettings;
 import net.osmand.router.RouteCalculationProgress;
 import net.osmand.router.RouteExporter;
-import net.osmand.router.RoutePlannerFrontEnd;
 import net.osmand.router.RoutePlannerFrontEnd.GpxPoint;
 import net.osmand.router.RoutePlannerFrontEnd.GpxRouteApproximation;
 import net.osmand.router.RouteSegmentResult;
@@ -1041,7 +1042,30 @@ public class RoutingHelper {
 		return route.getRouteDirections();
 	}
 
+	@Nullable
+	public QuadRect getRouteRect(@NonNull RouteCalculationResult result) {
+		QuadRect rect = new QuadRect(0, 0, 0, 0);
+		Location lt = getLastProjection();
+		if (lt == null) {
+			lt = app.getTargetPointsHelper().getPointToStartLocation();
+		}
+		if (lt == null) {
+			lt = app.getLocationProvider().getLastKnownLocation();
+		}
+		if (lt != null) {
+			MapUtils.insetLatLonRect(rect, lt.getLatitude(), lt.getLongitude());
+		}
+		List list = result.getImmutableAllLocations();
+		for (Location l : list) {
+			MapUtils.insetLatLonRect(rect, l.getLatitude(), l.getLongitude());
+		}
+		List targetPoints = app.getTargetPointsHelper().getIntermediatePointsWithTarget();
+		for (TargetPoint l : targetPoints) {
+			MapUtils.insetLatLonRect(rect, l.getLatitude(), l.getLongitude());
+		}
 
+		return rect.left == 0 && rect.right == 0 ? null : rect;
+	}
 
 	private class RouteRecalculationThread extends Thread {
 
@@ -1344,6 +1368,7 @@ public class RoutingHelper {
 
 
 	// NEVER returns null
+	@NonNull
 	public RouteCalculationResult getRoute() {
 		return route;
 	}
diff --git a/OsmAnd/src/net/osmand/plus/search/QuickSearchDialogFragment.java b/OsmAnd/src/net/osmand/plus/search/QuickSearchDialogFragment.java
index 6b306003d0..3c55261668 100644
--- a/OsmAnd/src/net/osmand/plus/search/QuickSearchDialogFragment.java
+++ b/OsmAnd/src/net/osmand/plus/search/QuickSearchDialogFragment.java
@@ -34,6 +34,7 @@ import android.widget.ProgressBar;
 import android.widget.TextView;
 import android.widget.Toast;
 
+import androidx.activity.OnBackPressedCallback;
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
 import androidx.appcompat.app.AlertDialog;
@@ -41,6 +42,7 @@ import androidx.appcompat.widget.Toolbar;
 import androidx.core.content.ContextCompat;
 import androidx.fragment.app.DialogFragment;
 import androidx.fragment.app.Fragment;
+import androidx.fragment.app.FragmentActivity;
 import androidx.fragment.app.FragmentManager;
 import androidx.fragment.app.FragmentPagerAdapter;
 import androidx.fragment.app.FragmentTransaction;
@@ -232,13 +234,24 @@ public class QuickSearchDialogFragment extends DialogFragment implements OsmAndC
 	@Override
 	public void onCreate(Bundle savedInstanceState) {
 		super.onCreate(savedInstanceState);
+		FragmentActivity activity = requireActivity();
 		app = getMyApplication();
 		nightMode = !app.getSettings().isLightContent();
 		navigationInfo = new NavigationInfo(app);
-		accessibilityAssistant = new AccessibilityAssistant(getActivity());
+		accessibilityAssistant = new AccessibilityAssistant(activity);
+
 		boolean isLightTheme = app.getSettings().isLightContent();
 		int themeId = isLightTheme ? R.style.OsmandLightTheme : R.style.OsmandDarkTheme;
 		setStyle(STYLE_NO_FRAME, themeId);
+
+		activity.getOnBackPressedDispatcher().addCallback(this, new OnBackPressedCallback(true) {
+			public void handleOnBackPressed() {
+				MapActivity mapActivity = getMapActivity();
+				if (mapActivity != null) {
+					mapActivity.showQuickSearch(ShowQuickSearchMode.CURRENT, false);
+				}
+			}
+		});
 	}
 
 	@Override
@@ -1491,7 +1504,9 @@ public class QuickSearchDialogFragment extends DialogFragment implements OsmAndC
 				limit--;
 			}
 		}
-		addressSearchFragment.updateListAdapter(rows, false);
+		if (addressSearchFragment != null) {
+			addressSearchFragment.updateListAdapter(rows, false);
+		}
 	}
 
 	public void reloadHistory() {
diff --git a/OsmAnd/src/net/osmand/plus/search/SendSearchQueryBottomSheet.java b/OsmAnd/src/net/osmand/plus/search/SendSearchQueryBottomSheet.java
index a46393fc67..39e91503ec 100644
--- a/OsmAnd/src/net/osmand/plus/search/SendSearchQueryBottomSheet.java
+++ b/OsmAnd/src/net/osmand/plus/search/SendSearchQueryBottomSheet.java
@@ -1,8 +1,6 @@
 package net.osmand.plus.search;
 
-import android.os.Build;
 import android.os.Bundle;
-import android.text.Html;
 import android.view.ContextThemeWrapper;
 import android.view.View;
 import android.widget.TextView;
@@ -50,11 +48,7 @@ public class SendSearchQueryBottomSheet extends MenuBottomSheetDialogFragment {
 		final int themeRes = nightMode ? R.style.OsmandDarkTheme : R.style.OsmandLightTheme;
 		final TextView textView = (TextView) View.inflate(new ContextThemeWrapper(getContext(), themeRes),
 				R.layout.send_missing_search_query_tv, null);
-		if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
-			textView.setText(getString(R.string.send_search_query_description, searchQuery));
-		} else {
-			textView.setText(getString(R.string.send_search_query_description, searchQuery));
-		}
+		textView.setText(getString(R.string.send_search_query_description, searchQuery));
 		BaseBottomSheetItem sendSearchQueryDescription = new SimpleBottomSheetItem.Builder().setCustomView(textView)
 				.create();
 		items.add(sendSearchQueryDescription);
diff --git a/OsmAnd/src/net/osmand/plus/settings/fragments/ConfigureMenuItemsFragment.java b/OsmAnd/src/net/osmand/plus/settings/fragments/ConfigureMenuItemsFragment.java
index d9980e0640..44fb4bf7f6 100644
--- a/OsmAnd/src/net/osmand/plus/settings/fragments/ConfigureMenuItemsFragment.java
+++ b/OsmAnd/src/net/osmand/plus/settings/fragments/ConfigureMenuItemsFragment.java
@@ -1,6 +1,5 @@
 package net.osmand.plus.settings.fragments;
 
-import android.app.Activity;
 import android.content.Context;
 import android.content.DialogInterface;
 import android.os.Build;
@@ -11,6 +10,7 @@ import android.view.ViewGroup;
 import android.widget.ImageButton;
 import android.widget.TextView;
 
+import androidx.activity.OnBackPressedCallback;
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
 import androidx.appcompat.app.AlertDialog;
@@ -24,11 +24,9 @@ import com.google.android.material.appbar.AppBarLayout;
 
 import net.osmand.AndroidUtils;
 import net.osmand.PlatformUtil;
-import net.osmand.plus.settings.backend.ApplicationMode;
 import net.osmand.plus.ContextMenuAdapter;
 import net.osmand.plus.ContextMenuItem;
 import net.osmand.plus.OsmandApplication;
-import net.osmand.plus.settings.backend.OsmandSettings;
 import net.osmand.plus.R;
 import net.osmand.plus.UiUtilities;
 import net.osmand.plus.activities.MapActivity;
@@ -36,11 +34,13 @@ import net.osmand.plus.base.BaseOsmAndFragment;
 import net.osmand.plus.dialogs.ConfigureMapMenu;
 import net.osmand.plus.mapcontextmenu.MapContextMenu;
 import net.osmand.plus.profiles.SelectCopyAppModeBottomSheet;
-import net.osmand.plus.settings.fragments.ConfigureMenuRootFragment.ScreenType;
+import net.osmand.plus.settings.backend.ApplicationMode;
+import net.osmand.plus.settings.backend.OsmandSettings;
 import net.osmand.plus.settings.bottomsheets.ChangeGeneralProfilesPrefBottomSheet;
-import net.osmand.plus.views.controls.ReorderItemTouchHelperCallback;
-import net.osmand.plus.settings.fragments.RearrangeMenuItemsAdapter.RearrangeMenuAdapterItem;
+import net.osmand.plus.settings.fragments.ConfigureMenuRootFragment.ScreenType;
 import net.osmand.plus.settings.fragments.RearrangeMenuItemsAdapter.MenuItemsAdapterListener;
+import net.osmand.plus.settings.fragments.RearrangeMenuItemsAdapter.RearrangeMenuAdapterItem;
+import net.osmand.plus.views.controls.ReorderItemTouchHelperCallback;
 
 import org.apache.commons.logging.Log;
 
@@ -83,7 +83,7 @@ public class ConfigureMenuItemsFragment extends BaseOsmAndFragment
 	private boolean nightMode;
 	private boolean wasReset = false;
 	private boolean isChanged = false;
-	private Activity activity;
+	private FragmentActivity activity;
 	private RecyclerView recyclerView;
 
 	@Override
@@ -149,7 +149,13 @@ public class ConfigureMenuItemsFragment extends BaseOsmAndFragment
 		nightMode = !app.getSettings().isLightContentForMode(appMode);
 		mInflater = UiUtilities.getInflater(app, nightMode);
 		mainActionItems = new ArrayList<>();
-		activity = getActivity();
+		activity = requireActivity();
+		activity.getOnBackPressedDispatcher().addCallback(this, new OnBackPressedCallback(true) {
+			@Override
+			public void handleOnBackPressed() {
+				exitFragment();
+			}
+		});
 	}
 
 	private void initSavedIds(ApplicationMode appMode) {
diff --git a/OsmAnd/src/net/osmand/plus/settings/fragments/ImportCompleteFragment.java b/OsmAnd/src/net/osmand/plus/settings/fragments/ImportCompleteFragment.java
index a521e8e079..a18e2f6aa9 100644
--- a/OsmAnd/src/net/osmand/plus/settings/fragments/ImportCompleteFragment.java
+++ b/OsmAnd/src/net/osmand/plus/settings/fragments/ImportCompleteFragment.java
@@ -12,6 +12,7 @@ import android.view.ViewTreeObserver;
 import android.widget.LinearLayout;
 import android.widget.TextView;
 
+import androidx.activity.OnBackPressedCallback;
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
 import androidx.fragment.app.FragmentManager;
@@ -62,6 +63,12 @@ public class ImportCompleteFragment extends BaseOsmAndFragment {
 		super.onCreate(savedInstanceState);
 		app = requireMyApplication();
 		nightMode = !app.getSettings().isLightContent();
+		requireActivity().getOnBackPressedDispatcher().addCallback(this, new OnBackPressedCallback(true) {
+			@Override
+			public void handleOnBackPressed() {
+				dismissFragment();
+			}
+		});
 	}
 
 	@Nullable
diff --git a/OsmAnd/src/net/osmand/plus/settings/fragments/ImportSettingsFragment.java b/OsmAnd/src/net/osmand/plus/settings/fragments/ImportSettingsFragment.java
index 13dc2f94ce..284964b88d 100644
--- a/OsmAnd/src/net/osmand/plus/settings/fragments/ImportSettingsFragment.java
+++ b/OsmAnd/src/net/osmand/plus/settings/fragments/ImportSettingsFragment.java
@@ -16,6 +16,7 @@ import android.widget.LinearLayout;
 import android.widget.ProgressBar;
 import android.widget.TextView;
 
+import androidx.activity.OnBackPressedCallback;
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
 import androidx.appcompat.app.AlertDialog;
@@ -106,6 +107,12 @@ public class ImportSettingsFragment extends BaseOsmAndFragment
 		app = requireMyApplication();
 		settingsHelper = app.getSettingsHelper();
 		nightMode = !app.getSettings().isLightContent();
+		requireActivity().getOnBackPressedDispatcher().addCallback(this, new OnBackPressedCallback(true) {
+			@Override
+			public void handleOnBackPressed() {
+				showExitDialog();
+			}
+		});
 	}
 
 	@Nullable
diff --git a/OsmAnd/src/net/osmand/plus/settings/fragments/ProfileAppearanceFragment.java b/OsmAnd/src/net/osmand/plus/settings/fragments/ProfileAppearanceFragment.java
index 9ea296e925..6fcf8a17bf 100644
--- a/OsmAnd/src/net/osmand/plus/settings/fragments/ProfileAppearanceFragment.java
+++ b/OsmAnd/src/net/osmand/plus/settings/fragments/ProfileAppearanceFragment.java
@@ -23,6 +23,7 @@ import android.widget.FrameLayout;
 import android.widget.ImageView;
 import android.widget.TextView;
 
+import androidx.activity.OnBackPressedCallback;
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
 import androidx.appcompat.app.AlertDialog;
@@ -151,6 +152,11 @@ public class ProfileAppearanceFragment extends BaseSettingsFragment {
 			changedProfile.navigationIcon = profile.navigationIcon;
 			isNewProfile = ApplicationMode.valueOfStringKey(changedProfile.stringKey, null) == null;
 		}
+		requireMyActivity().getOnBackPressedDispatcher().addCallback(this, new OnBackPressedCallback(true) {
+			public void handleOnBackPressed() {
+				showExitDialog();
+			}
+		});
 	}
 
 	public void setupAppProfileObjectFromAppMode(ApplicationMode baseModeForNewProfile) {
@@ -893,7 +899,7 @@ public class ProfileAppearanceFragment extends BaseSettingsFragment {
 		profileNameOtfb.setError(errorMessage, true);
 	}
 
-	public boolean isProfileAppearanceChanged() {
+	public void showExitDialog() {
 		hideKeyboard();
 		if (isChanged()) {
 			AlertDialog.Builder dismissDialog = createWarningDialog(getActivity(),
@@ -906,9 +912,8 @@ public class ProfileAppearanceFragment extends BaseSettingsFragment {
 				}
 			});
 			dismissDialog.show();
-			return true;
 		} else {
-			return false;
+			dismiss();
 		}
 	}
 
diff --git a/OsmAnd/src/net/osmand/plus/track/CustomColorBottomSheet.java b/OsmAnd/src/net/osmand/plus/track/CustomColorBottomSheet.java
index a5db15c147..b5ef5e1961 100644
--- a/OsmAnd/src/net/osmand/plus/track/CustomColorBottomSheet.java
+++ b/OsmAnd/src/net/osmand/plus/track/CustomColorBottomSheet.java
@@ -11,6 +11,7 @@ import android.widget.EditText;
 
 import androidx.annotation.ColorInt;
 import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
 import androidx.fragment.app.Fragment;
 import androidx.fragment.app.FragmentManager;
 
@@ -46,7 +47,7 @@ public class CustomColorBottomSheet extends MenuBottomSheetDialogFragment implem
 	private boolean fromEditText;
 
 	@ColorInt
-	private int prevColor;
+	private Integer prevColor;
 	@ColorInt
 	private int newColor;
 
@@ -54,12 +55,18 @@ public class CustomColorBottomSheet extends MenuBottomSheetDialogFragment implem
 	public void createMenuItems(Bundle savedInstanceState) {
 		if (savedInstanceState != null) {
 			newColor = savedInstanceState.getInt(NEW_SELECTED_COLOR);
-			prevColor = savedInstanceState.getInt(PREV_SELECTED_COLOR);
+			if (savedInstanceState.containsKey(PREV_SELECTED_COLOR)) {
+				prevColor = savedInstanceState.getInt(PREV_SELECTED_COLOR);
+			}
 		} else {
 			Bundle args = getArguments();
 			if (args != null) {
-				prevColor = args.getInt(PREV_SELECTED_COLOR);
-				newColor = prevColor != -1 ? prevColor : Color.RED;
+				if (args.containsKey(PREV_SELECTED_COLOR)) {
+					prevColor = args.getInt(PREV_SELECTED_COLOR);
+					newColor = prevColor;
+				} else {
+					newColor = Color.RED;
+				}
 			}
 		}
 
@@ -74,7 +81,9 @@ public class CustomColorBottomSheet extends MenuBottomSheetDialogFragment implem
 	@Override
 	public void onSaveInstanceState(Bundle outState) {
 		outState.putInt(NEW_SELECTED_COLOR, newColor);
-		outState.putInt(PREV_SELECTED_COLOR, prevColor);
+		if (prevColor != null) {
+			outState.putInt(PREV_SELECTED_COLOR, prevColor);
+		}
 		super.onSaveInstanceState(outState);
 	}
 
@@ -157,11 +166,13 @@ public class CustomColorBottomSheet extends MenuBottomSheetDialogFragment implem
 		dismiss();
 	}
 
-	public static void showInstance(@NonNull FragmentManager fragmentManager, Fragment target, int prevColor) {
+	public static void showInstance(@NonNull FragmentManager fragmentManager, Fragment target, @Nullable Integer prevColor) {
 		try {
 			if (!fragmentManager.isStateSaved() && fragmentManager.findFragmentByTag(CustomColorBottomSheet.TAG) == null) {
 				Bundle args = new Bundle();
-				args.putInt(PREV_SELECTED_COLOR, prevColor);
+				if (prevColor != null) {
+					args.putInt(PREV_SELECTED_COLOR, prevColor);
+				}
 
 				CustomColorBottomSheet customColorBottomSheet = new CustomColorBottomSheet();
 				customColorBottomSheet.setArguments(args);
@@ -175,7 +186,7 @@ public class CustomColorBottomSheet extends MenuBottomSheetDialogFragment implem
 
 	public interface ColorPickerListener {
 
-		void onColorSelected(@ColorInt int prevColor, @ColorInt int newColor);
+		void onColorSelected(@ColorInt Integer prevColor, @ColorInt int newColor);
 
 	}
 }
\ No newline at end of file
diff --git a/OsmAnd/src/net/osmand/plus/track/TrackAppearanceFragment.java b/OsmAnd/src/net/osmand/plus/track/TrackAppearanceFragment.java
index c0fe05d060..53d49bd2a7 100644
--- a/OsmAnd/src/net/osmand/plus/track/TrackAppearanceFragment.java
+++ b/OsmAnd/src/net/osmand/plus/track/TrackAppearanceFragment.java
@@ -13,7 +13,9 @@ import android.view.ViewTreeObserver;
 import android.widget.FrameLayout;
 import android.widget.ImageView;
 import android.widget.LinearLayout;
+import android.widget.ScrollView;
 
+import androidx.activity.OnBackPressedCallback;
 import androidx.annotation.ColorInt;
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
@@ -79,6 +81,9 @@ public class TrackAppearanceFragment extends ContextMenuScrollFragment implement
 	private TrackColoringCard trackColoringCard;
 
 	private ImageView trackIcon;
+	private View buttonsShadow;
+	private View routeMenuTopShadowAll;
+	private View controlButtons;
 
 	@Override
 	public int getMainLayoutId() {
@@ -108,6 +113,11 @@ public class TrackAppearanceFragment extends ContextMenuScrollFragment implement
 		return trackDrawInfo;
 	}
 
+	@Override
+	public int getSupportedMenuStatesPortrait() {
+		return MenuState.HEADER_ONLY | MenuState.HALF_SCREEN | MenuState.FULL_SCREEN;
+	}
+
 	@Override
 	public void onCreate(Bundle savedInstanceState) {
 		super.onCreate(savedInstanceState);
@@ -147,6 +157,15 @@ public class TrackAppearanceFragment extends ContextMenuScrollFragment implement
 			}
 			updateTrackColor();
 		}
+		requireMyActivity().getOnBackPressedDispatcher().addCallback(this, new OnBackPressedCallback(true) {
+			public void handleOnBackPressed() {
+				MapActivity mapActivity = getMapActivity();
+				if (mapActivity != null) {
+					dismissImmediate();
+					mapActivity.launchPrevActivityIntent();
+				}
+			}
+		});
 	}
 
 	private void updateTrackColor() {
@@ -172,13 +191,9 @@ public class TrackAppearanceFragment extends ContextMenuScrollFragment implement
 		View view = super.onCreateView(inflater, container, savedInstanceState);
 		if (view != null) {
 			trackIcon = view.findViewById(R.id.track_icon);
-
-			view.setOnClickListener(new View.OnClickListener() {
-				@Override
-				public void onClick(View v) {
-					openMenuHeaderOnly();
-				}
-			});
+			buttonsShadow = view.findViewById(R.id.buttons_shadow);
+			controlButtons = view.findViewById(R.id.control_buttons);
+			routeMenuTopShadowAll = view.findViewById(R.id.route_menu_top_shadow_all);
 
 			if (isPortrait()) {
 				updateCardsLayout();
@@ -191,7 +206,7 @@ public class TrackAppearanceFragment extends ContextMenuScrollFragment implement
 				int widthNoShadow = getLandscapeNoShadowWidth();
 				FrameLayout.LayoutParams params = new FrameLayout.LayoutParams(widthNoShadow, ViewGroup.LayoutParams.WRAP_CONTENT);
 				params.gravity = Gravity.BOTTOM | Gravity.START;
-				view.findViewById(R.id.control_buttons).setLayoutParams(params);
+				controlButtons.setLayoutParams(params);
 			}
 			enterTrackAppearanceMode();
 			runLayoutListener();
@@ -201,9 +216,8 @@ public class TrackAppearanceFragment extends ContextMenuScrollFragment implement
 
 	@Override
 	protected void calculateLayout(View view, boolean initLayout) {
-		menuTitleHeight = view.findViewById(R.id.route_menu_top_shadow_all).getHeight()
-				+ view.findViewById(R.id.control_buttons).getHeight()
-				- view.findViewById(R.id.buttons_shadow).getHeight();
+		menuTitleHeight = routeMenuTopShadowAll.getHeight()
+				+ controlButtons.getHeight() - buttonsShadow.getHeight();
 		super.calculateLayout(view, initLayout);
 	}
 
@@ -219,6 +233,11 @@ public class TrackAppearanceFragment extends ContextMenuScrollFragment implement
 		updateStatusBarColor();
 	}
 
+	@Override
+	public boolean shouldShowMapControls(int menuState) {
+		return menuState == MenuState.HEADER_ONLY || menuState == MenuState.HALF_SCREEN;
+	}
+
 	@Override
 	public void onResume() {
 		super.onResume();
@@ -315,10 +334,7 @@ public class TrackAppearanceFragment extends ContextMenuScrollFragment implement
 			if (card instanceof SplitIntervalCard) {
 				SplitIntervalBottomSheet.showInstance(mapActivity.getSupportFragmentManager(), trackDrawInfo, this);
 			} else if (card instanceof TrackColoringCard) {
-				updateAppearanceIcon();
-				if (trackWidthCard != null) {
-					trackWidthCard.updateItems();
-				}
+				updateColorItems();
 			} else if (card instanceof TrackWidthCard) {
 				updateAppearanceIcon();
 			} else if (card instanceof DirectionArrowsCard) {
@@ -333,8 +349,9 @@ public class TrackAppearanceFragment extends ContextMenuScrollFragment implement
 	}
 
 	@Override
-	public void onColorSelected(int prevColor, int newColor) {
+	public void onColorSelected(Integer prevColor, int newColor) {
 		trackColoringCard.onColorSelected(prevColor, newColor);
+		updateColorItems();
 	}
 
 	@Override
@@ -351,6 +368,11 @@ public class TrackAppearanceFragment extends ContextMenuScrollFragment implement
 		trackIcon.setImageDrawable(icon);
 	}
 
+	@Override
+	protected void onHeaderClick() {
+		adjustMapPosition(getViewY());
+	}
+
 	private void adjustMapPosition(int y) {
 		MapActivity mapActivity = getMapActivity();
 		if (mapActivity != null && mapActivity.getMapView() != null) {
@@ -381,13 +403,21 @@ public class TrackAppearanceFragment extends ContextMenuScrollFragment implement
 		int strokeColor = UiUtilities.getColorWithAlpha(Color.BLACK, 0.7f);
 		Drawable strokeIcon = app.getUIUtilities().getPaintedIcon(strokeIconId, strokeColor);
 
+		Drawable transparencyIcon = getTransparencyIcon(app, widthAttr, color);
 		if (showArrows) {
 			int arrowsIconId = getArrowsIconId(widthAttr);
 			int contrastColor = UiUtilities.getContrastColor(app, color, false);
 			Drawable arrows = app.getUIUtilities().getPaintedIcon(arrowsIconId, contrastColor);
-			return UiUtilities.getLayeredIcon(widthIcon, strokeIcon, arrows);
+			return UiUtilities.getLayeredIcon(transparencyIcon, widthIcon, strokeIcon, arrows);
 		}
-		return UiUtilities.getLayeredIcon(widthIcon, strokeIcon);
+		return UiUtilities.getLayeredIcon(transparencyIcon, widthIcon, strokeIcon);
+	}
+
+	private Drawable getTransparencyIcon(OsmandApplication app, String widthAttr, @ColorInt int color) {
+		int transparencyIconId = getTransparencyIconId(widthAttr);
+		int colorWithoutAlpha = UiUtilities.removeAlpha(color);
+		int transparencyColor = UiUtilities.getColorWithAlpha(colorWithoutAlpha, 0.8f);
+		return app.getUIUtilities().getPaintedIcon(transparencyIconId, transparencyColor);
 	}
 
 	private void updateCardsLayout() {
@@ -455,10 +485,23 @@ public class TrackAppearanceFragment extends ContextMenuScrollFragment implement
 				} else if (scrollY > 0 && bottomContainer.getForeground() == null) {
 					bottomContainer.setForeground(shadowIcon);
 				}
+				updateButtonsShadow();
 			}
 		});
 	}
 
+	private void updateButtonsShadow() {
+		boolean scrollToBottomAvailable = getBottomScrollView().canScrollVertically(1);
+		AndroidUiHelper.updateVisibility(buttonsShadow, scrollToBottomAvailable);
+	}
+
+	private void updateColorItems() {
+		updateAppearanceIcon();
+		if (trackWidthCard != null) {
+			trackWidthCard.updateItems();
+		}
+	}
+
 	private void saveTrackInfo() {
 		GPXFile gpxFile = selectedGpxFile.getGpxFile();
 
@@ -537,19 +580,7 @@ public class TrackAppearanceFragment extends ContextMenuScrollFragment implement
 	}
 
 	private void saveGpx(final GPXFile gpxFile) {
-		new SaveGpxAsyncTask(gpxFile, new SaveGpxAsyncTask.SaveGpxListener() {
-			@Override
-			public void gpxSavingStarted() {
-
-			}
-
-			@Override
-			public void gpxSavingFinished(Exception errorMessage) {
-				if (errorMessage == null) {
-					app.showShortToastMessage(R.string.shared_string_track_is_saved, Algorithms.getFileWithoutDirs(gpxFile.path));
-				}
-			}
-		}).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
+		new SaveGpxAsyncTask(gpxFile, null).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
 	}
 
 	private void setupCards() {
@@ -572,7 +603,21 @@ public class TrackAppearanceFragment extends ContextMenuScrollFragment implement
 			trackColoringCard.setListener(this);
 			cardsContainer.addView(trackColoringCard.build(mapActivity));
 
-			trackWidthCard = new TrackWidthCard(mapActivity, trackDrawInfo);
+			trackWidthCard = new TrackWidthCard(mapActivity, trackDrawInfo, new OnNeedScrollListener() {
+
+				@Override
+				public void onVerticalScrollNeeded(int y) {
+					View view = trackWidthCard.getView();
+					if (view != null) {
+						int resultYPosition = view.getTop() + y;
+						int dialogHeight = getInnerScrollableHeight();
+						ScrollView scrollView = (ScrollView) getBottomScrollView();
+						if (resultYPosition > (scrollView.getScrollY() + dialogHeight)) {
+							scrollView.smoothScrollTo(0, resultYPosition - dialogHeight);
+						}
+					}
+				}
+			});
 			trackWidthCard.setListener(this);
 			cardsContainer.addView(trackWidthCard.build(mapActivity));
 		}
@@ -615,6 +660,13 @@ public class TrackAppearanceFragment extends ContextMenuScrollFragment implement
 		}
 	}
 
+	public int getInnerScrollableHeight() {
+		int totalScreenHeight = getViewHeight() - getMenuStatePosY(getCurrentMenuState());
+		int frameTotalHeight = routeMenuTopShadowAll.getHeight()
+				+ controlButtons.getHeight() + buttonsShadow.getHeight();
+		return totalScreenHeight - frameTotalHeight;
+	}
+
 	public static boolean showInstance(@NonNull MapActivity mapActivity, TrackAppearanceFragment fragment) {
 		try {
 			mapActivity.getSupportFragmentManager()
@@ -628,6 +680,16 @@ public class TrackAppearanceFragment extends ContextMenuScrollFragment implement
 		}
 	}
 
+	public static int getTransparencyIconId(String widthAttr) {
+		if (TRACK_WIDTH_BOLD.equals(widthAttr)) {
+			return R.drawable.ic_action_track_line_bold_transparency;
+		} else if (TRACK_WIDTH_MEDIUM.equals(widthAttr)) {
+			return R.drawable.ic_action_track_line_medium_transparency;
+		} else {
+			return R.drawable.ic_action_track_line_thin_transparency;
+		}
+	}
+
 	public static int getWidthIconId(String widthAttr) {
 		if (TRACK_WIDTH_BOLD.equals(widthAttr)) {
 			return R.drawable.ic_action_track_line_bold_color;
@@ -657,4 +719,8 @@ public class TrackAppearanceFragment extends ContextMenuScrollFragment implement
 			return R.drawable.ic_action_track_line_thin_direction;
 		}
 	}
+
+	public interface OnNeedScrollListener {
+		void onVerticalScrollNeeded(int y);
+	}
 }
\ No newline at end of file
diff --git a/OsmAnd/src/net/osmand/plus/track/TrackColoringCard.java b/OsmAnd/src/net/osmand/plus/track/TrackColoringCard.java
index ebec402c95..e8ab755507 100644
--- a/OsmAnd/src/net/osmand/plus/track/TrackColoringCard.java
+++ b/OsmAnd/src/net/osmand/plus/track/TrackColoringCard.java
@@ -17,16 +17,15 @@ import androidx.appcompat.content.res.AppCompatResources;
 import androidx.core.content.ContextCompat;
 import androidx.core.graphics.ColorUtils;
 import androidx.fragment.app.Fragment;
-import androidx.recyclerview.widget.LinearLayoutManager;
 import androidx.recyclerview.widget.RecyclerView;
 
 import com.google.android.material.internal.FlowLayout;
 
 import net.osmand.AndroidUtils;
 import net.osmand.PlatformUtil;
-import net.osmand.plus.GPXDatabase;
 import net.osmand.plus.GPXDatabase.GpxDataItem;
 import net.osmand.plus.GpxSelectionHelper.SelectedGpxFile;
+import net.osmand.plus.OsmandApplication;
 import net.osmand.plus.R;
 import net.osmand.plus.UiUtilities;
 import net.osmand.plus.activities.MapActivity;
@@ -81,10 +80,10 @@ public class TrackColoringCard extends BaseCard implements ColorPickerListener {
 		createColorSelector();
 		updateColorSelector();
 
-		coloringAdapter = new TrackColoringAdapter(appearanceItems);
-		RecyclerView groupRecyclerView = view.findViewById(R.id.recycler_view);
-		groupRecyclerView.setAdapter(coloringAdapter);
-		groupRecyclerView.setLayoutManager(new LinearLayoutManager(app, RecyclerView.HORIZONTAL, false));
+//		coloringAdapter = new TrackColoringAdapter(appearanceItems);
+//		RecyclerView groupRecyclerView = view.findViewById(R.id.recycler_view);
+//		groupRecyclerView.setAdapter(coloringAdapter);
+//		groupRecyclerView.setLayoutManager(new LinearLayoutManager(app, RecyclerView.HORIZONTAL, false));
 
 		AndroidUiHelper.updateVisibility(view.findViewById(R.id.top_divider), isShowDivider());
 	}
@@ -147,16 +146,20 @@ public class TrackColoringCard extends BaseCard implements ColorPickerListener {
 		View colorItemView = createCircleView(rootView);
 
 		ImageView backgroundCircle = colorItemView.findViewById(R.id.background);
+
+		Drawable transparencyIcon = getTransparencyIcon(app, color);
+		Drawable colorIcon = app.getUIUtilities().getPaintedIcon(R.drawable.bg_point_circle, color);
+		Drawable layeredIcon = UiUtilities.getLayeredIcon(transparencyIcon, colorIcon);
 		double contrastRatio = ColorUtils.calculateContrast(color, ContextCompat.getColor(app, nightMode ? R.color.card_and_list_background_dark : R.color.card_and_list_background_light));
 		if (contrastRatio < MINIMUM_CONTRAST_RATIO) {
 			backgroundCircle.setBackgroundResource(nightMode ? R.drawable.circle_contour_bg_dark : R.drawable.circle_contour_bg_light);
 		}
-		backgroundCircle.setImageDrawable(UiUtilities.tintDrawable(AppCompatResources.getDrawable(app, R.drawable.bg_point_circle), color));
+		backgroundCircle.setImageDrawable(layeredIcon);
 		backgroundCircle.setOnClickListener(new View.OnClickListener() {
 			@Override
 			public void onClick(View v) {
 				updateColorSelector(color, rootView);
-				coloringAdapter.notifyDataSetChanged();
+//				coloringAdapter.notifyDataSetChanged();
 				trackDrawInfo.setColor(color);
 
 				CardListener listener = getListener();
@@ -181,6 +184,12 @@ public class TrackColoringCard extends BaseCard implements ColorPickerListener {
 		return colorItemView;
 	}
 
+	private Drawable getTransparencyIcon(OsmandApplication app, @ColorInt int color) {
+		int colorWithoutAlpha = UiUtilities.removeAlpha(color);
+		int transparencyColor = UiUtilities.getColorWithAlpha(colorWithoutAlpha, 0.8f);
+		return app.getUIUtilities().getPaintedIcon(R.drawable.ic_bg_transparency, transparencyColor);
+	}
+
 	private View createAddCustomColorItemView(FlowLayout rootView) {
 		View colorItemView = createCircleView(rootView);
 		ImageView backgroundCircle = colorItemView.findViewById(R.id.background);
@@ -191,7 +200,7 @@ public class TrackColoringCard extends BaseCard implements ColorPickerListener {
 		ImageView icon = colorItemView.findViewById(R.id.icon);
 		icon.setVisibility(View.VISIBLE);
 		int activeColorResId = nightMode ? R.color.icon_color_active_dark : R.color.icon_color_active_light;
-		icon.setImageDrawable(app.getUIUtilities().getIcon(R.drawable.ic_action_add, activeColorResId));
+		icon.setImageDrawable(app.getUIUtilities().getIcon(R.drawable.ic_action_plus, activeColorResId));
 
 		backgroundCircle.setImageDrawable(backgroundIcon);
 		backgroundCircle.setOnClickListener(new View.OnClickListener() {
@@ -199,7 +208,7 @@ public class TrackColoringCard extends BaseCard implements ColorPickerListener {
 			public void onClick(View v) {
 				MapActivity mapActivity = getMapActivity();
 				if (mapActivity != null) {
-					CustomColorBottomSheet.showInstance(mapActivity.getSupportFragmentManager(), target, TrackColoringCard.INVALID_VALUE);
+					CustomColorBottomSheet.showInstance(mapActivity.getSupportFragmentManager(), target, null);
 				}
 			}
 		});
@@ -286,23 +295,27 @@ public class TrackColoringCard extends BaseCard implements ColorPickerListener {
 	}
 
 	@Override
-	public void onColorSelected(int prevColor, int newColor) {
-		if (prevColor == INVALID_VALUE && customColors.size() < 6) {
-			customColors.add(newColor);
-		} else if (!Algorithms.isEmpty(customColors)) {
+	public void onColorSelected(Integer prevColor, int newColor) {
+		if (prevColor != null) {
 			int index = customColors.indexOf(prevColor);
 			if (index != INVALID_VALUE) {
 				customColors.set(index, newColor);
+				saveCustomColorsToTracks(prevColor, newColor);
 			}
+			if (trackDrawInfo.getColor() == prevColor) {
+				trackDrawInfo.setColor(newColor);
+			}
+		} else if (customColors.size() < 6) {
+			customColors.add(newColor);
+			trackDrawInfo.setColor(newColor);
 		}
 		saveCustomColors();
-		saveCustomColorsToTracks(prevColor, newColor);
 		updateContent();
 	}
 
 	private void saveCustomColorsToTracks(int prevColor, int newColor) {
 		List gpxDataItems = app.getGpxDbHelper().getItems();
-		for (GPXDatabase.GpxDataItem dataItem : gpxDataItems) {
+		for (GpxDataItem dataItem : gpxDataItems) {
 			if (prevColor == dataItem.getColor()) {
 				app.getGpxDbHelper().updateColor(dataItem, newColor);
 			}
diff --git a/OsmAnd/src/net/osmand/plus/track/TrackWidthCard.java b/OsmAnd/src/net/osmand/plus/track/TrackWidthCard.java
index 81208971bb..2a8f34c024 100644
--- a/OsmAnd/src/net/osmand/plus/track/TrackWidthCard.java
+++ b/OsmAnd/src/net/osmand/plus/track/TrackWidthCard.java
@@ -8,11 +8,13 @@ import android.view.ViewGroup;
 import android.widget.TextView;
 
 import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
 import androidx.appcompat.content.res.AppCompatResources;
 import androidx.core.content.ContextCompat;
 import androidx.recyclerview.widget.LinearLayoutManager;
 import androidx.recyclerview.widget.RecyclerView;
 
+import com.github.ksoichiro.android.observablescrollview.ScrollUtils;
 import com.google.android.material.slider.Slider;
 
 import net.osmand.AndroidUtils;
@@ -24,6 +26,7 @@ import net.osmand.plus.dialogs.GpxAppearanceAdapter.AppearanceListItem;
 import net.osmand.plus.dialogs.GpxAppearanceAdapter.GpxAppearanceAdapterType;
 import net.osmand.plus.helpers.AndroidUiHelper;
 import net.osmand.plus.routepreparationmenu.cards.BaseCard;
+import net.osmand.plus.track.TrackAppearanceFragment.OnNeedScrollListener;
 import net.osmand.util.Algorithms;
 
 import java.util.List;
@@ -35,15 +38,19 @@ public class TrackWidthCard extends BaseCard {
 	private final static int CUSTOM_WIDTH_MAX = 24;
 
 	private TrackDrawInfo trackDrawInfo;
+	private OnNeedScrollListener onNeedScrollListener;
 
 	private AppearanceListItem selectedItem;
 	private List appearanceItems;
 
 	private GpxWidthAdapter widthAdapter;
+	private View sliderContainer;
 
-	public TrackWidthCard(MapActivity mapActivity, TrackDrawInfo trackDrawInfo) {
+	public TrackWidthCard(MapActivity mapActivity, TrackDrawInfo trackDrawInfo,
+	                      OnNeedScrollListener onNeedScrollListener) {
 		super(mapActivity);
 		this.trackDrawInfo = trackDrawInfo;
+		this.onNeedScrollListener = onNeedScrollListener;
 		appearanceItems = getWidthAppearanceItems();
 	}
 
@@ -71,13 +78,14 @@ public class TrackWidthCard extends BaseCard {
 		}
 	}
 
+	@Nullable
 	private AppearanceListItem getSelectedItem() {
 		if (selectedItem == null) {
 			String selectedWidth = trackDrawInfo.getWidth();
 			for (AppearanceListItem item : appearanceItems) {
-				if (Algorithms.objectEquals(item.getValue(), selectedWidth)
+				if (selectedWidth != null && (Algorithms.objectEquals(item.getValue(), selectedWidth)
 						|| Algorithms.isEmpty(selectedWidth) && Algorithms.isEmpty(item.getValue())
-						|| Algorithms.isInt(selectedWidth) && CUSTOM_WIDTH.equals(item.getAttrName())) {
+						|| Algorithms.isInt(selectedWidth) && CUSTOM_WIDTH.equals(item.getAttrName()))) {
 					selectedItem = item;
 					break;
 				}
@@ -106,11 +114,16 @@ public class TrackWidthCard extends BaseCard {
 		titleView.setText(R.string.select_track_width);
 
 		TextView descriptionView = view.findViewById(R.id.description);
-		descriptionView.setText(getSelectedItem().getLocalizedValue());
+		AppearanceListItem item = getSelectedItem();
+		if (item != null) {
+			descriptionView.setText(item.getLocalizedValue());
+		}
 	}
 
 	private void updateCustomWidthSlider() {
-		if (CUSTOM_WIDTH.equals(getSelectedItem().getAttrName())) {
+		sliderContainer = view.findViewById(R.id.slider_container);
+		AppearanceListItem item = getSelectedItem();
+		if (item != null && CUSTOM_WIDTH.equals(item.getAttrName())) {
 			Slider widthSlider = view.findViewById(R.id.width_slider);
 
 			widthSlider.setValueTo(CUSTOM_WIDTH_MAX);
@@ -143,9 +156,17 @@ public class TrackWidthCard extends BaseCard {
 				}
 			});
 			UiUtilities.setupSlider(widthSlider, nightMode, null);
-			AndroidUiHelper.updateVisibility(view.findViewById(R.id.slider_container), true);
+			ScrollUtils.addOnGlobalLayoutListener(sliderContainer, new Runnable() {
+				@Override
+				public void run() {
+					if (sliderContainer.getVisibility() == View.VISIBLE) {
+						onNeedScrollListener.onVerticalScrollNeeded(sliderContainer.getBottom());
+					}
+				}
+			});
+			AndroidUiHelper.updateVisibility(sliderContainer, true);
 		} else {
-			AndroidUiHelper.updateVisibility(view.findViewById(R.id.slider_container), false);
+			AndroidUiHelper.updateVisibility(sliderContainer, false);
 		}
 	}
 
diff --git a/OsmAnd/src/net/osmand/plus/views/layers/GPXLayer.java b/OsmAnd/src/net/osmand/plus/views/layers/GPXLayer.java
index 2f7cf6cb5f..3bb49859be 100644
--- a/OsmAnd/src/net/osmand/plus/views/layers/GPXLayer.java
+++ b/OsmAnd/src/net/osmand/plus/views/layers/GPXLayer.java
@@ -43,11 +43,13 @@ import net.osmand.plus.MapMarkersHelper.MapMarkersGroup;
 import net.osmand.plus.OsmandApplication;
 import net.osmand.plus.R;
 import net.osmand.plus.UiUtilities;
+import net.osmand.plus.activities.MapActivity;
 import net.osmand.plus.base.PointImageDrawable;
 import net.osmand.plus.mapcontextmenu.controllers.SelectedGpxMenuController.SelectedGpxPoint;
 import net.osmand.plus.mapcontextmenu.other.TrackChartPoints;
 import net.osmand.plus.render.OsmandRenderer;
 import net.osmand.plus.render.OsmandRenderer.RenderingContext;
+import net.osmand.plus.routepreparationmenu.MapRouteInfoMenu;
 import net.osmand.plus.settings.backend.OsmandSettings.CommonPreference;
 import net.osmand.plus.track.SaveGpxAsyncTask;
 import net.osmand.plus.track.TrackDrawInfo;
@@ -70,6 +72,7 @@ import org.apache.commons.logging.Log;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.HashMap;
+import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
 
@@ -234,7 +237,15 @@ public class GPXLayer extends OsmandMapLayer implements IContextMenuProvider, IM
 
 	@Override
 	public void onPrepareBufferImage(Canvas canvas, RotatedTileBox tileBox, DrawSettings settings) {
-		List selectedGPXFiles = selectedGpxHelper.getSelectedGPXFiles();
+		List selectedGPXFiles = new ArrayList<>(selectedGpxHelper.getSelectedGPXFiles());
+
+		Iterator iterator = selectedGPXFiles.iterator();
+		while (iterator.hasNext()) {
+			SelectedGpxFile selectedGpxFile = iterator.next();
+			if (selectedGpxFile.isFollowTrack(view.getApplication()) && !showTrackToFollow()) {
+				iterator.remove();
+			}
+		}
 		cache.clear();
 		if (!selectedGPXFiles.isEmpty()) {
 			drawSelectedFilesSegments(canvas, tileBox, selectedGPXFiles, settings);
@@ -456,12 +467,16 @@ public class GPXLayer extends OsmandMapLayer implements IContextMenuProvider, IM
 		int endX = (int) tileBox.getPixXFromLatLon(end.lat, end.lon);
 		int endY = (int) tileBox.getPixYFromLatLon(end.lat, end.lon);
 
-		QuadRect startRect = calculateRect(startX, startY, startPointIcon.getIntrinsicWidth(), startPointIcon.getIntrinsicHeight());
-		QuadRect endRect = calculateRect(endX, endY, finishPointIcon.getIntrinsicWidth(), finishPointIcon.getIntrinsicHeight());
+		int iconSize = AndroidUtils.dpToPx(view.getContext(), 14);
+		QuadRect startRectWithoutShadow = calculateRect(startX, startY, iconSize, iconSize);
+		QuadRect endRectWithoutShadow = calculateRect(endX, endY, iconSize, iconSize);
 
-		if (QuadRect.intersects(startRect, endRect)) {
-			drawPoint(canvas, startRect, startAndFinishIcon);
+		if (QuadRect.intersects(startRectWithoutShadow, endRectWithoutShadow)) {
+			QuadRect startAndFinishRect = calculateRect(startX, startY, startAndFinishIcon.getIntrinsicWidth(), startAndFinishIcon.getIntrinsicHeight());
+			drawPoint(canvas, startAndFinishRect, startAndFinishIcon);
 		} else {
+			QuadRect startRect = calculateRect(startX, startY, startPointIcon.getIntrinsicWidth(), startPointIcon.getIntrinsicHeight());
+			QuadRect endRect = calculateRect(endX, endY, finishPointIcon.getIntrinsicWidth(), finishPointIcon.getIntrinsicHeight());
 			drawPoint(canvas, startRect, startPointIcon);
 			drawPoint(canvas, endRect, finishPointIcon);
 		}
@@ -710,6 +725,21 @@ public class GPXLayer extends OsmandMapLayer implements IContextMenuProvider, IM
 				|| gpxFile.path.equals(trackDrawInfo.getFilePath()));
 	}
 
+	private boolean showTrackToFollow() {
+		if (view.getContext() instanceof MapActivity) {
+			MapActivity mapActivity = (MapActivity) view.getContext();
+			OsmandApplication app = mapActivity.getMyApplication();
+			MapRouteInfoMenu routeInfoMenu = mapActivity.getMapRouteInfoMenu();
+			return !app.getSelectedGpxHelper().shouldHideTrackToFollow()
+					|| routeInfoMenu.isVisible()
+					|| app.getRoutingHelper().isFollowingMode()
+					|| MapRouteInfoMenu.followTrackVisible
+					|| MapRouteInfoMenu.chooseRoutesVisible
+					|| MapRouteInfoMenu.waypointsVisible;
+		}
+		return false;
+	}
+
 	private boolean isPointVisited(WptPt o) {
 		boolean visit = false;
 		String visited = o.getExtensionsToRead().get("VISITED_KEY");
@@ -887,12 +917,12 @@ public class GPXLayer extends OsmandMapLayer implements IContextMenuProvider, IM
 
 	@Override
 	public boolean disableSingleTap() {
-		return false;
+		return isInTrackAppearanceMode();
 	}
 
 	@Override
 	public boolean disableLongPressOnMap() {
-		return false;
+		return isInTrackAppearanceMode();
 	}
 
 	@Override
diff --git a/OsmAnd/src/net/osmand/plus/views/layers/MapControlsLayer.java b/OsmAnd/src/net/osmand/plus/views/layers/MapControlsLayer.java
index cd6bf62ced..7663a4845b 100644
--- a/OsmAnd/src/net/osmand/plus/views/layers/MapControlsLayer.java
+++ b/OsmAnd/src/net/osmand/plus/views/layers/MapControlsLayer.java
@@ -58,7 +58,6 @@ import net.osmand.plus.rastermaps.OsmandRasterMapsPlugin;
 import net.osmand.plus.routepreparationmenu.MapRouteInfoMenu;
 import net.osmand.plus.routepreparationmenu.MapRouteInfoMenu.PointType;
 import net.osmand.plus.routing.RoutingHelper;
-import net.osmand.plus.routing.TransportRoutingHelper;
 import net.osmand.plus.search.QuickSearchDialogFragment.QuickSearchType;
 import net.osmand.plus.settings.backend.ApplicationMode;
 import net.osmand.plus.settings.backend.OsmAndAppCustomization;
@@ -433,7 +432,7 @@ public class MapControlsLayer extends OsmandMapLayer {
 			}
 		} else {
 			ActivityCompat.requestPermissions(mapActivity,
-					new String[] {Manifest.permission.ACCESS_FINE_LOCATION},
+					new String[]{Manifest.permission.ACCESS_FINE_LOCATION},
 					OsmAndLocationProvider.REQUEST_LOCATION_PERMISSION);
 		}
 	}
@@ -478,7 +477,7 @@ public class MapControlsLayer extends OsmandMapLayer {
 	public void navigateButton() {
 		if (!OsmAndLocationProvider.isLocationPermissionAvailable(mapActivity)) {
 			ActivityCompat.requestPermissions(mapActivity,
-					new String[] {Manifest.permission.ACCESS_FINE_LOCATION},
+					new String[]{Manifest.permission.ACCESS_FINE_LOCATION},
 					REQUEST_LOCATION_FOR_NAVIGATION_FAB_PERMISSION);
 		} else {
 			final MapContextMenu menu = mapActivity.getContextMenu();
@@ -504,8 +503,8 @@ public class MapControlsLayer extends OsmandMapLayer {
 				} else {
 					AlertDialog.Builder bld = new AlertDialog.Builder(mapActivity);
 					bld.setTitle(R.string.new_directions_point_dialog);
-					final int[] defaultVls = new int[] {0};
-					bld.setSingleChoiceItems(new String[] {
+					final int[] defaultVls = new int[]{0};
+					bld.setSingleChoiceItems(new String[]{
 							mapActivity.getString(R.string.clear_intermediate_points),
 							mapActivity.getString(R.string.keep_intermediate_points)
 					}, 0, new DialogInterface.OnClickListener() {
@@ -847,7 +846,6 @@ public class MapControlsLayer extends OsmandMapLayer {
 		// default buttons
 		boolean routePlanningMode = false;
 		RoutingHelper rh = mapActivity.getRoutingHelper();
-		TransportRoutingHelper trh = mapActivity.getRoutingHelper().getTransportRoutingHelper();
 		if (rh.isRoutePlanningMode()) {
 			routePlanningMode = true;
 		} else if ((rh.isRouteCalculated() || rh.isRouteBeingCalculated()) && !rh.isFollowingMode()) {
@@ -860,33 +858,26 @@ public class MapControlsLayer extends OsmandMapLayer {
 				((app.accessibilityEnabled() || (System.currentTimeMillis() - touchEvent < TIMEOUT_TO_SHOW_BUTTONS)) && routeFollowingMode);
 		boolean routeDialogOpened = mapRouteInfoMenu.isVisible() || (showRouteCalculationControls && mapRouteInfoMenu.needShowMenu());
 		updateMyLocationVisibility(backToLocationControl, rh, routeDialogOpened || contextMenuOpened);
-		boolean showButtons = (showRouteCalculationControls || !routeFollowingMode)
+		//routePlanningBtn.setIconResId(routeFollowingMode ? R.drawable.ic_action_info_dark : R.drawable.ic_action_gdirections_dark);
+
+		updateRoutePlaningButton(rh, routePlanningMode);
+
+		boolean showBottomMenuButtons = (showRouteCalculationControls || !routeFollowingMode)
 				&& !isInMovingMarkerMode() && !isInGpxDetailsMode() && !isInMeasurementToolMode()
 				&& !isInPlanRouteMode() && !contextMenuOpened && !isInChoosingRoutesMode()
-				&& !isInWaypointsChoosingMode() && !isInTrackAppearanceMode();
-		//routePlanningBtn.setIconResId(routeFollowingMode ? R.drawable.ic_action_info_dark : R.drawable.ic_action_gdirections_dark);
-		int routePlanningBtnImage = mapRouteInfoMenu.getRoutePlanningBtnImage();
-		if (routePlanningBtnImage != 0) {
-			routePlanningBtn.setIconResId(routePlanningBtnImage);
-			routePlanningBtn.setIconColorId(R.color.color_myloc_distance);
-		} else if (rh.isFollowingMode()) {
-			routePlanningBtn.setIconResId(R.drawable.ic_action_start_navigation);
-			routePlanningBtn.setIconColorId(R.color.color_myloc_distance);
-		} else if (routePlanningMode) {
-			routePlanningBtn.setIconResId(R.drawable.ic_action_gdirections_dark);
-			routePlanningBtn.setIconColorId(R.color.color_myloc_distance);
-		} else {
-			routePlanningBtn.setIconResId(R.drawable.ic_action_gdirections_dark);
-			routePlanningBtn.resetIconColors();
-		}
-		routePlanningBtn.updateVisibility(showButtons);
-		menuControl.updateVisibility(showButtons);
+				&& !isInWaypointsChoosingMode() && !isInFollowTrackMode() && !isInTrackAppearanceMode();
+		routePlanningBtn.updateVisibility(showBottomMenuButtons);
+		menuControl.updateVisibility(showBottomMenuButtons);
 
+		boolean showZoomButtons = !routeDialogOpened && !contextMenuOpened && !isInTrackAppearanceMode()
+				&& (!isInGpxApproximationMode() || !isPotrait())
+				&& !isInFollowTrackMode() && (!isInChoosingRoutesMode() || !isInWaypointsChoosingMode() || !portrait);
+		mapZoomIn.updateVisibility(showZoomButtons);
+		mapZoomOut.updateVisibility(showZoomButtons);
 
-		mapZoomIn.updateVisibility(!routeDialogOpened && !contextMenuOpened && !isInTrackAppearanceMode() && (!isInChoosingRoutesMode() || !isInWaypointsChoosingMode() || !portrait));
-		mapZoomOut.updateVisibility(!routeDialogOpened && !contextMenuOpened && !isInTrackAppearanceMode() && (!isInChoosingRoutesMode() || !isInWaypointsChoosingMode() || !portrait));
-		boolean forceHideCompass = routeDialogOpened || trackDialogOpened
-				|| isInMeasurementToolMode() || isInPlanRouteMode() || contextMenuOpened || isInChoosingRoutesMode() || isInTrackAppearanceMode() || isInWaypointsChoosingMode();
+		boolean forceHideCompass = routeDialogOpened || trackDialogOpened || isInMeasurementToolMode()
+				|| isInPlanRouteMode() || contextMenuOpened || isInChoosingRoutesMode()
+				|| isInTrackAppearanceMode() || isInWaypointsChoosingMode() || isInFollowTrackMode();
 		compassHud.forceHideCompass = forceHideCompass;
 		compassHud.updateVisibility(!forceHideCompass && shouldShowCompass());
 
@@ -895,10 +886,11 @@ public class MapControlsLayer extends OsmandMapLayer {
 		if (layersHud.setIconResId(appMode.getIconRes())) {
 			layersHud.update(app, isNight);
 		}
-		layersHud.updateVisibility(!routeDialogOpened && !trackDialogOpened && !isInMeasurementToolMode() && !isInPlanRouteMode()
-				&& !contextMenuOpened && !isInChoosingRoutesMode() && !isInTrackAppearanceMode() && !isInWaypointsChoosingMode());
-		quickSearchHud.updateVisibility(!routeDialogOpened && !trackDialogOpened && !isInMeasurementToolMode() && !isInPlanRouteMode()
-				&& !contextMenuOpened && !isInChoosingRoutesMode() && !isInTrackAppearanceMode() && !isInWaypointsChoosingMode());
+		boolean showTopButtons = !routeDialogOpened && !trackDialogOpened && !contextMenuOpened
+				&& !isInMeasurementToolMode() && !isInPlanRouteMode()  && !isInChoosingRoutesMode()
+				&& !isInTrackAppearanceMode() && !isInWaypointsChoosingMode() && !isInFollowTrackMode();
+		layersHud.updateVisibility(showTopButtons);
+		quickSearchHud.updateVisibility(showTopButtons);
 
 		if (mapView.isZooming()) {
 			lastZoom = System.currentTimeMillis();
@@ -948,6 +940,23 @@ public class MapControlsLayer extends OsmandMapLayer {
 		}
 	}
 
+	private void updateRoutePlaningButton(RoutingHelper routingHelper, boolean routePlanningMode) {
+		int routePlanningBtnImage = mapRouteInfoMenu.getRoutePlanningBtnImage();
+		if (routePlanningBtnImage != 0) {
+			routePlanningBtn.setIconResId(routePlanningBtnImage);
+			routePlanningBtn.setIconColorId(R.color.color_myloc_distance);
+		} else if (routingHelper.isFollowingMode()) {
+			routePlanningBtn.setIconResId(R.drawable.ic_action_start_navigation);
+			routePlanningBtn.setIconColorId(R.color.color_myloc_distance);
+		} else if (routePlanningMode) {
+			routePlanningBtn.setIconResId(R.drawable.ic_action_gdirections_dark);
+			routePlanningBtn.setIconColorId(R.color.color_myloc_distance);
+		} else {
+			routePlanningBtn.setIconResId(R.drawable.ic_action_gdirections_dark);
+			routePlanningBtn.resetIconColors();
+		}
+	}
+
 	private boolean shouldShowCompass() {
 		float mapRotate = mapActivity.getMapView().getRotate();
 		return forceShowCompass || mapRotate != 0
@@ -985,9 +994,9 @@ public class MapControlsLayer extends OsmandMapLayer {
 
 	public void updateMyLocationVisibility(MapHudButton backToLocationControl, RoutingHelper rh, boolean dialogOpened) {
 		boolean tracked = mapActivity.getMapViewTrackingUtilities().isMapLinkedToLocation();
-		boolean visible = !(tracked && rh.isFollowingMode());
+		boolean visible = !(tracked && rh.isFollowingMode()) && (!isInGpxApproximationMode() || !isPotrait());
 		backToLocationControl.updateVisibility(visible && !dialogOpened && !isInPlanRouteMode()
-				&& !isInTrackAppearanceMode() && (!isInChoosingRoutesMode() || !isInWaypointsChoosingMode() || !isPotrait()));
+				&& !isInTrackAppearanceMode() && (!isInChoosingRoutesMode() || !isInWaypointsChoosingMode() || !isInFollowTrackMode() || !isPotrait()));
 	}
 
 	public boolean onSingleTap(PointF point, RotatedTileBox tileBox) {
@@ -1036,7 +1045,7 @@ public class MapControlsLayer extends OsmandMapLayer {
 	}
 
 	public void showTransparencyBar(CommonPreference transparenPreference,
-									boolean isTransparencyBarEnabled) {
+	                                boolean isTransparencyBarEnabled) {
 		this.isTransparencyBarEnabled = isTransparencyBarEnabled;
 		ApplicationMode appMode = app.getSettings().getApplicationMode();
 		if (MapControlsLayer.transparencySetting != transparenPreference) {
@@ -1295,12 +1304,20 @@ public class MapControlsLayer extends OsmandMapLayer {
 		return mapActivity.getMapLayers().getGpxLayer().isInTrackAppearanceMode();
 	}
 
+	private boolean isInGpxApproximationMode() {
+		return mapActivity.getMapLayers().getMeasurementToolLayer().isTapsDisabled();
+	}
+
 	private boolean isInChoosingRoutesMode() {
 		return MapRouteInfoMenu.chooseRoutesVisible;
 	}
 
 	private boolean isInWaypointsChoosingMode() {
-		return  MapRouteInfoMenu.waypointsVisible;
+		return MapRouteInfoMenu.waypointsVisible;
+	}
+
+	private boolean isInFollowTrackMode() {
+		return  MapRouteInfoMenu.followTrackVisible;
 	}
 
 	public static View.OnLongClickListener getOnClickMagnifierListener(final OsmandMapTileView view) {
diff --git a/OsmAnd/src/net/osmand/plus/views/layers/MapQuickActionLayer.java b/OsmAnd/src/net/osmand/plus/views/layers/MapQuickActionLayer.java
index 722b5133c6..0353776edb 100644
--- a/OsmAnd/src/net/osmand/plus/views/layers/MapQuickActionLayer.java
+++ b/OsmAnd/src/net/osmand/plus/views/layers/MapQuickActionLayer.java
@@ -426,6 +426,7 @@ public class MapQuickActionLayer extends OsmandMapLayer implements QuickActionRe
                 mapRouteInfoMenu.isVisible() ||
                 MapRouteInfoMenu.chooseRoutesVisible ||
                 MapRouteInfoMenu.waypointsVisible ||
+                MapRouteInfoMenu.followTrackVisible ||
                 contextMenu.isVisible() && contextMenuMenuFragment != null && !contextMenuMenuFragment.isRemoving() ||
                 contextMenu.isVisible() && contextMenuMenuFragment != null && contextMenuMenuFragment.isAdded() ||
                 multiSelectionMenu.isVisible() && multiMenuFragment != null && multiMenuFragment.isAdded() ||
diff --git a/OsmAnd/src/net/osmand/plus/views/mapwidgets/LanesControl.java b/OsmAnd/src/net/osmand/plus/views/mapwidgets/LanesControl.java
index 05f7a7586c..45ba996045 100644
--- a/OsmAnd/src/net/osmand/plus/views/mapwidgets/LanesControl.java
+++ b/OsmAnd/src/net/osmand/plus/views/mapwidgets/LanesControl.java
@@ -18,7 +18,7 @@ import net.osmand.plus.routing.RouteCalculationResult;
 import net.osmand.plus.routing.RouteDirectionInfo;
 import net.osmand.plus.routing.RoutingHelper;
 import net.osmand.plus.settings.backend.OsmandSettings;
-import net.osmand.plus.views.OsmandMapLayer;
+import net.osmand.plus.views.OsmandMapLayer.DrawSettings;
 import net.osmand.plus.views.OsmandMapTileView;
 import net.osmand.plus.views.mapwidgets.widgets.TextInfoWidget;
 import net.osmand.router.RouteResultPreparation;
@@ -61,7 +61,7 @@ public class LanesControl {
 		TextInfoWidget.updateTextColor(lanesText, lanesShadowText, textColor, textShadowColor, textBold, shadowRadius);
 	}
 
-	public boolean updateInfo(OsmandMapLayer.DrawSettings drawSettings) {
+	public boolean updateInfo(DrawSettings drawSettings) {
 		boolean visible = false;
 		int locimminent = -1;
 		int[] loclanes = null;
@@ -105,7 +105,8 @@ public class LanesControl {
 				}
 			}
 		}
-		visible = loclanes != null && loclanes.length > 0 && !MapRouteInfoMenu.chooseRoutesVisible && !MapRouteInfoMenu.waypointsVisible;
+		visible = loclanes != null && loclanes.length > 0 && !MapRouteInfoMenu.chooseRoutesVisible
+				&& !MapRouteInfoMenu.waypointsVisible && !MapRouteInfoMenu.followTrackVisible;
 		if (visible) {
 			if (!Arrays.equals(lanesDrawable.lanes, loclanes) ||
 					(locimminent == 0) != lanesDrawable.imminent) {
diff --git a/OsmAnd/src/net/osmand/plus/views/mapwidgets/MapInfoWidgetsFactory.java b/OsmAnd/src/net/osmand/plus/views/mapwidgets/MapInfoWidgetsFactory.java
index d01f042bd8..9979b3820b 100644
--- a/OsmAnd/src/net/osmand/plus/views/mapwidgets/MapInfoWidgetsFactory.java
+++ b/OsmAnd/src/net/osmand/plus/views/mapwidgets/MapInfoWidgetsFactory.java
@@ -1232,7 +1232,8 @@ public class MapInfoWidgetsFactory {
 			boolean visible = settings.SHOW_COORDINATES_WIDGET.get() && map.getContextMenu().shouldShowTopControls()
 					&& map.getMapRouteInfoMenu().shouldShowTopControls() && !map.isTopToolbarActive()
 					&& !map.getMapLayers().getGpxLayer().isInTrackAppearanceMode()
-					&& !MapRouteInfoMenu.chooseRoutesVisible && !MapRouteInfoMenu.waypointsVisible;
+					&& !MapRouteInfoMenu.chooseRoutesVisible && !MapRouteInfoMenu.waypointsVisible
+					&& !MapRouteInfoMenu.followTrackVisible;
 
 			updateVisibility(visible);
 			if (visible) {