diff --git a/scapy/arch/__init__.py b/scapy/arch/__init__.py
index 92a7141740ece5ae8cb1b0b92a8cb76597fcbddc..29e9a69eccc52967dc7dbeaa7e627e4fae22e5a8 100644
--- a/scapy/arch/__init__.py
+++ b/scapy/arch/__init__.py
@@ -81,6 +81,7 @@ elif SOLARIS:
     from scapy.arch.solaris import *
 elif WINDOWS:
     from scapy.arch.windows import *
+    from scapy.arch.windows.compatibility import *
 
 if scapy.config.conf.iface is None:
     scapy.config.conf.iface = LOOPBACK_NAME
diff --git a/scapy/arch/windows/__init__.py b/scapy/arch/windows/__init__.py
index eec79030278688d541a5c510d03cb17f42fd1441..e119fa40050fb37bcb6c40a20c7884eccf76822a 100755
--- a/scapy/arch/windows/__init__.py
+++ b/scapy/arch/windows/__init__.py
@@ -13,7 +13,6 @@ import subprocess as sp
 from glob import glob
 import tempfile
 
-from scapy.arch.consts import LOOPBACK_NAME
 from scapy.config import conf,ConfClass
 from scapy.error import Scapy_Exception,log_loading,log_runtime
 from scapy.utils import atol, itom, inet_aton, inet_ntoa, PcapReader
@@ -454,213 +453,6 @@ if conf.interactive_shell != 'ipython':
             orig_stdout = sys.stdout
             sys.stdout = console
 
