diff --git a/package/gluon-config-mode/files/usr/lib/lua/luci/controller/gluon-config-mode/index.lua b/package/gluon-config-mode/files/usr/lib/lua/luci/controller/gluon-config-mode/index.lua
index def9d401707477886c7b1f82a912c36b2ada5ec0..521d8658eff95df8480568dbcf228a5273e5b197 100644
--- a/package/gluon-config-mode/files/usr/lib/lua/luci/controller/gluon-config-mode/index.lua
+++ b/package/gluon-config-mode/files/usr/lib/lua/luci/controller/gluon-config-mode/index.lua
@@ -48,13 +48,13 @@ function index()
 end
 
 function action_reboot()
-  local configmode = require "luci.tools.gluon-config-mode"
+  local util = require "luci.util"
   local pubkey
   local uci = luci.model.uci.cursor()
   local meshvpn_enabled = uci:get("fastd", meshvpn_name, "enabled", "0")
   local sysconfig = require 'gluon.sysconfig'
   if meshvpn_enabled == "1" then
-    pubkey = configmode.get_fastd_pubkey(meshvpn_name)
+    pubkey = util.exec("/etc/init.d/fastd show_key " .. meshvpn_name)
   end
 
   uci:set("gluon-setup-mode", uci:get_first("gluon-setup-mode", "setup_mode"), "configured", "1")
diff --git a/package/gluon-config-mode/files/usr/lib/lua/luci/model/cbi/gluon-config-mode/wizard.lua b/package/gluon-config-mode/files/usr/lib/lua/luci/model/cbi/gluon-config-mode/wizard.lua
index ce7e549cd263b25c5211894f409ab1767d33f48a..a663585bbad7d85e2736742af37b231b79516667 100644
--- a/package/gluon-config-mode/files/usr/lib/lua/luci/model/cbi/gluon-config-mode/wizard.lua
+++ b/package/gluon-config-mode/files/usr/lib/lua/luci/model/cbi/gluon-config-mode/wizard.lua
@@ -1,11 +1,7 @@
-local configmode = require "luci.tools.gluon-config-mode"
 local meshvpn_name = "mesh_vpn"
 local uci = luci.model.uci.cursor()
 local f, s, o
 
--- prepare fastd key as early as possible
-configmode.setup_fastd_secret(meshvpn_name)
-
 f = SimpleForm("wizard")
 f.reset = false
 f.template = "gluon-config-mode/cbi/wizard"
diff --git a/package/gluon-config-mode/files/usr/lib/lua/luci/tools/gluon-config-mode.lua b/package/gluon-config-mode/files/usr/lib/lua/luci/tools/gluon-config-mode.lua
deleted file mode 100644
index ba1748f1ec0d22acc97b6b1c552d31fbbe4b32b3..0000000000000000000000000000000000000000
--- a/package/gluon-config-mode/files/usr/lib/lua/luci/tools/gluon-config-mode.lua
+++ /dev/null
@@ -1,29 +0,0 @@
-local luci = require "luci"
-local io = require "io"
-
-module "luci.tools.gluon-config-mode"
-
-function setup_fastd_secret(name)
-  local uci = luci.model.uci.cursor()
-  local secret = uci:get("fastd", name, "secret")
-
-  if not secret or not secret:match("%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x") then
-    local f = io.popen("fastd --generate-key --machine-readable", "r")
-    local secret = f:read("*a")
-    f:close()
-
-    uci:set("fastd", name, "secret", secret)
-    uci:save("fastd")
-    uci:commit("fastd")
-  end
-end
-
-function get_fastd_pubkey(name)
-  local f = io.popen("/etc/init.d/fastd show_key " .. name, "r")
-  local key = f:read("*a")
-  f:close()
-
-  return key
-end
-
-
diff --git a/package/gluon-luci-admin/files/usr/lib/lua/luci/view/admin/info.htm b/package/gluon-luci-admin/files/usr/lib/lua/luci/view/admin/info.htm
index 5d243a898edddce1116fdb0262598574cc4b001e..9c3843995211636273c09701ba5e1e4bc2512aa6 100644
--- a/package/gluon-luci-admin/files/usr/lib/lua/luci/view/admin/info.htm
+++ b/package/gluon-luci-admin/files/usr/lib/lua/luci/view/admin/info.htm
@@ -25,11 +25,15 @@
      version = util.trim(fs.readfile('/lib/gluon/gluon-version')),
      release = util.trim(fs.readfile('/lib/gluon/release')),
      site = site.site_name,
+     pubkey = 'n/a',
    }
 
-   local pubkey = util.trim(util.exec('/etc/init.d/fastd show_key mesh_vpn'))
-   if pubkey ~= '' then
-     values.pubkey = pubkey
+   local meshvpn_enabled = uci:get("fastd", "mesh_vpn", "enabled", "0")
+   if meshvpn_enabled == "1" then
+     local pubkey = util.trim(util.exec('/etc/init.d/fastd show_key mesh_vpn'))
+     if pubkey ~= '' then
+       values.pubkey = pubkey
+     end
    end
 -%>
 <h2>Info</h2>
diff --git a/package/gluon-mesh-vpn-fastd/files/lib/gluon/upgrade/mesh-vpn-fastd/invariant/020-secret-generate b/package/gluon-mesh-vpn-fastd/files/lib/gluon/upgrade/mesh-vpn-fastd/invariant/020-secret-generate
new file mode 100755
index 0000000000000000000000000000000000000000..68a2fe6763ca3c140452a032fcbf6b7d02853118
--- /dev/null
+++ b/package/gluon-mesh-vpn-fastd/files/lib/gluon/upgrade/mesh-vpn-fastd/invariant/020-secret-generate
@@ -0,0 +1,13 @@
+#!/usr/bin/lua
+
+local uci = require 'luci.model.uci'
+
+local c = uci.cursor()
+
+local secret = c:get("fastd", "mesh_vpn", "secret")
+
+if not secret or not secret:match(("%x"):rep(64)) then
+  c:set("fastd", "mesh_vpn", "secret", "generate")
+  c:save("fastd")
+  c:commit("fastd")
+end