diff --git a/VendServer/LATClient.py b/VendServer/LATClient.py
deleted file mode 100644
index 638d20b05bc1f3a136a93f2c5fd415f964c1048e..0000000000000000000000000000000000000000
--- a/VendServer/LATClient.py
+++ /dev/null
@@ -1,157 +0,0 @@
-from socket import *
-from select import select
-from os import popen4
-from time import sleep
-import logging
-
-LATCP_SOCKET = '/var/run/latlogin'
-
-LAT_VERSION = '1.22'
-LAT_VERSION = '1.24' # for running on Mermaid. [DAA] 20071107
-LATCP_CMD_VERSION = 8
-LATCP_CMD_TERMINALSESSION = 26
-LATCP_CMD_ERRORMSG = 99
-
-class LATClientException(Exception): pass
-
-def read_for_a_bit(rfh):
-	message = ''
-	while 1:
-		r = select([rfh], [], [], 5.0)[0]
-		if r:
-			try:
-				ch = rfh.read(1)
-			except socket.error:
-				ch = ''
-			if ch == '':
-				break
-			message = message + ch
-		else:
-			break
-	logging.debug("Received message: ", repr(message))
-	return message
-
-def write_and_get_response(rfh, wfh, message, expect_echo=True):
-	logging.debug("Writing message:", repr(message))
-	wfh.write(message+'\r\n')
-	wfh.flush()
-	logging.debug("  --> Sent")
-	response = read_for_a_bit(rfh)
-	if response.find(message) == -1 and expect_echo:
-		raise LATClientException("Talking to DEC server, expected to find original message in echo but didn't")
-	return response
-
-class LATClient:
-	def __init__(self, service = None, node = None, port = None,
-		     localport = None, password = None, is_queued = False,
-		     server_name = '', connect_password='', priv_password=''):
-
-		self.server_name = server_name
-		self.connect_password = connect_password
-		self.priv_password = priv_password
-		
-		self.sock = socket(AF_UNIX, SOCK_STREAM, 0);
-		self.sock.connect(LATCP_SOCKET)
-		self.send_msg(LATCP_CMD_VERSION, LAT_VERSION+'\000')
-		(cmd, msg) = self.read_reply()
-		if service == None: service = ''
-		if node == None: node = ''
-		if port == None: port = ''
-		if localport == None: localport = ''
-		if password == None: password = ''
-		if is_queued == True:
-			is_queued = 1
-		else:
-			is_queued = 0
-		self.send_msg(LATCP_CMD_TERMINALSESSION, '%c%c%s%c%s%c%s%c%s%c%s' % \
-			(is_queued,
-			 len(service), service,
-			 len(node), node,
-			 len(port), port,
-			 len(localport), localport,
-			 len(password), password
-			 ))
-		(cmd, msg) = self.read_reply()
-		if ord(cmd) == LATCP_CMD_ERRORMSG:
-			raise LATClientException(msg)
-
-		self.rfh = self.sock.makefile('r')
-		self.wfh = self.sock.makefile('w')
-
-		r = select([self.rfh], [], [], 2.0)[0]
-		if r:
-			l = self.rfh.readline()
-			if l.find('Service in use') >= 0:
-				logging.warning("Service in use, apparently: restarting DEC server")
-				self.reboot_server()
-
-	def __del__(self):
-		try:
-			self.sock.close()
-			self.sock.shutdown(2)
-		except:
-			pass
-		del self.sock
-
-	def send_msg(self, cmd, msg):
-		self.sock.send('%c%c%c%s'%(cmd, len(msg)/256, len(msg)%256, msg))
-
-	def reboot_server(self):
-		self.sock.shutdown(2)
-		self.sock.close()
-		
-		logging.info('Logging into DEC server')
-		mopw, mopr = popen4('/usr/sbin/moprc '+self.server_name)
-		write_and_get_response(mopr, mopw, '')
-
-		logging.info('Sending password')
-		r = write_and_get_response(mopr, mopw, self.connect_password, False)
-		if r.find('Enter username> ') == -1:
-			logging.warning("Expected username prompt, got " + repr(r))
-			raise LATClientException('failed to reboot server')
-
-		logging.info('Sending username')
-		r = write_and_get_response(mopr, mopw, 'grim reaper')
-		if r.find('Local> ') == -1:
-			logging.warning("Expected DEC server prompt, got " + repr(r))
-			raise LATClientException('failed to reboot server')
-
-		logging.info('Requesting privileges')
-		r = write_and_get_response(mopr, mopw, 'set priv')
-		if r.find('Password> ') == -1:
-			logging.warning("Expected priv password prompt, got " + repr(r))
-			raise LATClientException('failed to reboot server')
-
-		logging.info('Sending password')
-		r = write_and_get_response(mopr, mopw, self.priv_password, False)
-		if r.find('Local> ') == -1:
-			logging.warning("Expected DEC server prompt, got " + repr(r))
-			raise LATClientException('failed to reboot server')
-
-		logging.info('Sending reboot request')
-		r = write_and_get_response(mopr, mopw, 'init del 0')
-		if r.find('Target does not respond') == -1:
-			logging.warning("Expected DEC server to die, got " + repr(r))
-			raise LATClientException('failed to reboot server')
-
-		logging.info('Closed connection to server')
-		mopr.close()
-		mopw.close()
-		logging.info("Waiting 10 seconds for DEC server to come back to life...")
-		sleep(10)
-		logging.info("Rightyo, back to vending!")
-		raise LATClientException('needed to reboot server')
-
-	def read_reply(self):
-		head = self.sock.recv(3)
-		if len(head) != 3:
-			raise LATClientException('Short LAT packet')
-		cmd = head[0]
-		length = ord(head[1])*256 + ord(head[2])
-		msg = self.sock.recv(length)
-		if cmd == LATCP_CMD_ERRORMSG:
-			raise LATClientException('Received LAT error: %s'%msg)
-		return (cmd, msg)
-	
-	def get_fh(self):
-		return (self.rfh, self.wfh)
diff --git a/VendServer/LDAPConnector.py b/VendServer/LDAPConnector.py
deleted file mode 100644
index 48050bfd7641db7d48f4d43c7ba167bfb2a7b791..0000000000000000000000000000000000000000
--- a/VendServer/LDAPConnector.py
+++ /dev/null
@@ -1,92 +0,0 @@
-#!/usr/bin/env python2.4
-
-import ldap
-import ldap.filter
-
-LDAP_TIMEOUT = 10
-
-def get_ldap_connection():
-        ldap.set_option(ldap.OPT_X_TLS_CACERTFILE, '/etc/ssl/UCC-CA.crt')
-        ldap.set_option(ldap.OPT_X_TLS,1)
-        ldap.set_option(ldap.OPT_X_TLS_ALLOW,1)
-        #ldap.set_option(ldap.OPT_DEBUG_LEVEL,255)
-        conn = ldap.initialize('ldaps://mussel.ucc.gu.uwa.edu.au/')
-        
-        binddn = 'cn=mifareagent,ou=profile,dc=ucc,dc=gu,dc=uwa,dc=edu,dc=au'
-        passfile = open('/etc/dispense2/ldap.passwd')
-        password = passfile.readline().strip()
-        passfile.close()
-        
-        conn.simple_bind_s(binddn, password)
-        return conn
-
-def get_uid(card_id):
-        ldapconn = get_ldap_connection()
-        
-        basedn = 'ou=People,dc=ucc,dc=gu,dc=uwa,dc=edu,dc=au'
-        filter = ldap.filter.filter_format('(uccDispenseMIFARE=%s)', (card_id, ))
-        attrs = ('uidNumber',)
-        
-        results = ldapconn.search_st(basedn, ldap.SCOPE_SUBTREE, filter, attrs, timeout=LDAP_TIMEOUT)
-        
-        ldapconn.unbind()
-        
-        if len(results) != 1:
-                raise ValueError("no UID found for card ID")
-        
-        return results[0][1]['uidNumber'][0]
-
-def get_uname(uid):
-        ldapconn = get_ldap_connection()
-        
-        basedn = 'ou=People,dc=ucc,dc=gu,dc=uwa,dc=edu,dc=au'
-        filter = ldap.filter.filter_format('(uidNumber=%s)', (uid, ))
-        attrs = ('uid',)
-        
-        results = ldapconn.search_st(basedn, ldap.SCOPE_SUBTREE, filter, attrs, timeout=LDAP_TIMEOUT)
-        
-        ldapconn.unbind()
-        
-        if len(results) != 1:
-                raise ValueError("no username found for user id")
-        
-        return results[0][1]['uid'][0]
-
-def set_card_id(uidNumber, card_id):
-        ldapconn = get_ldap_connection()
-        
-        # fix uidNumber for three/four digit uids
-        uidNumber = str(int(uidNumber))
-        basedn = 'ou=People,dc=ucc,dc=gu,dc=uwa,dc=edu,dc=au'
-        filter = ldap.filter.filter_format('(uidNumber=%s)', (uidNumber, ))
-        attrs = ('objectClass', )
-        
-        results = ldapconn.search_st(basedn, ldap.SCOPE_SUBTREE, filter, attrs, timeout=LDAP_TIMEOUT)
-        
-        if len(results) != 1:
-                raise ValueError('error in uidNumber')
-        
-        user_dn = results[0][0]
-        
-        mod_attrs = []
-        
-        # Does it have the correct object class?
-        if 'uccDispenseAccount' not in results[0][1]['objectClass']:
-                # Add uccDispenseAccount objectclass
-                mod_attrs.append((ldap.MOD_ADD, 'objectClass', 'uccDispenseAccount'))
-        
-        # Add MIFARE Card ID
-        mod_attrs.append((ldap.MOD_ADD, 'uccDispenseMIFARE', card_id))
-        
-        # Use a double-try here to work around something that's fixed in Python 2.5
-        try:
-            try:
-                ldapconn.modify_s(user_dn, mod_attrs)
-            except ldap.TYPE_OR_VALUE_EXISTS as e:
-                pass
-        finally:
-            ldapconn.unbind()
-
-if __name__ == '__main__':
-        set_card_id('11126', '\x01\x02\x03\x04\x05\x06')
-        print(get_uid('\x01\x02\x03\x04\x05\x06'))
diff --git a/VendServer/OpenDispense.py b/VendServer/OpenDispense.py
index f1100ed9293764a8603489052ca9a866e9c731e1..859a1f5da3aab8dfd0754ac4926d6c06acb6d669 100644
--- a/VendServer/OpenDispense.py
+++ b/VendServer/OpenDispense.py
@@ -65,7 +65,8 @@ class OpenDispense(DispenseInterface):
 		userId = int(userId)
 
 		try:
