diff -Naur old/Makefile new/Makefile
--- old/Makefile	2008-03-06 05:02:40.000000000 +1100
+++ new/Makefile	2012-07-23 03:20:19.009174483 +1000
@@ -42,11 +42,11 @@
 	    protocol-numbers.iana port-numbers.iana
 
 protocol-numbers.iana:
-	$(AWK) -f get.gawk -v file=protocol-numbers >protocol-numbers.iana
+	$(AWK) -f get.gawk -v file=protocol-numbers/protocol-numbers.xml >protocol-numbers.iana
 	rm -f protocol-numbers
 
 port-numbers.iana:
-	$(AWK) -f get.gawk -v file=port-numbers >port-numbers.iana
+	$(AWK) -f get.gawk -v file=service-names-port-numbers/service-names-port-numbers.xml >port-numbers.iana
 	rm -f port-numbers
 
 protocol-numbers:
diff -Naur old/get.gawk new/get.gawk
--- old/get.gawk	2008-03-06 05:04:18.000000000 +1100
+++ new/get.gawk	2012-07-23 03:20:19.009174483 +1000
@@ -26,7 +26,7 @@
 	NR++
 
 	if (in_content) { print }
-	if (/^$/)       { in_content=1 }
+	if (/^\r?$/)    { in_content=1 }
     }
 
     printf "\n" >"/dev/stderr"
diff -Naur old/protocols.gawk new/protocols.gawk
--- old/protocols.gawk	2006-11-15 05:20:26.000000000 +1100
+++ new/protocols.gawk	2012-07-23 03:22:13.479330458 +1000
@@ -1,32 +1,13 @@
-#!/usr/bin/gawk --re-interval -f
-# the above doesn't work (stupid kernel) but serves as documentation
-
-# Copyright (c) 2003-2004, 2006 Seth W. Klein <sk@sethwklein.net>
-# Licensed under the Open Software License version 3.0
-# See the file COPYING in the distribution tarball or
-# http://www.opensource.org/licenses/osl-3.0.txt
+#!/usr/bin/awk -f
 
 BEGIN {
-    if (strip == "yes") {
-	strip = 1
-	format = "%s\t%s\t%s\n"
-	header_printed = 1
-    } else {
-	strip = 0
-	print "# See also: protocols(5)" \
-	    ", http://www.sethwklein.net/projects/iana-etc/\n#"
-	format = "%-12s %3s %-12s # %s\n"
-	header_printed = 0
-    }
+	print "# See the full IANA XML file at: /usr/share/iana-etc/protocol-numbers.iana\n"
+	FS="[<>]"
 }
-{ sub(/\r/, "") }
-match($0, /^[ \t]+([0-9]+)[ \t]{1,5}([^ \t]+)(.*)/, f) {
-    if ( ! header_printed) {
-	printf format, "# protocol", "num", "aliases", "comments"
-	header_printed = 1;
-    }
-    sub(/^[ \t]*/, "", f[3])
-    printf format, tolower(f[2]), f[1], f[2], f[3]
-    next
+
+{
+	if (/<record/) { v=n=0 }
+	if (/<value/) v=$3
+	if (/<name/ && !($3~/ /)) n=$3
+	if (/<\/record/ && (v || n=="HOPOPT") && n) printf "%-12s %3i %s\n", tolower(n),v,n
 }
-!strip { print "# " $0 }
diff -Naur old/services.gawk new/services.gawk
--- old/services.gawk	2008-03-06 04:51:45.000000000 +1100
+++ new/services.gawk	2012-07-23 03:22:32.272685489 +1000
@@ -1,44 +1,15 @@
-#!/usr/bin/gawk -f
-
-# Copyright (c) 2003-2004, 2006, 2008 Seth W. Klein <sk@sethwklein.net>
-# Licensed under the Open Software License version 3.0
-# See the file COPYING in the distribution tarball or
-# http://www.opensource.org/licenses/osl-3.0.txt
+#!/usr/bin/awk -f
 
 BEGIN {
-    if (strip == "yes") {
-	strip = 1
-    } else {
-	strip = 0
-	print "# See also: services(5)" \
-	    ", http://www.sethwklein.net/projects/iana-etc/\n#"
-    }
-    while (getline <"port-aliases") {
-	sub(/#.*/, "")
-	if (/^[ \t]*$/) { continue }
-	#                  1:name         2:protocol     3:aliases
-	match($0, /^[ \t]*([^ \t]+)[ \t]+([^ \t]+)[ \t]+(.*)$/, f)
-	aliases[f[1] " " f[2]] = " " f[3]
-    }
+	print "# See the full IANA XML file at: /usr/share/iana-etc/port-numbers.iana\n"
+	FS="[<>]"
 }
-{ sub(/\r/, "") }
-#           1:name               2:ws    3:port  4:range     5:proto  6:comment
-match($0, /(^[[:alnum:]][^ \t]+)([ \t]+)([0-9]+)(-[0-9]+)?\/([^ \t]+)(.*)/, f) \
-&& f[3] != "0" {
-# port 0 means unallocated, per port-numbers
-    name = f[1]
-    whitespace = f[2]
-    port = f[3]
-    protocol = f[5]
-    comment = f[6]
-    if (strip) {
-	whitespace = "\t"
-	comment = ""
-    } else if (length(comment) > 0)
-	sub(/^[ \t]*/, "&# ", comment)
-    print name whitespace port "/" protocol aliases[name " " protocol] comment
-    next
+
+{
+	if (/<record/) { n=u=p=c=0 }
+	if (/<name/ && !/\(/) n=$3
+	if (/<number/) u=$3
+	if (/<protocol/) p=$3
+	if (/Unassigned/ || /Reserved/ || /historic/) c=1
+	if (/<\/record/ && n && u && p && !c) printf "%-15s %5i/%s\n", n,u,p # services
 }
-# comment out, prettily
-!/^#/ { sub(/^ /, "#") || sub(/^/, "# ") }
-!strip { print }