diff --git a/secure/simul_efun/comm.c b/secure/simul_efun/comm.c
new file mode 100644
index 0000000..595b852
--- /dev/null
+++ b/secure/simul_efun/comm.c
@@ -0,0 +1,124 @@
+#include <living/comm.h>
+
+// Sendet an alle Objekte in room und room selber durch Aufruf von
+// ReceiveMsg().
+varargs void send_room(object|string room, string msg, int msg_type,
+                       string msg_action, string msg_prefix, object *exclude,
+                       object origin)
+{
+  if (stringp(room))
+    room=load_object(room);
+
+  origin ||= previous_object();
+  object *dest = exclude ? all_inventory(room) - exclude :
+                           all_inventory(room);
+
+  dest->ReceiveMsg(msg, msg_type, msg_action, msg_prefix, origin);
+}
+
+static int _shout_filter( object ob, string pat )
+{
+    string *ignore;
+
+    if ( !environment(ob) )
+       return 0;
+
+    return sizeof( regexp( ({ object_name( environment(ob) ) }), pat ) );
+}
+
+varargs void shout( string s, mixed where ){
+    object *u;
+    string *pfade;
+
+    if ( !sizeof( u = users() - ({ this_player() }) ) )
+       return;
+
+    if ( !where )
+       pfade = ({ "/" });
+    else if ( intp(where) )
+       pfade =
+           ({ implode( efun::explode( object_name( environment(this_player()) ),
+                                   "/" )[0..2], "/" ) + "/" });
+    else if ( stringp(where) )
+       pfade = ({ where });
+    else
+       pfade = where;
+
+    u = filter( u, "_shout_filter", ME, implode( pfade, "|" ) );
+    u->ReceiveMsg(s, MT_COMM|MT_FAR|MSG_DONT_WRAP|MSG_DONT_STORE,
+                  MA_SHOUT_SEFUN, 0, previous_object());
+}
+
+
+#if __VERSION__ > "3.3.718"
+// This sefun replaces the deprecated efun cat().
+#define CAT_MAX_LINES 50
+varargs int cat(string file, int start, int num)
+{
+    if (extern_call())
+        set_this_object(previous_object());
+
+    int more;
+
+    if (num < 0 || !this_player())
+        return 0;
+
+    if (!start)
+        start = 1;
+
+    if (!num || num > CAT_MAX_LINES) {
+        num = CAT_MAX_LINES;
+        more = sizeof(read_file(file, start+num, 1));
+    }
+
+    string txt = read_file(file, start, num);
+    if (!txt)
+        return 0;
+
+    efun::tell_object(this_player(), txt);
+
+    if (more)
+        efun::tell_object(this_player(), "*****TRUNCATED****\n");
+
+    return sizeof(txt & "\n");
+}
+#undef CAT_MAX_LINES
+#endif // __VERSION__ > "3.3.718"
+
+#if __VERSION__ > "3.3.719"
+// This sefun replaces the deprecated efun tail().
+#define TAIL_MAX_BYTES 1000
+varargs int tail(string file)
+{
+    if (extern_call())
+        set_this_object(previous_object());
+
+    if (!stringp(file) || !this_player())
+        return 0;
+
+    string txt = read_bytes(file, -(TAIL_MAX_BYTES + 80), (TAIL_MAX_BYTES + 80));
+    // read_bytes() returns 0 if the start of the section given by
+    // parameter #2 lies beyond the beginning of the file.
+    // In this case we simply try and read the entire file.
+    if (!stringp(txt) && file_size(file) < TAIL_MAX_BYTES+80)
+      txt = read_file(file);
+    // Exit if still nothing could be read.
+    if (!stringp(txt))
+      return 0;
+
+    // cut off first (incomplete) line
+    int index = strstr(txt, "\n");
+    if (index > -1) {
+        if (index + 1 < sizeof(txt))
+            txt = txt[index+1..];
+        else
+            txt = "";
+    }
+
+    efun::tell_object(this_player(), txt);
+
+    return 1;
+}
+#undef TAIL_MAX_BYTES
+#endif // __VERSION__ > "3.3.719"
+
