diff --git a/src/freedombone-ddns b/src/freedombone-ddns
index 89bc26f0bdd19d3e3089a186585cc6c45c762943..fb694f9db5c274bae071dd9c9c4fdc45f8e58ccb 100755
--- a/src/freedombone-ddns
+++ b/src/freedombone-ddns
@@ -198,6 +198,43 @@ function choose_dynamic_dns {
     fi
 }
 
+function choose_dynamic_dns_noninteractive {
+    ddns="$1"
+    ddns_username="$2"
+    ddns_password="$3"
+
+    if [ ! "$ddns" ]; then
+        exit 0
+    fi
+
+    DDNS_PROVIDER="$ddns"
+
+    if [[ "$DDNS_PROVIDER" == "none" ]]; then
+        if [ -f /etc/systemd/system/inadyn.service ]; then
+            systemctl stop inadyn
+            systemctl disable inadyn
+        fi
+        save_configuration_values
+    else
+        if [ ! "$ddns_username" ]; then
+            exit 0
+        fi
+        if [ ! "$ddns_password" ]; then
+            exit 0
+        fi
+
+        # shellcheck disable=SC2034
+        DDNS_USERNAME="$ddns_username"
+        DDNS_PASSWORD="$ddns_password"
+        save_configuration_values
+        update_inadyn_config
+        if [ -f /etc/systemd/system/inadyn.service ]; then
+            systemctl enable inadyn
+            systemctl restart inadyn
+        fi
+    fi
+}
+
 if [ ! "$CONFIGURATION_FILE" ]; then
     CONFIGURATION_FILE=$HOME/${PROJECT_NAME}.cfg
 fi
@@ -208,7 +245,11 @@ if [[ "$ONION_ONLY" != 'no' ]]; then
     exit 0
 fi
 
-choose_dynamic_dns
-clear
+if [ ! "$1" ]]; then
+    choose_dynamic_dns
+    clear
+else
+    choose_dynamic_dns_noninteractive "$1" "$2" "$3"
+fi
 
 exit 0
diff --git a/src/freedombone-installer b/src/freedombone-installer
index 4a66bdca750a713b9e123d4857f40d6218cd5146..f478fb52c0e2557c480b3b8d21c1eb53e56dfac1 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"
+dynamic_dns_file="$webadmin_install_dir/.dynamicdns.txt"
 reset_file="$webadmin_install_dir/.reset.txt"
 shutdown_file="$webadmin_install_dir/.shutdown.txt"
 setup_file="$webadmin_install_dir/setup.txt"
@@ -1218,6 +1219,29 @@ function regenerate_blocklist {
     fi
 }
 
