Merge pull request #7714 from osmandapp/issue_7576

fix for #7576
diff --git a/OsmAnd/res/drawable-hdpi/ic_action_display_position_bottom.png b/OsmAnd/res/drawable-hdpi/ic_action_display_position_bottom.png
new file mode 100644
index 0000000..2c1cbc9
--- /dev/null
+++ b/OsmAnd/res/drawable-hdpi/ic_action_display_position_bottom.png
Binary files differ
diff --git a/OsmAnd/res/drawable-hdpi/ic_action_display_position_center.png b/OsmAnd/res/drawable-hdpi/ic_action_display_position_center.png
new file mode 100644
index 0000000..3a7d8c4
--- /dev/null
+++ b/OsmAnd/res/drawable-hdpi/ic_action_display_position_center.png
Binary files differ
diff --git a/OsmAnd/res/drawable-mdpi/ic_action_display_position_bottom.png b/OsmAnd/res/drawable-mdpi/ic_action_display_position_bottom.png
new file mode 100644
index 0000000..9f82ccc
--- /dev/null
+++ b/OsmAnd/res/drawable-mdpi/ic_action_display_position_bottom.png
Binary files differ
diff --git a/OsmAnd/res/drawable-mdpi/ic_action_display_position_center.png b/OsmAnd/res/drawable-mdpi/ic_action_display_position_center.png
new file mode 100644
index 0000000..f157174
--- /dev/null
+++ b/OsmAnd/res/drawable-mdpi/ic_action_display_position_center.png
Binary files differ
diff --git a/OsmAnd/res/drawable-xhdpi/ic_action_display_position_bottom.png b/OsmAnd/res/drawable-xhdpi/ic_action_display_position_bottom.png
new file mode 100644
index 0000000..edae19e
--- /dev/null
+++ b/OsmAnd/res/drawable-xhdpi/ic_action_display_position_bottom.png
Binary files differ
diff --git a/OsmAnd/res/drawable-xhdpi/ic_action_display_position_center.png b/OsmAnd/res/drawable-xhdpi/ic_action_display_position_center.png
new file mode 100644
index 0000000..3e8dbb0
--- /dev/null
+++ b/OsmAnd/res/drawable-xhdpi/ic_action_display_position_center.png
Binary files differ
diff --git a/OsmAnd/res/drawable-xxhdpi/ic_action_display_position_bottom.png b/OsmAnd/res/drawable-xxhdpi/ic_action_display_position_bottom.png
new file mode 100644
index 0000000..c4d3960
--- /dev/null
+++ b/OsmAnd/res/drawable-xxhdpi/ic_action_display_position_bottom.png
Binary files differ
diff --git a/OsmAnd/res/drawable-xxhdpi/ic_action_display_position_center.png b/OsmAnd/res/drawable-xxhdpi/ic_action_display_position_center.png
new file mode 100644
index 0000000..29d2303
--- /dev/null
+++ b/OsmAnd/res/drawable-xxhdpi/ic_action_display_position_center.png
Binary files differ
diff --git a/OsmAnd/res/drawable-xxxhdpi/ic_action_display_position_bottom.png b/OsmAnd/res/drawable-xxxhdpi/ic_action_display_position_bottom.png
new file mode 100644
index 0000000..c16e924
--- /dev/null
+++ b/OsmAnd/res/drawable-xxxhdpi/ic_action_display_position_bottom.png
Binary files differ
diff --git a/OsmAnd/res/drawable-xxxhdpi/ic_action_display_position_center.png b/OsmAnd/res/drawable-xxxhdpi/ic_action_display_position_center.png
new file mode 100644
index 0000000..459525e
--- /dev/null
+++ b/OsmAnd/res/drawable-xxxhdpi/ic_action_display_position_center.png
Binary files differ
diff --git a/OsmAnd/res/layout/bottom_sheet_select_folder.xml b/OsmAnd/res/layout/bottom_sheet_select_folder.xml
index 4693c7d..9db0e3a 100644
--- a/OsmAnd/res/layout/bottom_sheet_select_folder.xml
+++ b/OsmAnd/res/layout/bottom_sheet_select_folder.xml
@@ -9,7 +9,8 @@
 	<net.osmand.plus.widgets.OsmandTextFieldBoxes
 		android:id="@+id/edit_text_otfb"
 		android:layout_width="match_parent"
-		android:layout_height="@dimen/dialog_button_ex_height"
+		android:layout_height="wrap_content"
+		android:minHeight="@dimen/dialog_button_ex_height"
 		android:layout_marginTop="@dimen/text_margin_small"
 		android:paddingLeft="@dimen/content_padding"
 		android:paddingRight="@dimen/content_padding"
@@ -19,10 +20,11 @@
 
 		<studio.carbonylgroup.textfieldboxes.ExtendedEditText
 			android:id="@+id/text"
+			android:inputType="textMultiLine|textNoSuggestions"
 			android:layout_width="match_parent"
 			android:layout_height="wrap_content"
 			android:layout_gravity="center_vertical"
-			android:maxLines="1"
+			android:maxLines="10"
 			android:textColor="?android:textColorPrimary"
 			tools:text="Folder path ... " />
 
diff --git a/OsmAnd/res/layout/data_storage_memory_used_item.xml b/OsmAnd/res/layout/data_storage_memory_used_item.xml
index 0653b8b..abcb38e 100644
--- a/OsmAnd/res/layout/data_storage_memory_used_item.xml
+++ b/OsmAnd/res/layout/data_storage_memory_used_item.xml
@@ -2,46 +2,71 @@
 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 	xmlns:osmand="http://schemas.android.com/apk/res-auto"
 	xmlns:tools="http://schemas.android.com/tools"
-	android:background="?attr/list_background_color"
 	android:layout_width="match_parent"
-	android:layout_height="@dimen/card_row_min_height"
-	android:orientation="horizontal">
+	android:layout_height="wrap_content"
+	android:background="?attr/list_background_color"
+	android:orientation="vertical">
 
-	<android.support.v7.widget.AppCompatImageView
-		android:id="@android:id/icon"
-		android:layout_width="@dimen/standard_icon_size"
-		android:layout_height="@dimen/standard_icon_size"
-		android:layout_gravity="center"
-		android:layout_marginLeft="@dimen/content_padding"
-		android:layout_marginRight="@dimen/content_padding"
-		android:src="@drawable/mm_storage_tank"
-		android:tint="?attr/default_icon_color"
-		tools:tint="?attr/default_icon_color" />
+	<LinearLayout
+		android:layout_width="match_parent"
+		android:layout_height="@dimen/card_row_min_height">
 
-	<net.osmand.plus.widgets.TextViewEx
-		android:id="@android:id/title"
-		android:layout_width="0dp"
+		<android.support.v7.widget.AppCompatImageView
+			android:id="@android:id/icon"
+			android:layout_width="@dimen/standard_icon_size"
+			android:layout_height="@dimen/standard_icon_size"
+			android:layout_gravity="center"
+			android:layout_marginLeft="@dimen/content_padding"
+			android:layout_marginRight="@dimen/content_padding"
+			android:src="@drawable/mm_storage_tank"
+			android:tint="?attr/default_icon_color"
+			tools:tint="?attr/default_icon_color" />
+
+		<net.osmand.plus.widgets.TextViewEx
+			android:id="@android:id/title"
+			android:layout_width="0dp"
+			android:layout_height="wrap_content"
+			android:layout_gravity="center_vertical"
+			android:layout_weight="1"
+			android:paddingLeft="@dimen/content_padding"
+			android:textColor="?android:textColorPrimary"
+			android:textSize="@dimen/default_desc_text_size"
+			osmand:typeface="@string/font_roboto_regular"
+			tools:text="Internal application memory" />
+
+		<net.osmand.plus.widgets.TextViewEx
+			android:id="@+id/memory"
+			android:layout_width="wrap_content"
+			android:layout_height="match_parent"
+			android:gravity="center_vertical"
+			android:background="@null"
+			android:clickable="true"
+			android:focusable="true"
+			android:paddingLeft="@dimen/content_padding"
+			android:paddingRight="@dimen/content_padding"
+			android:textSize="@dimen/default_desc_text_size"
+			osmand:typeface="@string/font_roboto_regular"
+			tools:text="6.7 GB" />
+	</LinearLayout>
+
+	<LinearLayout
+		android:id="@+id/divider"
+		android:layout_width="match_parent"
 		android:layout_height="wrap_content"
-		android:layout_gravity="center_vertical"
-		android:layout_weight="1"
-		android:textColor="?android:textColorPrimary"
-		android:textSize="@dimen/default_desc_text_size"
-		android:paddingLeft="@dimen/content_padding"
-		osmand:typeface="@string/font_roboto_regular"
-		tools:text="Internal application memory" />
+		android:background="?attr/list_background_color"
+		android:visibility="gone"
+		android:orientation="vertical">
 
-	<net.osmand.plus.widgets.TextViewEx
-		android:id="@+id/memory"
-		android:layout_width="wrap_content"
-		android:layout_height="wrap_content"
-		android:layout_gravity="center_vertical"
-		android:background="@null"
-		android:clickable="true"
-		android:focusable="true"
-		android:paddingLeft="@dimen/content_padding"
-		android:paddingRight="@dimen/content_padding"
-		android:textSize="@dimen/default_desc_text_size"
-		osmand:typeface="@string/font_roboto_regular"
-		tools:text="6.7 GB" />
+		<View
+			android:layout_width="match_parent"
+			android:layout_height="@dimen/content_padding_half" />
+
+		<View
+			android:layout_width="match_parent"
+			android:layout_height="1dp"
+			android:background="?attr/dashboard_divider"
+			android:focusable="false" />
+
+	</LinearLayout>
 
 </LinearLayout>
\ No newline at end of file
diff --git a/OsmAnd/res/layout/divider_padding_half.xml b/OsmAnd/res/layout/divider_padding_half.xml
deleted file mode 100644
index 55fec44..0000000
--- a/OsmAnd/res/layout/divider_padding_half.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
-	android:orientation="vertical"
-	android:layout_width="match_parent"
-	android:layout_height="wrap_content"
-	android:background="?attr/list_background_color">
-
-	<View
-		android:id="@+id/topSpace"
-		android:layout_width="match_parent"
-		android:layout_height="@dimen/content_padding_half" />
-
-	<View
-		android:id="@+id/divider"
-		android:layout_width="match_parent"
-		android:layout_height="1dp"
-		android:background="?attr/dashboard_divider"
-		android:focusable="false" />
-
-	<View
-		android:id="@+id/bottomSpace"
-		android:layout_width="match_parent"
-		android:layout_height="@dimen/content_padding_half" />
-
-</LinearLayout>
\ No newline at end of file
diff --git a/OsmAnd/res/layout/map_hud_top.xml b/OsmAnd/res/layout/map_hud_top.xml
index 4bed940..6d1c90b 100644
--- a/OsmAnd/res/layout/map_hud_top.xml
+++ b/OsmAnd/res/layout/map_hud_top.xml
@@ -234,6 +234,7 @@
                     android:layout_width="@dimen/map_address_height"
                     android:layout_height="@dimen/map_address_height"
                     android:background="@drawable/btn_circle_transparent"
+                    android:layout_gravity="center_vertical"
                     tools:src="@drawable/ic_action_test_light"/>
 
                 <ImageButton
@@ -242,6 +243,7 @@
                     android:layout_width="@dimen/map_address_height"
                     android:layout_height="@dimen/map_address_height"
                     android:background="@drawable/bottom_shadow"
+                    android:layout_gravity="center_vertical"
                     tools:src="@drawable/ic_action_test_light"/>
             </LinearLayout>
         </FrameLayout>
diff --git a/OsmAnd/res/values-be/strings.xml b/OsmAnd/res/values-be/strings.xml
index 7b7f274..334a91e 100644
--- a/OsmAnd/res/values-be/strings.xml
+++ b/OsmAnd/res/values-be/strings.xml
@@ -3290,8 +3290,6 @@
     <string name="shared_string_by_default">Прадвызначана</string>
     <string name="change_data_storage_full_description">Перамясціць файлы даных OsmAnd у новае месца\?
 \n%1$s &gt; %2$s</string>
-    <string name="data_storage_preference_summary">%1$s • выкарыстоўваецца %2$s Гб</string>
-    <string name="data_storage_space_description">Вольна %1$s • %2$s / %3$s Гб</string>
     <string name="enter_path_to_folder">Увядзіце шлях да каталога</string>
     <string name="shared_string_select_folder">Абраць каталог</string>
 </resources>
\ No newline at end of file
diff --git a/OsmAnd/res/values-ca/strings.xml b/OsmAnd/res/values-ca/strings.xml
index cd5001b..671273f 100644
--- a/OsmAnd/res/values-ca/strings.xml
+++ b/OsmAnd/res/values-ca/strings.xml
@@ -3268,8 +3268,6 @@
     <string name="route_parameters">Paràmetres de la ruta</string>
     <string name="change_data_storage_full_description">Voleu moure els arxius de dades OsmAnd a una nova destinació\?
 \n%1$s &gt; %2$s</string>
-    <string name="data_storage_preference_summary">%1$s • Usat %2$s GB</string>
-    <string name="data_storage_space_description">Lliure %1$s • %2$s / %3$s GB</string>
     <string name="enter_path_to_folder">Introduïu el camí a la carpeta</string>
     <string name="shared_string_select_folder">Seleccioneu la carpeta</string>
     <string name="paste_Osmand_data_folder_path">Enganxa el camí a la carpeta amb les dades d\'OsmAnd</string>
diff --git a/OsmAnd/res/values-da/strings.xml b/OsmAnd/res/values-da/strings.xml
index a3835c0..cf4197f 100644
--- a/OsmAnd/res/values-da/strings.xml
+++ b/OsmAnd/res/values-da/strings.xml
@@ -3299,8 +3299,6 @@
     <string name="download_detailed_map">Hent detaljeret %s kort, for at se området.</string>
     <string name="change_data_storage_full_description">Flyt datafiler til den nye destination\?
 \n%1$s&gt;%2$s</string>
-    <string name="data_storage_preference_summary">%1$s • Anvendt %2$s GB</string>
-    <string name="data_storage_space_description">Tilgængeligt %1$s GB • Total %2$s GB</string>
     <string name="enter_path_to_folder">Indtast sti til mappen</string>
     <string name="shared_string_select_folder">Vælg mappe</string>
     <string name="paste_Osmand_data_folder_path">Indsæt sti til mappen med data</string>
diff --git a/OsmAnd/res/values-de/phrases.xml b/OsmAnd/res/values-de/phrases.xml
index 317f618..03b2cf6 100644
--- a/OsmAnd/res/values-de/phrases.xml
+++ b/OsmAnd/res/values-de/phrases.xml
@@ -3730,4 +3730,5 @@
     <string name="poi_craft_cabinet_maker">Möbeltischler</string>
     <string name="poi_charge">Gebühr</string>
     <string name="poi_pet_grooming">Haustierpflege</string>
+    <string name="poi_atm_yes">Geldausgabeautomat: ja</string>
 </resources>
\ No newline at end of file
diff --git a/OsmAnd/res/values-de/strings.xml b/OsmAnd/res/values-de/strings.xml
index 5c9a04c..e1d175b 100644
--- a/OsmAnd/res/values-de/strings.xml
+++ b/OsmAnd/res/values-de/strings.xml
@@ -2460,8 +2460,13 @@
     <string name="max_min">max/min</string>
     <string name="shared_string_reset">Zurücksetzen</string>
     <string name="ascent_descent">Aufstieg/Abstieg</string>
+    <string name="track_storage_directory">Track Speicherort</string>
+    <string name="track_storage_directory_descrp">Tracks können im Rec Ordner oder in Monats- bzw. Tagesordnern gespeichert werden.</string>
+    <string name="store_tracks_in_rec_directory">Aufgezeichnete Tracks im Rec Ordner speichern</string>
     <string name="store_tracks_in_monthly_directories">Aufgezeichnete Tracks in Monatsordnern speichern</string>
     <string name="store_tracks_in_monthly_directories_descrp">Aufgezeichnete Tracks in nach Aufzeichnungsmonat benannten Unterordnern speichern (z. B. 2018-01).</string>
+    <string name="store_tracks_in_daily_directories">Aufgezeichnete Tracks in Tagesordnern speichern</string>
+    <string name="store_tracks_in_daily_directories_descrp">Aufgezeichnete Tracks in nach Aufzeichnungstag benannten Unterordnern speichern (z. B. 2018-01).</string>
     <string name="map_widget_ruler_control">Zirkel</string>
     <string name="of">%1$d von %2$d</string>
     <string name="moving_time">Zeit in Bewegung</string>
@@ -3299,8 +3304,6 @@
     <string name="download_detailed_map">Laden Sie die detaillierte %s-Karte herunter, um diesen Bereich zu sehen.</string>
     <string name="change_data_storage_full_description">OsmAnd-Datendateien an das neue Ziel verschieben\?
 \n%1 s &gt; %2 s</string>
-    <string name="data_storage_preference_summary">%1$s • Verwendet %2$s GB</string>
-    <string name="data_storage_space_description">Frei %1$s GB • Insgesamt %2$s GB</string>
     <string name="enter_path_to_folder">Geben Sie den Pfad zum Ordner ein</string>
     <string name="shared_string_select_folder">Ordner auswählen</string>
     <string name="paste_Osmand_data_folder_path">Einfügen des Pfades zum Ordner mit OsmAnd-Daten</string>
@@ -3338,5 +3341,17 @@
     <string name="shared_string_memory_tb_desc">%1$s TB</string>
     <string name="shared_string_memory_gb_desc">%1$s GB</string>
     <string name="shared_string_memory_mb_desc">%1$s MB</string>
-    <string name="shared_string_memory_kb_desc">%1$s KB</string>
+    <string name="shared_string_memory_kb_desc">%1$s kB</string>
+    <string name="shared_sting_tiles">Kacheln</string>
+    <string name="data_storage_preference_summary">%1$s • %2$s</string>
+    <string name="data_storage_space_description">%1$s GB frei - Insgesamt %2$s GB</string>
+    <string name="shared_string_memory_used_tb_desc">%1$s TB verwendet</string>
+    <string name="shared_string_memory_used_gb_desc">%1$s GB verwendet</string>
+    <string name="shared_string_memory_used_mb_desc">%1$s MB verwendet</string>
+    <string name="shared_string_memory_used_kb_desc">%1$s kB verwendet</string>
+    <string name="contour_lines_and_hillshade">Konturlinien und Hillshade</string>
+    <string name="routing_attr_prefer_unpaved_name">Unbefestigte Straßen bevorzugen</string>
+    <string name="routing_attr_prefer_unpaved_description">Unbefestigte Straßen bevorzugen.</string>
+    <string name="update_all_maps">Alle Karten aktualisieren</string>
+    <string name="update_all_maps_q">Sind Sie sicher, dass Sie alle (%1$d) Karten aktualisieren möchten\?</string>
 </resources>
\ No newline at end of file
diff --git a/OsmAnd/res/values-eo/strings.xml b/OsmAnd/res/values-eo/strings.xml
index ae2e371..d3b607b 100644
--- a/OsmAnd/res/values-eo/strings.xml
+++ b/OsmAnd/res/values-eo/strings.xml
@@ -3274,8 +3274,6 @@
     <string name="download_detailed_map">Elŝutu la detalan mapon %s, por vidi tiun ĉi areon.</string>
     <string name="change_data_storage_full_description">Ĉu movi datum‑dosierojn OsmAnd al la nova loko\?
 \n%1$s → %2$s</string>
-    <string name="data_storage_preference_summary">%1$s • uzita: %2$s GB</string>
-    <string name="data_storage_space_description">Libera: %1$s GB • Tute: %2$s GB</string>
     <string name="enter_path_to_folder">Entajpu dosier‑indikon</string>
     <string name="shared_string_select_folder">Elektu dosierujon</string>
     <string name="paste_Osmand_data_folder_path">Algluu dosier‑indikon por dosierujo de OsmAnd‑datumoj</string>
diff --git a/OsmAnd/res/values-es-rAR/phrases.xml b/OsmAnd/res/values-es-rAR/phrases.xml
index 82e43f0..c771c1b 100644
--- a/OsmAnd/res/values-es-rAR/phrases.xml
+++ b/OsmAnd/res/values-es-rAR/phrases.xml
@@ -3734,4 +3734,5 @@
     <string name="poi_craft_cabinet_maker">Ebanista</string>
     <string name="poi_charge">Cargo</string>
     <string name="poi_pet_grooming">Cuidado de mascotas</string>
+    <string name="poi_atm_yes">Cajero automático: sí</string>
 </resources>
\ 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 560c532..858deb7 100644
--- a/OsmAnd/res/values-es-rAR/strings.xml
+++ b/OsmAnd/res/values-es-rAR/strings.xml
@@ -3293,8 +3293,6 @@
     <string name="download_detailed_map">Descarga el mapa detallado de «%s», para ver esta área.</string>
     <string name="change_data_storage_full_description">¿Mover los archivos de datos de OsmAnd al nuevo destino\?
 \n%1$s &gt; %2$s</string>
-    <string name="data_storage_preference_summary">%1$s • Usado %2$s GB</string>
-    <string name="data_storage_space_description">Libre %1$s GB • Total %2$s GB</string>
     <string name="enter_path_to_folder">Ingresa la ruta a la carpeta</string>
     <string name="shared_string_select_folder">Elegir carpeta</string>
     <string name="paste_Osmand_data_folder_path">Pegar la ruta a la carpeta con los datos de OsmAnd</string>
@@ -3333,5 +3331,21 @@
     <string name="shared_string_memory_tb_desc">%1$s TB</string>
     <string name="shared_string_memory_gb_desc">%1$s GB</string>
     <string name="shared_string_memory_mb_desc">%1$s MB</string>
-    <string name="shared_string_memory_kb_desc">%1$s KB</string>
+    <string name="shared_string_memory_kb_desc">%1$s kB</string>
+    <string name="data_storage_preference_summary">%1$s • %2$s</string>
+    <string name="data_storage_space_description">Libre %1$s GB • Total %2$s GB</string>
+    <string name="track_storage_directory">Directorio de almacenamiento de trazas</string>
+    <string name="track_storage_directory_descrp">Las trazas pueden almacenarse en una carpeta de grabación o en carpetas mensuales o diarias.</string>
+    <string name="store_tracks_in_rec_directory">Almacenar las trazas grabadas en la carpeta de grabación</string>
+    <string name="store_tracks_in_daily_directories">Almacenar las trazas grabadas en carpetas diarias</string>
+    <string name="store_tracks_in_daily_directories_descrp">Almacena las trazas grabadas en subcarpetas por día de grabación (como 2018-01-01).</string>
+    <string name="shared_string_memory_used_tb_desc">Usado %1$s TB</string>
+    <string name="shared_string_memory_used_gb_desc">Usado %1$s GB</string>
+    <string name="shared_string_memory_used_mb_desc">Usado %1$s MB</string>
+    <string name="shared_string_memory_used_kb_desc">Usado %1$s kB</string>
+    <string name="contour_lines_and_hillshade">Curvas de nivel y sombreados</string>
+    <string name="routing_attr_prefer_unpaved_name">Preferir caminos sin pavimentar</string>
+    <string name="routing_attr_prefer_unpaved_description">Prefiere caminos sin pavimentar.</string>
+    <string name="update_all_maps">Actualizar todos los mapas</string>
+    <string name="update_all_maps_q">¿Actualizar todos los mapas (%1$d)\?</string>
 </resources>
\ 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 efaad8e..777a413 100644
--- a/OsmAnd/res/values-es-rUS/strings.xml
+++ b/OsmAnd/res/values-es-rUS/strings.xml
@@ -3294,8 +3294,6 @@
     <string name="download_detailed_map">Descarga el mapa detallado de «%s», para ver esta área.</string>
     <string name="change_data_storage_full_description">¿Mover los archivos de datos de OsmAnd al nuevo destino\?
 \n%1$s &gt; %2$s</string>
-    <string name="data_storage_preference_summary">%1$s • Usado %2$s GB</string>
-    <string name="data_storage_space_description">Libre %1$s • %2$s / %3$s GB</string>
     <string name="enter_path_to_folder">Ingresa la ruta a la carpeta</string>
     <string name="shared_string_select_folder">Elegir carpeta</string>
     <string name="paste_Osmand_data_folder_path">Pegar la ruta a la carpeta con los datos de OsmAnd</string>
diff --git a/OsmAnd/res/values-es/strings.xml b/OsmAnd/res/values-es/strings.xml
index 688a7f0..2a67ab7 100644
--- a/OsmAnd/res/values-es/strings.xml
+++ b/OsmAnd/res/values-es/strings.xml
@@ -3309,8 +3309,6 @@
     <string name="plugins_settings">Ajustes de plugin</string>
     <string name="shared_string_by_default">Por defecto</string>
     <string name="download_detailed_map">Descarga el mapa detallado de %s para ver este área.</string>
-    <string name="data_storage_preference_summary">%1$s • Usado %2$s GB</string>
-    <string name="data_storage_space_description">Libre %1$s • %2$s / %3$s GB</string>
     <string name="shared_string_select_folder">Seleccionar carpeta</string>
     <string name="move_maps_to_new_destination">Mover al nuevo destino</string>
     <string name="change_data_storage_folder">Cambiar la carpeta de almacenamiento de datos</string>
diff --git a/OsmAnd/res/values-eu/strings.xml b/OsmAnd/res/values-eu/strings.xml
index 439a7cf..bee40ef 100644
--- a/OsmAnd/res/values-eu/strings.xml
+++ b/OsmAnd/res/values-eu/strings.xml
@@ -3279,8 +3279,6 @@
     <string name="download_detailed_map">Deskargatu %s(e)ko mapa xehetsua ingurune hau ikusteko.</string>
     <string name="change_data_storage_full_description">Eraman OsmAnd datu fitxategiak xede berrira\?
 \n%1$s &gt; %2$s</string>
-    <string name="data_storage_preference_summary">%1$s • Erabilita %2$s GB</string>
-    <string name="data_storage_space_description">Libre %1$s • %2$s / %3$s GB</string>
     <string name="enter_path_to_folder">Sartu karpetara bidea</string>
     <string name="shared_string_select_folder">Hautatu karpeta</string>
     <string name="paste_Osmand_data_folder_path">Itsatsi OsmAnd datuak dituen karpetara bidea</string>
diff --git a/OsmAnd/res/values-fa/strings.xml b/OsmAnd/res/values-fa/strings.xml
index e2e823b..05e3f23 100644
--- a/OsmAnd/res/values-fa/strings.xml
+++ b/OsmAnd/res/values-fa/strings.xml
@@ -382,7 +382,7 @@
     <string name="local_openstreetmap_delete">حذف اصلاحات</string>
     <string name="local_openstreetmap_descr_title">ویرایش ناهمزمان OSM:</string>
     <string name="free_version_message">شما می‌توانید %1$s نقشه دانلود یا به‌روز کنید.</string>
-    <string name="free_version_title">نسخهٔ رایگان</string>
+    <string name="free_version_title">‎نسخهٔ رایگان</string>
     <string name="poi_context_menu_showdescription">نمایش توضیحات POI.</string>
     <string name="index_name_north_america">آمریکای شمالی</string>
     <string name="index_name_us">آمریکای شمالی - ایالات متحده</string>
@@ -682,8 +682,8 @@
     <string name="osmand_service">حالت پس‌زمینه</string>
     <string name="osmand_service_descr">زمانی که صفحه خاموش است OsmAnd در پس‌زمینه کار می‌کند.</string>
     <string name="download_files_not_enough_space">فضای کافی برای دانلود %1$s مگابایت وجود ندارد (خالی: %2$s).</string>
-    <string name="download_files_question_space">آیا {0} فایل را دانلود می‌کنید؟
-\nحافظهٔ استفاده شده {1} مگابایت است. (حافظهٔ قابل‌استفاده {2} مگابایت است.)</string>
+    <string name="download_files_question_space">آیا {0} فایل را دانلود می‌کنید؟ 
+\nفضای ذخیرهٔ استفاده‌شده {1} مگابایت است. (فضای قابل‌استفاده {2} مگابایت است.)</string>
     <string name="use_transparent_map_theme">پوستهٔ شفاف</string>
     <string name="native_library_not_supported">کتابخانهٔ بومی بر روی این دستگاه پشتیبانی نمی‌شود.</string>
     <string name="init_native_library">مقداردهی اولیهٔ کتابخانهٔ بومی…</string>
@@ -843,7 +843,7 @@
     <string name="voice_data_corrupted">دادهٔ گفتاری انتخاب‌شده خراب است</string>
     <string name="voice_data_unavailable">دادهٔ گفتاری انتخاب‌شده موجود نیست</string>
     <string name="sd_mounted_ro">کارت حافظه در حالت فقط‌خواندنی است. 
-\nبا این حساب تنها می‌توانید نقشه‌هایی را ببینید که قبلاً دریافت شده‌اند و نمی‌توانید مناطق جدیدی را دانلود کنید.</string>
+\nفقط می‌توانید نقشه‌هایی را ببینید که قبلاً دریافت شده‌اند و نمی‌توانید مناطق جدیدی را دانلود کنید.</string>
     <string name="process_navigation_service">خدمات ناوبری OsmAnd</string>
     <string name="background_service_int_descr">بازهٔ بیدارباش سرویس پس‌زمینه را تنظیم کنید.</string>
     <string name="background_service_int">بازهٔ زمانی بیدارباش GPS</string>
@@ -1367,7 +1367,7 @@
     <string name="online_map">نقشهٔ آنلاین</string>
     <string name="roads_only">فقط راه‌ها</string>
     <string name="rendering_attr_pisteRoutes_name">سراشیبی‌های اسکی</string>
-    <string name="device_memory">حافظهٔ دستگاه</string>
+    <string name="device_memory">‎حافظهٔ دستگاه</string>
     <string name="rendering_attr_pisteGrooming_name">آماده‌سازی پیست</string>
     <string name="plugin_ski_name">نمای اسکی برای نقشه</string>
     <string name="plugin_nautical_name">نمای دریایی نقشه</string>
@@ -2134,7 +2134,7 @@
     <string name="downloads">دانلودها</string>
     <string name="confirm_download_roadmaps">نقشهٔ فقط-جاده لازم نیست، زیرا نقشهٔ استاندارد (کامل) را دارید. هنوز مایلید که دانلودش کنید؟</string>
     <string name="value_downloaded_of_max">%1$.1f از %2$.1f مگابایت</string>
-    <string name="file_size_in_mb">%.1f م‌بـ</string>
+    <string name="file_size_in_mb">%.1f مگابایت</string>
     <string name="update_all">به‌روزرسانی همه (%1$s مگابایت)</string>
     <string name="free_downloads_used">دانلودهای رایگان استفاده‌شده</string>
     <string name="free_downloads_used_description">تعداد دانلودهای رایگان باقیمانده را نشان می‌دهد.</string>
@@ -3335,8 +3335,6 @@
     <string name="download_detailed_map">برای دیدن این منطقه، نقشهٔ باجزئیات %s را دانلود کنید.</string>
     <string name="change_data_storage_full_description">فایل‌های دادهٔ OsmAnd را به مقصد جدید انتقال می‌دهید؟
 \n%1$s &gt; %2$s</string>
-    <string name="data_storage_preference_summary">%1$s • %2$s گ‌ب استفاده شده</string>
-    <string name="data_storage_space_description">خالی %1$s • %2$s از %3$s گ‌ب</string>
     <string name="enter_path_to_folder">مسیر پوشه را وارد کنید</string>
     <string name="shared_string_select_folder">انتخاب پوشه</string>
     <string name="paste_Osmand_data_folder_path">مسیر پوشهٔ داده‌های OsmAnd را درج کنید</string>
@@ -3364,4 +3362,30 @@
     <string name="routing_attr_width_name">محدودیت عرض</string>
     <string name="routing_attr_width_description">محدودیت پهنای وسیله در مسیرها را مشخص کنید.</string>
     <string name="avoid_in_routing_descr_">از مسیرهای بخصوص و انواع جاده‌ها بپرهیزید</string>
+    <string name="data_storage_preference_summary">%1$s • %2$s</string>
+    <string name="data_storage_space_description">خالی %1$s گیگابایت • کل %2$s گیگابایت</string>
+    <string name="app_mode_utv">پهلو به پهلو</string>
+    <string name="rendering_attr_piste_difficulty_aerialway_name">راه هوایی</string>
+    <string name="shared_string_calculate">محاسبه</string>
+    <string name="shared_string_osmand_usage">کارکرد OsmAnd</string>
+    <string name="shared_sting_tiles">کاشی‌ها</string>
+    <string name="shared_string_maps">نقشه‌ها</string>
+    <string name="shared_string_memory_tb_desc">%1$s ترابایت</string>
+    <string name="shared_string_memory_gb_desc">%1$s گیگابایت</string>
+    <string name="shared_string_memory_mb_desc">%1$s مگابایت</string>
+    <string name="shared_string_memory_kb_desc">%1$s کیلوبایت</string>
+    <string name="track_storage_directory">پوشهٔ ذخیره‌سازی رد</string>
+    <string name="track_storage_directory_descrp">ردها را می‌توانید در پوشهٔ rec یا پوشه‌های ماهانه یا روزانه ذخیره کنید.</string>
+    <string name="store_tracks_in_rec_directory">ردهای ضبط‌شده در پوشهٔ rec ذخیره شوند</string>
+    <string name="store_tracks_in_daily_directories">ردهای ضبط‌شده در پوشه‌های روزانه ذخیره شوند</string>
+    <string name="store_tracks_in_daily_directories_descrp">ردهای ضبط‌شده در زیرپوشهٔ مخصوص آن روز ذخیره می‌شود (مانند ‎2018-01-01).</string>
+    <string name="shared_string_memory_used_tb_desc">استفاده‌شده %1$s ترابایت</string>
+    <string name="shared_string_memory_used_gb_desc">استفاده‌شده %1$s گیگابایت</string>
+    <string name="shared_string_memory_used_mb_desc">استفاده‌شده %1$s مگابایت</string>
+    <string name="shared_string_memory_used_kb_desc">استفاده‌شده %1$s کیلوبایت</string>
+    <string name="contour_lines_and_hillshade">سایه‌روشن و منحنی‌های میزان</string>
+    <string name="routing_attr_prefer_unpaved_name">ترجیح جاده‌های روسازی‌نشده</string>
+    <string name="routing_attr_prefer_unpaved_description">جاده‌های روسازی‌نشده را ترجیح می‌دهم.</string>
+    <string name="update_all_maps">به‌روزرسانی همهٔ نقشه‌ها</string>
+    <string name="update_all_maps_q">آیا همهٔ نقشه‌ها (%1$d) را به‌روز می‌کنید؟</string>
 </resources>
