Fix problems and improve UI
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/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 11d6c3f..42b8347 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 2e42f22..30b7a82 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 • %2$s / %3$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/strings.xml b/OsmAnd/res/values-de/strings.xml
index d00065f..1ee70e4 100644
--- a/OsmAnd/res/values-de/strings.xml
+++ b/OsmAnd/res/values-de/strings.xml
@@ -3299,8 +3299,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 • %2$s / %3$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>
diff --git a/OsmAnd/res/values-eo/strings.xml b/OsmAnd/res/values-eo/strings.xml
index 04a720c..8312a66 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 • %2$s / %3$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/strings.xml b/OsmAnd/res/values-es-rAR/strings.xml
index 2bd3b40..d872a49 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 • %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-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..4768793 100644
--- a/OsmAnd/res/values-fa/strings.xml
+++ b/OsmAnd/res/values-fa/strings.xml
@@ -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>
diff --git a/OsmAnd/res/values-fr/strings.xml b/OsmAnd/res/values-fr/strings.xml
index cba39d2..6399872 100644
--- a/OsmAnd/res/values-fr/strings.xml
+++ b/OsmAnd/res/values-fr/strings.xml
@@ -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 • %2$s / %3$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>
diff --git a/OsmAnd/res/values-gl/strings.xml b/OsmAnd/res/values-gl/strings.xml
index 132052e..d4c1889 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 • %2$s / %3$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 8111066..f77791f 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 /‏ %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>
diff --git a/OsmAnd/res/values-is/strings.xml b/OsmAnd/res/values-is/strings.xml
index 12ca416..c7975f3 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>
diff --git a/OsmAnd/res/values-my/strings.xml b/OsmAnd/res/values-my/strings.xml
index cfa3eac..73e5da9 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>
diff --git a/OsmAnd/res/values-pl/strings.xml b/OsmAnd/res/values-pl/strings.xml
index 00e945b..8a8511848 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 •  Użyto %2$s GB"</string>
-    <string name="data_storage_space_description">Wolne %1$s • %2$s / %3$s GB</string>
     <string name="enter_path_to_folder">Proszę wprowadzić ścieżkę do katalogu</string>
     <string name="shared_string_select_folder">Wybierz folder</string>
     <string name="paste_Osmand_data_folder_path">Wklej ścieżkę do folderu z danymi OsmAnd</string>
diff --git a/OsmAnd/res/values-pt-rBR/strings.xml b/OsmAnd/res/values-pt-rBR/strings.xml
index 874b037..36d2a43 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 • %2$s / %3$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>
diff --git a/OsmAnd/res/values-pt/strings.xml b/OsmAnd/res/values-pt/strings.xml
index 4140b04..f98595c 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 • %2$s / %3$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>
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-tr/strings.xml b/OsmAnd/res/values-tr/strings.xml
index e21b385..3818b8a 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 • %2$s / %3$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>
diff --git a/OsmAnd/res/values-zh-rTW/strings.xml b/OsmAnd/res/values-zh-rTW/strings.xml
index f6e805f..c3d1613 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 • %2$s / %3$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>
diff --git a/OsmAnd/res/values/strings.xml b/OsmAnd/res/values/strings.xml
index 4f72c59..a95c3d5 100644
--- a/OsmAnd/res/values/strings.xml
+++ b/OsmAnd/res/values/strings.xml
@@ -11,6 +11,11 @@
 	Thx - Hardy
 
 -->
+    <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="shared_string_calculate">Calculate</string>
     <string name="shared_string_osmand_usage">OsmAnd Usage</string>
     <string name="shared_sting_tiles">Tiles</string>
@@ -24,8 +29,8 @@
     <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\t•\t%2$s</string>
