diff --git a/apps/sam/python/src/i2p/test/test_sam.py b/apps/sam/python/src/i2p/test/test_sam.py
deleted file mode 100644
index c2d14287527f910774eab025e5357488ce83d9d8..0000000000000000000000000000000000000000
--- a/apps/sam/python/src/i2p/test/test_sam.py
+++ /dev/null
@@ -1,442 +0,0 @@
-
-# -----------------------------------------------------
-# test_sam.py: Unit tests for sam.py.
-# -----------------------------------------------------
-
-# Make sure we can import i2p
-import sys; sys.path += ['../../']
-
-import traceback, time, thread, threading, random, copy
-from i2p import eep, sam
-
-def test_passed(s, msg='OK'):
-  """Notify user that the given unit test passed."""
-  print '  ' + (s + ':').ljust(50) + msg
-
-def verify_html(s):
-  """Raise an error if s does not end with </html>"""
-  assert s.strip().lower()[-7:] == '</html>'
-
-def stream_client(dest):
-  """Sub-unit test for sam.socket in SOCK_STREAM mode."""
-  S = sam.socket('Alice', sam.SOCK_STREAM)
-  S.connect(dest)
-  S.send('GET / HTTP/1.0\r\n\r\n')          # Send request
-  f = S.makefile()                          # File object
-
-  while True:                               # Read header
-    line = f.readline().strip()             # Read a line
-    if line == '': break                    # Content begins
-
-  s = f.read()                              # Get content
-  f.close()
-  S.close()
-
-def stream_client_test():
-  """Unit test for sam.socket in SOCK_STREAM mode."""
-  url = 'morph.i2p'
-  stream_client('http://' + url + '/')
-  stream_client(url)
-  stream_client(url + '/')
-  stream_client('http://' + url)
-  stream_client(sam.resolve('http://' + url + '/'))
-  test_passed('sam.socket stream client')
-
-def packet_test(raw=True):
-  """Unit test for sam.socket in SOCK_DGRAM or SOCK_RAW modes."""
-
-  try:
-    multithread_wait_time = 500.0
-    may_need_increase = False
-
-    if raw:
-      C = sam.socket('Carola', sam.SOCK_RAW, in_depth=0, out_depth=0)
-      D = sam.socket('Davey', sam.SOCK_RAW, in_depth=0, out_depth=0)
-    else:
-      C = sam.socket('Carol', sam.SOCK_DGRAM,in_depth=0,out_depth=0)
-      D = sam.socket('Dave', sam.SOCK_DGRAM, in_depth=0, out_depth=0)
-
-    global C_recv, D_recv, C_got, D_got, __lock
-    C_recv = []          # Packets C *should* receive
-    D_recv = []          # Packets D *should* receive
-    C_got  = []          # Packets C actually got
-    D_got  = []          # Packets D actually got
-
-    n = 50               # Create n threads
-    m = 40               # Each thread sends m packets
-
-    global __done_count
-    __done_count = 0
-    __lock = threading.Lock()
-
-    # Use C and D to send and read in many different threads.
-    def f():
-      # This code is run in each separate thread
-      global C_recv, D_recv, C_got, D_got, __lock, __done_count
-      for i in range(m):
-        # Random binary string of length 2-80.
-        index_list = range(random.randrange(2, 80))
-        s = ''.join([chr(random.randrange(256)) for j in index_list])
-        if random.randrange(2) == 0:
-          # Send packet from C to D, and log it.
-          C.sendto(s, 0, D.dest)
-          __lock.acquire()
-          D_recv += [s]
-          __lock.release()
-        else:
-          # Send packet from D to C, and log it.
-          D.sendto(s, 0, C.dest)
-          __lock.acquire()
-          C_recv += [s]
-          __lock.release()
-        time.sleep(0.01*random.uniform(0.0,1.0))
-        # Read any available packets.
-        try: (p, fromaddr) = C.recvfrom(1000, sam.MSG_DONTWAIT)
-        except sam.BlockError: p = None
-        if p != None and not raw: assert fromaddr == D.dest 
-
-        __lock.acquire()
-        if p != None: C_got += [p]
-        __lock.release()
-
-        try: (p, fromaddr) = D.recvfrom(1000, sam.MSG_DONTWAIT)
-        except sam.BlockError: p = None
-        if p != None and not raw: assert fromaddr == C.dest 
-
-        __lock.acquire()
-        if p != None: D_got += [p]
-        __lock.release()
-
-      __lock.acquire()
-      __done_count += 1
-      __lock.release()
-
-    # Create n threads.
-    for i in range(n):
-      threading.Thread(target=f).start()
-
-    # Wait for them to finish.
-    while __done_count < n: time.sleep(0.01)
-
-    # Read any left-over received packets.
-    end_time = time.clock() + multithread_wait_time
-    while time.clock() < end_time:
-      # Read any available packets.
-      try: (p, fromaddr) = C.recvfrom(1000, sam.MSG_DONTWAIT)
-      except sam.BlockError: p = None
-      if p != None and not raw: assert fromaddr == D.dest 
-
-      if p != None: C_got += [p]
-
-      try: (p, fromaddr) = D.recvfrom(1000, sam.MSG_DONTWAIT)
-      except sam.BlockError: p = None
-      if p != None and not raw: assert fromaddr == C.dest 
-
-      if p != None: D_got += [p]
-      if len(C_got) == len(C_recv) and len(D_got) == len(D_recv):
-        break
-
-    if time.clock() >= end_time:
-      may_need_increase = True
-
-    C_got.sort()
-    D_got.sort()
-    C_recv.sort()
-    D_recv.sort()
-
-    assert C_got == C_recv
-    assert D_got == D_recv
-
-    C.close()
-    D.close()
-  except:
-    if raw:
-      print 'Unit test failed for sam.socket (SOCK_RAW).'
-      print 'Raw packets are not reliable.'
-    else:
-      print 'Unit test failed for sam.socket (SOCK_DGRAM).'
-      print 'Datagram packets are not reliable.'
-
-    if may_need_increase:
-      print 'Try increasing multithread_wait_time.'
-
-    traceback.print_exc(); sys.exit()
-
-  if raw:
-    test_passed('sam.socket (SOCK_RAW)')
-  else:
-    test_passed('sam.socket (SOCK_RAW)')
-
-def stream_test():
-  """Multithreaded unit test for sam.socket (SOCK_STREAM)."""
-
-  try:
-    multithread_wait_time = 200.0
-    may_need_increase = False
-
-    kwargs = {'in_depth':0, 'out_depth':0}
-    C = sam.socket('Carolic', sam.SOCK_STREAM, **kwargs)
-    D = sam.socket('David', sam.SOCK_STREAM, **kwargs)
-    Cout = sam.socket('Carolic', sam.SOCK_STREAM, **kwargs)
-    Dout = sam.socket('David', sam.SOCK_STREAM, **kwargs)
-
-    assert C.dest == Cout.dest
-    assert D.dest == Dout.dest
-
-    C.listen(5)
-    D.listen(5)
-    Cout.connect(D.dest)
-    Dout.connect(C.dest)
-    (Cin, ignoredest) = C.accept()
-    (Din, ignoredest) = D.accept()
-
-    global C_recv, D_recv, C_got, D_got, __lock
-    C_recv = []          # String data C *should* receive
-    D_recv = []          # String data D *should* receive
-    C_got  = []          # String data C actually got
-    D_got  = []          # String data D actually got
-
-    n = 50               # Create n threads
-    m = 40               # Each thread sends m strings
-
-    global __done_count
-    __done_count = 0
-    __lock = threading.Lock()
-
-    # Use C and D to send and read in many different threads.
-    def f():
-      # This code is run in each separate thread
-      global C_recv, D_recv, C_got, D_got, __lock, __done_count
-      for i in range(m):
-        # Random binary string of length 2-80.
-        index_list = range(random.randrange(2, 80))
-        s = ''.join([chr(random.randrange(256)) for j in index_list])
-        if random.randrange(2) == 0:
-          # Send packet from C to D, and log it.
-          __lock.acquire()
-          Cout.send(s)
-          D_recv += [s]
-          __lock.release()
-        else:
-          # Send packet from D to C, and log it.
-          __lock.acquire()
-          Dout.send(s)
-          C_recv += [s]
-          __lock.release()
-        time.sleep(0.01*random.uniform(0.0,1.0))
-        # Read any available string data, non-blocking.
-
-        __lock.acquire()
-        try: p = Cin.recv(100000, sam.MSG_DONTWAIT)
-        except sam.BlockError: p = None
-        if p != None: C_got += [p]
-        __lock.release()
-
-        __lock.acquire()
-        try: p = Din.recv(100000, sam.MSG_DONTWAIT)
-        except sam.BlockError: p = None
-        if p != None: D_got += [p]
-        __lock.release()
-
-      __lock.acquire()
-      __done_count += 1
-      __lock.release()
-
-    # Create n threads.
-    for i in range(n):
-      threading.Thread(target=f).start()
-
-    # Wait for them to finish.
-    while __done_count < n: time.sleep(0.01)
-
-    # Read any left-over received string data.
-    end_time = time.clock() + multithread_wait_time
-    while time.clock() < end_time:
-      # Read any available string data, non-blocking.
-      try: p = Cin.recv(100000, sam.MSG_DONTWAIT)
-      except sam.BlockError: p = None
-      if p != None: C_got += [p]
-
-      try: p = Din.recv(100000, sam.MSG_DONTWAIT)
-      except sam.BlockError: p = None
-      if p != None: D_got += [p]
-
-      if len(''.join(C_got)) == len(''.join(C_recv)) and \
-         len(''.join(D_got)) == len(''.join(D_recv)):
-        break
-
-    if time.clock() >= end_time:
-      may_need_increase = True
-
-    C_got = ''.join(C_got)
-    D_got = ''.join(D_got)
-    C_recv = ''.join(C_recv)
-    D_recv = ''.join(D_recv)
-    assert C_got == C_recv
-    assert D_got == D_recv
-
-    Cin.close()
-    Din.close()
-    Cout.close()
-    Dout.close()
-    C.close()
-    D.close()
-  except:
-    print 'Unit test failed for sam.socket ' + \
-          '(SOCK_STREAM, multithreaded).'
-
-    if may_need_increase:
-      print 'Try increasing multithread_wait_time.'
-
-    traceback.print_exc(); sys.exit()
-
-  test_passed('sam.socket (SOCK_STREAM, multithreaded)')
-
-
-def noblock_stream_test():
-  """Unit test for non-blocking stream commands and listen."""
-
-  serv = sam.socket('Allison',sam.SOCK_STREAM,in_depth=0,out_depth=0)
-  serv.setblocking(False)
-  serv.listen(100)
-  assert serv.gettimeout() == 0.0
-
-  msg_to_client = 'Hi, client!!!!'
-  msg_to_server = 'Hi, server!'
-
-  nconnects = 5
-
-  global server_done, client_count, client_lock
-  server_done = False
-  client_count = 0
-  client_lock = threading.Lock()
-
-  def serv_func(n = nconnects):
-    while True:
-      try:
-        (C, ignoredest) = serv.accept()
-        C.send(msg_to_client)
-        rmsg = C.recv(len(msg_to_server), sam.MSG_WAITALL)
-        if rmsg != msg_to_server:
-          raise ValueError('message should have been: ' +
-            repr(msg_to_server) + ' was: ' + repr(rmsg))
-        C.close()
-        n -= 1
-        if n == 0: break
-      except sam.BlockError:
-        pass
-      time.sleep(0.01)
-    global server_done
-    server_done = True
-    
-  def client_func():
-    # FIXME: i2p.sam.NetworkError('TIMEOUT', '') errors are produced
-    # for our streams if we use '' for all clients.  Why?
-    C = sam.socket('Bobb', sam.SOCK_STREAM, in_depth=0, out_depth=0)
-    C.setblocking(False)
-    try:
-      C.connect(serv.dest)
-    except sam.BlockError:
-      # One could also use timeout=0.1 and loop
-      (Rlist, Wlist, Elist) = sam.select([C], [C], [C])
-      if len(Elist) > 0:
-        assert Elist[0] == C
-        raise Elist[0].sessobj.err
-    C.send(msg_to_server)
-    C.setblocking(True)
-    rmsg = C.recv(len(msg_to_client), sam.MSG_WAITALL)
-    if rmsg != msg_to_client:
-      raise ValueError('message should have been: ' +
-        repr(msg_to_client) + ' was: ' + repr(rmsg))
-    C.close()
-    global client_count, client_lock
-
-    # Synchronized
-    client_lock.acquire()
-    try: client_count += 1
-    finally: client_lock.release()
-
-
-  thread.start_new_thread(serv_func, ())
-
-  for i in range(nconnects):
-    thread.start_new_thread(client_func, ())
-
-  while True:
-    if server_done and client_count == nconnects: break
-    time.sleep(0.01)
-
-  test_passed('sam.listen (SOCK_STREAM), and non-blocking IO')
-
-def tunnel_server_demo():
-  """Demo for TunnelServer."""
-
-  T = sam.TunnelServer('Alisick', 8080, in_depth=0, out_depth=0)
-
-  print 'Server ready at:'
-  print T.dest
-  while True:
-    time.sleep(0.01)
-
-def tunnel_client_demo():
-  """Demo for TunnelClient."""
-
-  T = sam.TunnelClient('Alliaha', 8001, 'duck.i2p', \
-                       in_depth=0, out_depth=0)
-
-  print 'Serving up duck.i2p at http://127.0.0.1:8001/'
-  while True:
-    time.sleep(0.01)
-
-
-
-# select, poll
-# tunnel_client, tunnel_server
-# noblocking unit tests
-
-def multi_stream_test(n):
-  """See if we can have n streams open at once."""
-  server = None
-  client = [None] * n
-
-  server = sam.socket('Aligi',sam.SOCK_STREAM,in_depth=0,out_depth=0)
-  server.listen(n)
-  
-  for i in range(n):
-    client[i] = sam.socket('Bobo', sam.SOCK_STREAM, \
-                           in_depth=0, out_depth=0)
-
-  for i in range(n):
-    client[i].connect(server.dest)
-    client[i].send('Hi')
-
-  for i in range(n):
-    client[i].close()
-  server.close()
-
-  test_passed(str(n) + ' streams open at once')
-
-
-
-# Todo: Write unit tests for TunnelServer, TunnelClient.
-
-def test():
-  print 'Testing:'
-  print "Comment and uncomment tests manually, if they don't finish."
-
-#  noblock_stream_test()
-#  stream_client_test()
-#  packet_test(raw=True)
-#  stream_test()
-#  multi_stream_test(200)
-
-# Demos (manual unit tests):
-#  tunnel_server_demo()
-#  tunnel_client_demo()           # This fails too
-
-# Note: The datagram unit test fails, apparently due to a bug in I2P
-# (packet loss).
-##  packet_test(raw=False)
-
-if __name__ == '__main__':
-  test()