diff --git a/src/preferences/devices/Jamfile b/src/preferences/devices/Jamfile
index 75f81ee0cc..43c5bfba33 100644
--- a/src/preferences/devices/Jamfile
+++ b/src/preferences/devices/Jamfile
@@ -54,7 +54,7 @@ actions PCIHeaderGen1
 	awk -v HEADERFILE=$(1) -f $(2[2]) $(2[1])
 }
 
-PCIHeaderGen [ FGristFiles pcihdr.h ] : pci.ids : pci-clean.awk ;
+PCIHeaderGen [ FGristFiles pcihdr.h ] : pci.ids : pci-header.awk ;
 
 Preference Devices :
 	Devices.cpp
diff --git a/src/preferences/devices/pci-clean.awk b/src/preferences/devices/pci-header.awk
similarity index 59%
rename from src/preferences/devices/pci-clean.awk
rename to src/preferences/devices/pci-header.awk
index d6656f1b0f..61db7a7ae4 100644
--- a/src/preferences/devices/pci-clean.awk
+++ b/src/preferences/devices/pci-header.awk
@@ -1,4 +1,4 @@
-# Clean PCI header script
+# PCI Header script
 #
 # Copyright 2006, Haiku.
 # Distributed under the terms of the MIT License.
@@ -10,34 +10,56 @@
 # run as: awk -v HEADERFILE=pcihdr.h -f pci-header.awk pci.ids
 
 BEGIN {
+
+	# field separator, defining because user could have overridden
 	FS = " "
+
+	# Pass this in from outside with -v HEADERFILE=filenametouse
+	# we require pcihdr.h for our system
 	ofile = HEADERFILE
+
+	# possibly use this in the future
+	cleanvalues = "[^A-Za-z0-9{}\"'&@?!*.,:;+<> \\t\\/_\\[\\]=#()-]"
+	# ToDo: currently IDs aren't checked, we dumbly assume the source is clean
+
+	# descriptive output header
 	print "#if 0" > ofile
 	print "#\tPCIHDR.H: PCI Vendors, Devices, and Class Type information\n#" > ofile
-	print "#\tGenerated by pci-clean, sourced from the web at the following URL:\n#\thttp://pciids.sourceforge.net/pci.ids\n#" > ofile
+	print "#\tGenerated by pci-header.awk, source data from the following URI:\n#\thttp://pciids.sourceforge.net/pci.ids\n#" > ofile
 	print "#\tHeader created on " strftime( "%A, %d %b %Y %H:%M:%S %Z", systime() ) > ofile
 	print "#endif" > ofile
 
+	# and we start with vendors..
 	print "\ntypedef struct _PCI_VENTABLE\n{\n\tunsigned short\tVenId ;\n\tchar *\tVenFull ;\n\tchar *\tVenShort ;\n}  PCI_VENTABLE, *PPCI_VENTABLE ;\n" > ofile
 	print "PCI_VENTABLE\tPciVenTable [] =\n{" > ofile
-
 }
 
 # matches vendor - starts with an id as first thing on the line
+# because this occurs first in the header file, we output it without worry
 /^[[:xdigit:]][[:xdigit:]][[:xdigit:]][[:xdigit:]] / { 
-	if ( vendor++ > 0 ) { a = ",\n" } else { a = "" }
-	vend = substr($0, 7); gsub( /\"/, "\\\"", vend )
-	printf a "\t{ 0x" $1 ", \"" vend "\" }" > ofile
+
+	if ( vendorcount++ > 0 ) { 
+		formatting = ",\n"
+	} else {
+		formatting = ""
+	}
+
 	# store vendor ID for possible devices afterwards
-	currentVendor = $1
+	vendorid = $1
+	vendor = substr($0, 7)
+	gsub( /\"/, "\\\"", vendor )
+
+	printf formatting "\t{ 0x" vendorid ", \"" vendor "\" }" > ofile
 }
 
 # matches device 
 /^\t[[:xdigit:]][[:xdigit:]][[:xdigit:]][[:xdigit:]] / { 
 
-	device = substr($0, 8); gsub( /\"/, "\\\"", device )
+	device = substr($0, 8)
+	gsub( /\"/, "\\\"", device )
+
 	devicecount++
-	devices[devicecount, 1] = currentVendor 
+	devices[devicecount, 1] = vendorid
 	devices[devicecount, 2] = $1
 	devices[devicecount, 3] = device 
 }
