diff --git a/LICENSES b/LICENSES
index 09717ea6d..6032b44ea 100644
--- a/LICENSES
+++ b/LICENSES
@@ -62,6 +62,7 @@ specified and linked otherwise.
- modules/installed/sharing/file_explorer.py :: -
- modules/installed/sharing/sharing.py :: -
- modules/installed/system/config.py :: -
+- modules/installed/system/diagnostics.py :: -
- modules/installed/system/expert_mode.py :: -
- modules/installed/system/system.py :: -
- modules/installed/system/time_zones :: -
diff --git a/actions/diagnostic-test b/actions/diagnostic-test
new file mode 100755
index 000000000..10f8610d5
--- /dev/null
+++ b/actions/diagnostic-test
@@ -0,0 +1,3 @@
+#!/bin/sh
+
+/usr/lib/freedombox/testsuite/check
diff --git a/modules/diagnostics.py b/modules/diagnostics.py
new file mode 120000
index 000000000..31b7abf86
--- /dev/null
+++ b/modules/diagnostics.py
@@ -0,0 +1 @@
+installed/system/diagnostics.py
\ No newline at end of file
diff --git a/modules/installed/system/diagnostics.py b/modules/installed/system/diagnostics.py
new file mode 100644
index 000000000..b87afb68d
--- /dev/null
+++ b/modules/installed/system/diagnostics.py
@@ -0,0 +1,69 @@
+#
+# This file is part of Plinth.
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+#
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see
The system diagnostic test will run a number of checks on your + system to confirm that network services are running and configured + properly. It may take a minute to complete.
+ """) + main += '' + return self.fill_template(title=_("System Diagnostics"), main=main) + +class test(PagePlugin): + order = 31 + def __init__(self, *args, **kwargs): + PagePlugin.__init__(self, *args, **kwargs) + self.register_page("sys.diagnostics.test") + + @cherrypy.expose + @require() + def index(self): + main = '' + output, error = actions.superuser_run("diagnostic-test") + + if error: + main += _("The diagnostic test encountered an error:") + for line in error.split('\n'): + main += line + "" + + if output: + main += _("Output of diagnostic test:") + for line in output.split('\n'): + main += line + "" + + return self.fill_template(title=_("Diagnostic Test"), main=main)