-def sndrcv(pks, pkt, timeout = 2, inter = 0, verbose=None, chainCC=0, retry=0, multi=0):
-    if not isinstance(pkt, Gen):
-        pkt = SetGen(pkt)
-        
-    if verbose is None:
-        verbose = conf.verb
-    from scapy.sendrecv import debug
-    debug.recv = plist.PacketList([],"Unanswered")
-    debug.sent = plist.PacketList([],"Sent")
-    debug.match = plist.SndRcvList([])
-    nbrecv=0
-    ans = []
-    # do it here to fix random fields, so that parent and child have the same
-    all_stimuli = tobesent = [p for p in pkt]
-    notans = len(tobesent)
-
-    hsent={}
-    for i in tobesent:
-        h = i.hashret()
-        if h in hsent:
-            hsent[h].append(i)
-        else:
-            hsent[h] = [i]
-    if retry < 0:
-        retry = -retry
-        autostop=retry
-    else:
-        autostop=0
-
-
-    while retry >= 0:
-        found=0
-    
-        if timeout < 0:
-            timeout = None
-
-        pid=1
-        try:
-            if WINDOWS or pid == 0:
-                try:
-                    try:
-                        i = 0
-                        if verbose:
-                            print "Begin emission:"
-                        for p in tobesent:
-                            pks.send(p)
-                            i += 1
-                            time.sleep(inter)
-                        if verbose:
-                            print "Finished to send %i packets." % i
-                    except SystemExit:
-                        pass
-                    except KeyboardInterrupt:
-                        pass
-                    except:
-                        log_runtime.exception("--- Error sending packets")
-                        log_runtime.info("--- Error sending packets")
-                finally:
-                    try:
-                        sent_times = [p.sent_time for p in all_stimuli if p.sent_time]
-                    except:
-                        pass
-            if WINDOWS or pid > 0:
-                # Timeout starts after last packet is sent (as in Unix version) 
-                if timeout:
-                    stoptime = time.time()+timeout
-                else:
-                    stoptime = 0
-                remaintime = None
-                try:
-                    try:
-                        while 1:
-                            if stoptime:
-                                remaintime = stoptime-time.time()
-                                if remaintime <= 0:
-                                    break
-                            r = pks.recv(MTU)
-                            if r is None:
-                                continue
-                            ok = 0
-                            h = r.hashret()
-                            if h in hsent:
-                                hlst = hsent[h]
-                                for i, sentpkt in enumerate(hlst):
-                                    if r.answers(sentpkt):
-                                        ans.append((sentpkt, r))
-                                        if verbose > 1:
-                                            os.write(1, "*")
-                                        ok = 1
-                                        if not multi:
-                                            del hlst[i]
-                                            notans -= 1
-                                        else:
-                                            if not hasattr(sentpkt, '_answered'):
-                                                notans -= 1
-                                            sentpkt._answered = 1
-                                        break
-                            if notans == 0 and not multi:
-                                break
-                            if not ok:
-                                if verbose > 1:
-                                    os.write(1, ".")
-                                nbrecv += 1
-                                if conf.debug_match:
-                                    debug.recv.append(r)
-                    except KeyboardInterrupt:
-                        if chainCC:
-                            raise
-                finally:
-                    if WINDOWS:
-                        for p,t in zip(all_stimuli, sent_times):
-                            p.sent_time = t
-        finally:
-            pass
-
-        remain = list(itertools.chain(*hsent.itervalues()))
-        if multi:
-            remain = [p for p in remain if not hasattr(p, '_answered')]
-            
-        if autostop and len(remain) > 0 and len(remain) != len(tobesent):
-            retry = autostop
-            
-        tobesent = remain
-        if len(tobesent) == 0:
-            break
-        retry -= 1
-        
-    if conf.debug_match:
-        debug.sent=plist.PacketList(remain[:],"Sent")
-        debug.match=plist.SndRcvList(ans[:])
-
-    #clean the ans list to delete the field _answered
-    if (multi):
-        for s,r in ans:
-            if hasattr(s, '_answered'):
-                del(s._answered)
-    
-    if verbose:
-        print "\nReceived %i packets, got %i answers, remaining %i packets" % (nbrecv+len(ans), len(ans), notans)
-    return plist.SndRcvList(ans),plist.PacketList(remain,"Unanswered")
-
-
-import scapy.sendrecv
-scapy.sendrecv.sndrcv = sndrcv
-
-def sniff(count=0, store=1, offline=None, prn = None, lfilter=None, L2socket=None, timeout=None, *arg, **karg):
-    """Sniff packets
-sniff([count=0,] [prn=None,] [store=1,] [offline=None,] [lfilter=None,] + L2ListenSocket args) -> list of packets
-Select interface to sniff by setting conf.iface. Use show_interfaces() to see interface names.
-  count: number of packets to capture. 0 means infinity
-  store: wether to store sniffed packets or discard them
-    prn: function to apply to each packet. If something is returned,
-         it is displayed. Ex:
-         ex: prn = lambda x: x.summary()
-lfilter: python function applied to each packet to determine
-         if further action may be done
-         ex: lfilter = lambda x: x.haslayer(Padding)
-offline: pcap file to read packets from, instead of sniffing them
-timeout: stop sniffing after a given time (default: None)
-L2socket: use the provided L2socket
-    """
-    c = 0
-
-    if offline is None:
-        log_runtime.info('Sniffing on %s' % conf.iface)
-        if L2socket is None:
-            L2socket = conf.L2listen
-        s = L2socket(type=ETH_P_ALL, *arg, **karg)
-    else:
-        s = PcapReader(offline)
-
-    lst = []
-    if timeout is not None:
-        stoptime = time.time()+timeout
-    remain = None
-    while 1:
-        try:
-            if timeout is not None:
-                remain = stoptime-time.time()
-                if remain <= 0:
-                    break
-
-            try:
-                p = s.recv(MTU)
-            except PcapTimeoutElapsed:
-                continue
-            if p is None:
-                break
-            if lfilter and not lfilter(p):
-                continue
-            if store:
-                lst.append(p)
-            c += 1
-            if prn:
-                r = prn(p)
-                if r is not None:
-                    print r
-            if 0 < count <= c:
-                break
-        except KeyboardInterrupt:
-            break
-    s.close()
-    return plist.PacketList(lst,"Sniffed")
-
-import scapy.sendrecv
-scapy.sendrecv.sniff = sniff
-
 def get_working_if():
     try:
         # return the interface associated with the route with smallest
