diff --git a/tko/create_db b/tko/create_db
index 09e00a4..bbff238 100644
--- a/tko/create_db
+++ b/tko/create_db
@@ -17,9 +17,9 @@
 
 -- One entry per patch used, anywhere
 CREATE TABLE patches (
-kversion INTEGER PRIMARY KEY,		-- index number
-name VARCHAR(20),			-- short name
-url VARCHAR(200),			-- full URL
+kversion INTEGER,			-- index number
+name VARCHAR(80),			-- short name
+url VARCHAR(300),			-- full URL
 hash VARCHAR(35)
 );
 
diff --git a/tko/db.py b/tko/db.py
index 270f077..cd547e8 100644
--- a/tko/db.py
+++ b/tko/db.py
@@ -1,4 +1,4 @@
-import sqlite, re
+import sqlite, re, os
 
 class db:
 	def __init__(self):
@@ -40,26 +40,48 @@
 
 
 	def insert_job(self, tag, job):
-		# is kernel version in tree?
 		self.insert('jobs', {'tag':tag, 'machine':'UNKNOWN'})
 		job.index = self.find_job(tag)
 		for test in job.tests:
 			self.insert_test(job, test)
 
+
 	def insert_test(self, job, test):
-		# WE ARE MISSING KVERSION HERE!!!!
+		kver = self.insert_kernel_version(test.kernel)
 		data = {'job_idx':job.index, 'test':test.testname,
 			'subdir':test.dir, 
 			'status':test.status, 'reason':test.reason}
 		self.insert('tests', data)
 
 
-	def lookup_kernel_version(self, base, patches):
-		return self.select('kversion', 'kversions', {'base':base})[0]
+	def lookup_kversion(self, kernel):
+		rows = self.select('kversion', 'kversions', 
+				{'kversion_hash':kernel.kversion_hash})
+		if rows:
+			return rows[0][0]
+		else:
+			return None
 
 
-	def insert_kernel_version(self, base, patches):
-		self.insert('kversions', {'base': base})
+	def insert_kernel_version(self, kernel):
+		kver = self.lookup_kversion(kernel)
+		if kver:
+			return kver
+		self.insert('kversions', {'base':kernel.base,
+					  'kversion_hash':kernel.kversion_hash})
+		kver = self.lookup_kversion(kernel)
+		for patch in kernel.patches:
+			self.insert_patch(kver, patch)
+		return kver
+
+
+	def insert_patch(self, kver, patch):
+		print patch.reference
+		name = os.path.basename(patch.reference)[:80]
+		self.insert('patches', {'kversion': kver, 
+					'name':name,
+					'url':patch.reference, 
+					'hash':patch.hash})
 
 
 	def find_job(self, tag):
diff --git a/tko/parse.py b/tko/parse.py
index 30e8acb..d3a5894 100755
--- a/tko/parse.py
+++ b/tko/parse.py
@@ -26,52 +26,29 @@
 		self.dir = dir
 		self.type = type
 		self.control = os.path.join(dir, "control")
+		self.status = os.path.join(dir, "status")
 		self.machine = ''
 		self.variables = {}
 		self.tests = []
 		self.kernel = None
 
-		print 'FOOFACE ' + self.control
-		if not os.path.exists(self.control):
-			return
-		# HACK. we don't have proper build tags in the status file yet
-		# so we hardcode build/ and do it at the start of the job
-		print 'POOFACE'
-		self.kernel = kernel(os.path.join(dir, 'build'))
 		self.grope_status()
 
 
-	def derive_build(self, raw_build):
-		# First to expand variables in the build line ...
-		self.build = ''
-		for element in re.split(r'(\$\w+)', raw_build):
-			if element.startswith('$'):
-				element = self.variables[element.lstrip('$')]
-			self.build += element
-
-
-	def derive_patches(self):
-		self.patches_short = []
-		self.patches_long = []
-		for segment in re.split(r'(-p \S+)', self.build):
-			if segment.startswith('-p'):
-				self.patches_long.append(segment.split(' ')[1])
-		self.patches_short = [shorten_patch(p) for p in self.patches_long]
-		
-
 	def grope_status(self):
-		status_file = os.path.join(self.dir, "status")
-		for line in open(status_file, 'r').readlines():
+		# HACK. we don't have proper build tags in the status file yet
+		# so we hardcode build/ and do it at the start of the job
+		build = os.path.join(self.dir, 'build')
+		if os.path.exists(build):
+			self.kernel = kernel(build)
+
+		if not os.path.exists(self.status):
+			return
+
+		for line in open(self.status, 'r').readlines():
 			(status, testname, reason) = line.rstrip().split(' ', 2)
 
-		self.tests.append(test(testname, status, reason))
-
-
-	def set_status(self, status):
-		if status not in status_num:
-			return
-		self.status = status
-		self.status_num = status_num[status]
+		self.tests.append(test(testname, status, reason, self.kernel))
 
 
 class kernel:
@@ -80,19 +57,23 @@
 		self.patches = []
 
 		log = os.path.join(builddir, 'debug/build_log')
+		if not os.path.exists(log):
+			return
 		patch_hashes = []
 		for line in open(log, 'r'):
+			print line
 			(type, rest) = line.split(': ', 1)
 			words = rest.split()
 			if type == 'BUILD VERSION':
 				self.base = words[0]
 			if type == 'PATCH':
-				self.patches.append(words[0:])
+				print words
+				self.patches.append(patch(*words[0:]))
 				# patch_hashes.append(words[2])
-		self.kversion_hash = self.get_kversion_hash(self.base, patch_hashes)
+		self.kversion_hash = self.get_kver_hash(self.base, patch_hashes)
 
 
-	def get_kversion_hash(self, base, patch_hashes):
+	def get_kver_hash(self, base, patch_hashes):
 		"""\
 		Calculate a hash representing the unique combination of
 		the kernel base version plus 
@@ -101,14 +82,26 @@
 		return md5.new(key_string).hexdigest()
 
 
+class patch:
+	def __init__(self, spec, reference=None, hash=None):
+		# NEITHER OF THE ABOVE SHOULD HAVE DEFAULTS!!!! HACK HACK
+		if not reference:
+			reference = spec
+		print 'PATCH::%s %s %s' % (spec, reference, hash)
+		self.spec = spec
+		self.reference = reference
+		self.hash = hash
+
+
 class test:
-	def __init__(self, dir, status, reason):
+	def __init__(self, dir, status, reason, kernel):
 		self.dir = dir
 		self.status = status
 		self.reason = reason
 		self.keyval = os.path.join(dir, 'results/keyval')
 		self.iterations = []
 		self.testname = re.sub(r'\..*', '', self.dir)
+		self.kernel = kernel
 
 		if not os.path.exists(self.keyval):
 			self.keyval = None