\ No newline at end of file
diff --git a/OsmAnd/res/values-fr/phrases.xml b/OsmAnd/res/values-fr/phrases.xml
index 6f14284..bee0fd6 100644
--- a/OsmAnd/res/values-fr/phrases.xml
+++ b/OsmAnd/res/values-fr/phrases.xml
@@ -95,13 +95,13 @@
     <string name="poi_clothes">Magasin de vêtements</string>
     <string name="poi_club_art">Club d\'art</string>
     <string name="poi_club_charity">Association caritative</string>
-    <string name="poi_club_chess">Échecs</string>
-    <string name="poi_club_cinema">Association cinéphile</string>
+    <string name="poi_club_chess">Club d\'échecs</string>
+    <string name="poi_club_cinema">Ciné-club</string>
     <string name="poi_club_computer">Association informatique</string>
     <string name="poi_club_motorcycle">Association motocycliste</string>
-    <string name="poi_club_music">Association musicale</string>
+    <string name="poi_club_music">Association de musique</string>
     <string name="poi_club_shooting">Association de tir</string>
-    <string name="poi_club_theatre">Association théâtrale</string>
+    <string name="poi_club_theatre">Association de théâtre</string>
     <string name="poi_college">Enseignement supérieur</string>
     <string name="poi_communication_tower">Tour de télécommunication</string>
     <string name="poi_compressed_air">Air comprimé</string>
@@ -433,7 +433,7 @@
     <string name="poi_club_astronomy">Club d\'astronomie</string>
     <string name="poi_club_sport">Club de sports</string>
     <string name="poi_club_fishing">Association de pêche</string>
-    <string name="poi_club_linux">Association Linux</string>
+    <string name="poi_club_linux">Association Linux (GUL)</string>
     <string name="poi_club_hunting">Club de chasse</string>
     <string name="poi_cinema">Cinéma</string>
     <string name="poi_theatre">Théâtre</string>
@@ -556,7 +556,7 @@
     <string name="poi_roller_skating">Patinage à roulettes</string>
     <string name="poi_historic_cannon">Canon historique</string>
     <string name="poi_club_automobile">Club automobile</string>
-    <string name="poi_club_history">Association historique</string>
+    <string name="poi_club_history">Association d\'histoire</string>
     <string name="poi_harbour">Port</string>
     <string name="poi_floating_dock">Dock flottant</string>
     <string name="poi_military_range">Terrain militaire</string>
@@ -738,7 +738,7 @@
     <string name="poi_picnic_table">Table de pique-nique</string>
     <string name="poi_wine_cellar">Cave à vin</string>
     <string name="poi_craft_winery">Établissement vinicole</string>
-    <string name="poi_gallery">Musée d\'art</string>
+    <string name="poi_gallery">Galerie d\'art</string>
     <string name="poi_hanami">Hanami</string>
     <string name="poi_trail_riding_station">Refuge pour randonnée équestre</string>
     <string name="poi_wiki_place">Wikipédia</string>
@@ -1366,7 +1366,7 @@
     <string name="poi_architecture_contemporary">Architecture : contemporaine</string>
     <string name="poi_architecture_art_nouveau">Architecture : art nouveau</string>
     <string name="poi_architecture_neoclassicism">Architecture : néo-classique</string>
-    <string name="poi_architecture_victorian">Architecture : victorien</string>
+    <string name="poi_architecture_victorian">Architecture : victorienne</string>
     <string name="poi_architecture_gothic">Architecture : gothique</string>
     <string name="poi_architecture_baroque">Architecture : baroque</string>
     <string name="poi_architecture_renaissance">Architecture : renaissance</string>
@@ -1576,7 +1576,7 @@
     <string name="poi_material_reinforced_concrete">Matière : béton armé</string>
     <string name="poi_material_concrete">Matière : béton</string>
     <string name="poi_material_steel">Matière : acier</string>
-    <string name="poi_material_stone">Matière : roche</string>
+    <string name="poi_material_stone">Matière : pierre</string>
     <string name="poi_material_masonry">Matière : maçonnerie</string>
     <string name="poi_material_brick">Matière : brique</string>
     <string name="poi_material_plastic">Matière : plastique</string>
@@ -1917,7 +1917,7 @@
     <string name="poi_telescope_usage_research">Usage : recherche</string>
     <string name="poi_observatory_type_espionage">Usage : espionnage</string>
     <string name="poi_observatory_type_meteorological">Météorologique</string>
-    <string name="poi_voltage">Voltage</string>
+    <string name="poi_voltage">Tension électrique</string>
     <string name="poi_generator_output_electricity">Puissance de sortie</string>
     <string name="poi_pumping_station">Station de pompage</string>
     <string name="poi_display_yes">Affichage : oui</string>
@@ -2124,7 +2124,7 @@
     <string name="poi_industrial_brickyard">Type : briqueterie</string>
     <string name="poi_industrial_sawmill">Type : scierie</string>
     <string name="poi_crop_grass">Culture : herbe</string>
-    <string name="poi_crop_poultry">Culture : volaille</string>
+    <string name="poi_crop_poultry">Production : volaille</string>
     <string name="poi_clothes_fur">Fourrure</string>
     <string name="poi_historic_milestone">Borne routière historique</string>
     <string name="poi_castle_type_stately">Type de château : majestueux</string>
@@ -2243,7 +2243,7 @@
     <string name="poi_animal_keeping">Enclos</string>
     <string name="poi_animal_keeping_horse">Enclos pour : chevaux</string>
     <string name="poi_animal_keeping_sheep">Enclos pour : moutons</string>
-    <string name="poi_bicycle_repair_station">Station d\'auto-réparation de vélo</string>
+    <string name="poi_bicycle_repair_station">Station de réparation de vélo;Station d\'auto-réparation de vélo</string>
     <string name="poi_cuisine_brasserie">Brasserie</string>
     <string name="poi_coworking_space">Espace de cotravail</string>
     <string name="poi_water_tap">Fontaine d\'eau courante</string>
@@ -2369,7 +2369,7 @@
     <string name="poi_architecture_new_objectivity">Architecture : nouvelle objectivité</string>
     <string name="poi_architecture_brutalism">Architecture : brutalisme</string>
     <string name="poi_architecture_classicism">Architecture : classicisme</string>
-    <string name="poi_architecture_postconstructivism">Architecture : postconstructivisme</string>
+    <string name="poi_architecture_postconstructivism">Architecture : post constructivisme</string>
     <string name="poi_music_school">École de musique</string>
     <string name="poi_language_school">École de langue</string>
     <string name="poi_memorial_koshinto">Koshintō</string>
@@ -2765,9 +2765,9 @@
     <string name="poi_full_service_yes">Service complet</string>
     <string name="poi_resource_dimension_stone">Pierre de taille</string>
     <string name="poi_artwork_type_relief">Type d’œuvre : secours</string>
-    <string name="poi_architecture_timber_frame">Architecture : Cadre en bois</string>
+    <string name="poi_architecture_timber_frame">Architecture : pans de bois</string>
     <string name="poi_architecture_oldrussian">Architecture : russe ancien</string>
-    <string name="poi_architecture_wilhelminian_style">Architecture : Style wilhelminien</string>
+    <string name="poi_architecture_wilhelminian_style">Architecture : style wilhelminien</string>
     <string name="poi_tunnel_waterway">Tunnel d\'eau</string>
     <string name="poi_bridge_waterway">Pont de voie navigable</string>
     <string name="poi_payment_ep_minicash_yes">Minicash</string>
@@ -3533,15 +3533,15 @@
     <string name="poi_outcrop">Affleurement</string>
     <string name="poi_atoll">Atoll</string>
     <string name="reddit">Reddit</string>
-    <string name="poi_free_flying_site_toplanding">Atterrissage à un sommet</string>
+    <string name="poi_free_flying_site_toplanding">Point d’atterrissage sommital</string>
     <string name="poi_bicycle_parking_streetpod">Râtelier</string>
     <string name="poi_crossing_saltire_yes">Croix de Saint-André</string>
     <string name="poi_crossing_saltire_no">Croix de Saint-André : non</string>
     <string name="poi_pump_type_beam_pump">Type de pompe : à balancier</string>
-    <string name="poi_payment_troika_yes">Troika</string>
+    <string name="poi_payment_troika_yes">Troïka</string>
     <string name="poi_fire_operator">Opérateur incendie</string>
     <string name="poi_animal_keeping_type_paddock">Type : enclos</string>
-    <string name="poi_spaceport">Spatioport</string>
+    <string name="poi_spaceport">Centre spatial</string>
     <string name="poi_water_purification_aquatabs">Aquatabs</string>
     <string name="poi_climbing_quality_solid">Qualité pour l\'escalade : solide</string>
     <string name="poi_climbing_quality_fragile">Qualité pour l\'escalade : fragile</string>
@@ -3564,10 +3564,10 @@
     <string name="poi_outpost">Point de livraison</string>
     <string name="poi_water_utility">Service des eaux</string>
     <string name="poi_adult_gaming_centre">Centre de jeux pour adultes</string>
-    <string name="poi_service_vehicle_oil_change_yes">Changement d\'huile</string>
+    <string name="poi_service_vehicle_oil_change_yes">Vidange d\'huile</string>
     <string name="poi_service_vehicle_body_repair_yes">Carrosserie</string>
     <string name="poi_service_vehicle_electrical_yes">Électrique</string>
-    <string name="poi_climbing_adventure">Accrobranche</string>
+    <string name="poi_climbing_adventure">Parcours acrobatique en hauteur</string>
     <string name="poi_course">Course</string>
     <string name="poi_license_classes">Classes de permis</string>
     <string name="poi_pipeline_substation">Sous-station de pipeline</string>
@@ -3637,9 +3637,25 @@
     <string name="poi_motorcar_private">accès-voiture : privé</string>
     <string name="poi_motorcar_no">accès-voiture : impossible</string>
     <string name="poi_motorcar_permissive">accès-voiture : possible</string>
-    <string name="poi_motorcar_customers">accès-voiture : clients</string>
+    <string name="poi_motorcar_customers">Accès aux automobiles:forestiers</string>
     <string name="poi_motor_vehicle_yes">accès-voiture : autorisé</string>
     <string name="poi_motor_vehicle_private">Accès-voiture : privé</string>
-    <string name="poi_motor_vehicle_delivery">Accès-véhicules : livraison</string>
+    <string name="poi_motor_vehicle_delivery">Accès aux véhicules à moteur : livraison</string>
     <string name="poi_motor_vehicle_agricultural">Accès-véhicules : agricoles</string>
+    <string name="poi_motorcar_destination">Accès aux automobiles:riverains</string>
+    <string name="poi_motorcar_forestry">Accès aux automobiles:forestiers</string>
+    <string name="poi_motor_vehicle_destination">Accès aux véhicules à moteurs:riverains</string>
+    <string name="poi_motor_vehicle_permissive">Accès véhicule à moteur:toléré</string>
+    <string name="poi_motor_vehicle_customers">Accès au véhicule à moteur:clients</string>
+    <string name="poi_motor_vehicle_military">Accès aux véhicules à moteur:militaires</string>
+    <string name="poi_motor_vehicle_forestry">Accès aux véhicules à moteurs:forestiers</string>
+    <string name="poi_cellar_entrance">Entrée de cave</string>
+    <string name="poi_health_food">Magasin de diététique</string>
+    <string name="poi_craft_builder">Constructeur</string>
+    <string name="poi_craft_distillery">Distillerie</string>
+    <string name="poi_craft_joiner">Menuisier</string>
+    <string name="poi_craft_floorer">Solier</string>
+    <string name="poi_craft_bakery">Boulangerie (atelier)</string>
+    <string name="poi_craft_cabinet_maker">Ébéniste</string>
+    <string name="poi_pet_grooming">Toilettage pour animaux domestiques</string>
 </resources>
\ No newline at end of file
diff --git a/OsmAnd/res/values-fr/strings.xml b/OsmAnd/res/values-fr/strings.xml
index bff2fc3..baeffad 100644
--- a/OsmAnd/res/values-fr/strings.xml
+++ b/OsmAnd/res/values-fr/strings.xml
@@ -2686,7 +2686,7 @@
     <string name="shared_string_explore">Explorer</string>
     <string name="use_two_digits_longitude">Utiliser une longitude à 2 chiffres</string>
     <string name="wikivoyage_search_hint">Rechercher : Pays, Ville, Département</string>
-    <string name="shared_string_read">Lu</string>
+    <string name="shared_string_read">Lire</string>
     <string name="article_removed">Article supprimé</string>
     <string name="shared_string_contents">Contenus</string>
     <string name="download_maps_travel">Guides de voyage</string>
@@ -2756,7 +2756,7 @@
     <string name="open_wikipedia_link_online_description">Le lien s\'ouvrira dans votre navigateur Internet.</string>
     <string name="read_wikipedia_offline_description">Abonnez-vous à OsmAnd Live pour lire les articles Wikipedia et Wikivoyage hors-ligne.</string>
     <string name="how_to_open_link">Comment ouvrir le lien ?</string>
-    <string name="read_wikipedia_offline">Lisez Wikipedia hors-ligne</string>
+    <string name="read_wikipedia_offline">Consultez Wikipédia hors-ligne</string>
     <string name="download_all">Télécharger tout</string>
     <string name="hide_full_description">Masquer la description complète</string>
     <string name="show_full_description">Afficher la description complète</string>
@@ -3110,7 +3110,7 @@
     <string name="make_osmand_better_descr">Autoriser OsmAnd à collecter et analyser des données anonymes d\'utilisation de l\'application. Nous ne collectons aucune donnée liée à votre position et aucun emplacement consulté sur la carte.
 \n
 \nVous pouvez changer d\'avis à tout moment dans Paramètres &gt; Vie privée et Sécurité.</string>
-    <string name="downloaded_maps_collect_descr">Nous collectons ces données pour connaitre les pays et régions les plus populaires.</string>
+    <string name="downloaded_maps_collect_descr">Nous collectons ces données pour connaître les pays et régions les plus populaires.</string>
     <string name="privacy_and_security_change_descr">En sélectionnant \"Autoriser\" vous acceptez nos %1$s.</string>
     <string name="settings_derived_routing_mode_string">Mode utilisateur, dérive de : %s</string>
     <string name="profile_alert_need_routing_type_msg">Merci de sélectionner un type de navigation pour le nouveau profil</string>
@@ -3261,8 +3261,6 @@
     <string name="download_detailed_map">Télécharger la carte détaillée %s pour voir cette zone.</string>
     <string name="change_data_storage_full_description">Déplacer les fichiers de données OsmAnd vers la nouvelle destination \?
 \n%1$s &gt; %2$s</string>
-    <string name="data_storage_preference_summary">%1$s • %2$s GB utilisés</string>
-    <string name="data_storage_space_description">Libre %1$s GB • Total %2$s GB</string>
     <string name="enter_path_to_folder">Saisissez le chemin du dossier</string>
     <string name="shared_string_select_folder">Sélectionner le dossier</string>
     <string name="paste_Osmand_data_folder_path">Coller le chemin du dossier contenant les données OsmAnd</string>
@@ -3293,7 +3291,7 @@
     <string name="avoid_in_routing_descr_">Éviter certains types de route</string>
     <string name="app_mode_utv">Côte à côte</string>
     <string name="rendering_attr_piste_difficulty_connection_name">Connexion</string>
-    <string name="rendering_attr_piste_difficulty_aerialway_name">Transport aérien</string>
+    <string name="rendering_attr_piste_difficulty_aerialway_name">Transport par câble aérien</string>
     <string name="shared_string_calculate">Calculer</string>
     <string name="shared_string_osmand_usage">Utilisation d\'OsmAnd</string>
     <string name="shared_sting_tiles">Tuiles</string>
@@ -3301,5 +3299,21 @@
     <string name="shared_string_memory_tb_desc">%1$s TB</string>
     <string name="shared_string_memory_gb_desc">%1$s GB</string>
     <string name="shared_string_memory_mb_desc">%1$s MB</string>
-    <string name="shared_string_memory_kb_desc">%1$s KB</string>
+    <string name="shared_string_memory_kb_desc">%1$s kB</string>
+    <string name="data_storage_preference_summary">%1$s • %2$s</string>
+    <string name="data_storage_space_description">Libre %1$s GB • Total %2$s GB</string>
+    <string name="track_storage_directory">Surveiller le dossier de stockage</string>
+    <string name="shared_string_memory_used_tb_desc">%1$s TB utilisés</string>
+    <string name="shared_string_memory_used_gb_desc">%1$s GB utilisés</string>
+    <string name="shared_string_memory_used_mb_desc">%1$s MB utilisés</string>
+    <string name="shared_string_memory_used_kb_desc">%1$s kB utilisés</string>
+    <string name="contour_lines_and_hillshade">Courbes de niveaux et Ombrage du relief</string>
+    <string name="routing_attr_prefer_unpaved_name">Privilégier les routes non revêtues</string>
+    <string name="routing_attr_prefer_unpaved_description">Privilégier les routes non revêtues.</string>
+    <string name="update_all_maps">Mettre à jour toutes les cartes</string>
+    <string name="update_all_maps_q">Êtes-vous certain de vouloir mettre à jour les (%1$d) cartes \?</string>
+    <string name="track_storage_directory_descrp">Les traces peuvent être enregistrée dans le dossier rec ou dans des dossiers mensuels ou journaliers.</string>
+    <string name="store_tracks_in_rec_directory">Enregistrer les traces dans le dossier rec</string>
+    <string name="store_tracks_in_daily_directories">Enregistrer les traces dans des dossiers journaliers</string>
+    <string name="store_tracks_in_daily_directories_descrp">Enregistrer les traces dans des sous-dossiers journaliers (par exemple 2019-01-01).</string>
 </resources>
\ No newline at end of file
diff --git a/OsmAnd/res/values-gl/strings.xml b/OsmAnd/res/values-gl/strings.xml
index fd6fb80..4a21e7d 100644
--- a/OsmAnd/res/values-gl/strings.xml
+++ b/OsmAnd/res/values-gl/strings.xml
@@ -3334,8 +3334,6 @@
     <string name="download_detailed_map">Baixa o mapa detallado de %s para ollar esta área.</string>
     <string name="change_data_storage_full_description">Mover os ficheiros de datos do OsmAnd ó novo destino\? 
 \n%1$s &gt; %2$s</string>
-    <string name="data_storage_preference_summary">%1$s • Empregado %2$s GB</string>
-    <string name="data_storage_space_description">Libre %1$s GB • Total %2$s GB</string>
     <string name="enter_path_to_folder">Insire a ruta do cartafol</string>
     <string name="shared_string_select_folder">Escoller cartafol</string>
     <string name="paste_Osmand_data_folder_path">Colar ou pegar a ruta do cartafol cos datos do OsmAnd</string>
diff --git a/OsmAnd/res/values-he/strings.xml b/OsmAnd/res/values-he/strings.xml
index 872a9f2..8ce60a9 100644
--- a/OsmAnd/res/values-he/strings.xml
+++ b/OsmAnd/res/values-he/strings.xml
@@ -3279,8 +3279,6 @@
     <string name="routing_attr_freeride_policy_name">ללא מסלול</string>
     <string name="change_data_storage_full_description">להעביר את קובצי הנתונים של OsmAnd ליעד החדש\?
 \n%1$s &gt; %2$s</string>
-    <string name="data_storage_preference_summary">%1$s ‏• %2$s ג״ב מנוצלים</string>
-    <string name="data_storage_space_description">%1$s ג״ב פנויים • סה״כ %2$s ג״ב</string>
     <string name="enter_path_to_folder">נא לספק נתיב לתיקייה</string>
     <string name="shared_string_select_folder">בחירת תיקייה</string>
     <string name="paste_Osmand_data_folder_path">נא להדביק את הנתיב לתיקייה עם הנתונים של OsmAnd</string>
@@ -3320,4 +3318,20 @@
     <string name="shared_string_memory_gb_desc">%1$s ג״ב</string>
     <string name="shared_string_memory_mb_desc">%1$s מ״ב</string>
     <string name="shared_string_memory_kb_desc">%1$s ק״ב</string>
+    <string name="track_storage_directory">תיקיית אחסון מסלולים</string>
+    <string name="shared_string_memory_used_tb_desc">%1$s ט״ב בשימוש</string>
+    <string name="shared_string_memory_used_gb_desc">%1$s ג״ב בשימוש</string>
+    <string name="shared_string_memory_used_mb_desc">%1$s מ״ב בשימוש</string>
+    <string name="shared_string_memory_used_kb_desc">%1$s ק״ב בשימוש</string>
+    <string name="contour_lines_and_hillshade">קווי מתאר והצללות תוואי שטח</string>
+    <string name="routing_attr_prefer_unpaved_name">להעדיף דרכים בלתי סלולות</string>
+    <string name="routing_attr_prefer_unpaved_description">להעדיף דרכים בלתי סלולות.</string>
+    <string name="update_all_maps">עדכון כל המפות</string>
+    <string name="update_all_maps_q">לעדכן את כל (%1$d) המפות\?</string>
+    <string name="data_storage_preference_summary">%1$s • %2$s</string>
+    <string name="data_storage_space_description">%1$s ג״ב פנויים • %2$s ג״ב סה״כ</string>
+    <string name="track_storage_directory_descrp">ניתן לאחסן מסלולים בתיקיית rec או בתיקיות חודשיות או יומיות.</string>
+    <string name="store_tracks_in_rec_directory">אחסון מסלולים שהוקלטו בתיקיית rec</string>
+    <string name="store_tracks_in_daily_directories">אחסון מסלולים שהוקלטו בתיקיות יומיות</string>
+    <string name="store_tracks_in_daily_directories_descrp">אחסון מסלולים שהוקלטו בתת־תיקיות לפי יום ההקלטה (למשל: 2019-01-01).</string>
 </resources>
\ No newline at end of file
diff --git a/OsmAnd/res/values-is/phrases.xml b/OsmAnd/res/values-is/phrases.xml
index d08bfad..bfe9fc8 100644
--- a/OsmAnd/res/values-is/phrases.xml
+++ b/OsmAnd/res/values-is/phrases.xml
@@ -3710,4 +3710,7 @@
     <string name="poi_craft_floorer">Gólflagnafyrirtæki</string>
     <string name="poi_craft_bakery">Bökunarfyrirtæki</string>
     <string name="poi_craft_cabinet_maker">Skápasmíði</string>
+    <string name="poi_charge">Gjald</string>
+    <string name="poi_pet_grooming">Snyrting fyrir gæludýr</string>
+    <string name="poi_atm_yes">Hraðbanki: já</string>
 </resources>
\ No newline at end of file
diff --git a/OsmAnd/res/values-is/strings.xml b/OsmAnd/res/values-is/strings.xml
index 12ca416..6eba406 100644
--- a/OsmAnd/res/values-is/strings.xml
+++ b/OsmAnd/res/values-is/strings.xml
@@ -3306,8 +3306,6 @@
     <string name="download_detailed_map">Sæktu nákvæma %s kortið til að skoða þetta svæði.</string>
     <string name="change_data_storage_full_description">Færa gagnaskrár OsmAnd á nýjan stað\?
 \n%1$s &gt; %2$s</string>
-    <string name="data_storage_preference_summary">%1$s • Notuð %2$s GB</string>
-    <string name="data_storage_space_description">Laust %1$s • %2$s / %3$s GB</string>
     <string name="enter_path_to_folder">Settu inn slóð á möppu</string>
     <string name="shared_string_select_folder">Veldu möppu</string>
     <string name="paste_Osmand_data_folder_path">Límdu slóð á möppuna með OsmAnd-gögnum</string>
@@ -3336,4 +3334,31 @@
     <string name="routing_attr_width_name">Takmörkun breiddar</string>
     <string name="routing_attr_width_description">Tilgreindu takmörk á breidd farartækja á leiðum.</string>
     <string name="avoid_in_routing_descr_">Forðast tilteknar leiðir og gerðir af vegum</string>
+    <string name="data_storage_preference_summary">%1$s • %2$s</string>
+    <string name="data_storage_space_description">Laust %1$s GB • Alls %2$s GB</string>
+    <string name="app_mode_utv">Hlið við hlið</string>
+    <string name="rendering_attr_piste_difficulty_aerialway_name">Víralyfta</string>
+    <string name="rendering_attr_piste_difficulty_connection_name">Tenging</string>
+    <string name="shared_string_calculate">Reikna</string>
+    <string name="shared_string_osmand_usage">Notkun OsmAnd</string>
+    <string name="shared_sting_tiles">Kortatíglar</string>
+    <string name="shared_string_maps">Kort</string>
+    <string name="shared_string_memory_tb_desc">%1$s TB</string>
+    <string name="shared_string_memory_gb_desc">%1$s GB</string>
+    <string name="shared_string_memory_mb_desc">%1$s MB</string>
+    <string name="shared_string_memory_kb_desc">%1$s kB</string>
+    <string name="track_storage_directory">Geymslumappa fyrir ferla</string>
+    <string name="track_storage_directory_descrp">Ferla er hægt að geyma í rec-möppunni eða í mánaðarlegum eða daglegum möppum.</string>
+    <string name="store_tracks_in_rec_directory">Geymdu skráða ferla í rec-möppu</string>
+    <string name="store_tracks_in_daily_directories">Geyma skráða ferla í daglegum möppum</string>
+    <string name="store_tracks_in_daily_directories_descrp">Geyma skráða ferla í undirmöppum á hvern upptökudag (eins og t.d. 2018-01-01).</string>
+    <string name="shared_string_memory_used_tb_desc">Notað %1$s TB</string>
+    <string name="shared_string_memory_used_gb_desc">Notað %1$s GB</string>
+    <string name="shared_string_memory_used_mb_desc">Notað %1$s MB</string>
+    <string name="shared_string_memory_used_kb_desc">Notað %1$s kB</string>
+    <string name="contour_lines_and_hillshade">Hæðarlínur og hæðaskygging</string>
+    <string name="routing_attr_prefer_unpaved_name">Velja vegi með óbundnu slitlagi</string>
+    <string name="routing_attr_prefer_unpaved_description">Velja frekar vegi með óbundnu slitlagi.</string>
+    <string name="update_all_maps">Uppfæra öll kort</string>
+    <string name="update_all_maps_q">Ertu viss um að þú viljir uppfæra öll (%1$d) kort\?</string>
 </resources>
\ No newline at end of file
diff --git a/OsmAnd/res/values-my/strings.xml b/OsmAnd/res/values-my/strings.xml
index 4afd4b4..73e362f 100644
--- a/OsmAnd/res/values-my/strings.xml
+++ b/OsmAnd/res/values-my/strings.xml
@@ -28,8 +28,6 @@
     <string name="configure_profile">ပရိုဖိုင်းကိုပြုပြင်မြည်</string>
     <string name="switch_profile">ပရိုဖိုင်းကိုပြောင်းလဲမည်</string>
     <string name="change_data_storage_full_description">OsmAnd အချက်အလက်ဖိုင်များကိုနေရာအသစ်သို့ရွှေ့ပါ။ \n%1$s &gt; %2$s</string>
-    <string name="data_storage_preference_summary">%1$s • သုံးပြီး %2$s GB</string>
-    <string name="data_storage_space_description">"နေရာလွပ်  %1$s • %2$s / %3$s GB"</string>
     <string name="enter_path_to_folder">folder ကိုရှိနေရာကိုရိုက်ထည့်ပါ</string>
     <string name="shared_string_select_folder">ဖိုလ်ဒါကိုရွေးပါ</string>
     <string name="paste_Osmand_data_folder_path">OsmAnd ဒေတာရှိသော ဖိုလ်ဒါနေရာကိုကူးထည့်ပါ</string>
@@ -251,4 +249,25 @@
     <string name="special_routing_type">အထူးလမ်းကြောင်း</string>
     <string name="application_profiles_descr">အက်ပလီကေးရှင်းထဲတွင်မြင်နိုင်သောပရိုဖိုင်းများကိုရွေးချယ်ပါ။</string>
     <string name="application_profiles">အက်ပလီကေးရှင်းပရိုဖိုင်းများ</string>
-</resources>
+    <string name="transfers_size">%1$d လွှဲပြောင်းမှု</string>
+    <string name="add_start_and_end_points">အစနှင့်အဆုံးမှတ်နေရာများကိုထည့်ပါ</string>
+    <string name="route_add_start_point">အစနေရာထည့်ပါ</string>
+    <string name="route_descr_select_start_point">အစနေရာကိုရွေးပါ</string>
+    <string name="rendering_attr_surface_unpaved_name">လမ်းခင်းမရှိ</string>
+    <string name="rendering_attr_surface_sand_name">သဲ</string>
+    <string name="rendering_attr_surface_grass_name">မြက်ပင်</string>
+    <string name="rendering_attr_surface_grass_paver_name">မြက်ခင်းပုံ</string>
+    <string name="rendering_attr_surface_ground_name">မြေပြင်</string>
+    <string name="rendering_attr_surface_dirt_name">ဖုန်</string>
+    <string name="rendering_attr_surface_mud_name">ရွှံ့</string>
+    <string name="rendering_attr_surface_ice_name">ရေခဲပြင်</string>
+    <string name="rendering_attr_surface_salt_name">ဆားငန်</string>
+    <string name="rendering_attr_surface_snow_name">နှင်း</string>
+    <string name="rendering_attr_surface_asphalt_name">ကတ္တရာ</string>
+    <string name="rendering_attr_surface_paved_name">လမ်းခင်း</string>
+    <string name="rendering_attr_surface_concrete_name">ကွန်ကရစ်</string>
+    <string name="rendering_attr_surface_cobblestone_name">လမ်းခင်းကျောက်ခဲ</string>
+    <string name="rendering_attr_surface_paving_stones_name">ကျောက်ပြားခင်း</string>
+    <string name="public_transport_warning_title">ပြည်သူပို့ဆောင်ရေးလမ်းညွှန်သည်လက်ရှိတွင် beta စမ်းသပ်ခြင်းဖြစ်၍၊ အမှားအယွင်းများနှင့်အမှားများရှိနိင်သည်။</string>
+    <string name="add_intermediate">ကြားရပ်နေရာထည့်ပါ</string>
+</resources>
\ No newline at end of file
diff --git a/OsmAnd/res/values-nb/strings.xml b/OsmAnd/res/values-nb/strings.xml
index bb90b8b..d63ac76 100644
--- a/OsmAnd/res/values-nb/strings.xml
+++ b/OsmAnd/res/values-nb/strings.xml
@@ -3228,7 +3228,7 @@
     <string name="sett_no_ext_input">Ingen</string>
     <string name="change_data_storage_full_description">Flytt OsmAnd-datafiler til det nye målet\?
 \n%1$s &gt; %2$s</string>
-    <string name="data_storage_preference_summary">%1$s • %2$s GB brukt</string>
+    <string name="data_storage_preference_summary">%1$s • %2$s</string>
     <string name="data_storage_space_description">%1$s GB ledig • %2$s GB totalt</string>
     <string name="shared_string_select_folder">Velg mappe</string>
     <string name="change_osmand_data_folder_question">Endre OsmAnd-datamappe\?</string>
diff --git a/OsmAnd/res/values-nl/phrases.xml b/OsmAnd/res/values-nl/phrases.xml
index 7148dc6..f9ba100 100644
--- a/OsmAnd/res/values-nl/phrases.xml
+++ b/OsmAnd/res/values-nl/phrases.xml
@@ -1778,7 +1778,7 @@
     <string name="poi_bridge_type_movable">Soort brug: beweegbaar</string>
     <string name="poi_bridge_movable_bascule">Soort brug: klapbrug</string>
     <string name="poi_bridge_movable_swing">Soort brug: draaibrug</string>
-    <string name="poi_bridge_movable_lift">Soort brug:</string>
+    <string name="poi_bridge_movable_lift">Soort brug: hefbrug</string>
     <string name="poi_lit_yes">Verlicht: ja</string>
     <string name="poi_lit_no">Verlicht: nee</string>
     <string name="poi_surface_wood">Oppervlak: hout</string>
@@ -2764,4 +2764,105 @@
     <string name="poi_hgv_yes">Ja</string>
     <string name="poi_goods_yes">Ja</string>
     <string name="poi_disabled_yes">Ja</string>
