diff --git a/Makefile b/Makefile
index b303513..b7f0053 100644
--- a/Makefile
+++ b/Makefile
@@ -4,77 +4,74 @@
 OBJS	+= objects/pflash/arm_io.o
 OBJS2   = progress.o ast-sf-ctrl.o libflash.o libffs.o arm_io.o
 OBJS3   = obj/progress.o obj/ast-sf-ctrl.o obj/libflash.o obj/libffs.o obj/arm_io.o
-LIBS = ./bin
-OFLAGS =-L$(LIBS) -lopenbmc_intf
-HOME = .
-CFLAGS=$(shell pkg-config --libs --cflags gio-unix-2.0 glib-2.0)
-#CFLAGS = -pthread -I/usr/include/gio-unix-2.0/ -I/usr/include/glib-2.0 -I/usr/lib/x86_64-linux-gnu/glib-2.0/include -lgio-2.0 -lgobject-2.0 -lglib-2.0
+INCLUDES=$(shell pkg-config --cflags gio-unix-2.0 glib-2.0) -Iincludes -Iobjects/pflash -I.
+LIBS=$(shell pkg-config --libs gio-unix-2.0 glib-2.0) -Lbin -lopenbmc_intf
 
 %.o: interfaces/%.c 
-	$(CC) -c -fPIC -o obj/$@ $< -I$(HOME) -I$(HOME)/includes $(CFLAGS)
+	$(CC) -c -fPIC -o obj/$@ $< $(CFLAGS) $(INCLUDES)
 
 %.o: objects/%.c
-	$(CC) -c -o obj/$@ $< -L$(LIBS) -I$(HOME) -I$(HOME)/includes -I$(HOME)/objects/pflash  $(CFLAGS)
+	$(CC) -c -o obj/$@ $< $(LIBS) $(CFLAGS) $(INCLUDES)
 
 %.o: includes/%.c
-	$(CC) -c -o obj/$@ $< -L$(LIBS) -I$(HOME) -I$(HOME)/includes -I$(HOME)/objects/pflash $(CFLAGS)
+	$(CC) -c -o obj/$@ $< $(LIBS) $(CFLAGS) $(INCLUDES)
 
 %.o: objects/pflash/%.c
-	$(CC) -c -o obj/$@ $< -I$(HOME) -I$(HOME)/objects/pflash  $(CFLAGS)
+	$(CC) -c -o obj/$@ $< $(CFLAGS) $(INCLUDES)
 
 %.o: objects/pflash/libflash/%.c
-	$(CC) -c -o obj/$@ $< -I$(HOME) -I$(HOME)/objects/pflash  $(CFLAGS)
+	$(CC) -c -o obj/$@ $< $(CFLAGS) $(INCLUDES)
 
 setup: 
-	mkdir obj
+	mkdir -p obj
 
 clean:  
 	rm -rf obj
 
 libopenbmc_intf: openbmc_intf.o
-	$(CC) -shared -o bin/$@.so obj/openbmc_intf.o $(CFLAGS)
+	$(CC) -shared -o bin/$@.so obj/openbmc_intf.o $(LDFLAGS)
 
-power_control: power_control_obj.o gpio.o
-	$(CC) -o bin/$@.exe obj/gpio.o obj/power_control_obj.o $(OFLAGS) $(CFLAGS)
+power_control: power_control_obj.o gpio.o libopenbmc_intf
+	$(CC) -o bin/$@.exe obj/gpio.o obj/power_control_obj.o $(LDFLAGS) $(LIBS)
 
-led_controller: led_controller.o gpio.o
-	$(CC) -o bin/$@.exe obj/gpio.o obj/led_controller.o $(OFLAGS) $(CFLAGS)
+led_controller: led_controller.o gpio.o libopenbmc_intf
+	$(CC) -o bin/$@.exe obj/gpio.o obj/led_controller.o $(LDFLAGS) $(LIBS)
 
-sensor_ambient: sensor_threshold.o sensor_temperature_ambient_obj.o
-	$(CC) -o bin/$@.exe obj/sensor_threshold.o obj/sensor_temperature_ambient_obj.o $(OFLAGS) $(CFLAGS)
+sensor_ambient: sensor_threshold.o sensor_temperature_ambient_obj.o libopenbmc_intf
+	$(CC) -o bin/$@.exe obj/sensor_threshold.o obj/sensor_temperature_ambient_obj.o $(LDFLAGS) $(LIBS)
 
-button_power: button_power_obj.o gpio.o
-	$(CC) -o bin/$@.exe obj/button_power_obj.o obj/gpio.o $(OFLAGS) $(CFLAGS)
+button_power: button_power_obj.o gpio.o libopenbmc_intf
+	$(CC) -o bin/$@.exe obj/button_power_obj.o obj/gpio.o $(LDFLAGS) $(LIBS)
 
-control_host: control_host_obj.o gpio.o
-	$(CC) -o bin/$@.exe obj/gpio.o obj/control_host_obj.o $(OFLAGS) $(CFLAGS)
+control_host: control_host_obj.o gpio.o libopenbmc_intf
+	$(CC) -o bin/$@.exe obj/gpio.o obj/control_host_obj.o $(LDFLAGS) $(LIBS)
 
-flash_bios:  flash_bios_obj.o
-	$(CC) -o bin/$@.exe obj/flash_bios_obj.o $(OFLAGS)  $(CFLAGS)
+flash_bios:  flash_bios_obj.o libopenbmc_intf
+	$(CC) -o bin/$@.exe obj/flash_bios_obj.o $(LDFLAGS) $(LIBS)
 
-fan: fan_generic_obj.o gpio.o
-	$(CC) -o bin/$@.exe obj/gpio.o obj/fan_generic_obj.o $(OFLAGS) $(CFLAGS)
+fan: fan_generic_obj.o gpio.o libopenbmc_intf
+	$(CC) -o bin/$@.exe obj/gpio.o obj/fan_generic_obj.o $(LDFLAGS) $(LIBS)
 
-host_watchdog: host_watchdog_obj.o
-	$(CC) -o bin/$@.exe obj/host_watchdog_obj.o $(OFLAGS) $(CFLAGS)
+host_watchdog: host_watchdog_obj.o libopenbmc_intf
+	$(CC) -o bin/$@.exe obj/host_watchdog_obj.o $(LDFLAGS) $(LIBS)
 
-control_bmc: control_bmc_obj.o
-	$(CC) -o bin/$@.exe obj/control_bmc_obj.o $(OFLAGS) $(CFLAGS)
+control_bmc: control_bmc_obj.o libopenbmc_intf
+	$(CC) -o bin/$@.exe obj/control_bmc_obj.o $(LDFLAGS) $(LIBS)
 
-sensor_occ: sensor_occ_obj.o
-	$(CC) -o bin/$@.exe obj/sensor_occ_obj.o $(OFLAGS) $(CFLAGS)
+sensor_occ: sensor_occ_obj.o libopenbmc_intf
+	$(CC) -o bin/$@.exe obj/sensor_occ_obj.o $(LDFLAGS) $(LIBS)
 
-board_vpd: board_vpd_obj.o
-	$(CC) -o bin/$@.exe obj/board_vpd_obj.o $(OFLAGS) $(CFLAGS)
+board_vpd: board_vpd_obj.o libopenbmc_intf
+	$(CC) -o bin/$@.exe obj/board_vpd_obj.o $(LDFLAGS) $(LIBS)
 
-pcie_slot_present: pcie_slot_present_obj.o gpio.o
-	$(CC) -o bin/$@.exe obj/pcie_slot_present_obj.o obj/gpio.o $(OFLAGS) $(CFLAGS)
+pcie_slot_present: pcie_slot_present_obj.o gpio.o libopenbmc_intf
+	$(CC) -o bin/$@.exe obj/pcie_slot_present_obj.o obj/gpio.o $(LDFLAGS) $(LIBS)
 
-flasher:  $(OBJS2) flasher_obj.o
-	$(CC) -o bin/$@.exe obj/flasher_obj.o $(OFLAGS)  $(OBJS3)  $(CFLAGS)
+flasher:  $(OBJS2) flasher_obj.o libopenbmc_intf
+	$(CC) -o bin/$@.exe obj/flasher_obj.o $(OBJS3) $(LDFLAGS) $(LIBS)
 
