diff --git a/secure/simul_efun/simul_efun.c b/secure/simul_efun/simul_efun.c
index b9a633a..f9dc05e 100644
--- a/secure/simul_efun/simul_efun.c
+++ b/secure/simul_efun/simul_efun.c
@@ -198,97 +198,112 @@
 nomask varargs int snoop( object snooper, object snoopee )
 {
     int ret;
-    object snooper1, snooper2, snooper3;
 
     if( !objectp(snooper) || snooper == snoopee || !PO )
        return 0;
 
     // Evtl. gibt es bereits einen snoopee, der von snopper gesnoopt wird?
-    object orig_snoopee = efun::interactive_info(snooper, II_SNOOP_PREV);
+    object existing_snoopee = efun::interactive_info(snooper, II_SNOOP_PREV);
 
+     // soll jemand neues gesnoopt werden?
      if(snoopee)
      {
+        // Jemand mit niedrigerem Level kann keinen hoeherleveligen snoopen
+        // lassen.
         if ( PO != snooper
              && query_wiz_grp(snooper) >= query_wiz_grp(geteuid(PO)) )
             return 0;
 
-        if ( query_wiz_grp(snooper) <= query_wiz_grp(snoopee) &&
-             !(snoopee->QueryAllowSnoop(snooper)) )
+        // Niedriglevelige User koennen nur mit Einverstaendnis hoeherlevelige
+        // snoopen.
+        if ( query_wiz_grp(snooper) <= query_wiz_grp(snoopee)
+             && !(snoopee->QueryAllowSnoop(snooper)) )
         {
+            // es sei denn der snooper ist Sheriff und der snoopee ist kein
+            // EM+
             if ( !IS_DEPUTY(snooper) || IS_ARCH(snoopee) )
                return 0;
         }
-
-        if ( (snooper1 = efun::interactive_info(snoopee, II_SNOOP_NEXT)) &&
-             query_wiz_grp(snooper1) >= query_wiz_grp(snooper) )
+        // Wird der snoopee bereits gesnoopt? Dann darf sich der neue snooper
+        // nur unter Umstaenden in die Snoop-Kette einreihen...
+        object existing_snooper;
+        if ( (existing_snooper = efun::interactive_info(snoopee, II_SNOOP_NEXT))
+             && query_wiz_grp(existing_snooper) >= query_wiz_grp(snooper) )
         {
-            if ( snooper1->QueryProp(P_SNOOPFLAGS) & SF_LOCKED )
+            // ... naemlich nur dann, wenn der bestehende Snooper kein
+            // SF_LOCKED gesetzt hat.
+            if ( existing_snooper->QueryProp(P_SNOOPFLAGS) & SF_LOCKED )
                return 0;
 
-            tell_object( snooper1, sprintf( "%s snooped jetzt %s.\n",
+            tell_object( existing_snooper, sprintf( "%s snooped jetzt %s.\n",
                                        snooper->name(WER), snoopee->name(WER) ) );
 
-            snooper2 = snooper;
-
-            while ( snooper3 = interactive_info(snooper2, II_SNOOP_NEXT) )
+            // Evtl. wird der neue snooper selber gesnoopt. Dafuer wird jetzt
+            // ggf. die Kette von *ihren* snoopern verfolgt.
+            object snooper_of_new_snooper = snooper;
+            object snooper_rover;
+            while ( snooper_rover = interactive_info(snooper_of_new_snooper, II_SNOOP_NEXT) )
             {
-               tell_object( snooper1,
+               tell_object( existing_snooper,
                            sprintf( "%s wird seinerseits von %s gesnooped.\n"
-                                   ,snooper2->name(WER),
-                                   snooper3->name(WEM) ) );
-               snooper2 = snooper3;
+                                   ,snooper_of_new_snooper->name(WER),
+                                   snooper_rover->name(WEM) ) );
+               snooper_of_new_snooper = snooper_rover;
             }
 
-            efun::snoop( snooper1, snooper2 );
+            // Der letzt snooper des hier anzumeldenden snoopers wird nun vom
+            // bestehenden snooper gesnoopt, falls moeglich.
+            efun::snoop( existing_snooper, snooper_of_new_snooper );
 
-            if ( efun::interactive_info(snooper2, II_SNOOP_NEXT) != snooper1 )
-               tell_object( snooper1, sprintf( "Du kannst %s nicht snoopen.\n",
-                                          snooper2->name(WEN) ) );
+            if ( efun::interactive_info(snooper_of_new_snooper, II_SNOOP_NEXT)
+                   != existing_snooper )
+               tell_object( existing_snooper, sprintf( "Du kannst %s nicht snoopen.\n",
+                                          snooper_of_new_snooper->name(WEN) ) );
             else
             {
-               tell_object( snooper1, sprintf( "Du snoopst jetzt %s.\n",
-                                          snooper2->name(WEN) ) );
-               if ( !IS_DEPUTY(snooper1) )
+               tell_object( existing_snooper, sprintf( "Du snoopst jetzt %s.\n",
+                                          snooper_of_new_snooper->name(WEN) ) );
+               if ( !IS_DEPUTY(existing_snooper) )
                {
                    log_file( SNOOPLOGFILE, sprintf("%s: %O %O %O\n",
                                                dtime(time()),
-                                               snooper1,
-                                               snooper2,
-                                               environment(snooper2) ),
+                                               existing_snooper,
+                                               snooper_of_new_snooper,
+                                               environment(snooper_of_new_snooper) ),
                             100000 );
-                   if (orig_snoopee)
-                      CHMASTER->send( "Snoop", snooper1,
+                   if (existing_snoopee)
+                      CHMASTER->send( "Snoop", existing_snooper,
                                     sprintf( "%s *OFF* %s (%O)",
-                                            capitalize(getuid(snooper1)),
-                                            capitalize(getuid(orig_snoopee)),
-                                            environment(orig_snoopee) ) );
+                                            capitalize(getuid(existing_snooper)),
+                                            capitalize(getuid(existing_snoopee)),
+                                            environment(existing_snoopee) ) );
 
-                   CHMASTER->send( "Snoop", snooper1,
+                   CHMASTER->send( "Snoop", existing_snooper,
                                  sprintf("%s -> %s (%O)",
-                                        capitalize(getuid(snooper1)),
-                                        capitalize(getuid(snooper2)),
-                                        environment(snooper2)));
+                                        capitalize(getuid(existing_snooper)),
+                                        capitalize(getuid(snooper_of_new_snooper)),
+                                        environment(snooper_of_new_snooper)));
                }
                else
                {
                    log_file( ASNOOPLOGFILE, sprintf( "%s: %O %O %O\n",
                                                  dtime(time()),
-                                                 snooper1,
-                                                 snooper2,
-                                                 environment(snooper2) )
+                                                 existing_snooper,
+                                                 snooper_of_new_snooper,
+                                                 environment(snooper_of_new_snooper) )
                             ,100000 );
                }
             }
         }
         else
         {
-            if (snooper1)
+            if (existing_snooper)
             {
                if ( !snooper->QueryProp(P_SNOOPFLAGS) & SF_LOCKED )
                {
                    printf( "%s wird bereits von %s gesnooped. Benutze das "
                           "\"f\"-Flag, wenn du dennoch snoopen willst.\n",
-                          snoopee->name(WER), snooper1->name(WEM) );
+                          snoopee->name(WER), existing_snooper->name(WEM) );
                    return 0;
                }
             }