+    <string name="poi_bridge_structure_boardwalk">Soort brug: vlonderpad</string>
+    <string name="poi_bridge_movable_submersible">Beweegbare brug type: afzinkbaar</string>
+    <string name="poi_conveying_yes">Roltrap: ja</string>
+    <string name="poi_health_specialty_speech_therapy_yes">Spraaktherapie</string>
+    <string name="poi_health_specialty_acupuncture_yes">Acupunctuur</string>
+    <string name="poi_health_specialty_homeopathy_yes">Homeopathie</string>
+    <string name="poi_parking_surface">Type: wegdek</string>
+    <string name="poi_running">Hardlopen</string>
+    <string name="poi_karting">Karten</string>
+    <string name="poi_nuclear_explosion_crater_diameter">Explosie: kraterdiameter</string>
+    <string name="poi_disease_ebola_yes">Ebola: ja</string>
+    <string name="poi_disease_ebola_no">Ebola: nee</string>
+    <string name="poi_disease_aids_yes">AIDS: ja</string>
+    <string name="poi_disease_aids_no">AIDS: nee</string>
+    <string name="poi_fire_hydrant_position_sidewalk">Stoep</string>
+    <string name="poi_fire_hydrant_position_parking_lot">Parkeerplaats</string>
+    <string name="poi_fire_hydrant_position_street">Straat</string>
+    <string name="poi_fire_hydrant_position_underground">Ondergronds</string>
+    <string name="poi_depth">DIepte</string>
+    <string name="poi_salt_yes">Zout</string>
+    <string name="poi_salt_no">Zout: nee</string>
+    <string name="poi_summer_camp">Zomerkamp</string>
+    <string name="poi_ventilation_shaft">Ventilatieschacht</string>
+    <string name="poi_telescope">Telescoop</string>
+    <string name="poi_telescope_type_optical">Optisch</string>
+    <string name="poi_telescope_type_radio">Radio</string>
+    <string name="poi_telescope_type_gamma">Gamma</string>
+    <string name="poi_telescope_diameter">Diameter</string>
+    <string name="poi_telescope_spectrum">Spectrum</string>
+    <string name="poi_telescope_usage_education">Doel: educatief</string>
+    <string name="poi_telescope_usage_espionage">Doel: spionage</string>
+    <string name="poi_telescope_usage_research">Doel: onderzoek</string>
+    <string name="poi_observatory_type_espionage">Doel: spionage</string>
+    <string name="poi_observatory_type_meteorological">Meteorologisch</string>
+    <string name="poi_voltage">Voltage</string>
+    <string name="poi_barometer_yes">Barometer</string>
+    <string name="poi_barometer_no">Barometer: nee</string>
+    <string name="poi_thermometer_yes">Thermometer</string>
+    <string name="poi_thermometer_no">Thermometer: nee</string>
+    <string name="poi_hygrometer_yes">Hygrometer</string>
+    <string name="poi_hygrometer_no">Hygrometer: nee</string>
+    <string name="poi_min_age">Minimumleeftijd</string>
+    <string name="poi_wiki_link">Wikipedia</string>
+    <string name="poi_xmas">Kerst</string>
+    <string name="poi_xmas_market">Kerstmarkt</string>
+    <string name="poi_xmas_tree">Kerstboom</string>
+    <string name="poi_gambling_lottery">Loterij</string>
+    <string name="poi_locomotive">Locomotief</string>
+    <string name="poi_drink_wine_yes">Wijn: ja</string>
+    <string name="poi_zoo_birds">Vogels</string>
+    <string name="poi_zoo_reptile">Reptielen</string>
+    <string name="poi_direction_n">Richting: noord</string>
+    <string name="poi_direction_nne">Richting: noord-noordoost</string>
+    <string name="poi_direction_ne">Richting: noordoost</string>
+    <string name="poi_direction_ene">Richting: oost-noordoost</string>
+    <string name="poi_direction_e">Richting: oost</string>
+    <string name="poi_direction_ese">Richting: oost-zuidoost</string>
+    <string name="poi_direction_se">Richting: zuidoost</string>
+    <string name="poi_direction_sse">Richting: zuid-zuidoost</string>
+    <string name="poi_direction_s">Richting: zuid</string>
+    <string name="poi_direction_ssw">Richting: zuid-zuidwest</string>
+    <string name="poi_direction_sw">Richting: zuidwest</string>
+    <string name="poi_direction_wsw">Richting: west-zuidwest</string>
+    <string name="poi_direction_w">Richting: west</string>
+    <string name="poi_direction_wnw">Richting: west-noordwest</string>
+    <string name="poi_direction_nw">Richting: noordwest</string>
+    <string name="poi_direction_nnw">Richting: noord-noordwest</string>
+    <string name="poi_direction_forward">Richting: vooruit</string>
+    <string name="poi_direction_backward">Richting: achteruit</string>
+    <string name="poi_direction_clockwise">Richting: met de klok mee</string>
+    <string name="poi_direction_anticlockwise">Richting: tegen de klok in</string>
+    <string name="poi_direction_up">Richting: omhoog</string>
+    <string name="poi_direction_down">Richting: omlaag</string>
+    <string name="poi_direction_all">"Richting:  alle"</string>
+    <string name="poi_surface_clay">Klei</string>
+    <string name="poi_operational_status_open">Open</string>
+    <string name="poi_operational_status_closed">Gesloten</string>
+    <string name="poi_car_yes">Auto: ja</string>
+    <string name="poi_car_no">Auto: nee</string>
+    <string name="poi_truck_yes">Vrachtwagen: ja</string>
+    <string name="poi_truck_no">Vrachtwagen: nee</string>
+    <string name="poi_hazard_nuclear">Radioactief gevaar</string>
+    <string name="poi_hazard_erosion">Erosiegevaar</string>
+    <string name="poi_hazard_avalanche">Lawinegevaar</string>
+    <string name="poi_hazard_slippery_road">Gladde weg</string>
+    <string name="poi_hazard_flood">Overstromingsgevaar</string>
+    <string name="poi_hazard_minefield">Mijnenveld</string>
+    <string name="poi_ruins">Ruïne</string>
+    <string name="poi_hill">Heuvel</string>
+    <string name="poi_laboratory">Medisch laboratorium</string>
+    <string name="poi_blood_donation">Bloeddonatie</string>
+    <string name="poi_hazard">Gevaar</string>
+    <string name="poi_snowmobile_filter">Toegang sneeuwscooters</string>
+    <string name="poi_access_bus">Toegang bussen</string>
+    <string name="poi_access_caravan">Toegang caravans</string>
+    <string name="poi_access_trailer">Toegang aanhangwagens</string>
+    <string name="poi_access_motorcycle">Toegang motoren</string>
+    <string name="poi_access_moped">Toegang brommers</string>
+    <string name="poi_access_mofa">Toegang motorfietsen</string>
+    <string name="poi_access_hgv">Toegang vrachtwagens</string>
+    <string name="poi_access_goods">Toegang licht goederenvervoer</string>
 </resources>
\ No newline at end of file
diff --git a/OsmAnd/res/values-pl/strings.xml b/OsmAnd/res/values-pl/strings.xml
index 2da2499..811961e 100644
--- a/OsmAnd/res/values-pl/strings.xml
+++ b/OsmAnd/res/values-pl/strings.xml
@@ -3299,8 +3299,6 @@
     <string name="download_detailed_map">Pobierz szczegółową mapę %S, aby zobaczyć ten obszar.</string>
     <string name="change_data_storage_full_description">Przenieść pliki danych OsmAnd do nowego położenia\?
 \n%1$s &gt; %2$s</string>
-    <string name="data_storage_preference_summary">%1$s • Zajęte %2$s GB</string>
-    <string name="data_storage_space_description">Wolne %1$s GB • Ogółem %2$s GB</string>
     <string name="enter_path_to_folder">Proszę wprowadzić ścieżkę do katalogu</string>
     <string name="shared_string_select_folder">Wybierz katalog</string>
     <string name="paste_Osmand_data_folder_path">Wklej ścieżkę do katalogu z danymi OsmAnd</string>
diff --git a/OsmAnd/res/values-pt-rBR/phrases.xml b/OsmAnd/res/values-pt-rBR/phrases.xml
index 3c12354..99da31e 100644
--- a/OsmAnd/res/values-pt-rBR/phrases.xml
+++ b/OsmAnd/res/values-pt-rBR/phrases.xml
@@ -2486,7 +2486,7 @@
     <string name="poi_religion_type">Religião</string>
     <string name="poi_denomination">Denominação</string>
     <string name="poi_information_type">Tipo</string>
-    <string name="poi_information_contents">Conteúdos</string>
+    <string name="poi_information_contents">Conteúdo</string>
     <string name="poi_clock_option">Adicional</string>
     <string name="poi_resort_type">Tipo</string>
     <string name="poi_theatre_genre">Gênero</string>
@@ -3169,8 +3169,8 @@
     <string name="poi_motorcycle_parts_no">Peças: não</string>
     <string name="poi_motorcycle_tyres_yes">Pneus</string>
     <string name="poi_motorcycle_tyres_no">Pneus: não</string>
-    <string name="poi_motorcycle_clothes_yes">Roupas para moto</string>
-    <string name="poi_motorcycle_clothes_no">Roupas para moto: não</string>
+    <string name="poi_motorcycle_clothes_yes">Roupas para motociclistas</string>
+    <string name="poi_motorcycle_clothes_no">Roupas para motociclistas: não</string>
     <string name="poi_motorcycle_type_scooter">Lambreta</string>
     <string name="poi_motorcycle_type_sportbike">Esportiva</string>
     <string name="poi_motorcycle_type_chopper">Chopper</string>
@@ -3727,4 +3727,5 @@
     <string name="poi_craft_cabinet_maker">Marceneiro</string>
     <string name="poi_charge">Pagamento</string>
     <string name="poi_pet_grooming">Cuidado de animais</string>
+    <string name="poi_atm_yes">Caixa automático: sim</string>
 </resources>
\ 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 d03ed7a..0cfa97b 100644
--- a/OsmAnd/res/values-pt-rBR/strings.xml
+++ b/OsmAnd/res/values-pt-rBR/strings.xml
@@ -3279,8 +3279,6 @@
     <string name="download_detailed_map">Faça o download do mapa %s detalhado, para visualizar esta área.</string>
     <string name="change_data_storage_full_description">Mover arquivos de dados OsmAnd para o novo destino\?
 \n%1$s &gt; %2$s</string>
-    <string name="data_storage_preference_summary">%1$s • Usado %2$s GB</string>
-    <string name="data_storage_space_description">Livre %1$s GB • Total %2$s GB</string>
     <string name="enter_path_to_folder">Digite o caminho para a pasta</string>
     <string name="shared_string_select_folder">Selecionar pasta</string>
     <string name="paste_Osmand_data_folder_path">Cole o caminho para a pasta com os dados OsmAnd</string>
@@ -3319,5 +3317,21 @@
     <string name="shared_string_memory_tb_desc">%1$s TB</string>
     <string name="shared_string_memory_gb_desc">%1$s GB</string>
     <string name="shared_string_memory_mb_desc">%1$s MB</string>
-    <string name="shared_string_memory_kb_desc">%1$s KB</string>
+    <string name="shared_string_memory_kb_desc">%1$s kB</string>
+    <string name="data_storage_preference_summary">%1$s • %2$s</string>
+    <string name="data_storage_space_description">Livre %1$s GB • Total %2$s GB</string>
+    <string name="track_storage_directory">Diretório de armazenamento de trilhas</string>
+    <string name="track_storage_directory_descrp">As trilhas podem ser armazenadas na pasta \"rec\" ou em pastas mensais ou diárias.</string>
+    <string name="store_tracks_in_rec_directory">Armazenar trilhas gravadas na pasta \"rec\"</string>
+    <string name="store_tracks_in_daily_directories">Armazenar trilhas gravadas em pastas diárias</string>
+    <string name="store_tracks_in_daily_directories_descrp">Armazenar as trilhas gravadas em subpastas por dia de gravação (como 2018-01-01).</string>
+    <string name="shared_string_memory_used_tb_desc">Usado %1$s TB</string>
+    <string name="shared_string_memory_used_gb_desc">Usado %1$s GB</string>
+    <string name="shared_string_memory_used_mb_desc">Usado %1$s MB</string>
+    <string name="shared_string_memory_used_kb_desc">Usado %1$s kB</string>
+    <string name="contour_lines_and_hillshade">Curvas de nível e Sombras de relevo</string>
+    <string name="routing_attr_prefer_unpaved_name">Preferir estradas não pavimentadas</string>
+    <string name="routing_attr_prefer_unpaved_description">Preferir estradas não pavimentadas.</string>
+    <string name="update_all_maps">Atualizar todos os mapas</string>
+    <string name="update_all_maps_q">Tem certeza de que deseja atualizar todos os mapas (%1$d)\?</string>
 </resources>
\ No newline at end of file
diff --git a/OsmAnd/res/values-pt/phrases.xml b/OsmAnd/res/values-pt/phrases.xml
index 23ce37b..3436839 100644
--- a/OsmAnd/res/values-pt/phrases.xml
+++ b/OsmAnd/res/values-pt/phrases.xml
@@ -3710,4 +3710,7 @@
     <string name="poi_craft_floorer">Assentador de piso</string>
     <string name="poi_craft_bakery">Padaria</string>
     <string name="poi_craft_cabinet_maker">Marceneiro</string>
+    <string name="poi_charge">Cobrança</string>
+    <string name="poi_pet_grooming">Asseio de animais</string>
+    <string name="poi_atm_yes">Caixa automática: sim</string>
 </resources>
\ No newline at end of file
diff --git a/OsmAnd/res/values-pt/strings.xml b/OsmAnd/res/values-pt/strings.xml
index b71156c..ac3ea13 100644
--- a/OsmAnd/res/values-pt/strings.xml
+++ b/OsmAnd/res/values-pt/strings.xml
@@ -3290,8 +3290,6 @@
     <string name="download_detailed_map">Descarregue o mapa detalhado de %s para ver esta área.</string>
     <string name="change_data_storage_full_description">Mover ficheiros de dados OsmAnd para o novo destino\?
 \n%1$s &gt; %2$s</string>
-    <string name="data_storage_preference_summary">%1$s • Usado %2$s GB</string>
-    <string name="data_storage_space_description">Livre %1$s GB • Total %2$s GB</string>
     <string name="enter_path_to_folder">Insira o caminho para a pasta</string>
     <string name="shared_string_select_folder">Selecionar pasta</string>
     <string name="paste_Osmand_data_folder_path">Colar caminho para a pasta com dados OsmAnd</string>
@@ -3329,5 +3327,22 @@
     <string name="shared_string_memory_tb_desc">%1$s TB</string>
     <string name="shared_string_memory_gb_desc">%1$s GB</string>
     <string name="shared_string_memory_mb_desc">%1$s MB</string>
-    <string name="shared_string_memory_kb_desc">%1$s KB</string>
+    <string name="shared_string_memory_kb_desc">%1$s kB</string>
+    <string name="rendering_attr_piste_difficulty_aerialway_name">Via aérea</string>
+    <string name="track_storage_directory">Diretório de Armazenamento de Caminhos</string>
+    <string name="track_storage_directory_descrp">Os caminhos podem ser armazenados na pasta rec ou em pastas mensais, ou diárias.</string>
+    <string name="store_tracks_in_rec_directory">Armazenar os caminhos gravados na pasta rec</string>
+    <string name="store_tracks_in_daily_directories">Armazenar caminhos gravados em pastas diárias</string>
+    <string name="store_tracks_in_daily_directories_descrp">Armazenar caminhos gravados em subpastas por dia de gravação (como 2018-01-01).</string>
+    <string name="data_storage_preference_summary">%1$s • %2$s</string>
+    <string name="data_storage_space_description">Livre %1$s GB • Total %2$s GB</string>
+    <string name="shared_string_memory_used_tb_desc">%1$s TB usado(s)</string>
+    <string name="shared_string_memory_used_gb_desc">%1$s GB usado(s)</string>
+    <string name="shared_string_memory_used_mb_desc">%1$s MB usado(s)</string>
+    <string name="shared_string_memory_used_kb_desc">%1$s kB usado(s)</string>
+    <string name="contour_lines_and_hillshade">Curvas de nível e Sombras de relevo</string>
+    <string name="routing_attr_prefer_unpaved_name">Preferir estradas não pavimentadas</string>
+    <string name="routing_attr_prefer_unpaved_description">Preferir estradas não pavimentadas.</string>
+    <string name="update_all_maps">Atualizar todos os mapas</string>
+    <string name="update_all_maps_q">Tem certeza de que deseja atualizar todos os mapas (%1$d)\?</string>
 </resources>
\ No newline at end of file
diff --git a/OsmAnd/res/values-ru/phrases.xml b/OsmAnd/res/values-ru/phrases.xml
index 4196a51..4cf22c2 100644
--- a/OsmAnd/res/values-ru/phrases.xml
+++ b/OsmAnd/res/values-ru/phrases.xml
@@ -603,7 +603,7 @@
 	<string name="poi_crematorium">Крематорий</string>
 	<string name="poi_internet_cafe">Интернет-кафе;Интернет-салон;Киберкафе</string>
 	<string name="poi_bank">Банк</string>
-	<string name="poi_amenity_atm">Банкомат</string>
+	<string name="poi_atm">Банкомат</string>
 	<string name="poi_money_lender">Ростовщик</string>
 	<string name="poi_pawnbroker">Ломбард</string>
 	<string name="poi_bureau_de_change">Обмен валют</string>
@@ -2426,7 +2426,7 @@
 	<string name="poi_inscription_e">Надпись:З</string>
 	<string name="poi_inscription_ne">Надпись:СЗ</string>
 	<string name="poi_construction_yes">В процессе строительства</string>
-	<string name="poi_additional_atm_yes">С банкоматом;Банкомат</string>
+	<string name="poi_atm_yes">С банкоматом;Банкомат</string>
 	<string name="poi_atm_no">Без банкомата</string>
 	<string name="poi_firepit">Место для разведения огня</string>
 	<string name="poi_street_cabinet">Распределительный шкаф</string>
diff --git a/OsmAnd/res/values-ru/strings.xml b/OsmAnd/res/values-ru/strings.xml
index a63403b..d3c677d 100644
--- a/OsmAnd/res/values-ru/strings.xml
+++ b/OsmAnd/res/values-ru/strings.xml
@@ -3259,8 +3259,8 @@
     <string name="change_data_storage_full_description">Переместите файлы данных OsmAnd в новое место назначения\?
 \n%1$s &gt; %2$s</string>
     <string name="shared_string_by_default">По умолчанию</string>
-    <string name="data_storage_preference_summary">%1$s • Использовано %2$s ГБ</string>
-    <string name="data_storage_space_description">"Свободно  %1$s • %2$s / %3$s ГБ"</string>
+    <string name="data_storage_preference_summary">%1$s • %2$s</string>
+    <string name="data_storage_space_description">"Свободно %1$s ГБ • Всего %2$s ГБ"</string>
     <string name="enter_path_to_folder">Введите путь к папке</string>
     <string name="shared_string_select_folder">Выберите папку</string>
     <string name="paste_Osmand_data_folder_path">Вставить путь к папке с данными OsmAnd</string>
@@ -3269,4 +3269,11 @@
     <string name="internal_app_storage_description">Внутреннее хранилище, скрытое от пользователя и других приложений, поэтому никто, кроме OsmAnd не может получить доступ к вашим данным</string>
     <string name="change_data_storage_folder">Изменение папку хранения данных</string>
     <string name="avoid_in_routing_descr_">Избегать определенные маршруты и типы дорог</string>
+    <string name="shared_string_memory_used_tb_desc">Использовано %1$sТБ</string>
+    <string name="shared_string_memory_used_gb_desc">Использовано %1$s ГБ</string>
+    <string name="shared_string_memory_used_mb_desc">Использовано %1$s МБ</string>
+    <string name="shared_string_memory_used_kb_desc">Использовано %1$s кБ</string>
+    <string name="routing_attr_driving_style_prefer_unpaved_name">Предпочитать дороги без покрытия</string>
+    <string name="routing_attr_driving_style_prefer_unpaved_description">Предпочитать дороги без покрытия</string>
+
 </resources>
\ No newline at end of file
diff --git a/OsmAnd/res/values-sc/strings.xml b/OsmAnd/res/values-sc/strings.xml
index 87e2cc6..a6aaecc 100644
--- a/OsmAnd/res/values-sc/strings.xml
+++ b/OsmAnd/res/values-sc/strings.xml
@@ -3300,8 +3300,6 @@
     <string name="download_detailed_map">Iscàrriga sa mapa de %s fata a sa minuda pro pompiare cust\'àrea.</string>
     <string name="change_data_storage_full_description">Tramudare sos datos de OsmAnd in sa destinatzione noa\?
 \n%1$s &gt; %2$s</string>
-    <string name="data_storage_preference_summary">%1$s • Impreados: %2$s GB</string>
-    <string name="data_storage_space_description">Lìberos: %1$s • %2$s / %3$s GB</string>
     <string name="enter_path_to_folder">Inserta s\'àndala pro sa cartella</string>
     <string name="shared_string_select_folder">Ischerta sa cartella</string>
     <string name="paste_Osmand_data_folder_path">Incolla s\'àndala pro sa cartella cun sos datos de OsmAnd</string>
diff --git a/OsmAnd/res/values-sk/strings.xml b/OsmAnd/res/values-sk/strings.xml
index 2a3d68e..02555d4 100644
--- a/OsmAnd/res/values-sk/strings.xml
+++ b/OsmAnd/res/values-sk/strings.xml
@@ -3280,8 +3280,6 @@
     <string name="download_detailed_map">Pre zobrazenie tejto oblasti si stiahnite podrobnú mapu %s.</string>
     <string name="change_data_storage_full_description">Presunúť dátové súbory OsmAnd do nového umiestnenia\?
 \n%1$s &gt; %2$s</string>
-    <string name="data_storage_preference_summary">%1$s • Použité %2$s GB</string>
-    <string name="data_storage_space_description">Voľné %1$s • %2$s / %3$s GB</string>
     <string name="enter_path_to_folder">Zadajte cestu k priečinku</string>
     <string name="shared_string_select_folder">Zvoľte priečinok</string>
     <string name="paste_Osmand_data_folder_path">Vložte cestu k priečinku s dátami OsmAnd</string>
diff --git a/OsmAnd/res/values-sv/phrases.xml b/OsmAnd/res/values-sv/phrases.xml
index d27fc99..4306fea 100644
--- a/OsmAnd/res/values-sv/phrases.xml
+++ b/OsmAnd/res/values-sv/phrases.xml
@@ -12,7 +12,7 @@
     <string name="poi_air_transport">Lufttransport</string>
     <string name="poi_water_transport">Transport på vatten</string>
     <string name="poi_bicycle_transport">Transport med cykel</string>
-    <string name="poi_filling_station">Bensinstation</string>
+    <string name="poi_filling_station">Tankstation</string>
     <string name="poi_aerialway_transport">Luftvägstransport</string>
     <string name="poi_node_networks">Nätverksnoder för hajk/cykling</string>
     <string name="poi_fuel_type">Bränsletyp</string>
@@ -936,7 +936,7 @@
     <string name="poi_car_sharing">Samåkning</string>
     <string name="poi_boat_sharing">Båtdelning</string>
     <string name="poi_dock">Kaj</string>
-    <string name="poi_toilets">Toalett</string>
+    <string name="poi_toilets">Vilorum;Toaletter</string>
     <string name="poi_shower">Dusch</string>
     <string name="poi_sauna">Bastu</string>
     <string name="poi_brothel">Bordell</string>
@@ -2002,7 +2002,7 @@
     <string name="poi_service_bicycle_second_hand_no">Butikshandel med begagnade cyklar: nej</string>
     <string name="poi_service_bicycle_charging_yes">Laddning: ja</string>
     <string name="poi_service_bicycle_charging_no">Laddning: nej</string>
-    <string name="poi_bicycle_repair_station">Cykel-själv-reparation station</string>
+    <string name="poi_bicycle_repair_station">Cykelreparationsstation; Cykel självreparationsstation</string>
     <string name="poi_wildlife_hide">Plats för att observera vilda djur</string>
     <string name="poi_training_language">Utbildning: språk</string>
     <string name="poi_training_music">Utbildning: musik</string>
@@ -2582,7 +2582,7 @@
     <string name="poi_free_flying_hanggliding_yes">Hanggliding</string>
     <string name="poi_free_flying_hanggliding_no">Hanggliding: nej</string>
     <string name="poi_free_flying_rigid_yes">Stelt</string>
-    <string name="poi_free_flying_rigid_no"/>
+    <string name="poi_free_flying_rigid_no">Fritt flygande styv: nej</string>
     <string name="poi_free_flying_site_orientation_n">Frittflygandeorientering: N</string>
     <string name="poi_free_flying_site_orientation_ne">Frittflygandeorientering: NÖ</string>
     <string name="poi_free_flying_site_orientation_e">Frittflygandeorientering: Ö</string>
diff --git a/OsmAnd/res/values-sv/strings.xml b/OsmAnd/res/values-sv/strings.xml
index 1de54fd..c2e9192 100644
--- a/OsmAnd/res/values-sv/strings.xml
+++ b/OsmAnd/res/values-sv/strings.xml
@@ -2776,17 +2776,17 @@
     <string name="voice_announcements">Röstmeddelanden</string>
     <string name="intermediate_destinations">Mellanliggande destinationer</string>
     <string name="arrive_at_time">Ankomst klockan %1$s</string>
-    <string name="rate_dialog_descr">Vänligen ge oss 30 sekunder, dela återkoppling och betygsätt vårt arbete på Google Play.</string>
+    <string name="rate_dialog_descr">Vänligen ge oss 30 sekunder genom att dela din återkoppling och betygsätta vårt arbete på Google Play.</string>
     <string name="button_rate">Betygsätt</string>
     <string name="shared_string_privacy_policy">Sekretesspolicy</string>
     <string name="help_us_make_osmand_better">Hjälp oss att göra OsmAnd bättre!</string>
-    <string name="make_osmand_better_descr">Tillåt OsmAnd att samla in och bearbeta anonyma användningsdata. Vi samlar inte in eller lagrar data om din plats, eller om de platser som du ser på kartan.
-\n
-\nDu kan alltid ändra ditt val i Inställningar &gt; Sekretess och säkerhet.</string>
+    <string name="make_osmand_better_descr">Tillåt OsmAnd att samla in och bearbeta anonyma applikationsanvändningsdata. Vi samlar inte in eller lagrar data om din position, eller om några platser du ser på kartan. 
+\n 
+\nDu kan när som helst ändra ditt val i Inställningar &gt; Sekretess och säkerhet.</string>
     <string name="choose_data_to_share">Välj vilken typ av data du vill dela:</string>
-    <string name="downloaded_maps">Hämtade Kartor</string>
+    <string name="downloaded_maps">Kartor nedladdade</string>
     <string name="visited_screens">Besökta skärmar</string>
-    <string name="collected_data_descr">Lista över data du vill dela med OsmAnd.</string>
+    <string name="collected_data_descr">Definiera vilka data du tillåter OsmAnd att dela.</string>
     <string name="downloaded_maps_collect_descr">Vi samlar in dessa data för att förstå kartorna över vilka regioner och länder som är mest populära.</string>
     <string name="visited_screens_collect_descr">Vi samlar in dessa data för att förstå de mest populära funktionerna i OsmAnd.</string>
     <string name="privacy_and_security_change_descr">Genom att klicka på \"Tillåt\" godkänner du våra %1$s</string>
@@ -2899,7 +2899,7 @@
     <string name="wake_time">Vakentid</string>
     <string name="units_and_formats">Enheter &amp; format</string>
     <string name="appearance">Utseende</string>
-    <string name="map_look_descr">ikoner, moduler</string>
+    <string name="map_look_descr">Kartans utseende</string>
     <string name="map_look">Kartans utseende</string>
     <string name="list_of_installed_plugins">Lista med installerade tillägg</string>
     <string name="configure_navigation">Konfigurera navigation</string>
diff --git a/OsmAnd/res/values-tr/strings.xml b/OsmAnd/res/values-tr/strings.xml
index 482fc1e..fe08d7b 100644
--- a/OsmAnd/res/values-tr/strings.xml
+++ b/OsmAnd/res/values-tr/strings.xml
@@ -3243,8 +3243,6 @@
 \nHesaplama: %.1f sn, %d yol, %d döşeme)</string>
     <string name="change_data_storage_full_description">OsmAnd veri dosyaları yeni hedefe taşınsın mı\?
 \n%1$s &gt; %2$s</string>
-    <string name="data_storage_preference_summary">%1$s • Kullanılan %2$s GB</string>
-    <string name="data_storage_space_description">Boş %1$s GB • Toplam %2$s GB</string>
     <string name="enter_path_to_folder">Klasörün yolunu girin</string>
     <string name="shared_string_select_folder">Klasör seç</string>
     <string name="paste_Osmand_data_folder_path">OsmAnd verilerinin bulunduğu klasörün yolunu yapıştırın</string>
@@ -3283,5 +3281,21 @@
     <string name="shared_string_memory_tb_desc">%1$s TB</string>
     <string name="shared_string_memory_gb_desc">%1$s GB</string>
     <string name="shared_string_memory_mb_desc">%1$s MB</string>
-    <string name="shared_string_memory_kb_desc">%1$s KB</string>
+    <string name="shared_string_memory_kb_desc">%1$s kB</string>
+    <string name="data_storage_preference_summary">%1$s • %2$s</string>
+    <string name="data_storage_space_description">Boş %1$s GB • Toplam %2$s GB</string>
+    <string name="track_storage_directory">Yol-izi Depolama Dizini</string>
+    <string name="track_storage_directory_descrp">Yol-izleri rec dizininde ya da aylık veya günlük dizinlerde depolanabilir.</string>
+    <string name="store_tracks_in_rec_directory">Kaydedilen yol-izlerini rec dizininde depola</string>
+    <string name="store_tracks_in_daily_directories">Kaydedilen yol-izlerini günlük dizinlerde depola</string>
+    <string name="store_tracks_in_daily_directories_descrp">Kaydedilen yol-izlerini kayıt gününe göre alt-dizinlerde depola (2018-01-01 gibi).</string>
+    <string name="shared_string_memory_used_tb_desc">Kullanılan %1$s TB</string>
+    <string name="shared_string_memory_used_gb_desc">Kullanılan %1$s GB</string>
+    <string name="shared_string_memory_used_mb_desc">Kullanılan %1$s MB</string>
+    <string name="shared_string_memory_used_kb_desc">Kullanılan %1$s kB</string>
+    <string name="contour_lines_and_hillshade">Eşyükselti çizgileri ve Tepe gölgeleri</string>
+    <string name="routing_attr_prefer_unpaved_name">Asfaltsız yolları tercih edin</string>
+    <string name="routing_attr_prefer_unpaved_description">Asfaltsız yolları tercih edin.</string>
+    <string name="update_all_maps">Tüm haritaları güncelle</string>
+    <string name="update_all_maps_q">Tüm (%1$d) haritaları güncellemek istediğinizden emin misiniz\?</string>
 </resources>
\ 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 27f08b9..825c3c3 100644
--- a/OsmAnd/res/values-zh-rCN/strings.xml
+++ b/OsmAnd/res/values-zh-rCN/strings.xml
@@ -960,7 +960,7 @@
     <string name="si_min_m">分钟/英里</string>
     <string name="si_nm_h">海里/小时 (节)</string>
     <string name="nm_h">浬里/时</string>
-    <string name="min_mile"></string>
+    <string name="min_mile"/>
     <string name="min_km">分/公里</string>
     <string name="m_s">米/秒</string>
     <string name="shared_string_navigation">导航</string>
@@ -2746,4 +2746,38 @@
     <string name="default_speed_setting_title">默认速率</string>
     <string name="shared_string_default">默认</string>
     <string name="transport_nearby_routes">之间</string>
+    <string name="shared_string_privacy_policy">隐私政策</string>
+    <string name="help_us_make_osmand_better">帮助我们让 OsmAnd 变得更好!</string>
+    <string name="shared_string_no_thank_you">不,谢谢</string>
+    <string name="shared_string_allow">允许</string>
+    <string name="nav_type_hint">导航类型</string>
+    <string name="app_mode_taxi">出租车</string>
+    <string name="process_downloading_service">OsmAnd 下载服务</string>
+    <string name="shared_string_crash">崩溃</string>
+    <string name="turn_screen_on_sensor">使用接近传感器</string>
+    <string name="rendering_attr_winter_road_name">冬季道路</string>
+    <string name="price_free">免费</string>
+    <string name="cancel_subscription">取消订阅</string>
+    <string name="units_and_formats">单位和格式</string>
+    <string name="appearance">外观</string>
+    <string name="list_of_installed_plugins">已安装插件列表</string>
+    <string name="configure_navigation">配置导航</string>
+    <string name="general_settings_profile_descr">应用主题、单位、区域</string>
+    <string name="language_and_output">语言和输出</string>
+    <string name="reset_to_default">重置为默认值</string>
+    <string name="osmand_settings">OsmAnd 设置</string>
+    <string name="shared_string_other">其它</string>
+    <string name="plugins_settings">插件设置</string>
+    <string name="shared_string_select_folder">选择文件夹</string>
+    <string name="shared_string_calculate">计算</string>
+    <string name="shared_string_osmand_usage">OsmAnd 用法</string>
+    <string name="shared_string_memory_used_tb_desc">已使用 %1$s TB</string>
+    <string name="shared_string_memory_used_gb_desc">已使用 %1$s GB</string>
+    <string name="shared_string_memory_used_mb_desc">已使用 %1$s MB</string>
+    <string name="shared_string_memory_used_kb_desc">已使用 %1$s kB</string>
+    <string name="contour_lines_and_hillshade">轮廓线和山体阴影</string>
+    <string name="routing_attr_prefer_unpaved_name">偏好未铺装道路</string>
+    <string name="routing_attr_prefer_unpaved_description">偏好未铺装道路。</string>
+    <string name="update_all_maps">更新所有地图</string>
+    <string name="update_all_maps_q">您确认要更新全部(%1$d)地图吗?</string>
 </resources>
\ No newline at end of file
diff --git a/OsmAnd/res/values-zh-rTW/phrases.xml b/OsmAnd/res/values-zh-rTW/phrases.xml
index b40f5c9..5c0d9ec 100644
--- a/OsmAnd/res/values-zh-rTW/phrases.xml
+++ b/OsmAnd/res/values-zh-rTW/phrases.xml
@@ -3726,4 +3726,5 @@
     <string name="poi_craft_cabinet_maker">櫥櫃製造商</string>
     <string name="poi_charge">充電</string>
     <string name="poi_pet_grooming">寵物美容</string>
+    <string name="poi_atm_yes">ATM:是</string>
 </resources>
\ 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 7ae143a..6798dc2 100644
--- a/OsmAnd/res/values-zh-rTW/strings.xml
+++ b/OsmAnd/res/values-zh-rTW/strings.xml
@@ -3282,8 +3282,6 @@
     <string name="download_detailed_map">下載更詳細的 %s 地圖以檢視此區域。</string>
     <string name="change_data_storage_full_description">移動 OsmAnd 資料檔案到新目的地?
 \n%1$s &gt; %2$s</string>