-hwmon:  hwmon_intf.o
-	$(CC) -o bin/$@.exe obj/hwmon_intf.o $(OFLAGS)  $(CFLAGS)
+hwmon:  hwmon_intf.o libopenbmc_intf
+	$(CC) -o bin/$@.exe obj/hwmon_intf.o $(LDFLAGS) $(LIBS)
 
 
-all: clean setup libopenbmc_intf power_control led_controller sensor_ambient button_power control_host fan host_watchdog control_bmc board_vpd pcie_slot_present flash_bios flasher
+all: setup libopenbmc_intf power_control led_controller sensor_ambient button_power control_host fan host_watchdog control_bmc board_vpd pcie_slot_present flash_bios flasher
diff --git a/bin/tftpy/COPYING b/bin/tftpy/COPYING
deleted file mode 100644
index c9f2c9c..0000000
--- a/bin/tftpy/COPYING
+++ /dev/null
@@ -1,21 +0,0 @@
-The MIT License
-
-Copyright (c) 2009 Michael P. Soulier
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
diff --git a/bin/tftpy/README b/bin/tftpy/README
deleted file mode 100644
index ad7a871..0000000
--- a/bin/tftpy/README
+++ /dev/null
@@ -1,115 +0,0 @@
-Copyright, Michael P. Soulier, 2010.
-
-About Release 0.6.2:
-====================
-Maintenance release to fix a couple of reported issues.
-
-About Release 0.6.1:
-====================
-Maintenance release to fix several reported problems, including a rollover
-at 2^16 blocks, and some contributed work on dynamic file objects.
-
-About Release 0.6.0:
-====================
-Maintenance update to fix several reported issues, including proper
-retransmits on timeouts, and further expansion of unit tests.
-
-About Release 0.5.1:
-====================
-Maintenance update to fix a bug in the server, overhaul the documentation for
-the website, fix a typo in the unit tests, fix a failure to set default
-blocksize, and a divide by zero error in speed calculations for very short
-transfers.
-
-Also, this release adds support for input/output in client as stdin/stdout
-
-About Release 0.5.0:
-====================
-Complete rewrite of the state machine.
-Now fully implements downloading and uploading.
-
-About Release 0.4.6:
-====================
-Feature release to add the tsize option. 
-Thanks to Kuba Kończyk for the patch.
-
-About Release 0.4.5:
-====================
-Bugfix release for compatability issues on Win32, among other small issues.
-
-About Release 0.4.4:
-====================
-Bugfix release for poor tolerance of unsupported options in the server.
-
-About Release 0.4.3:
-====================
-Bugfix release for an issue with the server's detection of the end of the file
-during a download.
-
-About Release 0.4.2:
-====================
-Bugfix release for some small installation issues with earlier Python
-releases.
-
-About Release 0.4.1:
-====================
-Bugfix release to fix the installation path, with some restructuring into a
-tftpy package from the single module used previously.
-
-About Release 0.4:
-==================
-This release adds a TftpServer class with a sample implementation in bin.
-The server uses a single thread with multiple handlers and a select() loop to
-handle multiple clients simultaneously.
-
-Only downloads are supported at this time.
-
-About Release 0.3:
-==================
-This release fixes a major RFC 1350 compliance problem with the remote TID.
-
-About Release 0.2:
-==================
-This release adds variable block sizes, and general option support,
-implementing RFCs 2347 and 2348. This is accessible in the TftpClient class
-via the options dict, or in the sample client via the --blocksize option.
-
-About Release 0.1:
-==================
-
-This is an initial release in the spirit of "release early, release often".
-Currently the sample client works, supporting RFC 1350. The server is not yet
-implemented, and RFC 2347 and 2348 support (variable block sizes) is underway,
-planned for 0.2.
-
-About Tftpy:
-============
-
-Purpose:
---------
-Tftpy is a TFTP library for the Python programming language. It includes
-client and server classes, with sample implementations. Hooks are included for
-easy inclusion in a UI for populating progress indicators. It supports RFCs
-1350, 2347, 2348 and the tsize option from RFC 2349.
-
-Dependencies:
--------------
-Python 2.3+, hopefully. Let me know if it fails to work.
-
-Trifles:
---------
-Home page: http://tftpy.sf.net/
-Project page: http://sourceforge.net/projects/tftpy/
-
-License is the MIT License
-
-See COPYING in this distribution.
-
-Limitations:
-------------
-- Only 'octet' mode is supported.
-- The only options supported are blksize and tsize.
-
-Author:
-=======
-Michael P. Soulier <msoulier@digitaltorque.ca>
diff --git a/bin/tftpy/TftpClient.py b/bin/tftpy/TftpClient.py
deleted file mode 100644
index 62f1dda..0000000
--- a/bin/tftpy/TftpClient.py
+++ /dev/null
@@ -1,103 +0,0 @@
-"""This module implements the TFTP Client functionality. Instantiate an
-instance of the client, and then use its upload or download method. Logging is
-performed via a standard logging object set in TftpShared."""
-
-import types
-from TftpShared import *
-from TftpPacketTypes import *
-from TftpContexts import TftpContextClientDownload, TftpContextClientUpload
-
-class TftpClient(TftpSession):
-    """This class is an implementation of a tftp client. Once instantiated, a
-    download can be initiated via the download() method, or an upload via the
-    upload() method."""
-
-    def __init__(self, host, port, options={}, localip = ""):
-        TftpSession.__init__(self)
-        self.context = None
-        self.host = host
-        self.iport = port
-        self.filename = None
-        self.options = options
-        self.localip = localip
-        if self.options.has_key('blksize'):
-            size = self.options['blksize']
-            tftpassert(types.IntType == type(size), "blksize must be an int")
-            if size < MIN_BLKSIZE or size > MAX_BLKSIZE:
-                raise TftpException, "Invalid blksize: %d" % size
-
-    def download(self, filename, output, packethook=None, timeout=SOCK_TIMEOUT):
-        """This method initiates a tftp download from the configured remote
-        host, requesting the filename passed. It writes the file to output,
-        which can be a file-like object or a path to a local file. If a
-        packethook is provided, it must be a function that takes a single
-        parameter, which will be a copy of each DAT packet received in the
-        form of a TftpPacketDAT object. The timeout parameter may be used to
-        override the default SOCK_TIMEOUT setting, which is the amount of time
-        that the client will wait for a receive packet to arrive.
-
-        Note: If output is a hyphen, stdout is used."""
-        # We're downloading.
-        log.debug("Creating download context with the following params:")
-        log.debug("host = %s, port = %s, filename = %s, output = %s",
-            self.host, self.iport, filename, output)
-        log.debug("options = %s, packethook = %s, timeout = %s",
-            self.options, packethook, timeout)
-        self.context = TftpContextClientDownload(self.host,
-                                                 self.iport,
-                                                 filename,
-                                                 output,
-                                                 self.options,
-                                                 packethook,
-                                                 timeout,
-                                                 localip = self.localip)
-        self.context.start()
-        # Download happens here
-        self.context.end()
-
-        metrics = self.context.metrics
-
-        log.info('')
-        log.info("Download complete.")
-        if metrics.duration == 0:
-            log.info("Duration too short, rate undetermined")
-        else:
-            log.info("Downloaded %.2f bytes in %.2f seconds" % (metrics.bytes, metrics.duration))
-            log.info("Average rate: %.2f kbps" % metrics.kbps)
-        log.info("%.2f bytes in resent data" % metrics.resent_bytes)
-        log.info("Received %d duplicate packets" % metrics.dupcount)
-
-    def upload(self, filename, input, packethook=None, timeout=SOCK_TIMEOUT):
-        """This method initiates a tftp upload to the configured remote host,
-        uploading the filename passed. It reads the file from input, which
-        can be a file-like object or a path to a local file. If a packethook
-        is provided, it must be a function that takes a single parameter,
-        which will be a copy of each DAT packet sent in the form of a
-        TftpPacketDAT object. The timeout parameter may be used to override
-        the default SOCK_TIMEOUT setting, which is the amount of time that
-        the client will wait for a DAT packet to be ACKd by the server.
-
-        Note: If input is a hyphen, stdin is used."""
-        self.context = TftpContextClientUpload(self.host,
-                                               self.iport,
-                                               filename,
-                                               input,
-                                               self.options,
-                                               packethook,
-                                               timeout,
-                                               localip = self.localip)
-        self.context.start()
-        # Upload happens here
-        self.context.end()
-
-        metrics = self.context.metrics
-
-        log.info('')
-        log.info("Upload complete.")
-        if metrics.duration == 0:
-            log.info("Duration too short, rate undetermined")
-        else:
-            log.info("Uploaded %d bytes in %.2f seconds" % (metrics.bytes, metrics.duration))
-            log.info("Average rate: %.2f kbps" % metrics.kbps)
-        log.info("%.2f bytes in resent data" % metrics.resent_bytes)
-        log.info("Resent %d packets" % metrics.dupcount)
diff --git a/bin/tftpy/TftpContexts.py b/bin/tftpy/TftpContexts.py
deleted file mode 100644
index 4c41916..0000000
--- a/bin/tftpy/TftpContexts.py
+++ /dev/null
@@ -1,397 +0,0 @@
-"""This module implements all contexts for state handling during uploads and
-downloads, the main interface to which being the TftpContext base class.
-
-The concept is simple. Each context object represents a single upload or
-download, and the state object in the context object represents the current
-state of that transfer. The state object has a handle() method that expects
-the next packet in the transfer, and returns a state object until the transfer
-is complete, at which point it returns None. That is, unless there is a fatal
-error, in which case a TftpException is returned instead."""
-
-from TftpShared import *
-from TftpPacketTypes import *
-from TftpPacketFactory import TftpPacketFactory
-from TftpStates import *
-import socket, time, sys
-
-###############################################################################
-# Utility classes
-###############################################################################
-
-class TftpMetrics(object):
-    """A class representing metrics of the transfer."""
-    def __init__(self):
-        # Bytes transferred
-        self.bytes = 0
-        # Bytes re-sent
-        self.resent_bytes = 0
-        # Duplicate packets received
-        self.dups = {}
-        self.dupcount = 0
-        # Times
-        self.start_time = 0
-        self.end_time = 0
-        self.duration = 0
-        # Rates
-        self.bps = 0
-        self.kbps = 0
-        # Generic errors
-        self.errors = 0
-
-    def compute(self):
-        # Compute transfer time
-        self.duration = self.end_time - self.start_time
-        if self.duration == 0:
-            self.duration = 1
-        log.debug("TftpMetrics.compute: duration is %s", self.duration)
-        self.bps = (self.bytes * 8.0) / self.duration
-        self.kbps = self.bps / 1024.0
-        log.debug("TftpMetrics.compute: kbps is %s", self.kbps)
-        for key in self.dups:
-            self.dupcount += self.dups[key]
-
-    def add_dup(self, pkt):
-        """This method adds a dup for a packet to the metrics."""
-        log.debug("Recording a dup of %s", pkt)
-        s = str(pkt)
-        if self.dups.has_key(s):
-            self.dups[s] += 1
-        else:
-            self.dups[s] = 1
-        tftpassert(self.dups[s] < MAX_DUPS, "Max duplicates reached")
-
-###############################################################################
-# Context classes
-###############################################################################
-
-class TftpContext(object):
-    """The base class of the contexts."""
-
-    def __init__(self, host, port, timeout, localip = ""):
-        """Constructor for the base context, setting shared instance
-        variables."""
-        self.file_to_transfer = None
-        self.fileobj = None
-        self.options = None
-        self.packethook = None
-        self.sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
-        if localip != "":
-            self.sock.bind((localip, 0))
-        self.sock.settimeout(timeout)
-        self.timeout = timeout
-        self.state = None
-        self.next_block = 0
-        self.factory = TftpPacketFactory()
-        # Note, setting the host will also set self.address, as it's a property.
-        self.host = host
-        self.port = port
-        # The port associated with the TID
-        self.tidport = None
-        # Metrics
-        self.metrics = TftpMetrics()
-        # Fluag when the transfer is pending completion.
-        self.pending_complete = False
-        # Time when this context last received any traffic.
-        # FIXME: does this belong in metrics?
-        self.last_update = 0
-        # The last packet we sent, if applicable, to make resending easy.
-        self.last_pkt = None
-        # Count the number of retry attempts.
-        self.retry_count = 0
-
-    def getBlocksize(self):
-        """Fetch the current blocksize for this session."""
-        return int(self.options.get('blksize', 512))
-
-    def __del__(self):
-        """Simple destructor to try to call housekeeping in the end method if
-        not called explicitely. Leaking file descriptors is not a good
-        thing."""
-        self.end()
-
-    def checkTimeout(self, now):
-        """Compare current time with last_update time, and raise an exception
-        if we're over the timeout time."""
-        log.debug("checking for timeout on session %s", self)
-        if now - self.last_update > self.timeout:
-            raise TftpTimeout, "Timeout waiting for traffic"
-
-    def start(self):
-        raise NotImplementedError, "Abstract method"
-
-    def end(self):
-        """Perform session cleanup, since the end method should always be
-        called explicitely by the calling code, this works better than the
-        destructor."""
-        log.debug("in TftpContext.end")
-        self.sock.close()
-        if self.fileobj is not None and not self.fileobj.closed:
-            log.debug("self.fileobj is open - closing")
-            self.fileobj.close()
-
-    def gethost(self):
-        "Simple getter method for use in a property."
-        return self.__host
-
-    def sethost(self, host):
-        """Setter method that also sets the address property as a result
-        of the host that is set."""
-        self.__host = host
-        self.address = socket.gethostbyname(host)
-
-    host = property(gethost, sethost)
-
-    def setNextBlock(self, block):
-        if block >= 2 ** 16:
-            log.debug("Block number rollover to 0 again")
-            block = 0
-        self.__eblock = block
-
-    def getNextBlock(self):
-        return self.__eblock
-
-    next_block = property(getNextBlock, setNextBlock)
-
-    def cycle(self):
-        """Here we wait for a response from the server after sending it
-        something, and dispatch appropriate action to that response."""
-        try:
-            (buffer, (raddress, rport)) = self.sock.recvfrom(MAX_BLKSIZE)
-        except socket.timeout:
-            log.warn("Timeout waiting for traffic, retrying...")
-            raise TftpTimeout, "Timed-out waiting for traffic"
-
-        # Ok, we've received a packet. Log it.
-        log.debug("Received %d bytes from %s:%s",
-                        len(buffer), raddress, rport)
-        # And update our last updated time.
-        self.last_update = time.time()
-
-        # Decode it.
-        recvpkt = self.factory.parse(buffer)
-
-        # Check for known "connection".
-        if raddress != self.address:
-            log.warn("Received traffic from %s, expected host %s. Discarding"
-                        % (raddress, self.host))
-
-        if self.tidport and self.tidport != rport:
-            log.warn("Received traffic from %s:%s but we're "
-                        "connected to %s:%s. Discarding."
-                        % (raddress, rport,
-                        self.host, self.tidport))
-
-        # If there is a packethook defined, call it. We unconditionally
-        # pass all packets, it's up to the client to screen out different
-        # kinds of packets. This way, the client is privy to things like
-        # negotiated options.
-        if self.packethook:
-            self.packethook(recvpkt)
-
-        # And handle it, possibly changing state.
-        self.state = self.state.handle(recvpkt, raddress, rport)
-        # If we didn't throw any exceptions here, reset the retry_count to
-        # zero.
-        self.retry_count = 0
-
-class TftpContextServer(TftpContext):
-    """The context for the server."""
-    def __init__(self, host, port, timeout, root, dyn_file_func=None):
-        TftpContext.__init__(self,
-                             host,
-                             port,
-                             timeout,
-                             )
-        # At this point we have no idea if this is a download or an upload. We
-        # need to let the start state determine that.
-        self.state = TftpStateServerStart(self)
-
-        self.root = root
-        self.dyn_file_func = dyn_file_func
-
-    def __str__(self):
-        return "%s:%s %s" % (self.host, self.port, self.state)
-
-    def start(self, buffer):
-        """Start the state cycle. Note that the server context receives an
-        initial packet in its start method. Also note that the server does not
-        loop on cycle(), as it expects the TftpServer object to manage
-        that."""
-        log.debug("In TftpContextServer.start")
-        self.metrics.start_time = time.time()
-        log.debug("Set metrics.start_time to %s", self.metrics.start_time)
-        # And update our last updated time.
-        self.last_update = time.time()
-
-        pkt = self.factory.parse(buffer)
-        log.debug("TftpContextServer.start() - factory returned a %s", pkt)
-
-        # Call handle once with the initial packet. This should put us into
-        # the download or the upload state.
-        self.state = self.state.handle(pkt,
-                                       self.host,
-                                       self.port)
-
-    def end(self):
-        """Finish up the context."""
-        TftpContext.end(self)
-        self.metrics.end_time = time.time()
-        log.debug("Set metrics.end_time to %s", self.metrics.end_time)
-        self.metrics.compute()
-
-class TftpContextClientUpload(TftpContext):
-    """The upload context for the client during an upload.
-    Note: If input is a hyphen, then we will use stdin."""
-    def __init__(self,
-                 host,
-                 port,
-                 filename,
-                 input,
-                 options,
-                 packethook,
-                 timeout,
-                 localip = ""):
-        TftpContext.__init__(self,
-                             host,
-                             port,
-                             timeout,
-                             localip)
-        self.file_to_transfer = filename
-        self.options = options
-        self.packethook = packethook
-        # If the input object has a read() function,
-        # assume it is file-like.
-        if hasattr(input, 'read'):
-            self.fileobj = input
-        elif input == '-':
-            self.fileobj = sys.stdin
-        else:
-            self.fileobj = open(input, "rb")
-
-        log.debug("TftpContextClientUpload.__init__()")
-        log.debug("file_to_transfer = %s, options = %s",
-            self.file_to_transfer, self.options)
-
-    def __str__(self):
-        return "%s:%s %s" % (self.host, self.port, self.state)
-
-    def start(self):
-        log.info("Sending tftp upload request to %s" % self.host)
-        log.info("    filename -> %s" % self.file_to_transfer)
-        log.info("    options -> %s" % self.options)
-
-        self.metrics.start_time = time.time()
-        log.debug("Set metrics.start_time to %s", self.metrics.start_time)
-
-        # FIXME: put this in a sendWRQ method?
-        pkt = TftpPacketWRQ()
-        pkt.filename = self.file_to_transfer
-        pkt.mode = "octet" # FIXME - shouldn't hardcode this
-        pkt.options = self.options
-        self.sock.sendto(pkt.encode().buffer, (self.host, self.port))
-        self.next_block = 1
-        self.last_pkt = pkt
-        # FIXME: should we centralize sendto operations so we can refactor all
-        # saving of the packet to the last_pkt field?
-
-        self.state = TftpStateSentWRQ(self)
-
-        while self.state:
-            try:
-                log.debug("State is %s", self.state)
-                self.cycle()
-            except TftpTimeout, err:
-                log.error(str(err))
-                self.retry_count += 1
-                if self.retry_count >= TIMEOUT_RETRIES:
-                    log.debug("hit max retries, giving up")
-                    raise
-                else:
-                    log.warn("resending last packet")
-                    self.state.resendLast()
-
-    def end(self):
-        """Finish up the context."""
-        TftpContext.end(self)
-        self.metrics.end_time = time.time()
-        log.debug("Set metrics.end_time to %s", self.metrics.end_time)
-        self.metrics.compute()
-
-class TftpContextClientDownload(TftpContext):
-    """The download context for the client during a download.
-    Note: If output is a hyphen, then the output will be sent to stdout."""
-    def __init__(self,
-                 host,
-                 port,
-                 filename,
-                 output,
-                 options,
-                 packethook,
-                 timeout,
-                 localip = ""):
-        TftpContext.__init__(self,
-                             host,
-                             port,
-                             timeout,
-                             localip)
-        # FIXME: should we refactor setting of these params?
-        self.file_to_transfer = filename
-        self.options = options
-        self.packethook = packethook
-        # If the output object has a write() function,
-        # assume it is file-like.
-        if hasattr(output, 'write'):
-            self.fileobj = output
-        # If the output filename is -, then use stdout
-        elif output == '-':
-            self.fileobj = sys.stdout
-        else:
-            self.fileobj = open(output, "wb")
-
-        log.debug("TftpContextClientDownload.__init__()")
-        log.debug("file_to_transfer = %s, options = %s",
-            self.file_to_transfer, self.options)
-
-    def __str__(self):
-        return "%s:%s %s" % (self.host, self.port, self.state)
-
-    def start(self):
-        """Initiate the download."""
-        log.info("Sending tftp download request to %s" % self.host)
-        log.info("    filename -> %s" % self.file_to_transfer)
-        log.info("    options -> %s" % self.options)
-
-        self.metrics.start_time = time.time()
-        log.debug("Set metrics.start_time to %s", self.metrics.start_time)
-
-        # FIXME: put this in a sendRRQ method?
-        pkt = TftpPacketRRQ()
-        pkt.filename = self.file_to_transfer
-        pkt.mode = "octet" # FIXME - shouldn't hardcode this
-        pkt.options = self.options
-        self.sock.sendto(pkt.encode().buffer, (self.host, self.port))
-        self.next_block = 1
-        self.last_pkt = pkt
-
-        self.state = TftpStateSentRRQ(self)
-
-        while self.state:
-            try:
-                log.debug("State is %s", self.state)
-                self.cycle()
-            except TftpTimeout, err:
-                log.error(str(err))
-                self.retry_count += 1
-                if self.retry_count >= TIMEOUT_RETRIES:
-                    log.debug("hit max retries, giving up")
-                    raise
-                else:
-                    log.warn("resending last packet")
-                    self.state.resendLast()
-
-    def end(self):
-        """Finish up the context."""
-        TftpContext.end(self)
-        self.metrics.end_time = time.time()
-        log.debug("Set metrics.end_time to %s", self.metrics.end_time)
-        self.metrics.compute()
diff --git a/bin/tftpy/TftpPacketFactory.py b/bin/tftpy/TftpPacketFactory.py
deleted file mode 100644
index 154aec8..0000000
--- a/bin/tftpy/TftpPacketFactory.py
+++ /dev/null
@@ -1,41 +0,0 @@
-"""This module implements the TftpPacketFactory class, which can take a binary
-buffer, and return the appropriate TftpPacket object to represent it, via the
-parse() method."""
-
-from TftpShared import *
-from TftpPacketTypes import *
-
-class TftpPacketFactory(object):
-    """This class generates TftpPacket objects. It is responsible for parsing
-    raw buffers off of the wire and returning objects representing them, via
-    the parse() method."""
-    def __init__(self):
-        self.classes = {
-            1: TftpPacketRRQ,
-            2: TftpPacketWRQ,
-            3: TftpPacketDAT,
-            4: TftpPacketACK,
-            5: TftpPacketERR,
-            6: TftpPacketOACK
-            }
-
-    def parse(self, buffer):
-        """This method is used to parse an existing datagram into its
-        corresponding TftpPacket object. The buffer is the raw bytes off of
-        the network."""
-        log.debug("parsing a %d byte packet", len(buffer))
-        (opcode,) = struct.unpack("!H", buffer[:2])
-        log.debug("opcode is %d", opcode)
-        packet = self.__create(opcode)
-        packet.buffer = buffer
-        return packet.decode()
-
-    def __create(self, opcode):
-        """This method returns the appropriate class object corresponding to
-        the passed opcode."""
-        tftpassert(self.classes.has_key(opcode),
-                   "Unsupported opcode: %d" % opcode)
-
-        packet = self.classes[opcode]()
-
-        return packet
diff --git a/bin/tftpy/TftpPacketTypes.py b/bin/tftpy/TftpPacketTypes.py
deleted file mode 100644
index d7c25ca..0000000
--- a/bin/tftpy/TftpPacketTypes.py
+++ /dev/null
@@ -1,445 +0,0 @@
-"""This module implements the packet types of TFTP itself, and the
-corresponding encode and decode methods for them."""
-
-import struct
-from TftpShared import *
-
-class TftpSession(object):
-    """This class is the base class for the tftp client and server. Any shared
-    code should be in this class."""
-    # FIXME: do we need this anymore?
-    pass
-
-class TftpPacketWithOptions(object):
-    """This class exists to permit some TftpPacket subclasses to share code
-    regarding options handling. It does not inherit from TftpPacket, as the
-    goal is just to share code here, and not cause diamond inheritance."""
-
-    def __init__(self):
-        self.options = {}
-
-    def setoptions(self, options):
-        log.debug("in TftpPacketWithOptions.setoptions")
-        log.debug("options: %s", str(options))
-        myoptions = {}
-        for key in options:
-            newkey = str(key)
-            myoptions[newkey] = str(options[key])
-            log.debug("populated myoptions with %s = %s",
-                         newkey, myoptions[newkey])
-
-        log.debug("setting options hash to: %s", str(myoptions))
-        self._options = myoptions
-
-    def getoptions(self):
-        log.debug("in TftpPacketWithOptions.getoptions")
-        return self._options
-
-    # Set up getter and setter on options to ensure that they are the proper
-    # type. They should always be strings, but we don't need to force the
-    # client to necessarily enter strings if we can avoid it.
-    options = property(getoptions, setoptions)
-
-    def decode_options(self, buffer):
-        """This method decodes the section of the buffer that contains an
-        unknown number of options. It returns a dictionary of option names and
-        values."""
-        format = "!"
-        options = {}
-
-        log.debug("decode_options: buffer is: %s", repr(buffer))
-        log.debug("size of buffer is %d bytes", len(buffer))
-        if len(buffer) == 0:
-            log.debug("size of buffer is zero, returning empty hash")
-            return {}
-
-        # Count the nulls in the buffer. Each one terminates a string.
-        log.debug("about to iterate options buffer counting nulls")
-        length = 0
-        for c in buffer:
-            if ord(c) == 0:
-                log.debug("found a null at length %d", length)
-                if length > 0:
-                    format += "%dsx" % length
-                    length = -1
-                else:
-                    raise TftpException, "Invalid options in buffer"
-            length += 1
-
-        log.debug("about to unpack, format is: %s", format)
-        mystruct = struct.unpack(format, buffer)
-
-        tftpassert(len(mystruct) % 2 == 0,
-                   "packet with odd number of option/value pairs")
-
-        for i in range(0, len(mystruct), 2):
-            log.debug("setting option %s to %s", mystruct[i], mystruct[i+1])
-            options[mystruct[i]] = mystruct[i+1]
-
-        return options
-
-class TftpPacket(object):
-    """This class is the parent class of all tftp packet classes. It is an
-    abstract class, providing an interface, and should not be instantiated
-    directly."""
-    def __init__(self):
-        self.opcode = 0
-        self.buffer = None
-
-    def encode(self):
-        """The encode method of a TftpPacket takes keyword arguments specific
-        to the type of packet, and packs an appropriate buffer in network-byte
-        order suitable for sending over the wire.
-
-        This is an abstract method."""
-        raise NotImplementedError, "Abstract method"
-
-    def decode(self):
-        """The decode method of a TftpPacket takes a buffer off of the wire in
-        network-byte order, and decodes it, populating internal properties as
-        appropriate. This can only be done once the first 2-byte opcode has
-        already been decoded, but the data section does include the entire
-        datagram.
-
-        This is an abstract method."""
-        raise NotImplementedError, "Abstract method"
-
-class TftpPacketInitial(TftpPacket, TftpPacketWithOptions):
-    """This class is a common parent class for the RRQ and WRQ packets, as
-    they share quite a bit of code."""
-    def __init__(self):
-        TftpPacket.__init__(self)
-        TftpPacketWithOptions.__init__(self)
-        self.filename = None
-        self.mode = None
-
-    def encode(self):
-        """Encode the packet's buffer from the instance variables."""
-        tftpassert(self.filename, "filename required in initial packet")
-        tftpassert(self.mode, "mode required in initial packet")
-
-        ptype = None
-        if self.opcode == 1: ptype = "RRQ"
-        else:                ptype = "WRQ"
-        log.debug("Encoding %s packet, filename = %s, mode = %s",
-                     ptype, self.filename, self.mode)
-        for key in self.options:
-            log.debug("    Option %s = %s", key, self.options[key])
-
-        format = "!H"
-        format += "%dsx" % len(self.filename)
-        if self.mode == "octet":
-            format += "5sx"
-        else:
-            raise AssertionError, "Unsupported mode: %s" % mode
-        # Add options.
-        options_list = []
-        if self.options.keys() > 0:
-            log.debug("there are options to encode")
-            for key in self.options:
-                # Populate the option name
-                format += "%dsx" % len(key)
-                options_list.append(key)
-                # Populate the option value
-                format += "%dsx" % len(str(self.options[key]))
-                options_list.append(str(self.options[key]))
-
-        log.debug("format is %s", format)
-        log.debug("options_list is %s", options_list)
-        log.debug("size of struct is %d", struct.calcsize(format))
-
-        self.buffer = struct.pack(format,
-                                  self.opcode,
-                                  self.filename,
-                                  self.mode,
-                                  *options_list)
-
-        log.debug("buffer is %s", repr(self.buffer))
-        return self
-
-    def decode(self):
-        tftpassert(self.buffer, "Can't decode, buffer is empty")
-
-        # FIXME - this shares a lot of code with decode_options
-        nulls = 0
-        format = ""
-        nulls = length = tlength = 0
-        log.debug("in decode: about to iterate buffer counting nulls")
-        subbuf = self.buffer[2:]
-        for c in subbuf:
-            if ord(c) == 0:
-                nulls += 1
-                log.debug("found a null at length %d, now have %d", length, nulls)
-                format += "%dsx" % length
-                length = -1
-                # At 2 nulls, we want to mark that position for decoding.
-                if nulls == 2:
-                    break
-            length += 1
-            tlength += 1
-
-        log.debug("hopefully found end of mode at length %d", tlength)
-        # length should now be the end of the mode.
-        tftpassert(nulls == 2, "malformed packet")
-        shortbuf = subbuf[:tlength+1]
-        log.debug("about to unpack buffer with format: %s", format)
-        log.debug("unpacking buffer: %s", repr(shortbuf))
-        mystruct = struct.unpack(format, shortbuf)
-
-        tftpassert(len(mystruct) == 2, "malformed packet")
-        self.filename = mystruct[0]
-        self.mode = mystruct[1].lower() # force lc - bug 17
-        log.debug("set filename to %s", self.filename)
-        log.debug("set mode to %s", self.mode)
-
-        self.options = self.decode_options(subbuf[tlength+1:])
-        return self
-
-class TftpPacketRRQ(TftpPacketInitial):
-    """
-::
-
-            2 bytes    string   1 byte     string   1 byte
-            -----------------------------------------------
-    RRQ/  | 01/02 |  Filename  |   0  |    Mode    |   0  |
-    WRQ     -----------------------------------------------
-    """
-    def __init__(self):
-        TftpPacketInitial.__init__(self)
-        self.opcode = 1
-
-    def __str__(self):
-        s = 'RRQ packet: filename = %s' % self.filename
-        s += ' mode = %s' % self.mode
-        if self.options:
-            s += '\n    options = %s' % self.options
-        return s
-
-class TftpPacketWRQ(TftpPacketInitial):
-    """
-::
-
-            2 bytes    string   1 byte     string   1 byte
-            -----------------------------------------------
-    RRQ/  | 01/02 |  Filename  |   0  |    Mode    |   0  |
-    WRQ     -----------------------------------------------
-    """
-    def __init__(self):
-        TftpPacketInitial.__init__(self)
-        self.opcode = 2
-
-    def __str__(self):
-        s = 'WRQ packet: filename = %s' % self.filename
-        s += ' mode = %s' % self.mode
-        if self.options:
-            s += '\n    options = %s' % self.options
-        return s
-
-class TftpPacketDAT(TftpPacket):
-    """
-::
-
-            2 bytes    2 bytes       n bytes
-            ---------------------------------
-    DATA  | 03    |   Block #  |    Data    |
-            ---------------------------------
-    """
-    def __init__(self):
-        TftpPacket.__init__(self)
-        self.opcode = 3
-        self.blocknumber = 0
-        self.data = None
-
-    def __str__(self):
-        s = 'DAT packet: block %s' % self.blocknumber
-        if self.data:
-            s += '\n    data: %d bytes' % len(self.data)
-        return s
-
-    def encode(self):
-        """Encode the DAT packet. This method populates self.buffer, and
-        returns self for easy method chaining."""
-        if len(self.data) == 0:
-            log.debug("Encoding an empty DAT packet")
-        format = "!HH%ds" % len(self.data)
-        self.buffer = struct.pack(format,
-                                  self.opcode,
-                                  self.blocknumber,
-                                  self.data)
-        return self
-
-    def decode(self):
-        """Decode self.buffer into instance variables. It returns self for
-        easy method chaining."""
-        # We know the first 2 bytes are the opcode. The second two are the
-        # block number.
-        (self.blocknumber,) = struct.unpack("!H", self.buffer[2:4])
-        log.debug("decoding DAT packet, block number %d", self.blocknumber)
-        log.debug("should be %d bytes in the packet total", len(self.buffer))
-        # Everything else is data.
-        self.data = self.buffer[4:]
-        log.debug("found %d bytes of data", len(self.data))
-        return self
-
-class TftpPacketACK(TftpPacket):
-    """
-::
-
-            2 bytes    2 bytes
-            -------------------
-    ACK   | 04    |   Block #  |
-            --------------------
-    """
-    def __init__(self):
-        TftpPacket.__init__(self)
-        self.opcode = 4
-        self.blocknumber = 0
-
-    def __str__(self):
-        return 'ACK packet: block %d' % self.blocknumber
-
-    def encode(self):
-        log.debug("encoding ACK: opcode = %d, block = %d",
-                     self.opcode, self.blocknumber)
-        self.buffer = struct.pack("!HH", self.opcode, self.blocknumber)
-        return self
-
-    def decode(self):
-        if len(self.buffer) > 4:
-            log.debug("detected TFTP ACK but request is too large, will truncate")
-            log.debug("buffer was: %s", repr(self.buffer))
-            self.buffer = self.buffer[0:4]
-        self.opcode, self.blocknumber = struct.unpack("!HH", self.buffer)
-        log.debug("decoded ACK packet: opcode = %d, block = %d",
-                     self.opcode, self.blocknumber)
-        return self
-
-class TftpPacketERR(TftpPacket):
-    """
-::
-
-            2 bytes  2 bytes        string    1 byte
-            ----------------------------------------
-    ERROR | 05    |  ErrorCode |   ErrMsg   |   0  |
-            ----------------------------------------
-
-    Error Codes
-
-    Value     Meaning
-
-    0         Not defined, see error message (if any).
-    1         File not found.
-    2         Access violation.
-    3         Disk full or allocation exceeded.
-    4         Illegal TFTP operation.
-    5         Unknown transfer ID.
-    6         File already exists.
-    7         No such user.
-    8         Failed to negotiate options
-    """
-    def __init__(self):
-        TftpPacket.__init__(self)
-        self.opcode = 5
-        self.errorcode = 0
-        # FIXME: We don't encode the errmsg...
-        self.errmsg = None
-        # FIXME - integrate in TftpErrors references?
-        self.errmsgs = {
-            1: "File not found",
-            2: "Access violation",
-            3: "Disk full or allocation exceeded",
-            4: "Illegal TFTP operation",
-            5: "Unknown transfer ID",
-            6: "File already exists",
-            7: "No such user",
-            8: "Failed to negotiate options"
-            }
-
-    def __str__(self):
-        s = 'ERR packet: errorcode = %d' % self.errorcode
-        s += '\n    msg = %s' % self.errmsgs.get(self.errorcode, '')
-        return s
-
-    def encode(self):
-        """Encode the DAT packet based on instance variables, populating
-        self.buffer, returning self."""
-        format = "!HH%dsx" % len(self.errmsgs[self.errorcode])
-        log.debug("encoding ERR packet with format %s", format)
-        self.buffer = struct.pack(format,
-                                  self.opcode,
-                                  self.errorcode,
-                                  self.errmsgs[self.errorcode])
-        return self
-
-    def decode(self):
-        "Decode self.buffer, populating instance variables and return self."
-        buflen = len(self.buffer)
-        tftpassert(buflen >= 4, "malformed ERR packet, too short")
-        log.debug("Decoding ERR packet, length %s bytes", buflen)
-        if buflen == 4:
-            log.debug("Allowing this affront to the RFC of a 4-byte packet")
-            format = "!HH"
-            log.debug("Decoding ERR packet with format: %s", format)
-            self.opcode, self.errorcode = struct.unpack(format,
-                                                        self.buffer)
-        else:
-            log.debug("Good ERR packet > 4 bytes")
-            format = "!HH%dsx" % (len(self.buffer) - 5)
-            log.debug("Decoding ERR packet with format: %s", format)
-            self.opcode, self.errorcode, self.errmsg = struct.unpack(format,
-                                                                     self.buffer)
-        log.error("ERR packet - errorcode: %d, message: %s"
-                     % (self.errorcode, self.errmsg))
-        return self
-
-class TftpPacketOACK(TftpPacket, TftpPacketWithOptions):
-    """
-::
-
-    +-------+---~~---+---+---~~---+---+---~~---+---+---~~---+---+
-    |  opc  |  opt1  | 0 | value1 | 0 |  optN  | 0 | valueN | 0 |
-    +-------+---~~---+---+---~~---+---+---~~---+---+---~~---+---+
-    """
-    def __init__(self):
-        TftpPacket.__init__(self)
-        TftpPacketWithOptions.__init__(self)
-        self.opcode = 6
-
-    def __str__(self):
-        return 'OACK packet:\n    options = %s' % self.options
-
-    def encode(self):
-        format = "!H" # opcode
-        options_list = []
-        log.debug("in TftpPacketOACK.encode")
-        for key in self.options:
-            log.debug("looping on option key %s", key)
-            log.debug("value is %s", self.options[key])
-            format += "%dsx" % len(key)
-            format += "%dsx" % len(self.options[key])
-            options_list.append(key)
-            options_list.append(self.options[key])
-        self.buffer = struct.pack(format, self.opcode, *options_list)
-        return self
-
-    def decode(self):
-        self.options = self.decode_options(self.buffer[2:])
-        return self
-
-    def match_options(self, options):
-        """This method takes a set of options, and tries to match them with
-        its own. It can accept some changes in those options from the server as
-        part of a negotiation. Changed or unchanged, it will return a dict of
-        the options so that the session can update itself to the negotiated
-        options."""
-        for name in self.options:
-            if options.has_key(name):
-                if name == 'blksize':
-                    # We can accept anything between the min and max values.
-                    size = self.options[name]
-                    if size >= MIN_BLKSIZE and size <= MAX_BLKSIZE:
-                        log.debug("negotiated blksize of %d bytes", size)
-                        options[blksize] = size
-                else:
-                    raise TftpException, "Unsupported option: %s" % name
-        return True
diff --git a/bin/tftpy/TftpServer.py b/bin/tftpy/TftpServer.py
deleted file mode 100644
index 12491a0..0000000
--- a/bin/tftpy/TftpServer.py
+++ /dev/null
@@ -1,232 +0,0 @@
-"""This module implements the TFTP Server functionality. Instantiate an
-instance of the server, and then run the listen() method to listen for client
-requests. Logging is performed via a standard logging object set in
-TftpShared."""
-
-import socket, os, time
-import select
-import threading
-from TftpShared import *
-from TftpPacketTypes import *
-from TftpPacketFactory import TftpPacketFactory
-from TftpContexts import TftpContextServer
-
-class TftpServer(TftpSession):
-    """This class implements a tftp server object. Run the listen() method to
-    listen for client requests.  It takes two optional arguments. tftproot is
-    the path to the tftproot directory to serve files from and/or write them
-    to. dyn_file_func is a callable that must return a file-like object to
-    read from during downloads. This permits the serving of dynamic
-    content."""
-
-    def __init__(self, tftproot='/tftpboot', dyn_file_func=None):
-        self.listenip = None
-        self.listenport = None
-        self.sock = None
-        # FIXME: What about multiple roots?
-        self.root = os.path.abspath(tftproot)
-        self.dyn_file_func = dyn_file_func
-        # A dict of sessions, where each session is keyed by a string like
-        # ip:tid for the remote end.
-        self.sessions = {}
-        # A threading event to help threads synchronize with the server
-        # is_running state.
-        self.is_running = threading.Event()
-
-        self.shutdown_gracefully = False
-        self.shutdown_immediately = False
-
-        if self.dyn_file_func:
-            if not callable(self.dyn_file_func):
-                raise TftpException, "A dyn_file_func supplied, but it is not callable."
-        elif os.path.exists(self.root):
-            log.debug("tftproot %s does exist", self.root)
-            if not os.path.isdir(self.root):
-                raise TftpException, "The tftproot must be a directory."
-            else:
-                log.debug("tftproot %s is a directory", self.root)
-                if os.access(self.root, os.R_OK):
-                    log.debug("tftproot %s is readable", self.root)
-                else:
-                    raise TftpException, "The tftproot must be readable"
-                if os.access(self.root, os.W_OK):
-                    log.debug("tftproot %s is writable", self.root)
-                else:
-                    log.warning("The tftproot %s is not writable" % self.root)
-        else:
-            raise TftpException, "The tftproot does not exist."
-
-    def listen(self,
-               listenip="",
-               listenport=DEF_TFTP_PORT,
-               timeout=SOCK_TIMEOUT):
-        """Start a server listening on the supplied interface and port. This
-        defaults to INADDR_ANY (all interfaces) and UDP port 69. You can also
-        supply a different socket timeout value, if desired."""
-        tftp_factory = TftpPacketFactory()
-
-        # Don't use new 2.5 ternary operator yet
-        # listenip = listenip if listenip else '0.0.0.0'
-        if not listenip: listenip = '0.0.0.0'
-        log.info("Server requested on ip %s, port %s"
-                % (listenip, listenport))
-        try:
-            # FIXME - sockets should be non-blocking
-            self.sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
-            self.sock.bind((listenip, listenport))
-            _, self.listenport = self.sock.getsockname()
-        except socket.error, err:
-            # Reraise it for now.
-            raise
-
-        self.is_running.set()
-
-        log.info("Starting receive loop...")
-        while True:
-            log.debug("shutdown_immediately is %s", self.shutdown_immediately)
-            log.debug("shutdown_gracefully is %s", self.shutdown_gracefully)
-            if self.shutdown_immediately:
-                log.warn("Shutting down now. Session count: %d" % len(self.sessions))
-                self.sock.close()
-                for key in self.sessions:
-                    self.sessions[key].end()
-                self.sessions = []
-                break
-
-            elif self.shutdown_gracefully:
-                if not self.sessions:
-                    log.warn("In graceful shutdown mode and all sessions complete.")
-                    self.sock.close()
-                    break
-
-            # Build the inputlist array of sockets to select() on.
-            inputlist = []
-            inputlist.append(self.sock)
-            for key in self.sessions:
-                inputlist.append(self.sessions[key].sock)
-
-            # Block until some socket has input on it.
-            log.debug("Performing select on this inputlist: %s", inputlist)
-            readyinput, readyoutput, readyspecial = select.select(inputlist,
-                                                                  [],
-                                                                  [],
-                                                                  SOCK_TIMEOUT)
-
-            deletion_list = []
-
-            # Handle the available data, if any. Maybe we timed-out.
-            for readysock in readyinput:
-                # Is the traffic on the main server socket? ie. new session?
-                if readysock == self.sock:
-                    log.debug("Data ready on our main socket")
-                    buffer, (raddress, rport) = self.sock.recvfrom(MAX_BLKSIZE)
-
-                    log.debug("Read %d bytes", len(buffer))
-
-                    if self.shutdown_gracefully:
-                        log.warn("Discarding data on main port, in graceful shutdown mode")
-                        continue
-
-                    # Forge a session key based on the client's IP and port,
-                    # which should safely work through NAT.
-                    key = "%s:%s" % (raddress, rport)
-
-                    if not self.sessions.has_key(key):
-                        log.debug("Creating new server context for "
-                                     "session key = %s", key)
-                        self.sessions[key] = TftpContextServer(raddress,
-                                                               rport,
-                                                               timeout,
-                                                               self.root,
-                                                               self.dyn_file_func)
-                        try:
-                            self.sessions[key].start(buffer)
-                        except TftpException, err:
-                            deletion_list.append(key)
-                            log.error("Fatal exception thrown from "
-                                      "session %s: %s" % (key, str(err)))
-                    else:
-                        log.warn("received traffic on main socket for "
-                                 "existing session??")
-                    log.info("Currently handling these sessions:")
-                    for session_key, session in self.sessions.items():
-                        log.info("    %s" % session)
-
-                else:
-                    # Must find the owner of this traffic.
-                    for key in self.sessions:
-                        if readysock == self.sessions[key].sock:
-                            log.info("Matched input to session key %s"
-                                % key)
-                            try:
-                                self.sessions[key].cycle()
-                                if self.sessions[key].state == None:
-                                    log.info("Successful transfer.")
-                                    deletion_list.append(key)
-                            except TftpException, err:
-                                deletion_list.append(key)
-                                log.error("Fatal exception thrown from "
-                                          "session %s: %s"
-                                          % (key, str(err)))
-                            # Break out of for loop since we found the correct
-                            # session.
-                            break
-
-                    else:
-                        log.error("Can't find the owner for this packet. "
-                                  "Discarding.")
-
-            log.debug("Looping on all sessions to check for timeouts")
-            now = time.time()
-            for key in self.sessions:
-                try:
-                    self.sessions[key].checkTimeout(now)
-                except TftpTimeout, err:
-                    log.error(str(err))
-                    self.sessions[key].retry_count += 1
-                    if self.sessions[key].retry_count >= TIMEOUT_RETRIES:
-                        log.debug("hit max retries on %s, giving up",
-                            self.sessions[key])
-                        deletion_list.append(key)
-                    else:
-                        log.debug("resending on session %s", self.sessions[key])
-                        self.sessions[key].state.resendLast()
-
-            log.debug("Iterating deletion list.")
-            for key in deletion_list:
-                log.info('')
-                log.info("Session %s complete" % key)
-                if self.sessions.has_key(key):
-                    log.debug("Gathering up metrics from session before deleting")
-                    self.sessions[key].end()
-                    metrics = self.sessions[key].metrics
-                    if metrics.duration == 0:
-                        log.info("Duration too short, rate undetermined")
-                    else:
-                        log.info("Transferred %d bytes in %.2f seconds"
-                            % (metrics.bytes, metrics.duration))
-                        log.info("Average rate: %.2f kbps" % metrics.kbps)
-                    log.info("%.2f bytes in resent data" % metrics.resent_bytes)
-                    log.info("%d duplicate packets" % metrics.dupcount)
-                    log.debug("Deleting session %s", key)
-                    del self.sessions[key]
-                    log.debug("Session list is now %s", self.sessions)
-                else:
-                    log.warn("Strange, session %s is not on the deletion list"
-                        % key)
-
-        self.is_running.clear()
-
-        log.debug("server returning from while loop")
-        self.shutdown_gracefully = self.shutdown_immediately = False
-
-    def stop(self, now=False):
-        """Stop the server gracefully. Do not take any new transfers,
-        but complete the existing ones. If force is True, drop everything
-        and stop. Note, immediately will not interrupt the select loop, it
-        will happen when the server returns on ready data, or a timeout.
-        ie. SOCK_TIMEOUT"""
-        if now:
-            self.shutdown_immediately = True
-        else:
-            self.shutdown_gracefully = True
diff --git a/bin/tftpy/TftpShared.py b/bin/tftpy/TftpShared.py
deleted file mode 100644
index d09d8bd..0000000
--- a/bin/tftpy/TftpShared.py
+++ /dev/null
@@ -1,59 +0,0 @@
-"""This module holds all objects shared by all other modules in tftpy."""
-
-import logging
-
-LOG_LEVEL = logging.NOTSET
-MIN_BLKSIZE = 8
-DEF_BLKSIZE = 512
-MAX_BLKSIZE = 65536
-SOCK_TIMEOUT = 5
-MAX_DUPS = 20
-TIMEOUT_RETRIES = 5
-DEF_TFTP_PORT = 69
-
-# A hook for deliberately introducing delay in testing.
-DELAY_BLOCK = 0
-
-# Initialize the logger.
-logging.basicConfig()
-# The logger used by this library. Feel free to clobber it with your own, if you like, as
-# long as it conforms to Python's logging.
-log = logging.getLogger('tftpy')
-
-def tftpassert(condition, msg):
-    """This function is a simple utility that will check the condition
-    passed for a false state. If it finds one, it throws a TftpException
-    with the message passed. This just makes the code throughout cleaner
-    by refactoring."""
-    if not condition:
-        raise TftpException, msg
-
-def setLogLevel(level):
-    """This function is a utility function for setting the internal log level.
-    The log level defaults to logging.NOTSET, so unwanted output to stdout is
-    not created."""
-    global log
-    log.setLevel(level)
-
-class TftpErrors(object):
-    """This class is a convenience for defining the common tftp error codes,
-    and making them more readable in the code."""
-    NotDefined = 0
-    FileNotFound = 1
-    AccessViolation = 2
-    DiskFull = 3
-    IllegalTftpOp = 4
-    UnknownTID = 5
-    FileAlreadyExists = 6
-    NoSuchUser = 7
-    FailedNegotiation = 8
-
-class TftpException(Exception):
-    """This class is the parent class of all exceptions regarding the handling
-    of the TFTP protocol."""
-    pass
-
-class TftpTimeout(TftpException):
-    """This class represents a timeout error waiting for a response from the
-    other end."""
-    pass
diff --git a/bin/tftpy/TftpStates.py b/bin/tftpy/TftpStates.py
deleted file mode 100644
index 1ea6c31..0000000
--- a/bin/tftpy/TftpStates.py
+++ /dev/null
@@ -1,582 +0,0 @@
-"""This module implements all state handling during uploads and downloads, the
-main interface to which being the TftpState base class. 
-
-The concept is simple. Each context object represents a single upload or
-download, and the state object in the context object represents the current
-state of that transfer. The state object has a handle() method that expects
-the next packet in the transfer, and returns a state object until the transfer
-is complete, at which point it returns None. That is, unless there is a fatal
-error, in which case a TftpException is returned instead."""
-
-from TftpShared import *
-from TftpPacketTypes import *
-import os
-
-###############################################################################
-# State classes
-###############################################################################
-
-class TftpState(object):
-    """The base class for the states."""
-
-    def __init__(self, context):
-        """Constructor for setting up common instance variables. The involved
-        file object is required, since in tftp there's always a file
-        involved."""
-        self.context = context
-
-    def handle(self, pkt, raddress, rport):
-        """An abstract method for handling a packet. It is expected to return
-        a TftpState object, either itself or a new state."""
-        raise NotImplementedError, "Abstract method"
-
-    def handleOACK(self, pkt):
-        """This method handles an OACK from the server, syncing any accepted
-        options."""
-        if pkt.options.keys() > 0:
-            if pkt.match_options(self.context.options):
-                log.info("Successful negotiation of options")
-                # Set options to OACK options
-                self.context.options = pkt.options
-                for key in self.context.options:
-                    log.info("    %s = %s" % (key, self.context.options[key]))
-            else:
-                log.error("Failed to negotiate options")
-                raise TftpException, "Failed to negotiate options"
-        else:
-            raise TftpException, "No options found in OACK"
-
-    def returnSupportedOptions(self, options):
-        """This method takes a requested options list from a client, and
-        returns the ones that are supported."""
-        # We support the options blksize and tsize right now.
-        # FIXME - put this somewhere else?
-        accepted_options = {}
-        for option in options:
-            if option == 'blksize':
-                # Make sure it's valid.
-                if int(options[option]) > MAX_BLKSIZE:
-                    log.info("Client requested blksize greater than %d "
-                             "setting to maximum" % MAX_BLKSIZE)
-                    accepted_options[option] = MAX_BLKSIZE
-                elif int(options[option]) < MIN_BLKSIZE:
-                    log.info("Client requested blksize less than %d "
-                             "setting to minimum" % MIN_BLKSIZE)
-                    accepted_options[option] = MIN_BLKSIZE
-                else:
-                    accepted_options[option] = options[option]
-            elif option == 'tsize':
-                log.debug("tsize option is set")
-                accepted_options['tsize'] = 1
-            else:
-                log.info("Dropping unsupported option '%s'" % option)
-        log.debug("Returning these accepted options: %s", accepted_options)
-        return accepted_options
-
-    def sendDAT(self):
-        """This method sends the next DAT packet based on the data in the
-        context. It returns a boolean indicating whether the transfer is
-        finished."""
-        finished = False
-        blocknumber = self.context.next_block
-        # Test hook
-        if DELAY_BLOCK and DELAY_BLOCK == blocknumber:
-            import time
-            log.debug("Deliberately delaying 10 seconds...")
-            time.sleep(10)
-        dat = None
-        blksize = self.context.getBlocksize()
-        buffer = self.context.fileobj.read(blksize)
-        log.debug("Read %d bytes into buffer", len(buffer))
-        if len(buffer) < blksize:
-            log.info("Reached EOF on file %s"
-                % self.context.file_to_transfer)
-            finished = True
-        dat = TftpPacketDAT()
-        dat.data = buffer
-        dat.blocknumber = blocknumber
-        self.context.metrics.bytes += len(dat.data)
-        log.debug("Sending DAT packet %d", dat.blocknumber)
-        self.context.sock.sendto(dat.encode().buffer,
-                                 (self.context.host, self.context.tidport))
-        if self.context.packethook:
-            self.context.packethook(dat)
-        self.context.last_pkt = dat
-        return finished
-
-    def sendACK(self, blocknumber=None):
-        """This method sends an ack packet to the block number specified. If
-        none is specified, it defaults to the next_block property in the
-        parent context."""
-        log.debug("In sendACK, passed blocknumber is %s", blocknumber)
-        if blocknumber is None:
-            blocknumber = self.context.next_block
-        log.info("Sending ack to block %d" % blocknumber)
-        ackpkt = TftpPacketACK()
-        ackpkt.blocknumber = blocknumber
-        self.context.sock.sendto(ackpkt.encode().buffer,
-                                 (self.context.host,
-                                  self.context.tidport))
-        self.context.last_pkt = ackpkt
-
-    def sendError(self, errorcode):
-        """This method uses the socket passed, and uses the errorcode to
-        compose and send an error packet."""
-        log.debug("In sendError, being asked to send error %d", errorcode)
-        errpkt = TftpPacketERR()
-        errpkt.errorcode = errorcode
-        self.context.sock.sendto(errpkt.encode().buffer,
-                                 (self.context.host,
-                                  self.context.tidport))
-        self.context.last_pkt = errpkt
-
-    def sendOACK(self):
-        """This method sends an OACK packet with the options from the current
-        context."""
-        log.debug("In sendOACK with options %s", self.context.options)
-        pkt = TftpPacketOACK()
-        pkt.options = self.context.options
-        self.context.sock.sendto(pkt.encode().buffer,
-                                 (self.context.host,
-                                  self.context.tidport))
-        self.context.last_pkt = pkt
-
-    def resendLast(self):
-        "Resend the last sent packet due to a timeout."
-        log.warn("Resending packet %s on sessions %s"
-            % (self.context.last_pkt, self))
-        self.context.metrics.resent_bytes += len(self.context.last_pkt.buffer)
-        self.context.metrics.add_dup(self.context.last_pkt)
-        sendto_port = self.context.tidport
-        if not sendto_port:
-            # If the tidport wasn't set, then the remote end hasn't even
-            # started talking to us yet. That's not good. Maybe it's not
-            # there.
-            sendto_port = self.context.port
-        self.context.sock.sendto(self.context.last_pkt.encode().buffer,
-                                 (self.context.host, sendto_port))
-        if self.context.packethook:
-            self.context.packethook(self.context.last_pkt)
-
-    def handleDat(self, pkt):
-        """This method handles a DAT packet during a client download, or a
-        server upload."""
-        log.info("Handling DAT packet - block %d" % pkt.blocknumber)
-        log.debug("Expecting block %s", self.context.next_block)
-        if pkt.blocknumber == self.context.next_block:
-            log.debug("Good, received block %d in sequence", pkt.blocknumber)
-
-            self.sendACK()
-            self.context.next_block += 1
-
-            log.debug("Writing %d bytes to output file", len(pkt.data))
-            self.context.fileobj.write(pkt.data)
-            self.context.metrics.bytes += len(pkt.data)
-            # Check for end-of-file, any less than full data packet.
-            if len(pkt.data) < self.context.getBlocksize():
-                log.info("End of file detected")
-                return None
-
-        elif pkt.blocknumber < self.context.next_block:
-            if pkt.blocknumber == 0:
-                log.warn("There is no block zero!")
-                self.sendError(TftpErrors.IllegalTftpOp)
-                raise TftpException, "There is no block zero!"
-            log.warn("Dropping duplicate block %d" % pkt.blocknumber)
-            self.context.metrics.add_dup(pkt)
-            log.debug("ACKing block %d again, just in case", pkt.blocknumber)
-            self.sendACK(pkt.blocknumber)
-
-        else:
-            # FIXME: should we be more tolerant and just discard instead?
-            msg = "Whoa! Received future block %d but expected %d" \
-                % (pkt.blocknumber, self.context.next_block)
-            log.error(msg)
-            raise TftpException, msg
-
-        # Default is to ack
-        return TftpStateExpectDAT(self.context)
-
-class TftpServerState(TftpState):
-    """The base class for server states."""
-
-    def __init__(self, context):
-        TftpState.__init__(self, context)
-
-        # This variable is used to store the absolute path to the file being
-        # managed.
-        self.full_path = None
-
-    def serverInitial(self, pkt, raddress, rport):
-        """This method performs initial setup for a server context transfer,
-        put here to refactor code out of the TftpStateServerRecvRRQ and
-        TftpStateServerRecvWRQ classes, since their initial setup is
-        identical. The method returns a boolean, sendoack, to indicate whether
-        it is required to send an OACK to the client."""
-        options = pkt.options
-        sendoack = False
-        if not self.context.tidport:
-            self.context.tidport = rport
-            log.info("Setting tidport to %s" % rport)
-
-        log.debug("Setting default options, blksize")
-        self.context.options = { 'blksize': DEF_BLKSIZE }
-
-        if options:
-            log.debug("Options requested: %s", options)
-            supported_options = self.returnSupportedOptions(options)
-            self.context.options.update(supported_options)
-            sendoack = True
-
-        # FIXME - only octet mode is supported at this time.
-        if pkt.mode != 'octet':
-            self.sendError(TftpErrors.IllegalTftpOp)
-            raise TftpException, \
-                "Only octet transfers are supported at this time."
-
-        # test host/port of client end
-        if self.context.host != raddress or self.context.port != rport:
-            self.sendError(TftpErrors.UnknownTID)
-            log.error("Expected traffic from %s:%s but received it "
-                            "from %s:%s instead."
-                            % (self.context.host,
-                               self.context.port,
-                               raddress,
-                               rport))
-            # FIXME: increment an error count?
-            # Return same state, we're still waiting for valid traffic.
-            return self
-
-        log.debug("Requested filename is %s", pkt.filename)
-
-        # Build the filename on this server and ensure it is contained
-        # in the specified root directory.
-        #
-        # Filenames that begin with server root are accepted. It's
-        # assumed the client and server are tightly connected and this
-        # provides backwards compatibility.
-        #
-        # Filenames otherwise are relative to the server root. If they
-        # begin with a '/' strip it off as otherwise os.path.join will
-        # treat it as absolute (regardless of whether it is ntpath or
-        # posixpath module
-        if pkt.filename.startswith(self.context.root):
-            full_path = pkt.filename
-        else:
-            full_path = os.path.join(
-                self.context.root, pkt.filename.lstrip('/'))
-
-        # Use abspath to eliminate any remaining relative elements
-        # (e.g. '..') and ensure that is still within the server's
-        # root directory
-        self.full_path = os.path.abspath(full_path)
-        log.debug("full_path is %s", full_path)
-        if self.full_path.startswith(self.context.root):
-            log.info("requested file is in the server root - good")
-        else:
-            log.warn("requested file is not within the server root - bad")
-            self.sendError(TftpErrors.IllegalTftpOp)
-            raise TftpException, "bad file path"
-
-        self.context.file_to_transfer = pkt.filename
-
-        return sendoack
-
-
-class TftpStateServerRecvRRQ(TftpServerState):
-    """This class represents the state of the TFTP server when it has just
-    received an RRQ packet."""
-    def handle(self, pkt, raddress, rport):
-        "Handle an initial RRQ packet as a server."
-        log.debug("In TftpStateServerRecvRRQ.handle")
-        sendoack = self.serverInitial(pkt, raddress, rport)
-        path = self.full_path
-        log.info("Opening file %s for reading" % path)
-        if os.path.exists(path):
-            # Note: Open in binary mode for win32 portability, since win32
-            # blows.
-            self.context.fileobj = open(path, "rb")
-        elif self.context.dyn_file_func:
-            log.debug("No such file %s but using dyn_file_func", path)
-            self.context.fileobj = \
-                self.context.dyn_file_func(self.context.file_to_transfer)
-
-            if self.context.fileobj is None:
-                log.debug("dyn_file_func returned 'None', treating as "
-                          "FileNotFound")
-                self.sendError(TftpErrors.FileNotFound)
-                raise TftpException, "File not found: %s" % path
-        else:
-            self.sendError(TftpErrors.FileNotFound)
-            raise TftpException, "File not found: %s" % path
-
-        # Options negotiation.
-        if sendoack:
-            # Note, next_block is 0 here since that's the proper
-            # acknowledgement to an OACK.
-            # FIXME: perhaps we do need a TftpStateExpectOACK class...
-            self.sendOACK()
-            # Note, self.context.next_block is already 0.
-        else:
-            self.context.next_block = 1
-            log.debug("No requested options, starting send...")
-            self.context.pending_complete = self.sendDAT()
-        # Note, we expect an ack regardless of whether we sent a DAT or an
-        # OACK.
-        return TftpStateExpectACK(self.context)
-
-        # Note, we don't have to check any other states in this method, that's
-        # up to the caller.
-
-class TftpStateServerRecvWRQ(TftpServerState):
-    """This class represents the state of the TFTP server when it has just
-    received a WRQ packet."""
-    def make_subdirs(self):
-        """The purpose of this method is to, if necessary, create all of the
-        subdirectories leading up to the file to the written."""
-        # Pull off everything below the root.
-        subpath = self.full_path[len(self.context.root):]
-        log.debug("make_subdirs: subpath is %s", subpath)
-        # Split on directory separators, but drop the last one, as it should
-        # be the filename.
-        dirs = subpath.split(os.sep)[:-1]
-        log.debug("dirs is %s", dirs)
-        current = self.context.root
-        for dir in dirs:
-            if dir:
-                current = os.path.join(current, dir)
-                if os.path.isdir(current):
-                    log.debug("%s is already an existing directory", current)
-                else:
-                    os.mkdir(current, 0700)
-
-    def handle(self, pkt, raddress, rport):
-        "Handle an initial WRQ packet as a server."
-        log.debug("In TftpStateServerRecvWRQ.handle")
-        sendoack = self.serverInitial(pkt, raddress, rport)
-        path = self.full_path
-        log.info("Opening file %s for writing" % path)
-        if os.path.exists(path):
-            # FIXME: correct behavior?
-            log.warn("File %s exists already, overwriting..." % self.context.file_to_transfer)
-        # FIXME: I think we should upload to a temp file and not overwrite the
-        # existing file until the file is successfully uploaded.
-        self.make_subdirs()
-        self.context.fileobj = open(path, "wb")
-
-        # Options negotiation.
-        if sendoack:
-            log.debug("Sending OACK to client")
-            self.sendOACK()
-        else:
-            log.debug("No requested options, expecting transfer to begin...")
-            self.sendACK()
-        # Whether we're sending an oack or not, we're expecting a DAT for
-        # block 1
-        self.context.next_block = 1
-        # We may have sent an OACK, but we're expecting a DAT as the response
-        # to either the OACK or an ACK, so lets unconditionally use the
-        # TftpStateExpectDAT state.
-        return TftpStateExpectDAT(self.context)
-
-        # Note, we don't have to check any other states in this method, that's
-        # up to the caller.
-
-class TftpStateServerStart(TftpState):
-    """The start state for the server. This is a transitory state since at
-    this point we don't know if we're handling an upload or a download. We
-    will commit to one of them once we interpret the initial packet."""
-    def handle(self, pkt, raddress, rport):
-        """Handle a packet we just received."""
-        log.debug("In TftpStateServerStart.handle")
-        if isinstance(pkt, TftpPacketRRQ):
-            log.debug("Handling an RRQ packet")
-            return TftpStateServerRecvRRQ(self.context).handle(pkt,
-                                                               raddress,
-                                                               rport)
-        elif isinstance(pkt, TftpPacketWRQ):
-            log.debug("Handling a WRQ packet")
-            return TftpStateServerRecvWRQ(self.context).handle(pkt,
-                                                               raddress,
-                                                               rport)
-        else:
-            self.sendError(TftpErrors.IllegalTftpOp)
-            raise TftpException, \
-                "Invalid packet to begin up/download: %s" % pkt
-
-class TftpStateExpectACK(TftpState):
-    """This class represents the state of the transfer when a DAT was just
-    sent, and we are waiting for an ACK from the server. This class is the
-    same one used by the client during the upload, and the server during the
-    download."""
-    def handle(self, pkt, raddress, rport):
-        "Handle a packet, hopefully an ACK since we just sent a DAT."
-        if isinstance(pkt, TftpPacketACK):
-            log.info("Received ACK for packet %d" % pkt.blocknumber)
-            # Is this an ack to the one we just sent?
-            if self.context.next_block == pkt.blocknumber:
-                if self.context.pending_complete:
-                    log.info("Received ACK to final DAT, we're done.")
-                    return None
-                else:
-                    log.debug("Good ACK, sending next DAT")
-                    self.context.next_block += 1
-                    log.debug("Incremented next_block to %d",
-                        self.context.next_block)
-                    self.context.pending_complete = self.sendDAT()
-
-            elif pkt.blocknumber < self.context.next_block:
-                log.warn("Received duplicate ACK for block %d"
-                    % pkt.blocknumber)
-                self.context.metrics.add_dup(pkt)
-
-            else:
-                log.warn("Oooh, time warp. Received ACK to packet we "
-                         "didn't send yet. Discarding.")
-                self.context.metrics.errors += 1
-            return self
-        elif isinstance(pkt, TftpPacketERR):
-            log.error("Received ERR packet from peer: %s" % str(pkt))
-            raise TftpException, \
-                "Received ERR packet from peer: %s" % str(pkt)
-        else:
-            log.warn("Discarding unsupported packet: %s" % str(pkt))
-            return self
-
-class TftpStateExpectDAT(TftpState):
-    """Just sent an ACK packet. Waiting for DAT."""
-    def handle(self, pkt, raddress, rport):
-        """Handle the packet in response to an ACK, which should be a DAT."""
-        if isinstance(pkt, TftpPacketDAT):
-            return self.handleDat(pkt)
-
-        # Every other packet type is a problem.
-        elif isinstance(pkt, TftpPacketACK):
-            # Umm, we ACK, you don't.
-            self.sendError(TftpErrors.IllegalTftpOp)
-            raise TftpException, "Received ACK from peer when expecting DAT"
-
-        elif isinstance(pkt, TftpPacketWRQ):
-            self.sendError(TftpErrors.IllegalTftpOp)
-            raise TftpException, "Received WRQ from peer when expecting DAT"
-
-        elif isinstance(pkt, TftpPacketERR):
-            self.sendError(TftpErrors.IllegalTftpOp)
-            raise TftpException, "Received ERR from peer: " + str(pkt)
-
-        else:
-            self.sendError(TftpErrors.IllegalTftpOp)
-            raise TftpException, "Received unknown packet type from peer: " + str(pkt)
-
-class TftpStateSentWRQ(TftpState):
-    """Just sent an WRQ packet for an upload."""
-    def handle(self, pkt, raddress, rport):
-        """Handle a packet we just received."""
-        if not self.context.tidport:
-            self.context.tidport = rport
-            log.debug("Set remote port for session to %s", rport)
-
-        # If we're going to successfully transfer the file, then we should see
-        # either an OACK for accepted options, or an ACK to ignore options.
-        if isinstance(pkt, TftpPacketOACK):
-            log.info("Received OACK from server")
-            try:
-                self.handleOACK(pkt)
-            except TftpException:
-                log.error("Failed to negotiate options")
-                self.sendError(TftpErrors.FailedNegotiation)
-                raise
-            else:
-                log.debug("Sending first DAT packet")
-                self.context.pending_complete = self.sendDAT()
-                log.debug("Changing state to TftpStateExpectACK")
-                return TftpStateExpectACK(self.context)
-
-        elif isinstance(pkt, TftpPacketACK):
-            log.info("Received ACK from server")
-            log.debug("Apparently the server ignored our options")
-            # The block number should be zero.
-            if pkt.blocknumber == 0:
-                log.debug("Ack blocknumber is zero as expected")
-                log.debug("Sending first DAT packet")
-                self.context.pending_complete = self.sendDAT()
-                log.debug("Changing state to TftpStateExpectACK")
-                return TftpStateExpectACK(self.context)
-            else:
-                log.warn("Discarding ACK to block %s" % pkt.blocknumber)
-                log.debug("Still waiting for valid response from server")
-                return self
-
-        elif isinstance(pkt, TftpPacketERR):
-            self.sendError(TftpErrors.IllegalTftpOp)
-            raise TftpException, "Received ERR from server: " + str(pkt)
-
-        elif isinstance(pkt, TftpPacketRRQ):
-            self.sendError(TftpErrors.IllegalTftpOp)
-            raise TftpException, "Received RRQ from server while in upload"
-
-        elif isinstance(pkt, TftpPacketDAT):
-            self.sendError(TftpErrors.IllegalTftpOp)
-            raise TftpException, "Received DAT from server while in upload"
-
-        else:
-            self.sendError(TftpErrors.IllegalTftpOp)
-            raise TftpException, "Received unknown packet type from server: " + str(pkt)
-
-        # By default, no state change.
-        return self
-
-class TftpStateSentRRQ(TftpState):
-    """Just sent an RRQ packet."""
-    def handle(self, pkt, raddress, rport):
-        """Handle the packet in response to an RRQ to the server."""
-        if not self.context.tidport:
-            self.context.tidport = rport
-            log.info("Set remote port for session to %s" % rport)
-
-        # Now check the packet type and dispatch it properly.
-        if isinstance(pkt, TftpPacketOACK):
-            log.info("Received OACK from server")
-            try:
-                self.handleOACK(pkt)
-            except TftpException, err:
-                log.error("Failed to negotiate options: %s" % str(err))
-                self.sendError(TftpErrors.FailedNegotiation)
-                raise
-            else:
-                log.debug("Sending ACK to OACK")
-
-                self.sendACK(blocknumber=0)
-
-                log.debug("Changing state to TftpStateExpectDAT")
-                return TftpStateExpectDAT(self.context)
-
-        elif isinstance(pkt, TftpPacketDAT):
-            # If there are any options set, then the server didn't honour any
-            # of them.
-            log.info("Received DAT from server")
-            if self.context.options:
-                log.info("Server ignored options, falling back to defaults")
-                self.context.options = { 'blksize': DEF_BLKSIZE }
-            return self.handleDat(pkt)
-
-        # Every other packet type is a problem.
-        elif isinstance(pkt, TftpPacketACK):
-            # Umm, we ACK, the server doesn't.
-            self.sendError(TftpErrors.IllegalTftpOp)
-            raise TftpException, "Received ACK from server while in download"
-
-        elif isinstance(pkt, TftpPacketWRQ):
-            self.sendError(TftpErrors.IllegalTftpOp)
-            raise TftpException, "Received WRQ from server while in download"
-
-        elif isinstance(pkt, TftpPacketERR):
-            self.sendError(TftpErrors.IllegalTftpOp)
-            raise TftpException, "Received ERR from server: " + str(pkt)
-
-        else:
-            self.sendError(TftpErrors.IllegalTftpOp)
-            raise TftpException, "Received unknown packet type from server: " + str(pkt)
-
-        # By default, no state change.
-        return self
diff --git a/bin/tftpy/__init__.py b/bin/tftpy/__init__.py
deleted file mode 100644
index fba9a9f..0000000
--- a/bin/tftpy/__init__.py
+++ /dev/null
@@ -1,25 +0,0 @@
-"""
-This library implements the tftp protocol, based on rfc 1350.
-http://www.faqs.org/rfcs/rfc1350.html
-At the moment it implements only a client class, but will include a server,
-with support for variable block sizes.
-
-As a client of tftpy, this is the only module that you should need to import
-directly. The TftpClient and TftpServer classes can be reached through it.
-"""
-
-import sys
-
-# Make sure that this is at least Python 2.3
-required_version = (2, 3)
-if sys.version_info < required_version:
-    raise ImportError, "Requires at least Python 2.3"
-
-from tftpy.TftpShared import *
-from tftpy.TftpPacketTypes import *
-from tftpy.TftpPacketFactory import *
-from tftpy.TftpClient import *
-from tftpy.TftpServer import *
-from tftpy.TftpContexts import *
-from tftpy.TftpStates import *
-