+    <string name="data_storage_space_description">Free %1$s GB\t•\tTotal %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/src/net/osmand/plus/OsmandSettings.java b/OsmAnd/src/net/osmand/plus/OsmandSettings.java
index 34436b5..c8d27d8 100644
--- a/OsmAnd/src/net/osmand/plus/OsmandSettings.java
+++ b/OsmAnd/src/net/osmand/plus/OsmandSettings.java
@@ -1985,6 +1985,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() {
diff --git a/OsmAnd/src/net/osmand/plus/activities/MapActivity.java b/OsmAnd/src/net/osmand/plus/activities/MapActivity.java
index 5549953..d460488 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;
@@ -161,6 +162,9 @@
 import java.util.regex.Pattern;
 
 import static net.osmand.aidlapi.OsmAndCustomizationConstants.DRAWER_SETTINGS_ID;
+import static net.osmand.plus.views.MapControlsLayer.REQUEST_LOCATION_FOR_ADD_DESTINATION_PERMISSION;
+import static net.osmand.plus.views.MapControlsLayer.REQUEST_LOCATION_FOR_NAVIGATION_FAB_PERMISSION;
+import static net.osmand.plus.views.MapControlsLayer.REQUEST_LOCATION_FOR_NAVIGATION_PERMISSION;
 
 public class MapActivity extends OsmandActionBarActivity implements DownloadEvents,
 		OnRequestPermissionsResultCallback, IRouteInformationListener, AMapPointUpdateListener,
@@ -1864,11 +1868,21 @@
 			OsmandPlugin.onRequestPermissionsResult(requestCode, permissions, grantResults);
 
 			MapControlsLayer mcl = mapView.getLayerByClass(MapControlsLayer.class);
-			if (mcl != null) {
+			if (mcl != null && (requestCode == REQUEST_LOCATION_FOR_NAVIGATION_PERMISSION
+					|| requestCode == REQUEST_LOCATION_FOR_NAVIGATION_FAB_PERMISSION
+					|| requestCode == REQUEST_LOCATION_FOR_ADD_DESTINATION_PERMISSION)) {
 				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/settings/DataStorageFragment.java b/OsmAnd/src/net/osmand/plus/settings/DataStorageFragment.java
index b944501..96363f4 100644
--- a/OsmAnd/src/net/osmand/plus/settings/DataStorageFragment.java
+++ b/OsmAnd/src/net/osmand/plus/settings/DataStorageFragment.java
@@ -5,6 +5,7 @@
 import android.app.ProgressDialog;
 import android.content.Context;
 import android.content.DialogInterface;
+import android.content.pm.PackageManager;
 import android.graphics.drawable.Drawable;
 import android.os.AsyncTask;
 import android.os.Bundle;
@@ -27,6 +28,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,16 +45,18 @@
 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;
+	
 	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";
@@ -64,11 +68,11 @@
 	private Preference changeButton;
 	private DataStorageMenuItem currentDataStorage;
 	private String tmpManuallySpecifiedPath;
-	private DataStorageItemsHolder itemsHolder;
+	private DataStorageHelper itemsHolder;
 	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;
@@ -180,7 +184,7 @@
 								&& !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 {
@@ -212,6 +216,14 @@
 		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);
@@ -243,7 +255,12 @@
 					divider.setVisibility(View.VISIBLE);
 					secondPart.setVisibility(View.VISIBLE);
 					String space = getSpaceDescription(item.getDirectory());
-					tvSummary.setText(space);
+					if (!space.equals("")) {
+						tvSummary.setText(space);
+						tvSummary.setVisibility(View.VISIBLE);
+					} else {
+						tvSummary.setVisibility(View.GONE);
+					}
 					if (currentKey.equals(INTERNAL_STORAGE)) {
 						tvAdditionalDescription.setText(item.getDescription());
 					} else {
@@ -259,12 +276,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 = itemsHolder.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())) {
@@ -285,7 +299,13 @@
 					} 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);
@@ -416,7 +436,7 @@
 			app.setExternalStorageDirectory(type, newDirectory);
 			reloadData();
 			if (silentRestart) {
-				android.os.Process.killProcess(android.os.Process.myPid());
+				MapActivity.doRestart(activity);
 			} else {
 				app.restartApp(activity);
 			}
@@ -430,7 +450,7 @@
 	
 	private void refreshDataInfo() {
 		calculateTilesBtnPressed = false;
-		itemsHolder = DataStorageItemsHolder.refreshInfo(app);
+		itemsHolder = DataStorageHelper.refreshInfo(app);
 		calculateMemoryTask = itemsHolder.calculateMemoryUsedInfo(this);
 	}
 
@@ -443,29 +463,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 "";
 	}
@@ -477,6 +482,7 @@
 	@Override
 	public void onMemoryInfoUpdate() {
 		updateAllSettings();
+		app.getSettings().OSMAND_USAGE_SPACE.set(itemsHolder.getTotalUsedBytes());
 	}
 	
 	public static class MoveFilesToDifferentDirectory extends AsyncTask<Void, Void, Boolean> {
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..f2b611f
--- /dev/null
+++ b/OsmAnd/src/net/osmand/plus/settings/DataStorageHelper.java
@@ -0,0 +1,507 @@
+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.text.DecimalFormat;
+import java.util.ArrayList;
+
+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 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 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;
+
+	private DataStorageHelper(OsmandApplication app) {
+		prepareData(app);
+	}
+
+	public static DataStorageHelper refreshInfo(OsmandApplication app) {
+		return new DataStorageHelper(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);
+		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());
+		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;
+
+		public RefreshMemoryUsedInfo(UpdateMemoryInfoUIAdapter listener, DataStorageMemoryItem otherMemory, File rootDir, String[] directoriesToAvoid, String[] prefixesToAvoid) {
+			this.listener = listener;
+			this.otherMemory = otherMemory;
+			this.rootDir = rootDir;
+			this.directoriesToAvoid = directoriesToAvoid;
+			this.prefixesToAvoid = prefixesToAvoid;
+		}
+
+		@Override
+		protected Void doInBackground(DataStorageMemoryItem... items) {
+			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()) && dir.isGoDeeper())) {
+									calculateMultiTypes(file, items);
+									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());
+					}
+				}
+				publishProgress();
+			}
+		}
+
+		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.onMemoryInfoUpdate();
+			}
+		}
+	}
+
+	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();
+
+	}
+
+	@Override
+	public int describeContents() {
+		return 0;
+	}
+
+	private DataStorageHelper(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<DataStorageHelper> CREATOR = new Parcelable.Creator<DataStorageHelper>() {
+
+		@Override
+		public DataStorageHelper createFromParcel(Parcel source) {
+			return new DataStorageHelper(source);
+		}
+
+		@Override
+		public DataStorageHelper[] newArray(int size) {
+			return new DataStorageHelper[size];
+		}
+	};
+}
\ 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..dd75764 100644
--- a/OsmAnd/src/net/osmand/plus/settings/DataStorageMemoryItem.java
+++ b/OsmAnd/src/net/osmand/plus/settings/DataStorageMemoryItem.java
@@ -4,14 +4,19 @@
 import android.os.Parcelable;
 
 public class DataStorageMemoryItem implements Parcelable {
+	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;
 	}
