diff --git a/.gitignore b/.gitignore
index 0d20b6487c61e7d1bde93acf4a14b7a89083a16d..b4bb318230c07dd1695c619c8eb4b14adc5e2df9 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1 +1,2 @@
 *.pyc
+virtualcoke.log
diff --git a/virtualcoke.py b/virtualcoke.py
index c8b3a64fb53fdcea3cf85451cd856d66e29de0ba..bbd49c377da7f68f8dc84b4db9bfdde41d0e39d4 100755
--- a/virtualcoke.py
+++ b/virtualcoke.py
@@ -37,7 +37,7 @@ import string
 ## configure the service logging
 ##---------------------------------------------------------------------------# 
 import logging
-logging.basicConfig()
+logging.basicConfig(filename="virtualcoke.log", filemode="a+")
 log = logging.getLogger()
 log.setLevel(logging.DEBUG)
 
@@ -212,8 +212,6 @@ class VirtualCokeApp(npyscreen.StandardApp):
 	# initialise virtual coke machine
 
 	self.F = self.addForm("MAIN", VirtualCoke, name="Virtual Coke")
-	
-	# socket code was here
 
 	self.sent=""
 	self.received="in onStart"
@@ -234,6 +232,9 @@ class VirtualCokeApp(npyscreen.StandardApp):
 
 
     # Callbacks
+    def get_slot_status(self):
+	return self.F.get_slot_status()
+
     def when_empty_toggled(self, *args, **keywords):
 # See 
 #  https://code.google.com/p/npyscreen/source/detail?r=9768a97fd80ed1e7b3e670f312564c19b1adfef8#
@@ -299,11 +300,11 @@ class CallbackDataBlock(ModbusSparseDataBlock):
     processing.
     '''
 
-    def __init__(self, values):
+    def __init__(self, values, app=None):
 	self.toggle = 1
+	self.app = app
 	super(CallbackDataBlock, self).__init__(values)
 
-
     def getValues(self, address, count=1):
         ''' Returns the requested values from the datastore
 
@@ -311,14 +312,33 @@ class CallbackDataBlock(ModbusSparseDataBlock):
         :param count: The number of values to retrieve
         :returns: The requested values from a:a+c
         '''	
-	log.debug("CBD getValues %d:%d" % (address, count))
+	ciCoke_DropBitBase = 1024 + 1;
+	ciCoke_StatusBitBase = 16 + 1;
 
-	if address < 1024:
-		return [1]
+        # get status of slots from form
+	
+        slots = self.app.get_slot_status()
+
+	#log.debug("CBD getValues %d:%d" % (address, count))
+
+        # check if a status read or a drop read
+	if address < ciCoke_DropBitBase:
+		log.debug("Status Read getValues %d:%d" % (address, count))
+                if address < ciCoke_StatusBitBase or \
+                        address >= ciCoke_StatusBitBase + len(slots):
+		        return [0]
+                # calculate slot
+                reading = address - ciCoke_StatusBitBase
+		# invert 
+		status = not slots[reading]
+
+                return [status]
+
+	log.debug("Dispense Read getValues %d:%d" % (address, count))
 
 	self.toggle = self.toggle+1
 
-	log.debug("CBD getValues toggle %d" % (self.toggle))
+	#log.debug("CBD getValues toggle %d" % (self.toggle))
 	if self.toggle % 3 == 0:
 		return [1]
 	
@@ -333,21 +353,22 @@ class CallbackDataBlock(ModbusSparseDataBlock):
 	
 
 
-store = ModbusSlaveContext(
-    #di = ModbusSequentialDataBlock(0, [17]*100),
-    #co = ModbusSequentialDataBlock(0, [17]*100),
-    #hr = ModbusSequentialDataBlock(0, [17]*100),
-    #ir = ModbusSequentialDataBlock(0, [17]*100))
-    di = CallbackDataBlock([0]*100),
-    co = CallbackDataBlock([0]*65536),
-    hr = CallbackDataBlock([0]*100),
-    ir = CallbackDataBlock([0]*100))
+def modbus_setup(app):
+	store = ModbusSlaveContext(
+	    di = CallbackDataBlock([0]*100, app=app),
+	    co = CallbackDataBlock([0]*65536, app=app), 
+	    hr = CallbackDataBlock([0]*100, app),
+	    ir = CallbackDataBlock([0]*100, app))
+
+	context = ModbusServerContext(slaves=store, single=True)
 
-context = ModbusServerContext(slaves=store, single=True)
+	return context
 
 
 if __name__ == "__main__":
     App = VirtualCokeApp()
+    context = modbus_setup(App)
+
     reactor.registerNpyscreenApp(App)
     StartModbusAsyncServer(context)
     reactor.run()