diff --git a/scapy/arch/windows/compatibility.py b/scapy/arch/windows/compatibility.py
new file mode 100644
index 0000000000000000000000000000000000000000..c9258de3a75aa8237e907578a01ebdfb5978c436
--- /dev/null
+++ b/scapy/arch/windows/compatibility.py
@@ -0,0 +1,218 @@
+## This file is part of Scapy
+## See http://www.secdev.org/projects/scapy for more informations
+## Copyright (C) Philippe Biondi <phil@secdev.org>
+## This program is published under a GPLv2 license
+
+"""
+Instanciate part of the customizations needed to support Microsoft Windows.
+"""
+
+from scapy.arch.consts import LOOPBACK_NAME
+from scapy.config import conf,ConfClass
+
+def sndrcv(pks, pkt, timeout = 2, inter = 0, verbose=None, chainCC=0, retry=0, multi=0):
+    if not isinstance(pkt, Gen):
+        pkt = SetGen(pkt)
+        
+    if verbose is None:
+        verbose = conf.verb
+    from scapy.sendrecv import debug
+    debug.recv = plist.PacketList([],"Unanswered")
+    debug.sent = plist.PacketList([],"Sent")
+    debug.match = plist.SndRcvList([])
+    nbrecv=0
+    ans = []
+    # do it here to fix random fields, so that parent and child have the same
+    all_stimuli = tobesent = [p for p in pkt]
+    notans = len(tobesent)
+
+    hsent={}
+    for i in tobesent:
+        h = i.hashret()
+        if h in hsent:
+            hsent[h].append(i)
+        else:
+            hsent[h] = [i]
+    if retry < 0:
+        retry = -retry
+        autostop=retry
+    else:
+        autostop=0
+
+
+    while retry >= 0:
+        found=0
+    
+        if timeout < 0:
+            timeout = None
+
+        pid=1
+        try:
+            if WINDOWS or pid == 0:
+                try:
+                    try:
+                        i = 0
+                        if verbose:
+                            print "Begin emission:"
+                        for p in tobesent:
+                            pks.send(p)
+                            i += 1
+                            time.sleep(inter)
+                        if verbose:
+                            print "Finished to send %i packets." % i
+                    except SystemExit:
+                        pass
+                    except KeyboardInterrupt:
+                        pass
+                    except:
+                        log_runtime.exception("--- Error sending packets")
+                        log_runtime.info("--- Error sending packets")
+                finally:
+                    try:
+                        sent_times = [p.sent_time for p in all_stimuli if p.sent_time]
+                    except:
+                        pass
+            if WINDOWS or pid > 0:
+                # Timeout starts after last packet is sent (as in Unix version) 
+                if timeout:
+                    stoptime = time.time()+timeout
+                else:
+                    stoptime = 0
+                remaintime = None
+                try:
+                    try:
+                        while 1:
+                            if stoptime:
+                                remaintime = stoptime-time.time()
+                                if remaintime <= 0:
+                                    break
+                            r = pks.recv(MTU)
+                            if r is None:
+                                continue
+                            ok = 0
+                            h = r.hashret()
+                            if h in hsent:
+                                hlst = hsent[h]
+                                for i, sentpkt in enumerate(hlst):
+                                    if r.answers(sentpkt):
+                                        ans.append((sentpkt, r))
+                                        if verbose > 1:
+                                            os.write(1, "*")
+                                        ok = 1
+                                        if not multi:
+                                            del hlst[i]
+                                            notans -= 1
+                                        else:
+                                            if not hasattr(sentpkt, '_answered'):
+                                                notans -= 1
+                                            sentpkt._answered = 1
+                                        break
+                            if notans == 0 and not multi:
+                                break
+                            if not ok:
+                                if verbose > 1:
+                                    os.write(1, ".")
+                                nbrecv += 1
+                                if conf.debug_match:
+                                    debug.recv.append(r)
+                    except KeyboardInterrupt:
+                        if chainCC:
+                            raise
+                finally:
+                    if WINDOWS:
+                        for p,t in zip(all_stimuli, sent_times):
+                            p.sent_time = t
+        finally:
+            pass
+
+        remain = list(itertools.chain(*hsent.itervalues()))
+        if multi:
+            remain = [p for p in remain if not hasattr(p, '_answered')]
+            
+        if autostop and len(remain) > 0 and len(remain) != len(tobesent):
+            retry = autostop
+            
+        tobesent = remain
+        if len(tobesent) == 0:
+            break
+        retry -= 1
+        
+    if conf.debug_match:
+        debug.sent=plist.PacketList(remain[:],"Sent")
+        debug.match=plist.SndRcvList(ans[:])
+
+    #clean the ans list to delete the field _answered
+    if (multi):
+        for s,r in ans:
+            if hasattr(s, '_answered'):
+                del(s._answered)
+    
+    if verbose:
+        print "\nReceived %i packets, got %i answers, remaining %i packets" % (nbrecv+len(ans), len(ans), notans)
+    return plist.SndRcvList(ans),plist.PacketList(remain,"Unanswered")
+
+
+import scapy.sendrecv
+scapy.sendrecv.sndrcv = sndrcv
+
+def sniff(count=0, store=1, offline=None, prn = None, lfilter=None, L2socket=None, timeout=None, *arg, **karg):
+    """Sniff packets
+sniff([count=0,] [prn=None,] [store=1,] [offline=None,] [lfilter=None,] + L2ListenSocket args) -> list of packets
+Select interface to sniff by setting conf.iface. Use show_interfaces() to see interface names.
+  count: number of packets to capture. 0 means infinity
+  store: wether to store sniffed packets or discard them
+    prn: function to apply to each packet. If something is returned,
+         it is displayed. Ex:
+         ex: prn = lambda x: x.summary()
+lfilter: python function applied to each packet to determine
+         if further action may be done
+         ex: lfilter = lambda x: x.haslayer(Padding)
+offline: pcap file to read packets from, instead of sniffing them
+timeout: stop sniffing after a given time (default: None)
+L2socket: use the provided L2socket
+    """
+    c = 0
+
+    if offline is None:
+        log_runtime.info('Sniffing on %s' % conf.iface)
+        if L2socket is None:
+            L2socket = conf.L2listen
+        s = L2socket(type=ETH_P_ALL, *arg, **karg)
+    else:
+        s = PcapReader(offline)
+
+    lst = []
+    if timeout is not None:
+        stoptime = time.time()+timeout
+    remain = None
+    while 1:
+        try:
+            if timeout is not None:
+                remain = stoptime-time.time()
+                if remain <= 0:
+                    break
+
+            try:
+                p = s.recv(MTU)
+            except PcapTimeoutElapsed:
+                continue
+            if p is None:
+                break
+            if lfilter and not lfilter(p):
+                continue
+            if store:
+                lst.append(p)
+            c += 1
+            if prn:
+                r = prn(p)
+                if r is not None:
+                    print r
+            if 0 < count <= c:
+                break
+        except KeyboardInterrupt:
+            break
+    s.close()
+    return plist.PacketList(lst,"Sniffed")
+
+import scapy.sendrecv
+scapy.sendrecv.sniff = sniff
diff --git a/test/run_tests.bat b/test/run_tests.bat
index 1aa3b29d01f3ee8c6b9438a9678a6c4f16e2122f..f2d818bf6c2e3bba0acea21709ddb976b189351a 100644
--- a/test/run_tests.bat
+++ b/test/run_tests.bat
@@ -2,7 +2,8 @@
 set MYDIR=%cd%\..
 set PYTHONPATH=%MYDIR%
 if [%1]==[] (
-  python %MYDIR%\scapy\tools\UTscapy.py -t regression.uts -f html -o scapy_regression_test_%DATE%.html
+  SET date=%DATE%
+  python %MYDIR%\scapy\tools\UTscapy.py -t regression.uts -f html -o scapy_regression_test_%date:~6,4%_%date:~3,2%_%date:~0,2%.html
 ) else (
   python %MYDIR%\scapy\tools\UTscapy.py %1 %2 %3 %4 %5 %6 %7 %8 %9
 )