diff --git a/scapy/fields.py b/scapy/fields.py
index 59d26c7db5a46757922dce3fc4b0ff79901a95e7..280c1b3c21c88db0a14134459c8d85351d648971 100644
--- a/scapy/fields.py
+++ b/scapy/fields.py
@@ -220,7 +220,9 @@ class SourceIPField(IPField):
         self.dstname = dstname
     def i2m(self, pkt, x):
         if x is None:
-            iff,x,gw = conf.route.route(getattr(pkt,self.dstname))
+            iff,x,gw = pkt.route()
+            if x is None:
+                x = "0.0.0.0"
         return IPField.i2m(self, pkt, x)
     def i2h(self, pkt, x):
         if x is None:
diff --git a/scapy/layers/inet.py b/scapy/layers/inet.py
index 2a1ddaa703ebaee24c48c300865a5d7b07e1b1af..d5f1b97791b7bceb243a4d8bca3803acf993ec7f 100644
--- a/scapy/layers/inet.py
+++ b/scapy/layers/inet.py
@@ -201,6 +201,11 @@ class IP(Packet, IPTools):
                 log_runtime.error(msg)
             if slp:
                 time.sleep(slp)
+    def route(self):
+        dst = self.dst
+        if isinstance(dst,Gen):
+            dst = iter(dst).next()
+        return conf.route.route(dst)
     def hashret(self):
         if ( (self.proto == socket.IPPROTO_ICMP)
              and (isinstance(self.payload, ICMP))
diff --git a/scapy/layers/l2.py b/scapy/layers/l2.py
index 2f7bb3096d2327b4193b5a177d105db4ec7804c4..64730b46457d66e38a853afead7efc524ddcc99f 100644
--- a/scapy/layers/l2.py
+++ b/scapy/layers/l2.py
@@ -5,6 +5,7 @@ from scapy.ansmachine import *
 from scapy.plist import SndRcvList
 from scapy.fields import *
 from scapy.sendrecv import srp,srp1
+from scapy.arch import get_if_hwaddr
 
 
 
@@ -81,27 +82,14 @@ class SourceMACField(MACField):
         MACField.__init__(self, name, None)
     def i2h(self, pkt, x):
         if x is None:
-            dstip = None
-            if isinstance(pkt.payload, IPv6):
-                dstip = pkt.payload.dst
-            elif isinstance(pkt.payload, IP):
-                dstip = pkt.payload.dst
-            elif isinstance(pkt.payload, ARP):
-                dstip = pkt.payload.pdst
-            if isinstance(dstip, Gen):
-                dstip = dstip.__iter__().next()
-
-            if dstip is not None:
-                if isinstance(pkt.payload, IPv6):
-                    iff,a,nh = conf.route6.route(dstip)
-                else:
-                    iff,a,gw = conf.route.route(dstip)
+            iff,a,gw = pkt.payload.route()
+            if iff:
                 try:
                     x = get_if_hwaddr(iff)
                 except:
                     pass
-                if x is None:
-                    x = "00:00:00:00:00:00"
+            if x is None:
+                x = "00:00:00:00:00:00"
         return MACField.i2h(self, pkt, x)
     def i2m(self, pkt, x):
         return MACField.i2m(self, pkt, self.i2h(pkt, x))
@@ -111,17 +99,14 @@ class ARPSourceMACField(MACField):
         MACField.__init__(self, name, None)
     def i2h(self, pkt, x):
         if x is None:
-            dstip = pkt.pdst
-            if isinstance(dstip, Gen):
-                dstip = dstip.__iter__().next()
-            if dstip is not None:
-                iff,a,gw = conf.route.route(dstip)
+            iff,a,gw = pkt.route()
+            if iff:
                 try:
                     x = get_if_hwaddr(iff)
                 except:
                     pass
-                if x is None:
-                    x = "00:00:00:00:00:00"
+            if x is None:
+                x = "00:00:00:00:00:00"
         return MACField.i2h(self, pkt, x)
     def i2m(self, pkt, x):
         return MACField.i2m(self, pkt, self.i2h(pkt, x))
@@ -329,6 +314,11 @@ class ARP(Packet):
                  (self.psrc == other.pdst) ):
                 return 1
         return 0
+    def route(self):
+        dst = self.pdst
+        if isinstance(dst,Gen):
+            dst = iter(dst).next()
+        return conf.route.route(dst)
     def extract_padding(self, s):
         return "",s
     def mysummary(self):
diff --git a/scapy/packet.py b/scapy/packet.py
index b12b6fe029475ba96aac79d7e45ff157655001ee..61ba3301f77a01f3064a52c7910ad52602980122 100644
--- a/scapy/packet.py
+++ b/scapy/packet.py
@@ -723,7 +723,9 @@ Creates an EPS file describing a packet. If filename is not provided a temporary
     def __contains__(self, cls):
         """"cls in self" returns true if self has a layer which is an instance of cls."""
         return self.haslayer(cls)
-        
+
+    def route(self):
+        return (None,None,None)
     
 
     def display(self,*args,**kargs):  # Deprecated. Use show()
diff --git a/scapy/supersocket.py b/scapy/supersocket.py
index a5bc6e38f433ac1908f81ba3358463b09b8aee91..4d33cc7971cd5e4eac1e3b92c193b1ff86d37a30 100644
--- a/scapy/supersocket.py
+++ b/scapy/supersocket.py
@@ -132,11 +132,8 @@ class L3PacketSocket(SuperSocket):
         return pkt
     
     def send(self, x):
-        if isinstance(x, IPv6):
-            iff,a,gw = conf.route6.route(x.dst)
-        elif hasattr(x,"dst"):
-            iff,a,gw = conf.route.route(x.dst)
-        else:
+        iff,a,gw  = x.route()
+        if iff is None:
             iff = conf.iface
         sdto = (iff, self.type)
         self.outs.bind(sdto)
@@ -299,11 +296,8 @@ class L3dnetSocket(SuperSocket):
         if filter:
             self.ins.setfilter(filter, 0, 0)
     def send(self, x):
-        if isinstance(x, IPv6):
-            iff,a,gw = conf.route6.route(x.dst)
-        elif hasattr(x,"dst"):
-            iff,a,gw = conf.route.route(x.dst)
-        else:
+        iff,a,gw  = x.route()
+        if iff is None:
             iff = conf.iface
         ifs = self.iflist.get(iff)
         if ifs is None: