diff --git a/data/op-mode-standardized.json b/data/op-mode-standardized.json
index db13eeb5a..e120336f3 100644
--- a/data/op-mode-standardized.json
+++ b/data/op-mode-standardized.json
@@ -1,14 +1,15 @@
 [
 "bridge.py",
 "conntrack.py",
 "container.py",
 "cpu.py",
 "memory.py",
 "nat.py",
 "neighbor.py",
 "openconnect.py",
 "route.py",
 "ipsec.py",
+"uptime.py",
 "version.py",
 "vrf.py"
 ]
diff --git a/op-mode-definitions/show-system.xml.in b/op-mode-definitions/show-system.xml.in
index 60ed28b6f..6962ad374 100644
--- a/op-mode-definitions/show-system.xml.in
+++ b/op-mode-definitions/show-system.xml.in
@@ -1,177 +1,177 @@
 <?xml version="1.0"?>
 <interfaceDefinition>
   <node name="show">
     <children>
       <node name="system">
         <properties>
           <help>Show system information</help>
         </properties>
         <children>
           <node name="connections">
             <properties>
               <help>Show active network connections on the system</help>
             </properties>
             <command>netstat -an</command>
             <children>
               <node name="tcp">
                 <properties>
                   <help>Show TCP connection information</help>
                 </properties>
                 <command>ss -t -r</command>
                 <children>
                   <leafNode name="all">
                     <properties>
                       <help>Show all TCP connections</help>
                     </properties>
                     <command>ss -t -a</command>
                   </leafNode>
                   <leafNode name="numeric">
                     <properties>
                       <help>Show TCP connection without resolving names</help>
                     </properties>
                     <command>ss -t -n</command>
                   </leafNode>
                 </children>
               </node>
               <node name="udp">
                 <properties>
                   <help>Show UDP socket information</help>
                 </properties>
                 <command>ss -u -a -r</command>
                 <children>
                   <leafNode name="numeric">
                     <properties>
                       <help>Show UDP socket information without resolving names</help>
                     </properties>
                     <command>ss -u -a -n</command>
                   </leafNode>
                 </children>
               </node>
             </children>
           </node>
           <leafNode name="cpu">
             <properties>
               <help>Show CPU information</help>
             </properties>
             <command>${vyos_op_scripts_dir}/cpu.py show</command>
           </leafNode>
           <leafNode name="kernel-messages">
             <properties>
               <help>Show messages in kernel ring buffer</help>
             </properties>
             <command>sudo dmesg</command>
           </leafNode>
           <node name="login">
             <properties>
               <help>Show user accounts</help>
             </properties>
             <children>
               <node name="users">
                 <properties>
                   <help>Show user account information</help>
                 </properties>
                 <command>${vyos_libexec_dir}/vyos-sudo.py ${vyos_op_scripts_dir}/show_users.py</command>
                 <children>
                   <leafNode name="all">
                     <properties>
                       <help>Show information about all accounts</help>
                     </properties>
                     <command>${vyos_libexec_dir}/vyos-sudo.py ${vyos_op_scripts_dir}/show_users.py all</command>
                   </leafNode>
                   <leafNode name="locked">
                     <properties>
                       <help>Show information about locked accounts</help>
                     </properties>
                     <command>${vyos_libexec_dir}/vyos-sudo.py ${vyos_op_scripts_dir}/show_users.py locked</command>
                   </leafNode>
                   <leafNode name="other">
                     <properties>
                       <help>Show information about non VyOS user accounts</help>
                     </properties>
                     <command>${vyos_libexec_dir}/vyos-sudo.py ${vyos_op_scripts_dir}/show_users.py other</command>
                   </leafNode>
                   <leafNode name="vyos">
                     <properties>
                       <help>Show information about VyOS user accounts</help>
                     </properties>
                     <command>${vyos_libexec_dir}/vyos-sudo.py ${vyos_op_scripts_dir}/show_users.py vyos</command>
                   </leafNode>
                 </children>
               </node>
             </children>
           </node>
           <node name="memory">
             <properties>
               <help>Show system memory usage</help>
             </properties>
             <command>${vyos_op_scripts_dir}/memory.py show</command>
             <children>
               <leafNode name="cache">
                 <properties>
                   <help>Show kernel cache information</help>
                 </properties>
                 <command>sudo slabtop -o</command>
               </leafNode>
               <leafNode name="detail">
                 <properties>
                   <help>Show detailed system memory usage</help>
                 </properties>
                 <command>cat /proc/meminfo</command>
               </leafNode>
               <leafNode name="routing-daemons">
                 <properties>
                   <help>Show memory usage of all routing protocols</help>
                 </properties>
                 <command>vtysh -c "show memory"</command>
               </leafNode>
             </children>
           </node>
           <node name="processes">
             <properties>
               <help>Show system processes</help>
             </properties>
             <command>ps ax</command>
             <children>
               <leafNode name="extensive">
                 <properties>
                   <help>Show extensive process info</help>
                 </properties>
                 <command>top -b -n1</command>
               </leafNode>
               <leafNode name="summary">
                 <properties>
                   <help>Show summary of system processes</help>
                 </properties>
