diff --git a/install.sh b/install.sh
index 1cb07958..dc9fb73c 100755
--- a/install.sh
+++ b/install.sh
@@ -82,6 +82,8 @@ install_exec make-automaps/make-automaps          "$DESTDIR$usr_sbindir/make-aut
 install_data misc_systemd_units/automount.service "$DESTDIR$systemdunitdir/automount.service"
 install_data misc_systemd_units/gdm.service       "$DESTDIR$systemdunitdir/gdm.service"
 install_data misc_systemd_units/lazy-umount-nfs.service "$DESTDIR$systemdunitdir/lazy-umount-nfs.service"
+install_exec mkmotd/mkmotd.pl                     "$DESTDIR$usr_sbindir/mkmotd.pl"
+install_data mkmotd/motd.service                  "$DESTDIR$systemdunitdir/motd.service"
 install_exec mxgrub/mxgrub                        "$DESTDIR$usr_sbindir/mxgrub"
 install_exec mxnetctl/mxnetctl                    "$DESTDIR$usr_sbindir/mxnetctl"
 install_exec mxrouter/mxrouterctl                 "$DESTDIR$usr_sbindir/mxrouterctl"
diff --git a/mkmotd/mkmotd.pl b/mkmotd/mkmotd.pl
new file mode 100755
index 00000000..e35bfa61
--- /dev/null
+++ b/mkmotd/mkmotd.pl
@@ -0,0 +1,197 @@
+#! /usr/bin/perl
+use strict;
+use warnings;
+
+#
+# Mutter: /project/admin/linux/mkmotd.pl
+#
+
+if ($ARGV[0] and $ARGV[0] eq 'u') {
+   print `cp -v /project/admin/linux/mkmotd.pl /usr/sbin`;
+   print "update done.\n";
+   exit;
+}
+
+
+my ($os_release)=`/bin/os-release`;chomp($os_release);
+
+our $TEMPLATE;
+
+if ($os_release eq 'mariux_x86_64' || $os_release eq 'mariux_i686') {
+	$TEMPLATE=<<'EOF';
+
+  #     #                  ###         #     #  %HOST%
+  ##   ##    ##    #####    #   #    #  #   #
+  # # # #   #  #   #    #   #   #    #   # #    cpu    %NCPU%x %CPU%
+  #  #  #  #    #  #    #   #   #    #    #     ram    %MEM%
+  #     #  ######  #####    #   #    #   # #    arch   %ARCH% / %BITS%-bit
+  #     #  #    #  #   #    #   #    #  #   #   glibc  %GLIBC%
+  #     #  #    #  #    #  ###   ####  #     #  kernel %KERNEL%
+
+      beyond the return of the next followed generation
+
+  http://twiki.molgen.mpg.de/twiki/bin/view/Edv/MarIuXNews
+
+EOF
+} elsif ($os_release eq 'mariux64') {
+	$TEMPLATE=<<'EOF';
+
+  #     #                  ###         #     #  %HOST%
+  ##   ##    ##    #####    #   #    #  #   #   system %SYSTEM%
+  # # # #   #  #   #    #   #   #    #   # #    cpu    %NCPU%x %CPU%
+  #  #  #  #    #  #    #   #   #    #    # 64  ram    %MEM%
+  #     #  ######  #####    #   #    #   # #    arch   %ARCH% / %BITS%-bit
+  #     #  #    #  #   #    #   #    #  #   #   glibc  %GLIBC%
+  #     #  #    #  #    #  ###   ####  #     #  kernel %KERNEL%
+
+EOF
+
+$TEMPLATE.="    / to bee or not to bee /   ";
+
+if ( -d '/node/tags' ) {
+  $_=`ls /node/tags`;s/\n/ /g;
+  $TEMPLATE.="tags: $_";
+}
+
+$TEMPLATE.="\n";
+
+} else {
+	die "$os_release : unknown os_release\n";
+}
+
+sub readstr {
+  my $f = shift;
+  if ( -e $f ) {
+    open I,'<',$f or die "cannot readstr $f: $!";
+    my $str = <I>;
+    chomp ($str);
+    close I;
+    return $str;
+  }
+  return undef;
+}
+
+sub policy {				# policy('theinternet') --> ('zeile1,'zeile2',....)
+	my ($hostname)=@_;
+
+	open IN,'<','/etc/mxpolicy' or return ();
+	while (<IN>) {
+		if (/^\S/ && /\b$hostname\b/) {
+			my @out;
+			while (<IN>) {
+				/^\S/ and last;
+				/\s+\*\s*(.+)/ and push @out,$1;
+				if (/\s+\`\s*(.+)/) {
+				   my $x = `$1`;chomp($x);
+				   push @out,split(/\n/,$x);
+				}
+			}
+			return @out;
+		}
+	}
+	return ();
+}
+
+
+my %T;
+
+my @un = split(/ /,`uname -a`);
+chomp(@un);
+$_=$un[1];s/\.molgen\.mpg\.de//;
+$T{HOST}   = $_;
+$T{KERNEL} = "$un[2] $un[3]";
+$T{BITS} = 32;     # default (may change sometime...)
+$T{ARCH} = 'i686';
+if ($T{KERNEL} =~ /x86_64|mx64/) {
+  $T{BITS} = 64;
+  $T{ARCH} = 'x86_64';
+}
+
+$_ = `/lib/libc.so.6`;
+/version (\d\S+)[\.,]/;
+$T{GLIBC} = $1;
+
+my @pc=`cat /proc/cpuinfo`;
+my $mn='unknown CPU';
+$T{NCPU} = grep {/model name/ and $mn = $_; /processor/} @pc;
+$mn =~ s/\(.*?\)|xeon|Virtual|Athlon|model name\s*:|six.core|quad.core|dual.core|intel|Processor|cpu|core//ig;
+$mn =~ s/\s(E\d\-)\s/$1/;
+$mn =~ s/\s\d\s\@/ \@/;
+$mn =~ s/version\s+/v/g;
+$mn =~ s/\s+/ /g;
+$mn =~ s/^\s+|\s+$//g;
+$T{CPU} = $mn;
+
+$T{SYSTEM}='';
+{
+  my $sys = '';
+
+#  for i in /sys/devices/virtual/dmi/id/*_{name,vendor,version}; do echo -en "$i\t"; cat $i; done
+#  for i in /sys/devices/virtual/dmi/id/{product_{name,version},sys_vendor}; do echo -en "$i\t"; cat $i; done
+
+#  /sys/devices/virtual/dmi/id
+
+  my $pn = readstr('/sys/devices/virtual/dmi/id/product_name');
+  if ($pn =~ m/All Series|empty/) {
+    $pn = undef;
+    $pn = readstr('/sys/devices/virtual/dmi/id/board_name');
+  }
+#  $pn =~ s/(TYAN Transport )//i;
+
+  my $mf = readstr('/sys/devices/virtual/dmi/id/sys_vendor');
+  if ($mf =~ m/(empty|NVIDIA)/) {
+    $mf = readstr('/sys/devices/virtual/dmi/id/board_vendor');
+  }
+  $mf =~ s/( Inc.| Computer Corporation)//;
+
+  my $vn = readstr('/sys/devices/virtual/dmi/id/product_version');
+  if ($vn =~ m/empty/) {
+    $vn = undef;
+  }
+
+  if ( defined($pn) and $pn eq 'CK8 ') {
+    $mf = $vn;
+    $pn = '';
+  }
+  ($pn ne '') and $pn = " $pn";
+  $T{SYSTEM} = "$mf$pn";
+  $T{SYSTEM} =~ s/_/ /g;
+  $T{SYSTEM} =~ s{( Transport| Tower|Hewlett-Packard |/S2932-E/S2932-SI| Thunder| Computer Corp|Technology Co., Ltd. )}{}i;
+}
+
+my %BC = (
+  'bugblatterbeastoftraal' => 'TYAN VX50 B4985',
+  'crap03' => 'TYAN GT20-B2925/B2925-E',
+  'keineahnung' => 'FUJITSU ESPRIMO P756',
+  'furunkel' => 'HP Z200 Workstation',
+);
+if (exists($BC{$T{HOST}}) and $BC{$T{HOST}} ne $T{SYSTEM}) {
+  system("banner WRONG");
+  die "$BC{$T{HOST}} ne $T{SYSTEM}";
+}
+my @mem = `cat /proc/meminfo`;
+my $mem = '??';
+for (@mem) {
+  if (/MemTotal:\s+(\d+)/) {
+     my $mm = $1;
+     if ( int($mm / 1024 / 1000 ) >= 1 ) {
+        $mem  = (int($mm / 1024 / 100)/10) + 0;
+	$mem .= ' GB';
+     }
+     elsif ( int($mm / 1000 ) >= 1 ) {
+        $mem  = (int($mm / 100)/10) + 0;
+	$mem .= ' MB';
+     }
+     else {
+        $mem = "$mm kB";
+     }
+     last;
+  }
+}
+$T{MEM} = $mem;
+
+
+$TEMPLATE=~s/%(\S+?)%/$T{$1}||$1/eg;
+open O, '>','/etc/motd' or die "/etc/motd: $!\n";
+print O $TEMPLATE,  (join("\n",map ("  ** $_ **",policy($T{HOST})))||"  ** **"),"\n\n";
+close O;
diff --git a/mkmotd/motd.service b/mkmotd/motd.service
new file mode 100644
index 00000000..2d574a63
--- /dev/null
+++ b/mkmotd/motd.service
@@ -0,0 +1,11 @@
+[Unit]
+Description=Make motd
+
+[Service]
+Type=oneshot
+ExecStart=/usr/sbin/mkmotd.pl
+RemainAfterExit=yes
+
+[Install]
+WantedBy=multi-user.target
+