--- a/update-usbids.sh.in
+++ b/update-usbids.sh.in
@@ -6,9 +6,9 @@
 
 set -e
 SRC="http://www.linux-usb.org/usb.ids"
-DEST=usb.ids
+DEST=usb.ids.gz
 
-# if usb.ids is read-only (because the filesystem is read-only),
+# if usb.ids.gz is read-only (because the filesystem is read-only),
 # then just skip this whole process.
 if ! touch ${DEST} >&2 >/dev/null ; then
 	${quiet} || echo "${DEST} is read-only, exiting."
@@ -16,10 +16,10 @@ if ! touch ${DEST} >&2 >/dev/null ; then
 fi
 
 if which wget >/dev/null 2>&1 ; then
-	DL="wget -O $DEST.new $SRC"
+	DL="eval wget -O- $SRC | gzip >$DEST.new"
 	${quiet} && DL="$DL -q"
 elif which lynx >/dev/null 2>&1 ; then
-	DL="eval lynx -source $SRC >$DEST.new"
+	DL="eval lynx -source $SRC | gzip >$DEST.new"
 else
 	echo >&2 "update-usbids: cannot find wget nor lynx"
 	exit 1
@@ -31,7 +31,7 @@ if ! $DL ; then
 	exit 1
 fi
 
-if ! grep >/dev/null "^C " $DEST.new ; then
+if ! zcat $DEST.new | grep >/dev/null "^C " ; then
 	echo >&2 "update-usbids: missing class info, probably truncated file"
 	exit 1
 fi