@@ -303,13 +318,13 @@
                                          snooper, snoopee, environment(snoopee) ),
                      100000 );
 
-            if (orig_snoopee)
+            if (existing_snoopee)
             {
                CHMASTER->send( "Snoop", snooper,
                              sprintf( "%s *OFF* %s (%O).",
                                      capitalize(getuid(snooper)),
-                                     capitalize(getuid(orig_snoopee)),
-                                     environment(orig_snoopee) ) );
+                                     capitalize(getuid(existing_snoopee)),
+                                     environment(existing_snoopee) ) );
             }
 
             CHMASTER->send( "Snoop", snooper, sprintf( "%s -> %s (%O).",
@@ -334,33 +349,38 @@
 
         return ret;
      }
+     // Ansonsten soll ein bestehender snoop beendet werden.
      else
      {
+        // Das beenden duerfen aber nur Aufrufer selber oder hoeherlevelige
+        // ausloesen oder gleichen levels, wenn sie selber gerade vom snooper
+        // gesnoopt werden.
         if ( (snooper == PO ||
               query_wiz_grp(geteuid(PO)) > query_wiz_grp(snooper) ||
               (query_wiz_grp(geteuid(PO)) == query_wiz_grp(snooper) &&
-              efun::interactive_info(PO, II_SNOOP_NEXT) == snooper)) && orig_snoopee )
+              efun::interactive_info(PO, II_SNOOP_NEXT) == snooper) )
+            && existing_snoopee )
         {
             if ( !IS_DEPUTY(snooper) )
             {
                log_file( SNOOPLOGFILE, sprintf( "%s: %O %O %O *OFF*\n",
                                             Lcut(dtime(time())), snooper,
-                                            orig_snoopee,
-                                            environment(orig_snoopee) ),
+                                            existing_snoopee,
+                                            environment(existing_snoopee) ),
                         100000 );
 
                 CHMASTER->send( "Snoop", snooper,
                               sprintf( "%s *OFF* %s (%O).",
                                       capitalize(getuid(snooper)),
-                                      capitalize(getuid(orig_snoopee)),
-                                      environment(orig_snoopee) ) );
+                                      capitalize(getuid(existing_snoopee)),
+                                      environment(existing_snoopee) ) );
             }
             else
             {
                log_file( ASNOOPLOGFILE, sprintf( "%s: %O %O %O *OFF*\n",
                                              Lcut(dtime(time())), snooper,
-                                             orig_snoopee,
-                                             environment(orig_snoopee) ),
+                                             existing_snoopee,
+                                             environment(existing_snoopee) ),
                         100000 );
             }
             return efun::snoop(snooper);
