diff --git a/data/templates/login/default_motd.j2 b/data/templates/login/default_motd.j2
new file mode 100644
index 000000000..8584d261a
--- /dev/null
+++ b/data/templates/login/default_motd.j2
@@ -0,0 +1,14 @@
+Welcome to VyOS!
+
+   ┌── ┐
+   . VyOS {{ version_data.version }}
+   └ ──┘  {{ version_data.release_train }}
+
+ * Documentation:  https://docs.vyos.io/en/{{ version_data.release_train | replace('current', 'latest') }}
+ * Project news:   https://blog.vyos.io
+ * Bug reports:    https://vyos.dev
+
+You can change this banner using "set system login banner post-login" command.
+
+VyOS is a free software distribution that includes multiple components,
+you can check individual component licenses under /usr/share/doc/*/copyright
diff --git a/src/conf_mode/system_login_banner.py b/src/conf_mode/system_login_banner.py
index 65fa04417..923e1bf57 100755
--- a/src/conf_mode/system_login_banner.py
+++ b/src/conf_mode/system_login_banner.py
@@ -1,107 +1,107 @@
 #!/usr/bin/env python3
 #
-# Copyright (C) 2020-2021 VyOS maintainers and contributors
+# Copyright (C) 2020-2024 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 or later 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/>.
 
 from sys import exit
 from copy import deepcopy
 
 from vyos.config import Config
+from vyos.template import render
 from vyos.utils.file import write_file
+from vyos.version import get_version_data
 from vyos import ConfigError
 from vyos import airbag
 airbag.enable()
 
-try:
-    with open('/usr/share/vyos/default_motd') as f:
-        motd = f.read()
-except:
-    # Use an empty banner if the default banner file cannot be read
-    motd = "\n"
-
 PRELOGIN_FILE = r'/etc/issue'
 PRELOGIN_NET_FILE = r'/etc/issue.net'
 POSTLOGIN_FILE = r'/etc/motd'
 
 default_config_data = {
     'issue': 'Welcome to VyOS - \\n \\l\n\n',
-    'issue_net': '',
-    'motd': motd
+    'issue_net': ''
 }
 
 def get_config(config=None):
     banner = deepcopy(default_config_data)
+    banner['version_data'] = get_version_data()
+
     if config:
         conf = config
     else:
         conf = Config()
     base_level = ['system', 'login', 'banner']
 
     if not conf.exists(base_level):
         return banner
     else:
         conf.set_level(base_level)
 
     # Post-Login banner
     if conf.exists(['post-login']):
         tmp = conf.return_value(['post-login'])
         # post-login banner can be empty as well
         if tmp:
             tmp = tmp.replace('\\n','\n')
             tmp = tmp.replace('\\t','\t')
             # always add newline character
             tmp += '\n'
         else:
             tmp = ''
 
         banner['motd'] = tmp
 
     # Pre-Login banner
     if conf.exists(['pre-login']):
         tmp = conf.return_value(['pre-login'])
         # pre-login banner can be empty as well
         if tmp:
             tmp = tmp.replace('\\n','\n')
             tmp = tmp.replace('\\t','\t')
             # always add newline character
             tmp += '\n'
         else:
             tmp = ''
 
         banner['issue'] = banner['issue_net'] = tmp
 
     return banner
 
 def verify(banner):
     pass
 
 def generate(banner):
     pass
 
 def apply(banner):
     write_file(PRELOGIN_FILE, banner['issue'])
     write_file(PRELOGIN_NET_FILE, banner['issue_net'])
-    write_file(POSTLOGIN_FILE, banner['motd'])
+    if 'motd' in banner:
+        write_file(POSTLOGIN_FILE, banner['motd'])
+    else:
+        render(POSTLOGIN_FILE, 'login/default_motd.j2', banner,
+            permission=0o644, user='root', group='root')
 
     return None
 
 if __name__ == '__main__':
     try:
         c = get_config()
         verify(c)
         generate(c)
         apply(c)
     except ConfigError as e:
         print(e)
         exit(1)