-                <command>${vyos_op_scripts_dir}/show_uptime.py</command>
+                <command>${vyos_op_scripts_dir}/uptime.py show</command>
               </leafNode>
               <leafNode name="tree">
                 <properties>
                   <help>Show process tree</help>
                 </properties>
                 <command>ps -ejH</command>
               </leafNode>
             </children>
           </node>
           <leafNode name="routing-daemons">
             <properties>
               <help>Show Quagga routing daemons</help>
             </properties>
             <command>vtysh -c "show daemons"</command>
           </leafNode>
           <leafNode name="storage">
             <properties>
               <help>Show filesystem usage</help>
             </properties>
             <command>df -h -x squashfs</command>
           </leafNode>
           <leafNode name="uptime">
             <properties>
               <help>Show system uptime and load averages</help>
             </properties>
-            <command>${vyos_op_scripts_dir}/show_uptime.py</command>
+            <command>${vyos_op_scripts_dir}/uptime.py show</command>
           </leafNode>
         </children>
       </node>
     </children>
   </node>
 </interfaceDefinition>
diff --git a/src/op_mode/show_uptime.py b/src/op_mode/uptime.py
similarity index 72%
rename from src/op_mode/show_uptime.py
rename to src/op_mode/uptime.py
index b70c60cf8..2ebe6783b 100755
--- a/src/op_mode/show_uptime.py
+++ b/src/op_mode/uptime.py
@@ -1,66 +1,82 @@
 #!/usr/bin/env python3
 #
 # Copyright (C) 2021-2022 VyOS maintainers and contributors
 #
 # This program is free software; you can redistribute it and/or modify
 # it under the terms of the GNU General Public License version 2 as
 # published by the Free Software Foundation.
 #
 # 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 General Public License for more details.
 #
 # You should have received a copy of the GNU General Public License
 # along with this program.  If not, see <http://www.gnu.org/licenses/>.
 
-def get_uptime_seconds():
+import sys
+
+import vyos.opmode
+
+def _get_uptime_seconds():
   from re import search
   from vyos.util import read_file
 
   data = read_file("/proc/uptime")
   seconds = search("([0-9\.]+)\s", data).group(1)
 
   return int(float(seconds))
 
-def get_load_averages():
+def _get_load_averages():
     from re import search
     from vyos.util import cmd
     from vyos.cpu import get_core_count
 
     data = cmd("uptime")
     matches = search(r"load average:\s*(?P<one>[0-9\.]+)\s*,\s*(?P<five>[0-9\.]+)\s*,\s*(?P<fifteen>[0-9\.]+)\s*", data)
 
     core_count = get_core_count()
 
     res = {}
     res[1]  = float(matches["one"]) / core_count
     res[5]  = float(matches["five"]) / core_count
     res[15] = float(matches["fifteen"]) / core_count
 
     return res
 
-def get_raw_data():
+def _get_raw_data():
     from vyos.util import seconds_to_human
 
     res = {}
-    res["uptime_seconds"] = get_uptime_seconds()
-    res["uptime"] = seconds_to_human(get_uptime_seconds())
-    res["load_average"] = get_load_averages()
+    res["uptime_seconds"] = _get_uptime_seconds()
+    res["uptime"] = seconds_to_human(_get_uptime_seconds())
+    res["load_average"] = _get_load_averages()
 
     return res
 
-def get_formatted_output():
-    data = get_raw_data()
-
+def _get_formatted_output(data):
     out = "Uptime: {}\n\n".format(data["uptime"])
     avgs = data["load_average"]
     out += "Load averages:\n"
     out += "1  minute:   {:.01f}%\n".format(avgs[1]*100)
     out += "5  minutes:  {:.01f}%\n".format(avgs[5]*100)
     out += "15 minutes:  {:.01f}%\n".format(avgs[15]*100)
 
     return out
 
+def show(raw: bool):
+    uptime_data = _get_raw_data()
+
+    if raw:
+        return uptime_data
+    else:
+        return _get_formatted_output(uptime_data)
+
 if __name__ == '__main__':
-    print(get_formatted_output())
+    try:
+        res = vyos.opmode.run(sys.modules[__name__])
+        if res:
+            print(res)
+    except (ValueError, vyos.opmode.Error) as e:
+        print(e)
+        sys.exit(1)