[Author Prev][Author Next][Thread Prev][Thread Next][Author Index][Thread Index]

[tor-commits] [orbot/master] Legacy Onion Service Backup/Restore and



commit cdb8581ca78d9ec4be707cf88117c29390d9242b
Author: bim <dsnake@xxxxxxxxxxxxxx>
Date:   Wed Sep 23 11:49:10 2020 -0400

    Legacy Onion Service Backup/Restore and
    Cookie backup/restore works.
    
    Cleaned up many more old resources, styled dialogs
    to match Android conventions.
---
 app-mini/src/main/res/values-ay/strings.xml        |   3 +-
 app-mini/src/main/res/values-be/strings.xml        |   3 +-
 app-mini/src/main/res/values-ca/strings.xml        |   1 -
 app-mini/src/main/res/values-de/strings.xml        |   1 -
 app-mini/src/main/res/values-el/strings.xml        |   1 -
 app-mini/src/main/res/values-es/strings.xml        |   1 -
 app-mini/src/main/res/values-eu/strings.xml        |   1 -
 app-mini/src/main/res/values-fa/strings.xml        |   1 -
 app-mini/src/main/res/values-fr/strings.xml        |   1 -
 app-mini/src/main/res/values-gl/strings.xml        |   1 -
 app-mini/src/main/res/values-he/strings.xml        |   1 -
 app-mini/src/main/res/values-hi/strings.xml        |   1 -
 app-mini/src/main/res/values-hu/strings.xml        |   1 -
 app-mini/src/main/res/values-is/strings.xml        |   1 -
 app-mini/src/main/res/values-it/strings.xml        |   1 -
 app-mini/src/main/res/values-ja/strings.xml        |   1 -
 app-mini/src/main/res/values-mk/strings.xml        |   3 +-
 app-mini/src/main/res/values-nl/strings.xml        |   1 -
 app-mini/src/main/res/values-pt-rBR/strings.xml    |   1 -
 app-mini/src/main/res/values-ru/strings.xml        |   1 -
 app-mini/src/main/res/values-sr/strings.xml        |   1 -
 app-mini/src/main/res/values-sv/strings.xml        |   1 -
 app-mini/src/main/res/values-th/strings.xml        |   1 -
 app-mini/src/main/res/values-tr/strings.xml        |   3 +-
 app-mini/src/main/res/values-uk/strings.xml        |   1 -
 app-mini/src/main/res/values-zh-rTW/strings.xml    |   1 -
 app-mini/src/main/res/values/strings.xml           |   1 -
 app/src/main/AndroidManifest.xml                   |   8 +-
 .../android/ui/dialog/AboutDialogFragment.java     |  21 +--
 .../ui/hiddenservices/ClientCookiesActivity.java   |  76 ++++----
 .../ui/hiddenservices/HiddenServicesActivity.java  |  78 ++++----
 .../adapters/ClientCookiesAdapter.java             |   8 +-
 .../hiddenservices/adapters/OnionListAdapter.java  |  10 +-
 .../ui/hiddenservices/backup/BackupUtils.java      | 200 ++++++++-------------
 .../android/ui/hiddenservices/backup/ZipIt.java    |  37 +++-
 .../ui/hiddenservices/dialogs/AddCookieDialog.java |  35 ++--
 .../dialogs/CookieActionsDialog.java               |  65 ++++---
 .../hiddenservices/dialogs/CookieDeleteDialog.java |  37 ++--
 .../ui/hiddenservices/dialogs/HSActionsDialog.java | 137 +++++++-------
 .../ui/hiddenservices/dialogs/HSCookieDialog.java  |  79 ++++----
 .../ui/hiddenservices/dialogs/HSDataDialog.java    |  63 +++----
 .../ui/hiddenservices/dialogs/HSDeleteDialog.java  |  62 +++----
 .../permissions/PermissionManager.java             |  37 +---
 .../ui/onboarding/CustomBridgesActivity.java       |  14 +-
 .../res/layout/layout_activity_client_cookies.xml  |   5 +-
 .../res/layout/layout_add_client_cookie_dialog.xml |  33 +---
 .../res/layout/layout_client_cookie_list_item.xml  |   2 +-
 app/src/main/res/layout/layout_cookie_actions.xml  |  27 ---
 app/src/main/res/layout/layout_hs_actions.xml      |  36 ----
 app/src/main/res/layout/layout_hs_cookie.xml       |  32 ----
 app/src/main/res/layout/layout_hs_data_dialog.xml  |  36 +---
 app/src/main/res/layout/layout_hs_list_item.xml    |  78 ++++----
 app/src/main/res/layout/layout_hs_list_view.xml    |   5 +-
 app/src/main/res/values-ar/strings.xml             |   4 +-
 app/src/main/res/values-ay/strings.xml             |   7 +-
 app/src/main/res/values-az/strings.xml             |   1 -
 app/src/main/res/values-be/strings.xml             |   7 +-
 app/src/main/res/values-bg/strings.xml             |   1 -
 app/src/main/res/values-bn/strings.xml             |   2 +-
 app/src/main/res/values-brx/strings.xml            |   2 +-
 app/src/main/res/values-bs/strings.xml             |   3 +-
 app/src/main/res/values-ca/strings.xml             |   5 +-
 app/src/main/res/values-cs-rCZ/strings.xml         |   1 -
 app/src/main/res/values-cs/strings.xml             |   3 +-
 app/src/main/res/values-cy/strings.xml             |   1 -
 app/src/main/res/values-da/strings.xml             |   1 -
 app/src/main/res/values-de/strings.xml             |   5 +-
 app/src/main/res/values-el/strings.xml             |   5 +-
 app/src/main/res/values-eo/strings.xml             |   3 +-
 app/src/main/res/values-es-rAR/strings.xml         |   3 +-
 app/src/main/res/values-es/strings.xml             |   5 +-
 app/src/main/res/values-eu/strings.xml             |   5 +-
 app/src/main/res/values-fa/strings.xml             |   7 +-
 app/src/main/res/values-fi/strings.xml             |   1 -
 app/src/main/res/values-fr-rFR/strings.xml         |   1 -
 app/src/main/res/values-fr/strings.xml             |   5 +-
 app/src/main/res/values-gl/strings.xml             |   5 +-
 app/src/main/res/values-gu/strings.xml             |   1 -
 app/src/main/res/values-he/strings.xml             |   7 +-
 app/src/main/res/values-hi/strings.xml             |   5 +-
 app/src/main/res/values-hr/strings.xml             |   1 -
 app/src/main/res/values-hu/strings.xml             |   5 +-
 app/src/main/res/values-hy-rAM/strings.xml         |   2 +-
 app/src/main/res/values-id/strings.xml             |   1 -
 app/src/main/res/values-in-rID/strings.xml         |   1 -
 app/src/main/res/values-in/strings.xml             |   2 +-
 app/src/main/res/values-is/strings.xml             |   5 +-
 app/src/main/res/values-it/strings.xml             |   5 +-
 app/src/main/res/values-iw/strings.xml             |   1 -
 app/src/main/res/values-ja/strings.xml             |   5 +-
 app/src/main/res/values-kn/strings.xml             |   2 +-
 app/src/main/res/values-ko/strings.xml             |   1 -
 app/src/main/res/values-lt/strings.xml             |   1 -
 app/src/main/res/values-lv/strings.xml             |   1 -
 app/src/main/res/values-mk/strings.xml             |   7 +-
 app/src/main/res/values-ml/strings.xml             |   2 +-
 app/src/main/res/values-my/strings.xml             |   3 +-
 app/src/main/res/values-nb/strings.xml             |   4 +-
 app/src/main/res/values-nl/strings.xml             |   5 +-
 app/src/main/res/values-pl/strings.xml             |   1 -
 app/src/main/res/values-pt-rBR/strings.xml         |   5 +-
 app/src/main/res/values-pt-rPT/strings.xml         |   1 -
 app/src/main/res/values-pt/strings.xml             |   1 -
 app/src/main/res/values-ro/strings.xml             |   1 -
 app/src/main/res/values-ru/strings.xml             |   5 +-
 app/src/main/res/values-si-rLK/strings.xml         |   1 -
 app/src/main/res/values-sk/strings.xml             |   1 -
 app/src/main/res/values-sl/strings.xml             |   1 -
 app/src/main/res/values-sn/strings.xml             |   2 +-
 app/src/main/res/values-sq/strings.xml             |   1 -
 app/src/main/res/values-sr/strings.xml             |   5 +-
 app/src/main/res/values-sv/strings.xml             |   5 +-
 app/src/main/res/values-ta/strings.xml             |   1 -
 app/src/main/res/values-th/strings.xml             |   5 +-
 app/src/main/res/values-tl/strings.xml             |   1 -
 app/src/main/res/values-tr/strings.xml             |   7 +-
 app/src/main/res/values-uk/strings.xml             |   5 +-
 app/src/main/res/values-ur/strings.xml             |   2 +-
 app/src/main/res/values-uz/strings.xml             |   2 +-
 app/src/main/res/values-vi/strings.xml             |   1 -
 app/src/main/res/values-zh-rCN/strings.xml         |   1 -
 app/src/main/res/values-zh-rTW/strings.xml         |   5 +-
 app/src/main/res/values/strings.xml                |   4 +-
 .../org/torproject/android/core/ClipboardUtils.kt  |  17 ++
 .../java/org/torproject/android/core/DiskUtils.kt  |  39 +++-
 .../android/core/ui/SettingsPreferencesActivity.kt |  10 +-
 126 files changed, 594 insertions(+), 942 deletions(-)

diff --git a/app-mini/src/main/res/values-ay/strings.xml b/app-mini/src/main/res/values-ay/strings.xml
index 7d1da038..55ad3641 100644
--- a/app-mini/src/main/res/values-ay/strings.xml
+++ b/app-mini/src/main/res/values-ay/strings.xml
@@ -147,8 +147,7 @@
   <string name="delete_service">Lurañanak pichsuña</string>
   <string name="backup_saved_at_external_storage">Imat luratanakamax yaqha yänakar imataxiwa</string>
   <string name="backup_restored">Imat luratanakamax mayamp apnaqatäxiwa</string>
-  <string name="please_grant_permissions_for_external_storage">Yaqha yänakar imañatak iyaw sam, amp suma</string>
-  <string name="restore_backup">Imat luratanak mayamp aqtayam</string>
+    <string name="restore_backup">Imat luratanak mayamp aqtayam</string>
     <string name="name_can_t_be_empty">Sutix qillqantatäñapapuniwa</string>
   <string name="fields_can_t_be_empty">Janiw kunas ch\'usäñapakiti</string>
   <string name="start_tor_again_for_finish_the_process">Tukuyañatakix Tor mayamp naktayam</string>
diff --git a/app-mini/src/main/res/values-be/strings.xml b/app-mini/src/main/res/values-be/strings.xml
index cefedc3d..600128ec 100644
--- a/app-mini/src/main/res/values-be/strings.xml
+++ b/app-mini/src/main/res/values-be/strings.xml
@@ -147,8 +147,7 @@
   <string name="delete_service">Ð?Ñ?далÑ?Ñ?Ñ? Ñ?лÑ?жбÑ?</string>
   <string name="backup_saved_at_external_storage">РÑ?зеÑ?воваÑ? копÑ?Ñ? заÑ?авана на вонкавÑ?м Ñ?Ñ?овÑ?Ñ?Ñ?Ñ?</string>
   <string name="backup_restored">Ð?дноÑ?лена з Ñ?Ñ?зеÑ?вовай копÑ?Ñ?</string>
-  <string name="please_grant_permissions_for_external_storage">Ð?айÑ?е дазвол длÑ? доÑ?Ñ?Ñ?пÑ? да вонкавага Ñ?Ñ?овÑ?Ñ?Ñ?а</string>
-  <string name="restore_backup">Ð?днавÑ?Ñ?Ñ? з копÑ?Ñ?</string>
+    <string name="restore_backup">Ð?днавÑ?Ñ?Ñ? з копÑ?Ñ?</string>
     <string name="name_can_t_be_empty">Ð?мÑ? не можа бÑ?Ñ?Ñ? пÑ?Ñ?Ñ?Ñ?м</string>
   <string name="fields_can_t_be_empty">Ð?алÑ? не могÑ?Ñ?Ñ? бÑ?Ñ?Ñ? пÑ?Ñ?Ñ?Ñ?мÑ?</string>
   <string name="start_tor_again_for_finish_the_process">Ð?апÑ?Ñ?Ñ?Ñ?Ñ?е Tor Ñ?зноÑ? длÑ? завÑ?Ñ?Ñ?Ñ?ннÑ? пÑ?аÑ?Ñ?Ñ?Ñ?</string>
diff --git a/app-mini/src/main/res/values-ca/strings.xml b/app-mini/src/main/res/values-ca/strings.xml
index 87933a11..c73e46f8 100644
--- a/app-mini/src/main/res/values-ca/strings.xml
+++ b/app-mini/src/main/res/values-ca/strings.xml
@@ -148,7 +148,6 @@
   <string name="delete_service">Esborrar servei</string>
   <string name="backup_saved_at_external_storage">Còpia de seguretat desada a emmagatzematge extern</string>
   <string name="backup_restored">Còpia de seguretat restaurada</string>
-  <string name="please_grant_permissions_for_external_storage">Si us plau concedeix permisos per emmagatzematge extern</string>
     <string name="restore_backup">Restaurar còpia de seguretat</string>
     <string name="name_can_t_be_empty">El nom no pot estar buit</string>
   <string name="fields_can_t_be_empty">Els camps no poden estar buits</string>
diff --git a/app-mini/src/main/res/values-de/strings.xml b/app-mini/src/main/res/values-de/strings.xml
index 839ce6d8..8bc5e311 100644
--- a/app-mini/src/main/res/values-de/strings.xml
+++ b/app-mini/src/main/res/values-de/strings.xml
@@ -148,7 +148,6 @@
   <string name="delete_service">Dienst löschen</string>
   <string name="backup_saved_at_external_storage">Sicherung auf externem Speicher gespeichert </string>
   <string name="backup_restored">Sicherung wiederhergestellt</string>
-  <string name="please_grant_permissions_for_external_storage">Bitte Zugriffsrechte auf externen Speicher gewähren</string>
     <string name="restore_backup">Sicherung wiederherstellen</string>
     <string name="name_can_t_be_empty">Name darf nicht leer sein</string>
   <string name="fields_can_t_be_empty">Felder dürfen nicht leer sein</string>
diff --git a/app-mini/src/main/res/values-el/strings.xml b/app-mini/src/main/res/values-el/strings.xml
index 236827f3..c3ae2c1a 100644
--- a/app-mini/src/main/res/values-el/strings.xml
+++ b/app-mini/src/main/res/values-el/strings.xml
@@ -148,7 +148,6 @@
   <string name="delete_service">Î?ιαγÏ?αÏ?ή Ï?Ï?ηÏ?εÏ?ίαÏ?</string>
   <string name="backup_saved_at_external_storage">Το ανÏ?ίγÏ?άÏ?ο αÏ?Ï?αλείαÏ? αÏ?οθηκεÏ?θηκε Ï?ε εξÏ?Ï?εÏ?ικÏ? μέÏ?ο αÏ?οθήκεÏ?Ï?ηÏ?</string>
   <string name="backup_restored">Το ανÏ?ίγÏ?αÏ?ο αÏ?Ï?αλείαÏ? εÏ?αναÏ?έÏ?θηκε</string>
-  <string name="please_grant_permissions_for_external_storage">ΠαÏ?ακαλοÏ?με να Ï?αÏ?αÏ?Ï?Ï?ήÏ?εÏ?ε δικαιÏ?μαÏ?α για εξÏ?Ï?εÏ?ική αÏ?οθήκεÏ?Ï?η</string>
     <string name="restore_backup">Î?Ï?αναÏ?οÏ?ά ανÏ?ιγÏ?άÏ?οÏ? αÏ?Ï?αλείαÏ?</string>
     <string name="name_can_t_be_empty">Το Ï?νομα δεν γίνεÏ?αι να είναι κενÏ?</string>
   <string name="fields_can_t_be_empty">Τα Ï?εδία δεν μÏ?οÏ?εί να είναι κενά</string>
diff --git a/app-mini/src/main/res/values-es/strings.xml b/app-mini/src/main/res/values-es/strings.xml
index e983e86b..6b6a268d 100644
--- a/app-mini/src/main/res/values-es/strings.xml
+++ b/app-mini/src/main/res/values-es/strings.xml
@@ -149,7 +149,6 @@ direcciones (o rangos). No prevalecen sobre las configuraciones de exclusión de
   <string name="delete_service">Borrar servicio</string>
   <string name="backup_saved_at_external_storage">Copia de seguridad guardada en un almacenamiento externo</string>
   <string name="backup_restored">Copia de seguridad restaurada</string>
-  <string name="please_grant_permissions_for_external_storage">Por favor, conceda permisos para almacenamiento externo</string>
     <string name="restore_backup">Restaurar copia de seguridad</string>
     <string name="name_can_t_be_empty">El nombre no puede estar vacío</string>
   <string name="fields_can_t_be_empty">Los campos no pueden estar vacíos</string>
diff --git a/app-mini/src/main/res/values-eu/strings.xml b/app-mini/src/main/res/values-eu/strings.xml
index 7e96ed03..cb3c4a2d 100644
--- a/app-mini/src/main/res/values-eu/strings.xml
+++ b/app-mini/src/main/res/values-eu/strings.xml
@@ -148,7 +148,6 @@
   <string name="delete_service">Ezabatu zerbitzua</string>
   <string name="backup_saved_at_external_storage">Babeskopia kanpo biltegiratzean gorde da</string>
   <string name="backup_restored">Babeskopia berrezarri da</string>
-  <string name="please_grant_permissions_for_external_storage">Eman kanpo biltegiratzerako baimena</string>
     <string name="restore_backup">Berrezarri babeskopia</string>
     <string name="name_can_t_be_empty">Izena ezin da hutsik egon</string>
   <string name="fields_can_t_be_empty">Eremuak ezin dira hutsik egon</string>
diff --git a/app-mini/src/main/res/values-fa/strings.xml b/app-mini/src/main/res/values-fa/strings.xml
index aeec4bc9..5d2c9083 100644
--- a/app-mini/src/main/res/values-fa/strings.xml
+++ b/app-mini/src/main/res/values-fa/strings.xml
@@ -148,7 +148,6 @@
   <string name="delete_service">حذÙ? سرÙ?Û?س</string>
   <string name="backup_saved_at_external_storage">بکâ??آپ در اÙ?بارÙ? خارجÛ? ذخÛ?رÙ? شد</string>
   <string name="backup_restored">بکâ??آپ بازگرداÙ?دÙ? شد</string>
-  <string name="please_grant_permissions_for_external_storage">Ù?Ø·Ù?ا بÙ?  اÙ?بارÙ? خارجÛ? اجازÙ? دسترسÛ? بدÙ?Û?د</string>
     <string name="restore_backup">برگرداÙ?دÙ? بکâ??آپ</string>
     <string name="name_can_t_be_empty">Ù?اÙ? Ù?باÛ?د خاÙ?Û? باشد</string>
   <string name="fields_can_t_be_empty">زÙ?Û?Ù?Ù?â??Ù?ا Ù?باÛ?د خاÙ?Û? باشÙ?د</string>
diff --git a/app-mini/src/main/res/values-fr/strings.xml b/app-mini/src/main/res/values-fr/strings.xml
index e9297469..13fa4c32 100644
--- a/app-mini/src/main/res/values-fr/strings.xml
+++ b/app-mini/src/main/res/values-fr/strings.xml
@@ -148,7 +148,6 @@
   <string name="delete_service">Supprimer le service</string>
   <string name="backup_saved_at_external_storage">La sauvegarde a été enregistrée sur une mémoire externe</string>
   <string name="backup_restored">La sauvegarde a été restaurée</string>
-  <string name="please_grant_permissions_for_external_storage">Veuillez accorder les droits vers la mémoire externe</string>
     <string name="restore_backup">Restaurer la sauvegarde</string>
     <string name="name_can_t_be_empty">Le nom ne peut pas être vide</string>
   <string name="fields_can_t_be_empty">Les champs ne peuvent pas être vides</string>
diff --git a/app-mini/src/main/res/values-gl/strings.xml b/app-mini/src/main/res/values-gl/strings.xml
index e864f280..7c1fa842 100644
--- a/app-mini/src/main/res/values-gl/strings.xml
+++ b/app-mini/src/main/res/values-gl/strings.xml
@@ -148,7 +148,6 @@
   <string name="delete_service">Eliminar servizo</string>
   <string name="backup_saved_at_external_storage">Respaldo gardado en almacenamento externo</string>
   <string name="backup_restored">Respaldo restaurado</string>
-  <string name="please_grant_permissions_for_external_storage">Por favor, conceda permiso para o almacenamento externo</string>
     <string name="restore_backup">Restaurar respaldo</string>
     <string name="name_can_t_be_empty">O nome non pode quedar baldeiro</string>
   <string name="fields_can_t_be_empty">Os campos non poden estar baldeiros</string>
diff --git a/app-mini/src/main/res/values-he/strings.xml b/app-mini/src/main/res/values-he/strings.xml
index 61047bd7..648cf7dd 100644
--- a/app-mini/src/main/res/values-he/strings.xml
+++ b/app-mini/src/main/res/values-he/strings.xml
@@ -148,7 +148,6 @@
   <string name="delete_service">×?×?ק ש×?ר×?ת</string>
   <string name="backup_saved_at_external_storage">×?×?×?×?×? נש×?ר ×?×?×?ס×?×? ×?×?צ×?× ×?</string>
   <string name="backup_restored">×?×?×?×?×? ש×?×?×?ר</string>
-  <string name="please_grant_permissions_for_external_storage">×?× ×? ×?ענק ×?רש×?×?ת ×¢×?×?ר ×?×?ס×?×? ×?×?צ×?× ×?</string>
     <string name="restore_backup">ש×?×?ר ×?×?×?×?×?</string>
     <string name="name_can_t_be_empty">ש×? ×?×?× ×? ×?×?×?×? ×?×?×?×?ת ר×?ק</string>
   <string name="fields_can_t_be_empty">ש×?×?ת ×?×?× ×? ×?×?×?×?×?×? ×?×?×?×?ת ר×?ק×?×?</string>
diff --git a/app-mini/src/main/res/values-hi/strings.xml b/app-mini/src/main/res/values-hi/strings.xml
index 94c08db6..8e9088ab 100644
--- a/app-mini/src/main/res/values-hi/strings.xml
+++ b/app-mini/src/main/res/values-hi/strings.xml
@@ -149,7 +149,6 @@
   <string name="delete_service">स�वा ह�ा��</string>
   <string name="backup_saved_at_external_storage">बाह�य स���रहण म�� ब���प सह��ा �या</string>
   <string name="backup_restored">ब���प �� प�नर�स�थापित �िया �या</string>
-  <string name="please_grant_permissions_for_external_storage">��पया बाहर� स���रहण �� लि� �न�मति द��</string>
     <string name="restore_backup">ब���प बहाल</string>
     <string name="name_can_t_be_empty">नाम रि��त नह�� ह� स�ता</string>
   <string name="fields_can_t_be_empty">फ़�ल�ड रि��त नह�� ह� स�त�</string>
diff --git a/app-mini/src/main/res/values-hu/strings.xml b/app-mini/src/main/res/values-hu/strings.xml
index b41c415c..246f581f 100644
--- a/app-mini/src/main/res/values-hu/strings.xml
+++ b/app-mini/src/main/res/values-hu/strings.xml
@@ -148,7 +148,6 @@
   <string name="delete_service">Szolgáltatás Törlése</string>
   <string name="backup_saved_at_external_storage">KülsÅ? tárhelyre mentve</string>
   <string name="backup_restored">Mentés visszaállítva</string>
-  <string name="please_grant_permissions_for_external_storage">Kérjük adjon jogosultságot a külsÅ? tárhelyhez</string>
     <string name="restore_backup">Mentés visszaállítása</string>
     <string name="name_can_t_be_empty">A név nem lehet üres</string>
   <string name="fields_can_t_be_empty">A mezÅ?k nem lehetnek üresek</string>
diff --git a/app-mini/src/main/res/values-is/strings.xml b/app-mini/src/main/res/values-is/strings.xml
index f96562a5..e130a256 100644
--- a/app-mini/src/main/res/values-is/strings.xml
+++ b/app-mini/src/main/res/values-is/strings.xml
@@ -148,7 +148,6 @@
   <string name="delete_service">Eyða þjónustu</string>
   <string name="backup_saved_at_external_storage">�ryggisafrit var vistað í ytri gagnageymslu</string>
   <string name="backup_restored">Ã?ryggisafrit var endurheimt</string>
-  <string name="please_grant_permissions_for_external_storage">Gefðu heimild til að nota ytri gagnageymslu</string>
     <string name="restore_backup">Endurheimta úr öryggisafriti</string>
     <string name="name_can_t_be_empty">Nafnið má ekki vera autt</string>
   <string name="fields_can_t_be_empty">Gagnasvið mega ekki vera auð</string>
diff --git a/app-mini/src/main/res/values-it/strings.xml b/app-mini/src/main/res/values-it/strings.xml
index 34b6d8bb..8ba73822 100644
--- a/app-mini/src/main/res/values-it/strings.xml
+++ b/app-mini/src/main/res/values-it/strings.xml
@@ -148,7 +148,6 @@
   <string name="delete_service">Elimina il servizio</string>
   <string name="backup_saved_at_external_storage">Backup salvato nell\'archiviazione esterna</string>
   <string name="backup_restored">Backup ripristinato</string>
-  <string name="please_grant_permissions_for_external_storage">Consenti l\'autorizzazione per l\'archiviazione esterna</string>
     <string name="restore_backup">Ripristina backup</string>
     <string name="name_can_t_be_empty">Il nome non può essere vuoto</string>
   <string name="fields_can_t_be_empty">I campi non possono essere vuoti</string>
diff --git a/app-mini/src/main/res/values-ja/strings.xml b/app-mini/src/main/res/values-ja/strings.xml
index 2153c958..acfb1770 100644
--- a/app-mini/src/main/res/values-ja/strings.xml
+++ b/app-mini/src/main/res/values-ja/strings.xml
@@ -148,7 +148,6 @@
   <string name="delete_service">ã?µã?¼ã??ã?¹ã??å??é?¤</string>
   <string name="backup_saved_at_external_storage">ã??ã??ã?¯ã?¢ã??ã??ã?¯å¤?é?¨è¨?æ?¶è£?ç½®ã?«ä¿?å­?ã??ã??ã?¾ã??ã??</string>
   <string name="backup_restored">ã??ã??ã?¯ã?¢ã??ã??ã??ã??復å??</string>
-  <string name="please_grant_permissions_for_external_storage">å¤?é?¨è¨?æ?¶ã?¸ã?®ã?¢ã?¯ã?»ã?¹è¨±å?¯ã??ä¸?ã??ã?¦ä¸?ã??ã??ã??</string>
     <string name="restore_backup">ã??ã??ã?¯ã?¢ã??ã??ã?®å¾©æ?§</string>
     <string name="name_can_t_be_empty">å??å??ã?¯ã??ã?©ã?³ã?¯ã?®ã?¾ã?¾ã?«ã?§ã??ã?¾ã??ã??</string>
   <string name="fields_can_t_be_empty">ã??ã?£ã?¼ã?«ã??ã??空ã?«ã??ã?¦ã??ã??ã??ã?¨ã?¯ã?§ã??ã?¾ã??ã??</string>
diff --git a/app-mini/src/main/res/values-mk/strings.xml b/app-mini/src/main/res/values-mk/strings.xml
index 3e5f07cf..cbb7af41 100644
--- a/app-mini/src/main/res/values-mk/strings.xml
+++ b/app-mini/src/main/res/values-mk/strings.xml
@@ -148,8 +148,7 @@
   <string name="delete_service">Ð?збÑ?иÑ?и Ñ?Ñ?лÑ?га</string>
   <string name="backup_saved_at_external_storage">РезеÑ?внаÑ?а копиÑ?а е Ñ?нимена на надвоÑ?еÑ?на мемоÑ?иÑ?а</string>
   <string name="backup_restored">Ð?Ñ?аÑ?ено од Ñ?езеÑ?вна копиÑ?а</string>
-  <string name="please_grant_permissions_for_external_storage">Ð?е молиме дадеÑ?е дозволи за надвоÑ?еÑ?на мемоÑ?иÑ?а</string>
-  <string name="restore_backup">Ð?Ñ?аÑ?и Ñ?езеÑ?вна копиÑ?а</string>
+    <string name="restore_backup">Ð?Ñ?аÑ?и Ñ?езеÑ?вна копиÑ?а</string>
     <string name="name_can_t_be_empty">Ð?меÑ?о не може да биде пÑ?азно</string>
   <string name="fields_can_t_be_empty">Ð?олиÑ?аÑ?а не можаÑ? да бидаÑ? пÑ?азни</string>
   <string name="start_tor_again_for_finish_the_process">СÑ?аÑ?Ñ?Ñ?ваÑ? го Tor повÑ?оÑ?но да го завÑ?Ñ?и пÑ?оÑ?еÑ?оÑ?</string>
diff --git a/app-mini/src/main/res/values-nl/strings.xml b/app-mini/src/main/res/values-nl/strings.xml
index 9bc94cf5..6eaf424b 100644
--- a/app-mini/src/main/res/values-nl/strings.xml
+++ b/app-mini/src/main/res/values-nl/strings.xml
@@ -148,7 +148,6 @@
   <string name="delete_service">Dienst verwijderen</string>
   <string name="backup_saved_at_external_storage">Back-up opgeslagen op externe opslag</string>
   <string name="backup_restored">Back-up hersteld</string>
-  <string name="please_grant_permissions_for_external_storage">Verleen toestemmingen voor externe opslag</string>
     <string name="restore_backup">Back-up herstellen</string>
     <string name="name_can_t_be_empty">Naam kan niet leeg zijn</string>
   <string name="fields_can_t_be_empty">Velden kunnen niet leeg zijn</string>