+function regenerate_dynamic_dns {
+    ddns="$1"
+    ddns_username="$2"
+    ddns_password="$3"
+
+    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/dynamicdns_template.html" ]; then
+        cp "$webadmin_install_dir/dynamicdns_template.html" "$webadmin_install_dir/dynamicdns.html"
+        if [[ "$ddns" == 'default@freedns.afraid.org' ]]; then
+            ddns='freedns'
+        fi
+        if [[ "$ddns" == 'dyn.com' ]]; then
+            ddns='dyn'
+        fi
+        sed -i "s|\"$ddns\"|\"$ddns\" selected|g" "$webadmin_install_dir/dynamicdns.html"
+        sed -i "s|DDNS_USERNAME|$ddns_username|g" "$webadmin_install_dir/dynamicdns.html"
+        # Note: For security don't populate the password
+        #sed -i "s|DDNS_PASSWORD|$ddns_password|g" "$webadmin_install_dir/dynamicdns.html"
+        chown www-data:www-data "$webadmin_install_dir/dynamicdns.html"
+    fi
+}
+
 function update_blocklist {
     if [ -f "$blocklist_file" ]; then
 
@@ -1287,6 +1311,36 @@ function update_blocklist {
     fi
 }
 
+function update_dynamic_dns {
+    if [ -f "$dynamic_dns_file" ]; then
+        ddns=$(awk -F ',' '{print $1}' < "$dynamic_dns_file")
+        ddns_username=$(awk -F ',' '{print $2}' < "$dynamic_dns_file")
+        ddns_password=$(awk -F ',' '{print $3}' < "$dynamic_dns_file")
+
+        ddns_is_valid=
+        if [ "$ddns_username" ]; then
+            if [ "$ddns_password" ]; then
+                if [ ${#ddns_username} -gt 2 ]; then
+                    if [ ${#ddns_username} -lt 512 ]; then
+                        if [ ${#ddns_password} -gt 2 ]; then
+                            if [ ${#ddns_password} -lt 512 ]; then
+                                ddns_is_valid=1
+                            fi
+                        fi
+                    fi
+                fi
+            fi
+        fi
+
+        if [ $ddns_is_valid ]; then
+            /usr/local/bin/${PROJECT_NAME}-ddns "$ddns" "$ddns_username" "$ddns_password"
+            regenerate_dynamic_dns "$ddns" "$ddns_username" "$ddns_password"
+        fi
+
+        rm "$dynamic_dns_file"
+    fi
+}
+
 # If the freedombone command is already running then kill its process
 #shellcheck disable=SC2009
 install_process=$(ps a | grep '/usr/local/bin/freedombone -c' | grep -v 'grep')
@@ -1346,6 +1400,7 @@ do
                     reset_shutdown
                     webadmin_change_password
                     update_blocklist
+                    update_dynamic_dns
                     backup_and_restore
                     backup_and_restore_keys
                     add_remove_users
diff --git a/src/freedombone-utils-webadmin b/src/freedombone-utils-webadmin
index 1b726788a6d9c6c88a669437810028c6bc84a826..277140538701cc2501c1be547b56238451c45978 100755
--- a/src/freedombone-utils-webadmin
+++ b/src/freedombone-utils-webadmin
@@ -668,6 +668,30 @@ function image_install_web_admin {
     chroot "$rootdir" systemctl enable webadmin
 }
 
+function regenerate_webadmin_dynamic_dns {
+    read_config_param DDNS_PROVIDER
+    read_config_param DDNS_USERNAME
+    read_config_param DDNS_PASSWORD
+
+    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/dynamicdns_template.html" ]; then
+        cp "$webadmin_install_dir/dynamicdns_template.html" "$webadmin_install_dir/dynamicdns.html"
+        ddns="$DDNS_PROVIDER"
+        if [[ "$ddns" == 'default@freedns.afraid.org' ]]; then
+            ddns='freedns'
+        fi
+        if [[ "$ddns" == 'dyn.com' ]]; then
+            ddns='dyn'
+        fi
+        sed -i "s|\"$ddns\"|\"$ddns\" selected|g" "$webadmin_install_dir/dynamicdns.html"
+        sed -i "s|DDNS_USERNAME|$DDNS_USERNAME|g" "$webadmin_install_dir/dynamicdns.html"
+        # Note: For security don't populate the password
+        #sed -i "s|DDNS_PASSWORD|$DDNS_PASSWORD|g" "$webadmin_install_dir/dynamicdns.html"
+        chown www-data:www-data "$webadmin_install_dir/dynamicdns.html"
+    fi
+}
+
 function install_web_admin {
     # This is intended as an admin web user interface
     # similar to Plinth or the yunohost
@@ -848,6 +872,8 @@ function install_web_admin {
     web_admin_configure_installer_daemon
 
     regenerate_webadmin_blocklist
+
+    regenerate_webadmin_dynamic_dns
 }
 
 # NOTE: deliberately no exit 0
diff --git a/webadmin/EN/dynamicdns_template.html b/webadmin/EN/dynamicdns_template.html
index 47cdbec40906a71c30d5e0266fa092397eaedc59..38fbc893d50da5a0be0bed40c4da9f3f495abfd5 100644
--- a/webadmin/EN/dynamicdns_template.html
+++ b/webadmin/EN/dynamicdns_template.html
@@ -123,10 +123,11 @@
 
         <p class="headertext">Dynamic DNS</p>
 
-        <form action="dunamicdns.php" method="post">
+        <form action="dynamicdns.php" method="post">
           <select class="ddnslist" name="dynamicdns" size="5">
-            <option value="freedns.afraid.org" selected>freedns.afraid.org</option>
-            <option value="dyn.com">dyn.com</option>
+            <option value="none">none</option>
+            <option value="freedns" selected>freedns.afraid.org</option>
+            <option value="dyn">dyn.com</option>
             <option value="zoneedit.com">zoneedit.com</option>
             <option value="no-ip.com">no-ip.com</option>
             <option value="easydns.com">easydns.com</option>
@@ -153,8 +154,8 @@
             <option value="cloudxns.net">cloudxns.net</option>
           </select>
           <br><br>
-          Username: <input type="text" name="ddns_username"><br><br>
-          Password: <input type="password" name="ddns_password"><br><br><br>
+          Username: <input type="text" name="ddns_username" value="DDNS_USERNAME"><br><br>
+          Password: <input type="password" name="ddns_password" value="DDNS_PASSWORD"><br><br><br>
           <input type="submit" name="submitddnscancel" value="Cancel">
           <input type="submit" name="submitddns" value="Continue">
         </form>
diff --git a/webadmin/dynamicdns.php b/webadmin/dynamicdns.php
new file mode 100755
index 0000000000000000000000000000000000000000..3a95ef5d66b832ec4391b41326ed81096ef3ac10
--- /dev/null
+++ b/webadmin/dynamicdns.php
@@ -0,0 +1,21 @@
+<?php
+
+// Change dynamic DNS settings
+
+$output_filename = "settings.html";
+
+if (isset($_POST['submitddns'])) {
+    $ddns = htmlspecialchars($_POST['dynamicdns']);
+    $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");
+    fwrite($ddns_file, $ddns.','.$ddns_username.','.$ddns_password);
+    fclose($ddns_file);
+}
+
+$htmlfile = fopen("$output_filename", "r") or die("Unable to open $output_filename");
+echo fread($htmlfile,filesize("$output_filename"));
+fclose($htmlfile);
+
+?>