diff --git a/text_based.py b/text_based.py
index f9826b2..6d4318e 100755
--- a/text_based.py
+++ b/text_based.py
@@ -22,7 +22,7 @@ class Menu():
 	def __init__(self, name, items=[], prompt='> ',
 		     return_index=True,
 		     exit_msg=None, exit_confirm_msg=None, exit_disallowed_msg=None,
-		     help_text=None):
+		     help_text=None, uses_db=False):
 		self.name = name
 		self.items = items
 		self.prompt = prompt
@@ -33,6 +33,7 @@ class Menu():
 		self.help_text = help_text
 		self.context = None
 		self.header_format = '[%s]'
+		self.uses_db = uses_db
 
 	def exit_menu(self):
 		if self.exit_disallowed_msg != None:
@@ -321,10 +322,18 @@ product name or barcode.
 	def execute(self):
 		self.set_context(None)
 		try:
+			if self.uses_db:
+				self.session = Session()
+			else:
+				self.session = None
 			return self._execute()
 		except ExitMenu:
 			self.at_exit()
 			return None
+		finally:
+			if self.session != None:
+				self.session.close()
+				self.session = None
 
 	def _execute(self):
 		while True:
@@ -404,11 +413,11 @@ class ConfirmMenu(Menu):
 
 class TransferMenu(Menu):
 	def __init__(self):
-		Menu.__init__(self, 'Transfer credit between users')
+		Menu.__init__(self, 'Transfer credit between users',
+			      uses_db=True)
 
 	def _execute(self):
 		self.print_header()
-		self.session = Session()
 		amount = self.input_int('Transfer amount> ', (1,100000))
 		self.set_context('Transfering %d kr' % amount, display=False)
 		user1 = self.input_user('From user> ')
@@ -431,17 +440,15 @@ class TransferMenu(Menu):
 			print 'User %s\'s credit is now %d kr' % (user2, user2.credit)
 		except sqlalchemy.exc.SQLAlchemyError, e:
 			print 'Could not perform transfer: %s' % e
-		self.session.close()
 		self.pause()
 
 
 class AddUserMenu(Menu):
 	def __init__(self):
-		Menu.__init__(self, 'Add user')
+		Menu.__init__(self, 'Add user', uses_db=True)
 
 	def _execute(self):
 		self.print_header()
-		self.session = Session()
 		username = self.input_str('Username (should be same as PVV username)> ', User.name_re, (1,10))
 		cardnum = self.input_str('Card number (optional)> ', User.card_re, (0,10))
 		user = User(username, cardnum)
@@ -451,13 +458,12 @@ class AddUserMenu(Menu):
 			print 'User %s stored' % username
 		except sqlalchemy.exc.IntegrityError, e:
 			print 'Could not store user %s: %s' % (username,e)
-		self.session.close()
 		self.pause()
 
 
 class EditUserMenu(Menu):
 	def __init__(self):