-    <string name="data_storage_preference_summary">%1$s • 已使用 %2$s GB</string>
-    <string name="data_storage_space_description">剩餘 %1$s GB • 總共 %2$s GB</string>
     <string name="enter_path_to_folder">輸入到資料夾的路徑</string>
     <string name="shared_string_select_folder">選取資料夾</string>
     <string name="paste_Osmand_data_folder_path">貼上有 OsmAnd 資料的資料夾路徑</string>
@@ -3322,5 +3320,21 @@
     <string name="shared_string_memory_tb_desc">%1$s TB</string>
     <string name="shared_string_memory_gb_desc">%1$s GB</string>
     <string name="shared_string_memory_mb_desc">%1$s MB</string>
-    <string name="shared_string_memory_kb_desc">%1$s KB</string>
+    <string name="shared_string_memory_kb_desc">%1$s kB</string>
+    <string name="data_storage_preference_summary">%1$s • %2$s</string>
+    <string name="data_storage_space_description">剩餘 %1$s GB • 總共 %2$s GB</string>
+    <string name="track_storage_directory">軌跡儲存目錄</string>
+    <string name="track_storage_directory_descrp">軌跡可以儲存在 rec 資料夾或每月或每日資料夾。</string>
+    <string name="store_tracks_in_rec_directory">將已紀錄的軌跡存在 rec 資料夾中</string>
+    <string name="store_tracks_in_daily_directories">將已紀錄的軌跡存在每日資料夾中</string>
+    <string name="store_tracks_in_daily_directories_descrp">將已紀錄的軌姬儲存在紀錄日期的子資料夾中(如 2018-01-01)。</string>
+    <string name="shared_string_memory_used_tb_desc">已用 %1$s TB</string>
+    <string name="shared_string_memory_used_gb_desc">已用 %1$s GB</string>
+    <string name="shared_string_memory_used_mb_desc">已用 %1$s MB</string>
+    <string name="shared_string_memory_used_kb_desc">已用 %1$s kB</string>
+    <string name="contour_lines_and_hillshade">等高線與地形陰影</string>
+    <string name="routing_attr_prefer_unpaved_name">偏好未鋪設路面</string>
+    <string name="routing_attr_prefer_unpaved_description">偏好未鋪設路面。</string>
+    <string name="update_all_maps">更新所有地圖</string>
+    <string name="update_all_maps_q">您確定您想要更新所有 (%1$d) 地圖嗎?</string>
 </resources>
\ No newline at end of file
diff --git a/OsmAnd/res/values/phrases.xml b/OsmAnd/res/values/phrases.xml
index 8e1cd7c..ddec07f 100644
--- a/OsmAnd/res/values/phrases.xml
+++ b/OsmAnd/res/values/phrases.xml
@@ -1054,7 +1054,6 @@
 	<string name="poi_internet_cafe">Internet cafe</string>
 
 	<string name="poi_bank">Bank</string>
-	<string name="poi_amenity_atm">ATM</string>
 	<string name="poi_atm">ATM</string>
 	<string name="poi_payment_terminal">Payment terminal</string>
 	<string name="poi_money_lender">Money lender</string>
@@ -2730,7 +2729,7 @@
 	<string name="poi_inscription_ne">Inscription:NE</string>
 
 	<string name="poi_construction_yes">Under construction</string>
-	<string name="poi_additional_atm_yes">ATM: yes</string>
+	<string name="poi_atm_yes">ATM: yes</string>
 	<string name="poi_atm_no">ATM: no</string>
 
 	<string name="poi_firepit">Firepit</string>
diff --git a/OsmAnd/res/values/strings.xml b/OsmAnd/res/values/strings.xml
index 4f72c59..01e2934 100644
--- a/OsmAnd/res/values/strings.xml
+++ b/OsmAnd/res/values/strings.xml
@@ -11,6 +11,34 @@
 	Thx - Hardy
 
 -->
+    <string name="apply_preference_to_all_profiles">You can apply this change to all profiles or only to selected.</string>
+    <string name="shared_preference">Shared</string>
+    <string name="routing_attr_driving_style_prefer_unpaved_name">Prefer unpaved roads</string>
+    <string name="routing_attr_driving_style_prefer_unpaved_description">Prefer unpaved roads.</string>
+    <string name="release_3_5">
+    • Updated application and profile Settings: Settings are now arrangement by type. Each profile can be customized separately.\n\n
+    • New map download dialog which suggests a map to download while browsing\n\n
+    • Night theme fixes\n\n
+    • Fixed several routing issues around the world\n\n
+    • Updated basemap with more detailed road network\n\n
+    • Fixed flooded areas around the world\n\n
+    • Ski routing: added height profile and route complexity to the route details\n\n
+    • Other bug fixes\n\n
+    </string>
+    <string name="shared_string_memory_used_tb_desc">Used %1$s TB</string>
+    <string name="shared_string_memory_used_gb_desc">Used %1$s GB</string>
+    <string name="shared_string_memory_used_mb_desc">Used %1$s MB</string>
+    <string name="shared_string_memory_used_kb_desc">Used %1$s kB</string>
+    <string name="contour_lines_and_hillshade">Contour lines and Hillshade</string>
+    <string name="routing_attr_prefer_unpaved_name">Prefer unpaved roads</string>
+    <string name="routing_attr_prefer_unpaved_description">Prefer unpaved roads.</string>
+    <string name="update_all_maps">Update all maps</string>
+    <string name="update_all_maps_q">Are you sure you want to update all (%1$d) maps?</string>
+    <string name="track_storage_directory">Track Storage Directory</string>
+    <string name="track_storage_directory_descrp">Tracks can be stored in rec folder or in monthly or daily folders.</string>
+    <string name="store_tracks_in_rec_directory">Store recorded tracks in rec folder</string>
+    <string name="store_tracks_in_daily_directories">Store recorded tracks in daily folders</string>
+    <string name="store_tracks_in_daily_directories_descrp">Store recorded tracks in sub-folders per recording day (like 2018-01-01).</string>
     <string name="shared_string_calculate">Calculate</string>
     <string name="shared_string_osmand_usage">OsmAnd Usage</string>
     <string name="shared_sting_tiles">Tiles</string>
@@ -18,14 +46,14 @@
     <string name="shared_string_memory_tb_desc">%1$s TB</string>
     <string name="shared_string_memory_gb_desc">%1$s GB</string>
     <string name="shared_string_memory_mb_desc">%1$s MB</string>
-    <string name="shared_string_memory_kb_desc">%1$s KB</string>
+    <string name="shared_string_memory_kb_desc">%1$s kB</string>
     <string name="app_mode_utv">Side by Side</string>
     <string name="rendering_attr_piste_difficulty_aerialway_name">Aerialway</string>
     <string name="rendering_attr_piste_difficulty_connection_name">Connection</string>
     <string name="avoid_in_routing_descr_">Avoid certain routes and road types</string>
     <string name="change_data_storage_full_description">Move OsmAnd data files to the new destination?\n%1$s > %2$s</string>
-    <string name="data_storage_preference_summary">%1$s  •  Used %2$s GB</string>
-    <string name="data_storage_space_description">Free %1$s GB  •  Total %2$s GB</string>
+    <string name="data_storage_preference_summary">%1$s • %2$s</string>
+    <string name="data_storage_space_description">Free %1$s GB • Total %2$s GB</string>
     <string name="enter_path_to_folder">Enter path to the folder</string>
     <string name="shared_string_select_folder">Select folder</string>
     <string name="paste_Osmand_data_folder_path">Paste path to the folder with OsmAnd data</string>
diff --git a/OsmAnd/res/xml/data_storage.xml b/OsmAnd/res/xml/data_storage.xml
index 242418b..a153ec4 100644
--- a/OsmAnd/res/xml/data_storage.xml
+++ b/OsmAnd/res/xml/data_storage.xml
@@ -14,6 +14,12 @@
 		android:title="@string/shared_string_maps"/>
 
 	<Preference
+		android:key="contour_lines_and_hillshade_memory"
+		android:layout="@layout/data_storage_memory_used_item"
+		android:icon="@drawable/ic_map"
+		android:title="@string/contour_lines_and_hillshade"/>
+	
+	<Preference
 		android:key="tracks_memory_used"
 		android:layout="@layout/data_storage_memory_used_item"
 		android:icon="@drawable/ic_action_polygom_dark"
@@ -36,9 +42,6 @@
 		android:layout="@layout/data_storage_memory_used_item"
 		android:icon="@drawable/ic_action_folder"
 		android:title="@string/shared_string_other"/>
-	
-	<Preference
-		android:layout="@layout/divider_padding_half" />
 
 	<PreferenceCategory
 		android:key="application_profiles"
diff --git a/OsmAnd/res/xml/general_profile_settings.xml b/OsmAnd/res/xml/general_profile_settings.xml
index bf059a3..c6d681b 100644
--- a/OsmAnd/res/xml/general_profile_settings.xml
+++ b/OsmAnd/res/xml/general_profile_settings.xml
@@ -18,6 +18,13 @@
 		android:layout="@layout/preference_with_descr"
 		android:title="@string/rotate_map_to_bearing" />
 
+	<SwitchPreferenceCompat
+		android:key="center_position_on_map"
+		android:layout="@layout/preference_switch_with_descr"
+		android:summaryOff="@string/shared_string_off"
+		android:summaryOn="@string/shared_string_on"
+		android:title="@string/always_center_position_on_map" />
+
 	<net.osmand.plus.settings.preferences.ListPreferenceEx
 		android:key="map_screen_orientation"
 		android:layout="@layout/preference_with_descr"
diff --git a/OsmAnd/src/net/osmand/AndroidUtils.java b/OsmAnd/src/net/osmand/AndroidUtils.java
index f41b677..e27d316 100644
--- a/OsmAnd/src/net/osmand/AndroidUtils.java
+++ b/OsmAnd/src/net/osmand/AndroidUtils.java
@@ -388,13 +388,18 @@
 				: ctx.getResources().getColor(R.color.text_color_secondary_light));
 	}
 
-
 	public static int getTextWidth(float textSize, String text) {
 		Paint paint = new Paint();
 		paint.setTextSize(textSize);
 		return (int) paint.measureText(text);
 	}
-	
+
+	public static int getTextHeight(Paint paint) {
+		Paint.FontMetrics fm = paint.getFontMetrics();
+		float height = fm.bottom - fm.top;
+		return (int) height;
+	}
+
 	public static int dpToPx(Context ctx, float dp) {
 		Resources r = ctx.getResources();
 		return (int) TypedValue.applyDimension(
diff --git a/OsmAnd/src/net/osmand/plus/AppInitializer.java b/OsmAnd/src/net/osmand/plus/AppInitializer.java
index cfb6a12..3e6718e 100644
--- a/OsmAnd/src/net/osmand/plus/AppInitializer.java
+++ b/OsmAnd/src/net/osmand/plus/AppInitializer.java
@@ -93,6 +93,8 @@
 	public static final int VERSION_2_3 = 23;
 	// 32 - 3.2
 	public static final int VERSION_3_2 = 32;
+	// 35 - 3.5
+	public static final int VERSION_3_5 = 35;
 
 
 	public static final boolean TIPS_AND_TRICKS = false;
@@ -128,7 +130,7 @@
 		FAVORITES_INITIALIZED, NATIVE_INITIALIZED,
 		NATIVE_OPEN_GLINITIALIZED,
 		TASK_CHANGED, MAPS_INITIALIZED, POI_TYPES_INITIALIZED, ASSETS_COPIED, INIT_RENDERERS,
-		RESTORE_BACKUPS, INDEX_REGION_BOUNDARIES, SAVE_GPX_TRACKS, LOAD_GPX_TRACKS
+		RESTORE_BACKUPS, INDEX_REGION_BOUNDARIES, SAVE_GPX_TRACKS, LOAD_GPX_TRACKS, ROUTING_CONFIG_INITIALIZED
 	}
 
 	public interface AppInitializeListener {
@@ -187,6 +189,9 @@
 			} else if (prevAppVersion < VERSION_3_2) {
 				app.getSettings().BILLING_PURCHASE_TOKENS_SENT.set("");
 				startPrefs.edit().putInt(VERSION_INSTALLED_NUMBER, VERSION_3_2).commit();
+			} else if (prevAppVersion < VERSION_3_5) {
+				app.getSettings().migrateGlobalPrefsToProfile();
+				startPrefs.edit().putInt(VERSION_INSTALLED_NUMBER, VERSION_3_5).commit();
 			}
 			startPrefs.edit().putString(VERSION_INSTALLED, Version.getFullVersion(app)).commit();
 			appVersionChanged = true;
@@ -583,6 +588,7 @@
 			protected void onPostExecute(Builder builder) {
 				super.onPostExecute(builder);
 				app.updateRoutingConfig(builder);
+				notifyEvent(InitEvents.ROUTING_CONFIG_INITIALIZED);
 			}
 		}.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
 	}
diff --git a/OsmAnd/src/net/osmand/plus/GPXDatabase.java b/OsmAnd/src/net/osmand/plus/GPXDatabase.java
index 9673b18..e19d70b 100644
--- a/OsmAnd/src/net/osmand/plus/GPXDatabase.java
+++ b/OsmAnd/src/net/osmand/plus/GPXDatabase.java
@@ -16,10 +16,12 @@
 public class GPXDatabase {
 
 	private static final String DB_NAME = "gpx_database";
-	private static final int DB_VERSION = 8;
+	private static final int DB_VERSION = 9;
 	private static final String GPX_TABLE_NAME = "gpxTable";
 	private static final String GPX_COL_NAME = "fileName";
 	private static final String GPX_COL_DIR = "fileDir";
+	private static final String GPX_INDEX_NAME_DIR = "indexNameDir";
+
 	private static final String GPX_COL_TOTAL_DISTANCE = "totalDistance";
 	private static final String GPX_COL_TOTAL_TRACKS = "totalTracks";
 	private static final String GPX_COL_START_TIME = "startTime";
@@ -294,6 +296,7 @@
 					" SET " + GPX_COL_SHOW_AS_MARKERS + " = ? " +
 					"WHERE " + GPX_COL_SHOW_AS_MARKERS + " IS NULL", new Object[]{0});
 		}
+		db.execSQL("CREATE INDEX IF NOT EXISTS " + GPX_INDEX_NAME_DIR + " ON " + GPX_TABLE_NAME + " (" + GPX_COL_NAME + ", " + GPX_COL_DIR + ");");
 	}
 
 	private boolean updateLastModifiedTime(GpxDataItem item) {
@@ -455,8 +458,8 @@
 					new Object[]{ fileName, fileDir, a.totalDistance, a.totalTracks, a.startTime, a.endTime,
 							a.timeSpan, a.timeMoving, a.totalDistanceMoving, a.diffElevationUp, a.diffElevationDown,
 							a.avgElevation, a.minElevation, a.maxElevation, a.maxSpeed, a.avgSpeed, a.points, a.wptPoints,
-							color, item.file.lastModified(), item.splitType, item.splitInterval, item.apiImported ? 1 : 0, item.showAsMarkers ? 1 : 0,
-							Algorithms.encodeStringSet(item.analysis.wptCategoryNames)});
+							color, item.file.lastModified(), item.splitType, item.splitInterval, item.apiImported ? 1 : 0,
+							Algorithms.encodeStringSet(item.analysis.wptCategoryNames), item.showAsMarkers ? 1 : 0});
 		} else {
 			db.execSQL("INSERT INTO " + GPX_TABLE_NAME + "(" +
 							GPX_COL_NAME + ", " +
diff --git a/OsmAnd/src/net/osmand/plus/OsmandSettings.java b/OsmAnd/src/net/osmand/plus/OsmandSettings.java
index 7285d58..b44add4 100644
--- a/OsmAnd/src/net/osmand/plus/OsmandSettings.java
+++ b/OsmAnd/src/net/osmand/plus/OsmandSettings.java
@@ -231,6 +231,23 @@
 		return globalPreferences != null && globalPreferences.getBoolean(SETTING_CUSTOMIZED_ID, false);
 	}
 
+	public void migrateGlobalPrefsToProfile() {
+		SharedPreferences sharedPreferences = (SharedPreferences) globalPreferences;
+		Map<String, ?> map = sharedPreferences.getAll();
+		for (String key : map.keySet()) {
+			OsmandPreference pref = getPreference(key);
+			if (pref instanceof CommonPreference) {
+				CommonPreference commonPreference = (CommonPreference) pref;
+				if (!commonPreference.global && !commonPreference.isSetForMode(ApplicationMode.DEFAULT)) {
+					boolean valueSaved = setPreference(key, map.get(key), ApplicationMode.DEFAULT);
+					if (valueSaved) {
+						settingsAPI.edit(globalPreferences).remove(key).commit();
+					}
+				}
+			}
+		}
+	}
+
 	public Object getProfilePreferences(ApplicationMode mode) {
 		return settingsAPI.getPreferenceObject(getSharedPreferencesName(mode));
 	}
@@ -239,6 +256,27 @@
 		return registeredPreferences.get(key);
 	}
 
+	public boolean setSharedGeneralPreference(String key, Object value) {
+		OsmandPreference<?> preference = registeredPreferences.get(key);
+		if (preference instanceof CommonPreference) {
+			CommonPreference commonPref = (CommonPreference) preference;
+			if (commonPref.general) {
+				for (ApplicationMode mode : ApplicationMode.values(ctx)) {
+					if (commonPref.isSetForMode(mode)) {
+						settingsAPI.edit(getProfilePreferences(mode)).remove(key).commit();
+					}
+				}
+				boolean valueSaved = setPreference(key, value, ApplicationMode.DEFAULT);
+				if (valueSaved) {
+					commonPref.cachedValue = null;
+				}
+
+				return valueSaved;
+			}
+		}
+		return false;
+	}
+
 	public boolean setPreference(String key, Object value) {
 		return setPreference(key, value, APPLICATION_MODE.get());
 	}
@@ -516,6 +554,7 @@
 	public abstract class CommonPreference<T> extends PreferenceWithListener<T> {
 		private final String id;
 		private boolean global;
+		private boolean general;
 		private T cachedValue;
 		private Object cachedPreference;
 		private boolean cache;
@@ -544,6 +583,11 @@
 			return this;
 		}
 
+		public CommonPreference<T> makeGeneral() {
+			general = true;
+			return this;
+		}
+
 		protected Object getPreferences() {
 			return global ? globalPreferences : profilePreferences;
 		}
@@ -582,13 +626,21 @@
 			if (pt != null) {
 				return getProfileDefaultValue(pt);
 			}
-			if (settingsAPI.contains(defaultProfilePreferences, getId())) {
+			if (general && settingsAPI.contains(defaultProfilePreferences, getId())) {
 				return getValue(defaultProfilePreferences, defaultValue);
 			} else {
 				return defaultValue;
 			}
 		}
 
+		public boolean hasDefaultValues() {
+			return defaultValues != null && !defaultValues.isEmpty();
+		}
+
+		public boolean hasDefaultValueForMode(ApplicationMode mode) {
+			return defaultValues != null && defaultValues.containsKey(mode);
+		}
+
 		protected T getDefaultValue() {
 			return getProfileDefaultValue(currentMode);
 		}
@@ -1179,7 +1231,7 @@
 	public final OsmandPreference<Boolean> FIRST_MAP_IS_DOWNLOADED = new BooleanPreference(
 			"first_map_is_downloaded", false);
 
-	public final CommonPreference<Boolean> DRIVING_REGION_AUTOMATIC = new BooleanPreference("driving_region_automatic", true).makeProfile().cache();
+	public final CommonPreference<Boolean> DRIVING_REGION_AUTOMATIC = new BooleanPreference("driving_region_automatic", true).makeProfile().makeGeneral().cache();
 	public final OsmandPreference<DrivingRegion> DRIVING_REGION = new EnumIntPreference<DrivingRegion>(
 			"default_driving_region", DrivingRegion.EUROPE_ASIA, DrivingRegion.values()) {
 		protected boolean setValue(Object prefs, DrivingRegion val) {
@@ -1211,7 +1263,7 @@
 			return DrivingRegion.EUROPE_ASIA;
 		}
 
-	}.makeProfile().cache();
+	}.makeProfile().makeGeneral().cache();
 
 	public final CommonPreference<Boolean> METRIC_SYSTEM_CHANGED_MANUALLY = new BooleanPreference("metric_system_changed_manually", false).makeGlobal();
 
@@ -1223,7 +1275,7 @@
 			return DRIVING_REGION.get().defMetrics;
 		}
 
-	}.makeProfile();
+	}.makeProfile().makeGeneral();
 
 	//public final OsmandPreference<Integer> COORDINATES_FORMAT = new IntPreference("coordinates_format", PointDescription.FORMAT_DEGREES).makeGlobal();
 
@@ -1233,7 +1285,7 @@
 		protected AngularConstants getValue(Object prefs, AngularConstants defaultValue) {
 			return super.getValue(prefs, defaultValue);
 		}
-	}.makeProfile();
+	}.makeProfile().makeGeneral();
 
 
 	public final OsmandPreference<SpeedConstants> SPEED_SYSTEM = new EnumIntPreference<SpeedConstants>(
@@ -1263,7 +1315,7 @@
 
 		;
 
-	}.makeProfile();
+	}.makeProfile().makeGeneral();
 
 
 	// this value string is synchronized with settings_pref.xml preference name
@@ -1327,8 +1379,8 @@
 		new BooleanAccessibilityPreference("direction_haptic_feedback", false).makeGlobal();
 
 	// magnetic field doesn'torkmost of the time on some phones
-	public final OsmandPreference<Boolean> USE_MAGNETIC_FIELD_SENSOR_COMPASS = new BooleanPreference("use_magnetic_field_sensor_compass", false).makeProfile().cache();
-	public final OsmandPreference<Boolean> USE_KALMAN_FILTER_FOR_COMPASS = new BooleanPreference("use_kalman_filter_compass", true).makeProfile().cache();
+	public final OsmandPreference<Boolean> USE_MAGNETIC_FIELD_SENSOR_COMPASS = new BooleanPreference("use_magnetic_field_sensor_compass", false).makeProfile().makeGeneral().cache();
+	public final OsmandPreference<Boolean> USE_KALMAN_FILTER_FOR_COMPASS = new BooleanPreference("use_kalman_filter_compass", true).makeProfile().makeGeneral().cache();
 
 	public final OsmandPreference<Boolean> DO_NOT_SHOW_STARTUP_MESSAGES = new BooleanPreference("do_not_show_startup_messages", false).makeGlobal().cache();
 	public final OsmandPreference<Boolean> DO_NOT_USE_ANIMATIONS = new BooleanPreference("do_not_use_animations", false).makeProfile().cache();
@@ -1339,7 +1391,7 @@
 	public final OsmandPreference<Integer> SEND_ANONYMOUS_DATA_REQUESTS_COUNT = new IntPreference("send_anonymous_data_requests_count", 0).makeGlobal().cache();
 	public final OsmandPreference<Integer> SEND_ANONYMOUS_DATA_LAST_REQUEST_NS = new IntPreference("send_anonymous_data_last_request_ns", -1).makeGlobal().cache();
 
-	public final OsmandPreference<Boolean> MAP_EMPTY_STATE_ALLOWED = new BooleanPreference("map_empty_state_allowed", true).makeProfile().cache();
+	public final OsmandPreference<Boolean> MAP_EMPTY_STATE_ALLOWED = new BooleanPreference("map_empty_state_allowed", true).makeProfile().makeGeneral().cache();
 
 
 	public final CommonPreference<Float> TEXT_SCALE = new FloatPreference("text_scale", 1f).makeProfile().cache();
@@ -1359,7 +1411,7 @@
 
 	public final OsmandPreference<Boolean> SHOW_MAPILLARY = new BooleanPreference("show_mapillary", false).makeProfile();
 	public final OsmandPreference<Boolean> MAPILLARY_FIRST_DIALOG_SHOWN = new BooleanPreference("mapillary_first_dialog_shown", false).makeGlobal();
-	public final OsmandPreference<Boolean> ONLINE_PHOTOS_ROW_COLLAPSED = new BooleanPreference("mapillary_menu_collapsed", false).makeGlobal();
+	public final OsmandPreference<Boolean> ONLINE_PHOTOS_ROW_COLLAPSED = new BooleanPreference("mapillary_menu_collapsed", true).makeGlobal();
 	public final OsmandPreference<Boolean> WEBGL_SUPPORTED = new BooleanPreference("webgl_supported", true).makeGlobal();
 
 	// this value string is synchronized with settings_pref.xml preference name
@@ -1494,9 +1546,13 @@
 		SAVE_TRACK_TO_GPX.setModeDefaultValue(ApplicationMode.PEDESTRIAN, false);
 	}
 
+	public static final Integer REC_DIRECTORY = 0;
+	public static final Integer MONTHLY_DIRECTORY = 1;
+	public static final Integer DAILY_DIRECTORY = 2;
+
 	public final CommonPreference<Boolean> DISABLE_RECORDING_ONCE_APP_KILLED = new BooleanPreference("disable_recording_once_app_killed", false).makeGlobal();
 
-	public final CommonPreference<Boolean> STORE_TRACKS_IN_MONTHLY_DIRECTORIES = new BooleanPreference("store_tracks_in_monthly_directories", false).makeGlobal();
+	public final CommonPreference<Integer> TRACK_STORAGE_DIRECTORY = new IntPreference("track_storage_directory", 0).makeGlobal();
 
 	// this value string is synchronized with settings_pref.xml preference name
 	public final OsmandPreference<Boolean> FAST_ROUTE_MODE = new BooleanPreference("fast_route_mode", true).makeProfile();
@@ -1680,7 +1736,7 @@
 
 	// this value string is synchronized with settings_pref.xml preference name
 	public final OsmandPreference<Integer> MAP_SCREEN_ORIENTATION =
-			new IntPreference("map_screen_orientation", -1/*ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED*/).makeProfile();
+			new IntPreference("map_screen_orientation", -1/*ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED*/).makeProfile().makeGeneral();
 
 	// this value string is synchronized with settings_pref.xml preference name
 //	public final CommonPreference<Boolean> SHOW_VIEW_ANGLE = new BooleanPreference("show_view_angle", false).makeProfile().cache();
@@ -1737,7 +1793,7 @@
 	public static final int ROTATE_MAP_BEARING = 1;
 	public static final int ROTATE_MAP_COMPASS = 2;
 	public final CommonPreference<Integer> ROTATE_MAP =