diff --git a/app-mini/src/main/res/values-pt-rBR/strings.xml b/app-mini/src/main/res/values-pt-rBR/strings.xml
index 245010a7..b84193b8 100644
--- a/app-mini/src/main/res/values-pt-rBR/strings.xml
+++ b/app-mini/src/main/res/values-pt-rBR/strings.xml
@@ -148,7 +148,6 @@
   <string name="delete_service">Remover Serviço</string>
   <string name="backup_saved_at_external_storage">Backup salvo em mídia externa</string>
   <string name="backup_restored">Backup Restaurado</string>
-  <string name="please_grant_permissions_for_external_storage">Por favor dê permissões ao armazenamento externo</string>
     <string name="restore_backup">Restaurar Backup</string>
     <string name="name_can_t_be_empty">O campo Nome não pode ser vazio</string>
   <string name="fields_can_t_be_empty">Campos não podem ser vazios</string>
diff --git a/app-mini/src/main/res/values-ru/strings.xml b/app-mini/src/main/res/values-ru/strings.xml
index e35abff7..10dc0103 100644
--- a/app-mini/src/main/res/values-ru/strings.xml
+++ b/app-mini/src/main/res/values-ru/strings.xml
@@ -148,7 +148,6 @@
   <string name="delete_service">УдалиÑ?Ñ? Ñ?лÑ?жбÑ?</string>
   <string name="backup_saved_at_external_storage">РезеÑ?внаÑ? копиÑ? Ñ?оÑ?Ñ?анена на внеÑ?нем Ñ?Ñ?анилиÑ?е</string>
   <string name="backup_restored">Ð?оÑ?Ñ?Ñ?ановлено из Ñ?езеÑ?вной копии</string>
-  <string name="please_grant_permissions_for_external_storage">Ð?Ñ?едоÑ?Ñ?авÑ?Ñ?е Ñ?азÑ?еÑ?ениÑ? длÑ? доÑ?Ñ?Ñ?па к внеÑ?немÑ? Ñ?Ñ?анилиÑ?Ñ?</string>
     <string name="restore_backup">Ð?оÑ?Ñ?Ñ?ановиÑ?Ñ? из копии</string>
     <string name="name_can_t_be_empty">Ð?мÑ? не можеÑ? бÑ?Ñ?Ñ? пÑ?Ñ?Ñ?Ñ?м</string>
   <string name="fields_can_t_be_empty">Ð?олÑ? не могÑ?Ñ? бÑ?Ñ?Ñ? пÑ?Ñ?Ñ?Ñ?ми</string>
diff --git a/app-mini/src/main/res/values-sr/strings.xml b/app-mini/src/main/res/values-sr/strings.xml
index cf542265..fc31f59e 100644
--- a/app-mini/src/main/res/values-sr/strings.xml
+++ b/app-mini/src/main/res/values-sr/strings.xml
@@ -146,7 +146,6 @@
   <string name="delete_service">Ð?бÑ?иÑ?и УÑ?лÑ?гÑ?</string>
   <string name="backup_saved_at_external_storage">РезеÑ?бна копиÑ?а Ñ?е Ñ?аÑ?Ñ?вана на Ñ?поÑ?ноÑ? мемоÑ?иÑ?и</string>
   <string name="backup_restored">РезеÑ?вна копиÑ?а Ñ?е обновÑ?ена</string>
-  <string name="please_grant_permissions_for_external_storage">Ð?олимо да даÑ?е дозволе за екÑ?Ñ?еÑ?но Ñ?кладиÑ?Ñ?еÑ?е</string>
     <string name="restore_backup">Ð?бнови Ñ?езеÑ?внÑ? копиÑ?Ñ?</string>
     <string name="name_can_t_be_empty">Ð?ме не може биÑ?и пÑ?азно</string>
   <string name="fields_can_t_be_empty">Ð?оÑ?а не могÑ? биÑ?и пÑ?азна</string>
diff --git a/app-mini/src/main/res/values-sv/strings.xml b/app-mini/src/main/res/values-sv/strings.xml
index 0ff7349c..dec83ffe 100644
--- a/app-mini/src/main/res/values-sv/strings.xml
+++ b/app-mini/src/main/res/values-sv/strings.xml
@@ -148,7 +148,6 @@
   <string name="delete_service">Ta bort tjänst</string>
   <string name="backup_saved_at_external_storage">Säkerhetskopiering sparad i externt lagringsutrymme</string>
   <string name="backup_restored">Backup återställd</string>
-  <string name="please_grant_permissions_for_external_storage">Bevilja tillstånd för extern lagring</string>
     <string name="restore_backup">�terställa säkerhetskopia</string>
     <string name="name_can_t_be_empty">Namnet kan inte vara tomt</string>
   <string name="fields_can_t_be_empty">Fält kan inte vara tomma</string>
diff --git a/app-mini/src/main/res/values-th/strings.xml b/app-mini/src/main/res/values-th/strings.xml
index 65d55211..451e3e52 100644
--- a/app-mini/src/main/res/values-th/strings.xml
+++ b/app-mini/src/main/res/values-th/strings.xml
@@ -148,7 +148,6 @@
   <string name="delete_service">�ริ�ารล�</string>
   <string name="backup_saved_at_external_storage">��อมูลสำรอ��ั��ึ��ี��ี�������อมูลภาย�อ�</string>
   <string name="backup_restored">�ื���า��อมูลสำรอ�</string>
-  <string name="please_grant_permissions_for_external_storage">�รุ�าอ�ุ�า��ห����า�ึ��ี�������อมูลภาย�อ�</string>
     <string name="restore_backup">�ื���า��อมูลสำรอ�</string>
     <string name="name_can_t_be_empty">�ล�อย�ื�อ�ห�ว�า��ม����</string>
   <string name="fields_can_t_be_empty">�ล�อย�����อมูล�ห�ว�า��ม����</string>
diff --git a/app-mini/src/main/res/values-tr/strings.xml b/app-mini/src/main/res/values-tr/strings.xml
index 00351b51..37830272 100644
--- a/app-mini/src/main/res/values-tr/strings.xml
+++ b/app-mini/src/main/res/values-tr/strings.xml
@@ -148,8 +148,7 @@
   <string name="delete_service">Hizmeti Sil</string>
   <string name="backup_saved_at_external_storage">Yedek dıÅ? depolamaya kaydedildi</string>
   <string name="backup_restored">Yedek geri yüklendi</string>
-  <string name="please_grant_permissions_for_external_storage">Lütfen dıÅ? depolama için izinleri verin</string>
-  <string name="restore_backup">YedeÄ?i Geri Yükle</string>
+    <string name="restore_backup">YedeÄ?i Geri Yükle</string>
     <string name="name_can_t_be_empty">Ad boÅ? bırakılamaz</string>
   <string name="fields_can_t_be_empty">Alanlar boÅ? bırakılamaz</string>
   <string name="start_tor_again_for_finish_the_process">Ä°Å?lemi tamamlamak için Tor uygulamasını yeniden baÅ?latın</string>
diff --git a/app-mini/src/main/res/values-uk/strings.xml b/app-mini/src/main/res/values-uk/strings.xml
index a18c7ffc..5eee9760 100644
--- a/app-mini/src/main/res/values-uk/strings.xml
+++ b/app-mini/src/main/res/values-uk/strings.xml
@@ -148,7 +148,6 @@
   <string name="delete_service">Ð?илÑ?Ñ?иÑ?и СеÑ?вÑ?Ñ?</string>
   <string name="backup_saved_at_external_storage">РезеÑ?вна копÑ?Ñ? збеÑ?ежена на зовнÑ?Ñ?нÑ?й пам\'Ñ?Ñ?Ñ?</string>
   <string name="backup_restored">РезеÑ?вне копÑ?Ñ?ваннÑ? вÑ?дновлено</string>
-  <string name="please_grant_permissions_for_external_storage">Ð?адайÑ?е дозволи на зовнÑ?Ñ?нÑ? пам\'Ñ?Ñ?Ñ?</string>
     <string name="restore_backup">Ð?Ñ?дновиÑ?и Ñ?езеÑ?внÑ? копÑ?Ñ?</string>
     <string name="name_can_t_be_empty">Ð?азва не може бÑ?Ñ?и поÑ?ожнÑ?оÑ?</string>
   <string name="fields_can_t_be_empty">Ð?олÑ? не можÑ?Ñ?Ñ? бÑ?Ñ?и поÑ?ожнÑ?ми</string>
diff --git a/app-mini/src/main/res/values-zh-rTW/strings.xml b/app-mini/src/main/res/values-zh-rTW/strings.xml
index 063813c8..0f0dac44 100644
--- a/app-mini/src/main/res/values-zh-rTW/strings.xml
+++ b/app-mini/src/main/res/values-zh-rTW/strings.xml
@@ -148,7 +148,6 @@
   <string name="delete_service">å?ªé?¤æ??å??</string>
   <string name="backup_saved_at_external_storage">å??份æª?å?²å­?å?¨å¤?é?¨å?²å­?å?¨</string>
   <string name="backup_restored">å??份已é??å??</string>
-  <string name="please_grant_permissions_for_external_storage">è«?æ??æ¬?å¤?æ?¥å?²å­?å?¨ä½¿ç?¨</string>
     <string name="restore_backup">é??å??å??份</string>
     <string name="name_can_t_be_empty">å??稱ä¸?å?¯ç©ºç?½</string>
   <string name="fields_can_t_be_empty">����空�</string>
diff --git a/app-mini/src/main/res/values/strings.xml b/app-mini/src/main/res/values/strings.xml
index 994e4ee3..087af9ba 100644
--- a/app-mini/src/main/res/values/strings.xml
+++ b/app-mini/src/main/res/values/strings.xml
@@ -187,7 +187,6 @@
     <string name="delete_service">Delete Service</string>
     <string name="backup_saved_at_external_storage">Backup saved at external storage</string>
     <string name="backup_restored">Backup restored</string>
-    <string name="please_grant_permissions_for_external_storage">Please grant permissions for external storage</string>
     <string name="restore_backup">Restore Backup</string>
     <string name="name_can_t_be_empty">Name can\'t be empty</string>
     <string name="fields_can_t_be_empty">Fields can\'t be empty</string>
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 971fd52b..af7f1d97 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -16,8 +16,9 @@
     <uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
     <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
     <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
-    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
-    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
+    <uses-permission
+        android:name="android.permission.WRITE_EXTERNAL_STORAGE"
+        android:maxSdkVersion="18" />
     <uses-permission android:name="android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS" />
 
     <application
@@ -75,7 +76,8 @@
 
         <activity
             android:name=".core.ui.SettingsPreferencesActivity"
-            android:label="@string/app_name" />
+            android:label="@string/app_name"
+            android:theme="@style/Theme.AppCompat" />
 
         <activity
             android:name=".ui.AppManagerActivity"
diff --git a/app/src/main/java/org/torproject/android/ui/dialog/AboutDialogFragment.java b/app/src/main/java/org/torproject/android/ui/dialog/AboutDialogFragment.java
index d83b556e..dbb33c67 100644
--- a/app/src/main/java/org/torproject/android/ui/dialog/AboutDialogFragment.java
+++ b/app/src/main/java/org/torproject/android/ui/dialog/AboutDialogFragment.java
@@ -2,7 +2,6 @@ package org.torproject.android.ui.dialog;
 
 import android.app.AlertDialog;
 import android.app.Dialog;
-import android.content.Context;
 import android.content.pm.PackageManager;
 import android.os.Bundle;
 import android.text.Html;
@@ -12,11 +11,10 @@ import android.widget.TextView;
 import androidx.fragment.app.DialogFragment;
 
 import org.torproject.android.R;
+import org.torproject.android.core.DiskUtils;
 import org.torproject.android.service.OrbotService;
 
-import java.io.BufferedReader;
 import java.io.IOException;