-		Menu.__init__(self, 'Edit user')
+		Menu.__init__(self, 'Edit user', uses_db=True)
 		self.help_text = '''
 The only editable part of a user is its card number.
 
@@ -467,7 +473,6 @@ user (write an empty line to remove the card number).
 
 	def _execute(self):
 		self.print_header()
-		self.session = Session()
 		user = self.input_user('User> ')
 		self.printc('Editing user %s' % user.name)
 		card_str = '"%s"' % user.card
@@ -481,16 +486,14 @@ user (write an empty line to remove the card number).
 			print 'User %s stored' % user.name
 		except sqlalchemy.exc.SQLAlchemyError, e:
 			print 'Could not store user %s: %s' % (user.name,e)
-		self.session.close()
 		self.pause()
 
 
 class AddProductMenu(Menu):
 	def __init__(self):
-		Menu.__init__(self, 'Add product')
+		Menu.__init__(self, 'Add product', uses_db=True)
 
 	def _execute(self):
-		self.session = Session()
 		self.print_header()
 		bar_code = self.input_str('Bar code> ', Product.bar_code_re, (8,13))
 		name = self.input_str('Name> ', Product.name_re, (1,30))
@@ -502,17 +505,15 @@ class AddProductMenu(Menu):
 			print 'Product %s stored' % name
 		except sqlalchemy.exc.SQLAlchemyError, e:
 			print 'Could not store product %s: %s' % (name,e)
-		self.session.close()
 		self.pause()
 
 
 class EditProductMenu(Menu):
 	def __init__(self):
-		Menu.__init__(self, 'Edit product')
+		Menu.__init__(self, 'Edit product', uses_db=True)
 
 	def _execute(self):
 		self.print_header()
-		self.session = Session()
 		product = self.input_product('Product> ')
 		self.printc('Editing product %s' % product.name)
 		while True:
@@ -531,7 +532,6 @@ class EditProductMenu(Menu):
 					print 'Product %s stored' % product.name
 				except sqlalchemy.exc.SQLAlchemyError, e:
 					print 'Could not store product %s: %s' % (product.name, e)					
-				self.session.close()
 				self.pause()
 				return
 			elif what == None:
@@ -543,10 +543,9 @@ class EditProductMenu(Menu):
 
 class ShowUserMenu(Menu):
 	def __init__(self):
-		Menu.__init__(self, 'Show user')
+		Menu.__init__(self, 'Show user', uses_db=True)
 
 	def _execute(self):
-		self.session = Session()
 		self.print_header()
 		user = self.input_user('User name or card number> ')
 		print 'User name: %s' % user.name
@@ -582,11 +581,10 @@ class ShowUserMenu(Menu):
 
 class UserListMenu(Menu):
 	def __init__(self):
-		Menu.__init__(self, 'User list')
+		Menu.__init__(self, 'User list', uses_db=True)
 
 	def _execute(self):
 		self.print_header()
-		self.session = Session()
 		user_list = self.session.query(User).all()
 		total_credit = self.session.query(sqlalchemy.func.sum(User.credit)).first()[0]
 
@@ -598,14 +596,12 @@ class UserListMenu(Menu):
 			print line_format % (user.name, user.credit)
 		print hline
 		print line_format % ('total credit', total_credit)
-
-		self.session.close()
 		self.pause()
 
 
 class BuyMenu(Menu):
 	def __init__(self):
-		Menu.__init__(self, 'Buy')
+		Menu.__init__(self, 'Buy', uses_db=True)
 		self.help_text = '''
 Each purchase may contain one or more products and one or more buyers.
 
@@ -618,7 +614,6 @@ When finished, write an empty line to confirm the purchase.
 
 	def _execute(self):
 		self.print_header()
-		self.session = Session()
 		self.purchase = Purchase()
 		self.exit_confirm_msg=None
 		while True:
@@ -659,7 +654,6 @@ When finished, write an empty line to confirm the purchase.
 			self.print_purchase()
 			for t in self.purchase.transactions:
 				print 'User %s\'s credit is now %d kr' % (t.user.name, t.user.credit)
-		self.session.close()
 		self.pause()
 		return True
 		
@@ -698,11 +692,10 @@ When finished, write an empty line to confirm the purchase.
 
 class AdjustCreditMenu(Menu): # reimplements ChargeMenu; these should be combined to one
 	def __init__(self):
-		Menu.__init__(self, 'Adjust credit')
+		Menu.__init__(self, 'Adjust credit', uses_db=True)
 
 	def _execute(self):
 		self.print_header()
-		self.session = Session()
 		user = self.input_user('User> ')
 		print 'User %s\'s credit is %d kr' % (user.name, user.credit)
 		self.set_context('Adjusting credit for user %s' % user.name, display=False)
@@ -718,24 +711,21 @@ class AdjustCreditMenu(Menu): # reimplements ChargeMenu; these should be combine
 			print 'User %s\'s credit is now %d kr' % (user.name, user.credit)
 		except sqlalchemy.exc.SQLAlchemyError, e:
 			print 'Could not store transaction: %s' % e
-		self.session.close()
 		self.pause()
 
 
 class ProductListMenu(Menu):
 	def __init__(self):
-		Menu.__init__(self, 'Product list')
+		Menu.__init__(self, 'Product list', uses_db=True)
 
 	def _execute(self):
 		self.print_header()
-		self.session = Session()
 		product_list = self.session.query(Product).all()
 		line_format = '%-30s | %6s | %-15s'
 		print line_format % ('name', 'price', 'bar code')
 		print '---------------------------------------------------------'
 		for p in product_list:
 			print line_format % (p.name, p.price, p.bar_code)
-		self.session.close()
 		self.pause()