@@ -19,7 +24,8 @@
 	private DataStorageMemoryItem(Parcel in) {
 		key = in.readString();
 		in.readStringArray(extensions);
-		in.readStringArray(directories);
+		in.writeStringArray(prefixes);
+		directories = (Directory[]) in.readArray(Directory.class.getClassLoader());
 		usedMemoryBytes = in.readLong();
 	}
 
@@ -35,10 +41,6 @@
 		this.key = key;
 	}
 
-	public void setUsedMemoryBytes(long usedMemoryBytes) {
-		this.usedMemoryBytes = usedMemoryBytes;
-	}
-	
 	public static DataStorageMemoryItemBuilder builder() {
 		return new DataStorageMemoryItemBuilder();
 	}
@@ -47,16 +49,16 @@
 		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
@@ -68,7 +70,8 @@
 	public void writeToParcel(Parcel dest, int flags) {
 		dest.writeString(key);
 		dest.writeStringArray(extensions);
-		dest.writeStringArray(directories);
+		dest.writeStringArray(prefixes);
+		dest.writeArray(directories);
 		dest.writeLong(usedMemoryBytes);
 	}
 
@@ -88,7 +91,8 @@
 	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 +104,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 +121,70 @@
 		}
 		
 		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 implements Parcelable {
+		private String absolutePath;
+		private boolean goDeeper;
+		private int checkingType;
+		private boolean skipOther;
+
+		@Override
+		public int describeContents() {
+			return 0;
+		}
+
+		@Override
+		public void writeToParcel(Parcel dest, int flags) {
+			dest.writeString(absolutePath);
+			dest.writeInt(goDeeper ? 1 : 0);
+			dest.writeInt(checkingType);
+			dest.writeInt(skipOther ? 1 : 0);
+		}
+
+		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;
+		}
+
+		private Directory(Parcel in) {
+			absolutePath = in.readString();
+			goDeeper = in.readInt() == 1;
+			checkingType = in.readInt();
+			skipOther = in.readInt() == 1;
+		}
+
+		public static final Parcelable.Creator<Directory> CREATOR = new Parcelable.Creator<Directory>() {
+
+			@Override
+			public Directory createFromParcel(Parcel source) {
+				return new Directory(source);
+			}
+
+			@Override
+			public Directory[] newArray(int size) {
+				return new Directory[size];
+			}
+		};
 	}
 }
diff --git a/OsmAnd/src/net/osmand/plus/settings/GlobalSettingsFragment.java b/OsmAnd/src/net/osmand/plus/settings/GlobalSettingsFragment.java
index d39263f..f9acdae 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,24 @@
 		Preference externalStorageDir = (Preference) findPreference(OsmandSettings.EXTERNAL_STORAGE_DIR);
 		externalStorageDir.setIcon(getContentIcon(R.drawable.ic_action_folder));
 
-		DataStorageItemsHolder holder = DataStorageItemsHolder.refreshInfo(app);
+		DataStorageHelper holder = DataStorageHelper.refreshInfo(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);
+			externalStorageDir.setSummary(summary);
+		} else {
+			externalStorageDir.setSummary(currentStorage.getTitle());
+		}
 	}
 
 	private void setupSendAnonymousDataPref() {
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/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..2380f28 100644
--- a/OsmAnd/src/net/osmand/plus/views/MapControlsLayer.java
+++ b/OsmAnd/src/net/osmand/plus/views/MapControlsLayer.java
@@ -75,9 +75,9 @@
 public class MapControlsLayer extends OsmandMapLayer {
 
 	private static final int TIMEOUT_TO_SHOW_BUTTONS = 7000;
-	private static final int REQUEST_LOCATION_FOR_NAVIGATION_PERMISSION = 200;
-	private static final int REQUEST_LOCATION_FOR_NAVIGATION_FAB_PERMISSION = 201;
-	private static final int REQUEST_LOCATION_FOR_ADD_DESTINATION_PERMISSION = 202;
+	public static final int REQUEST_LOCATION_FOR_NAVIGATION_PERMISSION = 200;
+	public static final int REQUEST_LOCATION_FOR_NAVIGATION_FAB_PERMISSION = 201;
+	public static final int REQUEST_LOCATION_FOR_ADD_DESTINATION_PERMISSION = 202;
 
 	private static final int COMPASS_PRESSED_TIME_INTERVAL_MS = 5000;