diff --git a/secure/simul_efun/query_ip_name.c b/secure/simul_efun/query_ip_name.c
index 222fd26..4ad213e 100644
--- a/secure/simul_efun/query_ip_name.c
+++ b/secure/simul_efun/query_ip_name.c
@@ -1,12 +1,16 @@
 /* This sefun is to provide a replacement for the efuns query_ip_name() and
  * query_ip_number().
  * Feel free to add it to your mudlibs, if you have much code relying on that.
+ *
+ * The code of the helper functions originates from the driver sources, they
+ * are kept as-is intentionally.
  */
 
 #if ! __EFUN_DEFINED__(query_ip_name)
 
 #include <interactive_info.h>
 
+// (actually not used in MG)
 private varargs string _query_ip_name(object player)
 {
     object ob = player;
@@ -15,7 +19,7 @@
     return efun::interactive_info(ob, II_IP_NAME);
 }
 
-private varargs string _query_ip_number(object player)
+private varargs string int_query_ip_number(object player)
 {
     object ob = player;
     ob ||= efun::this_player();
@@ -23,22 +27,35 @@
     return efun::interactive_info(ob, II_IP_NUMBER);
 }
 
-// * Herkunfts-Ermittlung
-string query_ip_number(object ob)
+// First tries to get the "real" IP (instead of the proxy's one), which was
+// saved in the object by the login object. If that is unsuccessful, it falls
+// back to the driver information of the IP the interactive object is
+// connected to.
+public string query_ip_number(object ob)
 {
-  ob= ob || this_player();
-  if (!objectp(ob) || !interactive(ob)) return 0;
-  if(ob->query_realip() && ob->query_realip()!="")
+  ob = ob || this_player();
+  if(objectp(ob) && interactive(ob))
   {
-    return ob->query_realip();
+    string realip = ob->query_realip();
+    if (sizeof(ob->query_realip()))
+    {
+      return realip;
+    }
   }
-  return _query_ip_number(ob);
+  return int_query_ip_number(ob);
 }
 
+/* Liefert zu einer gegebenen ipnum den Hostnamen.
+ * @param ipnum eine numerische ip-adresse oder ein interactive
+ * @return den Hostnamen der zu der angegebenen ip-adresse gehoert.
+ * wenn der hostname nicht bekannt ist, wird die ipadresse zurueckgegeben.
+ */
 public string query_ip_name(string|object ob)
 {
+  // First get the IP number (as string) for the object or  a 0.
   if ( !ob || objectp(ob) )
       ob=query_ip_number(ob);
+  // then get its host name from the lookup & cache daemon.
   return "/p/daemon/iplookup"->host(ob);
 }
 
diff --git a/secure/simul_efun/spare/query_ip_name.c b/secure/simul_efun/spare/query_ip_name.c
index 222fd26..4ad213e 100644
--- a/secure/simul_efun/spare/query_ip_name.c
+++ b/secure/simul_efun/spare/query_ip_name.c
@@ -1,12 +1,16 @@
 /* This sefun is to provide a replacement for the efuns query_ip_name() and
  * query_ip_number().
  * Feel free to add it to your mudlibs, if you have much code relying on that.
+ *
+ * The code of the helper functions originates from the driver sources, they
+ * are kept as-is intentionally.
  */
 
 #if ! __EFUN_DEFINED__(query_ip_name)
 
 #include <interactive_info.h>
 
+// (actually not used in MG)
 private varargs string _query_ip_name(object player)
 {
     object ob = player;
@@ -15,7 +19,7 @@
     return efun::interactive_info(ob, II_IP_NAME);
 }
 
-private varargs string _query_ip_number(object player)
+private varargs string int_query_ip_number(object player)
 {
     object ob = player;
     ob ||= efun::this_player();
@@ -23,22 +27,35 @@
     return efun::interactive_info(ob, II_IP_NUMBER);
 }
 
-// * Herkunfts-Ermittlung
-string query_ip_number(object ob)
+// First tries to get the "real" IP (instead of the proxy's one), which was
+// saved in the object by the login object. If that is unsuccessful, it falls
+// back to the driver information of the IP the interactive object is
+// connected to.
+public string query_ip_number(object ob)
 {
-  ob= ob || this_player();
-  if (!objectp(ob) || !interactive(ob)) return 0;
-  if(ob->query_realip() && ob->query_realip()!="")
+  ob = ob || this_player();
+  if(objectp(ob) && interactive(ob))
   {
-    return ob->query_realip();
+    string realip = ob->query_realip();
+    if (sizeof(ob->query_realip()))
+    {
+      return realip;
+    }
   }
-  return _query_ip_number(ob);
+  return int_query_ip_number(ob);
 }
 
+/* Liefert zu einer gegebenen ipnum den Hostnamen.
+ * @param ipnum eine numerische ip-adresse oder ein interactive
+ * @return den Hostnamen der zu der angegebenen ip-adresse gehoert.
+ * wenn der hostname nicht bekannt ist, wird die ipadresse zurueckgegeben.
+ */
 public string query_ip_name(string|object ob)
 {
+  // First get the IP number (as string) for the object or  a 0.
   if ( !ob || objectp(ob) )
       ob=query_ip_number(ob);
+  // then get its host name from the lookup & cache daemon.
   return "/p/daemon/iplookup"->host(ob);
 }
 