diff --git a/secure/simul_efun/spare/simul_efun.c b/secure/simul_efun/spare/simul_efun.c
index b9a633a..f9dc05e 100644
--- a/secure/simul_efun/spare/simul_efun.c
+++ b/secure/simul_efun/spare/simul_efun.c
@@ -198,97 +198,112 @@
 nomask varargs int snoop( object snooper, object snoopee )
 {
     int ret;
-    object snooper1, snooper2, snooper3;
 
     if( !objectp(snooper) || snooper == snoopee || !PO )
        return 0;
 
     // Evtl. gibt es bereits einen snoopee, der von snopper gesnoopt wird?
-    object orig_snoopee = efun::interactive_info(snooper, II_SNOOP_PREV);
+    object existing_snoopee = efun::interactive_info(snooper, II_SNOOP_PREV);
 
+     // soll jemand neues gesnoopt werden?
      if(snoopee)
      {
+        // Jemand mit niedrigerem Level kann keinen hoeherleveligen snoopen
+        // lassen.
         if ( PO != snooper
              && query_wiz_grp(snooper) >= query_wiz_grp(geteuid(PO)) )
             return 0;
 
-        if ( query_wiz_grp(snooper) <= query_wiz_grp(snoopee) &&
-             !(snoopee->QueryAllowSnoop(snooper)) )
+        // Niedriglevelige User koennen nur mit Einverstaendnis hoeherlevelige
+        // snoopen.
+        if ( query_wiz_grp(snooper) <= query_wiz_grp(snoopee)
+             && !(snoopee->QueryAllowSnoop(snooper)) )
         {
+            // es sei denn der snooper ist Sheriff und der snoopee ist kein
+            // EM+
             if ( !IS_DEPUTY(snooper) || IS_ARCH(snoopee) )
                return 0;
         }
-
-        if ( (snooper1 = efun::interactive_info(snoopee, II_SNOOP_NEXT)) &&
-             query_wiz_grp(snooper1) >= query_wiz_grp(snooper) )
+        // Wird der snoopee bereits gesnoopt? Dann darf sich der neue snooper
+        // nur unter Umstaenden in die Snoop-Kette einreihen...
+        object existing_snooper;
+        if ( (existing_snooper = efun::interactive_info(snoopee, II_SNOOP_NEXT))
+             && query_wiz_grp(existing_snooper) >= query_wiz_grp(snooper) )
         {
-            if ( snooper1->QueryProp(P_SNOOPFLAGS) & SF_LOCKED )
+            // ... naemlich nur dann, wenn der bestehende Snooper kein
+            // SF_LOCKED gesetzt hat.
+            if ( existing_snooper->QueryProp(P_SNOOPFLAGS) & SF_LOCKED )
                return 0;
 
-            tell_object( snooper1, sprintf( "%s snooped jetzt %s.\n",
+            tell_object( existing_snooper, sprintf( "%s snooped jetzt %s.\n",
                                        snooper->name(WER), snoopee->name(WER) ) );
 
-            snooper2 = snooper;
-
-            while ( snooper3 = interactive_info(snooper2, II_SNOOP_NEXT) )
+            // Evtl. wird der neue snooper selber gesnoopt. Dafuer wird jetzt
+            // ggf. die Kette von *ihren* snoopern verfolgt.
+            object snooper_of_new_snooper = snooper;
+            object snooper_rover;
+            while ( snooper_rover = interactive_info(snooper_of_new_snooper, II_SNOOP_NEXT) )
             {
-               tell_object( snooper1,
+               tell_object( existing_snooper,
                            sprintf( "%s wird seinerseits von %s gesnooped.\n"
-                                   ,snooper2->name(WER),
-                                   snooper3->name(WEM) ) );
-               snooper2 = snooper3;
+                                   ,snooper_of_new_snooper->name(WER),
+                                   snooper_rover->name(WEM) ) );
+               snooper_of_new_snooper = snooper_rover;
             }
 
-            efun::snoop( snooper1, snooper2 );
+            // Der letzt snooper des hier anzumeldenden snoopers wird nun vom
+            // bestehenden snooper gesnoopt, falls moeglich.
+            efun::snoop( existing_snooper, snooper_of_new_snooper );
 
-            if ( efun::interactive_info(snooper2, II_SNOOP_NEXT) != snooper1 )
-               tell_object( snooper1, sprintf( "Du kannst %s nicht snoopen.\n",
-                                          snooper2->name(WEN) ) );
+            if ( efun::interactive_info(snooper_of_new_snooper, II_SNOOP_NEXT)
+                   != existing_snooper )
+               tell_object( existing_snooper, sprintf( "Du kannst %s nicht snoopen.\n",
+                                          snooper_of_new_snooper->name(WEN) ) );
             else
             {
-               tell_object( snooper1, sprintf( "Du snoopst jetzt %s.\n",
-                                          snooper2->name(WEN) ) );
-               if ( !IS_DEPUTY(snooper1) )
+               tell_object( existing_snooper, sprintf( "Du snoopst jetzt %s.\n",
+                                          snooper_of_new_snooper->name(WEN) ) );
+               if ( !IS_DEPUTY(existing_snooper) )
                {
                    log_file( SNOOPLOGFILE, sprintf("%s: %O %O %O\n",
                                                dtime(time()),
-                                               snooper1,
-                                               snooper2,
-                                               environment(snooper2) ),
+                                               existing_snooper,
+                                               snooper_of_new_snooper,
+                                               environment(snooper_of_new_snooper) ),
                             100000 );
-                   if (orig_snoopee)
-                      CHMASTER->send( "Snoop", snooper1,
+                   if (existing_snoopee)
+                      CHMASTER->send( "Snoop", existing_snooper,
                                     sprintf( "%s *OFF* %s (%O)",
-                                            capitalize(getuid(snooper1)),
-                                            capitalize(getuid(orig_snoopee)),
-                                            environment(orig_snoopee) ) );
+                                            capitalize(getuid(existing_snooper)),
+                                            capitalize(getuid(existing_snoopee)),
+                                            environment(existing_snoopee) ) );
 
-                   CHMASTER->send( "Snoop", snooper1,
+                   CHMASTER->send( "Snoop", existing_snooper,
                                  sprintf("%s -> %s (%O)",
-                                        capitalize(getuid(snooper1)),
-                                        capitalize(getuid(snooper2)),
-                                        environment(snooper2)));
+                                        capitalize(getuid(existing_snooper)),
+                                        capitalize(getuid(snooper_of_new_snooper)),
+                                        environment(snooper_of_new_snooper)));
                }
                else
                {
                    log_file( ASNOOPLOGFILE, sprintf( "%s: %O %O %O\n",
                                                  dtime(time()),
-                                                 snooper1,
-                                                 snooper2,
-                                                 environment(snooper2) )
+                                                 existing_snooper,
+                                                 snooper_of_new_snooper,
+                                                 environment(snooper_of_new_snooper) )
                             ,100000 );
                }
             }
         }
         else
         {
-            if (snooper1)
+            if (existing_snooper)
             {
                if ( !snooper->QueryProp(P_SNOOPFLAGS) & SF_LOCKED )
                {
                    printf( "%s wird bereits von %s gesnooped. Benutze das "
                           "\"f\"-Flag, wenn du dennoch snoopen willst.\n",
-                          snoopee->name(WER), snooper1->name(WEM) );
+                          snoopee->name(WER), existing_snooper->name(WEM) );
                    return 0;
                }
             }