-import java.io.InputStreamReader;
 
 public class AboutDialogFragment extends DialogFragment {
 
@@ -24,21 +22,6 @@ public class AboutDialogFragment extends DialogFragment {
     private static final String BUNDLE_KEY_TV_ABOUT_TEXT = "about_tv_txt";
     private TextView tvAbout;
 
-    @SuppressWarnings("SameParameterValue")
-    private static String readFromAssets(Context context, String filename) throws IOException {
-        BufferedReader reader = new BufferedReader(new InputStreamReader(context.getAssets().open(filename)));
-
-        // do reading, usually loop until end of file reading
-        StringBuilder sb = new StringBuilder();
-        String mLine = reader.readLine();
-        while (mLine != null) {
-            sb.append(mLine).append('\n'); // process line
-            mLine = reader.readLine();
-        }
-        reader.close();
-        return sb.toString();
-    }
-
     @Override
     public Dialog onCreateDialog(Bundle savedInstanceState) {
         View view = getActivity().getLayoutInflater().inflate(R.layout.layout_about, null);
@@ -69,7 +52,7 @@ public class AboutDialogFragment extends DialogFragment {
 
         if (buildAboutText) {
             try {
-                String aboutText = readFromAssets(getContext(), "LICENSE");
+                String aboutText = DiskUtils.readFileFromAssets("LICENSE", getContext());
                 aboutText = aboutText.replace("\n", "<br/>");
                 tvAbout.setText(Html.fromHtml(aboutText));
             } catch (IOException e) {
diff --git a/app/src/main/java/org/torproject/android/ui/hiddenservices/ClientCookiesActivity.java b/app/src/main/java/org/torproject/android/ui/hiddenservices/ClientCookiesActivity.java
index e3fbaeab..86b7b5ac 100644
--- a/app/src/main/java/org/torproject/android/ui/hiddenservices/ClientCookiesActivity.java
+++ b/app/src/main/java/org/torproject/android/ui/hiddenservices/ClientCookiesActivity.java
@@ -1,10 +1,10 @@
 package org.torproject.android.ui.hiddenservices;
 
+import android.app.AlertDialog;
 import android.content.ContentResolver;
 import android.content.ContentValues;
 import android.content.Context;
 import android.content.Intent;
-import android.content.pm.PackageManager;
 import android.database.ContentObserver;
 import android.database.Cursor;
 import android.os.Bundle;
@@ -29,12 +29,12 @@ import org.torproject.android.ui.hiddenservices.adapters.ClientCookiesAdapter;
 import org.torproject.android.ui.hiddenservices.backup.BackupUtils;
 import org.torproject.android.ui.hiddenservices.dialogs.AddCookieDialog;
 import org.torproject.android.ui.hiddenservices.dialogs.CookieActionsDialog;
-import org.torproject.android.ui.hiddenservices.permissions.PermissionManager;
 import org.torproject.android.ui.hiddenservices.providers.CookieContentProvider;
 
-public class ClientCookiesActivity extends AppCompatActivity {
-    public final int WRITE_EXTERNAL_STORAGE_FROM_COOKIE_ACTIONBAR = 3;
+import java.io.File;
 
+public class ClientCookiesActivity extends AppCompatActivity {
+    private static final int REQUEST_CODE_READ_COOKIE = 54;
     private ContentResolver mResolver;
     private ClientCookiesAdapter mAdapter;
 
@@ -54,12 +54,9 @@ public class ClientCookiesActivity extends AppCompatActivity {
             dialog.show(getSupportFragmentManager(), "AddCookieDialog");
         });
 
-        mAdapter = new ClientCookiesAdapter(this,
-                mResolver.query(CookieContentProvider.CONTENT_URI, CookieContentProvider.PROJECTION, null, null, null), 0);
+        mAdapter = new ClientCookiesAdapter(this, mResolver.query(CookieContentProvider.CONTENT_URI, CookieContentProvider.PROJECTION, null, null, null), 0);
 
-        mResolver.registerContentObserver(
-                CookieContentProvider.CONTENT_URI, true, new HSObserver(new Handler())
-        );
+        mResolver.registerContentObserver(CookieContentProvider.CONTENT_URI, true, new HSObserver(new Handler()));
 
         ListView cookies = findViewById(R.id.clien_cookies_list);
         cookies.setAdapter(mAdapter);
@@ -78,10 +75,8 @@ public class ClientCookiesActivity extends AppCompatActivity {
             dialog.setArguments(arguments);
             dialog.show(getSupportFragmentManager(), CookieActionsDialog.class.getSimpleName());
         });
-
     }
 
-
     @Override
     protected void attachBaseContext(Context base) {
         super.attachBaseContext(LocaleHelper.onAttach(base));
@@ -93,22 +88,18 @@ public class ClientCookiesActivity extends AppCompatActivity {
         return true;
     }
 
-    private static final int REQUEST_CODE_READ_COOKIE = 54;
-
     @Override
     public boolean onOptionsItemSelected(MenuItem item) {
         int id = item.getItemId();
 
         if (id == R.id.cookie_restore_backup) {
-            if (PermissionManager.isLollipopOrHigher()
-                    && !PermissionManager.hasExternalWritePermission(this)) {
-                PermissionManager.requestExternalWritePermissions(this, WRITE_EXTERNAL_STORAGE_FROM_COOKIE_ACTIONBAR);
-                return true;
+            if (DiskUtils.supportsStorageAccessFramework()) {
+                Intent readCookieIntent = DiskUtils.createReadFileIntent("application/json");
+                startActivityForResult(readCookieIntent, REQUEST_CODE_READ_COOKIE);
+            } else { // api 16,17,18
+                restoreBackupLegacy();
             }
 
-            Intent readCookieIntent = DiskUtils.createReadFileIntent("application/json");
-            startActivityForResult(readCookieIntent, REQUEST_CODE_READ_COOKIE);
-
         } else if (id == R.id.cookie_from_qr) {
             IntentIntegrator integrator = new IntentIntegrator(ClientCookiesActivity.this);
             integrator.initiateScan();
@@ -117,22 +108,30 @@ public class ClientCookiesActivity extends AppCompatActivity {
         return super.onOptionsItemSelected(item);
     }
 
-    @Override
-    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
-        if (grantResults.length < 1
-                || grantResults[0] != PackageManager.PERMISSION_GRANTED) {
-            return;
-        }
+    private void restoreBackupLegacy() {
+        File backupDir = DiskUtils.getOrCreateLegacyBackupDir();
 
-        switch (requestCode) {
-            case CookieActionsDialog.WRITE_EXTERNAL_STORAGE_FROM_COOKIE_ACTION_DIALOG: {
-                try {
-                    CookieActionsDialog activeDialog = (CookieActionsDialog) getSupportFragmentManager().findFragmentByTag(CookieActionsDialog.class.getSimpleName());
-                    activeDialog.doBackup();
-                } catch (ClassCastException e) {
+        try {
+            File[] files = backupDir.listFiles((dir, name) -> name.toLowerCase().endsWith(".json"));
+            if (files != null) {
+                if (files.length == 0) {
+                    Toast.makeText(this, R.string.create_a_backup_first, Toast.LENGTH_LONG).show();
+                    return;
                 }
-                break;
+
+                CharSequence[] fileNames = new CharSequence[files.length];
+                for (int i = 0; i < files.length; i++) fileNames[i] = files[i].getName();
+
+                new AlertDialog.Builder(this)
+                        .setItems(fileNames, (dialog, which) -> {
+                            String text = DiskUtils.readFile(mResolver, files[which]);
+                            new BackupUtils(this).restoreCookieBackup(text);
+                        })
+                        .setTitle(R.string.restore_backup)
+                        .show();
             }
+        } catch (Exception e) {
+            Toast.makeText(this, R.string.error, Toast.LENGTH_LONG).show();
         }
     }
 
@@ -142,9 +141,8 @@ public class ClientCookiesActivity extends AppCompatActivity {
 
         if (request == REQUEST_CODE_READ_COOKIE) {
             if (response != RESULT_OK) return;
-            String cookieStr = DiskUtils.readFileFromInputStream(getContentResolver(), data.getData());
-            BackupUtils backup = new BackupUtils(this);
-            backup.restoreCookieBackup(cookieStr);
+            String cookieStr = DiskUtils.readFileFromInputStream(mResolver, data.getData());
+            new BackupUtils(this).restoreCookieBackup(cookieStr);
             return;
         }
 
@@ -162,13 +160,11 @@ public class ClientCookiesActivity extends AppCompatActivity {
 
             fields.put(
                     CookieContentProvider.ClientCookie.DOMAIN,
-                    savedValues.getString(CookieContentProvider.ClientCookie.DOMAIN)
-            );
+                    savedValues.getString(CookieContentProvider.ClientCookie.DOMAIN));
 
             fields.put(
                     CookieContentProvider.ClientCookie.AUTH_COOKIE_VALUE,
-                    savedValues.getString(CookieContentProvider.ClientCookie.AUTH_COOKIE_VALUE)
-            );
+                    savedValues.getString(CookieContentProvider.ClientCookie.AUTH_COOKIE_VALUE));
 
             mResolver.insert(CookieContentProvider.CONTENT_URI, fields);
 
diff --git a/app/src/main/java/org/torproject/android/ui/hiddenservices/HiddenServicesActivity.java b/app/src/main/java/org/torproject/android/ui/hiddenservices/HiddenServicesActivity.java
index 6430d48d..f3efa689 100644
--- a/app/src/main/java/org/torproject/android/ui/hiddenservices/HiddenServicesActivity.java
+++ b/app/src/main/java/org/torproject/android/ui/hiddenservices/HiddenServicesActivity.java
@@ -3,7 +3,6 @@ package org.torproject.android.ui.hiddenservices;
 import android.content.ContentResolver;
 import android.content.Context;
 import android.content.Intent;
-import android.content.pm.PackageManager;
 import android.database.ContentObserver;
 import android.database.Cursor;
 import android.os.Bundle;
@@ -13,7 +12,9 @@ import android.view.MenuItem;
 import android.view.View;
 import android.widget.ListView;
 import android.widget.RadioButton;
+import android.widget.Toast;
 
+import androidx.appcompat.app.AlertDialog;
 import androidx.appcompat.app.AppCompatActivity;
 import androidx.appcompat.widget.Toolbar;
 
@@ -29,15 +30,16 @@ import org.torproject.android.ui.hiddenservices.dialogs.HSDataDialog;
 import org.torproject.android.ui.hiddenservices.permissions.PermissionManager;
 import org.torproject.android.ui.hiddenservices.providers.HSContentProvider;
 
+import java.io.File;
+
 public class HiddenServicesActivity extends AppCompatActivity {
     private static final int REQUEST_CODE_READ_ZIP_BACKUP = 125;
-    public final int WRITE_EXTERNAL_STORAGE_FROM_ACTIONBAR = 1;
+    private static final String BUNDLE_KEY_SHOW_USER_SERVICES = "show_user_services";
     private ContentResolver mResolver;
     private OnionListAdapter mAdapter;
     private RadioButton radioShowUserServices, radioShowAppServices;
     private FloatingActionButton fab;
     private String mWhere = HSContentProvider.HiddenService.CREATED_BY_USER + "=1";
-    private static final String BUNDLE_KEY_SHOW_USER_SERVICES = "show_user_services";
 
     @Override
     protected void onCreate(Bundle savedInstanceState) {
@@ -102,9 +104,24 @@ public class HiddenServicesActivity extends AppCompatActivity {
         return true;
     }
 
-    private void doRestore() {
-        Intent readFile = DiskUtils.createReadFileIntent("application/zip");
-        startActivityForResult(readFile, REQUEST_CODE_READ_ZIP_BACKUP);
+    private void doRestoreLegacy() { // API 16, 17, 18
+        File backupDir = DiskUtils.getOrCreateLegacyBackupDir();
+        File[] files = backupDir.listFiles((dir, name) -> name.toLowerCase().endsWith(".zip"));
+        if (files != null) {
+            if (files.length == 0) {
+                Toast.makeText(this, R.string.create_a_backup_first, Toast.LENGTH_LONG).show();
+                return;
+            }
+
+            CharSequence[] fileNames = new CharSequence[files.length];
+            for (int i = 0; i < files.length; i++) fileNames[i] = files[i].getName();
+
+            new AlertDialog.Builder(this)
+                    .setTitle(R.string.restore_backup)
+                    .setItems(fileNames, (dialog, which) -> new BackupUtils(HiddenServicesActivity.this).restoreZipBackupLegacy(files[which]))
+                    .show();
+
+        }
     }
 
     @Override
@@ -120,38 +137,17 @@ public class HiddenServicesActivity extends AppCompatActivity {
     @Override
     public boolean onOptionsItemSelected(MenuItem item) {
         if (item.getItemId() == R.id.menu_restore_backup) {
-            if (PermissionManager.isLollipopOrHigher()
-                    && !PermissionManager.hasExternalWritePermission(this)) {
-                PermissionManager.requestExternalWritePermissions(this, WRITE_EXTERNAL_STORAGE_FROM_ACTIONBAR);
-                return true;
+            if (DiskUtils.supportsStorageAccessFramework()) {
+                Intent readFile = DiskUtils.createReadFileIntent("application/zip");
+                startActivityForResult(readFile, REQUEST_CODE_READ_ZIP_BACKUP);
+            } else { // API 16, 17, 18
+                doRestoreLegacy();
             }
-            doRestore();
         }
 
         return super.onOptionsItemSelected(item);
     }
 
-    @Override
-    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
-        if (grantResults.length < 1 || grantResults[0] != PackageManager.PERMISSION_GRANTED)
-            return;
-
-        switch (requestCode) {
-            case WRITE_EXTERNAL_STORAGE_FROM_ACTIONBAR: {
-                doRestore();
-                break;
-            }
-            case HSActionsDialog.WRITE_EXTERNAL_STORAGE_FROM_ACTION_DIALOG: {
-                try {
-                    HSActionsDialog activeDialog = (HSActionsDialog) getSupportFragmentManager().findFragmentByTag(HSActionsDialog.class.getSimpleName());
-                    activeDialog.doBackup();
-                } catch (ClassCastException e) {
-                }
-                break;
-            }
-        }
-    }
-
     private void filterServices(boolean showUserServices) {
         if (showUserServices) {
             mWhere = HSContentProvider.HiddenService.CREATED_BY_USER + "=1";
@@ -185,19 +181,17 @@ public class HiddenServicesActivity extends AppCompatActivity {
         public void onChange(boolean selfChange) {
             mAdapter.changeCursor(mResolver.query(HSContentProvider.CONTENT_URI, HSContentProvider.PROJECTION, mWhere, null, null));
 
-            if (PermissionManager.isLollipopOrHigher()) {
-                Cursor active = mResolver.query(
-                        HSContentProvider.CONTENT_URI, HSContentProvider.PROJECTION, HSContentProvider.HiddenService.ENABLED + "=1", null, null);
+            if (!PermissionManager.isLollipopOrHigher()) return;
+            Cursor active = mResolver.query(HSContentProvider.CONTENT_URI, HSContentProvider.PROJECTION, HSContentProvider.HiddenService.ENABLED + "=1", null, null);
 
-                if (active == null) return;
+            if (active == null) return;
 
-                if (active.getCount() > 0) // Call only if there running services
-                    PermissionManager.requestBatteryPermmssions(HiddenServicesActivity.this, getApplicationContext());
-                else // Drop whe not needed
-                    PermissionManager.requestDropBatteryPermmssions(HiddenServicesActivity.this, getApplicationContext());
+            if (active.getCount() > 0) // Call only if there running services
+                PermissionManager.requestBatteryPermissions(HiddenServicesActivity.this, getApplicationContext());
+            else // Drop whe not needed
+                PermissionManager.requestDropBatteryPermissions(HiddenServicesActivity.this, getApplicationContext());
 
-                active.close();
-            }
+            active.close();
         }
     }
 }
diff --git a/app/src/main/java/org/torproject/android/ui/hiddenservices/adapters/ClientCookiesAdapter.java b/app/src/main/java/org/torproject/android/ui/hiddenservices/adapters/ClientCookiesAdapter.java
index e7123522..d40fa34d 100644
--- a/app/src/main/java/org/torproject/android/ui/hiddenservices/adapters/ClientCookiesAdapter.java
+++ b/app/src/main/java/org/torproject/android/ui/hiddenservices/adapters/ClientCookiesAdapter.java
@@ -20,9 +20,7 @@ public class ClientCookiesAdapter extends CursorAdapter {
 
     public ClientCookiesAdapter(Context context, Cursor c, int flags) {
         super(context, c, flags);
-
-        cursorInflater = (LayoutInflater) context.getSystemService(
-                Context.LAYOUT_INFLATER_SERVICE);
+        cursorInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
     }
 
     @Override
@@ -35,9 +33,7 @@ public class ClientCookiesAdapter extends CursorAdapter {
         domain.setText(cursor.getString(cursor.getColumnIndex(CookieContentProvider.ClientCookie.DOMAIN)));
 
         SwitchCompat enabled = view.findViewById(R.id.cookie_switch);
-        enabled.setChecked(
-                cursor.getInt(cursor.getColumnIndex(CookieContentProvider.ClientCookie.ENABLED)) == 1
-        );
+        enabled.setChecked(cursor.getInt(cursor.getColumnIndex(CookieContentProvider.ClientCookie.ENABLED)) == 1);
 
         enabled.setOnCheckedChangeListener((buttonView, isChecked) -> {
             ContentResolver resolver = mContext.getContentResolver();
diff --git a/app/src/main/java/org/torproject/android/ui/hiddenservices/adapters/OnionListAdapter.java b/app/src/main/java/org/torproject/android/ui/hiddenservices/adapters/OnionListAdapter.java
index 1431aa7f..d4e39ece 100644
--- a/app/src/main/java/org/torproject/android/ui/hiddenservices/adapters/OnionListAdapter.java
+++ b/app/src/main/java/org/torproject/android/ui/hiddenservices/adapters/OnionListAdapter.java
@@ -21,7 +21,6 @@ public class OnionListAdapter extends CursorAdapter {
 
     public OnionListAdapter(Context context, Cursor c, int flags) {
         super(context, c, flags);
-
         cursorInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
     }
 
@@ -39,19 +38,14 @@ public class OnionListAdapter extends CursorAdapter {
         domain.setText(cursor.getString(cursor.getColumnIndex(HSContentProvider.HiddenService.DOMAIN)));
 
         SwitchCompat enabled = view.findViewById(R.id.hs_switch);
-        enabled.setChecked(
-                cursor.getInt(cursor.getColumnIndex(HSContentProvider.HiddenService.ENABLED)) == 1
-        );
-
+        enabled.setChecked(cursor.getInt(cursor.getColumnIndex(HSContentProvider.HiddenService.ENABLED)) == 1);
         enabled.setOnCheckedChangeListener((buttonView, isChecked) -> {
             ContentResolver resolver = mContext.getContentResolver();
             ContentValues fields = new ContentValues();
             fields.put(HSContentProvider.HiddenService.ENABLED, isChecked);
             resolver.update(HSContentProvider.CONTENT_URI, fields, where, null);
 
-            Toast.makeText(
-                    mContext, R.string.please_restart_Orbot_to_enable_the_changes, Toast.LENGTH_LONG
-            ).show();
+            Toast.makeText(mContext, R.string.please_restart_Orbot_to_enable_the_changes, Toast.LENGTH_LONG).show();
         });
     }
 
diff --git a/app/src/main/java/org/torproject/android/ui/hiddenservices/backup/BackupUtils.java b/app/src/main/java/org/torproject/android/ui/hiddenservices/backup/BackupUtils.java
index 86fc80c6..efa73c9a 100644
--- a/app/src/main/java/org/torproject/android/ui/hiddenservices/backup/BackupUtils.java
+++ b/app/src/main/java/org/torproject/android/ui/hiddenservices/backup/BackupUtils.java
@@ -28,7 +28,7 @@ import java.nio.channels.FileChannel;
 import java.nio.charset.Charset;
 
 public class BackupUtils {
-    private final String configFileName = "config.json";
+    private static final String configFileName = "config.json";
     private Context mContext;
     private ContentResolver mResolver;
 
@@ -38,14 +38,21 @@ public class BackupUtils {
     }
 
     public String createZipBackup(int port, Uri zipFile) {
-        File mHSBasePath = new File(
-                mContext.getFilesDir().getAbsolutePath(),
-                TorServiceConstants.HIDDEN_SERVICES_DIR
-        );
+        String[] files = createFilesForZipping(port);
+        ZipIt zip = new ZipIt(files, zipFile, mResolver);
+
+        if (!zip.zip())
+            return null;
+
+        return zipFile.getPath();
+    }
+
 
-        String configFilePath = mHSBasePath + "/hs" + port + "/" + configFileName;
-        String hostnameFilePath = mHSBasePath + "/hs" + port + "/hostname";
-        String keyFilePath = mHSBasePath + "/hs" + port + "/private_key";
+    private String[] createFilesForZipping(int port) {
+        File hsBasePath = getHSBasePath();
+        String configFilePath = hsBasePath + "/hs" + port + "/" + configFileName;
+        String hostnameFilePath = hsBasePath + "/hs" + port + "/hostname";
+        String keyFilePath = hsBasePath + "/hs" + port + "/private_key";
 
         Cursor portData = mResolver.query(
                 HSContentProvider.CONTENT_URI,
@@ -62,45 +69,14 @@ public class BackupUtils {
 
             portData.moveToNext();
 
-            config.put(
-                    HSContentProvider.HiddenService.NAME,
-                    portData.getString(portData.getColumnIndex(HSContentProvider.HiddenService.NAME))
-            );
-
-            config.put(
-                    HSContentProvider.HiddenService.PORT,
-                    portData.getInt(portData.getColumnIndex(HSContentProvider.HiddenService.PORT))
-            );
-
-            config.put(
-                    HSContentProvider.HiddenService.ONION_PORT,
-                    portData.getInt(portData.getColumnIndex(HSContentProvider.HiddenService.ONION_PORT))
-            );
-
-            config.put(
-                    HSContentProvider.HiddenService.DOMAIN,
-                    portData.getString(portData.getColumnIndex(HSContentProvider.HiddenService.DOMAIN))
-            );
-
-            config.put(
-                    HSContentProvider.HiddenService.AUTH_COOKIE,
-                    portData.getInt(portData.getColumnIndex(HSContentProvider.HiddenService.AUTH_COOKIE))
-            );
-
-            config.put(
-                    HSContentProvider.HiddenService.AUTH_COOKIE_VALUE,
-                    portData.getString(portData.getColumnIndex(HSContentProvider.HiddenService.AUTH_COOKIE_VALUE))
-            );
-
-            config.put(
-                    HSContentProvider.HiddenService.CREATED_BY_USER,
-                    portData.getInt(portData.getColumnIndex(HSContentProvider.HiddenService.CREATED_BY_USER))
-            );
-
-            config.put(
-                    HSContentProvider.HiddenService.ENABLED,
-                    portData.getInt(portData.getColumnIndex(HSContentProvider.HiddenService.ENABLED))
-            );
+            config.put(HSContentProvider.HiddenService.NAME, portData.getString(portData.getColumnIndex(HSContentProvider.HiddenService.NAME)));
+            config.put(HSContentProvider.HiddenService.PORT, portData.getInt(portData.getColumnIndex(HSContentProvider.HiddenService.PORT)));
+            config.put(HSContentProvider.HiddenService.ONION_PORT, portData.getInt(portData.getColumnIndex(HSContentProvider.HiddenService.ONION_PORT)));
+            config.put(HSContentProvider.HiddenService.DOMAIN, portData.getString(portData.getColumnIndex(HSContentProvider.HiddenService.DOMAIN)));
+            config.put(HSContentProvider.HiddenService.AUTH_COOKIE, portData.getInt(portData.getColumnIndex(HSContentProvider.HiddenService.AUTH_COOKIE)));
+            config.put(HSContentProvider.HiddenService.AUTH_COOKIE_VALUE, portData.getString(portData.getColumnIndex(HSContentProvider.HiddenService.AUTH_COOKIE_VALUE)));
+            config.put(HSContentProvider.HiddenService.CREATED_BY_USER, portData.getInt(portData.getColumnIndex(HSContentProvider.HiddenService.CREATED_BY_USER)));
+            config.put(HSContentProvider.HiddenService.ENABLED, portData.getInt(portData.getColumnIndex(HSContentProvider.HiddenService.ENABLED)));
         } catch (JSONException e) {
             e.printStackTrace();
             return null;
@@ -119,42 +95,20 @@ public class BackupUtils {
             e.printStackTrace();
             return null;
         }
-
-        String[] files = {hostnameFilePath, keyFilePath, configFilePath};
-        ZipIt zip = new ZipIt(files, zipFile, mResolver);
-
-        if (!zip.zip())
-            return null;
-
-        return zipFile.getPath();
+        return new String[]{hostnameFilePath, keyFilePath, configFilePath};
     }
 
-    public void restoreZipBackup(Uri zipUri) {
-        File mHSBasePath = new File(
-                mContext.getFilesDir().getAbsolutePath(),
-                TorServiceConstants.HIDDEN_SERVICES_DIR
-        );
-
+    private void extractConfigFromUnzippedBackup(String backupName) {
+        File mHSBasePath = getHSBasePath();
         int port;
-        Cursor service;
-
-        Cursor returnCursor = mResolver.query(zipUri, null, null, null, null);
-        int nameIndex = returnCursor.getColumnIndex(OpenableColumns.DISPLAY_NAME);
-        returnCursor.moveToFirst();
-        String backupName = returnCursor.getString(nameIndex);
-        returnCursor.close();
-
         String hsDir = backupName.substring(0, backupName.lastIndexOf('.'));
         String configFilePath = mHSBasePath + "/" + hsDir + "/" + configFileName;
-        String jString = null;
+        String jString;
 
         File hsPath = new File(mHSBasePath.getAbsolutePath(), hsDir);
         if (!hsPath.isDirectory())
             hsPath.mkdirs();
 
-        ZipIt zip = new ZipIt(null, zipUri, mResolver);
-        zip.unzip(hsPath.getAbsolutePath());
-
         File config = new File(configFilePath);
         FileInputStream stream;
 
@@ -164,51 +118,21 @@ public class BackupUtils {
             MappedByteBuffer bb = fc.map(FileChannel.MapMode.READ_ONLY, 0, fc.size());
             jString = Charset.defaultCharset().decode(bb).toString();
             stream.close();
-        } catch (IOException e) {
-            e.printStackTrace();
-        }
-
-        if (jString == null)
-            Toast.makeText(mContext, R.string.error, Toast.LENGTH_LONG).show();
 
-        try {
             JSONObject savedValues = new JSONObject(jString);
             ContentValues fields = new ContentValues();
 
-            fields.put(
-                    HSContentProvider.HiddenService.NAME,
-                    savedValues.getString(HSContentProvider.HiddenService.NAME)
-            );
-
-            fields.put(
-                    HSContentProvider.HiddenService.ONION_PORT,
-                    savedValues.getInt(HSContentProvider.HiddenService.ONION_PORT)
-            );
-
-            fields.put(
-                    HSContentProvider.HiddenService.DOMAIN,
-                    savedValues.getString(HSContentProvider.HiddenService.DOMAIN)
-            );
-
-            fields.put(
-                    HSContentProvider.HiddenService.AUTH_COOKIE,
-                    savedValues.getInt(HSContentProvider.HiddenService.AUTH_COOKIE)
-            );
-
-            fields.put(
-                    HSContentProvider.HiddenService.CREATED_BY_USER,
-                    savedValues.getInt(HSContentProvider.HiddenService.CREATED_BY_USER)
-            );
-
-            fields.put(
-                    HSContentProvider.HiddenService.ENABLED,
-                    savedValues.getInt(HSContentProvider.HiddenService.ENABLED)
-            );
+            fields.put(HSContentProvider.HiddenService.NAME, savedValues.getString(HSContentProvider.HiddenService.NAME));
+            fields.put(HSContentProvider.HiddenService.ONION_PORT, savedValues.getInt(HSContentProvider.HiddenService.ONION_PORT));
+            fields.put(HSContentProvider.HiddenService.DOMAIN, savedValues.getString(HSContentProvider.HiddenService.DOMAIN));
+            fields.put(HSContentProvider.HiddenService.AUTH_COOKIE, savedValues.getInt(HSContentProvider.HiddenService.AUTH_COOKIE));
+            fields.put(HSContentProvider.HiddenService.CREATED_BY_USER, savedValues.getInt(HSContentProvider.HiddenService.CREATED_BY_USER));
+            fields.put(HSContentProvider.HiddenService.ENABLED, savedValues.getInt(HSContentProvider.HiddenService.ENABLED));
 
             port = savedValues.getInt(HSContentProvider.HiddenService.PORT);
             fields.put(HSContentProvider.HiddenService.PORT, port);
 
-            service = mResolver.query(
+            Cursor service = mResolver.query(
                     HSContentProvider.CONTENT_URI,
                     HSContentProvider.PROJECTION,
                     HSContentProvider.HiddenService.PORT + "=" + port,
@@ -228,13 +152,42 @@ public class BackupUtils {
 
                 service.close();
             }
-
-        } catch (JSONException e) {
+            Toast.makeText(mContext, R.string.backup_restored, Toast.LENGTH_LONG).show();
+        } catch (IOException | JSONException e) {
             e.printStackTrace();
             Toast.makeText(mContext, R.string.error, Toast.LENGTH_LONG).show();
         }
+    }
+
+    private File getHSBasePath() {
+        return new File(mContext.getFilesDir().getAbsolutePath(), TorServiceConstants.HIDDEN_SERVICES_DIR);
+    }
+
+    public void restoreZipBackupLegacy(File zipFile) {
+        String backupName = zipFile.getName();
+        ZipIt zip = new ZipIt(null, null, mResolver);
+        String hsDir = backupName.substring(0, backupName.lastIndexOf('.'));
+        File hsPath = new File(getHSBasePath().getAbsolutePath(), hsDir);
+        if (zip.unzipLegacy(hsPath.getAbsolutePath(), zipFile))
+            extractConfigFromUnzippedBackup(backupName);
+        else
+            Toast.makeText(mContext, R.string.error, Toast.LENGTH_LONG).show();
+    }
+
+    public void restoreZipBackup(Uri zipUri) {
+        Cursor returnCursor = mResolver.query(zipUri, null, null, null, null);
+        int nameIndex = returnCursor.getColumnIndex(OpenableColumns.DISPLAY_NAME);
+        returnCursor.moveToFirst();
+        String backupName = returnCursor.getString(nameIndex);
+        returnCursor.close();
+
+        String hsDir = backupName.substring(0, backupName.lastIndexOf('.'));
+        File hsPath = new File(getHSBasePath().getAbsolutePath(), hsDir);
+        if (new ZipIt(null, zipUri, mResolver).unzip(hsPath.getAbsolutePath()))
+            extractConfigFromUnzippedBackup(backupName);
+        else
+            Toast.makeText(mContext, R.string.error, Toast.LENGTH_LONG).show();
 
-        Toast.makeText(mContext, R.string.backup_restored, Toast.LENGTH_LONG).show();
     }
 
     public void restoreKeyBackup(int hsPort, Uri hsKeyPath) {
@@ -270,29 +223,16 @@ public class BackupUtils {
             JSONObject savedValues = new JSONObject(jString);
             ContentValues fields = new ContentValues();
 
-            fields.put(
-                    CookieContentProvider.ClientCookie.DOMAIN,
-                    savedValues.getString(CookieContentProvider.ClientCookie.DOMAIN)
-            );
-
-            fields.put(
-                    CookieContentProvider.ClientCookie.AUTH_COOKIE_VALUE,
-                    savedValues.getString(CookieContentProvider.ClientCookie.AUTH_COOKIE_VALUE)
-            );
-
-            fields.put(
-                    CookieContentProvider.ClientCookie.ENABLED,
-                    savedValues.getInt(CookieContentProvider.ClientCookie.ENABLED)
-            );
+            fields.put(CookieContentProvider.ClientCookie.DOMAIN, savedValues.getString(CookieContentProvider.ClientCookie.DOMAIN));
+            fields.put(CookieContentProvider.ClientCookie.AUTH_COOKIE_VALUE, savedValues.getString(CookieContentProvider.ClientCookie.AUTH_COOKIE_VALUE));
+            fields.put(CookieContentProvider.ClientCookie.ENABLED, savedValues.getInt(CookieContentProvider.ClientCookie.ENABLED));
 
             mResolver.insert(CookieContentProvider.CONTENT_URI, fields);
+            Toast.makeText(mContext, R.string.backup_restored, Toast.LENGTH_LONG).show();
 
         } catch (JSONException e) {
             e.printStackTrace();
             Toast.makeText(mContext, R.string.error, Toast.LENGTH_LONG).show();
         }
-
-        Toast.makeText(mContext, R.string.backup_restored, Toast.LENGTH_LONG).show();
     }
-
 }
diff --git a/app/src/main/java/org/torproject/android/ui/hiddenservices/backup/ZipIt.java b/app/src/main/java/org/torproject/android/ui/hiddenservices/backup/ZipIt.java
index b73833c9..5c264b8e 100644
--- a/app/src/main/java/org/torproject/android/ui/hiddenservices/backup/ZipIt.java
+++ b/app/src/main/java/org/torproject/android/ui/hiddenservices/backup/ZipIt.java
@@ -59,20 +59,43 @@ public class ZipIt {
         return true;
     }
 
+    public boolean unzipLegacy(String outputPath, File zipFile) {
+        try {
+            FileInputStream fis = new FileInputStream((zipFile));
+            ZipInputStream zis = new ZipInputStream(new BufferedInputStream(fis));
+            boolean returnVal = extractFromZipInputStream(outputPath, zis);
+            fis.close();
+            return returnVal;
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+        return false;
+    }
+
     public boolean unzip(String outputPath) {
         InputStream is;
-        ZipInputStream zis;
-
         try {
-            String filename;
             is = contentResolver.openInputStream(zipFile);
-            zis = new ZipInputStream(new BufferedInputStream(is));
+            ZipInputStream zis = new ZipInputStream(new BufferedInputStream(is));
+            boolean returnVal = extractFromZipInputStream(outputPath, zis);
+            is.close();
+            return returnVal;
+        } catch (IOException e) {
+            e.printStackTrace();
+            return false;
+        }
+    }
+
+    private boolean extractFromZipInputStream(String outputPath, ZipInputStream zis) {
+        try {
             ZipEntry ze;
             byte[] buffer = new byte[1024];
             int count;
 
+            new File(outputPath).mkdirs();
+
             while ((ze = zis.getNextEntry()) != null) {
-                filename = ze.getName();
+                String filename = ze.getName();
 
                 // Need to create directories if not exists, or it will generate an Exception...
                 if (ze.isDirectory()) {
@@ -92,12 +115,12 @@ public class ZipIt {
             }
 
             zis.close();
-            is.close();
         } catch (IOException e) {
             e.printStackTrace();
             return false;
         }
-
         return true;
     }
+
+
 }
\ No newline at end of file
diff --git a/app/src/main/java/org/torproject/android/ui/hiddenservices/dialogs/AddCookieDialog.java b/app/src/main/java/org/torproject/android/ui/hiddenservices/dialogs/AddCookieDialog.java
index 6fa99d8d..badb04fc 100644
--- a/app/src/main/java/org/torproject/android/ui/hiddenservices/dialogs/AddCookieDialog.java
+++ b/app/src/main/java/org/torproject/android/ui/hiddenservices/dialogs/AddCookieDialog.java
@@ -4,12 +4,12 @@ package org.torproject.android.ui.hiddenservices.dialogs;
 import android.app.Dialog;
 import android.content.ContentResolver;
 import android.content.ContentValues;
+import android.content.Context;
 import android.os.Bundle;
 import androidx.annotation.NonNull;
 import androidx.fragment.app.DialogFragment;
 import androidx.appcompat.app.AlertDialog;
 import android.view.View;
-import android.widget.Button;
 import android.widget.EditText;
 import android.widget.Toast;
 import org.torproject.android.R;
@@ -20,36 +20,26 @@ public class AddCookieDialog extends DialogFragment {
     @NonNull
     @Override
     public Dialog onCreateDialog(Bundle savedInstanceState) {
-
         final View dialog_view = getActivity().getLayoutInflater().inflate(R.layout.layout_add_client_cookie_dialog, null);
-
-        final AlertDialog addCookieDialog = new AlertDialog.Builder(getActivity())
+        return new AlertDialog.Builder(getActivity())
                 .setView(dialog_view)
                 .setTitle(R.string.client_cookies)
+                .setNegativeButton(android.R.string.cancel, (dialog, which) -> dialog.dismiss())
+                .setPositiveButton(R.string.save, (dialog, which) -> doSave(dialog_view, getContext()))
                 .create();
+    }
 
-        Button save = dialog_view.findViewById(R.id.cookie_dialog_save);
-        save.setOnClickListener(v -> {
-            String onion = ((EditText) dialog_view.findViewById(R.id.cookie_onion)).getText().toString();
-            String cookie = ((EditText) dialog_view.findViewById(R.id.cookie_value)).getText().toString();
-
-            if (checkInput(onion, cookie)) {
-                saveData(onion, cookie);
-                Toast.makeText(
-                        v.getContext(), R.string.please_restart_Orbot_to_enable_the_changes, Toast.LENGTH_LONG
-                ).show();
-                addCookieDialog.dismiss();
-            }
-        });
-
-        Button cancel = dialog_view.findViewById(R.id.cookie_dialog_cancel);
-        cancel.setOnClickListener(v -> addCookieDialog.cancel());
+    private void doSave(View dialogView, Context context) {
+        String onion = ((EditText) dialogView.findViewById(R.id.cookie_onion)).getText().toString();
+        String cookie = ((EditText) dialogView.findViewById(R.id.cookie_value)).getText().toString();
 
-        return addCookieDialog;
+        if (checkInput(onion, cookie)) {
+            saveData(onion, cookie);
+            Toast.makeText(context, R.string.please_restart_Orbot_to_enable_the_changes, Toast.LENGTH_LONG).show();
+        }
     }
 
     private boolean checkInput(String onion, String cookie) {
-
         boolean is_set = ((onion != null && onion.length() > 0) && (cookie != null && cookie.length() > 0));
         if (!is_set) {
             Toast.makeText(getContext(), R.string.fields_can_t_be_empty, Toast.LENGTH_SHORT).show();
@@ -65,7 +55,6 @@ public class AddCookieDialog extends DialogFragment {
     }
 
     private void saveData(String domain, String cookie) {
-
         ContentValues fields = new ContentValues();
         fields.put(CookieContentProvider.ClientCookie.DOMAIN, domain);
         fields.put(CookieContentProvider.ClientCookie.AUTH_COOKIE_VALUE, cookie);
diff --git a/app/src/main/java/org/torproject/android/ui/hiddenservices/dialogs/CookieActionsDialog.java b/app/src/main/java/org/torproject/android/ui/hiddenservices/dialogs/CookieActionsDialog.java
index 8e0ad321..fb1d1212 100644
--- a/app/src/main/java/org/torproject/android/ui/hiddenservices/dialogs/CookieActionsDialog.java
+++ b/app/src/main/java/org/torproject/android/ui/hiddenservices/dialogs/CookieActionsDialog.java
@@ -6,7 +6,6 @@ import android.content.Intent;
 import android.net.Uri;
 import android.os.Bundle;
 import android.os.ParcelFileDescriptor;
-import android.view.View;
 import android.widget.Toast;
 
 import androidx.annotation.NonNull;
@@ -19,13 +18,13 @@ import org.torproject.android.R;
 import org.torproject.android.core.DiskUtils;
 import org.torproject.android.ui.hiddenservices.providers.CookieContentProvider;
 
+import java.io.File;
 import java.io.FileOutputStream;
+import java.io.FileWriter;
 import java.io.IOException;
 
 public class CookieActionsDialog extends DialogFragment {
-    public static final int WRITE_EXTERNAL_STORAGE_FROM_COOKIE_ACTION_DIALOG = 4;
     private static final int REQUEST_CODE_WRITE_FILE = 123;
-    private AlertDialog actionDialog;
     private String domain;
     private String cookie;
     private int enabled;
@@ -38,27 +37,50 @@ public class CookieActionsDialog extends DialogFragment {
         cookie = arguments.getString("auth_cookie_value");
         enabled = arguments.getInt("enabled");
 
-        final View dialog_view = getActivity().getLayoutInflater().inflate(R.layout.layout_cookie_actions, null);
-        actionDialog = new AlertDialog.Builder(getActivity())
-                .setView(dialog_view)
+        return new AlertDialog.Builder(getActivity())
                 .setTitle(R.string.client_cookies)
+                .setItems(new CharSequence[]{
+                        getString(R.string.backup_cookie),
+                        getString(R.string.delete_cookie)
+                }, (dialog, which) -> {
+                    if (which == 0) doBackup();
+                    else doDelete(arguments);
+                })
+                .setNegativeButton(android.R.string.cancel, (dialog, which) -> dialog.dismiss())
                 .create();
+    }
 
-        dialog_view.findViewById(R.id.btn_cookie_cancel).setOnClickListener(v -> actionDialog.dismiss());
-        dialog_view.findViewById(R.id.btn_cookie_backup).setOnClickListener(v -> doBackup());
-        dialog_view.findViewById(R.id.btn_cookie_delete).setOnClickListener(v -> {
-            CookieDeleteDialog dialog = new CookieDeleteDialog();
-            dialog.setArguments(arguments);
-            dialog.show(getFragmentManager(), "CookieDeleteDialog");
-            actionDialog.dismiss();
-        });
+    private void doDelete(Bundle arguments) {
+        CookieDeleteDialog dialog = new CookieDeleteDialog();
+        dialog.setArguments(arguments);
+        dialog.show(getFragmentManager(), "CookieDeleteDialog");
+    }
 
-        return actionDialog;
+    private void doBackup() {
+        String filename = domain.replace(".onion", ".json");
+        if (DiskUtils.supportsStorageAccessFramework()) {
+            Intent createFile = DiskUtils.createWriteFileIntent(filename, "application/json");
+            startActivityForResult(createFile, REQUEST_CODE_WRITE_FILE);
+        } else { // API 16, 17, and 18
+            try {
+                File externalStorage = DiskUtils.getOrCreateLegacyBackupDir();
+                String backupFile = externalStorage.getAbsolutePath() + "/" + filename;
+                String data = createBackupData();
+                FileWriter writer = new FileWriter(backupFile);
+                writer.write(data);
+                writer.close();
+            } catch (JSONException | IOException e) {
+                Toast.makeText(getContext(), R.string.error, Toast.LENGTH_LONG).show();
+            }
+        }
     }
 
-    public void doBackup() {
-        Intent createFile = DiskUtils.createWriteFileIntent(domain.replace(".onion", ".json"), "application/json");
-        startActivityForResult(createFile, REQUEST_CODE_WRITE_FILE);
+    private String createBackupData() throws JSONException {
+        JSONObject backup = new JSONObject();
+        backup.put(CookieContentProvider.ClientCookie.DOMAIN, domain);
+        backup.put(CookieContentProvider.ClientCookie.AUTH_COOKIE_VALUE, cookie);
+        backup.put(CookieContentProvider.ClientCookie.ENABLED, enabled);
+        return backup.toString();
     }
 
     @Override
@@ -69,11 +91,7 @@ public class CookieActionsDialog extends DialogFragment {
                 try {
                     ParcelFileDescriptor pfd = getActivity().getContentResolver().openFileDescriptor(file, "w");
                     FileOutputStream fileOutputStream = new FileOutputStream(pfd.getFileDescriptor());
-                    JSONObject backup = new JSONObject();
-                    backup.put(CookieContentProvider.ClientCookie.DOMAIN, domain);
-                    backup.put(CookieContentProvider.ClientCookie.AUTH_COOKIE_VALUE, cookie);
-                    backup.put(CookieContentProvider.ClientCookie.ENABLED, enabled);
-                    fileOutputStream.write(backup.toString().getBytes());
+                    fileOutputStream.write(createBackupData().getBytes());
                     // Let the document provider know you're done by closing the stream.
                     fileOutputStream.close();
                     pfd.close();
@@ -83,7 +101,6 @@ public class CookieActionsDialog extends DialogFragment {
                     return;
                 }
                 Toast.makeText(getContext(), R.string.backup_saved_at_external_storage, Toast.LENGTH_LONG).show();
-                actionDialog.dismiss();
             }
         }
     }
diff --git a/app/src/main/java/org/torproject/android/ui/hiddenservices/dialogs/CookieDeleteDialog.java b/app/src/main/java/org/torproject/android/ui/hiddenservices/dialogs/CookieDeleteDialog.java
index c2fade86..d5f094c6 100644
--- a/app/src/main/java/org/torproject/android/ui/hiddenservices/dialogs/CookieDeleteDialog.java
+++ b/app/src/main/java/org/torproject/android/ui/hiddenservices/dialogs/CookieDeleteDialog.java
@@ -2,11 +2,12 @@ package org.torproject.android.ui.hiddenservices.dialogs;
 
 import android.app.Dialog;
 import android.content.Context;
-import android.content.DialogInterface;
 import android.os.Bundle;
+
 import androidx.annotation.NonNull;
-import androidx.fragment.app.DialogFragment;
 import androidx.appcompat.app.AlertDialog;
+import androidx.fragment.app.DialogFragment;
+
 import org.torproject.android.R;
 import org.torproject.android.ui.hiddenservices.providers.CookieContentProvider;
 
@@ -18,28 +19,18 @@ public class CookieDeleteDialog extends DialogFragment {
         final Bundle arguments = getArguments();
         final Context context = getContext();
 
-        DialogInterface.OnClickListener dialogClickListener = (dialog, which) -> {
-            switch (which) {
-                case DialogInterface.BUTTON_POSITIVE:
-                    // Delete from db
-                    context.getContentResolver().delete(
-                            CookieContentProvider.CONTENT_URI,
-                            CookieContentProvider.ClientCookie._ID + "=" + arguments.getInt("_id"),
-                            null
-                    );
-
-                    break;
-
-                case DialogInterface.BUTTON_NEGATIVE:
-                    // Do nothing
-                    break;
-            }
-        };
-
         return new AlertDialog.Builder(context)
-                .setMessage(R.string.confirm_cookie_deletion)
-                .setPositiveButton(android.R.string.ok, dialogClickListener)
-                .setNegativeButton(android.R.string.cancel, dialogClickListener)
+                .setTitle(R.string.confirm_cookie_deletion)
+                .setPositiveButton(android.R.string.ok, (dialog, which) -> doDelete(arguments, context))
+                .setNegativeButton(android.R.string.cancel, (dialog, which) -> dialog.cancel())
                 .create();
     }
+
+    private void doDelete(Bundle arguments, Context context) {
+        context.getContentResolver().delete( // delete from db
+                CookieContentProvider.CONTENT_URI,
+                CookieContentProvider.ClientCookie._ID + "=" + arguments.getInt("_id"),
+                null
+        );
+    }
 }
diff --git a/app/src/main/java/org/torproject/android/ui/hiddenservices/dialogs/HSActionsDialog.java b/app/src/main/java/org/torproject/android/ui/hiddenservices/dialogs/HSActionsDialog.java
index 5fbe0571..688b5efc 100644
--- a/app/src/main/java/org/torproject/android/ui/hiddenservices/dialogs/HSActionsDialog.java
+++ b/app/src/main/java/org/torproject/android/ui/hiddenservices/dialogs/HSActionsDialog.java
@@ -2,28 +2,25 @@ package org.torproject.android.ui.hiddenservices.dialogs;
 
 import android.app.Activity;
 import android.app.Dialog;
-import android.content.ClipData;
-import android.content.ClipboardManager;
 import android.content.Context;
 import android.content.Intent;
 import android.net.Uri;
 import android.os.Bundle;
+import android.widget.Toast;
 
 import androidx.annotation.NonNull;
-import androidx.fragment.app.DialogFragment;
 import androidx.appcompat.app.AlertDialog;
-
-import android.view.View;
-import android.widget.Toast;
+import androidx.fragment.app.DialogFragment;
 
 import org.torproject.android.R;
+import org.torproject.android.core.ClipboardUtils;
 import org.torproject.android.core.DiskUtils;
 import org.torproject.android.ui.hiddenservices.backup.BackupUtils;
-import org.torproject.android.ui.hiddenservices.permissions.PermissionManager;
+
+import java.io.File;
 
 public class HSActionsDialog extends DialogFragment {
-    public static final int WRITE_EXTERNAL_STORAGE_FROM_ACTION_DIALOG = 2;
-    private AlertDialog actionDialog;
+    private static final int REQUEST_CODE_WRITE_FILE = 123;
     private int port;
 
     @NonNull
@@ -31,87 +28,85 @@ public class HSActionsDialog extends DialogFragment {
     public Dialog onCreateDialog(Bundle savedInstanceState) {
         final Bundle arguments = getArguments();
         port = Integer.parseInt(arguments.getString("port"));
-        final View dialog_view = getActivity().getLayoutInflater().inflate(R.layout.layout_hs_actions, null);
-        actionDialog = new AlertDialog.Builder(getActivity())
-                .setView(dialog_view)
+        return new AlertDialog.Builder(getActivity())
+                .setItems(new CharSequence[]{
+                                getString(R.string.copy_address_to_clipboard),
+                                getString(R.string.show_auth_cookie),
+                                getString(R.string.backup_service),
+                                getString(R.string.delete_service)},
+                        (dialog, which) -> {
+                            if (which == 0) doCopy(arguments, getContext());
+                            else if (which == 1) doShowAuthCookie(arguments, getContext());
+                            else if (which == 2) doBackup(arguments, getContext());
+                            else if (which == 3) doDelete(arguments);
+                        })
+                .setNegativeButton(android.R.string.cancel, (dialog, which) -> dialog.dismiss())
                 .setTitle(R.string.hidden_services)
                 .create();
+    }
 
-        dialog_view.findViewById(R.id.btn_hs_backup).setOnClickListener(v -> doBackup());
-
-        dialog_view.findViewById(R.id.btn_hs_clipboard).setOnClickListener(v -> {
-            Context mContext = v.getContext();
-            ClipboardManager clipboard = (ClipboardManager) mContext.getSystemService(Context.CLIPBOARD_SERVICE);
-            ClipData clip = ClipData.newPlainText("onion", arguments.getString("onion"));
-            clipboard.setPrimaryClip(clip);
-            Toast.makeText(mContext, R.string.done, Toast.LENGTH_LONG).show();
-            actionDialog.dismiss();
-        });
+    private void doDelete(Bundle arguments) {
+        HSDeleteDialog dialog = new HSDeleteDialog();
+        dialog.setArguments(arguments);
+        dialog.show(getFragmentManager(), "HSDeleteDialog");
+    }
 
-        dialog_view.findViewById(R.id.bt_hs_show_auth).setOnClickListener(v -> {
-            String auth_cookie_value = arguments.getString("auth_cookie_value");
+    private void doShowAuthCookie(Bundle arguments, Context context) {
+        String auth_cookie_value = arguments.getString("auth_cookie_value");
 
-            if (arguments.getInt("auth_cookie") == 1) {
-                if (auth_cookie_value == null || auth_cookie_value.length() < 1) {
-                    Toast.makeText(
-                            v.getContext(), R.string.please_restart_Orbot_to_enable_the_changes, Toast.LENGTH_LONG
-                    ).show();
-                } else {
-                    HSCookieDialog dialog = new HSCookieDialog();
-                    dialog.setArguments(arguments);
-                    dialog.show(getFragmentManager(), "HSCookieDialog");
-                }
+        if (arguments.getInt("auth_cookie") == 1) {
+            if (auth_cookie_value == null || auth_cookie_value.length() < 1) {
+                Toast.makeText(context, R.string.please_restart_Orbot_to_enable_the_changes, Toast.LENGTH_LONG).show();
             } else {
-                Toast.makeText(
-                        v.getContext(), R.string.auth_cookie_was_not_configured, Toast.LENGTH_LONG
-                ).show();
+                HSCookieDialog dialog = new HSCookieDialog();
+                dialog.setArguments(arguments);
+                dialog.show(getFragmentManager(), "HSCookieDialog");
             }
-
-            actionDialog.dismiss();
-        });
-
-        dialog_view.findViewById(R.id.btn_hs_delete).setOnClickListener(v -> {
-            HSDeleteDialog dialog = new HSDeleteDialog();
-            dialog.setArguments(arguments);
-            dialog.show(getFragmentManager(), "HSDeleteDialog");
-            actionDialog.dismiss();
-        });
-
-        dialog_view.findViewById(R.id.btn_hs_cancel).setOnClickListener(v -> actionDialog.dismiss());
-
-        return actionDialog;
+        } else {
+            Toast.makeText(context, R.string.auth_cookie_was_not_configured, Toast.LENGTH_LONG).show();
+        }
     }
 
-    public void doBackup() {
-        Intent createFile = DiskUtils.createWriteFileIntent("hs" + port + ".zip", "application/zip");
-        startActivityForResult(createFile, REQUEST_CODE_WRITE_FILE);
+    private void doCopy(Bundle arguments, Context context) {
+        String onion = arguments.getString("onion");
+        if (onion == null)
+            Toast.makeText(context, R.string.please_restart_Orbot_to_enable_the_changes, Toast.LENGTH_LONG).show();
+        else
+            ClipboardUtils.copyToClipboard("onion", arguments.getString("onion"), getString(R.string.done), context);
     }
 
-    public void doBackup1() {
-        if (PermissionManager.isLollipopOrHigher()
-                && !PermissionManager.hasExternalWritePermission(getActivity())) {
-
-            PermissionManager.requestExternalWritePermissions(
-                    getActivity(), WRITE_EXTERNAL_STORAGE_FROM_ACTION_DIALOG);
+    private void doBackup(Bundle arguments, Context context) {
+        String filename = "hs" + port + ".zip";
+        String onion = arguments.getString("onion");
+        if (onion == null) {
+            Toast.makeText(context, R.string.please_restart_Orbot_to_enable_the_changes, Toast.LENGTH_LONG).show();
+            return;
+        }
+        if (DiskUtils.supportsStorageAccessFramework()) {
+            Intent createFile = DiskUtils.createWriteFileIntent(filename, "application/zip");
+            startActivityForResult(createFile, REQUEST_CODE_WRITE_FILE);
+        } else { // API 16, 17, 18
+            attemptToWriteBackup(Uri.fromFile(new File(DiskUtils.getOrCreateLegacyBackupDir(), filename)));
         }
     }
 
-    private static final int REQUEST_CODE_WRITE_FILE = 123;
-
     @Override
     public void onActivityResult(int requestCode, int resultCode, Intent data) {
         if (requestCode == REQUEST_CODE_WRITE_FILE && resultCode == Activity.RESULT_OK) {
             if (data != null) {
-                Uri file = data.getData();
-                BackupUtils backupUtils = new BackupUtils(getContext());
-                String backup = backupUtils.createZipBackup(port, file);
-                if (backup != null) {
-                    Toast.makeText(getContext(), R.string.backup_saved_at_external_storage, Toast.LENGTH_LONG).show();
-                } else{
-                    Toast.makeText(getContext(), R.string.error, Toast.LENGTH_LONG).show();
-                }
-                actionDialog.dismiss();
+                attemptToWriteBackup(data.getData());
             }
         }
     }
+
+    private void attemptToWriteBackup(Uri outputFile) {
+        BackupUtils backupUtils = new BackupUtils(getContext());
+        String backup = backupUtils.createZipBackup(port, outputFile);
+        if (backup != null) {
+            Toast.makeText(getContext(), R.string.backup_saved_at_external_storage, Toast.LENGTH_LONG).show();
+        } else {
+            Toast.makeText(getContext(), R.string.error, Toast.LENGTH_LONG).show();
+        }
+    }
+
 }
diff --git a/app/src/main/java/org/torproject/android/ui/hiddenservices/dialogs/HSCookieDialog.java b/app/src/main/java/org/torproject/android/ui/hiddenservices/dialogs/HSCookieDialog.java
index ce71a96f..2875fbc4 100644
--- a/app/src/main/java/org/torproject/android/ui/hiddenservices/dialogs/HSCookieDialog.java
+++ b/app/src/main/java/org/torproject/android/ui/hiddenservices/dialogs/HSCookieDialog.java
@@ -1,71 +1,58 @@
 package org.torproject.android.ui.hiddenservices.dialogs;
 
 import android.app.Dialog;
-import android.content.ClipData;
-import android.content.ClipboardManager;
-import android.content.Context;
 import android.os.Bundle;
+
 import androidx.annotation.NonNull;
-import androidx.fragment.app.DialogFragment;
 import androidx.appcompat.app.AlertDialog;
-import android.view.View;
-import android.widget.Button;
-import android.widget.TextView;
-import android.widget.Toast;
+import androidx.fragment.app.DialogFragment;
+
 import com.google.zxing.integration.android.IntentIntegrator;
+
 import org.json.JSONException;
 import org.json.JSONObject;
 import org.torproject.android.R;
+import org.torproject.android.core.ClipboardUtils;
 import org.torproject.android.ui.hiddenservices.providers.CookieContentProvider;
 
 public class HSCookieDialog extends DialogFragment {
+    private String authCookieValue, onion;
 
     @NonNull
     @Override
     public Dialog onCreateDialog(Bundle savedInstanceState) {
-        final View dialog_view = getActivity().getLayoutInflater().inflate(R.layout.layout_hs_cookie, null);
-
         final Bundle arguments = getArguments();
-        final String auth_cookie_value = arguments.getString("auth_cookie_value");
-
-        final AlertDialog cookieDialog = new AlertDialog.Builder(getActivity())
-                .setView(dialog_view)
+        authCookieValue = arguments.getString("auth_cookie_value");
+        onion = arguments.getString("onion");
+        return new AlertDialog.Builder(getActivity())
+                .setTitle(authCookieValue)
+                .setItems(new CharSequence[]{
+                        getString(R.string.copy_cookie_to_clipboard),
+                        getString(R.string.share_as_qr)
+                }, (dialog, which) -> {
+                    if (which == 0) doCopy();
+                    else if (which == 1) doShareQr();
+                })
+                .setNegativeButton(android.R.string.cancel, (dialog, which) -> dialog.dismiss())
                 .create();
+    }
 
-        TextView cookie = dialog_view.findViewById(R.id.hs_cookie);
-        cookie.setText(auth_cookie_value);
-
-        Button clipboard = dialog_view.findViewById(R.id.hs_cookie_to_clipboard);
-        clipboard.setOnClickListener(v -> {
-            Context mContext = v.getContext();
-            ClipboardManager clipboard1 = (ClipboardManager) mContext.getSystemService(Context.CLIPBOARD_SERVICE);
-            ClipData clip = ClipData.newPlainText("cookie", auth_cookie_value);
-            clipboard1.setPrimaryClip(clip);
-            Toast.makeText(mContext, R.string.done, Toast.LENGTH_LONG).show();
-            cookieDialog.dismiss();
-        });
-
-        Button shareQR = dialog_view.findViewById(R.id.hs_cookie_to_qr);
-        shareQR.setOnClickListener(v -> {
-            try {
-                JSONObject backup = new JSONObject();
-                backup.put(CookieContentProvider.ClientCookie.DOMAIN, arguments.getString("onion"));
-                backup.put(CookieContentProvider.ClientCookie.AUTH_COOKIE_VALUE, arguments.getString("auth_cookie_value"));
-
-                IntentIntegrator integrator = new IntentIntegrator(getActivity());
-                integrator.shareText(backup.toString());
-
-            } catch (JSONException e) {
-                // TODO Auto-generated catch block
-                e.printStackTrace();
-            }
+    private void doShareQr() {
+        try {
+            JSONObject backup = new JSONObject();
+            backup.put(CookieContentProvider.ClientCookie.DOMAIN, onion);
+            backup.put(CookieContentProvider.ClientCookie.AUTH_COOKIE_VALUE, authCookieValue);
 
-            cookieDialog.dismiss();
-        });
+            new IntentIntegrator(getActivity()).shareText(backup.toString());
 
-        Button cancel = dialog_view.findViewById(R.id.hs_cookie_cancel);
-        cancel.setOnClickListener(v -> cookieDialog.dismiss());
+        } catch (JSONException e) {
+            e.printStackTrace();
+        }
+    }
 
-        return cookieDialog;
+    private void doCopy() {
+        if (authCookieValue != null)
+            ClipboardUtils.copyToClipboard("cookie", authCookieValue, getString(R.string.done), getContext());
     }
+
 }
diff --git a/app/src/main/java/org/torproject/android/ui/hiddenservices/dialogs/HSDataDialog.java b/app/src/main/java/org/torproject/android/ui/hiddenservices/dialogs/HSDataDialog.java
index 28c1d716..7d381921 100644
--- a/app/src/main/java/org/torproject/android/ui/hiddenservices/dialogs/HSDataDialog.java
+++ b/app/src/main/java/org/torproject/android/ui/hiddenservices/dialogs/HSDataDialog.java
@@ -1,21 +1,19 @@
 package org.torproject.android.ui.hiddenservices.dialogs;
 
-
 import android.app.Dialog;
 import android.content.ContentResolver;
 import android.content.ContentValues;
+import android.content.Context;
 import android.os.Bundle;
-
-import androidx.annotation.NonNull;
-import androidx.fragment.app.DialogFragment;
-import androidx.appcompat.app.AlertDialog;
-
 import android.view.View;
-import android.widget.Button;
 import android.widget.CheckBox;
 import android.widget.EditText;
 import android.widget.Toast;
 
+import androidx.annotation.NonNull;
+import androidx.appcompat.app.AlertDialog;
+import androidx.fragment.app.DialogFragment;
+
 import org.torproject.android.R;
 import org.torproject.android.ui.hiddenservices.providers.HSContentProvider;
 
@@ -24,42 +22,31 @@ public class HSDataDialog extends DialogFragment {
     @NonNull
     @Override
     public Dialog onCreateDialog(Bundle savedInstanceState) {
-        // Get the layout
         final View dialog_view = getActivity().getLayoutInflater().inflate(R.layout.layout_hs_data_dialog, null);
-
-        // Use the Builder class for convenient dialog construction
-        final AlertDialog serviceDataDialog = new AlertDialog.Builder(getActivity())
-                .setView(dialog_view)
+        return new AlertDialog.Builder(getActivity())
                 .setTitle(R.string.hidden_services)
+                .setNegativeButton(android.R.string.cancel, (dialog, which) -> dialog.cancel())
+                .setPositiveButton(R.string.save, (dialog, which) -> doSave(dialog_view, getContext()))
+                .setView(dialog_view)
                 .create();
+    }
 
-        // Buttons action
-        Button save = dialog_view.findViewById(R.id.HSDialogSave);
-        save.setOnClickListener(v -> {
-            String serverName = ((EditText) dialog_view.findViewById(R.id.hsName)).getText().toString();
-            int localPort, onionPort;
-            try {
-                localPort = Integer.parseInt(((EditText) dialog_view.findViewById(R.id.hsLocalPort)).getText().toString());
-                onionPort = Integer.parseInt(((EditText) dialog_view.findViewById(R.id.hsOnionPort)).getText().toString());
-            } catch (NumberFormatException nfe) {
-                Toast.makeText(v.getContext(), R.string.fields_can_t_be_empty, Toast.LENGTH_LONG).show();
-                return;
-            }
-            boolean authCookie = ((CheckBox) dialog_view.findViewById(R.id.hsAuth)).isChecked();
-
-            if (checkInput(serverName, localPort, onionPort)) {
-                saveData(serverName, localPort, onionPort, authCookie);
-                Toast.makeText(
-                        v.getContext(), R.string.please_restart_Orbot_to_enable_the_changes, Toast.LENGTH_LONG
-                ).show();
-                serviceDataDialog.dismiss();
-            }
-        });
-
-        Button cancel = dialog_view.findViewById(R.id.HSDialogCancel);
-        cancel.setOnClickListener(v -> serviceDataDialog.cancel());
+    private void doSave(View dialogView, Context context) {
+        String serverName = ((EditText) dialogView.findViewById(R.id.hsName)).getText().toString();
+        int localPort, onionPort;
+        try {
+            localPort = Integer.parseInt(((EditText) dialogView.findViewById(R.id.hsLocalPort)).getText().toString());
+            onionPort = Integer.parseInt(((EditText) dialogView.findViewById(R.id.hsOnionPort)).getText().toString());
+        } catch (NumberFormatException nfe) {
+            Toast.makeText(context, R.string.fields_can_t_be_empty, Toast.LENGTH_LONG).show();
+            return;
+        }
+        boolean authCookie = ((CheckBox) dialogView.findViewById(R.id.hsAuth)).isChecked();
 
-        return serviceDataDialog;
+        if (checkInput(serverName, localPort, onionPort)) {
+            saveData(serverName, localPort, onionPort, authCookie);
+            Toast.makeText(context, R.string.please_restart_Orbot_to_enable_the_changes, Toast.LENGTH_LONG).show();
+        }
     }
 
     private boolean checkInput(String serverName, int local, int remote) {
diff --git a/app/src/main/java/org/torproject/android/ui/hiddenservices/dialogs/HSDeleteDialog.java b/app/src/main/java/org/torproject/android/ui/hiddenservices/dialogs/HSDeleteDialog.java
index 2d817783..eb921d38 100644
--- a/app/src/main/java/org/torproject/android/ui/hiddenservices/dialogs/HSDeleteDialog.java
+++ b/app/src/main/java/org/torproject/android/ui/hiddenservices/dialogs/HSDeleteDialog.java
@@ -1,13 +1,13 @@
 package org.torproject.android.ui.hiddenservices.dialogs;
 
-
 import android.app.Dialog;
 import android.content.Context;
-import android.content.DialogInterface;
 import android.os.Bundle;
+
 import androidx.annotation.NonNull;
-import androidx.fragment.app.DialogFragment;
 import androidx.appcompat.app.AlertDialog;
+import androidx.fragment.app.DialogFragment;
+
 import org.torproject.android.R;
 import org.torproject.android.service.TorServiceConstants;
 import org.torproject.android.ui.hiddenservices.providers.HSContentProvider;
@@ -21,40 +21,30 @@ public class HSDeleteDialog extends DialogFragment {
     public Dialog onCreateDialog(Bundle savedInstanceState) {
         final Bundle arguments = getArguments();
         final Context context = getContext();
-
-        DialogInterface.OnClickListener dialogClickListener = (dialog, which) -> {
-            switch (which) {
-                case DialogInterface.BUTTON_POSITIVE:
-                    // Delete from db
-                    context.getContentResolver().delete(
-                            HSContentProvider.CONTENT_URI,
-                            HSContentProvider.HiddenService._ID + "=" + arguments.getInt("_id"),
-                            null);
-
-                    // Delete from internal storage
-                    String base = context.getFilesDir().getAbsolutePath() + "/" + TorServiceConstants.HIDDEN_SERVICES_DIR;
-                    File dir = new File(base, "hs" + arguments.getString("port"));
-
-                    if (dir.isDirectory()) {
-                        String[] children = dir.list();
-                        for (String aChildren : children) {
-                            new File(dir, aChildren).delete();
-                        }
-                        dir.delete();
-                    }
-
-                    break;
-
-                case DialogInterface.BUTTON_NEGATIVE:
-                    // Do nothing
-                    break;
-            }
-        };
-
         return new AlertDialog.Builder(context)
-                .setMessage(R.string.confirm_service_deletion)
-                .setPositiveButton(android.R.string.ok, dialogClickListener)
-                .setNegativeButton(android.R.string.cancel, dialogClickListener)
+                .setTitle(R.string.confirm_service_deletion)
+                .setPositiveButton(android.R.string.ok, (dialog, which) -> doDelete(arguments, context))
+                .setNegativeButton(android.R.string.cancel, (dialog, which) -> dialog.cancel())
                 .create();
     }
+
+    private void doDelete(Bundle arguments, Context context) {
+        context.getContentResolver().delete( // Delete from db
+                HSContentProvider.CONTENT_URI,
+                HSContentProvider.HiddenService._ID + "=" + arguments.getInt("_id"),
+                null);
+
+        // Delete from internal storage
+        String base = context.getFilesDir().getAbsolutePath() + "/" + TorServiceConstants.HIDDEN_SERVICES_DIR;
+        File dir = new File(base, "hs" + arguments.getString("port"));
+
+        if (dir.isDirectory()) {
+            String[] children = dir.list();
+            for (String aChildren : children) {
+                new File(dir, aChildren).delete();
+            }
+            dir.delete();
+        }
+    }
+
 }
diff --git a/app/src/main/java/org/torproject/android/ui/hiddenservices/permissions/PermissionManager.java b/app/src/main/java/org/torproject/android/ui/hiddenservices/permissions/PermissionManager.java
index af23919f..6d181967 100644
--- a/app/src/main/java/org/torproject/android/ui/hiddenservices/permissions/PermissionManager.java
+++ b/app/src/main/java/org/torproject/android/ui/hiddenservices/permissions/PermissionManager.java
@@ -1,20 +1,17 @@
 package org.torproject.android.ui.hiddenservices.permissions;
 
-
-import android.Manifest;
-import android.annotation.SuppressLint;
 import android.annotation.TargetApi;
 import android.content.Context;
 import android.content.Intent;
-import android.content.pm.PackageManager;
 import android.net.Uri;
 import android.os.Build;
 import android.os.PowerManager;
 import android.provider.Settings;
-import com.google.android.material.snackbar.Snackbar;
-import androidx.core.app.ActivityCompat;
+
 import androidx.fragment.app.FragmentActivity;
 
+import com.google.android.material.snackbar.Snackbar;
+
 import org.torproject.android.R;
 
 public class PermissionManager {
@@ -24,32 +21,8 @@ public class PermissionManager {
         return (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP);
     }
 
-    @SuppressLint("NewApi")
-    public static boolean hasExternalWritePermission(Context context) {
-        return (context.checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED);
-    }
-
-    public static void requestExternalWritePermissions(FragmentActivity activity, int action) {
-        final int mAction = action;
-        final FragmentActivity mActivity = activity;
-
-        if (ActivityCompat.shouldShowRequestPermissionRationale
-                (mActivity, Manifest.permission.WRITE_EXTERNAL_STORAGE)) {
-            Snackbar.make(mActivity.findViewById(android.R.id.content),
-                    R.string.please_grant_permissions_for_external_storage,
-                    Snackbar.LENGTH_INDEFINITE).setAction(R.string.activate,
-                    v -> ActivityCompat.requestPermissions(mActivity,
-                            new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},
-                            mAction)).show();
-        } else {
-            ActivityCompat.requestPermissions(mActivity,
-                    new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},
-                    mAction);
-        }
-    }
-
     @TargetApi(Build.VERSION_CODES.M)
-    public static void requestBatteryPermmssions(FragmentActivity activity, Context context) {
+    public static void requestBatteryPermissions(FragmentActivity activity, Context context) {
         final Context mContext = context;
         final String packageName = mContext.getPackageName();
         PowerManager pm = (PowerManager) mContext.getSystemService(Context.POWER_SERVICE);
@@ -69,7 +42,7 @@ public class PermissionManager {
     }
 
     @TargetApi(Build.VERSION_CODES.M)
-    public static void requestDropBatteryPermmssions(FragmentActivity activity, Context context) {
+    public static void requestDropBatteryPermissions(FragmentActivity activity, Context context) {
         final Context mContext = context;
 
         final String packageName = context.getPackageName();
diff --git a/app/src/main/java/org/torproject/android/ui/onboarding/CustomBridgesActivity.java b/app/src/main/java/org/torproject/android/ui/onboarding/CustomBridgesActivity.java
index 6d8ec842..f34a49cc 100644
--- a/app/src/main/java/org/torproject/android/ui/onboarding/CustomBridgesActivity.java
+++ b/app/src/main/java/org/torproject/android/ui/onboarding/CustomBridgesActivity.java
@@ -3,8 +3,6 @@
 package org.torproject.android.ui.onboarding;
 
 import android.annotation.SuppressLint;
-import android.content.ClipData;
-import android.content.ClipboardManager;
 import android.content.Intent;
 import android.net.Uri;
 import android.os.Bundle;
@@ -18,7 +16,6 @@ import android.view.MotionEvent;
 import android.view.View;
 import android.widget.EditText;
 import android.widget.TextView;
-import android.widget.Toast;
 
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
@@ -31,6 +28,7 @@ import com.google.zxing.integration.android.IntentResult;
 
 import org.json.JSONArray;
 import org.torproject.android.R;
+import org.torproject.android.core.ClipboardUtils;
 import org.torproject.android.service.OrbotService;
 import org.torproject.android.service.TorServiceConstants;
 import org.torproject.android.service.util.Prefs;
@@ -115,19 +113,11 @@ public class CustomBridgesActivity extends AppCompatActivity implements View.OnC
 
         switch (view.getId()) {
             case R.id.btCopyUrl:
-                ClipboardManager clipboard = (ClipboardManager) getSystemService(CLIPBOARD_SERVICE);
-
-                if (clipboard != null) {
-                    clipboard.setPrimaryClip(ClipData.newPlainText(URL_TOR_BRIDGES, URL_TOR_BRIDGES));
-
-                    Toast.makeText(this, R.string.done, Toast.LENGTH_LONG).show();
-                }
-
+                ClipboardUtils.copyToClipboard("bridge_url", URL_TOR_BRIDGES, getString(R.string.done), this);
                 break;
 
             case R.id.btScanQr:
                 integrator.initiateScan();
-
                 break;
 
             case R.id.btShareQr:
diff --git a/app/src/main/res/layout/layout_activity_client_cookies.xml b/app/src/main/res/layout/layout_activity_client_cookies.xml
index 9314255d..a0e66741 100644
--- a/app/src/main/res/layout/layout_activity_client_cookies.xml
+++ b/app/src/main/res/layout/layout_activity_client_cookies.xml
@@ -29,7 +29,8 @@
         android:layout_height="wrap_content"
         android:layout_gravity="bottom|end"
         android:layout_margin="@dimen/fab_margin"
-        app:srcCompat="@android:drawable/stat_notify_more"
-        app:backgroundTint="@android:color/darker_gray" />
+        android:tint="@android:color/black"
+        app:backgroundTint="@android:color/darker_gray"
+        app:srcCompat="@android:drawable/ic_input_add" />
 
 </androidx.coordinatorlayout.widget.CoordinatorLayout>
diff --git a/app/src/main/res/layout/layout_add_client_cookie_dialog.xml b/app/src/main/res/layout/layout_add_client_cookie_dialog.xml
index 9dc4950b..ec310a0c 100644
--- a/app/src/main/res/layout/layout_add_client_cookie_dialog.xml
+++ b/app/src/main/res/layout/layout_add_client_cookie_dialog.xml
@@ -3,15 +3,11 @@
     android:layout_width="match_parent"
     android:layout_height="wrap_content"
     android:orientation="vertical"
-    android:paddingLeft="5dp"
-    android:paddingTop="5dp"
-    android:paddingRight="5dp"
-    android:paddingBottom="5dp">
+    android:padding="?dialogPreferredPadding">
 
     <TextView
         android:layout_width="match_parent"
         android:layout_height="wrap_content"
-        android:paddingLeft="5dp"
         android:text="@string/onion"
         android:textAppearance="@style/TextAppearance.AppCompat.Widget.PopupMenu.Small" />
 
@@ -25,7 +21,6 @@
     <TextView
         android:layout_width="match_parent"
         android:layout_height="wrap_content"
-        android:paddingLeft="5dp"
         android:text="@string/auth_cookie"
         android:textAppearance="@style/TextAppearance.AppCompat.Widget.PopupMenu.Small" />
 
@@ -35,28 +30,4 @@
         android:layout_height="wrap_content"
         android:ems="10"
         android:inputType="text" />
-
-    <LinearLayout
-        android:layout_width="match_parent"
-        android:layout_height="match_parent"
-        android:orientation="horizontal">
-
-        <Button
-            android:id="@+id/cookie_dialog_cancel"
-            style="@style/Widget.AppCompat.Button.Borderless.Colored"
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:layout_weight="1"
-            android:text="@android:string/cancel" />
-
-        <Button
-            android:id="@+id/cookie_dialog_save"
-            style="@style/Widget.AppCompat.Button.Borderless.Colored"
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:layout_weight="1"
-            android:text="@string/save" />
-
-    </LinearLayout>
-
-</LinearLayout>
\ No newline at end of file
+</LinearLayout>
diff --git a/app/src/main/res/layout/layout_client_cookie_list_item.xml b/app/src/main/res/layout/layout_client_cookie_list_item.xml
index 213ba6cb..90b86464 100644
--- a/app/src/main/res/layout/layout_client_cookie_list_item.xml
+++ b/app/src/main/res/layout/layout_client_cookie_list_item.xml
@@ -7,7 +7,7 @@
 
     <TextView
         android:id="@+id/cookie_onion"
-        android:layout_width="match_parent"
+        android:layout_width="0dp"
         android:layout_height="wrap_content"
         android:textSize="18sp"
         android:layout_weight="1" />
diff --git a/app/src/main/res/layout/layout_cookie_actions.xml b/app/src/main/res/layout/layout_cookie_actions.xml
deleted file mode 100644
index 86928029..00000000
--- a/app/src/main/res/layout/layout_cookie_actions.xml
+++ /dev/null
@@ -1,27 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android";
-    android:layout_width="match_parent"
-    android:layout_height="match_parent"
-    android:orientation="vertical"
-    android:paddingLeft="20dp"
-    android:paddingRight="20dp">
-
-    <Button
-        android:id="@+id/btn_cookie_backup"
-        android:layout_width="match_parent"
-        android:layout_height="wrap_content"
-        android:text="@string/backup_cookie" />
-
-    <Button
-        android:id="@+id/btn_cookie_delete"
-        android:layout_width="match_parent"
-        android:layout_height="wrap_content"
-        android:text="@string/delete_cookie" />
-
-    <Button
-        android:id="@+id/btn_cookie_cancel"
-        android:layout_width="match_parent"
-        android:layout_height="wrap_content"
-        android:text="@android:string/cancel" />
-
-</LinearLayout>
\ No newline at end of file
diff --git a/app/src/main/res/layout/layout_hs_actions.xml b/app/src/main/res/layout/layout_hs_actions.xml
deleted file mode 100644
index e3cecbec..00000000
--- a/app/src/main/res/layout/layout_hs_actions.xml
+++ /dev/null
@@ -1,36 +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="match_parent">
-
-    <Button
-        android:text="@string/copy_address_to_clipboard"
-        android:layout_width="match_parent"
-        android:layout_height="wrap_content"
-        android:id="@+id/btn_hs_clipboard" />
-
-    <Button
-        android:text="@string/show_auth_cookie"
-        android:layout_width="match_parent"
-        android:layout_height="wrap_content"
-        android:id="@+id/bt_hs_show_auth" />
-
-    <Button
-        android:text="@string/backup_service"
-        android:layout_width="match_parent"
-        android:layout_height="wrap_content"
-        android:id="@+id/btn_hs_backup" />
-
-    <Button
-        android:text="@string/delete_service"
-        android:layout_width="match_parent"
-        android:layout_height="wrap_content"
-        android:id="@+id/btn_hs_delete" />
-
-    <Button
-        android:text="@android:string/cancel"
-        android:layout_width="match_parent"
-        android:layout_height="wrap_content"
-        android:id="@+id/btn_hs_cancel" />
-
-</LinearLayout>
\ No newline at end of file
diff --git a/app/src/main/res/layout/layout_hs_cookie.xml b/app/src/main/res/layout/layout_hs_cookie.xml
deleted file mode 100644
index abb7d33f..00000000
--- a/app/src/main/res/layout/layout_hs_cookie.xml
+++ /dev/null
@@ -1,32 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android";
-    android:layout_width="match_parent"
-    android:layout_height="match_parent"
-    android:orientation="vertical">
-
-    <TextView
-        android:id="@+id/hs_cookie"
-        android:layout_width="match_parent"
-        android:layout_height="wrap_content"
-        android:paddingLeft="5dp"
-        android:paddingTop="5dp"
-        android:paddingBottom="5dp" />
-
-    <Button
-        android:id="@+id/hs_cookie_to_clipboard"
-        android:layout_width="match_parent"
-        android:layout_height="wrap_content"
-        android:text="@string/copy_cookie_to_clipboard" />
-
-    <Button
-        android:id="@+id/hs_cookie_to_qr"
-        android:layout_width="match_parent"
-        android:layout_height="wrap_content"
-        android:text="@string/share_as_qr" />
-
-    <Button
-        android:id="@+id/hs_cookie_cancel"
-        android:layout_width="match_parent"
-        android:layout_height="wrap_content"
-        android:text="@android:string/cancel" />
-</LinearLayout>
\ No newline at end of file
diff --git a/app/src/main/res/layout/layout_hs_data_dialog.xml b/app/src/main/res/layout/layout_hs_data_dialog.xml
index df18718f..0d86fbb7 100644
--- a/app/src/main/res/layout/layout_hs_data_dialog.xml
+++ b/app/src/main/res/layout/layout_hs_data_dialog.xml
@@ -3,15 +3,11 @@
     android:layout_width="match_parent"
     android:layout_height="wrap_content"
     android:orientation="vertical"
-    android:paddingLeft="5dp"
-    android:paddingTop="5dp"
-    android:paddingRight="5dp"
-    android:paddingBottom="5dp">
+    android:padding="?dialogPreferredPadding">
 
     <TextView
         android:layout_width="match_parent"
         android:layout_height="wrap_content"
-        android:paddingLeft="5dp"
         android:text="@string/name"
         android:textAppearance="@style/TextAppearance.AppCompat.Widget.PopupMenu.Small" />
 
@@ -25,7 +21,6 @@
     <TextView
         android:layout_width="match_parent"
         android:layout_height="wrap_content"
-        android:paddingLeft="5dp"
         android:text="@string/local_port"
         android:textAppearance="@style/TextAppearance.AppCompat.Widget.PopupMenu.Small" />
 
@@ -39,7 +34,6 @@
     <TextView
         android:layout_width="match_parent"
         android:layout_height="wrap_content"
-        android:paddingLeft="5dp"
         android:text="@string/onion_port"
         android:textAppearance="@style/TextAppearance.AppCompat.Widget.PopupMenu.Small" />
 
@@ -54,31 +48,7 @@
         android:id="@+id/hsAuth"
         android:layout_width="match_parent"
         android:layout_height="wrap_content"
-        android:paddingTop="5dp"
-        android:paddingBottom="10dp"
-        android:text="@string/auth_cookie" />
-
-    <LinearLayout
-        android:layout_width="match_parent"
-        android:layout_height="match_parent"
-        android:orientation="horizontal">
-
-        <Button
-            android:id="@+id/HSDialogCancel"
-            style="@style/Widget.AppCompat.Button.Borderless.Colored"
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:layout_weight="1"
-            android:text="@android:string/cancel" />
-
-        <Button
-            android:id="@+id/HSDialogSave"
-            style="@style/Widget.AppCompat.Button.Borderless.Colored"
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:layout_weight="1"
-            android:text="@string/save" />
-
-    </LinearLayout>
+        android:text="@string/auth_cookie"
+        android:textAppearance="@style/TextAppearance.AppCompat.Widget.PopupMenu.Small" />
 
 </LinearLayout>
diff --git a/app/src/main/res/layout/layout_hs_list_item.xml b/app/src/main/res/layout/layout_hs_list_item.xml
index 8f603bd9..54a95912 100644
--- a/app/src/main/res/layout/layout_hs_list_item.xml
+++ b/app/src/main/res/layout/layout_hs_list_item.xml
@@ -1,59 +1,49 @@
 <?xml version="1.0" encoding="utf-8"?>
 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android";
-    xmlns:tools="http://schemas.android.com/tools";
     android:layout_width="match_parent"
-    android:layout_height="match_parent"
-    android:orientation="vertical">
+    android:layout_height="wrap_content"
+    android:orientation="horizontal"
+    android:paddingLeft="15dp"
+    android:paddingRight="15dp">
+
+    <TextView
+        android:id="@+id/hs_port"
+        android:layout_width="wrap_content"
+        android:layout_height="match_parent"
+        android:paddingTop="10dp"
+        android:paddingRight="10dp"
+        android:textSize="35sp" />
 
     <LinearLayout
-        android:layout_width="match_parent"
+        android:layout_width="0dp"
         android:layout_height="wrap_content"
-        android:orientation="horizontal"
-        android:paddingLeft="15dp"
-        android:paddingRight="15dp"
-        tools:paddingLeft="15dp"
-        tools:paddingRight="15dp">
+        android:layout_weight="1"
+        android:orientation="vertical">
 
         <TextView
-            android:id="@+id/hs_port"
-            android:layout_width="wrap_content"
-            android:layout_height="match_parent"
-            android:paddingTop="10dp"
-            android:paddingRight="10dp"
-            android:textSize="35sp" />
-
-        <LinearLayout
+            android:id="@+id/hs_name"
             android:layout_width="match_parent"
             android:layout_height="wrap_content"
-            android:layout_weight="1"
-            android:orientation="vertical">
-
-            <TextView
-                android:id="@+id/hs_name"
-                android:layout_width="match_parent"
-                android:layout_height="wrap_content"
-                android:paddingLeft="10dp"
-                android:paddingBottom="10dp"
-                android:textSize="24sp" />
-
-            <TextView
-                android:id="@+id/hs_onion"
-                android:layout_width="match_parent"
-                android:layout_height="wrap_content"
-                android:paddingLeft="10dp"
-                android:paddingBottom="10dp"
-                android:textSize="18sp" />
-
-        </LinearLayout>
+            android:paddingLeft="10dp"
+            android:paddingBottom="10dp"
+            android:textSize="24sp" />
 
-        <androidx.appcompat.widget.SwitchCompat
-            android:id="@+id/hs_switch"
-            android:layout_width="wrap_content"
+        <TextView
+            android:id="@+id/hs_onion"
+            android:layout_width="match_parent"
             android:layout_height="wrap_content"
-            android:focusable="false"
-            android:focusableInTouchMode="false"
-            android:switchPadding="30dp" />
+            android:paddingLeft="10dp"
+            android:paddingBottom="10dp"
+            android:textSize="18sp" />
 
     </LinearLayout>
 
-</LinearLayout>
\ No newline at end of file
+    <androidx.appcompat.widget.SwitchCompat
+        android:id="@+id/hs_switch"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:focusable="false"
+        android:focusableInTouchMode="false"
+        android:switchPadding="30dp" />
+
+</LinearLayout>
diff --git a/app/src/main/res/layout/layout_hs_list_view.xml b/app/src/main/res/layout/layout_hs_list_view.xml
index e4171949..5e39ba2a 100644
--- a/app/src/main/res/layout/layout_hs_list_view.xml
+++ b/app/src/main/res/layout/layout_hs_list_view.xml
@@ -27,7 +27,8 @@
         android:layout_height="wrap_content"
         android:layout_gravity="bottom|end"
         android:layout_margin="@dimen/fab_margin"
-        app:srcCompat="@android:drawable/stat_notify_more"
-        app:backgroundTint="@android:color/darker_gray" />
+        android:tint="@android:color/black"
+        app:backgroundTint="@android:color/darker_gray"
+        app:srcCompat="@android:drawable/ic_input_add" />
 
 </androidx.coordinatorlayout.widget.CoordinatorLayout>
\ No newline at end of file
diff --git a/app/src/main/res/values-ar/strings.xml b/app/src/main/res/values-ar/strings.xml
index 1564d1f4..ab6cb4ff 100644
--- a/app/src/main/res/values-ar/strings.xml
+++ b/app/src/main/res/values-ar/strings.xml
@@ -123,7 +123,6 @@
   <string name="restart_orbot_to_use_this_bridge_">اÙ?رجاء إعادة تشغÙ?Ù? Ø£Ù?ربÙ?ت Ù?تÙ?عÙ?Ù? اÙ?تعدÙ?Ù?ات</string>
   <string name="menu_qr">رÙ?ز Ù?Ù?Ù? آر</string>
   <string name="get_bridges_email">اÙ?برÙ?د اÙ?Ø¥Ù?Ù?ترÙ?Ù?Ù?</string>
-  <string name="activate">تÙ?عÙ?Ù?</string>
   <string name="apps_mode">Ù?ضع اÙ?Ù? VPN</string>
   <string name="send_email">أرسÙ? برÙ?د اÙ?Ù?ترÙ?Ù?Ù?</string>
   <string name="vpn_default_world">شاÙ?Ù? (تÙ?Ù?ائÙ?)</string>
@@ -143,7 +142,8 @@
   <string name="backup_saved_at_external_storage">تÙ?ت عÙ?Ù?Ù?Ø© Ø­Ù?ظ اÙ?Ù?سخة اÙ?إحتÙ?اطÙ?Ø© Ù?Ù? ذاÙ?رة اÙ?تخزÙ?Ù? اÙ?خارجÙ?Ø©</string>
   <string name="backup_restored">تÙ?ت استعادة اÙ?Ù?سخة اÙ?إحتÙ?اطÙ?Ø©</string>
   <string name="restore_backup">إسترجاع Ù?سخة احتÙ?اطÙ?Ø©</string>
-    <string name="name_can_t_be_empty">Ù?ا Ù?Ù?Ù?Ù? ترÙ? اÙ?إسÙ? Ù?ارغا</string>
+  <string name="create_a_backup_first">Ù?Ù? Ø£Ù?Ù?اÙ? بإÙ?شاء Ù?سخة إحتÙ?اطÙ?Ø©</string>
+  <string name="name_can_t_be_empty">Ù?ا Ù?Ù?Ù?Ù? ترÙ? اÙ?إسÙ? Ù?ارغا</string>
   <string name="fields_can_t_be_empty">Ù?ا Ù?Ù?Ù?Ù? ترÙ? اÙ?Ø­Ù?Ù?Ù? Ù?ارغة</string>
   <string name="start_tor_again_for_finish_the_process">Ù?Ù? بتشغÙ?Ù? تÙ?ر ثاÙ?Ù?Ø©Ù? Ù?Ø¥Ù?Ù?اء اÙ?عÙ?Ù?Ù?Ø©</string>
   <string name="confirm_service_deletion">تأÙ?Ù?د حذÙ? اÙ?خدÙ?Ø©</string>
diff --git a/app/src/main/res/values-ay/strings.xml b/app/src/main/res/values-ay/strings.xml
index 7c1c60f1..8a0582c9 100644
--- a/app/src/main/res/values-ay/strings.xml
+++ b/app/src/main/res/values-ay/strings.xml
@@ -127,7 +127,6 @@
   <string name="menu_qr">QR chimpunaka</string>
   <string name="if_your_mobile_network_actively_blocks_tor_you_can_use_a_tor_bridge_to_access_the_network_another_way_to_get_bridges_is_to_send_an_email_to_bridges_torproject_org_please_note_that_you_must_send_the_email_using_an_address_from_one_of_the_following_email_providers_riseup_gmail_or_yahoo_">Jawsañ apnaqirinakax Tor jark\'antañ yatipk ukjax \'Jalakipañ yanapiri\' mantañatak apnaqarakismawa. Yant\'añataki, mayjt\'ayañatakix AJLLT\'AM...</string>
   <string name="get_bridges_email">Imaylu (Email)</string>
-  <string name="activate">Qhantayaña</string>
   <string name="apps_mode">VPN</string>
   <string name="send_email">Qillqat apayaña</string>
   <string name="vpn_default_world">Uraqpacha (justupaki)</string>
@@ -146,9 +145,9 @@
   <string name="delete_service">Lurañanak pichsuña</string>
   <string name="backup_saved_at_external_storage">Imat luratanakamax yaqha yänakar imataxiwa</string>
   <string name="backup_restored">Imat luratanakamax mayamp apnaqatäxiwa</string>
-  <string name="please_grant_permissions_for_external_storage">Yaqha yänakar imañatak iyaw sam, amp suma</string>
-  <string name="restore_backup">Imat luratanak mayamp aqtayam</string>
-    <string name="name_can_t_be_empty">Sutix qillqantatäñapapuniwa</string>
+    <string name="restore_backup">Imat luratanak mayamp aqtayam</string>
+  <string name="create_a_backup_first"> Imat luratanak nayraqat uñstayam</string>
+  <string name="name_can_t_be_empty">Sutix qillqantatäñapapuniwa</string>
   <string name="fields_can_t_be_empty">Janiw kunas ch\'usäñapakiti</string>
   <string name="start_tor_again_for_finish_the_process">Tukuyañatakix Tor mayamp naktayam</string>
   <string name="confirm_service_deletion">Lurañanakax pichsutäniwa</string>
diff --git a/app/src/main/res/values-az/strings.xml b/app/src/main/res/values-az/strings.xml
index d1bab868..266a754a 100644
--- a/app/src/main/res/values-az/strings.xml
+++ b/app/src/main/res/values-az/strings.xml
@@ -123,7 +123,6 @@ LibEvent v2.0.21: http://www.monkey.org/~provos/libevent/</string>
   <string name="restart_orbot_to_use_this_bridge_">LütfÉ?n, Orbotu söndürün vÉ? yenidÉ?n yandırın ki, dÉ?yiÅ?ikliklÉ?r tÉ?tbiq edilsin.</string>
   <string name="menu_qr">QR kodlar</string>
   <string name="get_bridges_email">Emeyl</string>
-  <string name="activate">AktivlÉ?Å?dir</string>
   <string name="send_email">Emeyl göndÉ?rin</string>
   <string name="save">Saxla</string>
   <string name="name">Ad</string>
diff --git a/app/src/main/res/values-be/strings.xml b/app/src/main/res/values-be/strings.xml
index 5aecd806..1f189531 100644
--- a/app/src/main/res/values-be/strings.xml
+++ b/app/src/main/res/values-be/strings.xml
@@ -127,7 +127,6 @@
   <string name="menu_qr">QR-кодÑ?</string>
   <string name="if_your_mobile_network_actively_blocks_tor_you_can_use_a_tor_bridge_to_access_the_network_another_way_to_get_bridges_is_to_send_an_email_to_bridges_torproject_org_please_note_that_you_must_send_the_email_using_an_address_from_one_of_the_following_email_providers_riseup_gmail_or_yahoo_">Ð?алÑ? ваÑ?а мабÑ?лÑ?наÑ? Ñ?еÑ?ка акÑ?Ñ?Ñ?на блакÑ?е Tor, вÑ? можаÑ?е вÑ?каÑ?Ñ?Ñ?Ñ?оÑ?ваÑ?Ñ? маÑ?Ñ?Ñ? Tor длÑ? доÑ?Ñ?Ñ?пÑ? да Ñ?еÑ?кÑ?. Ð?бÑ?Ñ?Ñ?Ñ?е адзÑ?н з ваÑ?Ñ?Ñ?нÑ?аÑ? длÑ? наладÑ? Ñ? Ñ?Ñ?Ñ?Ñ?аваннÑ?:</string>
   <string name="get_bridges_email">Эл. поÑ?Ñ?а</string>
-  <string name="activate">Ð?кÑ?Ñ?ваÑ?Ñ?Ñ?</string>
   <string name="apps_mode">VPN-Ñ?Ñ?жÑ?м</string>
   <string name="send_email">Ð?дпÑ?авÑ?Ñ?Ñ? лÑ?Ñ?Ñ?</string>
   <string name="vpn_default_world">СвеÑ? (аÑ?Ñ?а)</string>
@@ -146,9 +145,9 @@
   <string name="delete_service">Ð?Ñ?далÑ?Ñ?Ñ? Ñ?лÑ?жбÑ?</string>
   <string name="backup_saved_at_external_storage">РÑ?зеÑ?воваÑ? копÑ?Ñ? заÑ?авана на вонкавÑ?м Ñ?Ñ?овÑ?Ñ?Ñ?Ñ?</string>
   <string name="backup_restored">Ð?дноÑ?лена з Ñ?Ñ?зеÑ?вовай копÑ?Ñ?</string>
-  <string name="please_grant_permissions_for_external_storage">Ð?айÑ?е дазвол длÑ? доÑ?Ñ?Ñ?пÑ? да вонкавага Ñ?Ñ?овÑ?Ñ?Ñ?а</string>
-  <string name="restore_backup">Ð?днавÑ?Ñ?Ñ? з копÑ?Ñ?</string>
-    <string name="name_can_t_be_empty">Ð?мÑ? не можа бÑ?Ñ?Ñ? пÑ?Ñ?Ñ?Ñ?м</string>
+    <string name="restore_backup">Ð?днавÑ?Ñ?Ñ? з копÑ?Ñ?</string>
+  <string name="create_a_backup_first">СпаÑ?аÑ?кÑ? Ñ?Ñ?ваÑ?Ñ?Ñ?е Ñ?Ñ?зеÑ?вовÑ?Ñ? копÑ?Ñ?</string>
+  <string name="name_can_t_be_empty">Ð?мÑ? не можа бÑ?Ñ?Ñ? пÑ?Ñ?Ñ?Ñ?м</string>
   <string name="fields_can_t_be_empty">Ð?алÑ? не могÑ?Ñ?Ñ? бÑ?Ñ?Ñ? пÑ?Ñ?Ñ?Ñ?мÑ?</string>
   <string name="start_tor_again_for_finish_the_process">Ð?апÑ?Ñ?Ñ?Ñ?Ñ?е Tor Ñ?зноÑ? длÑ? завÑ?Ñ?Ñ?Ñ?ннÑ? пÑ?аÑ?Ñ?Ñ?Ñ?</string>
   <string name="confirm_service_deletion">Ð?аÑ?веÑ?джанне вÑ?даленнÑ? Ñ?лÑ?жбÑ?</string>
diff --git a/app/src/main/res/values-bg/strings.xml b/app/src/main/res/values-bg/strings.xml
index 332f7479..2d4c6f86 100644
--- a/app/src/main/res/values-bg/strings.xml
+++ b/app/src/main/res/values-bg/strings.xml
@@ -121,7 +121,6 @@
   <string name="restart_orbot_to_use_this_bridge_">Ð?олÑ?, Ñ?еÑ?Ñ?аÑ?Ñ?иÑ?ай Orbot, за да влÑ?заÑ? в дейÑ?Ñ?вие пÑ?омениÑ?е</string>
   <string name="menu_qr">QR Ð?одове</string>
   <string name="get_bridges_email">Ð?мейл</string>
-  <string name="activate">Ð?кÑ?ивиÑ?ай</string>
   <string name="send_email">Ð?зпÑ?аÑ?и имейл</string>
   <string name="hidden_services">СкÑ?иÑ?и Ñ?Ñ?лÑ?ги</string>
   <string name="title_activity_hidden_services">СкÑ?иÑ?и Ñ?Ñ?лÑ?ги</string>
diff --git a/app/src/main/res/values-bn/strings.xml b/app/src/main/res/values-bn/strings.xml
index 6d7a8dbc..cc14837c 100644
--- a/app/src/main/res/values-bn/strings.xml
+++ b/app/src/main/res/values-bn/strings.xml
@@ -8,7 +8,7 @@
   <string name="main_layout_download">ডা�নল�ড</string>
     <string name="button_about">সম�বন�ধ�</string>
   <string name="menu_exit">বন�ধ</string>
-  <!--Welcome Wizard strings (DJH)-->
+    <!--Welcome Wizard strings (DJH)-->
     <!--END Welcome Wizard strings (DJH)-->
   <string name="pref_general_group">সাধারণ</string>
   <!--New Wizard Strings-->
diff --git a/app/src/main/res/values-brx/strings.xml b/app/src/main/res/values-brx/strings.xml
index ca3772cd..a8ca57e7 100644
--- a/app/src/main/res/values-brx/strings.xml
+++ b/app/src/main/res/values-brx/strings.xml
@@ -2,7 +2,7 @@
 <resources>
   <string name="menu_settings">स��ि���स</string>
     <string name="menu_exit">����ारला�</string>
-  <!--Welcome Wizard strings (DJH)-->
+    <!--Welcome Wizard strings (DJH)-->
   <!--END Welcome Wizard strings (DJH)-->
   <!--New Wizard Strings-->
   <!--Title Screen-->
diff --git a/app/src/main/res/values-bs/strings.xml b/app/src/main/res/values-bs/strings.xml
index f1e5db8f..17595009 100644
--- a/app/src/main/res/values-bs/strings.xml
+++ b/app/src/main/res/values-bs/strings.xml
@@ -1,7 +1,7 @@
 <?xml version='1.0' encoding='UTF-8'?>
 <resources>
   <string name="menu_settings">Postavke</string>
-  <!--Welcome Wizard strings (DJH)-->
+    <!--Welcome Wizard strings (DJH)-->
     <!--END Welcome Wizard strings (DJH)-->
   <string name="pref_general_group">Osnovno</string>
   <!--New Wizard Strings-->
@@ -11,7 +11,6 @@
   <!--TipsAndTricks screen-->
   <!--Transparent Proxy screen-->
     <string name="set_locale_title">Jezik</string>
-  <string name="activate">Aktiviraj</string>
   <string name="save">SaÄ?uvaj</string>
   <string name="name">Ime</string>
 </resources>
diff --git a/app/src/main/res/values-ca/strings.xml b/app/src/main/res/values-ca/strings.xml
index 2699bcbe..a090964d 100644
--- a/app/src/main/res/values-ca/strings.xml
+++ b/app/src/main/res/values-ca/strings.xml
@@ -127,7 +127,6 @@
   <string name="menu_qr">Codis QR</string>
   <string name="if_your_mobile_network_actively_blocks_tor_you_can_use_a_tor_bridge_to_access_the_network_another_way_to_get_bridges_is_to_send_an_email_to_bridges_torproject_org_please_note_that_you_must_send_the_email_using_an_address_from_one_of_the_following_email_providers_riseup_gmail_or_yahoo_">Si la teva xarxa mòbil boqueja activament Tor, pots utilitzar un \'Servidor pont\' com a via alternativa. SELECCIONA una de les opcions per configurar i provar.</string>
   <string name="get_bridges_email">Correu-e</string>
-  <string name="activate">Activa</string>
   <string name="apps_mode">Mode VPN</string>
     <string name="send_email">Envia correu-e</string>
   <string name="vpn_default_world">Global (auto)</string>
@@ -146,9 +145,9 @@
   <string name="delete_service">Esborrar servei</string>
   <string name="backup_saved_at_external_storage">Còpia de seguretat desada a emmagatzematge extern</string>
   <string name="backup_restored">Còpia de seguretat restaurada</string>
-  <string name="please_grant_permissions_for_external_storage">Si us plau concedeix permisos per emmagatzematge extern</string>
     <string name="restore_backup">Restaurar còpia de seguretat</string>
-    <string name="name_can_t_be_empty">El nom no pot estar buit</string>
+  <string name="create_a_backup_first">Crea una còpia de seguretat primer</string>
+  <string name="name_can_t_be_empty">El nom no pot estar buit</string>
   <string name="fields_can_t_be_empty">Els camps no poden estar buits</string>
   <string name="start_tor_again_for_finish_the_process">Torna a iniciar Tor per acabar el procés</string>
   <string name="confirm_service_deletion">Confirma la supressió del servei</string>
diff --git a/app/src/main/res/values-cs-rCZ/strings.xml b/app/src/main/res/values-cs-rCZ/strings.xml
index d182355a..b262d02d 100644
--- a/app/src/main/res/values-cs-rCZ/strings.xml
+++ b/app/src/main/res/values-cs-rCZ/strings.xml
@@ -120,7 +120,6 @@
   <string name="restart_orbot_to_use_this_bridge_">Pro projevení zmÄ?n restartujte Orbot</string>
   <string name="menu_qr">QR kódy</string>
   <string name="get_bridges_email">Email</string>
-  <string name="activate">Aktivovat</string>
   <string name="send_email">Pošli email</string>
   <string name="save">Uložit</string>
   <string name="name">Jméno</string>
diff --git a/app/src/main/res/values-cs/strings.xml b/app/src/main/res/values-cs/strings.xml
index 8961fb78..092ff884 100644
--- a/app/src/main/res/values-cs/strings.xml
+++ b/app/src/main/res/values-cs/strings.xml
@@ -17,7 +17,7 @@
     <string name="menu_exit">Konec</string>
   <string name="menu_scan">Skenovat QR kód bridge</string>
   <string name="menu_share_bridge">Sdílet QR kód bridge</string>
-  <!--Welcome Wizard strings (DJH)-->
+    <!--Welcome Wizard strings (DJH)-->
   <string name="wizard_details">Detaily o Orbotu</string>
     <!--END Welcome Wizard strings (DJH)-->
   <string name="pref_general_group">Hlavní</string>
@@ -33,7 +33,6 @@
   <string name="bridges">PÅ?emostÄ?ní</string>
     <string name="set_locale_title">Jazyk</string>
     <string name="get_bridges_email">Email</string>
-  <string name="activate">Aktivovat</string>
   <string name="hidden_services">Skryté Služby</string>
   <string name="title_activity_hidden_services">Skryté Služby</string>
   <string name="menu_hidden_services">Skryté Služby</string>
diff --git a/app/src/main/res/values-cy/strings.xml b/app/src/main/res/values-cy/strings.xml
index 5a963b08..511ad59c 100644
--- a/app/src/main/res/values-cy/strings.xml
+++ b/app/src/main/res/values-cy/strings.xml
@@ -33,7 +33,6 @@
   <string name="enter_exclude_nodes">I mewn i Nodau Eithrio</string>
     <string name="third_party_software">Meddalwedd 3ydd-parti</string>
     <string name="set_locale_title">Iaith</string>
-    <string name="activate">Ysgogi</string>
   <string name="hidden_services">Gwasanaethau Cudd</string>
   <string name="title_activity_hidden_services">Gwasanaethau Cudd</string>
   <string name="menu_hidden_services">Gwasanaethau Cudd</string>
diff --git a/app/src/main/res/values-da/strings.xml b/app/src/main/res/values-da/strings.xml
index 32f0d624..5263007f 100644
--- a/app/src/main/res/values-da/strings.xml
+++ b/app/src/main/res/values-da/strings.xml
@@ -95,7 +95,6 @@
   <string name="kb">KB</string>
   <string name="mb">MB</string>
   <string name="get_bridges_email">Mail</string>
-  <string name="activate">Aktiver</string>
   <string name="hidden_services">Skjulte tjenester</string>
   <string name="title_activity_hidden_services">Skjulte tjenester</string>
   <string name="menu_hidden_services">Skjulte tjenester</string>
diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml
index caff5d8a..8bbadf91 100644
--- a/app/src/main/res/values-de/strings.xml
+++ b/app/src/main/res/values-de/strings.xml
@@ -127,7 +127,6 @@
   <string name="menu_qr">QR Codes</string>
   <string name="if_your_mobile_network_actively_blocks_tor_you_can_use_a_tor_bridge_to_access_the_network_another_way_to_get_bridges_is_to_send_an_email_to_bridges_torproject_org_please_note_that_you_must_send_the_email_using_an_address_from_one_of_the_following_email_providers_riseup_gmail_or_yahoo_">Wenn Ihr mobiles Netzwerk Tor blockiert, können Sie einen \"Brücken-Server\" als alternativen Weg verwenden. Wählen Sie eine der Optionen zum Konfigurieren und Testen ..,.</string>
   <string name="get_bridges_email">E-Mail</string>
-  <string name="activate">Aktivieren</string>
   <string name="apps_mode">VPN Modus</string>
     <string name="send_email">E-Mail senden</string>
   <string name="vpn_default_world">Global (Automatisch)</string>
@@ -146,9 +145,9 @@
   <string name="delete_service">Dienst löschen</string>
   <string name="backup_saved_at_external_storage">Sicherung auf externem Speicher gespeichert </string>
   <string name="backup_restored">Sicherung wiederhergestellt</string>
-  <string name="please_grant_permissions_for_external_storage">Bitte Zugriffsrechte auf externen Speicher gewähren</string>
     <string name="restore_backup">Sicherung wiederherstellen</string>
-    <string name="name_can_t_be_empty">Name darf nicht leer sein</string>
+  <string name="create_a_backup_first">Erstellen Sie zuerst eine Sicherung</string>
+  <string name="name_can_t_be_empty">Name darf nicht leer sein</string>
   <string name="fields_can_t_be_empty">Felder dürfen nicht leer sein</string>
   <string name="start_tor_again_for_finish_the_process">Tor neu starten, um den Vorgang abzuschlieÃ?en</string>
   <string name="confirm_service_deletion">Löschen des Dienst bestätigen</string>
diff --git a/app/src/main/res/values-el/strings.xml b/app/src/main/res/values-el/strings.xml
index 87a67ce3..d9ce51a4 100644
--- a/app/src/main/res/values-el/strings.xml
+++ b/app/src/main/res/values-el/strings.xml
@@ -127,7 +127,6 @@
   <string name="menu_qr">Î?Ï?δικεÏ? QR</string>
   <string name="if_your_mobile_network_actively_blocks_tor_you_can_use_a_tor_bridge_to_access_the_network_another_way_to_get_bridges_is_to_send_an_email_to_bridges_torproject_org_please_note_that_you_must_send_the_email_using_an_address_from_one_of_the_following_email_providers_riseup_gmail_or_yahoo_">Î?ν Ï?ο δίκÏ?Ï?ο κινηÏ?ήÏ? Ï?ηλεÏ?Ï?νίαÏ? Ï?αÏ? μÏ?λοκάÏ?ει ενεÏ?γά Ï?ο Tor, μÏ?οÏ?είÏ?ε να Ï?Ï?ηÏ?ιμοÏ?οιήÏ?εÏ?ε μια γέÏ?Ï?Ï?α για να έÏ?εÏ?ε Ï?Ï?Ï?Ï?βαÏ?η Ï?Ï?ο δίκÏ?Ï?ο. Î?ΠÎ?Î?Î?Î?ΤÎ? έναν αÏ?Ï? Ï?οÏ?Ï? Ï?αÏ?αÏ?άνÏ? Ï?Ï?Ï?οÏ?Ï? γέÏ?Ï?Ï?αÏ? για να ενεÏ?γοÏ?οιήÏ?εÏ?ε Ï?ιÏ? γέÏ?Ï?Ï?εÏ?.</string>
   <string name="get_bridges_email">Email</string>
-  <string name="activate">Î?νεÏ?γοÏ?οίηÏ?η</string>
   <string name="apps_mode">Î?ειÏ?οÏ?Ï?γία VPN</string>
     <string name="send_email">ΣÏ?είλÏ?ε Email</string>
   <string name="vpn_default_world">ΠαγκÏ?Ï?μια (Auto)</string>
@@ -146,9 +145,9 @@
   <string name="delete_service">Î?ιαγÏ?αÏ?ή Ï?Ï?ηÏ?εÏ?ίαÏ?</string>
   <string name="backup_saved_at_external_storage">Το ανÏ?ίγÏ?άÏ?ο αÏ?Ï?αλείαÏ? αÏ?οθηκεÏ?θηκε Ï?ε εξÏ?Ï?εÏ?ικÏ? μέÏ?ο αÏ?οθήκεÏ?Ï?ηÏ?</string>
   <string name="backup_restored">Το ανÏ?ίγÏ?αÏ?ο αÏ?Ï?αλείαÏ? εÏ?αναÏ?έÏ?θηκε</string>
-  <string name="please_grant_permissions_for_external_storage">ΠαÏ?ακαλοÏ?με να Ï?αÏ?αÏ?Ï?Ï?ήÏ?εÏ?ε δικαιÏ?μαÏ?α για εξÏ?Ï?εÏ?ική αÏ?οθήκεÏ?Ï?η</string>
     <string name="restore_backup">Î?Ï?αναÏ?οÏ?ά ανÏ?ιγÏ?άÏ?οÏ? αÏ?Ï?αλείαÏ?</string>
-    <string name="name_can_t_be_empty">Το Ï?νομα δεν γίνεÏ?αι να είναι κενÏ?</string>
+  <string name="create_a_backup_first">Î?ημιοÏ?Ï?γήÏ?Ï?ε Ï?Ï?Ï?Ï?α ένα ανÏ?ίγÏ?αÏ?ο αÏ?Ï?αλείαÏ? </string>
+  <string name="name_can_t_be_empty">Το Ï?νομα δεν γίνεÏ?αι να είναι κενÏ?</string>
   <string name="fields_can_t_be_empty">Τα Ï?εδία δεν μÏ?οÏ?εί να είναι κενά</string>
   <string name="start_tor_again_for_finish_the_process">Î?ναÏ?ξη ξανά Ï?οÏ? Tor για Ï?ον Ï?εÏ?μαÏ?ιÏ?μÏ? Ï?ηÏ? ενέÏ?γειαÏ?</string>
   <string name="confirm_service_deletion">Î?Ï?ιβεβαίÏ?Ï?η διαγÏ?αÏ?ήÏ? Ï?Ï?ηÏ?εÏ?ίαÏ?</string>
diff --git a/app/src/main/res/values-eo/strings.xml b/app/src/main/res/values-eo/strings.xml
index 81eb0b90..e6be6eab 100644
--- a/app/src/main/res/values-eo/strings.xml
+++ b/app/src/main/res/values-eo/strings.xml
@@ -13,7 +13,7 @@
   <string name="main_layout_upload">AlÅ?utado</string>
     <string name="button_about">Pri</string>
     <string name="menu_exit">Eliri</string>
-  <!--Welcome Wizard strings (DJH)-->
+    <!--Welcome Wizard strings (DJH)-->
   <string name="wizard_details">Kelkaj Detaloj pri Orbot</string>
     <!--END Welcome Wizard strings (DJH)-->
     <string name="pref_general_group">Ä?enerala</string>
@@ -70,7 +70,6 @@
     <string name="unable_to_read_hidden_service_name">ne eblas legi nomon de la kaÅ?ita servo</string>
   <string name="unable_to_start_tor">Ne eblas startigi Tor:</string>
     <string name="set_locale_title">Lingvo</string>
-    <string name="activate">Aktivi</string>
   <string name="save">Konservi</string>
   <string name="name">Nomo</string>
   <string name="done"> Farita! </string>
diff --git a/app/src/main/res/values-es-rAR/strings.xml b/app/src/main/res/values-es-rAR/strings.xml
index 4698804e..daeb0304 100644
--- a/app/src/main/res/values-es-rAR/strings.xml
+++ b/app/src/main/res/values-es-rAR/strings.xml
@@ -105,8 +105,7 @@
   <string name="kb">KB</string>
   <string name="mb">MB</string>
   <string name="get_bridges_email">Email</string>
-  <string name="activate">Activar</string>
-    <string name="save">Guardar</string>
+  <string name="save">Guardar</string>
   <string name="name">Nombre</string>
   <string name="disable">Deshabilitar</string>
 </resources>
diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml
index e101d8d4..47cb05e8 100644
--- a/app/src/main/res/values-es/strings.xml
+++ b/app/src/main/res/values-es/strings.xml
@@ -128,7 +128,6 @@ direcciones (o rangos). No prevalecen sobre las configuraciones de exclusión de
   <string name="menu_qr">Códigos QR</string>
   <string name="if_your_mobile_network_actively_blocks_tor_you_can_use_a_tor_bridge_to_access_the_network_another_way_to_get_bridges_is_to_send_an_email_to_bridges_torproject_org_please_note_that_you_must_send_the_email_using_an_address_from_one_of_the_following_email_providers_riseup_gmail_or_yahoo_">Si su red móvil bloquea Tor activamente, puede usar un \'Servidor Puente\' como alternativa para acceder. SELECCIONE una de las opciones a configurar y probar...</string>
   <string name="get_bridges_email">Correo electrónico</string>
-  <string name="activate">Activar</string>
   <string name="apps_mode">Modo VPN</string>
     <string name="send_email">Enviar correo</string>
   <string name="vpn_default_world">Global (Automático)</string>
@@ -147,9 +146,9 @@ direcciones (o rangos). No prevalecen sobre las configuraciones de exclusión de
   <string name="delete_service">Borrar servicio</string>
   <string name="backup_saved_at_external_storage">Copia de seguridad guardada en un almacenamiento externo</string>
   <string name="backup_restored">Copia de seguridad restaurada</string>
-  <string name="please_grant_permissions_for_external_storage">Por favor, conceda permisos para almacenamiento externo</string>
     <string name="restore_backup">Restaurar copia de seguridad</string>
-    <string name="name_can_t_be_empty">El nombre no puede estar vacío</string>
+  <string name="create_a_backup_first">Primero cree una copia de seguridad</string>
+  <string name="name_can_t_be_empty">El nombre no puede estar vacío</string>
   <string name="fields_can_t_be_empty">Los campos no pueden estar vacíos</string>
   <string name="start_tor_again_for_finish_the_process">Inicie Tor de nuevo para finalizar el proceso</string>
   <string name="confirm_service_deletion">Confirme el borrado del servicio</string>
diff --git a/app/src/main/res/values-eu/strings.xml b/app/src/main/res/values-eu/strings.xml
index ad6337be..c1a7436f 100644
--- a/app/src/main/res/values-eu/strings.xml
+++ b/app/src/main/res/values-eu/strings.xml
@@ -127,7 +127,6 @@
   <string name="menu_qr">QR Kodeak</string>
   <string name="if_your_mobile_network_actively_blocks_tor_you_can_use_a_tor_bridge_to_access_the_network_another_way_to_get_bridges_is_to_send_an_email_to_bridges_torproject_org_please_note_that_you_must_send_the_email_using_an_address_from_one_of_the_following_email_providers_riseup_gmail_or_yahoo_">Zure sare mugikorrak Tor nahita blokeatzen badu, \'Zubi zerbitzaria\' erabili dezakezu ordezko sarbide gisa. HAUTATU konfiguratzeko aukera bat eta probatu...</string>
   <string name="get_bridges_email">E-mail</string>
-  <string name="activate">Aktibatu</string>
   <string name="apps_mode">VPN modua</string>
     <string name="send_email">Bidali E-maila</string>
   <string name="vpn_default_world">Orokorra (Automatikoa)</string>
@@ -146,9 +145,9 @@
   <string name="delete_service">Ezabatu zerbitzua</string>
   <string name="backup_saved_at_external_storage">Babeskopia kanpo biltegiratzean gorde da</string>
   <string name="backup_restored">Babeskopia berrezarri da</string>
-  <string name="please_grant_permissions_for_external_storage">Eman kanpo biltegiratzerako baimena</string>
     <string name="restore_backup">Berrezarri babeskopia</string>
-    <string name="name_can_t_be_empty">Izena ezin da hutsik egon</string>
+  <string name="create_a_backup_first">Sortu babeskopia aurretik</string>
+  <string name="name_can_t_be_empty">Izena ezin da hutsik egon</string>
   <string name="fields_can_t_be_empty">Eremuak ezin dira hutsik egon</string>
   <string name="start_tor_again_for_finish_the_process">Hasi Tor berriro prozesua amaitzeko</string>
   <string name="confirm_service_deletion">Berretsi zerbitzua ezabatzea</string>
diff --git a/app/src/main/res/values-fa/strings.xml b/app/src/main/res/values-fa/strings.xml
index a4b0196d..b3c910fc 100644
--- a/app/src/main/res/values-fa/strings.xml
+++ b/app/src/main/res/values-fa/strings.xml
@@ -127,7 +127,6 @@
   <string name="menu_qr">کدÙ?اÛ? QR</string>
   <string name="if_your_mobile_network_actively_blocks_tor_you_can_use_a_tor_bridge_to_access_the_network_another_way_to_get_bridges_is_to_send_an_email_to_bridges_torproject_org_please_note_that_you_must_send_the_email_using_an_address_from_one_of_the_following_email_providers_riseup_gmail_or_yahoo_">اگر شبکÙ? Ù?Ù?راÙ?تاÙ? بÙ? صÙ?رت Ù?رتب تÙ?ر را Ù?سدÙ?د Ù?Û?â??Ú©Ù?دØ? Ù?Û?â??تÙ?اÙ?Û?د از Û?Ú© «کارساز Ù¾Ù?» بÙ? عÙ?Ù?اÙ? راÙ?Û? جاÛ?گزÛ?Ù? براÛ? Ù?رÙ?د استÙ?ادÙ? Ú©Ù?Û?د. براÛ? Ù¾Û?کربÙ?دÛ? Ù? تستØ? Û?Ú©Û? از گزÛ?Ù?Ù?â??Ù?ا را اÙ?تخاب Ú©Ù?Û?دâ?¦</string>
   <string name="get_bridges_email">اÛ?Ù?Û?Ù?</string>
-  <string name="activate">Ù?عاÙ?</string>
   <string name="apps_mode">حاÙ?ت VPN</string>
     <string name="send_email">اÛ?Ù?Û?Ù? بÙ?رست</string>
   <string name="vpn_default_world">جÙ?اÙ?Û? (Ø®Ù?دکار)</string>
@@ -146,9 +145,9 @@
   <string name="delete_service">حذÙ? سرÙ?Û?س</string>
   <string name="backup_saved_at_external_storage">بکâ??آپ در اÙ?بارÙ? خارجÛ? ذخÛ?رÙ? شد</string>
   <string name="backup_restored">بکâ??آپ بازگرداÙ?دÙ? شد</string>
-  <string name="please_grant_permissions_for_external_storage">Ù?Ø·Ù?ا بÙ?  اÙ?بارÙ? خارجÛ? اجازÙ? دسترسÛ? بدÙ?Û?د</string>
-    <string name="restore_backup">برگرداÙ?دÙ? بکâ??آپ</string>
-    <string name="name_can_t_be_empty">Ù?اÙ? Ù?باÛ?د خاÙ?Û? باشد</string>
+  <string name="restore_backup">برگرداÙ?دÙ? بکâ??آپ</string>
+  <string name="create_a_backup_first">اÙ?Ù? Û?Ú© Ù?سخÙ? بکâ??آپ درست Ú©Ù?Û?د</string>
+  <string name="name_can_t_be_empty">Ù?اÙ? Ù?باÛ?د خاÙ?Û? باشد</string>
   <string name="fields_can_t_be_empty">زÙ?Û?Ù?Ù?â??Ù?ا Ù?باÛ?د خاÙ?Û? باشÙ?د</string>
   <string name="start_tor_again_for_finish_the_process">براÛ? پاÛ?اÙ? رÙ?Ù?د کار Ø? دÙ?بارÙ? تÙ?ر را آغاز Ú©Ù?Û?د</string>
   <string name="confirm_service_deletion">حذÙ? سرÙ?Û?س را تاÛ?Û?د Ú©Ù?Û?د</string>
diff --git a/app/src/main/res/values-fi/strings.xml b/app/src/main/res/values-fi/strings.xml
index ea816426..9f4228cb 100644
--- a/app/src/main/res/values-fi/strings.xml
+++ b/app/src/main/res/values-fi/strings.xml
@@ -121,7 +121,6 @@
   <string name="restart_orbot_to_use_this_bridge_">Käynnistä Orbot uudelleen ottaaksesi muutokset käyttöön</string>
   <string name="menu_qr">QR-koodit</string>
   <string name="get_bridges_email">Sähköposti</string>
-  <string name="activate">Ota käyttöön</string>
   <string name="send_email">Lähetä sähköpostia</string>
   <string name="hidden_services">Piilopalvelut</string>
   <string name="title_activity_hidden_services">Piilopalvelut</string>
diff --git a/app/src/main/res/values-fr-rFR/strings.xml b/app/src/main/res/values-fr-rFR/strings.xml
index 2bd5f988..67b8e006 100644
--- a/app/src/main/res/values-fr-rFR/strings.xml
+++ b/app/src/main/res/values-fr-rFR/strings.xml
@@ -121,7 +121,6 @@
   <string name="restart_orbot_to_use_this_bridge_">Veuillez redémarrer Orbot pour activer les changements</string>
   <string name="menu_qr">Codes QR</string>
   <string name="get_bridges_email">Courriel</string>
-  <string name="activate">Activer</string>
   <string name="send_email">Envoyer un courriel</string>
   <string name="save">Enregistrer</string>
   <string name="name">Name</string>
diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml
index 43ae1a8e..42e35d4a 100644
--- a/app/src/main/res/values-fr/strings.xml
+++ b/app/src/main/res/values-fr/strings.xml
@@ -127,7 +127,6 @@
   <string name="menu_qr">Codes QR</string>
   <string name="if_your_mobile_network_actively_blocks_tor_you_can_use_a_tor_bridge_to_access_the_network_another_way_to_get_bridges_is_to_send_an_email_to_bridges_torproject_org_please_note_that_you_must_send_the_email_using_an_address_from_one_of_the_following_email_providers_riseup_gmail_or_yahoo_">Si votre réseau mobile bloque Tor activement, vous pouvez utiliser un serveur-pont comme moyen de remplacement. CHOISIR une des options pour configurer et tester�</string>
   <string name="get_bridges_email">Courriel</string>
-  <string name="activate">Activer</string>
   <string name="apps_mode">Mode RPV</string>
     <string name="send_email">Envoyer un courriel</string>
   <string name="vpn_default_world">Mondial (Auto)</string>
@@ -146,9 +145,9 @@
   <string name="delete_service">Supprimer le service</string>
   <string name="backup_saved_at_external_storage">La sauvegarde a été enregistrée sur une mémoire externe</string>
   <string name="backup_restored">La sauvegarde a été restaurée</string>
-  <string name="please_grant_permissions_for_external_storage">Veuillez accorder les droits vers la mémoire externe</string>
     <string name="restore_backup">Restaurer la sauvegarde</string>
-    <string name="name_can_t_be_empty">Le nom ne peut pas être vide</string>
+  <string name="create_a_backup_first">Créer dâ??abord une sauvegarde</string>
+  <string name="name_can_t_be_empty">Le nom ne peut pas être vide</string>
   <string name="fields_can_t_be_empty">Les champs ne peuvent pas être vides</string>
   <string name="start_tor_again_for_finish_the_process">Redémarrer Tor pour terminer le processus</string>
   <string name="confirm_service_deletion">Confirmer la suppression du service</string>
diff --git a/app/src/main/res/values-gl/strings.xml b/app/src/main/res/values-gl/strings.xml
index 4dc30171..c0c8808f 100644
--- a/app/src/main/res/values-gl/strings.xml
+++ b/app/src/main/res/values-gl/strings.xml
@@ -127,7 +127,6 @@
   <string name="menu_qr">Códigod QR</string>
   <string name="if_your_mobile_network_actively_blocks_tor_you_can_use_a_tor_bridge_to_access_the_network_another_way_to_get_bridges_is_to_send_an_email_to_bridges_torproject_org_please_note_that_you_must_send_the_email_using_an_address_from_one_of_the_following_email_providers_riseup_gmail_or_yahoo_">Si a súa rede móbil bloquea Tor de xeito activo, pode utilizar un \'Servidor Ponte\' como modo alternativo. ESCOLL unha das opcións para configurar e probar...</string>
   <string name="get_bridges_email">Email</string>
-  <string name="activate">Activar</string>
   <string name="apps_mode">Modo VPN</string>
     <string name="send_email">Enviar correo</string>
   <string name="vpn_default_world">Global (Auto)</string>
@@ -146,9 +145,9 @@
   <string name="delete_service">Eliminar servizo</string>
   <string name="backup_saved_at_external_storage">Respaldo gardado en almacenamento externo</string>
   <string name="backup_restored">Respaldo restaurado</string>
-  <string name="please_grant_permissions_for_external_storage">Por favor, conceda permiso para o almacenamento externo</string>
     <string name="restore_backup">Restaurar respaldo</string>
-    <string name="name_can_t_be_empty">O nome non pode quedar baldeiro</string>
+  <string name="create_a_backup_first">Cree un respaldo primeiro</string>
+  <string name="name_can_t_be_empty">O nome non pode quedar baldeiro</string>
   <string name="fields_can_t_be_empty">Os campos non poden estar baldeiros</string>
   <string name="start_tor_again_for_finish_the_process">Inicie Tor de novo para rematar o proceso</string>
   <string name="confirm_service_deletion">Confirme a eliminación do servizo</string>
diff --git a/app/src/main/res/values-gu/strings.xml b/app/src/main/res/values-gu/strings.xml
index 4fae11f7..c3c1285d 100644
--- a/app/src/main/res/values-gu/strings.xml
+++ b/app/src/main/res/values-gu/strings.xml
@@ -10,7 +10,6 @@
   <!--Permissions screen-->
   <!--TipsAndTricks screen-->
   <!--Transparent Proxy screen-->
-    <string name="activate">સ��રિય</string>
   <string name="save">સ���રહ�</string>
   <string name="name">નામ</string>
   <string name="disable">નિષ���રિય �ર�</string>
diff --git a/app/src/main/res/values-he/strings.xml b/app/src/main/res/values-he/strings.xml
index 9eaff697..5e3a99b8 100644
--- a/app/src/main/res/values-he/strings.xml
+++ b/app/src/main/res/values-he/strings.xml
@@ -127,7 +127,6 @@
   <string name="menu_qr">ק×?×?×? QR</string>
   <string name="if_your_mobile_network_actively_blocks_tor_you_can_use_a_tor_bridge_to_access_the_network_another_way_to_get_bridges_is_to_send_an_email_to_bridges_torproject_org_please_note_that_you_must_send_the_email_using_an_address_from_one_of_the_following_email_providers_riseup_gmail_or_yahoo_">×?×? פע×?×?×?ת ×?רשת ×?× ×?×?×?ת ש×?×? ×?×?ס×?ת ×?ת Tor, ×?ת×? ×?×?×?×? ×?×?שת×?ש ×?\'שרת ×?שר\' ×?×?ר×? ×?×?×?פ×?ת ×?×?×?×?נס. ×?×?ר ×?×?ת ×?×?פשר×?×?×?ת ×?×?×? ×?×?×?×?×?ר ×?×?×?×?×?×?...</string>
   <string name="get_bridges_email">×?×?×?\"×?</string>
-  <string name="activate">×?פע×?</string>
   <string name="apps_mode">×?צ×? VPN</string>
     <string name="send_email">ש×?×? ×?×?×?\"×?</string>
   <string name="vpn_default_world">×¢×?×?×?×? (×?×?×?×?×?×?×?)</string>
@@ -146,9 +145,9 @@
   <string name="delete_service">×?×?ק ש×?ר×?ת</string>
   <string name="backup_saved_at_external_storage">×?×?×?×?×? נש×?ר ×?×?×?ס×?×? ×?×?צ×?× ×?</string>
   <string name="backup_restored">×?×?×?×?×? ש×?×?×?ר</string>
-  <string name="please_grant_permissions_for_external_storage">×?× ×? ×?ענק ×?רש×?×?ת ×¢×?×?ר ×?×?ס×?×? ×?×?צ×?× ×?</string>
-    <string name="restore_backup">ש×?×?ר ×?×?×?×?×?</string>
-    <string name="name_can_t_be_empty">ש×? ×?×?× ×? ×?×?×?×? ×?×?×?×?ת ר×?ק</string>
+  <string name="restore_backup">ש×?×?ר ×?×?×?×?×?</string>
+  <string name="create_a_backup_first">צ×?ר ×?×?×?×?×? ת×?×?×?×?</string>
+  <string name="name_can_t_be_empty">ש×? ×?×?× ×? ×?×?×?×? ×?×?×?×?ת ר×?ק</string>
   <string name="fields_can_t_be_empty">ש×?×?ת ×?×?× ×? ×?×?×?×?×?×? ×?×?×?×?ת ר×?ק×?×?</string>
   <string name="start_tor_again_for_finish_the_process">×?פע×? ×?ת Tor ש×?×? ×?×?×? ×?ס×?×?×? ×?ת ×?ת×?×?×?×?</string>
   <string name="confirm_service_deletion">×?שר ×?×?×?קת ש×?ר×?ת</string>
diff --git a/app/src/main/res/values-hi/strings.xml b/app/src/main/res/values-hi/strings.xml
index 718d02eb..32fe7b49 100644
--- a/app/src/main/res/values-hi/strings.xml
+++ b/app/src/main/res/values-hi/strings.xml
@@ -128,7 +128,6 @@
   <string name="menu_qr">QR ��ड</string>
   <string name="if_your_mobile_network_actively_blocks_tor_you_can_use_a_tor_bridge_to_access_the_network_another_way_to_get_bridges_is_to_send_an_email_to_bridges_torproject_org_please_note_that_you_must_send_the_email_using_an_address_from_one_of_the_following_email_providers_riseup_gmail_or_yahoo_">यदि �प�ा म�बा�ल न��वर�� स��रिय र�प स� �� �� ब�ल�� �रता ह�, त� �प \'प�ल सर�वर\' �� �� व��ल�पि� तर��� स� �पय�� �र स�त� ह��। ��न�फ़ि�र �र पर���षण �रन� �� लि� वि�ल�प�� म�� स� �� �ा �यन �र�� ..,।</string>
   <string name="get_bridges_email">�म�ल</string>
-  <string name="activate">स��रिय</string>
   <string name="apps_mode">व�प��न म�ड</string>
     <string name="send_email">�म�ल भ����</string>
   <string name="vpn_default_world">��ल�बल (���)</string>
@@ -147,9 +146,9 @@
   <string name="delete_service">स�वा ह�ा��</string>
   <string name="backup_saved_at_external_storage">बाह�य स���रहण म�� ब���प सह��ा �या</string>
   <string name="backup_restored">ब���प �� प�नर�स�थापित �िया �या</string>
-  <string name="please_grant_permissions_for_external_storage">��पया बाहर� स���रहण �� लि� �न�मति द��</string>
     <string name="restore_backup">ब���प बहाल</string>
-    <string name="name_can_t_be_empty">नाम रि��त नह�� ह� स�ता</string>
+  <string name="create_a_backup_first">पहल� ब���प बना��</string>
+  <string name="name_can_t_be_empty">नाम रि��त नह�� ह� स�ता</string>
   <string name="fields_can_t_be_empty">फ़�ल�ड रि��त नह�� ह� स�त�</string>
   <string name="start_tor_again_for_finish_the_process">प�र��रिया �� �त�म �रन� �� लि� Tor प�न: प�रार�भ �र��</string>
   <string name="confirm_service_deletion">स�वा ह�ान� �� प�ष��ि �र��</string>
diff --git a/app/src/main/res/values-hr/strings.xml b/app/src/main/res/values-hr/strings.xml
index 18d85e5f..a6cfecca 100644
--- a/app/src/main/res/values-hr/strings.xml
+++ b/app/src/main/res/values-hr/strings.xml
@@ -121,7 +121,6 @@
   <string name="restart_orbot_to_use_this_bridge_">Ponovno pokrenite Orbot da bi omoguÄ?ili promjene</string>
   <string name="menu_qr">QR kodovi</string>
   <string name="get_bridges_email">Email</string>
-  <string name="activate">Aktiviraj</string>
   <string name="send_email">Pošalji email</string>
   <string name="save">Spremi</string>
   <string name="name">Ime</string>
diff --git a/app/src/main/res/values-hu/strings.xml b/app/src/main/res/values-hu/strings.xml
index b25e987b..77a0687f 100644
--- a/app/src/main/res/values-hu/strings.xml
+++ b/app/src/main/res/values-hu/strings.xml
@@ -127,7 +127,6 @@
   <string name="menu_qr">QR kódok</string>
   <string name="if_your_mobile_network_actively_blocks_tor_you_can_use_a_tor_bridge_to_access_the_network_another_way_to_get_bridges_is_to_send_an_email_to_bridges_torproject_org_please_note_that_you_must_send_the_email_using_an_address_from_one_of_the_following_email_providers_riseup_gmail_or_yahoo_">Ha a mobil hálózata aktívan blokkolja a Tor-t, akkor választhatja a \'Híd szerver\'-t, mint alternatív utat. VÃ?LASSZON egyet a lehetÅ?ségek közül és tesztelje....</string>
   <string name="get_bridges_email">Email</string>
-  <string name="activate">Aktiválás</string>
   <string name="apps_mode">VPN Mód</string>
     <string name="send_email">Email küldése</string>
   <string name="vpn_default_world">Globális (Auto)</string>
@@ -146,9 +145,9 @@
   <string name="delete_service">Szolgáltatás Törlése</string>
   <string name="backup_saved_at_external_storage">KülsÅ? tárhelyre mentve</string>
   <string name="backup_restored">Mentés visszaállítva</string>
-  <string name="please_grant_permissions_for_external_storage">Kérjük adjon jogosultságot a külsÅ? tárhelyhez</string>
     <string name="restore_backup">Mentés visszaállítása</string>
-    <string name="name_can_t_be_empty">A név nem lehet üres</string>
+  <string name="create_a_backup_first">Készítsen elÅ?bb egy mentést</string>
+  <string name="name_can_t_be_empty">A név nem lehet üres</string>
   <string name="fields_can_t_be_empty">A mezÅ?k nem lehetnek üresek</string>
   <string name="start_tor_again_for_finish_the_process">Indítsa el a Tor-t még egyszer a befejezéshez</string>
   <string name="confirm_service_deletion">Szolgáltatás törlés jóváhagyása</string>
diff --git a/app/src/main/res/values-hy-rAM/strings.xml b/app/src/main/res/values-hy-rAM/strings.xml
index a59aa749..cd3998d4 100644
--- a/app/src/main/res/values-hy-rAM/strings.xml
+++ b/app/src/main/res/values-hy-rAM/strings.xml
@@ -4,7 +4,7 @@
   <string name="menu_about">Õ?Õ¡Õ½Õ«Õ¶</string>
   <string name="button_about">Õ?Õ¡Õ½Õ«Õ¶</string>
     <string name="menu_exit">ÔµÕ¬Ö?</string>
-  <!--Welcome Wizard strings (DJH)-->
+    <!--Welcome Wizard strings (DJH)-->
   <!--END Welcome Wizard strings (DJH)-->
   <!--New Wizard Strings-->
   <!--Title Screen-->
diff --git a/app/src/main/res/values-id/strings.xml b/app/src/main/res/values-id/strings.xml
index 808657d2..b00d1ac9 100644
--- a/app/src/main/res/values-id/strings.xml
+++ b/app/src/main/res/values-id/strings.xml
@@ -121,7 +121,6 @@
   <string name="restart_orbot_to_use_this_bridge_">Silakan start ulang Orbot untuk mengaktifkan perubahan</string>
   <string name="menu_qr">Kode QR</string>
   <string name="get_bridges_email">Email</string>
-  <string name="activate">Aktivasi</string>
   <string name="send_email">Kirim Email</string>
   <string name="save">Simpan</string>
   <string name="name">Nama</string>
diff --git a/app/src/main/res/values-in-rID/strings.xml b/app/src/main/res/values-in-rID/strings.xml
index 4fa75a8b..b5bc11c3 100644
--- a/app/src/main/res/values-in-rID/strings.xml
+++ b/app/src/main/res/values-in-rID/strings.xml
@@ -121,7 +121,6 @@
   <string name="restart_orbot_to_use_this_bridge_">Silakan start ulang Orbot untuk mengaktifkan perubahan</string>
   <string name="menu_qr">Kode QR</string>
   <string name="get_bridges_email">Email</string>
-  <string name="activate">Aktivasi</string>
   <string name="send_email">Kirim Email</string>
   <string name="please_restart_Orbot_to_enable_the_changes">Silakan start ulang Orbot untuk mengaktifkan perubahan</string>
 </resources>
diff --git a/app/src/main/res/values-in/strings.xml b/app/src/main/res/values-in/strings.xml
index c758955c..0c86a753 100644
--- a/app/src/main/res/values-in/strings.xml
+++ b/app/src/main/res/values-in/strings.xml
@@ -10,7 +10,7 @@
     <string name="menu_about">Mengenai</string>
     <string name="button_about">Mengenai</string>
     <string name="menu_exit">Keluar</string>
-  <!--Welcome Wizard strings (DJH)-->
+    <!--Welcome Wizard strings (DJH)-->
     <!--END Welcome Wizard strings (DJH)-->
   <string name="pref_general_group">Umum</string>
   <!--New Wizard Strings-->
diff --git a/app/src/main/res/values-is/strings.xml b/app/src/main/res/values-is/strings.xml
index 2d5138ef..aa03098e 100644
--- a/app/src/main/res/values-is/strings.xml
+++ b/app/src/main/res/values-is/strings.xml
@@ -127,7 +127,6 @@
   <string name="menu_qr">QR-kóðar</string>
   <string name="if_your_mobile_network_actively_blocks_tor_you_can_use_a_tor_bridge_to_access_the_network_another_way_to_get_bridges_is_to_send_an_email_to_bridges_torproject_org_please_note_that_you_must_send_the_email_using_an_address_from_one_of_the_following_email_providers_riseup_gmail_or_yahoo_">Ef farsímanetið þitt er virkt í að loka á Tor, geturðu notað \'Brúarþjón\' sem varaleið inn. VELDU einn af valkostunum til að setja upp og prófa...</string>
   <string name="get_bridges_email">Tölvupóstur</string>
-  <string name="activate">Virkja</string>
   <string name="apps_mode">VPN-hamur</string>
     <string name="send_email">Senda tölvupóst</string>
   <string name="vpn_default_world">Víðvært (sjálfvirkt)</string>
@@ -146,9 +145,9 @@
   <string name="delete_service">Eyða þjónustu</string>
   <string name="backup_saved_at_external_storage">�ryggisafrit var vistað í ytri gagnageymslu</string>
   <string name="backup_restored">Ã?ryggisafrit var endurheimt</string>
-  <string name="please_grant_permissions_for_external_storage">Gefðu heimild til að nota ytri gagnageymslu</string>
     <string name="restore_backup">Endurheimta úr öryggisafriti</string>
-    <string name="name_can_t_be_empty">Nafnið má ekki vera autt</string>
+  <string name="create_a_backup_first">Gerðu fyrst öryggisafrit</string>
+  <string name="name_can_t_be_empty">Nafnið má ekki vera autt</string>
   <string name="fields_can_t_be_empty">Gagnasvið mega ekki vera auð</string>
   <string name="start_tor_again_for_finish_the_process">Ræstu Tor aftur til að ljúka ferlinu</string>
   <string name="confirm_service_deletion">Staðfestu eyðingu á þjónustu</string>
diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml
index 762127e3..9bc6e48d 100644
--- a/app/src/main/res/values-it/strings.xml
+++ b/app/src/main/res/values-it/strings.xml
@@ -127,7 +127,6 @@
   <string name="menu_qr">Codici QR</string>
   <string name="if_your_mobile_network_actively_blocks_tor_you_can_use_a_tor_bridge_to_access_the_network_another_way_to_get_bridges_is_to_send_an_email_to_bridges_torproject_org_please_note_that_you_must_send_the_email_using_an_address_from_one_of_the_following_email_providers_riseup_gmail_or_yahoo_">Se la tua rete mobile blocca attivamente Tor, puoi usare un \'Server Bridge\' come via alternativa. SELEZIONA una delle opzioni per configurare e testare...</string>
   <string name="get_bridges_email">Email</string>
-  <string name="activate">Attiva</string>
   <string name="apps_mode">Modalità VPN</string>
     <string name="send_email">Invia email</string>
   <string name="vpn_default_world">Globale (Auto)</string>
@@ -146,9 +145,9 @@
   <string name="delete_service">Elimina il servizio</string>
   <string name="backup_saved_at_external_storage">Backup salvato nell\'archiviazione esterna</string>
   <string name="backup_restored">Backup ripristinato</string>
-  <string name="please_grant_permissions_for_external_storage">Consenti l\'autorizzazione per l\'archiviazione esterna</string>
     <string name="restore_backup">Ripristina backup</string>
-    <string name="name_can_t_be_empty">Il nome non può essere vuoto</string>
+  <string name="create_a_backup_first">Prima crea un backup</string>
+  <string name="name_can_t_be_empty">Il nome non può essere vuoto</string>
   <string name="fields_can_t_be_empty">I campi non possono essere vuoti</string>
   <string name="start_tor_again_for_finish_the_process">Riavvia Tor per finire il processo</string>
   <string name="confirm_service_deletion">Conferma l\'eliminazione del servizio</string>
diff --git a/app/src/main/res/values-iw/strings.xml b/app/src/main/res/values-iw/strings.xml
index 24e005d0..df55cd70 100644
--- a/app/src/main/res/values-iw/strings.xml
+++ b/app/src/main/res/values-iw/strings.xml
@@ -98,6 +98,5 @@
   <string name="mb">MB</string>
   <string name="menu_qr">ק×?×? QR</string>
   <string name="get_bridges_email">×?×?×?\"×?</string>
-  <string name="activate">×?פע×?</string>
   <string name="send_email">ש×?×? ×?×?×?\"×?</string>
 </resources>
diff --git a/app/src/main/res/values-ja/strings.xml b/app/src/main/res/values-ja/strings.xml
index 940c0331..728c775d 100644
--- a/app/src/main/res/values-ja/strings.xml
+++ b/app/src/main/res/values-ja/strings.xml
@@ -127,7 +127,6 @@
   <string name="menu_qr">QRã?³ã?¼ã??</string>
   <string name="if_your_mobile_network_actively_blocks_tor_you_can_use_a_tor_bridge_to_access_the_network_another_way_to_get_bridges_is_to_send_an_email_to_bridges_torproject_org_please_note_that_you_must_send_the_email_using_an_address_from_one_of_the_following_email_providers_riseup_gmail_or_yahoo_">ã?¢ã??ã?¤ã?«ã??ã??ã??ã?¯ã?¼ã?¯ã??é »ç¹?ã?«Torã??ã??ã?­ã??ã?¯ã??ã??å ´å??ã??å?¥ã?®æ?¹æ³?ã?¨ã??ã?¦ \'ã??ã?ªã??ã?¸ã?µã?¼ã??ã?¼\'ã??使ç?¨ã??ã??ã??ã?¨ã??ã?§ã??ã?¾ã??ã??ã?ªã??ã?·ã?§ã?³ã??ï¼?ã?¤é?¸æ??ã??ã?¦ã??設å®?ã?¨ã??ã?¹ã??ã??è¡?ã?£ã?¦ã??ã? ã??ã??ã??</string>
   <string name="get_bridges_email">���</string>
-  <string name="activate">ã?¢ã?¯ã??ã?£ã??å??</string>
   <string name="apps_mode">VPN ã?¢ã?¼ã??</string>
     <string name="send_email">ã?¡ã?¼ã?«é??ä¿¡</string>
   <string name="vpn_default_world">ä¸?ç??中 (è?ªå??)</string>
@@ -146,9 +145,9 @@
   <string name="delete_service">ã?µã?¼ã??ã?¹ã??å??é?¤</string>
   <string name="backup_saved_at_external_storage">ã??ã??ã?¯ã?¢ã??ã??ã?¯å¤?é?¨è¨?æ?¶è£?ç½®ã?«ä¿?å­?ã??ã??ã?¾ã??ã??</string>
   <string name="backup_restored">ã??ã??ã?¯ã?¢ã??ã??ã??ã??復å??</string>
-  <string name="please_grant_permissions_for_external_storage">å¤?é?¨è¨?æ?¶ã?¸ã?®ã?¢ã?¯ã?»ã?¹è¨±å?¯ã??ä¸?ã??ã?¦ä¸?ã??ã??ã??</string>
     <string name="restore_backup">ã??ã??ã?¯ã?¢ã??ã??ã?®å¾©æ?§</string>
-    <string name="name_can_t_be_empty">å??å??ã?¯ã??ã?©ã?³ã?¯ã?®ã?¾ã?¾ã?«ã?§ã??ã?¾ã??ã??</string>
+  <string name="create_a_backup_first">æ??å??ã?«ã??ã??ã??ã?¯ã?¢ã??ã??ã??ä½?æ??ã??ã?¦ä¸?ã??ã??</string>
+  <string name="name_can_t_be_empty">å??å??ã?¯ã??ã?©ã?³ã?¯ã?®ã?¾ã?¾ã?«ã?§ã??ã?¾ã??ã??</string>
   <string name="fields_can_t_be_empty">ã??ã?£ã?¼ã?«ã??ã??空ã?«ã??ã?¦ã??ã??ã??ã?¨ã?¯ã?§ã??ã?¾ã??ã??</string>
   <string name="start_tor_again_for_finish_the_process">ã??ã?­ã?»ã?¹ã??å®?äº?ã??ã??ã?«ã?¯ã??Torã??å??èµ·å??ã??ã?¦ä¸?ã??ã??ã??</string>
   <string name="confirm_service_deletion">ã?µã?¼ã??ã?¹å??é?¤ã??確èª?</string>
diff --git a/app/src/main/res/values-kn/strings.xml b/app/src/main/res/values-kn/strings.xml
index 9e5403b7..98f27eb6 100644
--- a/app/src/main/res/values-kn/strings.xml
+++ b/app/src/main/res/values-kn/strings.xml
@@ -3,7 +3,7 @@
   <string name="app_name">�ರ�ಬ���</string>
     <string name="menu_about">ಬ����</string>
     <string name="button_about">ಬ����</string>
-  <!--Welcome Wizard strings (DJH)-->
+    <!--Welcome Wizard strings (DJH)-->
     <!--END Welcome Wizard strings (DJH)-->
   <!--New Wizard Strings-->
   <!--Title Screen-->
diff --git a/app/src/main/res/values-ko/strings.xml b/app/src/main/res/values-ko/strings.xml
index d80f9108..1c51ec2d 100644
--- a/app/src/main/res/values-ko/strings.xml
+++ b/app/src/main/res/values-ko/strings.xml
@@ -121,7 +121,6 @@
   <string name="restart_orbot_to_use_this_bridge_">ë³?ê²½ì?? ì??ë£?í??려면 Orbotì?? ì?¬ì??ì??í??ì?¸ì??</string>
   <string name="menu_qr">QR ì½?ë??</string>
   <string name="get_bridges_email">ì?´ë©?ì?¼</string>
-  <string name="activate">í??ì?±í??</string>
   <string name="send_email">��� 보�기</string>
   <string name="save">ì ?ì?¥</string>
   <string name="name">Name</string>
diff --git a/app/src/main/res/values-lt/strings.xml b/app/src/main/res/values-lt/strings.xml
index 2ff6f375..4bbabf6f 100644
--- a/app/src/main/res/values-lt/strings.xml
+++ b/app/src/main/res/values-lt/strings.xml
@@ -32,7 +32,6 @@
   <string name="bridges">Tinklų tiltai</string>
     <string name="set_locale_title">Kalba</string>
     <string name="get_bridges_email">El. paštas</string>
-  <string name="activate">Aktyvuoti</string>
   <string name="save">Įrašyti</string>
   <string name="name">Vardas</string>
   <string name="backup_restored">AtsarginÄ? kopija atkurta</string>
diff --git a/app/src/main/res/values-lv/strings.xml b/app/src/main/res/values-lv/strings.xml
index 4266a96d..67df6a13 100644
--- a/app/src/main/res/values-lv/strings.xml
+++ b/app/src/main/res/values-lv/strings.xml
@@ -121,7 +121,6 @@
   <string name="restart_orbot_to_use_this_bridge_">LÅ«dzu pÄ?rstartÄ?jiet Orbot, lai iespÄ?jotu izmaiÅ?as</string>
   <string name="menu_qr">QR kodi</string>
   <string name="get_bridges_email">E-pasts</string>
-  <string name="activate">AktivizÄ?t</string>
   <string name="send_email">Nosūtīt e-pastu</string>
   <string name="hidden_services">SlÄ?ptie pakalpojumi</string>
   <string name="title_activity_hidden_services">SlÄ?ptie pakalpojumi</string>
diff --git a/app/src/main/res/values-mk/strings.xml b/app/src/main/res/values-mk/strings.xml
index 8a3a2731..2cda7ec3 100644
--- a/app/src/main/res/values-mk/strings.xml
+++ b/app/src/main/res/values-mk/strings.xml
@@ -127,7 +127,6 @@
   <string name="menu_qr">QR-кодови</string>
   <string name="if_your_mobile_network_actively_blocks_tor_you_can_use_a_tor_bridge_to_access_the_network_another_way_to_get_bridges_is_to_send_an_email_to_bridges_torproject_org_please_note_that_you_must_send_the_email_using_an_address_from_one_of_the_following_email_providers_riseup_gmail_or_yahoo_">Ð?ко ваÑ?аÑ?а мобилна мÑ?ежа акÑ?ивно го блокиÑ?а Tor, можеÑ?е да коÑ?иÑ?Ñ?иÑ?е â??Ð?оÑ?Ñ? Ñ?еÑ?веÑ?â?? како алÑ?еÑ?наÑ?ивен пÑ?иÑ?Ñ?ап. Ð?Ð?Ð?Ð?РÐ?ТÐ? една од опÑ?ииÑ?е за поÑ?Ñ?авÑ?ваÑ?е и Ñ?еÑ?Ñ?иÑ?аÑ?е...</string>
   <string name="get_bridges_email">Ð?-поÑ?Ñ?а</string>
-  <string name="activate">Ð?кÑ?ивиÑ?аÑ?</string>
   <string name="apps_mode">VPN мод</string>
   <string name="send_email">Ð?Ñ?пÑ?аÑ?еÑ?е е-поÑ?Ñ?а</string>
   <string name="vpn_default_world">Ð?лобално (Ð?вÑ?омаÑ?Ñ?ки)</string>
@@ -146,9 +145,9 @@
   <string name="delete_service">Ð?збÑ?иÑ?и Ñ?Ñ?лÑ?га</string>
   <string name="backup_saved_at_external_storage">РезеÑ?внаÑ?а копиÑ?а е Ñ?нимена на надвоÑ?еÑ?на мемоÑ?иÑ?а</string>
   <string name="backup_restored">Ð?Ñ?аÑ?ено од Ñ?езеÑ?вна копиÑ?а</string>
-  <string name="please_grant_permissions_for_external_storage">Ð?е молиме дадеÑ?е дозволи за надвоÑ?еÑ?на мемоÑ?иÑ?а</string>
-  <string name="restore_backup">Ð?Ñ?аÑ?и Ñ?езеÑ?вна копиÑ?а</string>
-    <string name="name_can_t_be_empty">Ð?меÑ?о не може да биде пÑ?азно</string>
+    <string name="restore_backup">Ð?Ñ?аÑ?и Ñ?езеÑ?вна копиÑ?а</string>
+  <string name="create_a_backup_first">Создади Ñ?езеÑ?вна копиÑ?а</string>
+  <string name="name_can_t_be_empty">Ð?меÑ?о не може да биде пÑ?азно</string>
   <string name="fields_can_t_be_empty">Ð?олиÑ?аÑ?а не можаÑ? да бидаÑ? пÑ?азни</string>
   <string name="start_tor_again_for_finish_the_process">СÑ?аÑ?Ñ?Ñ?ваÑ? го Tor повÑ?оÑ?но да го завÑ?Ñ?и пÑ?оÑ?еÑ?оÑ?</string>
   <string name="confirm_service_deletion">Ð?оÑ?вÑ?ди бÑ?иÑ?еÑ?е на Ñ?Ñ?лÑ?гаÑ?а</string>
diff --git a/app/src/main/res/values-ml/strings.xml b/app/src/main/res/values-ml/strings.xml
index d6e713bc..155a8a8c 100644
--- a/app/src/main/res/values-ml/strings.xml
+++ b/app/src/main/res/values-ml/strings.xml
@@ -4,7 +4,7 @@
   <string name="menu_stop">നിരàµ?â??à´¤àµ?à´¤àµ?à´?</string>
   <string name="menu_about">വിവര�</string>
     <string name="button_about">വിവര�</string>
-  <!--Welcome Wizard strings (DJH)-->
+    <!--Welcome Wizard strings (DJH)-->
     <!--END Welcome Wizard strings (DJH)-->
   <string name="pref_general_group">പ�ത�വായത�</string>
   <!--New Wizard Strings-->
diff --git a/app/src/main/res/values-my/strings.xml b/app/src/main/res/values-my/strings.xml
index c8181628..d9456370 100644
--- a/app/src/main/res/values-my/strings.xml
+++ b/app/src/main/res/values-my/strings.xml
@@ -7,7 +7,7 @@
   <string name="main_layout_download">á??á?±á?«á??á?ºá?¸á??á?¯á??á?º</string>
     <string name="button_about">á?¡á??á?¼á?±á?¬á??á?ºá?¸</string>
   <string name="menu_exit">á??á?½á??á?ºá??á??á?º</string>
-  <!--Welcome Wizard strings (DJH)-->
+    <!--Welcome Wizard strings (DJH)-->
     <!--END Welcome Wizard strings (DJH)-->
   <string name="pref_general_group">á??á?±á??á?¯á??á?»</string>
   <!--New Wizard Strings-->
@@ -21,7 +21,6 @@
     <string name="kb">á??á?®á??á?­á?¯á??á?­á?¯á??á?º</string>
   <string name="mb">á??á??á?¹á??á?«á??á?­á?¯á??á?º</string>
   <string name="get_bridges_email">á?¡á?®á?¸á?±á??á?¸á??á?¹</string>
-  <string name="activate">Activate</string>
   <string name="hidden_services">Hidden Services</string>
   <string name="title_activity_hidden_services">Hidden Services</string>
   <string name="menu_hidden_services">Hidden Services</string>
diff --git a/app/src/main/res/values-nb/strings.xml b/app/src/main/res/values-nb/strings.xml
index 0b3385a4..910a4079 100644
--- a/app/src/main/res/values-nb/strings.xml
+++ b/app/src/main/res/values-nb/strings.xml
@@ -123,7 +123,6 @@
   <string name="restart_orbot_to_use_this_bridge_">Gjør omstart av Orbot før endringer trer i kraft</string>
   <string name="menu_qr">QR-koder</string>
   <string name="get_bridges_email">E-post</string>
-    <string name="activate">Aktiver</string>
   <string name="apps_mode">VPN-modus</string>
   <string name="send_email">Send e-post</string>
   <string name="hidden_services">Hidden Services</string>
@@ -140,7 +139,8 @@
   <string name="delete_service">Slett tjeneste</string>
   <string name="backup_restored">Sikkerhetskopi gjenopprettet</string>
     <string name="restore_backup">Gjenopprett sikkerhetskopi</string>
-    <string name="name_can_t_be_empty">Navnet kan ikke være tomt</string>
+  <string name="create_a_backup_first">Opprett en sikkerhetskopi først</string>
+  <string name="name_can_t_be_empty">Navnet kan ikke være tomt</string>
   <string name="fields_can_t_be_empty">Felter kan ikke stå tomme</string>
   <string name="start_tor_again_for_finish_the_process">Start Tor igjen for å fullføre prosessen</string>
   <string name="confirm_service_deletion">Bekreft sletting av tjeneste</string>
diff --git a/app/src/main/res/values-nl/strings.xml b/app/src/main/res/values-nl/strings.xml
index 4ee74353..57838dcc 100644
--- a/app/src/main/res/values-nl/strings.xml
+++ b/app/src/main/res/values-nl/strings.xml
@@ -127,7 +127,6 @@
   <string name="menu_qr">QR-codes</string>
   <string name="if_your_mobile_network_actively_blocks_tor_you_can_use_a_tor_bridge_to_access_the_network_another_way_to_get_bridges_is_to_send_an_email_to_bridges_torproject_org_please_note_that_you_must_send_the_email_using_an_address_from_one_of_the_following_email_providers_riseup_gmail_or_yahoo_">Als je mobiele netwerk Tor actief blokkeert, kan je een \'bridge-server\' gebruiken als alternatieve toegang. SELECTEER een van de opties om te configureren en te testen..,.</string>
   <string name="get_bridges_email">E-mail</string>
-  <string name="activate">Activeren</string>
   <string name="apps_mode">VPN-modus</string>
     <string name="send_email">E-mail versturen</string>
   <string name="vpn_default_world">Algemeen (automatisch)</string>
@@ -146,9 +145,9 @@
   <string name="delete_service">Dienst verwijderen</string>
   <string name="backup_saved_at_external_storage">Back-up opgeslagen op externe opslag</string>
   <string name="backup_restored">Back-up hersteld</string>
-  <string name="please_grant_permissions_for_external_storage">Verleen toestemmingen voor externe opslag</string>
     <string name="restore_backup">Back-up herstellen</string>
-    <string name="name_can_t_be_empty">Naam kan niet leeg zijn</string>
+  <string name="create_a_backup_first">Maak eerst een back-up aan</string>
+  <string name="name_can_t_be_empty">Naam kan niet leeg zijn</string>
   <string name="fields_can_t_be_empty">Velden kunnen niet leeg zijn</string>
   <string name="start_tor_again_for_finish_the_process">Start Tor opnieuw om het proces te voltooien</string>
   <string name="confirm_service_deletion">Bevestig verwijderen van dienst</string>
diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml
index 2f8f36a4..60443b1b 100644
--- a/app/src/main/res/values-pl/strings.xml
+++ b/app/src/main/res/values-pl/strings.xml
@@ -121,7 +121,6 @@
   <string name="restart_orbot_to_use_this_bridge_">ProszÄ? zrestartowaÄ? Orbot, aby zmiany mogÅ?y wejÅ?Ä? w życie</string>
   <string name="menu_qr">Kody QR</string>
   <string name="get_bridges_email">Email</string>
-  <string name="activate">Aktywuj</string>
   <string name="apps_mode">Tryb VPN</string>
   <string name="send_email">WyÅ?lij Email</string>
   <string name="hidden_services">Ukryte UsÅ?ugi</string>
diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml
index b290a20a..5987d5c9 100644
--- a/app/src/main/res/values-pt-rBR/strings.xml
+++ b/app/src/main/res/values-pt-rBR/strings.xml
@@ -127,7 +127,6 @@
   <string name="menu_qr">QR Codes</string>
   <string name="if_your_mobile_network_actively_blocks_tor_you_can_use_a_tor_bridge_to_access_the_network_another_way_to_get_bridges_is_to_send_an_email_to_bridges_torproject_org_please_note_that_you_must_send_the_email_using_an_address_from_one_of_the_following_email_providers_riseup_gmail_or_yahoo_">Se sua rede de dados bloqueia o Tor, você pode utilizar um \'Servidor Bridge\' como alternativa contra o bloqueio. SELECIONE umas das opções para configurar e testar..,.</string>
   <string name="get_bridges_email">Email</string>
-  <string name="activate">Atvar</string>
   <string name="apps_mode">Modo VPN</string>
   <string name="send_email">Enviar Email</string>
   <string name="vpn_default_world">Global (Automático)</string>
@@ -146,9 +145,9 @@
   <string name="delete_service">Remover Serviço</string>
   <string name="backup_saved_at_external_storage">Backup salvo em mídia externa</string>
   <string name="backup_restored">Backup Restaurado</string>
-  <string name="please_grant_permissions_for_external_storage">Por favor dê permissões ao armazenamento externo</string>
     <string name="restore_backup">Restaurar Backup</string>
-    <string name="name_can_t_be_empty">O campo Nome não pode ser vazio</string>
+  <string name="create_a_backup_first">Criar primeiro backup</string>
+  <string name="name_can_t_be_empty">O campo Nome não pode ser vazio</string>
   <string name="fields_can_t_be_empty">Campos não podem ser vazios</string>
   <string name="confirm_service_deletion">Confirmar a remoção do serviço</string>
     <string name="service_type">Tipo do Serviço</string>
diff --git a/app/src/main/res/values-pt-rPT/strings.xml b/app/src/main/res/values-pt-rPT/strings.xml
index 3007685b..f2b53796 100644
--- a/app/src/main/res/values-pt-rPT/strings.xml
+++ b/app/src/main/res/values-pt-rPT/strings.xml
@@ -51,7 +51,6 @@
   <string name="mb">MB</string>
   <string name="menu_qr">Códigos QR</string>
   <string name="get_bridges_email">E-mail</string>
-  <string name="activate">Ativar</string>
   <string name="send_email">Enviar Mensagem</string>
     <string name="save">Guardar</string>
   <string name="name">Nome</string>
diff --git a/app/src/main/res/values-pt/strings.xml b/app/src/main/res/values-pt/strings.xml
index 9f465f0a..60224208 100644
--- a/app/src/main/res/values-pt/strings.xml
+++ b/app/src/main/res/values-pt/strings.xml
@@ -75,7 +75,6 @@
   <string name="bridges_updated">Pontes Atualizadas</string>
   <string name="menu_qr">Códigos QR</string>
   <string name="get_bridges_email">Correio Eletrónico</string>
-  <string name="activate">Ativar</string>
   <string name="send_email">Enviar Mensagem</string>
     <string name="hidden_services">Serviços ocultos</string>
   <string name="title_activity_hidden_services">Serviços ocultos</string>
diff --git a/app/src/main/res/values-ro/strings.xml b/app/src/main/res/values-ro/strings.xml
index 47c329ea..a66a817b 100644
--- a/app/src/main/res/values-ro/strings.xml
+++ b/app/src/main/res/values-ro/strings.xml
@@ -121,7 +121,6 @@
   <string name="restart_orbot_to_use_this_bridge_">VÄ? rugÄ?m reporniÅ£i Orbot pentru a aplica modificÄ?rile</string>
   <string name="menu_qr">Coduri QR</string>
   <string name="get_bridges_email">Email</string>
-  <string name="activate">ActiveazÄ?</string>
   <string name="send_email">Trimite email</string>
   <string name="hidden_services">Servicii ascunse</string>
   <string name="title_activity_hidden_services">Servicii ascunse</string>
diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml
index 7c1ecf28..320d69bc 100644
--- a/app/src/main/res/values-ru/strings.xml
+++ b/app/src/main/res/values-ru/strings.xml
@@ -127,7 +127,6 @@
   <string name="menu_qr">QR-кодÑ?</string>
   <string name="if_your_mobile_network_actively_blocks_tor_you_can_use_a_tor_bridge_to_access_the_network_another_way_to_get_bridges_is_to_send_an_email_to_bridges_torproject_org_please_note_that_you_must_send_the_email_using_an_address_from_one_of_the_following_email_providers_riseup_gmail_or_yahoo_">Ð?Ñ?ли ваÑ?а мобилÑ?наÑ? Ñ?еÑ?Ñ? акÑ?ивно блокиÑ?Ñ?еÑ? Tor, вÑ? можеÑ?е иÑ?полÑ?зоваÑ?Ñ? моÑ?Ñ?Ñ? Tor длÑ? доÑ?Ñ?Ñ?па к Ñ?еÑ?и. Ð?Ñ?беÑ?иÑ?е один из ваÑ?ианÑ?ов длÑ? наÑ?Ñ?Ñ?ойки и Ñ?еÑ?Ñ?иÑ?ованиÑ?:</string>
   <string name="get_bridges_email">Эл. поÑ?Ñ?а</string>
-  <string name="activate">Ð?кÑ?иваÑ?иÑ?</string>
   <string name="apps_mode">VPN-Ñ?ежим</string>
     <string name="send_email">Ð?Ñ?пÑ?авиÑ?Ñ? пиÑ?Ñ?мо</string>
   <string name="vpn_default_world">Ð?иÑ? (авÑ?о)</string>
@@ -146,9 +145,9 @@
   <string name="delete_service">УдалиÑ?Ñ? Ñ?лÑ?жбÑ?</string>
   <string name="backup_saved_at_external_storage">РезеÑ?внаÑ? копиÑ? Ñ?оÑ?Ñ?анена на внеÑ?нем Ñ?Ñ?анилиÑ?е</string>
   <string name="backup_restored">Ð?оÑ?Ñ?Ñ?ановлено из Ñ?езеÑ?вной копии</string>
-  <string name="please_grant_permissions_for_external_storage">Ð?Ñ?едоÑ?Ñ?авÑ?Ñ?е Ñ?азÑ?еÑ?ениÑ? длÑ? доÑ?Ñ?Ñ?па к внеÑ?немÑ? Ñ?Ñ?анилиÑ?Ñ?</string>
     <string name="restore_backup">Ð?оÑ?Ñ?Ñ?ановиÑ?Ñ? из копии</string>
-    <string name="name_can_t_be_empty">Ð?мÑ? не можеÑ? бÑ?Ñ?Ñ? пÑ?Ñ?Ñ?Ñ?м</string>
+  <string name="create_a_backup_first">СнаÑ?ала Ñ?оздайÑ?е Ñ?езеÑ?внÑ?Ñ? копиÑ?</string>
+  <string name="name_can_t_be_empty">Ð?мÑ? не можеÑ? бÑ?Ñ?Ñ? пÑ?Ñ?Ñ?Ñ?м</string>
   <string name="fields_can_t_be_empty">Ð?олÑ? не могÑ?Ñ? бÑ?Ñ?Ñ? пÑ?Ñ?Ñ?Ñ?ми</string>
   <string name="start_tor_again_for_finish_the_process">Ð?апÑ?Ñ?Ñ?иÑ?е Tor Ñ?нова длÑ? завеÑ?Ñ?ениÑ? пÑ?оÑ?еÑ?Ñ?а</string>
   <string name="confirm_service_deletion">Ð?одÑ?веÑ?ждение Ñ?далениÑ? Ñ?лÑ?жбÑ?</string>
diff --git a/app/src/main/res/values-si-rLK/strings.xml b/app/src/main/res/values-si-rLK/strings.xml
index d25c1f8a..2604766b 100644
--- a/app/src/main/res/values-si-rLK/strings.xml
+++ b/app/src/main/res/values-si-rLK/strings.xml
@@ -83,7 +83,6 @@
     <string name="set_locale_title">භ����</string>
     <string name="kb">KB</string>
   <string name="mb">MB</string>
-  <string name="activate">à¶?à·?â??රà·?යà·?à¶?රà·?නà·?න</string>
   <string name="hidden_services">�����ණ� ���� </string>
   <string name="title_activity_hidden_services">�����ණ� ���� </string>
   <string name="menu_hidden_services">�����ණ� ���� </string>
diff --git a/app/src/main/res/values-sk/strings.xml b/app/src/main/res/values-sk/strings.xml
index 7306f4ec..d72eb96b 100644
--- a/app/src/main/res/values-sk/strings.xml
+++ b/app/src/main/res/values-sk/strings.xml
@@ -121,7 +121,6 @@
   <string name="restart_orbot_to_use_this_bridge_">Prosím reštartujte Orbot, aby sa aktivovali zmeny</string>
   <string name="menu_qr">QR kódy</string>
   <string name="get_bridges_email">Email</string>
-  <string name="activate">Aktivovať</string>
   <string name="send_email">Poslať email</string>
   <string name="save">Uložiť</string>
   <string name="name">Meno</string>
diff --git a/app/src/main/res/values-sl/strings.xml b/app/src/main/res/values-sl/strings.xml
index b819d581..026e2710 100644
--- a/app/src/main/res/values-sl/strings.xml
+++ b/app/src/main/res/values-sl/strings.xml
@@ -25,7 +25,6 @@
   <!--Transparent Proxy screen-->
     <string name="error">Napaka</string>
     <string name="set_locale_title">Jezik</string>
-    <string name="activate">Aktiviraj</string>
   <string name="save">Shrani</string>
   <string name="name">ime</string>
 </resources>
diff --git a/app/src/main/res/values-sn/strings.xml b/app/src/main/res/values-sn/strings.xml
index fc47b092..150742c9 100644
--- a/app/src/main/res/values-sn/strings.xml
+++ b/app/src/main/res/values-sn/strings.xml
@@ -6,7 +6,7 @@
   <string name="menu_about">Maererano</string>
     <string name="button_about">Maererano</string>
   <string name="menu_exit">Buda</string>
-  <!--Welcome Wizard strings (DJH)-->
+    <!--Welcome Wizard strings (DJH)-->
     <!--END Welcome Wizard strings (DJH)-->
   <!--New Wizard Strings-->
   <!--Title Screen-->
diff --git a/app/src/main/res/values-sq/strings.xml b/app/src/main/res/values-sq/strings.xml
index b871275a..9850d2f1 100644
--- a/app/src/main/res/values-sq/strings.xml
+++ b/app/src/main/res/values-sq/strings.xml
@@ -23,7 +23,6 @@
   <string name="bridges">Urat</string>
     <string name="set_locale_title">Gjuhë</string>
     <string name="get_bridges_email">Email</string>
-  <string name="activate">Aktivizo</string>
   <string name="save">Ruaje</string>
   <string name="name">Emër</string>
   <string name="backup_restored">Kopjeruajtja u rikthye</string>
diff --git a/app/src/main/res/values-sr/strings.xml b/app/src/main/res/values-sr/strings.xml
index 8a4dc91a..124076e3 100644
--- a/app/src/main/res/values-sr/strings.xml
+++ b/app/src/main/res/values-sr/strings.xml
@@ -125,7 +125,6 @@
   <string name="menu_qr">QR Ð?одови</string>
   <string name="if_your_mobile_network_actively_blocks_tor_you_can_use_a_tor_bridge_to_access_the_network_another_way_to_get_bridges_is_to_send_an_email_to_bridges_torproject_org_please_note_that_you_must_send_the_email_using_an_address_from_one_of_the_following_email_providers_riseup_gmail_or_yahoo_">Ð?ко ваÑ?а мобилна мÑ?ежа акÑ?ивно блокиÑ?а ТоÑ?, можеÑ?е пÑ?емоÑ?Ñ?иваÑ?и Ñ?еÑ?веÑ?ом као алÑ?еÑ?наÑ?ивни наÑ?ин Ñ?лаÑ?ка.Ð?Ð?Ð?Ð?Ð?РÐ? Ñ?еднÑ? од опÑ?иÑ?а за конÑ?игÑ?Ñ?аÑ?иÑ?Ñ? и Ñ?еÑ?Ñ?иÑ?аÑ?е....</string>
   <string name="get_bridges_email">Ð?-поÑ?Ñ?а</string>
-  <string name="activate">Ð?кÑ?ивиÑ?аÑ?и</string>
   <string name="apps_mode">VPN Ð?од</string>
     <string name="send_email">Ð?оÑ?аÑ?и Ð?-поÑ?Ñ?Ñ?</string>
   <string name="vpn_default_world">Ð?лобално (Ð?Ñ?Ñ?омаÑ?Ñ?ки)</string>
@@ -144,9 +143,9 @@
   <string name="delete_service">Ð?бÑ?иÑ?и УÑ?лÑ?гÑ?</string>
   <string name="backup_saved_at_external_storage">РезеÑ?бна копиÑ?а Ñ?е Ñ?аÑ?Ñ?вана на Ñ?поÑ?ноÑ? мемоÑ?иÑ?и</string>
   <string name="backup_restored">РезеÑ?вна копиÑ?а Ñ?е обновÑ?ена</string>
-  <string name="please_grant_permissions_for_external_storage">Ð?олимо да даÑ?е дозволе за екÑ?Ñ?еÑ?но Ñ?кладиÑ?Ñ?еÑ?е</string>
     <string name="restore_backup">Ð?бнови Ñ?езеÑ?внÑ? копиÑ?Ñ?</string>
-    <string name="name_can_t_be_empty">Ð?ме не може биÑ?и пÑ?азно</string>
+  <string name="create_a_backup_first">Ð?апÑ?ави Ñ?езеÑ?внÑ? копиÑ?Ñ? пÑ?во</string>
+  <string name="name_can_t_be_empty">Ð?ме не може биÑ?и пÑ?азно</string>
   <string name="fields_can_t_be_empty">Ð?оÑ?а не могÑ? биÑ?и пÑ?азна</string>
   <string name="start_tor_again_for_finish_the_process">Ð?оново покÑ?ениÑ?е ТоÑ? да биÑ?Ñ?е довÑ?Ñ?или пÑ?оÑ?еÑ?</string>
   <string name="confirm_service_deletion">Ð?оÑ?Ñ?вÑ?ди бÑ?иÑ?анÑ?е Ñ?Ñ?лÑ?ге</string>
diff --git a/app/src/main/res/values-sv/strings.xml b/app/src/main/res/values-sv/strings.xml
index d9b78350..d64eb5fb 100644
--- a/app/src/main/res/values-sv/strings.xml
+++ b/app/src/main/res/values-sv/strings.xml
@@ -127,7 +127,6 @@
   <string name="menu_qr">QR-koder</string>
   <string name="if_your_mobile_network_actively_blocks_tor_you_can_use_a_tor_bridge_to_access_the_network_another_way_to_get_bridges_is_to_send_an_email_to_bridges_torproject_org_please_note_that_you_must_send_the_email_using_an_address_from_one_of_the_following_email_providers_riseup_gmail_or_yahoo_">Om ditt mobilnät aktivt blockerar Tor kan du använda en \"Bridge Server\" som ett alternativt sätt. V�LJ ett av alternativen att konfigurera och testa.,.</string>
   <string name="get_bridges_email">E-post</string>
-  <string name="activate">Aktivera</string>
   <string name="apps_mode">VPN-läge</string>
     <string name="send_email">Skicka e-post</string>
   <string name="vpn_default_world">Global (automatisk)</string>
@@ -146,9 +145,9 @@
   <string name="delete_service">Ta bort tjänst</string>
   <string name="backup_saved_at_external_storage">Säkerhetskopiering sparad i externt lagringsutrymme</string>
   <string name="backup_restored">Backup återställd</string>
-  <string name="please_grant_permissions_for_external_storage">Bevilja tillstånd för extern lagring</string>
     <string name="restore_backup">�terställa säkerhetskopia</string>
-    <string name="name_can_t_be_empty">Namnet kan inte vara tomt</string>
+  <string name="create_a_backup_first">Skapa en säkerhetskopia först</string>
+  <string name="name_can_t_be_empty">Namnet kan inte vara tomt</string>
   <string name="fields_can_t_be_empty">Fält kan inte vara tomma</string>
   <string name="start_tor_again_for_finish_the_process">Starta Tor igen för att avsluta processen</string>
   <string name="confirm_service_deletion">Bekräfta tjänst borttagning</string>
diff --git a/app/src/main/res/values-ta/strings.xml b/app/src/main/res/values-ta/strings.xml
index 77ff4796..1a04526f 100644
--- a/app/src/main/res/values-ta/strings.xml
+++ b/app/src/main/res/values-ta/strings.xml
@@ -32,7 +32,6 @@
   <string name="bridges">Bridge�ள�</string>
     <string name="set_locale_title">ம�ழி</string>
     <string name="get_bridges_email">மின�ன���ல�</string>
-  <string name="activate">��யல�ப��த�தவ�ம�</string>
   <string name="save">��மி</string>
   <string name="name">ப�யர�</string>
   <string name="service_type">��வ� வ��</string>
diff --git a/app/src/main/res/values-th/strings.xml b/app/src/main/res/values-th/strings.xml
index f227ce70..d27760e4 100644
--- a/app/src/main/res/values-th/strings.xml
+++ b/app/src/main/res/values-th/strings.xml
@@ -127,7 +127,6 @@
   <string name="menu_qr">รหัส�ิวอาร�</string>
   <string name="if_your_mobile_network_actively_blocks_tor_you_can_use_a_tor_bridge_to_access_the_network_another_way_to_get_bridges_is_to_send_an_email_to_bridges_torproject_org_please_note_that_you_must_send_the_email_using_an_address_from_one_of_the_following_email_providers_riseup_gmail_or_yahoo_">หา���รือ��าย��รศั����อ��ุ��ิ��ั�� Tor �ุ�สามาร���� \'��ิร���วอร� Bridge\' �����ัว�ลือ����าร���า�ึ���� �ลือ��ัว�ลือ�ห�ึ����ื�อ�ำห����า�ละ��สอ�...</string>
   <string name="get_bridges_email">อี�มล</string>
-  <string name="activate">��ิ�����า�</string>
   <string name="apps_mode">�หม� VPN</string>
     <string name="send_email">ส��อี�มล</string>
   <string name="vpn_default_world">ส�ว�รวม (อั���มั�ิ)</string>
@@ -146,9 +145,9 @@
   <string name="delete_service">�ริ�ารล�</string>
   <string name="backup_saved_at_external_storage">��อมูลสำรอ��ั��ึ��ี��ี�������อมูลภาย�อ�</string>
   <string name="backup_restored">�ื���า��อมูลสำรอ�</string>
-  <string name="please_grant_permissions_for_external_storage">�รุ�าอ�ุ�า��ห����า�ึ��ี�������อมูลภาย�อ�</string>
     <string name="restore_backup">�ื���า��อมูลสำรอ�</string>
-    <string name="name_can_t_be_empty">�ล�อย�ื�อ�ห�ว�า��ม����</string>
+  <string name="create_a_backup_first">สร�า���อมูลสำรอ���อ�</string>
+  <string name="name_can_t_be_empty">�ล�อย�ื�อ�ห�ว�า��ม����</string>
   <string name="fields_can_t_be_empty">�ล�อย�����อมูล�ห�ว�า��ม����</string>
   <string name="start_tor_again_for_finish_the_process">�ริ�ม�ำ�า� Tor อี��รั����ื�อ���ระ�ว��าร</string>
   <string name="confirm_service_deletion">ยื�ยั��ารล��ริ�าร</string>
diff --git a/app/src/main/res/values-tl/strings.xml b/app/src/main/res/values-tl/strings.xml
index 9514f37e..4d0672eb 100644
--- a/app/src/main/res/values-tl/strings.xml
+++ b/app/src/main/res/values-tl/strings.xml
@@ -103,7 +103,6 @@
   <string name="kb">KB</string>
   <string name="mb">MB</string>
   <string name="get_bridges_email">Email</string>
-  <string name="activate">Activate</string>
   <string name="send_email">Send Email</string>
     <string name="save">I-save</string>
   <string name="name">Name</string>
diff --git a/app/src/main/res/values-tr/strings.xml b/app/src/main/res/values-tr/strings.xml
index 13bafec3..0d284492 100644
--- a/app/src/main/res/values-tr/strings.xml
+++ b/app/src/main/res/values-tr/strings.xml
@@ -127,7 +127,6 @@
   <string name="menu_qr">QR Kodları</string>
   <string name="if_your_mobile_network_actively_blocks_tor_you_can_use_a_tor_bridge_to_access_the_network_another_way_to_get_bridges_is_to_send_an_email_to_bridges_torproject_org_please_note_that_you_must_send_the_email_using_an_address_from_one_of_the_following_email_providers_riseup_gmail_or_yahoo_">Tor kullanımı mobil aÄ?ınızda etkin olarak engelleniyorsa, Tor aÄ?ına eriÅ?mek için bir \'Köprü Sunucusu\' kullanabilirsiniz. Yapılandırmak ve denemek için aÅ?aÄ?ıdaki seçeneklerden birini seçin...</string>
   <string name="get_bridges_email">E-posta</string>
-  <string name="activate">EtkinleÅ?tir</string>
   <string name="apps_mode">VPN Kipi</string>
   <string name="send_email">E-posta Gönder</string>
   <string name="vpn_default_world">Genel (Otomatik)</string>
@@ -146,9 +145,9 @@
   <string name="delete_service">Hizmeti Sil</string>
   <string name="backup_saved_at_external_storage">Yedek dıÅ? depolamaya kaydedildi</string>
   <string name="backup_restored">Yedek geri yüklendi</string>
-  <string name="please_grant_permissions_for_external_storage">Lütfen dıÅ? depolama için izinleri verin</string>
-  <string name="restore_backup">YedeÄ?i Geri Yükle</string>
-    <string name="name_can_t_be_empty">Ad boÅ? bırakılamaz</string>
+    <string name="restore_backup">YedeÄ?i Geri Yükle</string>
+  <string name="create_a_backup_first">Ã?nce bir yedek oluÅ?turun</string>
+  <string name="name_can_t_be_empty">Ad boÅ? bırakılamaz</string>
   <string name="fields_can_t_be_empty">Alanlar boÅ? bırakılamaz</string>
   <string name="start_tor_again_for_finish_the_process">Ä°Å?lemi tamamlamak için Tor uygulamasını yeniden baÅ?latın</string>
   <string name="confirm_service_deletion">Hizmeti Silmeyi Onayla</string>
diff --git a/app/src/main/res/values-uk/strings.xml b/app/src/main/res/values-uk/strings.xml
index 7655621b..bd527861 100644
--- a/app/src/main/res/values-uk/strings.xml
+++ b/app/src/main/res/values-uk/strings.xml
@@ -127,7 +127,6 @@
   <string name="menu_qr">QR-коди</string>
   <string name="if_your_mobile_network_actively_blocks_tor_you_can_use_a_tor_bridge_to_access_the_network_another_way_to_get_bridges_is_to_send_an_email_to_bridges_torproject_org_please_note_that_you_must_send_the_email_using_an_address_from_one_of_the_following_email_providers_riseup_gmail_or_yahoo_">ЯкÑ?о ваÑ?а мобÑ?лÑ?на меÑ?ежа акÑ?ивно блокÑ?Ñ? Tor, ви можеÑ?е викоÑ?иÑ?Ñ?овÑ?ваÑ?и \'Bridge Server\' Ñ?к алÑ?Ñ?еÑ?наÑ?ивний Ñ?поÑ?Ñ?б вÑ?одÑ?. Ð?Ð?Ð?Ð?РÐ? один Ñ?з паÑ?амеÑ?Ñ?Ñ?в длÑ? налаÑ?Ñ?Ñ?ваннÑ? Ñ?а Ñ?еÑ?Ñ?Ñ?ваннÑ?...</string>
   <string name="get_bridges_email">Email</string>
-  <string name="activate">Ð?кÑ?ивÑ?ваÑ?и</string>
   <string name="apps_mode">VPN СпоÑ?Ñ?б</string>
     <string name="send_email">Ð?адÑ?Ñ?лаÑ?и лиÑ?Ñ?а</string>
   <string name="vpn_default_world">Ð?лобалÑ?ний (авÑ?омаÑ?иÑ?ний)</string>
@@ -146,9 +145,9 @@
   <string name="delete_service">Ð?илÑ?Ñ?иÑ?и СеÑ?вÑ?Ñ?</string>
   <string name="backup_saved_at_external_storage">РезеÑ?вна копÑ?Ñ? збеÑ?ежена на зовнÑ?Ñ?нÑ?й пам\'Ñ?Ñ?Ñ?</string>
   <string name="backup_restored">РезеÑ?вне копÑ?Ñ?ваннÑ? вÑ?дновлено</string>
-  <string name="please_grant_permissions_for_external_storage">Ð?адайÑ?е дозволи на зовнÑ?Ñ?нÑ? пам\'Ñ?Ñ?Ñ?</string>
     <string name="restore_backup">Ð?Ñ?дновиÑ?и Ñ?езеÑ?внÑ? копÑ?Ñ?</string>
-    <string name="name_can_t_be_empty">Ð?азва не може бÑ?Ñ?и поÑ?ожнÑ?оÑ?</string>
+  <string name="create_a_backup_first">СпеÑ?Ñ?Ñ? Ñ?Ñ?воÑ?иÑ?и Ñ?езеÑ?внÑ? копÑ?Ñ?</string>
+  <string name="name_can_t_be_empty">Ð?азва не може бÑ?Ñ?и поÑ?ожнÑ?оÑ?</string>
   <string name="fields_can_t_be_empty">Ð?олÑ? не можÑ?Ñ?Ñ? бÑ?Ñ?и поÑ?ожнÑ?ми</string>
   <string name="start_tor_again_for_finish_the_process">Ð?апÑ?Ñ?Ñ?Ñ?Ñ?Ñ? Tor зновÑ? длÑ? завеÑ?Ñ?еннÑ? пÑ?оÑ?еÑ?Ñ?</string>
   <string name="confirm_service_deletion">Ð?Ñ?дÑ?веÑ?дÑ?Ñ?е видаленнÑ? Ñ?еÑ?вÑ?Ñ?Ñ?</string>
diff --git a/app/src/main/res/values-ur/strings.xml b/app/src/main/res/values-ur/strings.xml
index 0a9144d1..a1e3111e 100644
--- a/app/src/main/res/values-ur/strings.xml
+++ b/app/src/main/res/values-ur/strings.xml
@@ -5,7 +5,7 @@
     <string name="menu_start">شرÙ?ع کرئÛ?Úº</string>
   <string name="menu_about">Ú©Û? بارÛ? Ù?Û?Úº</string>
     <string name="button_about">Ú©Û? بارÛ? Ù?Û?Úº</string>
-  <!--Welcome Wizard strings (DJH)-->
+    <!--Welcome Wizard strings (DJH)-->
     <!--END Welcome Wizard strings (DJH)-->
   <string name="pref_general_group">عاÙ? </string>
   <!--New Wizard Strings-->
diff --git a/app/src/main/res/values-uz/strings.xml b/app/src/main/res/values-uz/strings.xml
index 88a8df79..6bab2922 100644
--- a/app/src/main/res/values-uz/strings.xml
+++ b/app/src/main/res/values-uz/strings.xml
@@ -10,7 +10,7 @@
   <string name="main_layout_upload">Yuklash</string>
     <string name="button_about">Dasur haqida</string>
     <string name="menu_exit">Chiqish</string>
-  <!--Welcome Wizard strings (DJH)-->
+    <!--Welcome Wizard strings (DJH)-->
     <!--END Welcome Wizard strings (DJH)-->
   <string name="pref_general_group">Umumiy</string>
   <!--New Wizard Strings-->
diff --git a/app/src/main/res/values-vi/strings.xml b/app/src/main/res/values-vi/strings.xml
index 1f1ffff1..cfeaa442 100644
--- a/app/src/main/res/values-vi/strings.xml
+++ b/app/src/main/res/values-vi/strings.xml
@@ -121,7 +121,6 @@
   <string name="restart_orbot_to_use_this_bridge_">Vui lòng khá»?i Ä?á»?ng lại Orbot Ä?á»? áp dụng thay Ä?á»?i</string>
   <string name="menu_qr">Mã QR</string>
   <string name="get_bridges_email">Email</string>
-  <string name="activate">Kích hoạt</string>
   <string name="send_email">Gá»­i email</string>
   <string name="save">LÆ°u</string>
   <string name="name">Tên</string>
diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml
index 1ca54872..054fedcf 100644
--- a/app/src/main/res/values-zh-rCN/strings.xml
+++ b/app/src/main/res/values-zh-rCN/strings.xml
@@ -121,7 +121,6 @@
   <string name="restart_orbot_to_use_this_bridge_">请é??å?¯ Orbot 以使å??æ?´ç??æ??</string>
   <string name="menu_qr">QRç ?</string>
   <string name="get_bridges_email">���件</string>
-  <string name="activate">æ¿?æ´»</string>
   <string name="apps_mode">VPN 模�</string>
   <string name="send_email">å??é??ç?µå­?é?®ä»¶</string>
   <string name="save">ä¿?å­?</string>
diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml
index e19327a9..83b1c846 100644
--- a/app/src/main/res/values-zh-rTW/strings.xml
+++ b/app/src/main/res/values-zh-rTW/strings.xml
@@ -127,7 +127,6 @@
   <string name="menu_qr">QR 碼</string>
   <string name="if_your_mobile_network_actively_blocks_tor_you_can_use_a_tor_bridge_to_access_the_network_another_way_to_get_bridges_is_to_send_an_email_to_bridges_torproject_org_please_note_that_you_must_send_the_email_using_an_address_from_one_of_the_following_email_providers_riseup_gmail_or_yahoo_">å¦?æ??è¡?å??網路主å??å?°å°?é?? Tor å?¯ä»¥ä½¿ç?¨\"æ©?æ?¥ä¼ºæ??å?¨\"ä½?ç?ºæ?¿ä»£æ?¹å¼?.é?¸æ??ä¸?å??é?¸é ?ä½?設å®?å??測試</string>
   <string name="get_bridges_email">Email</string>
-  <string name="activate">å??ç?¨</string>
   <string name="apps_mode">VPN 模�</string>
     <string name="send_email">å¯?é??é?»å­?信件</string>
   <string name="vpn_default_world">å?¨å??(è?ªå??)</string>
@@ -146,9 +145,9 @@
   <string name="delete_service">å?ªé?¤æ??å??</string>
   <string name="backup_saved_at_external_storage">å??份æª?å?²å­?å?¨å¤?é?¨å?²å­?å?¨</string>
   <string name="backup_restored">å??份已é??å??</string>
-  <string name="please_grant_permissions_for_external_storage">è«?æ??æ¬?å¤?æ?¥å?²å­?å?¨ä½¿ç?¨</string>
     <string name="restore_backup">é??å??å??份</string>
-    <string name="name_can_t_be_empty">å??稱ä¸?å?¯ç©ºç?½</string>
+  <string name="create_a_backup_first">å??å?µç«?å??份</string>
+  <string name="name_can_t_be_empty">å??稱ä¸?å?¯ç©ºç?½</string>
   <string name="fields_can_t_be_empty">����空�</string>
   <string name="start_tor_again_for_finish_the_process">å??次é??å?? Tor  以å®?æ??æ­¤é??ç¨?</string>
   <string name="confirm_service_deletion">確èª?æ??å??å?ªé?¤</string>
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index 85b356c9..c0868b5c 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -164,8 +164,6 @@
     <string name="get_bridges_email">Email</string>
     <string name="get_bridges_email_request">Request Bridges via Email</string>
 
-    <string name="activate">Activate</string>
-
     <string name="apps_mode">VPN Mode</string>
 
     <string name="send_email">Send Email</string>
@@ -186,8 +184,8 @@
     <string name="delete_service">Delete Service</string>
     <string name="backup_saved_at_external_storage">Backup saved at external storage</string>
     <string name="backup_restored">Backup restored</string>
-    <string name="please_grant_permissions_for_external_storage">Please grant permissions for external storage</string>
     <string name="restore_backup">Restore Backup</string>
+    <string name="create_a_backup_first">Create a backup first</string>
     <string name="name_can_t_be_empty">Name can\'t be empty</string>
     <string name="fields_can_t_be_empty">Fields can\'t be empty</string>
     <string name="start_tor_again_for_finish_the_process">Start Tor again for finish the process</string>
diff --git a/appcore/src/main/java/org/torproject/android/core/ClipboardUtils.kt b/appcore/src/main/java/org/torproject/android/core/ClipboardUtils.kt
new file mode 100644
index 00000000..0225c0ed
--- /dev/null
+++ b/appcore/src/main/java/org/torproject/android/core/ClipboardUtils.kt
@@ -0,0 +1,17 @@
+package org.torproject.android.core
+
+import android.content.ClipData
+import android.content.ClipboardManager
+import android.content.Context
+import android.widget.Toast
+
+object ClipboardUtils {
+    @JvmStatic
+    fun copyToClipboard(label: String, value: String, successMsg: String, context: Context): Boolean {
+        val clipboard = context.getSystemService(Context.CLIPBOARD_SERVICE) as ClipboardManager?
+                ?: return false
+        clipboard.setPrimaryClip(ClipData.newPlainText(label, value))
+        Toast.makeText(context, successMsg, Toast.LENGTH_LONG).show()
+        return true
+    }
+}
\ No newline at end of file
diff --git a/appcore/src/main/java/org/torproject/android/core/DiskUtils.kt b/appcore/src/main/java/org/torproject/android/core/DiskUtils.kt
index f9ce78ec..7e741695 100644
--- a/appcore/src/main/java/org/torproject/android/core/DiskUtils.kt
+++ b/appcore/src/main/java/org/torproject/android/core/DiskUtils.kt
@@ -1,14 +1,39 @@
 package org.torproject.android.core
 
+import android.annotation.TargetApi
 import android.content.ContentResolver
+import android.content.Context
 import android.content.Intent
 import android.net.Uri
+import android.os.Build
+import android.os.Environment
 import java.io.BufferedReader
+import java.io.File
 import java.io.IOException
-import java.lang.StringBuilder
+import java.io.InputStreamReader
 
 object DiskUtils {
+
+    @JvmStatic
+    fun supportsStorageAccessFramework() = Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT
+
+    @JvmStatic
+    @Throws(IOException::class)
+    fun readFileFromAssets(assetFilename: String, context: Context): String {
+        val reader = BufferedReader(InputStreamReader(context.assets.open(assetFilename)))
+        // do reading, usually loop until end of file reading
+        val sb = StringBuilder()
+        var mLine = reader.readLine()
+        while (mLine != null) {
+            sb.append(mLine).append('\n') // process line
+            mLine = reader.readLine()
+        }
+        reader.close()
+        return sb.toString()
+    }
+
     @JvmStatic
+    @TargetApi(Build.VERSION_CODES.KITKAT)
     fun createWriteFileIntent(filename: String, mimeType: String): Intent = Intent(Intent.ACTION_CREATE_DOCUMENT).apply {
         addCategory(Intent.CATEGORY_OPENABLE)
         type = mimeType
@@ -16,6 +41,7 @@ object DiskUtils {
     }
 
     @JvmStatic
+    @TargetApi(Build.VERSION_CODES.KITKAT)
     fun createReadFileIntent(mimeType: String): Intent = Intent(Intent.ACTION_OPEN_DOCUMENT).apply {
         addCategory(Intent.CATEGORY_OPENABLE)
         type = mimeType
@@ -36,4 +62,15 @@ object DiskUtils {
         return text.toString()
     }
 
+    @JvmStatic
+    fun readFile(contentResolver: ContentResolver, file: File): String = readFileFromInputStream(contentResolver, Uri.fromFile(file))
+
+    @JvmStatic
+    fun getOrCreateLegacyBackupDir(): File? {
+        if (Environment.MEDIA_MOUNTED != Environment.getExternalStorageState()) return null
+        val dir = File(Environment.getExternalStorageDirectory(), "Orbot")
+        return if (!dir.isDirectory && !dir.mkdirs()) null else dir
+    }
+
+
 }
\ No newline at end of file
diff --git a/appcore/src/main/java/org/torproject/android/core/ui/SettingsPreferencesActivity.kt b/appcore/src/main/java/org/torproject/android/core/ui/SettingsPreferencesActivity.kt
index a8eaf644..8aa3af17 100644
--- a/appcore/src/main/java/org/torproject/android/core/ui/SettingsPreferencesActivity.kt
+++ b/appcore/src/main/java/org/torproject/android/core/ui/SettingsPreferencesActivity.kt
@@ -55,11 +55,11 @@ class SettingsPreferencesActivity : PreferenceActivity() {
 
     companion object {
         private const val BUNDLE_KEY_PREFERENCES_XML = "prefxml"
+
         @JvmStatic
-        fun createIntent(context: Context?, @XmlRes xmlPrefId: Int): Intent {
-            val intent = Intent(context, SettingsPreferencesActivity::class.java)
-            intent.putExtra(BUNDLE_KEY_PREFERENCES_XML, xmlPrefId)
-            return intent
-        }
+        fun createIntent(context: Context?, @XmlRes xmlPrefId: Int): Intent =
+                Intent(context, SettingsPreferencesActivity::class.java).apply {
+                    putExtra(BUNDLE_KEY_PREFERENCES_XML, xmlPrefId)
+                }
     }
 }
\ No newline at end of file



_______________________________________________
tor-commits mailing list
tor-commits@xxxxxxxxxxxxxxxxxxxx
https://lists.torproject.org/cgi-bin/mailman/listinfo/tor-commits