diff --git a/scapy/automaton.py b/scapy/automaton.py
index 84b1ff5b442f13e65a09f8d3be1a1e6c67e44dc7..f7a644151f55aa8eed7bf9a2afdefe987785c3f6 100644
--- a/scapy/automaton.py
+++ b/scapy/automaton.py
@@ -346,8 +346,28 @@ class Automaton:
     ## Services
     def debug(self, lvl, msg):
         if self.debug_level >= lvl:
-            log_interactive.debug(msg)
-            
+            log_interactive.debug(msg)            
+
+    def send(self, pkt):
+        if self.state.state in self.interception_points:
+            self.debug(3,"INTERCEPT: packet intercepted: %s" % pkt.summary())
+            cmd = Message(type = _ATMT_Command.INTERCEPT, pkt = pkt)
+            self.cmdout.send(cmd)
+            cmd = self.cmdin.recv()
+            if cmd.type == _ATMT_Command.REJECT:
+                self.debug(3,"INTERCEPT: packet rejected")
+                return
+            elif cmd.type == _ATMT_Command.REPLACE:
+                self.debug(3,"INTERCEPT: packet replaced")
+                pkt = cmd.pkt
+            elif cmd.type == _ATMT_Command.ACCEPT:
+                self.debug(3,"INTERCEPT: packet accepted")
+            else:
+                self.debug(1,"INTERCEPT: unkown verdict: %r" % cmd.type)
+        self.my_send(pkt)
+        self.debug(3,"SENT : %s" % pkt.summary())
+        self.packets.append(pkt.copy())
+
 
     ## Internals
     def __init__(self, external_fd={}, *args, **kargs):
@@ -386,17 +406,18 @@ class Automaton:
             setattr(self.io, n, self._IO_mixer(ioout,ioin))
             setattr(self.oi, n, self._IO_mixer(ioin,ioout))
 
-            
         for stname in self.states:
             setattr(self, stname, 
                     instance_state(getattr(self, stname)))
         
-        
         self.parse_args(*args, **kargs)
 
         self.start()
 
-    def run_condition(self, cond, *args, **kargs):
+    def __iter__(self):
+        return self        
+
+    def _run_condition(self, cond, *args, **kargs):
         try:
             cond(self,*args, **kargs)
         except ATMT.NewStateRequested, state_req:
@@ -410,10 +431,7 @@ class Automaton:
         else:
             self.debug(2, "%s [%s] not taken" % (cond.atmt_type, cond.atmt_condname))
 
-    def __iter__(self):
-        return self        
-
-    def do_control(self, *args, **kargs):
+    def _do_control(self, *args, **kargs):
         with self.running:
             self.threadid = thread.get_ident()
 
@@ -443,7 +461,7 @@ class Automaton:
                         break
                     while True:
                         try:
-                            state = self.do_next()
+                            state = self._do_next()
                         except self.CommandMessage:
                             break
                         if singlestep:
@@ -460,8 +478,7 @@ class Automaton:
             self.debug(3, "Stopping control thread (tid=%i)"%self.threadid)
             self.threadid = None
     
-
-    def do_next(self):
+    def _do_next(self):
         try:
             self.debug(1, "## state=[%s]" % self.state.state)
 
@@ -484,7 +501,7 @@ class Automaton:
             
             # Then check immediate conditions
             for cond in self.conditions[self.state.state]:
-                self.run_condition(cond, *state_output)
+                self._run_condition(cond, *state_output)
 
             # If still there and no conditions left, we are stuck!
             if ( len(self.recv_conditions[self.state.state]) == 0 and
@@ -506,7 +523,7 @@ class Automaton:
                 t = time.time()-t0
                 if next_timeout is not None:
                     if next_timeout <= t:
-                        self.run_condition(timeout_func, *state_output)
+                        self._run_condition(timeout_func, *state_output)
                         next_timeout,timeout_func = expirations.next()
                 if next_timeout is None:
                     remain = None
@@ -524,14 +541,14 @@ class Automaton:
                             if self.master_filter(pkt):
                                 self.debug(3, "RECVD: %s" % pkt.summary())
                                 for rcvcond in self.recv_conditions[self.state.state]:
-                                    self.run_condition(rcvcond, pkt, *state_output)
+                                    self._run_condition(rcvcond, pkt, *state_output)
                             else:
                                 self.debug(4, "FILTR: %s" % pkt.summary())
                     else:
                         self.debug(3, "IOEVENT on %s" % fd.ioname)
                         for ioevt in self.ioevents[self.state.state]:
                             if ioevt.atmt_ioname == fd.ioname:
-                                self.run_condition(ioevt, fd, *state_output)
+                                self._run_condition(ioevt, fd, *state_output)
 
         except ATMT.NewStateRequested,state_req:
             self.debug(2, "switching from [%s] to [%s]" % (self.state.state,state_req.state))
@@ -539,7 +556,6 @@ class Automaton:
             return state_req
         
 
-
     ## Public API
     def add_interception_points(self, *ipts):
         for ipt in ipts:
@@ -568,7 +584,7 @@ class Automaton:
                 self.breakpoints.remove(pb)
 
     def start(self, *args, **kargs):
-        thread.start_new_thread(self.do_control, args, kargs)
+        thread.start_new_thread(self._do_control, args, kargs)
         
     def run(self, resume=None, wait=True):
         if resume is None:
@@ -589,6 +605,9 @@ class Automaton:
             elif c.type == _ATMT_Command.EXCEPTION:
                 raise c.exception
 
+    def runbg(self, resume=None, wait=False):
+        self.run(resume, wait)
+
     def next(self):
         return self.run(resume = Message(type=_ATMT_Command.NEXT))
 
@@ -607,28 +626,10 @@ class Automaton:
             rsm.type = _ATMT_Command.REPLACE
             rsm.pkt = pkt
         return self.run(resume=rsm)
+
     def reject_packet(self):
         rsm = Message(type = _ATMT_Command.REJECT)
         return self.run(resume=rsm)
 
     
-    def send(self, pkt):
-        if self.state.state in self.interception_points:
-            self.debug(3,"INTERCEPT: packet intercepted: %s" % pkt.summary())
-            cmd = Message(type = _ATMT_Command.INTERCEPT, pkt = pkt)
-            self.cmdout.send(cmd)
-            cmd = self.cmdin.recv()
-            if cmd.type == _ATMT_Command.REJECT:
-                self.debug(3,"INTERCEPT: packet rejected")
-                return
-            elif cmd.type == _ATMT_Command.REPLACE:
-                self.debug(3,"INTERCEPT: packet replaced")
-                pkt = cmd.pkt
-            elif cmd.type == _ATMT_Command.ACCEPT:
-                self.debug(3,"INTERCEPT: packet accepted")
-            else:
-                self.debug(1,"INTERCEPT: unkown verdict: %r" % cmd.type)
-        self.my_send(pkt)
-        self.debug(3,"SENT : %s" % pkt.summary())
-        self.packets.append(pkt.copy())