diff --git a/src/freedombone-installer b/src/freedombone-installer
index f7e6d5c3845a127b099c1e9b36cc98758edce831..25f7712b8a6901b34c4b05175f1b2b5dbd655fd8 100755
--- a/src/freedombone-installer
+++ b/src/freedombone-installer
@@ -50,6 +50,7 @@ FIREWALL_DOMAINS=/root/${PROJECT_NAME}-firewall-domains.cfg
 local_hostname=$(grep 'host-name' /etc/avahi/avahi-daemon.conf | awk -F '=' '{print $2}').local
 
 webadmin_install_dir="/var/www/${local_hostname}/htdocs/admin"
+language_file="$webadmin_install_dir/.language.txt"
 system_monitor_file="$webadmin_install_dir/.system_monitor.txt"
 dynamic_dns_file="$webadmin_install_dir/.dynamicdns.txt"
 reset_file="$webadmin_install_dir/.reset.txt"
@@ -1342,6 +1343,47 @@ function update_dynamic_dns {
     fi
 }
 
+function change_language {
+    if [ -f "$language_file" ]; then
+        language=$(cat "$language_file")
+        local_hostname=$(grep 'host-name' /etc/avahi/avahi-daemon.conf | awk -F '=' '{print $2}').local
+        webadmin_install_dir="/var/www/${local_hostname}/htdocs/admin"
+        if [ -f "$webadmin_install_dir/language_template.html" ]; then
+            if grep -q "\"$language\"" "$webadmin_install_dir/language_template.html"; then
+                cp "$webadmin_install_dir/language_template.html" "$webadmin_install_dir/language.html"
+                sed -i "s|\"$language\"|\"$language\" selected|g" "$webadmin_install_dir/language.html"
+                chown www-data:www-data "$webadmin_install_dir/language.html"
+
+                config_language=$(grep "DEFAULT_LANGUAGE=" "$CONFIGURATION_FILE" | awk -F '=' '{print $2}')
+                if [[ "$config_language" != "$language" ]]; then
+                    curr_language=$(web_admin_get_language_subdir)
+                    if [ -d "/usr/share/${PROJECT_NAME}/webadmin/${curr_language}" ]; then
+                        # copy files for the new language
+                        cp -r "/usr/share/${PROJECT_NAME}/webadmin/${curr_language}/*" "/usr/share/${PROJECT_NAME}/webadmin/"
+
+                        # recreate some screens from templates
+                        regenerate_blocklist
+                        touch "$system_monitor_file"
+                        update_system_monitor
+                    fi
+
+                    chown -R www-data:www-data "$webadmin_install_dir/*"
+
+                    sed -i "s|DEFAULT_LANGUAGE=.*|DEFAULT_LANGUAGE=$language|g" "$CONFIGURATION_FILE"
+                    locale-gen "${language}"
+                    update-locale LANG="${language}"
+                    update-locale LANGUAGE="${language}"
+                    update-locale LC_MESSAGES="${language}"
+                    update-locale LC_ALL="${language}"
+                    update-locale LC_CTYPE="${language}"
+                fi
+            fi
+        fi
+
+        rm "$language_file"
+    fi
+}
+
 function update_system_monitor {
     if [ -f "$system_monitor_file" ]; then
         rm "$system_monitor_file"
@@ -1435,6 +1477,7 @@ do
                     update_blocklist
                     update_dynamic_dns
                     update_system_monitor
+                    change_language
                     backup_and_restore
                     backup_and_restore_keys
                     add_remove_users
diff --git a/src/freedombone-utils-webadmin b/src/freedombone-utils-webadmin
index b64a533f9a5c28e3d57d202589aa6a77c8664ca3..c235b048d350988fbd17c3eb4f95b438223c334c 100755
--- a/src/freedombone-utils-webadmin
+++ b/src/freedombone-utils-webadmin
@@ -720,6 +720,23 @@ function webadmin_update_system_monitor {
     fi
 }
 
+function webadmin_change_language {
+    read_config_param DEFAULT_LANGUAGE
+    language="$DEFAULT_LANGUAGE"
+
+    local_hostname=$(grep 'host-name' /etc/avahi/avahi-daemon.conf | awk -F '=' '{print $2}').local
+    webadmin_install_dir="/var/www/${local_hostname}/htdocs/admin"
+    if [ -f "$webadmin_install_dir/language_template.html" ]; then
+        if grep -q "\"$language\"" "$webadmin_install_dir/language_template.html"; then
+            cp "$webadmin_install_dir/language_template.html" "$webadmin_install_dir/language.html"
+            sed -i "s|\"$language\"|\"$language\" selected|g" "$webadmin_install_dir/language.html"
+            chown www-data:www-data "$webadmin_install_dir/language.html"
+
+            sed -i "s|DEFAULT_LANGUAGE=.*|DEFAULT_LANGUAGE=$language|g" "$CONFIGURATION_FILE"
+        fi
+    fi
+}
+
 function install_web_admin {
     # This is intended as an admin web user interface
     # similar to Plinth or the yunohost
@@ -881,6 +898,8 @@ function install_web_admin {
         mkdir -p "/var/www/${local_hostname}/htdocs/plinth"
     fi
 
+    webadmin_change_language
+
     web_admin_create_users
 
     # make list of apps which can be added
diff --git a/webadmin/EN/language_template.html b/webadmin/EN/language_template.html
new file mode 100644
index 0000000000000000000000000000000000000000..038aa7aafd31fb6a4dea6441548fc2c2b84c7496
--- /dev/null
+++ b/webadmin/EN/language_template.html
@@ -0,0 +1,206 @@
+<!DOCTYPE html>
+<html>
+  <head>
+    <style>
+      #headerpic {
+          width: 60%;
+          height: auto;
+          margin-right : auto;
+          margin-left : auto;
+          min-width : 220px;
+      }
+
+      .header {
+          text-align: center;
+          padding: 32px;
+      }
+      .headertext {
+          color: #72a7cf;
+          text-align: center;
+          font-size: 120%;
+          font-weight: bold;
+      }
+
+      .card {
+          box-shadow: 0 4px 8px 0 rgba(0, 0, 0, 0.2);
+          max-width: 600px;
+          margin: auto;
+          text-align: center;
+          font-family: arial;
+          clear: both;
+      }
+
+      .card input[type=text] {
+          width: 90%;
+          clear: both;
+          text-align: center;
+          color: black;
+          background-color: lightblue;
+      }
+      .card input[type=password] {
+          width: 90%;
+          clear: both;
+          text-align: center;
+          color: black;
+          background-color: lightblue;
+      }
+
+      .appurl {
+          color: grey;
+          font-size: 100%;
+      }
+
+      .welcomeheader {
+          color: black;
+          font-size: 200%;
+          font-weight: bold;
+      }
+
+      .descriptiontext {
+          color: black;
+          font-size: 90%;
+      }
+
+      .logintext {
+          color: black;
+          font-size: 120%;
+          font-weight: bold;
+          color: #981737;
+      }
+
+      button {
+          border: none;
+          outline: 0;
+          display: inline-block;
+          padding: 8px;
+          color: white;
+          background-color: #000;
+          text-align: center;
+          cursor: pointer;
+          width: 100%;
+          font-size: 18px;
+      }
+
+      a {
+          text-decoration: none;
+          color: black;
+      }
+
+      button:hover, a:hover {
+          opacity: 0.7;
+      }
+
+      .chip {
+          display: inline-block;
+          padding: 0 25px;
+          height: 50px;
+          font-size: 70%;
+          line-height: 50px;
+          border-radius: 25px;
+          background-color: #f1f1f1;
+      }
+
+      .chip img {
+          float: left;
+          margin: 0 10px 0 -25px;
+          height: 50px;
+          width: 50px;
+          border-radius: 50%;
+      }
+
+      .languagelist {
+          font-size: 100%;
+          font-weight: bold;
+          color: black;
+          background-color: lightblue;
+      }
+    </style>
+  </head>
+  <body>
+    <div class="card">
+      <div class="header">
+        <a href="settings.html"><img id="headerpic" class="img-responsive" src="images/logo.png"></a><br>
+
+        <p class="headertext">Choose your language</p>
+
+        <form action="language.php" method="post">
+          <select class="languagelist" name="language" size="10">
+            <option value="en_GB.UTF-8">English</option>
+            <option value="af_ZA.UTF-8">Afrikaans</option>
+            <option value="sq_AL.UTF-8">Albanian</option>
+            <option value="ar_SA.UTF-8">Arabic</option>
+            <option value="eu_ES.UTF-8">Basque</option>
+            <option value="be_BY.UTF-8">Belarusian</option>
+            <option value="bs_BA.UTF-8">Bosnian</option>
+            <option value="bg_BG.UTF-8">Bulgarian</option>
+            <option value="ca_ES.UTF-8">Catalan</option>
+            <option value="hr_HR.UTF-8">Croatian</option>
+            <option value="zh_CN.UTF-8">Chinese (Simplified)</option>
+            <option value="zh_TW.UTF-8">Chinese (Traditional)</option>
+            <option value="cs_CZ.UTF-8">Czech</option>
+            <option value="da_DK.UTF-8">Danish</option>
+            <option value="nl_NL.UTF-8">Dutch</option>
+            <option value="en_US.UTF-8">English (US)</option>
+            <option value="et_EE.UTF-8">Estonian</option>
+            <option value="fa_IR.UTF-8">Farsi</option>
+            <option value="ph_PH.UTF-8">Filipino</option>
+            <option value="fi_FI.UTF-8">Finnish</option>
+            <option value="fr_FR.UTF-8">French</option>
+            <option value="fr_CA.UTF-8">French (Canada)</option>
+            <option value="ga.UTF-8">Gaelic</option>
+            <option value="l_ES.UTF-8">Gallego</option>
+            <option value="ka_GE.UTF-8">Georgian</option>
+            <option value="de_DE.UTF-8">German</option>
+            <option value="de_DE.UTF-8">German (Personal)</option>
+            <option value="el_GR.UTF-8">Greek</option>
+            <option value="gu.UTF-8">Gujarati</option>
+            <option value="he_IL.utf8">Hebrew</option>
+            <option value="hi_IN.UTF-8">Hindi</option>
+            <option value="hu.UTF-8">Hungarian</option>
+            <option value="is_IS.UTF-8">Icelandic</option>
+            <option value="id_ID.UTF-8">Indonesian</option>
+            <option value="it_IT.UTF-8">Italian</option>
+            <option value="ja_JP.UTF-8">Japanese</option>
+            <option value="kn_IN.UTF-8">Kannada</option>
+            <option value="km_KH.UTF-8">Khmer</option>
+            <option value="ko_KR.UTF-8">Korean</option>
+            <option value="lo_LA.UTF-8">Lao</option>
+            <option value="lt_LT.UTF-8">Lithuanian</option>
+            <option value="lat.UTF-8">Latvian</option>
+            <option value="ml_IN.UTF-8">Malayalam</option>
+            <option value="ms_MY.UTF-8">Malaysian</option>
+            <option value="mi_NZ.UTF-8">Maori (Ngai Tahu)</option>
+            <option value="mi_NZ.UTF-8">Maori (Waikoto Uni)</option>
+            <option value="mn.UTF-8">Mongolian</option>
+            <option value="no_NO.UTF-8">Norwegian</option>
+            <option value="nn_NO.UTF-8">Norwegian (Primary)</option>
+            <option value="nn_NO.UTF-8">Nynorsk</option>
+            <option value="pl.UTF-8">Polish</option>
+            <option value="pt_PT.UTF-8">Portuguese</option>
+            <option value="pt_BR.UTF-8">Portuguese (Brazil)</option>
+            <option value="ro_RO.UTF-8">Romanian</option>
+            <option value="ru_RU.UTF-8">Russian</option>
+            <option value="mi_NZ.UTF-8">Samoan</option>
+            <option value="sr_CS.UTF-8">Serbian</option>
+            <option value="sk_SK.UTF-8">Slovak</option>
+            <option value="sl_SI.UTF-8">Slovenian</option>
+            <option value="so_SO.UTF-8">Somali</option>
+            <option value="es_ES.UTF-8">Spanish (International)</option>
+            <option value="sv_SE.UTF-8">Swedish</option>
+            <option value="tl.UTF-8">Tagalog</option>
+            <option value="ta_IN.UTF-8">Tamil</option>
+            <option value="th_TH.UTF-8">Thai</option>
+            <option value="tr_TR.UTF-8">Turkish</option>
+            <option value="uk_UA.UTF-8">Ukrainian</option>
+            <option value="vi_VN.UTF-8">Vietnamese</option>
+          </select>
+          <br><br>
+          <input type="submit" name="submitlanguagecancel" value="Cancel">
+          <input type="submit" name="submitlanguage" value="Select">
+        </form>
+
+        <br>
+      </div>
+    </div>
+  </body>
+</html>
diff --git a/webadmin/EN/settings.html b/webadmin/EN/settings.html
index 2f7c5325bb57132ff7ebffd7c5313ee5415ed9c6..25b3a6028c15f877e00b758a918ae7bd86acfe42 100644
--- a/webadmin/EN/settings.html
+++ b/webadmin/EN/settings.html
@@ -51,7 +51,7 @@
 
     .column {
         -ms-flex: 25%;
-        flex: 25%;
+        flex: 15%;
         max-width: 25%;
         padding: 0 4px;
     }
@@ -109,6 +109,14 @@
           </a>
         </div>
       </div>
+      <div class="column">
+        <div>
+          <a href="./language.html">
+            <img src="images/language.png" style="width:100%">
+            <center>Language</center>
+          </a>
+        </div>
+      </div>
       <div class="column">
         <div>
           <a href="reset.html">
diff --git a/webadmin/dynamicdns.php b/webadmin/dynamicdns.php
index 3a95ef5d66b832ec4391b41326ed81096ef3ac10..5a06ce0261cf720db742c263fcafcff0dab36798 100755
--- a/webadmin/dynamicdns.php
+++ b/webadmin/dynamicdns.php
@@ -9,7 +9,7 @@ if (isset($_POST['submitddns'])) {
     $ddns_username = htmlspecialchars($_POST['ddns_username']);
     $ddns_password = htmlspecialchars($_POST['ddns_password']);
 
-    $ddns_file = fopen(".dynamicdns.txt", "w") or die("Unable to create setup file");
+    $ddns_file = fopen(".dynamicdns.txt", "w") or die("Unable to create dynamicdns file");
     fwrite($ddns_file, $ddns.','.$ddns_username.','.$ddns_password);
     fclose($ddns_file);
 }
diff --git a/webadmin/images/language.png b/webadmin/images/language.png
new file mode 100644
index 0000000000000000000000000000000000000000..1aa992949b6a2913ddaddfa4cd512d819dbb97cc
Binary files /dev/null and b/webadmin/images/language.png differ
diff --git a/webadmin/language.php b/webadmin/language.php
new file mode 100755
index 0000000000000000000000000000000000000000..6da9c9f74896a9342d2413b38399969db7e0bde9
--- /dev/null
+++ b/webadmin/language.php
@@ -0,0 +1,19 @@
+<?php
+
+// Change language
+
+$output_filename = "settings.html";
+
+if (isset($_POST['submitlanguage'])) {
+    $language = htmlspecialchars($_POST['language']);
+
+    $language_file = fopen(".language.txt", "w") or die("Unable to create language file");
+    fwrite($language_file, $language);
+    fclose($language_file);
+}
+
+$htmlfile = fopen("$output_filename", "r") or die("Unable to open $output_filename");
+echo fread($htmlfile,filesize("$output_filename"));
+fclose($htmlfile);
+
+?>