Index: /trunk/src/VBox/Devices/Makefile.kmk
===================================================================
--- /trunk/src/VBox/Devices/Makefile.kmk	(revision 20052)
+++ /trunk/src/VBox/Devices/Makefile.kmk	(revision 20053)
@@ -698,4 +698,5 @@
     Network/slirp/libalias/alias_mod.c \
     Network/slirp/libalias/alias_proxy.c \
+    Network/slirp/libalias/alias_ftp.c \
     Network/slirp/libalias/alias_util.c
 
Index: /trunk/src/VBox/Devices/Network/DrvNAT.cpp
===================================================================
--- /trunk/src/VBox/Devices/Network/DrvNAT.cpp	(revision 20052)
+++ /trunk/src/VBox/Devices/Network/DrvNAT.cpp	(revision 20053)
@@ -385,5 +385,4 @@
             /* only check for slow/fast timers */
             slirp_select_poll(pThis->pNATState, /* fTimeout=*/true, /*fIcmp=*/false);
-            Log2(("%s: timeout\n", __FUNCTION__));
             continue;
         }
Index: /trunk/src/VBox/Devices/Network/slirp/ip_input.c
===================================================================
--- /trunk/src/VBox/Devices/Network/slirp/ip_input.c	(revision 20052)
+++ /trunk/src/VBox/Devices/Network/slirp/ip_input.c	(revision 20053)
@@ -83,4 +83,11 @@
 
     ipstat.ips_total++;
+#ifdef VBOX_WITH_SLIRP_ALIAS
+    {
+        int rc;
+        rc = LibAliasIn(LIST_FIRST(&instancehead), mtod(m, char *), m->m_len);
+        Log2(("NAT: LibAlias return %d\n", rc));
+    }
+#endif
 
     if (m->m_len < sizeof(struct ip))
@@ -174,11 +181,4 @@
      * Switch out to protocol's input routine.
      */
-#ifdef VBOX_WITH_SLIRP_ALIAS
-    {
-        int rc;
-        rc = LibAliasIn(LIST_FIRST(&instancehead), mtod(m, char *), ip->ip_len);
-        Log2(("NAT: LibAlias return %d\n", rc));
-    }
-#endif
     ipstat.ips_delivered++;
     switch (ip->ip_p)
Index: /trunk/src/VBox/Devices/Network/slirp/ip_output.c
===================================================================
--- /trunk/src/VBox/Devices/Network/slirp/ip_output.c	(revision 20052)
+++ /trunk/src/VBox/Devices/Network/slirp/ip_output.c	(revision 20053)
@@ -44,4 +44,7 @@
 
 #include <slirp.h>
+#ifdef VBOX_WITH_SLIRP_ALIAS
+# include "alias.h"
+#endif
 
 #ifdef VBOX_WITHOUT_SLIRP_CLIENT_ETHER
@@ -147,4 +150,11 @@
         }
 #endif
+#ifdef VBOX_WITH_SLIRP_ALIAS
+        {
+            int rc;
+            rc = LibAliasOut(LIST_FIRST(&instancehead), mtod(m, char *), m->m_len);
+            Log2(("NAT: LibAlias return %d\n", rc));
+        }
+#endif
 
         if_output(pData, so, m);
@@ -241,4 +251,11 @@
         ip->ip_sum = 0;
         ip->ip_sum = cksum(m, hlen);
+#ifdef VBOX_WITH_SLIRP_ALIAS
+        {
+            int rc;
+            rc = LibAliasOut(LIST_FIRST(&instancehead), mtod(m, char *), m->m_len);
+            Log2(("NAT: LibAlias return %d\n", rc));
+        }
+#endif
 
 sendorfree:
@@ -248,7 +265,18 @@
             m->m_nextpkt = 0;
             if (error == 0)