-			# Get username (TODO: Store the user ID in the dispense database too)
+			# Get username (TODO: Store the user ID in the dispense database too, so the vending machine
+			# doesn't need LDAP/AD working)
 			info = pwd.getpwuid(userId)
 		except KeyError:
 			logging.info('getting pin for uid %d: user not in password file'%userId)
diff --git a/VendServer/SnackConfig.py b/VendServer/SnackConfig.py
deleted file mode 100755
index 560f95f93aa83401e9e5ec2482b71335ee7002bf..0000000000000000000000000000000000000000
--- a/VendServer/SnackConfig.py
+++ /dev/null
@@ -1,46 +0,0 @@
-#!/usr/bin/env python
-
-class VendingException( Exception ): pass
-
-import subprocess
-import os, re
-
-def get_snack( slot ):
-	
-	if slot == "--":
-		return (0, 'nothing', 'Nothing')
-	cmd = 'dispense iteminfo snack:%s' % slot
-#	print 'cmd = %s' % cmd
-	try:
-#		info = subprocess.check_output(["dispense","iteminfo",'snack:%s'%slot])
-		raw = os.popen(cmd)
-		info = raw.read()
-		raw.close()
-#		print 'cmd (2) = %s' % cmd
-#		print 'info = "%s"' % info
-		m = re.match("\s*[a-z]+:\d+\s+(\d+)\.(\d\d)\s+([^\n]+)", info)
-		val = ( int(m.group(1))*100 + int(m.group(2)), m.group(3), m.group(3) )
-#		print 'Price: %i, Name: %s' % (val[0], val[1])
-	except BaseException as e:
-		print("BaseException")
-		print(e)
-		val = (0, 'error', 'Error')
-	except:
-		print("Unknown exception")
-		val = (0, 'error', 'Error')
-	return val
-
-def get_price( slot ):
-		p, sn, n = get_snack( slot )
-		return p
-
-def get_name( slot ):
-		p, sn, n = get_snack( slot )
-		return n
-
-def get_short_name( slot ):
-		p, sn, n = get_snack( slot )
-		return sn
-
-if __name__ == '__main__':
-	print("Don't run this")
diff --git a/VendServer/VendServer.py b/VendServer/VendServer.py
index 4e059ece3e2f941cb5a335aa8f0bee56a57e2d29..8c7e48a059a4016ef6aad58ed748da1aeece465d 100755
--- a/VendServer/VendServer.py
+++ b/VendServer/VendServer.py
@@ -15,7 +15,6 @@ from .MessageKeeper import MessageKeeper
 from .HorizScroll import HorizScroll
 from random import random, seed
 from .Idler import GreetingIdler,TrainIdler,GrayIdler,StringIdler,ClockIdler,FortuneIdler,FileIdler,PipeIdler
-from .SnackConfig import get_snack#, get_snacks
 import socket
 from posix import geteuid
 from .OpenDispense import OpenDispense as Dispense
diff --git a/VendServer/VendingMachine.py b/VendServer/VendingMachine.py
index b10f7505382a9ee21067132e56ba36c17d7ef6ba..4a5026836b3b17861e3a2f7cc6968a2bb43ddafa 100644
--- a/VendServer/VendingMachine.py
+++ b/VendServer/VendingMachine.py
@@ -115,7 +115,7 @@ class VendingMachine:
 		else:
 			logging.warning('Unhandled event! (%s %s)\n'%(code,text))
 
-	def authed_message(self, message):
+	def authed_message(self, message: str):
 		if self.challenge == None:
 			print('self.challenge = None')
 			return message