-			new IntPreference("rotate_map", ROTATE_MAP_NONE).makeProfile().cache();
+			new IntPreference("rotate_map", ROTATE_MAP_NONE).makeProfile().makeGeneral().cache();
 
 	{
 		ROTATE_MAP.setModeDefaultValue(ApplicationMode.CAR, ROTATE_MAP_BEARING);
@@ -1751,7 +1807,7 @@
 	public static final int MIDDLE_BOTTOM_CONSTANT = 2;
 	public static final int MIDDLE_TOP_CONSTANT = 3;
 	public static final int LANDSCAPE_MIDDLE_RIGHT_CONSTANT = 4;
-	public final CommonPreference<Boolean> CENTER_POSITION_ON_MAP = new BooleanPreference("center_position_on_map", false).makeProfile();
+	public final CommonPreference<Boolean> CENTER_POSITION_ON_MAP = new BooleanPreference("center_position_on_map", false).makeProfile().makeGeneral();
 
 	// this value string is synchronized with settings_pref.xml preference name
 	public final OsmandPreference<Integer> MAX_LEVEL_TO_DOWNLOAD_TILE = new IntPreference("max_level_download_tile", 20).makeProfile().cache();
@@ -1849,7 +1905,7 @@
 
 	public final OsmandPreference<Boolean> ANIMATE_MY_LOCATION = new BooleanPreference("animate_my_location", true).makeProfile().cache();
 
-	public final OsmandPreference<Integer> EXTERNAL_INPUT_DEVICE = new IntPreference("external_input_device", 0).makeProfile();
+	public final OsmandPreference<Integer> EXTERNAL_INPUT_DEVICE = new IntPreference("external_input_device", 0).makeProfile().makeGeneral();
 
 	public final OsmandPreference<Boolean> ROUTE_MAP_MARKERS_START_MY_LOC = new BooleanPreference("route_map_markers_start_my_loc", false).makeGlobal().cache();
 	public final OsmandPreference<Boolean> ROUTE_MAP_MARKERS_ROUND_TRIP = new BooleanPreference("route_map_markers_round_trip", false).makeGlobal().cache();
@@ -1980,6 +2036,7 @@
 	public static final int EXTERNAL_STORAGE_TYPE_INTERNAL_FILE = 2; // ctx.getFilesDir()
 	public static final int EXTERNAL_STORAGE_TYPE_OBB = 3; // ctx.getObbDirs
 	public static final int EXTERNAL_STORAGE_TYPE_SPECIFIED = 4;
+	public final OsmandPreference<Long> OSMAND_USAGE_SPACE = new LongPreference("osmand_usage_space", 0).makeGlobal();
 
 
 	public void freezeExternalStorageDirectory() {
@@ -3037,7 +3094,7 @@
 	// this value string is synchronized with settings_pref.xml preference name
 	public final OsmandPreference<String> CONTRIBUTION_INSTALL_APP_DATE = new StringPreference("CONTRIBUTION_INSTALL_APP_DATE", null).makeGlobal();
 
-	public final OsmandPreference<Integer> COORDINATES_FORMAT = new IntPreference("coordinates_format", PointDescription.FORMAT_DEGREES).makeProfile();
+	public final OsmandPreference<Integer> COORDINATES_FORMAT = new IntPreference("coordinates_format", PointDescription.FORMAT_DEGREES).makeProfile().makeGeneral();
 
 	public final OsmandPreference<Boolean> FOLLOW_THE_ROUTE = new BooleanPreference("follow_to_route", false).makeGlobal();
 	public final OsmandPreference<String> FOLLOW_THE_GPX_ROUTE = new StringPreference("follow_gpx", null).makeGlobal();
@@ -3103,7 +3160,7 @@
 			new IntPreference("FAVORITES_TAB", 0).makeGlobal().cache();
 
 	public final CommonPreference<Integer> OSMAND_THEME =
-			new IntPreference("osmand_theme", OSMAND_LIGHT_THEME).makeProfile().cache();
+			new IntPreference("osmand_theme", OSMAND_LIGHT_THEME).makeProfile().makeGeneral().cache();
 
 	public boolean isLightActionBar() {
 		return isLightContent();
diff --git a/OsmAnd/src/net/osmand/plus/activities/MapActivity.java b/OsmAnd/src/net/osmand/plus/activities/MapActivity.java
index 5549953..e43df10 100644
--- a/OsmAnd/src/net/osmand/plus/activities/MapActivity.java
+++ b/OsmAnd/src/net/osmand/plus/activities/MapActivity.java
@@ -128,6 +128,7 @@
 import net.osmand.plus.search.QuickSearchDialogFragment.QuickSearchType;
 import net.osmand.plus.settings.BaseSettingsFragment;
 import net.osmand.plus.settings.BaseSettingsFragment.SettingsScreenType;
+import net.osmand.plus.settings.DataStorageFragment;
 import net.osmand.plus.views.AddGpxPointBottomSheetHelper.NewGpxPoint;
 import net.osmand.plus.views.AnimateDraggingMapThread;
 import net.osmand.plus.views.MapControlsLayer;
@@ -317,12 +318,9 @@
 		mapLayers.createLayers(mapView);
 		createProgressBarForRouting();
 		updateStatusBarColor();
-		// This situtation could be when navigation suddenly crashed and after restarting
-		// it tries to continue the last route
-		if (settings.FOLLOW_THE_ROUTE.get() && !app.getRoutingHelper().isRouteCalculated()
-				&& !app.getRoutingHelper().isRouteBeingCalculated()) {
-			FailSafeFuntions.restoreRoutingMode(this);
-		} else if (!app.getRoutingHelper().isRoutePlanningMode()
+
+		if ((app.getRoutingHelper().isRouteCalculated() || app.getRoutingHelper().isRouteBeingCalculated())
+				&& !app.getRoutingHelper().isRoutePlanningMode()
 				&& !settings.FOLLOW_THE_ROUTE.get()
 				&& app.getTargetPointsHelper().getAllPoints().size() > 0) {
 			app.getRoutingHelper().clearCurrentRoute(null, new ArrayList<LatLon>());
@@ -422,6 +420,9 @@
 					if (event == InitEvents.FAVORITES_INITIALIZED) {
 						refreshMap();
 					}
+					if (event == InitEvents.ROUTING_CONFIG_INITIALIZED) {
+						checkRestoreRoutingMode();
+					}
 				}
 
 				@Override
@@ -440,6 +441,17 @@
 			getMyApplication().checkApplicationIsBeingInitialized(this, initListener);
 		} else {
 			setupOpenGLView(true);
+			checkRestoreRoutingMode();
+		}
+	}
+
+	private void checkRestoreRoutingMode() {
+		// This situation could be when navigation suddenly crashed and after restarting
+		// it tries to continue the last route
+		if (settings.FOLLOW_THE_ROUTE.get()
+				&& !app.getRoutingHelper().isRouteCalculated()
+				&& !app.getRoutingHelper().isRouteBeingCalculated()) {
+			FailSafeFuntions.restoreRoutingMode(MapActivity.this);
 		}
 	}
 
@@ -648,7 +660,7 @@
 			}
 		}
 		if (mapContextMenu.isVisible() && mapContextMenu.isClosable()) {
-			if (mapContextMenu.getCurrentMenuState() != MenuState.HEADER_ONLY) {
+			if (mapContextMenu.getCurrentMenuState() != MenuState.HEADER_ONLY && !isLandscapeLayout()) {
 				mapContextMenu.openMenuHeaderOnly();
 			} else {
 				mapContextMenu.close();
@@ -1868,7 +1880,15 @@
 				mcl.onRequestPermissionsResult(requestCode, permissions, grantResults);
 			}
 
-			if (requestCode == DownloadActivity.PERMISSIONS_REQUEST_WRITE_EXTERNAL_STORAGE
+			if (requestCode == DataStorageFragment.PERMISSIONS_REQUEST_WRITE_EXTERNAL_STORAGE
+					&& grantResults.length > 0 && permissions.length > 0
+					&& Manifest.permission.WRITE_EXTERNAL_STORAGE.equals(permissions[0])) {
+				if (grantResults[0] != PackageManager.PERMISSION_GRANTED) {
+					Toast.makeText(this,
+							R.string.missing_write_external_storage_permission,
+							Toast.LENGTH_LONG).show();
+				}
+			} else if (requestCode == DownloadActivity.PERMISSIONS_REQUEST_WRITE_EXTERNAL_STORAGE
 					&& grantResults.length > 0 && permissions.length > 0
 					&& Manifest.permission.WRITE_EXTERNAL_STORAGE.equals(permissions[0])) {
 				permissionAsked = true;
diff --git a/OsmAnd/src/net/osmand/plus/activities/SavingTrackHelper.java b/OsmAnd/src/net/osmand/plus/activities/SavingTrackHelper.java
index a8cce1d..9011640 100644
--- a/OsmAnd/src/net/osmand/plus/activities/SavingTrackHelper.java
+++ b/OsmAnd/src/net/osmand/plus/activities/SavingTrackHelper.java
@@ -186,7 +186,7 @@
 
 		return false;
 	}
-	
+
 	/**
 	 * @return warnings, filenames
 	 */
@@ -204,23 +204,25 @@
 					File fout = new File(dir, f + ".gpx"); //$NON-NLS-1$
 					if (!data.get(f).isEmpty()) {
 						WptPt pt = data.get(f).findPointToShow();
-						File targetDir = dir;
-						if (ctx.getSettings().STORE_TRACKS_IN_MONTHLY_DIRECTORIES.get()) {
+						String fileName = f + "_" + new SimpleDateFormat("HH-mm_EEE", Locale.US).format(new Date(pt.time)); //$NON-NLS-1$
+						Integer track_storage_directory = ctx.getSettings().TRACK_STORAGE_DIRECTORY.get();
+						if (track_storage_directory != OsmandSettings.REC_DIRECTORY) {
 							SimpleDateFormat dateDirFormat = new SimpleDateFormat("yyyy-MM");
+							if (track_storage_directory == OsmandSettings.DAILY_DIRECTORY) {
+								dateDirFormat = new SimpleDateFormat("yyyy-MM-dd");
+							}
 							String dateDirName = dateDirFormat.format(new Date(pt.time));
 							File dateDir = new File(dir, dateDirName);
 							dateDir.mkdirs();
 							if (dateDir.exists()) {
-								targetDir = dateDir;
+								fileName = dateDirName + File.separator + fileName;
 							}
 						}
-
-						String fileName = f + "_" + new SimpleDateFormat("HH-mm_EEE", Locale.US).format(new Date(pt.time)); //$NON-NLS-1$
 						filenames.add(fileName);
-						fout = new File(targetDir, fileName + ".gpx"); //$NON-NLS-1$
+						fout = new File(dir, fileName + ".gpx"); //$NON-NLS-1$
 						int ind = 1;
 						while (fout.exists()) {
-							fout = new File(targetDir, fileName + "_" + (++ind) + ".gpx"); //$NON-NLS-1$ //$NON-NLS-2$
+							fout = new File(dir, fileName + "_" + (++ind) + ".gpx"); //$NON-NLS-1$ //$NON-NLS-2$
 						}
 					}
 
diff --git a/OsmAnd/src/net/osmand/plus/base/MapViewTrackingUtilities.java b/OsmAnd/src/net/osmand/plus/base/MapViewTrackingUtilities.java
index e07e04d..52cfae0 100644
--- a/OsmAnd/src/net/osmand/plus/base/MapViewTrackingUtilities.java
+++ b/OsmAnd/src/net/osmand/plus/base/MapViewTrackingUtilities.java
@@ -340,14 +340,16 @@
 	public void backToLocationImpl(int zoom, boolean forceZoom) {
 		if (mapView != null) {
 			OsmAndLocationProvider locationProvider = app.getLocationProvider();
+			net.osmand.Location lastKnownLocation = locationProvider.getLastKnownLocation();
+			net.osmand.Location lastStaleKnownLocation = locationProvider.getLastStaleKnownLocation();
+			net.osmand.Location location = lastKnownLocation != null ? lastKnownLocation : lastStaleKnownLocation;
 			if (!isMapLinkedToLocation()) {
 				setMapLinkedToLocation(true);
-				net.osmand.Location lastKnownLocation = locationProvider.getLastKnownLocation();
-				if (lastKnownLocation != null) {
+				if (location != null) {
 					AnimateDraggingMapThread thread = mapView.getAnimatedDraggingThread();
 					int fZoom = mapView.getZoom() < zoom && (forceZoom || app.getSettings().AUTO_ZOOM_MAP.get()) ? zoom : mapView.getZoom();
 					movingToMyLocation = true;
-					thread.startMoving(lastKnownLocation.getLatitude(), lastKnownLocation.getLongitude(),
+					thread.startMoving(location.getLatitude(), location.getLongitude(),
 							fZoom, false, new Runnable() {
 								@Override
 								public void run() {
@@ -357,7 +359,7 @@
 				}
 				mapView.refreshMap();
 			}
-			if (locationProvider.getLastKnownLocation() == null) {
+			if (location == null) {
 				app.showToastMessage(R.string.unknown_location);
 			}
 		}
diff --git a/OsmAnd/src/net/osmand/plus/download/ui/UpdatesIndexFragment.java b/OsmAnd/src/net/osmand/plus/download/ui/UpdatesIndexFragment.java
index d53ab09..f2c1626 100644
--- a/OsmAnd/src/net/osmand/plus/download/ui/UpdatesIndexFragment.java
+++ b/OsmAnd/src/net/osmand/plus/download/ui/UpdatesIndexFragment.java
@@ -19,10 +19,12 @@
 import net.osmand.util.Algorithms;
 import android.app.Activity;
 import android.content.Context;
+import android.content.DialogInterface;
 import android.graphics.drawable.Drawable;
 import android.os.Bundle;
 import android.support.v4.view.MenuItemCompat;
 import android.support.v7.app.ActionBar;
+import android.support.v7.app.AlertDialog;
 import android.view.LayoutInflater;
 import android.view.Menu;
 import android.view.MenuInflater;
@@ -154,7 +156,21 @@
 			updateAllButton.setOnClickListener(new View.OnClickListener() {
 				@Override
 				public void onClick(View v) {
-					getMyActivity().startDownload(indexItems.toArray(new IndexItem[indexItems.size()]));
+					if (indexItems.size() > 3) {
+						AlertDialog.Builder dialog = new AlertDialog.Builder(getMyActivity());
+						dialog.setTitle(R.string.update_all_maps);
+						dialog.setMessage(getString(R.string.update_all_maps_q, indexItems.size()));
+						dialog.setNegativeButton(R.string.shared_string_cancel, null);
+						dialog.setPositiveButton(R.string.update, new DialogInterface.OnClickListener() {
+							@Override
+							public void onClick(DialogInterface dialog, int which) {
+								getMyActivity().startDownload(indexItems.toArray(new IndexItem[indexItems.size()]));
+							}
+						});
+						dialog.create().show();
+					} else {
+						getMyActivity().startDownload(indexItems.toArray(new IndexItem[indexItems.size()]));
+					}
 				}
 			});
 		}
diff --git a/OsmAnd/src/net/osmand/plus/helpers/WaypointHelper.java b/OsmAnd/src/net/osmand/plus/helpers/WaypointHelper.java
index a7a450c..2b806e2 100644
--- a/OsmAnd/src/net/osmand/plus/helpers/WaypointHelper.java
+++ b/OsmAnd/src/net/osmand/plus/helpers/WaypointHelper.java
@@ -170,11 +170,11 @@
 		return found;
 	}
 
-	public AlarmInfo getMostImportantAlarm(MetricsConstants mc, OsmandSettings.SpeedConstants sc, boolean showCameras) {
+	public AlarmInfo getMostImportantAlarm(OsmandSettings.SpeedConstants sc, boolean showCameras) {
 		Location lastProjection = app.getRoutingHelper().getLastProjection();
 		float mxspeed = route.getCurrentMaxSpeed();
 		float delta = app.getSettings().SPEED_LIMIT_EXCEED.get() / 3.6f;
-		AlarmInfo speedAlarm = createSpeedAlarm(mc, sc, mxspeed, lastProjection, delta);
+		AlarmInfo speedAlarm = createSpeedAlarm(sc, mxspeed, lastProjection, delta);
 		if (speedAlarm != null) {
 			getVoiceRouter().announceSpeedAlarm(speedAlarm.getIntValue(), lastProjection.getSpeed());
 		}
@@ -271,7 +271,7 @@
 												 OsmandSettings.SpeedConstants sc, boolean showCameras) {
 		float mxspeed = ro.getMaximumSpeed(ro.bearingVsRouteDirection(loc));
 		float delta = app.getSettings().SPEED_LIMIT_EXCEED.get() / 3.6f;
-		AlarmInfo speedAlarm = createSpeedAlarm(mc, sc, mxspeed, loc, delta);
+		AlarmInfo speedAlarm = createSpeedAlarm(sc, mxspeed, loc, delta);
 		if (speedAlarm != null) {
 			getVoiceRouter().announceSpeedAlarm(speedAlarm.getIntValue(), loc.getSpeed());
 			return speedAlarm;
@@ -308,15 +308,15 @@
 		return null;
 	}
 
-	private static AlarmInfo createSpeedAlarm(MetricsConstants mc, OsmandSettings.SpeedConstants sc, float mxspeed, Location loc, float delta) {
+	private static AlarmInfo createSpeedAlarm(OsmandSettings.SpeedConstants sc, float mxspeed, Location loc, float delta) {
 		AlarmInfo speedAlarm = null;
 		if (mxspeed != 0 && loc != null && loc.hasSpeed() && mxspeed != RouteDataObject.NONE_MAX_SPEED) {
 			if (loc.getSpeed() > mxspeed + delta) {
 				int speed;
 				if (sc.imperial) {
-					speed = Math.round(mxspeed * 3.6f);
-				} else {
 					speed = Math.round(mxspeed * 3.6f / 1.6f);
+				} else {
+					speed = Math.round(mxspeed * 3.6f);
 				}
 				speedAlarm = AlarmInfo.createSpeedLimit(speed, loc);
 			}
diff --git a/OsmAnd/src/net/osmand/plus/mapcontextmenu/MenuBuilder.java b/OsmAnd/src/net/osmand/plus/mapcontextmenu/MenuBuilder.java
index e03b5bf..377df7a 100644
--- a/OsmAnd/src/net/osmand/plus/mapcontextmenu/MenuBuilder.java
+++ b/OsmAnd/src/net/osmand/plus/mapcontextmenu/MenuBuilder.java
@@ -56,8 +56,10 @@
 import net.osmand.plus.mapcontextmenu.controllers.TransportStopController;
 import net.osmand.plus.render.RenderingIcons;
 import net.osmand.plus.transport.TransportStopRoute;
+import net.osmand.plus.views.POIMapLayer;
 import net.osmand.plus.views.TransportStopsLayer;
 import net.osmand.plus.widgets.TextViewEx;
+import net.osmand.plus.widgets.tools.ClickableSpanTouchListener;
 import net.osmand.util.Algorithms;
 import net.osmand.util.MapUtils;
 
@@ -471,6 +473,7 @@
 	}
 
 	protected void buildTopInternal(View view) {
+		buildDescription(view);
 		if (showLocalTransportRoutes()) {
 			buildRow(view, 0, null, app.getString(R.string.transport_Routes), 0, true, getCollapsableTransportStopRoutesView(view.getContext(), false, false),
 					false, 0, false, null, true);
@@ -483,6 +486,9 @@
 		}
 	}
 
+	protected void buildDescription(View view){
+	}
+
 	protected void buildAfter(View view) {
 		buildRowDivider(view);
 	}
@@ -505,20 +511,20 @@
 	public View buildRow(final View view, Drawable icon, final String buttonText, final String text, int textColor, String secondaryText,
 	                     boolean collapsable, final CollapsableView collapsableView, boolean needLinks,
 	                     int textLinesLimit, boolean isUrl, OnClickListener onClickListener, boolean matchWidthDivider) {
-		return buildRow(view, icon, buttonText, text, textColor, secondaryText, collapsable, collapsableView,
+		return buildRow(view, icon, buttonText, null, text, textColor, secondaryText, collapsable, collapsableView,
 				needLinks, textLinesLimit, isUrl, false, false, onClickListener, matchWidthDivider);
 	}
 
 	public View buildRow(View view, int iconId, String buttonText, String text, int textColor,
 	                     boolean collapsable, final CollapsableView collapsableView,
 	                     boolean needLinks, int textLinesLimit, boolean isUrl, boolean isNumber, boolean isEmail, OnClickListener onClickListener, boolean matchWidthDivider) {
-		return buildRow(view, iconId == 0 ? null : getRowIcon(iconId), buttonText, text, textColor, null, collapsable, collapsableView,
+		return buildRow(view, iconId == 0 ? null : getRowIcon(iconId), buttonText, null, text, textColor, null, collapsable, collapsableView,
 				needLinks, textLinesLimit, isUrl, isNumber, isEmail, onClickListener, matchWidthDivider);
 	}
 
-	public View buildRow(final View view, Drawable icon, final String buttonText, final String text, int textColor, String secondaryText,
-							boolean collapsable, final CollapsableView collapsableView, boolean needLinks,
-							int textLinesLimit, boolean isUrl, boolean isNumber, boolean isEmail, OnClickListener onClickListener, boolean matchWidthDivider) {
+	public View buildRow(final View view, Drawable icon, final String buttonText, final String textPrefix, final String text,
+	                     int textColor, String secondaryText, boolean collapsable, final CollapsableView collapsableView, boolean needLinks,
+	                     int textLinesLimit, boolean isUrl, boolean isNumber, boolean isEmail, OnClickListener onClickListener, boolean matchWidthDivider) {
 
 		if (!isFirstRow()) {
 			buildRowDivider(view);
@@ -537,7 +543,8 @@
 		ll.setOnLongClickListener(new View.OnLongClickListener() {
 			@Override
 			public boolean onLongClick(View v) {
-				copyToClipboard(text, view.getContext());
+				String textToCopy = Algorithms.isEmpty(textPrefix) ? text : textPrefix + ": " + text;
+				copyToClipboard(textToCopy, view.getContext());
 				return true;
 			}
 		});
@@ -572,30 +579,46 @@
 		llText.setLayoutParams(llTextViewParams);
 		ll.addView(llText);
 
+		TextViewEx textPrefixView = null;
+		if (!Algorithms.isEmpty(textPrefix)) {
+			textPrefixView = new TextViewEx(view.getContext());
+			LinearLayout.LayoutParams llTextParams = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);
+			llTextParams.setMargins(icon == null ? dpToPx(16f) : 0, dpToPx(8f), 0, 0);
+			textPrefixView.setLayoutParams(llTextParams);
+			textPrefixView.setTypeface(FontCache.getRobotoRegular(view.getContext()));
+			textPrefixView.setTextSize(12);
+			textPrefixView.setTextColor(app.getResources().getColor(light ? R.color.text_color_secondary_light: R.color.text_color_secondary_dark));
+			textPrefixView.setMinLines(1);
+			textPrefixView.setMaxLines(1);
+			textPrefixView.setText(textPrefix);
+			llText.addView(textPrefixView);
+		}
+
 		// Primary text
 		TextViewEx textView = new TextViewEx(view.getContext());
 		LinearLayout.LayoutParams llTextParams = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);
-		llTextParams.setMargins(icon != null ? 0 : dpToPx(16f), dpToPx(secondaryText != null ? 10f : 8f), 0, dpToPx(secondaryText != null ? 6f : 8f));
+		llTextParams.setMargins(icon != null ? 0 : dpToPx(16f), dpToPx(textPrefixView != null ? 2f : (secondaryText != null ? 10f : 8f)), 0, dpToPx(secondaryText != null ? 6f : 8f));
 		textView.setLayoutParams(llTextParams);
 		textView.setTypeface(FontCache.getRobotoRegular(view.getContext()));
 		textView.setTextSize(16);
 		textView.setTextColor(app.getResources().getColor(light ? R.color.text_color_primary_light : R.color.text_color_primary_dark));
+		textView.setText(text);
 
 		int linkTextColor = ContextCompat.getColor(view.getContext(), light ? R.color.ctx_menu_bottom_view_url_color_light : R.color.ctx_menu_bottom_view_url_color_dark);
 
 		if (isUrl || isNumber || isEmail) {
 			textView.setTextColor(linkTextColor);
-		} else if (needLinks) {
-			Linkify.addLinks(textView, Linkify.ALL);
-			textView.setLinksClickable(true);
+		} else if (needLinks && Linkify.addLinks(textView, Linkify.ALL)) {
+			textView.setMovementMethod(null);
 			textView.setLinkTextColor(linkTextColor);
+			textView.setOnTouchListener(new ClickableSpanTouchListener());
 			AndroidUtils.removeLinkUnderline(textView);
 		}
 		if (textLinesLimit > 0) {
 			textView.setMinLines(1);
 			textView.setMaxLines(textLinesLimit);
+			textView.setEllipsize(TextUtils.TruncateAt.END);
 		}
-		textView.setText(text);
 		if (textColor > 0) {
 			textView.setTextColor(view.getResources().getColor(textColor));
 		}
@@ -706,7 +729,21 @@
 
 		return ll;
 	}
-	
+
+	public View buildDescriptionRow(final View view, final String textPrefix, final String description, int textColor,
+	                                int textLinesLimit, boolean matchWidthDivider) {
+		OnClickListener clickListener = new OnClickListener() {
+			@Override
+			public void onClick(View v) {
+				POIMapLayer.showDescriptionDialog(view.getContext(), app, description, textPrefix);
+			}
+		};
+
+		return buildRow(view, null, null, textPrefix, description, textColor,
+				null, false, null, true, textLinesLimit,
+				false, false, false, clickListener, matchWidthDivider);
+	}
+
 	protected void showDialog(String text, final String actionType, final String dataPrefix, final View v) {
 		final String[] items = text.split("[,;]");
 		final Intent intent = new Intent(actionType);
diff --git a/OsmAnd/src/net/osmand/plus/mapcontextmenu/builders/AmenityMenuBuilder.java b/OsmAnd/src/net/osmand/plus/mapcontextmenu/builders/AmenityMenuBuilder.java
index 466070f..eb3e9f7 100644
--- a/OsmAnd/src/net/osmand/plus/mapcontextmenu/builders/AmenityMenuBuilder.java
+++ b/OsmAnd/src/net/osmand/plus/mapcontextmenu/builders/AmenityMenuBuilder.java
@@ -1,7 +1,6 @@
 package net.osmand.plus.mapcontextmenu.builders;
 
 import android.content.Context;
-import android.content.DialogInterface;
 import android.content.Intent;
 import android.content.res.ColorStateList;
 import android.graphics.drawable.Drawable;
@@ -9,7 +8,6 @@
 import android.os.Build;
 import android.support.annotation.NonNull;
 import android.support.v4.content.ContextCompat;
-import android.support.v7.app.AlertDialog;
 import android.support.v7.view.ContextThemeWrapper;
 import android.text.TextUtils;
 import android.text.util.Linkify;
@@ -23,13 +21,16 @@
 import net.osmand.AndroidUtils;
 import net.osmand.PlatformUtil;
 import net.osmand.data.Amenity;
-import net.osmand.data.PointDescription;
 import net.osmand.osm.AbstractPoiType;
 import net.osmand.osm.MapPoiTypes;
 import net.osmand.osm.PoiCategory;
 import net.osmand.osm.PoiType;
-import net.osmand.plus.*;
+import net.osmand.plus.OsmAndFormatter;
+import net.osmand.plus.OsmandPlugin;
+import net.osmand.plus.OsmandSettings;
 import net.osmand.plus.OsmandSettings.MetricsConstants;
+import net.osmand.plus.R;
+import net.osmand.plus.Version;
 import net.osmand.plus.activities.MapActivity;
 import net.osmand.plus.helpers.FontCache;
 import net.osmand.plus.mapcontextmenu.MenuBuilder;
@@ -37,11 +38,13 @@
 import net.osmand.plus.poi.PoiUIFilter;
 import net.osmand.plus.views.POIMapLayer;
 import net.osmand.plus.widgets.TextViewEx;
+import net.osmand.plus.widgets.tools.ClickableSpanTouchListener;
 import net.osmand.plus.wikipedia.WikiArticleHelper;
 import net.osmand.plus.wikipedia.WikipediaArticleWikiLinkFragment;
 import net.osmand.plus.wikipedia.WikipediaDialogFragment;
 import net.osmand.util.Algorithms;
 import net.osmand.util.OpeningHoursParser;
+
 import org.apache.commons.logging.Log;
 
 import java.math.RoundingMode;
@@ -173,10 +176,10 @@
 			needLinks = false;
 		}
 		textView.setText(text);
-		if (needLinks) {
-			Linkify.addLinks(textView, Linkify.ALL);
-			textView.setLinksClickable(true);
+		if (needLinks && Linkify.addLinks(textView, Linkify.ALL)) {
+			textView.setMovementMethod(null);
 			textView.setLinkTextColor(linkTextColor);
+			textView.setOnTouchListener(new ClickableSpanTouchListener());
 			AndroidUtils.removeLinkUnderline(textView);
 		}
 		textView.setEllipsize(TextUtils.TruncateAt.END);
diff --git a/OsmAnd/src/net/osmand/plus/mapcontextmenu/builders/FavouritePointMenuBuilder.java b/OsmAnd/src/net/osmand/plus/mapcontextmenu/builders/FavouritePointMenuBuilder.java
index 5b3d781..233f9c3 100644
--- a/OsmAnd/src/net/osmand/plus/mapcontextmenu/builders/FavouritePointMenuBuilder.java
+++ b/OsmAnd/src/net/osmand/plus/mapcontextmenu/builders/FavouritePointMenuBuilder.java
@@ -3,15 +3,9 @@
 import android.content.Context;
 import android.graphics.Color;
 import android.support.annotation.NonNull;
-import android.text.TextUtils;
-import android.util.Log;
-import android.view.Gravity;
 import android.view.View;
-import android.view.ViewGroup;
 import android.widget.LinearLayout;
-import android.widget.TextView;
 
-import net.osmand.AndroidUtils;
 import net.osmand.PlatformUtil;
 import net.osmand.ResultMatcher;
 import net.osmand.binary.BinaryMapIndexReader;
@@ -27,7 +21,6 @@
 import net.osmand.plus.activities.MapActivity;
 import net.osmand.plus.mapcontextmenu.MenuBuilder;
 import net.osmand.plus.myplaces.FavoritesActivity;
-import net.osmand.plus.routing.TransportRoutingHelper;
 import net.osmand.plus.widgets.TextViewEx;
 import net.osmand.util.Algorithms;
 import net.osmand.util.MapUtils;
@@ -73,7 +66,6 @@
 
 	@Override
 	protected void buildTopInternal(View view) {
-		buildDescription(view);
 		super.buildTopInternal(view);
 		buildGroupFavouritesView(view);
 	}
@@ -88,6 +80,14 @@
 		}
 	}
 
+	@Override
+	protected void buildDescription(View view) {
+		String desc = fav.getDescription();
+		if (!Algorithms.isEmpty(desc)) {
+			buildDescriptionRow(view, app.getString(R.string.shared_string_description), desc, 0, 10, true);
+		}
+	}
+
 	private void buildGroupFavouritesView(View view) {
 		FavoriteGroup favoriteGroup = app.getFavorites().getGroup(fav);
 		List<FavouritePoint> groupFavourites = favoriteGroup.points;
@@ -102,84 +102,6 @@
 		}
 	}
 
-	private void buildDescriptionRow(final View view, final String description, int textColor,
-									 int textLinesLimit, boolean matchWidthDivider) {
-		if (!isFirstRow()) {
-			buildRowDivider(view);
-		}
-		LinearLayout baseView = new LinearLayout(view.getContext());
-		baseView.setOrientation(LinearLayout.VERTICAL);
-		LinearLayout.LayoutParams llBaseViewParams = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);
-		baseView.setLayoutParams(llBaseViewParams);
-
-		LinearLayout ll = new LinearLayout(view.getContext());
-		ll.setOrientation(LinearLayout.HORIZONTAL);
-		LinearLayout.LayoutParams llParams = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);
-		ll.setLayoutParams(llParams);
-		ll.setBackgroundResource(AndroidUtils.resolveAttribute(view.getContext(), android.R.attr.selectableItemBackground));
-		ll.setOnLongClickListener(new View.OnLongClickListener() {
-			@Override
-			public boolean onLongClick(View v) {
-				copyToClipboard(description, view.getContext());
-				return true;
-			}
-		});
-
-		baseView.addView(ll);
-
-		// Text
-		LinearLayout llText = new LinearLayout(view.getContext());
-		llText.setOrientation(LinearLayout.VERTICAL);
-		ll.addView(llText);
-
-		TextView textPrefixView = new TextView(view.getContext());
-		LinearLayout.LayoutParams llTextParams = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);
-		llTextParams.setMargins(dpToPx(16f), dpToPx(8f), 0, 0);
-		textPrefixView.setLayoutParams(llTextParams);
-		textPrefixView.setTextSize(12);
-		textPrefixView.setTextColor(app.getResources().getColor(R.color.ctx_menu_buttons_text_color));
-		textPrefixView.setEllipsize(TextUtils.TruncateAt.END);
-		textPrefixView.setMinLines(1);
-		textPrefixView.setMaxLines(1);
-		textPrefixView.setText(app.getResources().getString(R.string.shared_string_description));
-		llText.addView(textPrefixView);
-
-		TextView textView = new TextView(view.getContext());
-		LinearLayout.LayoutParams llTextParams2 = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);
-		llTextParams2.setMargins(dpToPx(16f), dpToPx(2f), 0, dpToPx(8f));
-		textView.setLayoutParams(llTextParams2);
-		textView.setTextSize(16);
-		textView.setTextColor(app.getResources().getColor(light ? R.color.text_color_primary_light : R.color.text_color_primary_dark));
-		textView.setText(description);
-
-		textView.setEllipsize(TextUtils.TruncateAt.END);
-		if (textLinesLimit > 0) {
-			textView.setMinLines(1);
-			textView.setMaxLines(textLinesLimit);
-		}
-		if (textColor > 0) {
-			textView.setTextColor(view.getResources().getColor(textColor));
-		}
-		llText.addView(textView);
-
-		LinearLayout.LayoutParams llTextViewParams = new LinearLayout.LayoutParams(0, ViewGroup.LayoutParams.WRAP_CONTENT);
-		llTextViewParams.weight = 1f;
-		llTextViewParams.setMargins(0, 0, dpToPx(10f), 0);
-		llTextViewParams.gravity = Gravity.CENTER_VERTICAL;
-		llText.setLayoutParams(llTextViewParams);
-
-		((LinearLayout) view).addView(baseView);
-		rowBuilt();
-		setDividerWidth(matchWidthDivider);
-	}
-
-	private void buildDescription(View view) {
-		String desc = fav.getDescription();
-		if (!Algorithms.isEmpty(desc)) {
-			buildDescriptionRow(view, desc, 0, 0, true);
-		}
-	}
-
 	private Amenity findAmenity(String nameStringEn, double lat, double lon) {
 		QuadRect rect = MapUtils.calculateLatLonBbox(lat, lon, 15);
 		List<Amenity> amenities = app.getResourceManager().searchAmenities(
diff --git a/OsmAnd/src/net/osmand/plus/mapcontextmenu/builders/WptPtMenuBuilder.java b/OsmAnd/src/net/osmand/plus/mapcontextmenu/builders/WptPtMenuBuilder.java
index 7fae86a..a54f3e1 100644
--- a/OsmAnd/src/net/osmand/plus/mapcontextmenu/builders/WptPtMenuBuilder.java
+++ b/OsmAnd/src/net/osmand/plus/mapcontextmenu/builders/WptPtMenuBuilder.java
@@ -8,10 +8,10 @@
 import android.view.View;
 import android.widget.LinearLayout;
 
-import net.osmand.data.LatLon;
-import net.osmand.data.PointDescription;
 import net.osmand.GPXUtilities;
 import net.osmand.GPXUtilities.WptPt;
+import net.osmand.data.LatLon;
+import net.osmand.data.PointDescription;
 import net.osmand.plus.GpxSelectionHelper;
 import net.osmand.plus.GpxSelectionHelper.SelectedGpxFile;
 import net.osmand.plus.OsmAndAppCustomization;
@@ -30,6 +30,7 @@
 import java.util.List;
 
 public class WptPtMenuBuilder extends MenuBuilder {
+
 	private final WptPt wpt;
 
 	public WptPtMenuBuilder(@NonNull MapActivity mapActivity, final @NonNull WptPt wpt) {
@@ -50,6 +51,13 @@
 	}
 
 	@Override
+	protected void buildDescription(View view) {
+		if (!Algorithms.isEmpty(wpt.desc)) {
+			buildDescriptionRow(view, app.getString(R.string.shared_string_description), wpt.desc, 0, 10, true);
+		}
+	}
+
+	@Override
 	public void buildInternal(View view) {
 		if (wpt.time > 0) {
 			DateFormat dateFormat = android.text.format.DateFormat.getMediumDateFormat(view.getContext());
@@ -92,16 +100,7 @@
 	}
 	
 	protected void prepareDescription(final WptPt wpt, View view) {
-		if (!Algorithms.isEmpty(wpt.desc)) {
-			final View row = buildRow(view, R.drawable.ic_action_note_dark, null, wpt.desc, 0, false, null, true, 10, false, null, false);
-			row.setOnClickListener(new View.OnClickListener() {
-				@Override
-				public void onClick(View v) {
-					POIMapLayer.showDescriptionDialog(row.getContext(), app, wpt.desc,
-							row.getResources().getString(R.string.shared_string_description));
-				}
-			});
-		}
+
 	}
 
 	private void buildWaypointsView(View view) {
diff --git a/OsmAnd/src/net/osmand/plus/monitoring/OnSaveCurrentTrackFragment.java b/OsmAnd/src/net/osmand/plus/monitoring/OnSaveCurrentTrackFragment.java
index e7957dd..3704a78 100644
--- a/OsmAnd/src/net/osmand/plus/monitoring/OnSaveCurrentTrackFragment.java
+++ b/OsmAnd/src/net/osmand/plus/monitoring/OnSaveCurrentTrackFragment.java
@@ -42,7 +42,7 @@
 			dismiss();
 		}
 
-		final File f = new File (app.getAppCustomization().getTracksDir() +"/"+ savedGpxName + ".gpx");
+		final File f = new File (app.getAppCustomization().getTracksDir(), savedGpxName + ".gpx");
 		final boolean nightMode = !app.getSettings().isLightContent();
 		final int themeRes = nightMode ? R.style.OsmandDarkTheme : R.style.OsmandLightTheme;
 		View mainView = View
diff --git a/OsmAnd/src/net/osmand/plus/monitoring/SettingsMonitoringActivity.java b/OsmAnd/src/net/osmand/plus/monitoring/SettingsMonitoringActivity.java
index 5a7cb43..d65e214 100644
--- a/OsmAnd/src/net/osmand/plus/monitoring/SettingsMonitoringActivity.java
+++ b/OsmAnd/src/net/osmand/plus/monitoring/SettingsMonitoringActivity.java
@@ -16,17 +16,21 @@
 import android.preference.PreferenceScreen;
 import android.view.Window;
 
+import static net.osmand.plus.OsmandSettings.DAILY_DIRECTORY;
+import static net.osmand.plus.OsmandSettings.MONTHLY_DIRECTORY;
+import static net.osmand.plus.OsmandSettings.REC_DIRECTORY;
+
 
 public class SettingsMonitoringActivity extends SettingsBaseActivity {
 	private CheckBoxPreference routeServiceEnabled;
 	private BroadcastReceiver broadcastReceiver;
-	
+
 	public static final int[] BG_SECONDS = new int[]{0, 30, 60, 90};
 	public static final int[] BG_MINUTES = new int[]{2, 3, 5, 10, 15, 30, 60, 90};
 	private static final int[] SECONDS = OsmandMonitoringPlugin.SECONDS;
 	private static final int[] MINUTES = OsmandMonitoringPlugin.MINUTES;
 	private static final int[] MAX_INTERVAL_TO_SEND_MINUTES = OsmandMonitoringPlugin.MAX_INTERVAL_TO_SEND_MINUTES;
-	
+
 	public SettingsMonitoringActivity() {
 		super(true);
 	}
@@ -39,7 +43,7 @@
 		setProgressVisibility(false);
 		getToolbar().setTitle(R.string.monitoring_settings);
 		PreferenceScreen grp = getPreferenceScreen();
-		
+
 		createLoggingSection(grp);
 		createLiveSection(grp);
 		createNotificationSection(grp);
@@ -87,15 +91,15 @@
 				R.string.save_track_to_gpx_descrp));
 		cat.addPreference(createTimeListPreference(settings.SAVE_TRACK_INTERVAL, SECONDS,
 				MINUTES, 1000, R.string.save_track_interval, R.string.save_track_interval_descr));
-		String[] names;  
+		String[] names;
 		Float[] floatValues;
 		floatValues = new Float[] {0.f, 2.0f, 5.0f, 10.0f, 20.0f, 30.0f, 50.0f};
 		names = new String[floatValues.length];
 		names[0] = getString(R.string.shared_string_not_selected);
 		for(int i = 1; i < floatValues.length; i++) {
-			names[i] = floatValues[i].intValue() + " " + getString(R.string.m); 
+			names[i] = floatValues[i].intValue() + " " + getString(R.string.m);
 		}
-		cat.addPreference(createListPreference(settings.SAVE_TRACK_MIN_DISTANCE, names, floatValues,  
+		cat.addPreference(createListPreference(settings.SAVE_TRACK_MIN_DISTANCE, names, floatValues,
 				R.string.save_track_min_distance, R.string.save_track_min_distance_descr));
 		floatValues = new Float[] {0.f, 1.0f, 2.0f, 5.0f, 10.0f, 15.0f, 20.0f, 50.0f, 100.0f};
 		names = new String[floatValues.length];
@@ -103,7 +107,7 @@
 		for(int i = 1; i < floatValues.length; i++) {
 			names[i] = floatValues[i].intValue() + " " + getString(R.string.m) + "  (" + Math.round(floatValues[i]/0.3048f) + " " + getString(R.string.foot) + ")";
 		}
-		cat.addPreference(createListPreference(settings.SAVE_TRACK_PRECISION, names, floatValues,  
+		cat.addPreference(createListPreference(settings.SAVE_TRACK_PRECISION, names, floatValues,
 				R.string.save_track_precision, R.string.save_track_precision_descr));
 		floatValues = new Float[] {0.f, 0.000001f, 1.0f, 2.0f, 3.0f, 4.0f, 5.0f, 6.0f, 7.0f};
 		names = new String[floatValues.length];
@@ -113,14 +117,20 @@
 			names[i] = floatValues[i].intValue() + " " + getString(R.string.km_h);
 			floatValues[i] = floatValues[i] / 3.6f;
 		}
-		cat.addPreference(createListPreference(settings.SAVE_TRACK_MIN_SPEED, names, floatValues,  
+		cat.addPreference(createListPreference(settings.SAVE_TRACK_MIN_SPEED, names, floatValues,
 				R.string.save_track_min_speed, R.string.save_track_min_speed_descr));
 		cat.addPreference(createCheckBoxPreference(settings.AUTO_SPLIT_RECORDING, R.string.auto_split_recording_title,
 				R.string.auto_split_recording_descr));
 		cat.addPreference(createCheckBoxPreference(settings.DISABLE_RECORDING_ONCE_APP_KILLED, R.string.disable_recording_once_app_killed,
 				R.string.disable_recording_once_app_killed_descrp));
-		cat.addPreference(createCheckBoxPreference(settings.STORE_TRACKS_IN_MONTHLY_DIRECTORIES, R.string.store_tracks_in_monthly_directories,
-				R.string.store_tracks_in_monthly_directories_descrp));
+
+		Integer[] intValues = new Integer[]{REC_DIRECTORY, MONTHLY_DIRECTORY, DAILY_DIRECTORY};
+		names = new String[intValues.length];
+		names[0] = getString(R.string.store_tracks_in_rec_directory);
+		names[1] = getString(R.string.store_tracks_in_monthly_directories);
+		names[2] = getString(R.string.store_tracks_in_daily_directories);
+		cat.addPreference(createListPreference(settings.TRACK_STORAGE_DIRECTORY, names, intValues,
+				R.string.track_storage_directory, R.string.track_storage_directory_descrp));
 	}
 
 
@@ -129,7 +139,7 @@
 		cat = new PreferenceCategory(this);
 		cat.setTitle(R.string.live_monitoring_m);
 		grp.addPreference(cat);
-		
+
 		cat.addPreference(createEditTextPreference(settings.LIVE_MONITORING_URL, R.string.live_monitoring_url,
 				R.string.live_monitoring_url_descr));
 		final CheckBoxPreference liveMonitoring = createCheckBoxPreference(settings.LIVE_MONITORING, R.string.live_monitoring_m,
@@ -154,12 +164,12 @@
 
 	public void updateAllSettings() {
 		super.updateAllSettings();
-		
+
 		if(routeServiceEnabled != null) {
 			routeServiceEnabled.setChecked(getMyApplication().getNavigationService() != null);
 		}
 	}
-	
+
 	private void saveCurrentTracks(final SavingTrackHelper helper) {
 		setProgressVisibility(true);
 		getMyApplication().getTaskManager().runInBackground(new OsmAndTaskRunnable<Void, Void, Void>() {
@@ -178,7 +188,7 @@
 
 		}, (Void) null);
 	}
-	
+
 	@Override
 	protected void onDestroy() {
 		super.onDestroy();
@@ -187,7 +197,7 @@
 			broadcastReceiver = null;
 		}
 	}
-	
+
 	
 	
 	
diff --git a/OsmAnd/src/net/osmand/plus/routepreparationmenu/AddPointBottomSheetDialog.java b/OsmAnd/src/net/osmand/plus/routepreparationmenu/AddPointBottomSheetDialog.java
index 3fc913b..ad6be46 100644
--- a/OsmAnd/src/net/osmand/plus/routepreparationmenu/AddPointBottomSheetDialog.java
+++ b/OsmAnd/src/net/osmand/plus/routepreparationmenu/AddPointBottomSheetDialog.java
@@ -3,7 +3,6 @@
 import android.Manifest;
 import android.app.Activity;
 import android.content.Intent;
-import android.content.pm.PackageManager;
 import android.graphics.Color;
 import android.graphics.Typeface;
 import android.os.Bundle;
@@ -552,10 +551,10 @@
 			if (activity != null) {
 				RecyclerView.LayoutParams layoutParams = (RecyclerView.LayoutParams) view.getLayoutParams();
 				if (AndroidUiHelper.isOrientationPortrait(getActivity())) {
-					layoutParams.width = AndroidUtils.getScreenWidth(activity) / 2;
+					layoutParams.width = (int) (AndroidUtils.getScreenWidth(activity) / 2.5);
 				} else {
 					// 11.5dp is the shadow width
-					layoutParams.width = (getResources().getDimensionPixelSize(R.dimen.landscape_bottom_sheet_dialog_fragment_width) / 2) - AndroidUtils.dpToPx(activity, 11.5f);
+					layoutParams.width = (int) ((getResources().getDimensionPixelSize(R.dimen.landscape_bottom_sheet_dialog_fragment_width) / 2.5) - AndroidUtils.dpToPx(activity, 11.5f));
 				}
 				view.setLayoutParams(layoutParams);
 			}
@@ -585,6 +584,26 @@
 			super(app, items);
 		}
 
+		@NonNull
+		@Override
+		public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int viewType) {
+			RecyclerView.ViewHolder viewHolder = super.onCreateViewHolder(viewGroup, viewType);
+
+			TextView title = viewHolder.itemView.findViewById(R.id.title);
+			TextView description = viewHolder.itemView.findViewById(R.id.description);
+			if (title != null && description != null) {
+				int titleHeight = AndroidUtils.getTextHeight(title.getPaint());
+				int descriptionHeight = AndroidUtils.getTextHeight(description.getPaint());
+				int minTextHeight = titleHeight + descriptionHeight * 2;
+				int defaultItemHeight = viewGroup.getContext().getResources().getDimensionPixelSize(R.dimen.bottom_sheet_selected_item_title_height);
+				if (defaultItemHeight < minTextHeight) {
+					viewHolder.itemView.setMinimumHeight(minTextHeight);
+				}
+			}
+
+			return viewHolder;
+		}
+
 		@Override
 		public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {
 			OsmandApplication app = getApp();
diff --git a/OsmAnd/src/net/osmand/plus/routepreparationmenu/MapRouteInfoMenu.java b/OsmAnd/src/net/osmand/plus/routepreparationmenu/MapRouteInfoMenu.java
index 095394e..1d92f24 100644
--- a/OsmAnd/src/net/osmand/plus/routepreparationmenu/MapRouteInfoMenu.java
+++ b/OsmAnd/src/net/osmand/plus/routepreparationmenu/MapRouteInfoMenu.java
@@ -824,7 +824,8 @@
 		if (mapActivity == null || mainView == null) {
 			return;
 		}
-		final ApplicationMode am = mapActivity.getMyApplication().getRoutingHelper().getAppMode();
+		OsmandApplication app = mapActivity.getMyApplication();
+		final ApplicationMode am = app.getRoutingHelper().getAppMode();
 		final Set<ApplicationMode> selected = new HashSet<>();
 		selected.add(am);
 		ViewGroup vg = (ViewGroup) mainView.findViewById(R.id.app_modes);
@@ -843,7 +844,7 @@
 				}
 			}
 		};
-		final List<ApplicationMode> values = new ArrayList<ApplicationMode>(ApplicationMode.values(mapActivity.getMyApplication()));
+		final List<ApplicationMode> values = new ArrayList<ApplicationMode>(ApplicationMode.values(app));
 		values.remove(ApplicationMode.DEFAULT);
 
 		if (values.size() > 0 && !values.contains(am)) {
@@ -866,8 +867,8 @@
 		boolean firstMode = true;
 		while (iterator.hasNext()) {
 			ApplicationMode mode = iterator.next();
-			View toggle = AppModeDialog.createToggle(mapActivity.getLayoutInflater(), (OsmandApplication) mapActivity.getApplication(),
-					R.layout.mode_view_route_preparation, (LinearLayout) ll.findViewById(R.id.app_modes_content), mode, true);
+			View toggle = AppModeDialog.createToggle(mapActivity.getLayoutInflater(), app, R.layout.mode_view_route_preparation,
+					(LinearLayout) ll.findViewById(R.id.app_modes_content), mode, true);
 
 			if (firstMode && toggle.getLayoutParams() instanceof ViewGroup.MarginLayoutParams) {
 				firstMode = false;
@@ -882,10 +883,11 @@
 			buttons[k++] = toggle;
 		}
 		for (int i = 0; i < buttons.length; i++) {
-			AppModeDialog.updateButtonStateForRoute((OsmandApplication) mapActivity.getApplication(), values, selected, listener, buttons, i, true, true, nightMode);
+			AppModeDialog.updateButtonStateForRoute(app, values, selected, listener, buttons, i, true, true, nightMode);
 		}
 
-		final ApplicationMode activeMode = app.getSettings().getApplicationMode();
+		final ApplicationMode activeMode = app.getRoutingHelper().getAppMode();
+
 		final int idx = values.indexOf(activeMode);
 
 		OnGlobalLayoutListener globalListener = new OnGlobalLayoutListener() {
diff --git a/OsmAnd/src/net/osmand/plus/settings/CoordinatesFormatFragment.java b/OsmAnd/src/net/osmand/plus/settings/CoordinatesFormatFragment.java
index 02afd07..23c25dd 100644
--- a/OsmAnd/src/net/osmand/plus/settings/CoordinatesFormatFragment.java
+++ b/OsmAnd/src/net/osmand/plus/settings/CoordinatesFormatFragment.java
@@ -8,15 +8,10 @@
 import android.support.v7.preference.Preference;
 import android.support.v7.preference.PreferenceScreen;
 import android.support.v7.preference.PreferenceViewHolder;
-import android.text.Layout;
-import android.text.Selection;
-import android.text.Spannable;
-import android.text.SpannableString;
 import android.text.SpannableStringBuilder;
 import android.text.Spanned;
 import android.text.TextPaint;
 import android.text.style.ClickableSpan;
-import android.view.MotionEvent;
 import android.view.View;
 import android.widget.TextView;
 
@@ -26,6 +21,7 @@
 import net.osmand.plus.OsmAndFormatter;
 import net.osmand.plus.R;
 import net.osmand.plus.settings.bottomsheets.ChangeGeneralProfilesPrefBottomSheet;
+import net.osmand.plus.widgets.tools.ClickableSpanTouchListener;
 import net.osmand.plus.wikipedia.WikipediaDialogFragment;
 
 
@@ -72,53 +68,11 @@
 		if (UTM_FORMAT.equals(preference.getKey())) {
 			TextView summaryView = (TextView) holder.findViewById(android.R.id.summary);
 			if (summaryView != null) {
-				summaryView.setOnTouchListener(getSummaryTouchListener());
+				summaryView.setOnTouchListener(new ClickableSpanTouchListener());
 			}
 		}
 	}
 
-	private View.OnTouchListener getSummaryTouchListener() {
-		return new View.OnTouchListener() {
-			@Override
-			public boolean onTouch(View v, MotionEvent event) {
-				int action = event.getAction();
-
-				if (action == MotionEvent.ACTION_UP || action == MotionEvent.ACTION_DOWN) {
-					TextView widget = (TextView) v;
-
-					int x = (int) event.getX();
-					int y = (int) event.getY();
-
-					x -= widget.getTotalPaddingLeft();
-					y -= widget.getTotalPaddingTop();
-
-					x += widget.getScrollX();
-					y += widget.getScrollY();
-
-					Layout layout = widget.getLayout();
-					int line = layout.getLineForVertical(y);
-					int off = layout.getOffsetForHorizontal(line, x);
-
-					Spannable spannable = new SpannableString(widget.getText());
-					ClickableSpan[] links = spannable.getSpans(off, off, ClickableSpan.class);
-
-					if (links.length != 0) {
-						if (action == MotionEvent.ACTION_UP) {
-							links[0].onClick(widget);
-						} else {
-							Selection.setSelection(spannable, spannable.getSpanStart(links[0]), spannable.getSpanEnd(links[0]));
-						}
-						return true;
-					} else {
-						Selection.removeSelection(spannable);
-					}
-				}
-
-				return false;
-			}
-		};
-	}
-
 	private CharSequence getCoordinatesFormatSummary(Location loc, int format) {
 		double lat = loc != null ? loc.getLatitude() : 49.41869;
 		double lon = loc != null ? loc.getLongitude() : 8.67339;
@@ -165,13 +119,9 @@
 		int newFormat = getCoordinatesFormatForKey(key);
 		if (newFormat != -1) {
 			ApplicationMode selectedAppMode = getSelectedAppMode();
-			if (settings.COORDINATES_FORMAT.isSetForMode(selectedAppMode)) {
-				if (!settings.COORDINATES_FORMAT.getModeValue(selectedAppMode).equals(newFormat)) {
-					settings.COORDINATES_FORMAT.set(newFormat);
-					updateSelectedFormatPrefs(key);
-					return true;
-				}
-			} else {
+			if (!settings.COORDINATES_FORMAT.getModeValue(selectedAppMode).equals(newFormat)) {
+				updateSelectedFormatPrefs(key);
+
 				FragmentManager fragmentManager = getFragmentManager();
 				if (fragmentManager != null) {
 					ChangeGeneralProfilesPrefBottomSheet.showInstance(fragmentManager, settings.COORDINATES_FORMAT.getId(), newFormat, this, false);
diff --git a/OsmAnd/src/net/osmand/plus/settings/DataStorageFragment.java b/OsmAnd/src/net/osmand/plus/settings/DataStorageFragment.java
index b944501..2e357ac 100644
--- a/OsmAnd/src/net/osmand/plus/settings/DataStorageFragment.java
+++ b/OsmAnd/src/net/osmand/plus/settings/DataStorageFragment.java
@@ -27,6 +27,7 @@
 import net.osmand.plus.ProgressImplementation;
 import net.osmand.plus.R;
 import net.osmand.plus.UiUtilities;
+import net.osmand.plus.activities.MapActivity;
 import net.osmand.plus.activities.OsmandActionBarActivity;
 import net.osmand.plus.download.DownloadActivity;
 import net.osmand.plus.settings.bottomsheets.ChangeDataStorageBottomSheet;
@@ -43,20 +44,21 @@
 import java.util.ArrayList;
 import java.util.Locale;
 
-import static net.osmand.plus.settings.DataStorageItemsHolder.INTERNAL_STORAGE;
-import static net.osmand.plus.settings.DataStorageItemsHolder.MANUALLY_SPECIFIED;
-import static net.osmand.plus.settings.DataStorageItemsHolder.TILES_MEMORY;
+import static net.osmand.plus.settings.DataStorageHelper.INTERNAL_STORAGE;
+import static net.osmand.plus.settings.DataStorageHelper.MANUALLY_SPECIFIED;
+import static net.osmand.plus.settings.DataStorageHelper.OTHER_MEMORY;
+import static net.osmand.plus.settings.DataStorageHelper.TILES_MEMORY;
 import static net.osmand.plus.settings.bottomsheets.ChangeDataStorageBottomSheet.CHOSEN_DIRECTORY;
 import static net.osmand.plus.settings.bottomsheets.ChangeDataStorageBottomSheet.MOVE_DATA;
 import static net.osmand.plus.settings.bottomsheets.SelectFolderBottomSheet.PATH_CHANGED;
 import static net.osmand.plus.settings.bottomsheets.SelectFolderBottomSheet.NEW_PATH;
 
-public class DataStorageFragment extends BaseSettingsFragment implements DataStorageItemsHolder.UpdateMemoryInfoUIAdapter {
-
+public class DataStorageFragment extends BaseSettingsFragment implements DataStorageHelper.UpdateMemoryInfoUIAdapter {
+	public final static int PERMISSIONS_REQUEST_WRITE_EXTERNAL_STORAGE = 500;
+	public final static int UI_REFRESH_TIME_MS = 500;
+	
 	private final static String CHANGE_DIRECTORY_BUTTON = "change_directory";
 	private final static String OSMAND_USAGE = "osmand_usage";
-	private final static String CALCULATE_TILES_BTN_PRESSED = "calculate_tiles_btn_pressed";
-	private final static String ITEMS_HOLDER = "items_holder";
 
 	private ArrayList<DataStorageMenuItem> menuItems;
 	private ArrayList<DataStorageMemoryItem> memoryItems;
@@ -64,26 +66,21 @@
 	private Preference changeButton;
 	private DataStorageMenuItem currentDataStorage;
 	private String tmpManuallySpecifiedPath;
-	private DataStorageItemsHolder itemsHolder;
+	private DataStorageHelper dataStorageHelper;
 	private boolean calculateTilesBtnPressed;
 	
-	private DataStorageItemsHolder.RefreshMemoryUsedInfo calculateMemoryTask;
-	private DataStorageItemsHolder.RefreshMemoryUsedInfo calculateTilesMemoryTask;
+	private DataStorageHelper.RefreshMemoryUsedInfo calculateMemoryTask;
+	private DataStorageHelper.RefreshMemoryUsedInfo calculateTilesMemoryTask;
 
 	private OsmandApplication app;
 	private OsmandActionBarActivity activity;
-	private OsmandSettings settings;
 
 	@Override
 	public void onCreate(Bundle savedInstanceState) {
 		app = getMyApplication();
 		activity = getMyActivity();
-		settings = app.getSettings();
-		if (savedInstanceState != null) {
-			calculateTilesBtnPressed = savedInstanceState.getBoolean(CALCULATE_TILES_BTN_PRESSED);
-			itemsHolder = savedInstanceState.getParcelable(ITEMS_HOLDER);
-		}
-		if (itemsHolder == null) {
+		if (dataStorageHelper == null) {
+			setRetainInstance(true);
 			refreshDataInfo();
 		}
 		super.onCreate(savedInstanceState);
@@ -94,12 +91,12 @@
 		
 		PreferenceScreen screen = getPreferenceScreen();
 
-		if (screen == null || itemsHolder == null) {
+		if (screen == null || dataStorageHelper == null) {
 			return;
 		}
 
-		menuItems = itemsHolder.getStorageItems();
-		memoryItems = itemsHolder.getMemoryInfoItems();
+		menuItems = dataStorageHelper.getStorageItems();
+		memoryItems = dataStorageHelper.getMemoryInfoItems();
 		dataStorageRadioButtonsGroup = new ArrayList<>();
 
 		for (DataStorageMenuItem item : menuItems) {
@@ -111,7 +108,7 @@
 			dataStorageRadioButtonsGroup.add(preference);
 		}
 
-		currentDataStorage = itemsHolder.getCurrentStorage();
+		currentDataStorage = dataStorageHelper.getCurrentStorage();
 
 		changeButton = new Preference(app);
 		changeButton.setKey(CHANGE_DIRECTORY_BUTTON);
@@ -159,7 +156,7 @@
 					if (tmpManuallySpecifiedPath != null) {
 						DataStorageMenuItem manuallySpecified = null;
 						try {
-							manuallySpecified = (DataStorageMenuItem) itemsHolder.getManuallySpecified().clone();
+							manuallySpecified = (DataStorageMenuItem) dataStorageHelper.getManuallySpecified().clone();
 							manuallySpecified.setDirectory(tmpManuallySpecifiedPath);
 						} catch (CloneNotSupportedException e) {
 							return false;
@@ -173,14 +170,14 @@
 			//show necessary dialog
 			String key = preference.getKey();
 			if (key != null) {
-				DataStorageMenuItem newDataStorage = itemsHolder.getStorage(key);
+				DataStorageMenuItem newDataStorage = dataStorageHelper.getStorage(key);
 				if (newDataStorage != null) {
 					if (!currentDataStorage.getKey().equals(newDataStorage.getKey())) {
 						if (newDataStorage.getType() == OsmandSettings.EXTERNAL_STORAGE_TYPE_DEFAULT
 								&& !DownloadActivity.hasPermissionToWriteExternalStorage(activity)) {
 							ActivityCompat.requestPermissions(activity,
 									new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},
-									DownloadActivity.PERMISSIONS_REQUEST_WRITE_EXTERNAL_STORAGE);
+									DataStorageFragment.PERMISSIONS_REQUEST_WRITE_EXTERNAL_STORAGE);
 						} else if (key.equals(MANUALLY_SPECIFIED)) {
 							showFolderSelectionDialog();
 						} else {
@@ -195,13 +192,6 @@
 	}
 
 	@Override
-	public void onSaveInstanceState(Bundle outState) {
-		super.onSaveInstanceState(outState);
-		outState.putBoolean(CALCULATE_TILES_BTN_PRESSED, calculateTilesBtnPressed);
-		outState.putParcelable(ITEMS_HOLDER, itemsHolder);
-	}
-
-	@Override
 	protected void onBindPreferenceViewHolder(Preference preference, PreferenceViewHolder holder) {
 		super.onBindPreferenceViewHolder(preference, holder);
 		String key = preference.getKey();
@@ -212,9 +202,17 @@
 		int activeColor = ContextCompat.getColor(app, activeColorResId);
 		int primaryTextColorResId = isNightMode() ? R.color.text_color_primary_dark : R.color.text_color_primary_light;
 		int primaryTextColor = ContextCompat.getColor(app, primaryTextColorResId);
+
+		String[] memoryUnitsFormats = new String[] {
+				getString(R.string.shared_string_memory_kb_desc),
+				getString(R.string.shared_string_memory_mb_desc),
+				getString(R.string.shared_string_memory_gb_desc),
+				getString(R.string.shared_string_memory_tb_desc)
+		};
+		
 		final View itemView = holder.itemView;
 		if (preference instanceof CheckBoxPreference) {
-			DataStorageMenuItem item = itemsHolder.getStorage(key);
+			DataStorageMenuItem item = dataStorageHelper.getStorage(key);
 			if (item != null) {
 				TextView tvTitle = itemView.findViewById(android.R.id.title);
 				TextView tvSummary = itemView.findViewById(R.id.summary);
@@ -243,7 +241,13 @@
 					divider.setVisibility(View.VISIBLE);
 					secondPart.setVisibility(View.VISIBLE);
 					String space = getSpaceDescription(item.getDirectory());
-					tvSummary.setText(space);
+					if (!space.equals("")) {
+						space = space.replaceAll(" • ", "  •  ");
+						tvSummary.setText(space);
+						tvSummary.setVisibility(View.VISIBLE);
+					} else {
+						tvSummary.setVisibility(View.GONE);
+					}
 					if (currentKey.equals(INTERNAL_STORAGE)) {
 						tvAdditionalDescription.setText(item.getDescription());
 					} else {
@@ -259,12 +263,9 @@
 			icon.setVisibility(View.INVISIBLE);
 			title.setText(R.string.shared_string_change);
 		} else if(key.equals(OSMAND_USAGE)) {
-			long totalUsageBytes = 0;
-			for (DataStorageMemoryItem mi : memoryItems) {
-				totalUsageBytes += mi.getUsedMemoryBytes();
-			}
+			long totalUsageBytes = dataStorageHelper.getTotalUsedBytes();
 			TextView tvSummary = itemView.findViewById(R.id.summary);
-			tvSummary.setText(getFormattedMemoryUsedInfo(totalUsageBytes));
+			tvSummary.setText(DataStorageHelper.getFormattedMemoryInfo(totalUsageBytes, memoryUnitsFormats));
 		} else {
 			for (DataStorageMemoryItem mi : memoryItems) {
 				if (key.equals(mi.getKey())) {
@@ -278,14 +279,20 @@
 							@Override
 							public void onClick(View v) {
 								calculateTilesBtnPressed = true;
-								calculateTilesMemoryTask = itemsHolder.calculateTilesMemoryUsed(DataStorageFragment.this);
+								calculateTilesMemoryTask = dataStorageHelper.calculateTilesMemoryUsed(DataStorageFragment.this);
 								updateAllSettings();
 							}
 						});
 					} else {
 						tvMemory.setOnClickListener(null);
 						color = primaryTextColor;
-						summary = getFormattedMemoryUsedInfo(mi.getUsedMemoryBytes());
+						summary = DataStorageHelper.getFormattedMemoryInfo(mi.getUsedMemoryBytes(), memoryUnitsFormats);
+					}
+					View divider = itemView.findViewById(R.id.divider);
+					if (mi.getKey().equals(OTHER_MEMORY)) {
+						divider.setVisibility(View.VISIBLE);
+					} else {
+						divider.setVisibility(View.GONE);
 					}
 					tvMemory.setTextColor(color);
 					tvMemory.setText(summary);
@@ -319,7 +326,7 @@
 	}
 
 	private void showFolderSelectionDialog() {
-		DataStorageMenuItem manuallySpecified = itemsHolder.getManuallySpecified();
+		DataStorageMenuItem manuallySpecified = dataStorageHelper.getManuallySpecified();
 		if (manuallySpecified != null) {
 			SelectFolderBottomSheet.showInstance(getFragmentManager(), manuallySpecified.getKey(),
 					manuallySpecified.getDirectory(), DataStorageFragment.this,
@@ -416,7 +423,7 @@
 			app.setExternalStorageDirectory(type, newDirectory);
 			reloadData();
 			if (silentRestart) {
-				android.os.Process.killProcess(android.os.Process.myPid());
+				MapActivity.doRestart(activity);
 			} else {
 				app.restartApp(activity);
 			}
@@ -430,8 +437,8 @@
 	
 	private void refreshDataInfo() {
 		calculateTilesBtnPressed = false;
-		itemsHolder = DataStorageItemsHolder.refreshInfo(app);
-		calculateMemoryTask = itemsHolder.calculateMemoryUsedInfo(this);
+		dataStorageHelper = new DataStorageHelper(app);
+		calculateMemoryTask = dataStorageHelper.calculateMemoryUsedInfo(this);
 	}
 
 	private String getSpaceDescription(String path) {
@@ -443,29 +450,14 @@
 		}
 		if (dir.exists()) {
 			DecimalFormat formatter = new DecimalFormat("#.##");
+			float freeSpace = AndroidUtils.getFreeSpaceGb(dir);
+			float totalSpace = AndroidUtils.getTotalSpaceGb(dir);
+			if (freeSpace < 0 || totalSpace < 0) {
+				return "";
+			}
 			return String.format(getString(R.string.data_storage_space_description),
-					formatter.format(AndroidUtils.getFreeSpaceGb(dir)),
-					formatter.format(AndroidUtils.getTotalSpaceGb(dir)));
-		}
-		return "";
-	}
-	
-	private String getFormattedMemoryUsedInfo(long bytes) {
-		int type  = 1;
-		double used = (double) bytes / 1024;
-		while (used > 1024) {
-			++type;
-			used = used / 1024;
-		}
-		String formattedUsed = new DecimalFormat("#.##").format(used);
-		if (type == 1) {
-			return String.format(getString(R.string.shared_string_memory_kb_desc), formattedUsed);
-		} else if (type == 2) {
-			return String.format(getString(R.string.shared_string_memory_mb_desc), formattedUsed);
-		} else if (type == 3){
-			return String.format(getString(R.string.shared_string_memory_gb_desc), formattedUsed);
-		} else if (type == 4){
-			return String.format(getString(R.string.shared_string_memory_tb_desc), formattedUsed);
+					formatter.format(freeSpace),
+					formatter.format(totalSpace));
 		}
 		return "";
 	}
@@ -479,6 +471,14 @@
 		updateAllSettings();
 	}
 	
+	@Override
+	public void onFinishUpdating(String taskKey) {
+		updateAllSettings();
+		if (taskKey != null && taskKey.equals(TILES_MEMORY)) {
+			app.getSettings().OSMAND_USAGE_SPACE.set(dataStorageHelper.getTotalUsedBytes());
+		}
+	}
+
 	public static class MoveFilesToDifferentDirectory extends AsyncTask<Void, Void, Boolean> {
 
 		protected WeakReference<OsmandActionBarActivity> activity;
@@ -493,6 +493,7 @@
 		private long copiedSize;
 		private int failedCount;
 		private long failedSize;
+		private String exceptionMessage;
 
 		public MoveFilesToDifferentDirectory(OsmandActionBarActivity activity, File from, File to) {
 			this.activity = new WeakReference<>(activity);
@@ -554,7 +555,7 @@
 				if (result.booleanValue() && runOnSuccess != null) {
 					runOnSuccess.run();
 				} else if (!result.booleanValue()) {
-					Toast.makeText(ctx, R.string.shared_string_io_error, Toast.LENGTH_LONG).show();
+					Toast.makeText(ctx, ctx.getString(R.string.shared_string_io_error) + ": " + exceptionMessage, Toast.LENGTH_LONG).show();
 				}
 			}
 			try {
@@ -626,6 +627,7 @@
 			try {
 				movingFiles(from, to, 0);
 			} catch (IOException e) {
+				exceptionMessage = e.getMessage();
 				return false;
 			}
 			return true;
diff --git a/OsmAnd/src/net/osmand/plus/settings/DataStorageHelper.java b/OsmAnd/src/net/osmand/plus/settings/DataStorageHelper.java
new file mode 100644
index 0000000..757f551
--- /dev/null
+++ b/OsmAnd/src/net/osmand/plus/settings/DataStorageHelper.java
@@ -0,0 +1,485 @@
+package net.osmand.plus.settings;
+
+import android.os.AsyncTask;
+import android.os.Build;
+
+import net.osmand.IndexConstants;
+import net.osmand.ValueHolder;
+import net.osmand.plus.OsmandApplication;
+import net.osmand.plus.OsmandSettings;
+import net.osmand.plus.R;
+
+import java.io.File;
+import java.text.DecimalFormat;
+import java.util.ArrayList;
+
+import static net.osmand.plus.settings.DataStorageFragment.UI_REFRESH_TIME_MS;
+import static net.osmand.plus.settings.DataStorageMemoryItem.Directory;
+import static net.osmand.plus.settings.DataStorageMemoryItem.EXTENSIONS;
+import static net.osmand.plus.settings.DataStorageMemoryItem.PREFIX;
+
+public class DataStorageHelper {
+	public final static String INTERNAL_STORAGE = "internal_storage";
+	public final static String EXTERNAL_STORAGE = "external_storage";
+	public final static String SHARED_STORAGE = "shared_storage";
+	public final static String MULTIUSER_STORAGE = "multiuser_storage";
+	public final static String MANUALLY_SPECIFIED = "manually_specified";
+
+	public final static String MAPS_MEMORY = "maps_memory_used";
+	public final static String SRTM_AND_HILLSHADE_MEMORY = "contour_lines_and_hillshade_memory";
+	public final static String TRACKS_MEMORY = "tracks_memory_used";
+	public final static String NOTES_MEMORY = "notes_memory_used";
+	public final static String TILES_MEMORY = "tiles_memory_used";
+	public final static String OTHER_MEMORY = "other_memory_used";
+
+	private ArrayList<DataStorageMenuItem> menuItems = new ArrayList<>();
+	private DataStorageMenuItem currentDataStorage;
+	private DataStorageMenuItem manuallySpecified;
+
+	private ArrayList<DataStorageMemoryItem> memoryItems = new ArrayList<>();
+	private DataStorageMemoryItem mapsMemory;
+	private DataStorageMemoryItem srtmAndHillshadeMemory;
+	private DataStorageMemoryItem tracksMemory;
+	private DataStorageMemoryItem notesMemory;
+	private DataStorageMemoryItem tilesMemory;
+	private DataStorageMemoryItem otherMemory;
+
+	private int currentStorageType;
+	private String currentStoragePath;
+
+	public DataStorageHelper(OsmandApplication app) {
+		prepareData(app);
+	}
+
+	private void prepareData(OsmandApplication app) {
+
+		if (app == null) {
+			return;
+		}
+
+		OsmandSettings settings = app.getSettings();
+
+		if (settings.getExternalStorageDirectoryTypeV19() >= 0) {
+			currentStorageType = settings.getExternalStorageDirectoryTypeV19();
+		} else {
+			ValueHolder<Integer> vh = new ValueHolder<Integer>();
+			if (vh.value != null && vh.value >= 0) {
+				currentStorageType = vh.value;
+			} else {
+				currentStorageType = 0;
+			}
+		}
+		currentStoragePath = settings.getExternalStorageDirectory().getAbsolutePath();
+
+		String path;
+		File dir;
+		int iconId;
+
+		if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
+
+			//internal storage
+			path = settings.getInternalAppPath().getAbsolutePath();
+			dir = new File(path);
+			iconId = R.drawable.ic_action_phone;
+
+			DataStorageMenuItem internalStorageItem = DataStorageMenuItem.builder()
+					.setKey(INTERNAL_STORAGE)
+					.setTitle(app.getString(R.string.storage_directory_internal_app))
+					.setDirectory(path)
+					.setDescription(app.getString(R.string.internal_app_storage_description))
+					.setType(OsmandSettings.EXTERNAL_STORAGE_TYPE_INTERNAL_FILE)
+					.setIconResId(iconId)
+					.createItem();
+			addItem(internalStorageItem);
+
+			//shared_storage
+			dir = settings.getDefaultInternalStorage();
+			path = dir.getAbsolutePath();
+			iconId = R.drawable.ic_action_phone;
+
+			DataStorageMenuItem sharedStorageItem = DataStorageMenuItem.builder()
+					.setKey(SHARED_STORAGE)
+					.setTitle(app.getString(R.string.storage_directory_shared))
+					.setDirectory(path)
+					.setType(OsmandSettings.EXTERNAL_STORAGE_TYPE_DEFAULT)
+					.setIconResId(iconId)
+					.createItem();
+			addItem(sharedStorageItem);
+
+			//external storage
+			File[] externals = app.getExternalFilesDirs(null);
+			if (externals != null) {
+				int i = 0;
+				for (File external : externals) {
+					if (external != null) {
+						++i;
+						dir = external;
+						path = dir.getAbsolutePath();
+						iconId = getIconForStorageType(dir);
+						DataStorageMenuItem externalStorageItem = DataStorageMenuItem.builder()
+								.setKey(EXTERNAL_STORAGE + i)
+								.setTitle(app.getString(R.string.storage_directory_external) + " " + i)
+								.setDirectory(path)
+								.setType(OsmandSettings.EXTERNAL_STORAGE_TYPE_EXTERNAL_FILE)
+								.setIconResId(iconId)
+								.createItem();
+						addItem(externalStorageItem);
+					}
+				}
+			}
+
+			//multi user storage
+			File[] obbDirs = app.getObbDirs();
+			if (obbDirs != null) {
+				int i = 0;
+				for (File obb : obbDirs) {
+					if (obb != null) {
+						++i;
+						dir = obb;
+						path = dir.getAbsolutePath();
+						iconId = getIconForStorageType(dir);
+						DataStorageMenuItem multiuserStorageItem = DataStorageMenuItem.builder()
+								.setKey(MULTIUSER_STORAGE + i)
+								.setTitle(app.getString(R.string.storage_directory_multiuser) + " " + i)
+								.setDirectory(path)
+								.setType(OsmandSettings.EXTERNAL_STORAGE_TYPE_OBB)
+								.setIconResId(iconId)
+								.createItem();
+						addItem(multiuserStorageItem);
+					}
+				}
+			}
+		}
+
+		//manually specified storage
+		manuallySpecified = DataStorageMenuItem.builder()
+				.setKey(MANUALLY_SPECIFIED)
+				.setTitle(app.getString(R.string.storage_directory_manual))
+				.setDirectory(currentStoragePath)
+				.setType(OsmandSettings.EXTERNAL_STORAGE_TYPE_SPECIFIED)
+				.setIconResId(R.drawable.ic_action_folder)
+				.createItem();
+		menuItems.add(manuallySpecified);
+
+		if (currentDataStorage == null) {
+			currentDataStorage = manuallySpecified;
+		}
+
+		initMemoryUsed(app);
+	}
+
+	private void initMemoryUsed(OsmandApplication app) {
+		mapsMemory = DataStorageMemoryItem.builder()
+				.setKey(MAPS_MEMORY)
+				.setExtensions(IndexConstants.BINARY_MAP_INDEX_EXT)
+				.setDirectories(
+						new Directory(app.getAppPath(IndexConstants.MAPS_PATH).getAbsolutePath(), false, EXTENSIONS, false),
+						new Directory(app.getAppPath(IndexConstants.ROADS_INDEX_DIR).getAbsolutePath(), true, EXTENSIONS, false),
+						new Directory(app.getAppPath(IndexConstants.WIKI_INDEX_DIR).getAbsolutePath(), true, EXTENSIONS, false),
+						new Directory(app.getAppPath(IndexConstants.WIKIVOYAGE_INDEX_DIR).getAbsolutePath(), true, EXTENSIONS, false),
+						new Directory(app.getAppPath(IndexConstants.BACKUP_INDEX_DIR).getAbsolutePath(), true, EXTENSIONS, false))
+				.createItem();
+		memoryItems.add(mapsMemory);
+
+		srtmAndHillshadeMemory = DataStorageMemoryItem.builder()
+				.setKey(SRTM_AND_HILLSHADE_MEMORY)
+				.setExtensions(IndexConstants.BINARY_SRTM_MAP_INDEX_EXT)
+				.setDirectories(
+						new Directory(app.getAppPath(IndexConstants.SRTM_INDEX_DIR).getAbsolutePath(), true, EXTENSIONS, false),
+						new Directory(app.getAppPath(IndexConstants.TILES_INDEX_DIR).getAbsolutePath(), false, PREFIX, true))
+				.setPrefixes("Hillshade")
+				.createItem();
+		memoryItems.add(srtmAndHillshadeMemory);
+
+		tracksMemory = DataStorageMemoryItem.builder()
+				.setKey(TRACKS_MEMORY)
+//				.setExtensions(".gpx", ".gpx.bz2")
+				.setDirectories(
+						new Directory(app.getAppPath(IndexConstants.GPX_INDEX_DIR).getAbsolutePath(), true, EXTENSIONS, false))
+				.createItem();
+		memoryItems.add(tracksMemory);
+
+		notesMemory = DataStorageMemoryItem.builder()
+				.setKey(NOTES_MEMORY)
+//				.setExtensions("")
+				.setDirectories(
+						new Directory(app.getAppPath(IndexConstants.AV_INDEX_DIR).getAbsolutePath(), true, EXTENSIONS, false))
+				.createItem();
+		memoryItems.add(notesMemory);
+
+		tilesMemory = DataStorageMemoryItem.builder()
+				.setKey(TILES_MEMORY)
+//				.setExtensions("")
+				.setDirectories(
+						new Directory(app.getAppPath(IndexConstants.TILES_INDEX_DIR).getAbsolutePath(), true, EXTENSIONS, false))
+				.createItem();
+		memoryItems.add(tilesMemory);
+
+		otherMemory = DataStorageMemoryItem.builder()
+				.setKey(OTHER_MEMORY)
+				.createItem();
+		memoryItems.add(otherMemory);
+	}
+
+	public ArrayList<DataStorageMenuItem> getStorageItems() {
+		return menuItems;
+	}
+
+	private int getIconForStorageType(File dir) {
+		return R.drawable.ic_action_folder;
+	}
+
+	public DataStorageMenuItem getCurrentStorage() {
+		return currentDataStorage;
+	}
+
+	private void addItem(DataStorageMenuItem item) {
+		if (currentStorageType == item.getType() && currentStoragePath.equals(item.getDirectory())) {
+			currentDataStorage = item;
+		}
+		menuItems.add(item);
+	}
+
+	public DataStorageMenuItem getManuallySpecified() {
+		return manuallySpecified;
+	}
+
+	public DataStorageMenuItem getStorage(String key) {
+		if (menuItems != null && key != null) {
+			for (DataStorageMenuItem menuItem : menuItems) {
+				if (key.equals(menuItem.getKey())) {
+					return menuItem;
+				}
+			}
+		}
+		return null;
+	}
+
+	public int getCurrentType() {
+		return currentStorageType;
+	}
+
+	public String getCurrentPath() {
+		return currentStoragePath;
+	}
+
+	public ArrayList<DataStorageMemoryItem> getMemoryInfoItems() {
+		return memoryItems;
+	}
+
+	public RefreshMemoryUsedInfo calculateMemoryUsedInfo(UpdateMemoryInfoUIAdapter listener) {
+		File rootDir = new File(currentStoragePath);
+		RefreshMemoryUsedInfo task = new RefreshMemoryUsedInfo(listener, otherMemory, rootDir, null, null, OTHER_MEMORY);
+		task.execute(mapsMemory, srtmAndHillshadeMemory, tracksMemory, notesMemory);
+		return task;
+	}
+
+	public RefreshMemoryUsedInfo calculateTilesMemoryUsed(UpdateMemoryInfoUIAdapter listener) {
+		File rootDir = new File(tilesMemory.getDirectories()[0].getAbsolutePath());
+		RefreshMemoryUsedInfo task = new RefreshMemoryUsedInfo(listener, otherMemory, rootDir, null, srtmAndHillshadeMemory.getPrefixes(), TILES_MEMORY);
+		task.execute(tilesMemory);
+		return task;
+	}
+
+	public static class RefreshMemoryUsedInfo extends AsyncTask<DataStorageMemoryItem, Void, Void> {
+		private UpdateMemoryInfoUIAdapter listener;
+		private File rootDir;
+		private DataStorageMemoryItem otherMemory;
+		private String[] directoriesToAvoid;
+		private String[] prefixesToAvoid;
+		private String taskKey;
+		private long lastRefreshTime;
+
+		public RefreshMemoryUsedInfo(UpdateMemoryInfoUIAdapter listener, DataStorageMemoryItem otherMemory, File rootDir, String[] directoriesToAvoid, String[] prefixesToAvoid, String taskKey) {
+			this.listener = listener;
+			this.otherMemory = otherMemory;
+			this.rootDir = rootDir;
+			this.directoriesToAvoid = directoriesToAvoid;
+			this.prefixesToAvoid = prefixesToAvoid;
+			this.taskKey = taskKey;
+		}
+
+		@Override
+		protected Void doInBackground(DataStorageMemoryItem... items) {
+			lastRefreshTime = System.currentTimeMillis();
+			if (rootDir.canRead()) {
+				calculateMultiTypes(rootDir, items);
+			}
+			return null;
+		}
+
+		private void calculateMultiTypes(File rootDir, DataStorageMemoryItem... items) {
+			File[] subFiles = rootDir.listFiles();
+
+			for (File file : subFiles) {
+				if (isCancelled()) {
+					break;
+				}
+				nextFile : {
+					if (file.isDirectory()) {
+						//check current directory should be avoid
+						if (directoriesToAvoid != null) {
+							for (String directoryToAvoid : directoriesToAvoid) {
+								if (file.getAbsolutePath().equals(directoryToAvoid)) {
+									break nextFile;
+								}
+							}
+						}
+						//check current directory matched items type
+						for (DataStorageMemoryItem item : items) {
+							Directory[] directories = item.getDirectories();
+							if (directories == null) {
+								continue;
+							}
+							for (Directory dir : directories) {
+								if (file.getAbsolutePath().equals(dir.getAbsolutePath())
+										|| (file.getAbsolutePath().startsWith(dir.getAbsolutePath()))) {
+									if (dir.isGoDeeper()) {
+										calculateMultiTypes(file, items);
+										break nextFile;
+									} else if (dir.isSkipOther()) {
+										break nextFile;
+									}
+								}
+							}
+						}
+						//current directory did not match to any type
+						otherMemory.addBytes(getDirectorySize(file));
+					} else if (file.isFile()) {
+						//check current file should be avoid
+						if (prefixesToAvoid != null) {
+							for (String prefixToAvoid : prefixesToAvoid) {
+								if (file.getName().toLowerCase().startsWith(prefixToAvoid.toLowerCase())) {
+									break nextFile;
+								}
+							}
+						}
+						//check current file matched items type
+						for (DataStorageMemoryItem item : items) {
+							Directory[] directories = item.getDirectories();
+							if (directories == null) {
+								continue;
+							}
+							for (Directory dir : directories) {
+								if (rootDir.getAbsolutePath().equals(dir.getAbsolutePath())
+										|| (rootDir.getAbsolutePath().startsWith(dir.getAbsolutePath()) && dir.isGoDeeper())) {
+									int checkingType = dir.getCheckingType();
+									switch (checkingType) {
+										case EXTENSIONS : {
+											String[] extensions = item.getExtensions();
+											if (extensions != null) {
+												for (String extension : extensions) {
+													if (file.getAbsolutePath().endsWith(extension)) {
+														item.addBytes(file.length());
+														break nextFile;
+													}
+												}
+											} else {
+												item.addBytes(file.length());
+												break nextFile;
+											}
+											break ;
+										}
+										case PREFIX : {
+											String[] prefixes = item.getPrefixes();
+											if (prefixes != null) {
+												for (String prefix : prefixes) {
+													if (file.getName().toLowerCase().startsWith(prefix.toLowerCase())) {
+														item.addBytes(file.length());
+														break nextFile;
+													}
+												}
+											} else {
+												item.addBytes(file.length());
+												break nextFile;
+											}
+											break ;
+										}
+									}
+									if (dir.isSkipOther()) {
+										break nextFile;
+									}
+								}
+							}
+						}
+						//current file did not match any type
+						otherMemory.addBytes(file.length());
+					}
+				}
+				refreshUI();
+			}
+		}
+
+		private long getDirectorySize(File dir) {
+			long bytes = 0;
+			if (dir.isDirectory()) {
+				File[] files = dir.listFiles();
+				for (File file : files) {
+					if (isCancelled()) {
+						break;
+					}
+					if (file.isDirectory()) {
+						bytes += getDirectorySize(file);
+					} else if (file.isFile()) {
+						bytes += file.length();
+					}
+				}
+			}
+			return bytes;
+		}
+
+		@Override
+		protected void onProgressUpdate(Void... values) {
+			super.onProgressUpdate(values);
+			if (listener != null) {
+				listener.onMemoryInfoUpdate();
+			}
+		}
+
+		@Override
+		protected void onPostExecute(Void aVoid) {
+			super.onPostExecute(aVoid);
+			if (listener != null) {
+				listener.onFinishUpdating(taskKey);
+			}
+		}
+		
+		private void refreshUI() {
+			long currentTime = System.currentTimeMillis();
+			if ((currentTime - lastRefreshTime) > UI_REFRESH_TIME_MS) {
+				lastRefreshTime = currentTime;
+				publishProgress();
+			}
+		}
+	}
+
+	public long getTotalUsedBytes() {
+		long total = 0;
+		if (memoryItems != null && memoryItems.size() > 0) {
+			for (DataStorageMemoryItem mi : memoryItems) {
+				total += mi.getUsedMemoryBytes();
+			}
+			return total;
+		}
+		return -1;
+	}
+
+	public static String getFormattedMemoryInfo(long bytes, String[] formatStrings) {
+		int type = 0;
+		double memory = (double) bytes / 1024;
+		while (memory > 1024 && type < formatStrings.length) {
+			++type;
+			memory = memory / 1024;
+		}
+		String formattedUsed = new DecimalFormat("#.##").format(memory);
+		return String.format(formatStrings[type], formattedUsed);
+	}
+
+	public interface UpdateMemoryInfoUIAdapter {
+
+		void onMemoryInfoUpdate();
+		
+		void onFinishUpdating(String taskKey);
+
+	}
+}
\ No newline at end of file
diff --git a/OsmAnd/src/net/osmand/plus/settings/DataStorageItemsHolder.java b/OsmAnd/src/net/osmand/plus/settings/DataStorageItemsHolder.java
deleted file mode 100644
index 6c1f4a8..0000000
--- a/OsmAnd/src/net/osmand/plus/settings/DataStorageItemsHolder.java
+++ /dev/null
@@ -1,437 +0,0 @@
-package net.osmand.plus.settings;
-
-import android.os.AsyncTask;
-import android.os.Build;
-import android.os.Parcel;
-import android.os.Parcelable;
-
-import net.osmand.IndexConstants;
-import net.osmand.ValueHolder;
-import net.osmand.plus.OsmandApplication;
-import net.osmand.plus.OsmandSettings;
-import net.osmand.plus.R;
-
-import java.io.File;
-import java.util.ArrayList;
-
-public class DataStorageItemsHolder implements Parcelable {
-	public final static String INTERNAL_STORAGE = "internal_storage";
-	public final static String EXTERNAL_STORAGE = "external_storage";
-	public final static String SHARED_STORAGE = "shared_storage";
-	public final static String MULTIUSER_STORAGE = "multiuser_storage";
-	public final static String MANUALLY_SPECIFIED = "manually_specified";
-
-	public final static String MAPS_MEMORY = "maps_memory_used";
-	public final static String TRACKS_MEMORY = "tracks_memory_used";
-	public final static String NOTES_MEMORY = "notes_memory_used";
-	public final static String TILES_MEMORY = "tiles_memory_used";
-	public final static String OTHER_MEMORY = "other_memory_used";
-
-	private ArrayList<DataStorageMenuItem> menuItems = new ArrayList<>();
-	private DataStorageMenuItem currentDataStorage;
-	private DataStorageMenuItem manuallySpecified;
-
-	private ArrayList<DataStorageMemoryItem> memoryItems = new ArrayList<>();
-	private DataStorageMemoryItem mapsMemory;
-	private DataStorageMemoryItem tracksMemory;
-	private DataStorageMemoryItem notesMemory;
-	private DataStorageMemoryItem tilesMemory;
-	private DataStorageMemoryItem otherMemory;
-
-	private int currentStorageType;
-	private String currentStoragePath;
-
-	private DataStorageItemsHolder(OsmandApplication app) {
-		prepareData(app);
-	}
-
-	public static DataStorageItemsHolder refreshInfo(OsmandApplication app) {
-		return new DataStorageItemsHolder(app);
-	}
-
-	private void prepareData(OsmandApplication app) {
-
-		if (app == null) {
-			return;
-		}
-
-		OsmandSettings settings = app.getSettings();
-
-		if (settings.getExternalStorageDirectoryTypeV19() >= 0) {
-			currentStorageType = settings.getExternalStorageDirectoryTypeV19();
-		} else {
-			ValueHolder<Integer> vh = new ValueHolder<Integer>();
-			if (vh.value != null && vh.value >= 0) {
-				currentStorageType = vh.value;
-			} else {
-				currentStorageType = 0;
-			}
-		}
-		currentStoragePath = settings.getExternalStorageDirectory().getAbsolutePath();
-
-		String path;
-		File dir;
-		int iconId;
-
-		if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
-
-			//internal storage
-			path = settings.getInternalAppPath().getAbsolutePath();
-			dir = new File(path);
-			iconId = R.drawable.ic_action_phone;
-
-			DataStorageMenuItem internalStorageItem = DataStorageMenuItem.builder()
-					.setKey(INTERNAL_STORAGE)
-					.setTitle(app.getString(R.string.storage_directory_internal_app))
-					.setDirectory(path)
-					.setDescription(app.getString(R.string.internal_app_storage_description))
-					.setType(OsmandSettings.EXTERNAL_STORAGE_TYPE_INTERNAL_FILE)
-					.setIconResId(iconId)
-					.createItem();
-			addItem(internalStorageItem);
-
-			//shared_storage
-			dir = settings.getDefaultInternalStorage();
-			path = dir.getAbsolutePath();
-			iconId = R.drawable.ic_action_phone;
-
-			DataStorageMenuItem sharedStorageItem = DataStorageMenuItem.builder()
-					.setKey(SHARED_STORAGE)
-					.setTitle(app.getString(R.string.storage_directory_shared))
-					.setDirectory(path)
-					.setType(OsmandSettings.EXTERNAL_STORAGE_TYPE_DEFAULT)
-					.setIconResId(iconId)
-					.createItem();
-			addItem(sharedStorageItem);
-
-			//external storage
-			File[] externals = app.getExternalFilesDirs(null);
-			if (externals != null) {
-				int i = 0;
-				for (File external : externals) {
-					if (external != null) {
-						++i;
-						dir = external;
-						path = dir.getAbsolutePath();
-						iconId = getIconForStorageType(dir);
-						DataStorageMenuItem externalStorageItem = DataStorageMenuItem.builder()
-								.setKey(EXTERNAL_STORAGE + i)
-								.setTitle(app.getString(R.string.storage_directory_external) + " " + i)
-								.setDirectory(path)
-								.setType(OsmandSettings.EXTERNAL_STORAGE_TYPE_EXTERNAL_FILE)
-								.setIconResId(iconId)
-								.createItem();
-						addItem(externalStorageItem);
-					}
-				}
-			}
-
-			//multi user storage
-			File[] obbDirs = app.getObbDirs();
-			if (obbDirs != null) {
-				int i = 0;
-				for (File obb : obbDirs) {
-					if (obb != null) {
-						++i;
-						dir = obb;
-						path = dir.getAbsolutePath();
-						iconId = getIconForStorageType(dir);
-						DataStorageMenuItem multiuserStorageItem = DataStorageMenuItem.builder()
-								.setKey(MULTIUSER_STORAGE + i)
-								.setTitle(app.getString(R.string.storage_directory_multiuser) + " " + i)
-								.setDirectory(path)
-								.setType(OsmandSettings.EXTERNAL_STORAGE_TYPE_OBB)
-								.setIconResId(iconId)
-								.createItem();
-						addItem(multiuserStorageItem);
-					}
-				}
-			}
-		}
-
-		//manually specified storage
-		manuallySpecified = DataStorageMenuItem.builder()
-				.setKey(MANUALLY_SPECIFIED)
-				.setTitle(app.getString(R.string.storage_directory_manual))
-				.setDirectory(currentStoragePath)
-				.setType(OsmandSettings.EXTERNAL_STORAGE_TYPE_SPECIFIED)
-				.setIconResId(R.drawable.ic_action_folder)
-				.createItem();
-		menuItems.add(manuallySpecified);
-
-		if (currentDataStorage == null) {
-			currentDataStorage = manuallySpecified;
-		}
-
-		initMemoryUsed(app);
-	}
-
-	private void initMemoryUsed(OsmandApplication app) {
-		mapsMemory = DataStorageMemoryItem.builder()
-				.setKey(MAPS_MEMORY)
-				.setExtensions(IndexConstants.BINARY_MAP_INDEX_EXT, IndexConstants.BINARY_MAP_INDEX_EXT_ZIP)
-				.setDirectories(
-						app.getAppPath(IndexConstants.MAPS_PATH).getAbsolutePath(),
-						app.getAppPath(IndexConstants.ROADS_INDEX_DIR).getAbsolutePath(),
-						app.getAppPath(IndexConstants.SRTM_INDEX_DIR).getAbsolutePath(),
-						app.getAppPath(IndexConstants.WIKI_INDEX_DIR).getAbsolutePath(),
-						app.getAppPath(IndexConstants.WIKIVOYAGE_INDEX_DIR).getAbsolutePath(),
-						app.getAppPath(IndexConstants.BACKUP_INDEX_DIR).getAbsolutePath())
-				.createItem();
-		memoryItems.add(mapsMemory);
-
-		tracksMemory = DataStorageMemoryItem.builder()
-				.setKey(TRACKS_MEMORY)
-//				.setExtensions(".gpx", ".gpx.bz2")
-				.setDirectories(app.getAppPath(IndexConstants.GPX_INDEX_DIR).getAbsolutePath())
-				.createItem();
-		memoryItems.add(tracksMemory);
-
-		notesMemory = DataStorageMemoryItem.builder()
-				.setKey(NOTES_MEMORY)
-//				.setExtensions("")
-				.setDirectories(app.getAppPath(IndexConstants.AV_INDEX_DIR).getAbsolutePath())
-				.createItem();
-		memoryItems.add(notesMemory);
-
-		tilesMemory = DataStorageMemoryItem.builder()
-				.setKey(TILES_MEMORY)
-//				.setExtensions("")
-				.setDirectories(app.getAppPath(IndexConstants.TILES_INDEX_DIR).getAbsolutePath())
-				.createItem();
-		memoryItems.add(tilesMemory);
-
-		otherMemory = DataStorageMemoryItem.builder()
-				.setKey(OTHER_MEMORY)
-				.createItem();
-		memoryItems.add(otherMemory);
-	}
-
-	public ArrayList<DataStorageMenuItem> getStorageItems() {
-		return menuItems;
-	}
-
-	private int getIconForStorageType(File dir) {
-		return R.drawable.ic_action_folder;
-	}
-
-	public DataStorageMenuItem getCurrentStorage() {
-		return currentDataStorage;
-	}
-
-	private void addItem(DataStorageMenuItem item) {
-		if (currentStorageType == item.getType() && currentStoragePath.equals(item.getDirectory())) {
-			currentDataStorage = item;
-		}
-		menuItems.add(item);
-	}
-
-	public DataStorageMenuItem getManuallySpecified() {
-		return manuallySpecified;
-	}
-
-	public DataStorageMenuItem getStorage(String key) {
-		if (menuItems != null && key != null) {
-			for (DataStorageMenuItem menuItem : menuItems) {
-				if (key.equals(menuItem.getKey())) {
-					return menuItem;
-				}
-			}
-		}
-		return null;
-	}
-
-	public int getCurrentType() {
-		return currentStorageType;
-	}
-
-	public String getCurrentPath() {
-		return currentStoragePath;
-	}
-
-	public ArrayList<DataStorageMemoryItem> getMemoryInfoItems() {
-		return memoryItems;
-	}
-
-	public RefreshMemoryUsedInfo calculateMemoryUsedInfo(UpdateMemoryInfoUIAdapter listener) {
-		File rootDir = new File(currentStoragePath);
-		RefreshMemoryUsedInfo task = new RefreshMemoryUsedInfo(listener, otherMemory, rootDir, tilesMemory.getDirectories());
-		task.execute(mapsMemory, tracksMemory, notesMemory);
-		return task;
-	}
-
-	public RefreshMemoryUsedInfo calculateTilesMemoryUsed(UpdateMemoryInfoUIAdapter listener) {
-		File rootDir = new File(tilesMemory.getDirectories()[0]);
-		RefreshMemoryUsedInfo task = new RefreshMemoryUsedInfo(listener, otherMemory, rootDir);
-		task.execute(tilesMemory);
-		return task;
-	}
-
-	public static class RefreshMemoryUsedInfo extends AsyncTask<DataStorageMemoryItem, Void, Void> {
-		private UpdateMemoryInfoUIAdapter listener;
-		private File rootDir;
-		private DataStorageMemoryItem otherMemory;
-		private String[] directoriesToAvoid;
-
-		public RefreshMemoryUsedInfo(UpdateMemoryInfoUIAdapter listener, DataStorageMemoryItem otherMemory, File rootDir, String... directoriesToAvoid) {
-			this.listener = listener;
-			this.otherMemory = otherMemory;
-			this.rootDir = rootDir;
-			this.directoriesToAvoid = directoriesToAvoid;
-		}
-
-		@Override
-		protected Void doInBackground(DataStorageMemoryItem... items) {
-			if (items.length == 1) {
-				DataStorageMemoryItem item = items[0];
-				item.addBytes(getDirectorySize(rootDir, item.getExtensions()));
-			} else {
-				calculateMultiTypes(items);
-			}
-			return null;
-		}
-
-		private void calculateMultiTypes(DataStorageMemoryItem[] items) {
-			File[] files = rootDir.listFiles();
-
-			for (File f : files) {
-				boolean matched = false;
-				if (f.isDirectory()) {
-					boolean avoid = false;
-					for (String directoryToAvoid : directoriesToAvoid) {
-						if (f.getAbsolutePath().equals(directoryToAvoid)) {
-							avoid = true;
-							break;
-						}
-					}
-					if (!avoid) {
-						for (DataStorageMemoryItem item : items) {
-							String[] directories = item.getDirectories();
-							if (directories != null) {
-								for (String directory : directories) {
-									if (f.getAbsolutePath().equals(directory)) {
-										item.addBytes(getDirectorySize(f, item.getExtensions()));
-										matched = true;
-										break;
-									}
-								}
-							}
-						}
-						if (!matched) {
-							otherMemory.addBytes(getDirectorySize(f, null));
-						}
-					}
-				} else if (f.isFile()) {
-					for (DataStorageMemoryItem item : items) {
-						String[] extensions = item.getExtensions();
-						if (extensions != null) {
-							for (String extension : extensions) {
-								if (f.getAbsolutePath().endsWith(extension)) {
-									item.addBytes(f.length());
-									matched = true;
-									break;
-								}
-							}
-						}
-					}
-					if (!matched) {
-						otherMemory.addBytes(f.length());
-					}
-					publishProgress();
-				}
-			}
-		}
-
-		private long getDirectorySize(File dir, String[] extensions) {
-			long bytes = 0;
-			if (dir.isDirectory()) {
-				File[] files = dir.listFiles();
-				for (File file : files) {
-					if (isCancelled()) {
-						break;
-					}
-					if (file.isDirectory()) {
-						bytes += getDirectorySize(file, extensions);
-					} else if (file.isFile()) {
-						//check file extension
-						boolean matched = false;
-						if (extensions != null) {
-							for (String extension : extensions) {
-								if (file.getName().endsWith(extension)) {
-									matched = true;
-									break;
-								}
-							}
-						} else {
-							matched = true;
-						}
-						if (matched) {
-							bytes += file.length();
-						} else {
-							otherMemory.addBytes(file.length());
-						}
-						publishProgress();
-					}
-				}
-			}
-			return bytes;
-		}
-
-		@Override
-		protected void onProgressUpdate(Void... values) {
-			super.onProgressUpdate(values);
-			if (listener != null) {
-				listener.onMemoryInfoUpdate();
-			}
-		}
-
-		@Override
-		protected void onPostExecute(Void aVoid) {
-			super.onPostExecute(aVoid);
-			if (listener != null) {
-				listener.onMemoryInfoUpdate();
-			}
-		}
-	}
-
-	public interface UpdateMemoryInfoUIAdapter {
-
-		void onMemoryInfoUpdate();
-
-	}
-
-	@Override
-	public int describeContents() {
-		return 0;
-	}
-
-	private DataStorageItemsHolder(Parcel in) {
-		menuItems = in.readArrayList(DataStorageMenuItem.class.getClassLoader());
-		currentDataStorage = in.readParcelable(DataStorageMenuItem.class.getClassLoader());
-		memoryItems = in.readArrayList(DataStorageMemoryItem.class.getClassLoader());
-		currentStorageType = in.readInt();
-		currentStoragePath = in.readString();
-	}
-
-	@Override
-	public void writeToParcel(Parcel dest, int flags) {
-		dest.writeArray(menuItems.toArray());
-		dest.writeParcelable(currentDataStorage, flags);
-		dest.writeArray(memoryItems.toArray());
-		dest.writeInt(currentStorageType);
-		dest.writeString(currentStoragePath);
-	}
-
-	public static final Parcelable.Creator<DataStorageItemsHolder> CREATOR = new Parcelable.Creator<DataStorageItemsHolder>() {
-
-		@Override
-		public DataStorageItemsHolder createFromParcel(Parcel source) {
-			return new DataStorageItemsHolder(source);
-		}
-
-		@Override
-		public DataStorageItemsHolder[] newArray(int size) {
-			return new DataStorageItemsHolder[size];
-		}
-	};
-}
\ No newline at end of file
diff --git a/OsmAnd/src/net/osmand/plus/settings/DataStorageMemoryItem.java b/OsmAnd/src/net/osmand/plus/settings/DataStorageMemoryItem.java
index a13d87f..3fcf9b3 100644
--- a/OsmAnd/src/net/osmand/plus/settings/DataStorageMemoryItem.java
+++ b/OsmAnd/src/net/osmand/plus/settings/DataStorageMemoryItem.java
@@ -1,28 +1,23 @@
 package net.osmand.plus.settings;
 
-import android.os.Parcel;
-import android.os.Parcelable;
-
-public class DataStorageMemoryItem implements Parcelable {
+public class DataStorageMemoryItem {
+	public final static int EXTENSIONS = 0;
+	public final static int PREFIX = 1;
+	
 	private String key;
 	private String[] extensions;
-	private String[] directories;
+	private String[] prefixes;
+	private Directory[] directories;
 	private long usedMemoryBytes;
 
-	private DataStorageMemoryItem(String key, String[] extensions, long usedMemoryBytes, String[] directories) {
+	private DataStorageMemoryItem(String key, String[] extensions, String[] prefixes, long usedMemoryBytes, Directory[] directories) {
 		this.key = key;
 		this.extensions = extensions;
+		this.prefixes = prefixes;
 		this.usedMemoryBytes = usedMemoryBytes;
 		this.directories = directories;
 	}
 
-	private DataStorageMemoryItem(Parcel in) {
-		key = in.readString();
-		in.readStringArray(extensions);
-		in.readStringArray(directories);
-		usedMemoryBytes = in.readLong();
-	}
-
 	public String getKey() {
 		return key;
 	}
@@ -35,10 +30,6 @@
 		this.key = key;
 	}
 
-	public void setUsedMemoryBytes(long usedMemoryBytes) {
-		this.usedMemoryBytes = usedMemoryBytes;
-	}
-	
 	public static DataStorageMemoryItemBuilder builder() {
 		return new DataStorageMemoryItemBuilder();
 	}
@@ -47,48 +38,23 @@
 		return extensions;
 	}
 
-	public void setExtensions(String[] extensions) {
-		this.extensions = extensions;
+	public String[] getPrefixes() {
+		return prefixes;
 	}
 
-	public String[] getDirectories() {
+	public Directory[] getDirectories() {
 		return directories;
 	}
 
-	public void setDirectories(String[] directories) {
-		this.directories = directories;
+	public void addBytes(long bytes) {
+		this.usedMemoryBytes += bytes;
 	}
 
-	@Override
-	public int describeContents() {
-		return 0;
-	}
-
-	@Override
-	public void writeToParcel(Parcel dest, int flags) {
-		dest.writeString(key);
-		dest.writeStringArray(extensions);
-		dest.writeStringArray(directories);
-		dest.writeLong(usedMemoryBytes);
-	}
-
-	public static final Parcelable.Creator<DataStorageMemoryItem> CREATOR = new Parcelable.Creator<DataStorageMemoryItem>() {
-
-		@Override
-		public DataStorageMemoryItem createFromParcel(Parcel source) {
-			return new DataStorageMemoryItem(source);
-		}
-
-		@Override
-		public DataStorageMemoryItem[] newArray(int size) {
-			return new DataStorageMemoryItem[size];
-		}
-	};
-
 	public static class DataStorageMemoryItemBuilder {
 		private String key;
 		private String[] extensions;
-		private String[] directories;
+		private String[] prefixes;
+		private Directory[] directories;
 		private long usedMemoryBytes;
 
 		public DataStorageMemoryItemBuilder setKey(String key) {
@@ -100,8 +66,13 @@
 			this.extensions = extensions;
 			return this;
 		}
+
+		public DataStorageMemoryItemBuilder setPrefixes(String ... prefixes) {
+			this.prefixes = prefixes;
+			return this;
+		}
 		
-		public DataStorageMemoryItemBuilder setDirectories(String ... directories) {
+		public DataStorageMemoryItemBuilder setDirectories(Directory ... directories) {
 			this.directories = directories;
 			return this;
 		}
@@ -112,11 +83,37 @@
 		}
 		
 		public DataStorageMemoryItem createItem() {
-			return new DataStorageMemoryItem(key, extensions, usedMemoryBytes, directories);
+			return new DataStorageMemoryItem(key, extensions, prefixes, usedMemoryBytes, directories);
 		}
 	}
 	
-	public void addBytes(long bytes) {
-		this.usedMemoryBytes += bytes;
+	public static class Directory {
+		private String absolutePath;
+		private boolean goDeeper;
+		private int checkingType;
+		private boolean skipOther;
+
+		public Directory(String absolutePath, boolean goDeeper, int checkingType, boolean skipOther) {
+			this.absolutePath = absolutePath;
+			this.goDeeper = goDeeper;
+			this.checkingType = checkingType;
+			this.skipOther = skipOther;
+		}
+
+		public String getAbsolutePath() {
+			return absolutePath;
+		}
+
+		public boolean isGoDeeper() {
+			return goDeeper;
+		}
+
+		public int getCheckingType() {
+			return checkingType;
+		}
+
+		public boolean isSkipOther() {
+			return skipOther;
+		}
 	}
 }
diff --git a/OsmAnd/src/net/osmand/plus/settings/GeneralProfileSettingsFragment.java b/OsmAnd/src/net/osmand/plus/settings/GeneralProfileSettingsFragment.java
index ba5299f..fe4495f 100644
--- a/OsmAnd/src/net/osmand/plus/settings/GeneralProfileSettingsFragment.java
+++ b/OsmAnd/src/net/osmand/plus/settings/GeneralProfileSettingsFragment.java
@@ -8,6 +8,7 @@
 import android.support.v7.app.AlertDialog;
 import android.support.v7.preference.Preference;
 import android.support.v7.preference.PreferenceViewHolder;
+import android.support.v7.preference.SwitchPreferenceCompat;
 import android.support.v7.preference.TwoStatePreference;
 import android.support.v7.widget.AppCompatCheckedTextView;
 import android.support.v7.widget.SwitchCompat;
@@ -21,7 +22,9 @@
 
 import net.osmand.AndroidUtils;
 import net.osmand.data.PointDescription;
+import net.osmand.plus.ApplicationMode;
 import net.osmand.plus.OsmandSettings;
+import net.osmand.plus.OsmandSettings.CommonPreference;
 import net.osmand.plus.R;
 import net.osmand.plus.base.MapViewTrackingUtilities;
 import net.osmand.plus.helpers.FontCache;
@@ -42,6 +45,7 @@
 	protected void setupPreferences() {
 		setupAppThemePref();
 		setupRotateMapPref();
+		setupCenterPositionOnMapPref();
 		setupMapScreenOrientationPref();
 
 		setupDrivingRegionPref();
@@ -72,7 +76,7 @@
 
 		OsmandSettings.OsmandPreference osmandPreference = settings.getPreference(prefId);
 		TextView summaryView = (TextView) holder.findViewById(android.R.id.summary);
-		if (osmandPreference != null && summaryView != null) {
+		if (osmandPreference instanceof CommonPreference && summaryView != null) {
 			CharSequence summary = null;
 
 			if (preference instanceof TwoStatePreference) {
@@ -82,8 +86,11 @@
 			if (TextUtils.isEmpty(summary)) {
 				summary = preference.getSummary();
 			}
-			if (!osmandPreference.isSetForMode(getSelectedAppMode())) {
-				String baseString = getString(R.string.shared_string_by_default) + ": %s";
+			ApplicationMode selectedMode = getSelectedAppMode();
+			CommonPreference commonPref = (CommonPreference) osmandPreference;
+			if (!commonPref.hasDefaultValueForMode(selectedMode)
+					&& (!commonPref.isSetForMode(selectedMode) || getSelectedAppMode().equals(ApplicationMode.DEFAULT))) {
+				String baseString = getString(R.string.shared_preference) + ": %s";
 				summary = AndroidUtils.getStyledString(baseString, summary, new CustomTypefaceSpan(FontCache.getRobotoMedium(app)), null);
 			}
 			summaryView.setText(summary);
@@ -136,6 +143,16 @@
 		}
 	}
 
+	private void setupCenterPositionOnMapPref() {
+		SwitchPreferenceCompat centerPositionOnMap = (SwitchPreferenceCompat) findPreference(settings.CENTER_POSITION_ON_MAP.getId());
+		centerPositionOnMap.setIcon(getCenterPositionOnMapIcon());
+	}
+
+
+	private Drawable getCenterPositionOnMapIcon() {
+		return getContentIcon(settings.CENTER_POSITION_ON_MAP.get() ? R.drawable.ic_action_display_position_center : R.drawable.ic_action_display_position_bottom);
+	}
+
 	private void setupMapScreenOrientationPref() {
 		final ListPreferenceEx mapScreenOrientation = (ListPreferenceEx) findPreference(settings.MAP_SCREEN_ORIENTATION.getId());
 		mapScreenOrientation.setEntries(new String[] {getString(R.string.map_orientation_portrait), getString(R.string.map_orientation_landscape), getString(R.string.map_orientation_default)});
@@ -336,11 +353,13 @@
 
 	@Override
 	public boolean onPreferenceChange(Preference preference, Object newValue) {
-		OsmandSettings.OsmandPreference pref = settings.getPreference(preference.getKey());
-		if (pref != null && !pref.isSetForMode(getSelectedAppMode())) {
+		String prefId = preference.getKey();
+
+		OsmandSettings.OsmandPreference pref = settings.getPreference(prefId);
+		if (pref instanceof CommonPreference && !((CommonPreference) pref).hasDefaultValueForMode(getSelectedAppMode())) {
 			FragmentManager fragmentManager = getFragmentManager();
 			if (fragmentManager != null) {
-				ChangeGeneralProfilesPrefBottomSheet.showInstance(fragmentManager, preference.getKey(), newValue, this, false);
+				ChangeGeneralProfilesPrefBottomSheet.showInstance(fragmentManager, prefId, newValue, this, false);
 			}
 			return false;
 		}
@@ -358,6 +377,8 @@
 				preference.setIcon(getRotateMapIcon());
 			} else if (settings.MAP_SCREEN_ORIENTATION.getId().equals(prefId)) {
 				preference.setIcon(getMapScreenOrientationIcon());
+			} else if (settings.CENTER_POSITION_ON_MAP.getId().equals(prefId)) {
+				preference.setIcon(getCenterPositionOnMapIcon());
 			}
 		}
 	}
diff --git a/OsmAnd/src/net/osmand/plus/settings/GlobalSettingsFragment.java b/OsmAnd/src/net/osmand/plus/settings/GlobalSettingsFragment.java
index d39263f..1eb7023 100644
--- a/OsmAnd/src/net/osmand/plus/settings/GlobalSettingsFragment.java
+++ b/OsmAnd/src/net/osmand/plus/settings/GlobalSettingsFragment.java
@@ -7,7 +7,6 @@
 import android.support.v7.preference.SwitchPreferenceCompat;
 import android.util.Pair;
 
-import net.osmand.AndroidUtils;
 import net.osmand.plus.ApplicationMode;
 import net.osmand.plus.OsmandApplication;
 import net.osmand.plus.OsmandSettings;
@@ -17,9 +16,6 @@
 import net.osmand.plus.settings.preferences.ListPreferenceEx;
 import net.osmand.plus.settings.preferences.SwitchPreferenceEx;
 
-import java.io.File;
-import java.text.DecimalFormat;
-
 
 public class GlobalSettingsFragment extends BaseSettingsFragment implements SendAnalyticsBottomSheetDialogFragment.OnSendAnalyticsPrefsUpdate, OnPreferenceChanged {
 
@@ -141,14 +137,25 @@
 		Preference externalStorageDir = (Preference) findPreference(OsmandSettings.EXTERNAL_STORAGE_DIR);
 		externalStorageDir.setIcon(getContentIcon(R.drawable.ic_action_folder));
 
-		DataStorageItemsHolder holder = DataStorageItemsHolder.refreshInfo(app);
+		DataStorageHelper holder = new DataStorageHelper(app);
 		DataStorageMenuItem currentStorage = holder.getCurrentStorage();
-		File dir = new File(currentStorage.getDirectory());
-		DecimalFormat formatter = new DecimalFormat("#.##");
-		String summary = String.format(getString(R.string.data_storage_preference_summary),
-						currentStorage.getTitle(),
-						formatter.format(AndroidUtils.getUsedSpaceGb(dir)));
-		externalStorageDir.setSummary(summary);
+		long totalUsed = app.getSettings().OSMAND_USAGE_SPACE.get();
+		if (totalUsed > 0) {
+			String[] usedMemoryFormats = new String[] {
+					getString(R.string.shared_string_memory_used_kb_desc),
+					getString(R.string.shared_string_memory_used_mb_desc),
+					getString(R.string.shared_string_memory_used_gb_desc),
+					getString(R.string.shared_string_memory_used_tb_desc)
+			};
+			String sTotalUsed = DataStorageHelper.getFormattedMemoryInfo(totalUsed, usedMemoryFormats);
+			String summary = String.format(getString(R.string.data_storage_preference_summary),
+					currentStorage.getTitle(),
+					sTotalUsed);
+			summary = summary.replaceAll(" • ", "  •  ");
+			externalStorageDir.setSummary(summary);
+		} else {
+			externalStorageDir.setSummary(currentStorage.getTitle());
+		}
 	}
 
 	private void setupSendAnonymousDataPref() {
diff --git a/OsmAnd/src/net/osmand/plus/settings/RouteParametersFragment.java b/OsmAnd/src/net/osmand/plus/settings/RouteParametersFragment.java
index c4ab399..51e5a0b 100644
--- a/OsmAnd/src/net/osmand/plus/settings/RouteParametersFragment.java
+++ b/OsmAnd/src/net/osmand/plus/settings/RouteParametersFragment.java
@@ -145,43 +145,15 @@
 					screen.addPreference(drivingStyleRouting);
 				}
 				if (avoidParameters.size() > 0) {
-					MultiSelectBooleanPreference avoidRouting = new MultiSelectBooleanPreference(app);
-					avoidRouting.setKey(AVOID_ROUTING_PARAMETER_PREFIX);
-					avoidRouting.setTitle(R.string.avoid_in_routing_title);
-					avoidRouting.setSummary(R.string.avoid_in_routing_descr_);
-					avoidRouting.setDescription(R.string.avoid_in_routing_descr_);
-					avoidRouting.setLayoutResource(R.layout.preference_with_descr);
-					avoidRouting.setIcon(getRoutingPrefIcon(AVOID_ROUTING_PARAMETER_PREFIX));
-
-					String[] entries = new String[avoidParameters.size()];
-					String[] prefsIds = new String[avoidParameters.size()];
-					Set<String> enabledPrefsIds = new HashSet<>();
-
-					for (int i = 0; i < avoidParameters.size(); i++) {
-						GeneralRouter.RoutingParameter p = avoidParameters.get(i);
-						BooleanPreference booleanRoutingPref = (BooleanPreference) settings.getCustomRoutingBooleanProperty(p.getId(), p.getDefaultBoolean());
-
-						entries[i] = SettingsBaseActivity.getRoutingStringPropertyName(app, p.getId(), p.getName());
-						prefsIds[i] = booleanRoutingPref.getId();
-
-						if (booleanRoutingPref.get()) {
-							enabledPrefsIds.add(booleanRoutingPref.getId());
-						}
-					}
-
-					avoidRouting.setEntries(entries);
-					avoidRouting.setEntryValues(prefsIds);
-					avoidRouting.setValues(enabledPrefsIds);
-
+					String title = getString(R.string.avoid_in_routing_title);
+					String descr = getString(R.string.avoid_in_routing_descr_);
+					MultiSelectBooleanPreference avoidRouting = createRoutingBooleanMultiSelectPref(AVOID_ROUTING_PARAMETER_PREFIX, title, descr, avoidParameters);
 					screen.addPreference(avoidRouting);
 				}
 				if (preferParameters.size() > 0) {
-					Preference preferRouting = new Preference(app);
-					preferRouting.setKey(PREFER_ROUTING_PARAMETER_PREFIX);
-					preferRouting.setTitle(R.string.prefer_in_routing_title);
-					preferRouting.setSummary(R.string.prefer_in_routing_descr);
-					preferRouting.setLayoutResource(R.layout.preference_with_descr);
-					preferRouting.setIconSpaceReserved(true);
+					String title = getString(R.string.prefer_in_routing_title);
+					String descr = getString(R.string.prefer_in_routing_descr);
+					MultiSelectBooleanPreference preferRouting = createRoutingBooleanMultiSelectPref(PREFER_ROUTING_PARAMETER_PREFIX, title, descr, preferParameters);
 					screen.addPreference(preferRouting);
 				}
 				if (reliefFactorParameters.size() > 0) {
@@ -269,6 +241,38 @@
 		return routingListPref;
 	}
 
+	private MultiSelectBooleanPreference createRoutingBooleanMultiSelectPref(String groupKey, String title, String descr, List<GeneralRouter.RoutingParameter> routingParameters) {
+		MultiSelectBooleanPreference multiSelectPref = new MultiSelectBooleanPreference(app);
+		multiSelectPref.setKey(groupKey);
+		multiSelectPref.setTitle(title);
+		multiSelectPref.setSummary(descr);
+		multiSelectPref.setDescription(descr);
+		multiSelectPref.setLayoutResource(R.layout.preference_with_descr);
+		multiSelectPref.setIcon(getRoutingPrefIcon(groupKey));
+
+		String[] entries = new String[routingParameters.size()];
+		String[] prefsIds = new String[routingParameters.size()];
+		Set<String> enabledPrefsIds = new HashSet<>();
+
+		for (int i = 0; i < routingParameters.size(); i++) {
+			GeneralRouter.RoutingParameter p = routingParameters.get(i);
+			BooleanPreference booleanRoutingPref = (BooleanPreference) settings.getCustomRoutingBooleanProperty(p.getId(), p.getDefaultBoolean());
+
+			entries[i] = SettingsBaseActivity.getRoutingStringPropertyName(app, p.getId(), p.getName());
+			prefsIds[i] = booleanRoutingPref.getId();
+
+			if (booleanRoutingPref.get()) {
+				enabledPrefsIds.add(booleanRoutingPref.getId());
+			}
+		}
+
+		multiSelectPref.setEntries(entries);
+		multiSelectPref.setEntryValues(prefsIds);
+		multiSelectPref.setValues(enabledPrefsIds);
+
+		return multiSelectPref;
+	}
+
 	private void clearParameters() {
 		avoidParameters.clear();
 		preferParameters.clear();
diff --git a/OsmAnd/src/net/osmand/plus/settings/bottomsheets/ChangeDataStorageBottomSheet.java b/OsmAnd/src/net/osmand/plus/settings/bottomsheets/ChangeDataStorageBottomSheet.java
index 27016b7..6df896b 100644
--- a/OsmAnd/src/net/osmand/plus/settings/bottomsheets/ChangeDataStorageBottomSheet.java
+++ b/OsmAnd/src/net/osmand/plus/settings/bottomsheets/ChangeDataStorageBottomSheet.java
@@ -24,7 +24,7 @@
 
 import java.io.File;
 
-import static net.osmand.plus.settings.DataStorageItemsHolder.MANUALLY_SPECIFIED;
+import static net.osmand.plus.settings.DataStorageHelper.MANUALLY_SPECIFIED;
 
 public class ChangeDataStorageBottomSheet extends BasePreferenceBottomSheet {
 
diff --git a/OsmAnd/src/net/osmand/plus/settings/bottomsheets/ChangeGeneralProfilesPrefBottomSheet.java b/OsmAnd/src/net/osmand/plus/settings/bottomsheets/ChangeGeneralProfilesPrefBottomSheet.java
index a665730..580fd02 100644
--- a/OsmAnd/src/net/osmand/plus/settings/bottomsheets/ChangeGeneralProfilesPrefBottomSheet.java
+++ b/OsmAnd/src/net/osmand/plus/settings/bottomsheets/ChangeGeneralProfilesPrefBottomSheet.java
@@ -1,18 +1,14 @@
 package net.osmand.plus.settings.bottomsheets;
 
-import android.graphics.Typeface;
 import android.os.Bundle;
 import android.support.annotation.NonNull;
 import android.support.v4.app.Fragment;
 import android.support.v4.app.FragmentManager;
 import android.view.View;
 
-import net.osmand.AndroidUtils;
 import net.osmand.PlatformUtil;
 import net.osmand.plus.ApplicationMode;
 import net.osmand.plus.OsmandApplication;
-import net.osmand.plus.OsmandSettings.CommonPreference;
-import net.osmand.plus.OsmandSettings.OsmandPreference;
 import net.osmand.plus.R;
 import net.osmand.plus.base.bottomsheetmenu.BaseBottomSheetItem;
 import net.osmand.plus.base.bottomsheetmenu.SimpleBottomSheetItem;
@@ -22,10 +18,6 @@
 
 import org.apache.commons.logging.Log;
 
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
 public class ChangeGeneralProfilesPrefBottomSheet extends BasePreferenceBottomSheet {
 
 	public static final String TAG = ChangeGeneralProfilesPrefBottomSheet.class.getSimpleName();
@@ -41,37 +33,10 @@
 		if (app == null || args == null || newValue == null || !args.containsKey(PREFERENCE_ID)) {
 			return;
 		}
-
 		final String prefId = args.getString(PREFERENCE_ID);
-		CommonPreference pref = getPreference(prefId);
-		OsmandPreference osmandPref = app.getSettings().getPreference(prefId);
-		if (pref == null || osmandPref == null) {
-			return;
-		}
 
 		items.add(new TitleItem(getString(R.string.change_default_settings)));
-
-		StringBuilder builder = new StringBuilder();
-		final List<ApplicationMode> values = ApplicationMode.values(app);
-		List<ApplicationMode> appModesDefaultValue = new ArrayList<>();
-
-		for (int i = 0; i < values.size(); i++) {
-			ApplicationMode mode = values.get(i);
-			if (!osmandPref.isSetForMode(mode)) {
-				appModesDefaultValue.add(mode);
-			}
-		}
-
-		Iterator<ApplicationMode> iterator = appModesDefaultValue.iterator();
-		while (iterator.hasNext()) {
-			builder.append(iterator.next().toHumanString(app));
-			builder.append(iterator.hasNext() ? ", " : '.');
-		}
-
-		if (builder.length() > 0) {
-			CharSequence description = AndroidUtils.getStyledString(app.getString(R.string.pref_selected_by_default_for_profiles), builder.toString(), Typeface.BOLD);
-			items.add(new LongDescriptionItem(description));
-		}
+		items.add(new LongDescriptionItem(getString(R.string.apply_preference_to_all_profiles)));
 
 		BaseBottomSheetItem applyToAllProfiles = new SimpleBottomSheetItem.Builder()
 				.setTitle(getString(R.string.apply_to_all_profiles))
@@ -80,13 +45,8 @@
 				.setOnClickListener(new View.OnClickListener() {
 					@Override
 					public void onClick(View v) {
-						for (ApplicationMode mode : values) {
-							app.getSettings().setPreference(prefId, newValue, mode);
-						}
-						BaseSettingsFragment target = (BaseSettingsFragment) getTargetFragment();
-						if (target != null) {
-							target.updateAllSettings();
-						}
+						app.getSettings().setSharedGeneralPreference(prefId, newValue);
+						updateTargetSettings();
 						dismiss();
 					}
 				})
@@ -103,10 +63,7 @@
 					@Override
 					public void onClick(View v) {
 						app.getSettings().setPreference(prefId, newValue);
-						BaseSettingsFragment target = (BaseSettingsFragment) getTargetFragment();
-						if (target != null) {
-							target.updateAllSettings();
-						}
+						updateTargetSettings();
 						dismiss();
 					}
 				})
@@ -120,6 +77,7 @@
 				.setOnClickListener(new View.OnClickListener() {
 					@Override
 					public void onClick(View v) {
+						updateTargetSettings();
 						dismiss();
 					}
 				})
@@ -132,16 +90,11 @@
 		return true;
 	}
 
-	private CommonPreference getPreference(String prefId) {
-		OsmandApplication app = getMyApplication();
-		if (app != null) {
-			OsmandPreference pref = app.getSettings().getPreference(prefId);
-			if (pref instanceof CommonPreference) {
-				return (CommonPreference) pref;
-			}
+	private void updateTargetSettings() {
+		BaseSettingsFragment target = (BaseSettingsFragment) getTargetFragment();
+		if (target != null) {
+			target.updateAllSettings();
 		}
-
-		return null;
 	}
 
 	public static void showInstance(@NonNull FragmentManager fm, String prefId, Object newValue, Fragment target, boolean usedOnMap) {
diff --git a/OsmAnd/src/net/osmand/plus/settings/bottomsheets/SelectFolderBottomSheet.java b/OsmAnd/src/net/osmand/plus/settings/bottomsheets/SelectFolderBottomSheet.java
index c9efa0d..a64724f 100644
--- a/OsmAnd/src/net/osmand/plus/settings/bottomsheets/SelectFolderBottomSheet.java
+++ b/OsmAnd/src/net/osmand/plus/settings/bottomsheets/SelectFolderBottomSheet.java
@@ -155,7 +155,7 @@
 	protected void onRightBottomButtonClick() {
 		Fragment fragment = getTargetFragment();
 		if (fragment instanceof BaseSettingsFragment) {
-			String newPath = editText.getText().toString();
+			String newPath = editText.getText().toString().trim();
 			if (!newPath.equals("")) {
 				boolean pathChanged = !newPath.equals(currentPath);
 				Bundle bundle = new Bundle();
diff --git a/OsmAnd/src/net/osmand/plus/views/MapControlsLayer.java b/OsmAnd/src/net/osmand/plus/views/MapControlsLayer.java
index 2b97229..5fc9863 100644
--- a/OsmAnd/src/net/osmand/plus/views/MapControlsLayer.java
+++ b/OsmAnd/src/net/osmand/plus/views/MapControlsLayer.java
@@ -1278,21 +1278,25 @@
 	}
 
 	public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
-		if (grantResults.length > 0) {
-			if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
-				switch (requestCode) {
-					case REQUEST_LOCATION_FOR_NAVIGATION_PERMISSION:
-						onNavigationClick();
-						break;
-					case REQUEST_LOCATION_FOR_NAVIGATION_FAB_PERMISSION:
-						navigateButton();
-						break;
-					case REQUEST_LOCATION_FOR_ADD_DESTINATION_PERMISSION:
-						addDestination(requestedLatLon);
-						break;
+		if ((requestCode == REQUEST_LOCATION_FOR_NAVIGATION_PERMISSION
+				|| requestCode == REQUEST_LOCATION_FOR_NAVIGATION_FAB_PERMISSION
+				|| requestCode == REQUEST_LOCATION_FOR_ADD_DESTINATION_PERMISSION)) {
+			if (grantResults.length > 0) {
+				if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
+					switch (requestCode) {
+						case REQUEST_LOCATION_FOR_NAVIGATION_PERMISSION:
+							onNavigationClick();
+							break;
+						case REQUEST_LOCATION_FOR_NAVIGATION_FAB_PERMISSION:
+							navigateButton();
+							break;
+						case REQUEST_LOCATION_FOR_ADD_DESTINATION_PERMISSION:
+							addDestination(requestedLatLon);
+							break;
+					}
+				} else if (grantResults[0] == PackageManager.PERMISSION_DENIED) {
+					app.showToastMessage(R.string.ask_for_location_permission);
 				}
-			} else if (grantResults[0] == PackageManager.PERMISSION_DENIED) {
-				app.showToastMessage(R.string.ask_for_location_permission);
 			}
 		}
 	}
diff --git a/OsmAnd/src/net/osmand/plus/views/POIMapLayer.java b/OsmAnd/src/net/osmand/plus/views/POIMapLayer.java
index edc4d8c..9f87488 100644
--- a/OsmAnd/src/net/osmand/plus/views/POIMapLayer.java
+++ b/OsmAnd/src/net/osmand/plus/views/POIMapLayer.java
@@ -38,8 +38,8 @@
 import net.osmand.plus.activities.MapActivity;
 import net.osmand.plus.poi.PoiUIFilter;
 import net.osmand.plus.render.RenderingIcons;
-import net.osmand.plus.routing.RoutingHelper;
 import net.osmand.plus.routing.IRouteInformationListener;
+import net.osmand.plus.routing.RoutingHelper;
 import net.osmand.plus.views.MapTextLayer.MapTextProvider;
 import net.osmand.util.Algorithms;
 
@@ -185,7 +185,6 @@
 		mapTextLayer = view.getLayerByClass(MapTextLayer.class);
 	}
 
-
 	public int getRadiusPoi(RotatedTileBox tb) {
 		int r;
 		final double zoom = tb.getZoom();
@@ -200,6 +199,7 @@
 		} else {
 			r = 18;
 		}
+
 		return (int) (r * view.getScaleCoefficient());
 	}
 
@@ -405,8 +405,13 @@
 	}
 
 	@Override
-	public int getTextShift(Amenity o, RotatedTileBox rb) {
-		return getRadiusPoi(rb);
+	public int getTextShift(Amenity amenity, RotatedTileBox rb) {
+		int radiusPoi = getRadiusPoi(rb);
+		if (isPresentInFullObjects(amenity.getLocation())) {
+			radiusPoi += poiBackground.getHeight() / 2 - poiBackgroundSmall.getHeight() / 2;
+		}
+
+		return radiusPoi;
 	}
 
 	@Override
diff --git a/OsmAnd/src/net/osmand/plus/views/mapwidgets/MapWidgetRegistry.java b/OsmAnd/src/net/osmand/plus/views/mapwidgets/MapWidgetRegistry.java
index 00bc503..053773c 100644
--- a/OsmAnd/src/net/osmand/plus/views/mapwidgets/MapWidgetRegistry.java
+++ b/OsmAnd/src/net/osmand/plus/views/mapwidgets/MapWidgetRegistry.java
@@ -334,7 +334,6 @@
 	private void resetDefaultAppearance(ApplicationMode appMode) {
 		settings.TRANSPARENT_MAP_THEME.resetToDefault();
 		settings.SHOW_STREET_NAME.resetToDefault();
-		settings.CENTER_POSITION_ON_MAP.resetToDefault();
 		settings.MAP_MARKERS_MODE.resetToDefault();
 	}
 
@@ -365,7 +364,6 @@
 					}
 				}).setLayout(R.layout.list_item_text_button).createItem());
 		addControlId(map, cm, R.string.map_widget_transparent, settings.TRANSPARENT_MAP_THEME);
-		addControlId(map, cm, R.string.always_center_position_on_map, settings.CENTER_POSITION_ON_MAP);
 		addControlId(map, cm, R.string.show_lanes, settings.SHOW_LANES);
 	}
 
diff --git a/OsmAnd/src/net/osmand/plus/views/mapwidgets/RouteInfoWidgetsFactory.java b/OsmAnd/src/net/osmand/plus/views/mapwidgets/RouteInfoWidgetsFactory.java
index 14f7822..21615c5 100644
--- a/OsmAnd/src/net/osmand/plus/views/mapwidgets/RouteInfoWidgetsFactory.java
+++ b/OsmAnd/src/net/osmand/plus/views/mapwidgets/RouteInfoWidgetsFactory.java
@@ -1258,8 +1258,7 @@
 					&& showRoutingAlarms && (trafficWarnings || cams)) {
 				AlarmInfo alarm;
 				if(rh.isFollowingMode() && !rh.isDeviatedFromRoute() && rh.getCurrentGPXRoute() == null) {
-					alarm = wh.getMostImportantAlarm(settings.METRIC_SYSTEM.get(),
-							settings.SPEED_SYSTEM.get(), cams);
+					alarm = wh.getMostImportantAlarm(settings.SPEED_SYSTEM.get(), cams);
 				} else {
 					RouteDataObject ro = locationProvider.getLastKnownRouteSegment();
 					Location loc = locationProvider.getLastKnownLocation();
diff --git a/OsmAnd/src/net/osmand/plus/widgets/tools/ClickableSpanTouchListener.java b/OsmAnd/src/net/osmand/plus/widgets/tools/ClickableSpanTouchListener.java
new file mode 100644
index 0000000..5abb6e0
--- /dev/null
+++ b/OsmAnd/src/net/osmand/plus/widgets/tools/ClickableSpanTouchListener.java
@@ -0,0 +1,52 @@
+package net.osmand.plus.widgets.tools;
+
+import android.text.Layout;
+import android.text.Selection;
+import android.text.Spannable;
+import android.text.SpannableString;
+import android.text.style.ClickableSpan;
+import android.view.MotionEvent;
+import android.view.View;
+import android.widget.TextView;
+
+public class ClickableSpanTouchListener implements View.OnTouchListener {
+
+	@Override
+	public boolean onTouch(View v, MotionEvent event) {
+		int action = event.getAction();
+
+		if (action == MotionEvent.ACTION_UP || action == MotionEvent.ACTION_DOWN) {
+			TextView widget = (TextView) v;
+
+			int x = (int) event.getX();
+			int y = (int) event.getY();
+
+			x -= widget.getTotalPaddingLeft();
+			y -= widget.getTotalPaddingTop();
+
+			x += widget.getScrollX();
+			y += widget.getScrollY();
+
+			Layout layout = widget.getLayout();
+			int line = layout.getLineForVertical(y);
+			int off = layout.getOffsetForHorizontal(line, x);
+
+			Spannable spannable = new SpannableString(widget.getText());
+			ClickableSpan[] links = spannable.getSpans(off, off, ClickableSpan.class);
+
+			if (links.length != 0) {
+				if (action == MotionEvent.ACTION_UP) {
+					links[0].onClick(widget);
+				} else {
+					Selection.setSelection(spannable, spannable.getSpanStart(links[0]), spannable.getSpanEnd(links[0]));
+				}
+				return true;
+			} else {
+				Selection.removeSelection(spannable);
+			}
+		}
+
+		return false;
+	}
+
+}
\ No newline at end of file
diff --git a/OsmAnd/src/net/osmand/plus/wikivoyage/menu/WikivoyageWptPtMenuBuilder.java b/OsmAnd/src/net/osmand/plus/wikivoyage/menu/WikivoyageWptPtMenuBuilder.java
index fc5294e..855492b 100644
--- a/OsmAnd/src/net/osmand/plus/wikivoyage/menu/WikivoyageWptPtMenuBuilder.java
+++ b/OsmAnd/src/net/osmand/plus/wikivoyage/menu/WikivoyageWptPtMenuBuilder.java
@@ -12,30 +12,37 @@
 import java.util.HashMap;
 
 public class WikivoyageWptPtMenuBuilder extends WptPtMenuBuilder {
+
 	private final static String KEY_PHONE = "Phone: ";
 	private final static String KEY_EMAIL = "Email: ";
 	private final static String KEY_WORKING_HOURS = "Working hours: ";
 	private final static String KEY_PRICE = "Price: ";
 	private final static String KEY_DIRECTIONS = "Directions: ";
 	private final static String KEY_DESCRIPTION = "Description";
-	
+
+	private HashMap<String, String> descTokens;
+
 	public WikivoyageWptPtMenuBuilder(@NonNull MapActivity mapActivity, @NonNull WptPt wpt) {
 		super(mapActivity, wpt);
+		descTokens = getDescriptionTokens(wpt.desc, KEY_PHONE, KEY_EMAIL, KEY_WORKING_HOURS, KEY_PRICE, KEY_DIRECTIONS);
+	}
+
+	@Override
+	protected void buildDescription(View view) {
+		final String desc = descTokens.get(KEY_DESCRIPTION);
+		if (!Algorithms.isEmpty(desc)) {
+			buildDescriptionRow(view, app.getString(R.string.shared_string_description), desc, 0, 10, true);
+		}
 	}
 
 	@Override
 	protected void prepareDescription(final WptPt wpt, View view) {
-		HashMap<String, String> descTokens = getDescriptionTokens(wpt.desc, KEY_PHONE, KEY_EMAIL, KEY_WORKING_HOURS, KEY_PRICE, KEY_DIRECTIONS);
 		String phones = descTokens.get(KEY_PHONE);
 		String emails = descTokens.get(KEY_EMAIL);
 		String workingHours = descTokens.get(KEY_WORKING_HOURS);
 		String price = descTokens.get(KEY_PRICE);
 		String direction = descTokens.get(KEY_DIRECTIONS);
 
-		final String desc = descTokens.get(KEY_DESCRIPTION);
-		if (!Algorithms.isEmpty(desc)) {
-			buildRow(view, R.drawable.ic_action_note_dark, null, desc, 0, false, null, true, 10, false, null, false);
-		}
 		if (!Algorithms.isEmpty(phones)) {
 			buildRow(view, R.drawable.ic_action_call_dark,
 					null, phones, 0,
@@ -68,23 +75,25 @@
 		}
 	}
 
-	private HashMap<String, String> getDescriptionTokens(String desc, String ... allowedKeys) {
-		String[] tokens = desc.split("\n");
+	private HashMap<String, String> getDescriptionTokens(String desc, String... allowedKeys) {
 		HashMap<String, String> mTokens = new HashMap<>();
-		for (String token : tokens) {
-			boolean matched = false;
-			for (String key : allowedKeys) {
-				if (token.startsWith(key)) {
-					matched = true;
-					String value = token.substring(key.length()).trim();
-					mTokens.put(key, value);
+		if (!Algorithms.isEmpty(desc)) {
+			String[] tokens = desc.split("\n");
+			for (String token : tokens) {
+				boolean matched = false;
+				for (String key : allowedKeys) {
+					if (token.startsWith(key)) {
+						matched = true;
+						String value = token.substring(key.length()).trim();
+						mTokens.put(key, value);
+					}
 				}
-			}
-			if (!matched) {
-				String s = mTokens.get(KEY_DESCRIPTION);
-				mTokens.put(KEY_DESCRIPTION, s != null ? s + "\n" + token : token);
+				if (!matched) {
+					String s = mTokens.get(KEY_DESCRIPTION);
+					mTokens.put(KEY_DESCRIPTION, s != null ? s + "\n" + token : token);
+				}
 			}
 		}
 		return mTokens;
 	}
-}
+}
\ No newline at end of file