+            {
+#ifdef VBOX_WITH_SLIRP_ALIAS
+            {
+                int rc;
+                rc = LibAliasOut(LIST_FIRST(&instancehead), mtod(m, char *), m->m_len);
+                Log2(("NAT: LibAlias return %d\n", rc));
+            }
+#endif
                 if_output(pData, so, m);
-            else
+            }
+            else 
+            {
                 m_freem(pData, m);
+            }
         }
 
Index: /trunk/src/VBox/Devices/Network/slirp/slirp.c
===================================================================
--- /trunk/src/VBox/Devices/Network/slirp/slirp.c	(revision 20052)
+++ /trunk/src/VBox/Devices/Network/slirp/slirp.c	(revision 20053)
@@ -687,4 +687,5 @@
     {
         struct libalias *lib = NULL; 
+        int flags = 0;
         lib = LibAliasInit(pData, NULL);
         if (lib == NULL)
@@ -693,5 +694,9 @@
             AssertMsgFailed(("NAT: LibAlias default rule wasn't initialized\n"));
         }
+        flags = LibAliasSetMode(lib, 0, 0);
+        flags |= PKT_ALIAS_LOG; /* set logging */
+        flags = LibAliasSetMode(lib, flags, ~0);
         LibAliasSetAddress(lib, special_addr);
+        ftp_alias_load();
         
     }
Index: /trunk/src/VBox/Devices/Network/slirp/slirp.h
===================================================================
--- /trunk/src/VBox/Devices/Network/slirp/slirp.h	(revision 20052)
+++ /trunk/src/VBox/Devices/Network/slirp/slirp.h	(revision 20053)
@@ -391,4 +391,39 @@
 #  define __unused
 # endif
-#endif
-#endif
+
+# define strncasecmp RTStrNICmp
+
+# define LIBALIAS_DEBUG
+# ifdef fprintf
+#   undef fprintf
+#   define fprintf vbox_slirp_fprintf
+# endif /*fprintf*/
+static inline void vbox_slirp_fprintf(void *ignored, char *msg, ...)
+{
+/*  define LogIt(pvInst, fFlags, iGroup, fmtargs) */
+    va_list args;
+    register PRTLOGGER LogIt_pLogger;
+    char buffer[2048];
+    memset(buffer, 0, 2048);
+    memcpy(buffer, "NAT: ALIAS:", 11);
+    va_start(args, msg);
+    RTStrPrintfV(&buffer[11], 2048 - 11, msg, args);
+
+    LogIt_pLogger = (PRTLOGGER)(LOG_INSTANCE) ? 
+        (PRTLOGGER)(LOG_INSTANCE) : RTLogDefaultInstance();
+    if (LogIt_pLogger)
+    {
+        RTLogPrintfEx(LogIt_pLogger,
+                ((RTLOGGRPFLAGS_LEVEL_2) | RTLOGGRPFLAGS_ENABLED), LOG_GROUP,
+                msg, buffer);
+    }
+    va_end(args);
+}
+#endif /*VBOX_WITH_SLIRP_ALIAS && VBOX_SLIRP_ALIAS*/
+
+#ifdef VBOX_WITH_SLIRP_ALIAS
+int ftp_alias_load();
+int ftp_alias_unload();
+#endif /*VBOX_WITH_SLIRP_ALIAS*/
+
+#endif
Index: /trunk/src/VBox/Devices/Network/slirp/tcp_subr.c
===================================================================
--- /trunk/src/VBox/Devices/Network/slirp/tcp_subr.c	(revision 20052)
+++ /trunk/src/VBox/Devices/Network/slirp/tcp_subr.c	(revision 20053)
@@ -659,4 +659,5 @@
 tcp_emu(PNATState pData, struct socket *so, struct mbuf *m)
 {
+#ifndef VBOX_WITH_SLIRP_ALIAS
     u_int n1, n2, n3, n4, n5, n6;
     char buff[256];
@@ -1007,3 +1008,8 @@
             return 1;
     }
-}
+#else /* !VBOX_WITH_SLIRP_ALIAS */
+    /*XXX: libalias should care about it */
+    so->so_emu = 0;
+    return 1;
+#endif
+}