@@ -45,7 +67,9 @@ BEGIN {
 # matches subvendor device
 /^\t\t[[:xdigit:]][[:xdigit:]][[:xdigit:]][[:xdigit:]] / { 
 
-	device = substr($0, 14); gsub( /\"/, "\\\"", device )
+	device = substr($0, 14)
+	gsub( /\"/, "\\\"", device )
+
 	devicecount++
 	devices[devicecount, 1] = $1 
 	devices[devicecount, 2] = $2
@@ -54,38 +78,42 @@ BEGIN {
 
 # match device class - store data for later
 /^C [[:xdigit:]][[:xdigit:]]  / { 
+
 	class = $2
-	classdes = substr($0, 7); gsub( /\"/, "\\\"", classdes )
+	classname = substr($0, 7)
+	gsub( /\"/, "\\\"", classname )
 }
 
 # match subclass, use device class data captured earlier, and output
 /^\t[[:xdigit:]][[:xdigit:]]  / {
-	# if ( currentclass != class)  { classes = classes "\n"; currentclass = class }
-	subclassdes = substr($0, 6);	gsub( /\"/, "\\\"", subclassdes )
+
 	subclass = $1
-	classcount++;
+	subclassname = substr($0, 6)
+	gsub( /\"/, "\\\"", subclassname )
+
+	classcount++
 	classes[classcount, 1] = class
 	classes[classcount, 2] = subclass
 	classes[classcount, 3] = "00"
-	classes[classcount, 4] = classdes
-	classes[classcount, 5] = subclassdes
+	classes[classcount, 4] = classname
+	classes[classcount, 5] = subclassname
 	classes[classcount, 6] = ""
 } 
 
 # match programming interface
 /^\t\t[[:xdigit:]][[:xdigit:]]  / {
-	#if ( $1 != "00" ) {
-		#if ( length(classes) > 0 ) classes = classes ",\n"
-		progif = substr($0, 7); gsub( /\"/, "\\\"", progif )		
 
-		classcount++;
-		classes[classcount, 1] = class
-		classes[classcount, 2] = subclass
-		classes[classcount, 3] = $1
-		classes[classcount, 4] = classdes
-		classes[classcount, 5] = subclassdes
-		classes[classcount, 6] = progif
-	#}
+	proginterface = $1
+	proginterfacename = substr($0, 7)
+	gsub( /\"/, "\\\"", proginterfacename )
+
+	classcount++
+	classes[classcount, 1] = class
+	classes[classcount, 2] = subclass
+	classes[classcount, 3] = proginterface
+	classes[classcount, 4] = classname
+	classes[classcount, 5] = subclassname
+	classes[classcount, 6] = proginterfacename
 } 
 
 # We've processed the file, now output.
@@ -95,30 +123,51 @@ END {
 
 	if ( devicecount > 0 ) {
 
-		print "typedef struct _PCI_DEVTABLE\n{\n\tunsigned short	VenId ;\n\tunsigned short	DevId ;\n\tchar *\tChipDesc ;\n\tchar *\tChip ;\n}  PCI_DEVTABLE, *PPCI_DEVTABLE ;\n"  > ofile
+		print "typedef struct _PCI_DEVTABLE\n{\n\tunsigned short	VenId ;\n\tunsigned short	DevId ;\n\tchar *\tChipDesc ;\n\tchar *\tChip;\n}  PCI_DEVTABLE, *PPCI_DEVTABLE ;\n"  > ofile
 		print "PCI_DEVTABLE\tPciDevTable [] =\n{" > ofile
 		for (i = 1; i <= devicecount; i++) {
-			if (i != 1) { a = ",\n" } else { a = "" }
-			printf a "\t{ 0x" devices[i, 1] ", 0x" devices[i, 2] ", \"" devices[i, 3] "\" }" > ofile
+
+			if (i != 1) {
+				formatting = ",\n"
+			} else {
+				formatting = ""
+			}
+			printf formatting "\t{ 0x" devices[i, 1] ", 0x" devices[i, 2] ", \"" devices[i, 3] "\" }" > ofile
 		}
 		print "\n} ;\n\n// Use this value for loop control during searching:\n#define	PCI_DEVTABLE_LEN	(sizeof(PciDevTable)/sizeof(PCI_DEVTABLE))\n" > ofile
 
 	}
 	
 	if ( classcount > 0 ) {
-		print "typedef struct _PCI_CLASSCODETABLE\n{\n\tunsigned char	BaseClass ;\n\tunsigned char	SubClass ;\n\tunsigned char	ProgIf ;\n\tchar *\t\tBaseDesc ;\n\tchar *\t\tSubDesc ;\n\tchar *\t\tProgDesc ;\n}  PCI_CLASSCODETABLE, *PPCI_CLASSCODETABLE ;\n" > ofile
+		print "typedef struct _PCI_CLASSCODETABLE\n{\n\tunsigned char	BaseClass ;\n\tunsigned char	SubClass ;\n\tunsigned char	ProgIf ;" > ofile
+		print "\tchar *\t\tBaseDesc ;\n\tchar *\t\tSubDesc ;\n\tchar *\t\tProgDesc ;\n}  PCI_CLASSCODETABLE, *PPCI_CLASSCODETABLE ;\n" > ofile
 		print "PCI_CLASSCODETABLE PciClassCodeTable [] =\n{" > ofile
+		currentclass = classes[1, 1]
 		for (i = 1; i <= classcount; i++) {
-			if (i != 1) { a = ",\n" } else { a = "" }
-			if ( ( classes[i, 1] == classes[i+1, 1] ) && ( classes[i, 2] == classes[i+1, 2] ) && ( classes[i, 3] == classes[i+1, 3] ) ) {
-			} else {
-				printf a "\t{ 0x" classes[i, 1] ", 0x" classes[i, 2] ", 0x" classes[i, 3] ", \"" classes[i, 4] "\", \"" classes[i, 5]  "\", \"" classes[i, 6] "\" }" > ofile
+			
+			if (i != 1) { 
+				formatting = ",\n"
+			} else { 
+				formatting = ""
+			}
+
+			# pretty print separate classes
+			if ( currentclass != classes[i, 1] ) { 
+				formatting = formatting "\n"
+				currentclass = classes[i, 1]
+			}
+			
+			# if the next item has the same details, we know we're to skip ourselves 
+			# this is because the programming interface name needs to be used, and we dont have it ourselves
+			if ( ( classes[i, 1] != classes[i+1, 1] ) || ( classes[i, 2] != classes[i+1, 2] ) || ( classes[i, 3] != classes[i+1, 3] ) ) {
+				printf formatting "\t{ 0x" classes[i, 1] ", 0x" classes[i, 2] ", 0x" classes[i, 3] ", \"" classes[i, 4] "\", \"" classes[i, 5]  "\", \"" classes[i, 6] "\" }" > ofile
 			}
 		}
 		print "\n} ;\n\n// Use this value for loop control during searching:\n#define	PCI_CLASSCODETABLE_LEN	(sizeof(PciClassCodeTable)/sizeof(PCI_CLASSCODETABLE))\n" > ofile
 
 	}
 
+	# this is rather ugly, maybe we should include this in a seperate file, and pull it in ?
 	print "char *\tPciCommandFlags [] =\n{\n\t\"I/O Access\",\n\t\"Memory Access\",\n\t\"Bus Mastering\",\n\t\"Special Cycles\",\n\t\"Memory Write & Invalidate\",\n\t\"Palette Snoop\",\n\t\"Parity Errors\",\n\t\"Wait Cycles\",\n\t\"System Errors\",\n\t\"Fast Back-To-Back\",\n\t\"Reserved 10\",\n\t\"Reserved 11\",\n\t\"Reserved 12\",\n\t\"Reserved 13\",\n\t\"Reserved 14\",\n\t\"Reserved 15\"\n} ;\n" > ofile
 	print "// Use this value for loop control during searching:\n#define	PCI_COMMANDFLAGS_LEN	(sizeof(PciCommandFlags)/sizeof(char *))\n" > ofile
 	print "char *\tPciStatusFlags [] =\n{\n\t\"Reserved 0\",\n\t\"Reserved 1\",\n\t\"Reserved 2\",\n\t\"Reserved 3\",\n\t\"Reserved 4\",\n\t\"66 MHz Capable\",\n\t\"User-Defined Features\",\n\t\"Fast Back-To-Back\",\n\t\"Data Parity Reported\",\n\t\"\",\n\t\"\",\n\t\"Signalled Target Abort\",\n\t\"Received Target Abort\",\n\t\"Received Master Abort\",\n\t\"Signalled System Error\",\n\t\"Detected Parity Error\"\n} ;\n" > ofile
@@ -126,6 +175,7 @@ END {
 	print "char *\tPciDevSelFlags [] =\n{\n\t\"Fast Devsel Speed\",\n\t\"Medium Devsel Speed\",\n\t\"Slow Devsel Speed\",\n\t\"Reserved 9&10\"\n} ;\n" > ofile
 	print "// Use this value for loop control during searching:\n#define	PCI_DEVSELFLAGS_LEN	(sizeof(PciDevSelFlags)/sizeof(char *))\n\n" > ofile
 
+	close(ofile)
 }