@@ -303,13 +318,13 @@
                                          snooper, snoopee, environment(snoopee) ),
                      100000 );
 
-            if (orig_snoopee)
+            if (existing_snoopee)
             {
                CHMASTER->send( "Snoop", snooper,
                              sprintf( "%s *OFF* %s (%O).",
                                      capitalize(getuid(snooper)),
-                                     capitalize(getuid(orig_snoopee)),
-                                     environment(orig_snoopee) ) );
+                                     capitalize(getuid(existing_snoopee)),
+                                     environment(existing_snoopee) ) );
             }
 
             CHMASTER->send( "Snoop", snooper, sprintf( "%s -> %s (%O).",
@@ -334,33 +349,38 @@
 
         return ret;
      }
+     // Ansonsten soll ein bestehender snoop beendet werden.
      else
      {
+        // Das beenden duerfen aber nur Aufrufer selber oder hoeherlevelige
+        // ausloesen oder gleichen levels, wenn sie selber gerade vom snooper
+        // gesnoopt werden.
         if ( (snooper == PO ||
               query_wiz_grp(geteuid(PO)) > query_wiz_grp(snooper) ||
               (query_wiz_grp(geteuid(PO)) == query_wiz_grp(snooper) &&
-              efun::interactive_info(PO, II_SNOOP_NEXT) == snooper)) && orig_snoopee )
+              efun::interactive_info(PO, II_SNOOP_NEXT) == snooper) )
+            && existing_snoopee )
         {
             if ( !IS_DEPUTY(snooper) )
             {
                log_file( SNOOPLOGFILE, sprintf( "%s: %O %O %O *OFF*\n",
                                             Lcut(dtime(time())), snooper,
-                                            orig_snoopee,
-                                            environment(orig_snoopee) ),
+                                            existing_snoopee,
+                                            environment(existing_snoopee) ),
                         100000 );
 
                 CHMASTER->send( "Snoop", snooper,
                               sprintf( "%s *OFF* %s (%O).",
                                       capitalize(getuid(snooper)),
-                                      capitalize(getuid(orig_snoopee)),
-                                      environment(orig_snoopee) ) );
+                                      capitalize(getuid(existing_snoopee)),
+                                      environment(existing_snoopee) ) );
             }
             else
             {
                log_file( ASNOOPLOGFILE, sprintf( "%s: %O %O %O *OFF*\n",
                                              Lcut(dtime(time())), snooper,
-                                             orig_snoopee,
-                                             environment(orig_snoopee) ),
+                                             existing_snoopee,
+                                             environment(existing_snoopee) ),
                         100000 );
             }
             return efun::snoop(snooper);
