diff --git a/System/USB/IDDB.hs b/System/USB/IDDB.hs
--- a/System/USB/IDDB.hs
+++ b/System/USB/IDDB.hs
@@ -1,8 +1,14 @@
 {-| A database of USB identifiers.
 
-Databases with vendor names and identifiers can be loaded from string,
-file or directly from <http://www.usb.org> or <http://linux-usb.org>.
+Databases with vendor names and identifiers can be loaded from string or file.
 
+To get the most up-to-date database download the files directly from
+<http://www.usb.org>
+or
+<http://linux-usb.org>.
+
+Each database's module contains an URL to the database file.
+
 Example usage:
 
 @
@@ -45,13 +51,6 @@
     ( -- *Types
       IDDB
 
-    , ID,         Name
-    , VendorID,   VendorName
-    , ProductID,  ProductName
-    , ClassID,    ClassName
-    , SubClassID, SubClassName
-    , ProtocolID, ProtocolName
-
     , emptyDb
 
       -- *Query database
@@ -62,6 +61,17 @@
     , className
     , subClassName
     , protocolName
+    , audioClassTerminalTypeName
+    , videoClassTerminalTypeName
+    , hidDescTypeName
+    , hidDescItemName
+    , hidDescCountryCodeName
+    , hidUsagePageName
+    , hidUsageName
+    , physicalDescBiasName
+    , physicalDescItemName
+    , langName
+    , subLangName
     )
     where
 
diff --git a/System/USB/IDDB/Base.hs b/System/USB/IDDB/Base.hs
--- a/System/USB/IDDB/Base.hs
+++ b/System/USB/IDDB/Base.hs
@@ -3,12 +3,8 @@
 module System.USB.IDDB.Base
     ( IDDB(..)
 
-    , ID,         Name
-    , VendorID,   VendorName
-    , ProductID,  ProductName,  ProductDB
-    , ClassID,    ClassName,    ClassDB
-    , SubClassID, SubClassName, SubClassDB
-    , ProtocolID, ProtocolName, ProtocolDB
+    , ProductDB
+    , ClassDB, SubClassDB, ProtocolDB
 
     , emptyDb
 
@@ -19,13 +15,22 @@
     , className
     , subClassName
     , protocolName
+    , audioClassTerminalTypeName
+    , videoClassTerminalTypeName
+    , hidDescTypeName
+    , hidDescItemName
+    , hidDescCountryCodeName
+    , hidUsagePageName
+    , hidUsageName
+    , physicalDescBiasName
+    , physicalDescItemName
+    , langName
+    , subLangName
 
     , getDataFileName
     )
     where
 
-import Data.Binary ( Binary(..), Get )
-
 import qualified Data.IntMap as IM
 import qualified Data.Map    as MP
 
@@ -40,34 +45,28 @@
 -- Types
 -------------------------------------------------------------------------------
 
-type ID          = Int
-type Name        = String
-
-type VendorID    = ID
-type ProductID   = ID
-type ClassID     = ID
-type SubClassID  = ID
-type ProtocolID  = ID
-
-type VendorName   = Name
-type ProductName  = Name
-type ClassName    = Name
-type SubClassName = Name
-type ProtocolName = Name
-
-type ProductDB  = ( MP.Map ProductName ProductID
-                  , IM.IntMap ProductName
+type ProductDB  = ( MP.Map String Int
+                  , IM.IntMap String
                   )
-type ClassDB    = IM.IntMap (ClassName, SubClassDB)
-type SubClassDB = IM.IntMap (SubClassName, ProtocolDB)
-type ProtocolDB = IM.IntMap ProtocolName
+type ClassDB    = IM.IntMap (String, SubClassDB)
+type SubClassDB = IM.IntMap (String, ProtocolDB)
+type ProtocolDB = IM.IntMap String
 
 -- |A database of USB identifiers. Contains both vendor identifiers
 -- and product identifiers.
-data IDDB = IDDB { dbVendorNameId :: MP.Map VendorName VendorID
-                 , dbVendorIdName :: IM.IntMap VendorName
+data IDDB = IDDB { dbVendorNameId :: MP.Map String Int
+                 , dbVendorIdName :: IM.IntMap String
                  , dbProducts     :: IM.IntMap ProductDB
                  , dbClasses      :: ClassDB
+                 , dbAudioCTType  :: IM.IntMap String
+                 , dbVideoCTType  :: IM.IntMap String
+                 , dbHIDDescType  :: IM.IntMap String
+                 , dbHIDDescItem  :: IM.IntMap String
+                 , dbHIDDescCCode :: IM.IntMap String
+                 , dbHIDUsage     :: IM.IntMap (String, IM.IntMap String)
+                 , dbPhysDescBias :: IM.IntMap String
+                 , dbPhysDescItem :: IM.IntMap String
+                 , dbLanguages    :: IM.IntMap (String, IM.IntMap String)
                  }
 
 -- |An empty database.
@@ -76,56 +75,119 @@
                , dbVendorIdName = IM.empty
                , dbProducts     = IM.empty
                , dbClasses      = IM.empty
+               , dbAudioCTType  = IM.empty
+               , dbVideoCTType  = IM.empty
+               , dbHIDDescType  = IM.empty
+               , dbHIDDescItem  = IM.empty
+               , dbHIDDescCCode = IM.empty
+               , dbHIDUsage     = IM.empty
+               , dbPhysDescBias = IM.empty
+               , dbPhysDescItem = IM.empty
+               , dbLanguages    = IM.empty
                }
 
 -------------------------------------------------------------------------------
--- Binary serialisation
--------------------------------------------------------------------------------
-
-instance Binary IDDB where
-    put db = put ( dbVendorNameId db
-                 , dbVendorIdName db
-                 , dbProducts     db
-                 , dbClasses      db
-                 )
-
-    get = do (a, b, c, d) <- get :: Get ( MP.Map VendorName VendorID
-                                        , IM.IntMap VendorName
-                                        , IM.IntMap ProductDB
-                                        , ClassDB
-                                        )
-             return IDDB { dbVendorNameId = a
-                         , dbVendorIdName = b
-                         , dbProducts     = c
-                         , dbClasses      = d
-                         }
-
--------------------------------------------------------------------------------
 -- Query database
 -------------------------------------------------------------------------------
 
-vendorName :: IDDB -> VendorID -> Maybe VendorName
+vendorName :: IDDB -- ^Database
+           -> Int  -- ^Vendor identifier
+           -> Maybe String
 vendorName db vid = IM.lookup vid $ dbVendorIdName db
 
-vendorId :: IDDB -> VendorName -> Maybe VendorID
+vendorId :: IDDB   -- ^Database
+         -> String -- ^Vendor name
+         -> Maybe Int
 vendorId db name = MP.lookup name $ dbVendorNameId db
 
-productName :: IDDB -> VendorID -> ProductID -> Maybe ProductName
+productName :: IDDB -- ^Database
+            -> Int  -- ^Vendor identifier
+            -> Int  -- ^Product identifier
+            -> Maybe String
 productName db vid pid = IM.lookup pid . snd =<< IM.lookup vid (dbProducts db)
 
-productId :: IDDB -> VendorID -> ProductName -> Maybe ProductID
+productId :: IDDB   -- ^Database
+          -> Int    -- ^Vendor identifier
+          -> String -- ^Product name
+          -> Maybe Int
 productId db vid name = MP.lookup name . fst =<< IM.lookup vid (dbProducts db)
 
-className :: IDDB -> ClassID -> Maybe ClassName
+className :: IDDB -- ^Database
+          -> Int  -- ^Class identifier
+          -> Maybe String
 className db cid = fmap fst . IM.lookup cid $ dbClasses db
 
-subClassName :: IDDB -> ClassID -> SubClassID -> Maybe SubClassName
+subClassName :: IDDB -- ^Database
+             -> Int  -- ^Class identifier
+             -> Int  -- ^Sub class identifier
+             -> Maybe String
 subClassName db cid scid = fmap fst $   IM.lookup scid . snd
                                     =<< IM.lookup cid (dbClasses db)
 
-protocolName :: IDDB -> ClassID -> SubClassID -> ProtocolID -> Maybe ProtocolName
+protocolName :: IDDB -- ^Database
+             -> Int  -- ^Class identifier
+             -> Int  -- ^Sub class identifier
+             -> Int  -- ^Protocol identifier
+             -> Maybe String
 protocolName db cid scid protId =   IM.lookup protId . snd
                                 =<< IM.lookup scid   . snd
                                 =<< IM.lookup cid (dbClasses db)
 
+audioClassTerminalTypeName :: IDDB -- ^Database
+                           -> Int  -- ^Audio class terminal type identifier
+                           -> Maybe String
+audioClassTerminalTypeName db actid = IM.lookup actid (dbAudioCTType db)
 
+videoClassTerminalTypeName :: IDDB -- ^Database
+                           -> Int  -- ^Video class terminal type identifier
+                           -> Maybe String
+videoClassTerminalTypeName db actid = IM.lookup actid (dbVideoCTType db)
+
+hidDescTypeName :: IDDB -- ^Database
+                -> Int  -- ^HID descriptor type identifier
+                -> Maybe String
+hidDescTypeName db hidid = IM.lookup hidid (dbHIDDescType db)
+
+hidDescItemName :: IDDB -- ^Database
+                -> Int  -- ^HID descriptor item identifier
+                -> Maybe String
+hidDescItemName db hidid = IM.lookup hidid (dbHIDDescItem db)
+
+hidDescCountryCodeName :: IDDB -- ^Database
+                       -> Int  -- ^HID descriptor country code identifier
+                       -> Maybe String
+hidDescCountryCodeName db hidid = IM.lookup hidid (dbHIDDescCCode db)
+
+hidUsagePageName :: IDDB -- ^Database
+                 -> Int  -- ^HID usage page identifier
+                 -> Maybe String
+hidUsagePageName db upid = fmap fst $ IM.lookup upid (dbHIDUsage db)
+
+hidUsageName :: IDDB -- ^Database
+             -> Int  -- ^HID usage page identifier
+             -> Int  -- ^HID usage identifier
+             -> Maybe String
+hidUsageName db upid uid =   IM.lookup uid . snd
+                         =<< IM.lookup upid (dbHIDUsage db)
+
+physicalDescBiasName :: IDDB -- ^Database
+                     -> Int  -- ^Physical descriptor bias identifier
+                     -> Maybe String
+physicalDescBiasName db phyid = IM.lookup phyid (dbPhysDescBias db)
+
+physicalDescItemName :: IDDB -- ^Database
+                     -> Int  -- ^Physical descriptor item identifier
+                     -> Maybe String
+physicalDescItemName db phyid = IM.lookup phyid (dbPhysDescItem db)
+
+langName :: IDDB -- ^Database
+         -> Int  -- ^Primary language identifier
+         -> Maybe String
+langName db lid = fmap fst . IM.lookup lid $ dbLanguages db
+
+subLangName :: IDDB -- ^Database
+            -> Int  -- ^Primary language identifier
+            -> Int  -- ^Sub language identifier
+            -> Maybe String
+subLangName db lid slid =   IM.lookup slid . snd
+                        =<< IM.lookup lid (dbLanguages db)
diff --git a/System/USB/IDDB/LinuxUsbIdRepo.hs b/System/USB/IDDB/LinuxUsbIdRepo.hs
--- a/System/USB/IDDB/LinuxUsbIdRepo.hs
+++ b/System/USB/IDDB/LinuxUsbIdRepo.hs
@@ -1,125 +1,147 @@
+{-| Functions to acquire a database from <http://linux-usb.org>. -}
+
 module System.USB.IDDB.LinuxUsbIdRepo
     ( parseDb
     , staticDb
     , fromFile
-    , fromWeb
+    , dbURL
     ) where
 
+import Control.Arrow        ( second )
 import Control.Monad        ( fmap )
+import Data.Char            ( isSpace )
 import Data.List            ( lines, unlines, isPrefixOf )
 import Data.Maybe           ( fromJust )
-import Network.Download     ( openURIString )
 import Numeric              ( readHex )
 import Parsimony
-import Parsimony.Char       ( char, hexDigit, spaces, tab )
+import Parsimony.Char       ( char, string, hexDigit, tab )
 import System.IO            ( FilePath, readFile )
 import System.USB.IDDB.Base
 import System.USB.IDDB.Misc ( eitherMaybe, swap, restOfLine )
 
-import qualified Data.IntMap as IM ( IntMap, fromList )
-import qualified Data.Map    as MP ( Map,    fromList )
-
+import qualified Data.IntMap as IM
+import qualified Data.Map    as MP
 
 -- |Construct a database from a string in the format used by
 -- <http://linux-usb.org>.
 parseDb :: String -> Maybe IDDB
-parseDb = eitherMaybe . parse dbParser . stripComments
-    where
-      stripComments :: String -> String
-      stripComments = unlines . filter (not . isPrefixOf "#") . lines
+parseDb = eitherMaybe . parse dbParser . stripBoring
 
+-- |Remove comments and empty lines.
+stripBoring :: String -> String
+stripBoring = unlines
+            . filter (\xs -> not (isComment xs) && not (isEmpty xs))
+            . lines
+
+isComment :: String -> Bool
+isComment = isPrefixOf "#"
+
+isEmpty :: String -> Bool
+isEmpty = all isSpace
+
 dbParser :: Parser String IDDB
-dbParser = do spaces
-              (vendorNameId, vendorIdName, productDB) <- lexeme vendorSection
-              classDB <- classSection
+dbParser = do (vendorNameId, vendorIdName, productDB) <- vendorSection
+              classDB <- genericSection (label "C") 2 id
+                         . genericSection tab 2 id
+                           . genericSection (count 2 tab) 2 fst
+                             $ return ()
+              at      <- simpleSection "AT" 4
+              hid     <- simpleSection "HID" 2
+              r       <- simpleSection "R" 2
+              bias    <- simpleSection "BIAS" 1
+              phy     <- simpleSection "PHY" 2
+              hut     <- genericSection (label "HUT") 2 id
+                         . genericSection tab 3 fst
+                           $ return ()
+              l       <- genericSection (label "L") 4 id
+                         . genericSection tab 2 fst
+                           $ return ()
+              hcc     <- simpleSection "HCC" 2
+              vt      <- simpleSection "VT" 4
 
               return IDDB { dbVendorNameId = vendorNameId
                           , dbVendorIdName = vendorIdName
                           , dbProducts     = productDB
                           , dbClasses      = classDB
+                          , dbAudioCTType  = at
+                          , dbVideoCTType  = vt
+                          , dbHIDDescType  = hid
+                          , dbHIDDescItem  = r
+                          , dbHIDDescCCode = hcc
+                          , dbHIDUsage     = hut
+                          , dbPhysDescBias = bias
+                          , dbPhysDescItem = phy
+                          , dbLanguages    = l
                           }
     where
-      lexeme :: Parser String a -> Parser String a
-      lexeme p = do x <- p
-                    spaces
-                    return x
-
       hexId :: Num n => Int -> Parser String n
       hexId d = do ds <- count d hexDigit
                    case readHex ds of
                      [(n, _)]  -> return n
                      _         -> error "impossible"
 
-      vendorSection :: Parser String ( MP.Map VendorName VendorID
-                                     , IM.IntMap VendorName
+      label :: String -> Parser String ()
+      label n = string n >> char ' ' >> return ()
+
+      -- Top level section without subsections.
+      simpleSection :: String -> Int -> Parser String (IM.IntMap String)
+      simpleSection sym idSize = genericSection (string sym >> char ' ')
+                                                idSize fst $ return ()
+
+      genericSection :: (Parser String p)
+                     -> Int
+                     -> ((String, s) -> r)
+                     -> Parser String s
+                     -> Parser String (IM.IntMap r)
+      genericSection prefix idSize convert =
+          fmap (IM.fromList . map (second convert))
+          . many . try . genericItem prefix idSize
+
+      genericItem :: (Parser String p)
+                  -> Int
+                  -> Parser String s
+                  -> Parser String (Int, (String, s))
+      genericItem prefix idSize sub = do
+          _        <- prefix
+          itemId   <- hexId idSize
+          _        <- count 2 $ char ' '
+          itemName <- restOfLine
+          s        <- sub
+          return (itemId, (itemName, s))
+
+      vendorSection :: Parser String ( MP.Map String Int
+                                     , IM.IntMap String
                                      , IM.IntMap ProductDB
                                      )
-      vendorSection = do xs <- lexeme $ many vendorParser
-                         return ( MP.fromList [(name, vid) | (vid, name, _)   <- xs]
-                                , IM.fromList [(vid, name) | (vid, name, _)   <- xs]
-                                , IM.fromList [(vid, pdb)  | (vid, _,    pdb) <- xs]
-                                )
+      vendorSection = do
+        xs <- many (try (vendorParser <?> "vendor"))
+        return ( MP.fromList [(name, vid) | (vid, name, _)   <- xs]
+               , IM.fromList [(vid, name) | (vid, name, _)   <- xs]
+               , IM.fromList [(vid, pdb)  | (vid, _,    pdb) <- xs]
+               )
 
-      vendorParser :: Parser String (VendorID, VendorName, ProductDB)
-      vendorParser = do vid  <- hexId 4
-                        count 2 $ char ' '
-                        name <- restOfLine
-                        products <- many productParser
-                        return ( vid
-                               , name
-                               , ( MP.fromList $ fmap swap products
-                                 , IM.fromList products
-                                 )
-                               )
+      vendorParser :: Parser String (Int, String, ProductDB)
+      vendorParser = do
+        vid      <- hexId 4
+        _        <- count 2 $ char ' '
+        name     <- restOfLine
+        products <- many (productParser <?> "product")
+        return ( vid
+               , name
+               , ( MP.fromList $ fmap swap products
+                 , IM.fromList products
+                 )
+               )
 
-      productParser :: Parser String (ProductID, ProductName)
-      productParser = do tab
+      productParser :: Parser String (Int, String)
+      productParser = do _    <- tab
                          pid  <- hexId 4
-                         count 2 $ char ' '
+                         _    <- count 2 $ char ' '
                          name <- restOfLine
                          return (pid, name)
 
-      classSection :: Parser String ClassDB
-      classSection = do xs <- lexeme $ many classParser
-                        return $ IM.fromList xs
-
-      classParser :: Parser String (ClassID, (ClassName, SubClassDB))
-      classParser = do char 'C'
-                       char ' '
-                       cid  <- hexId 2
-                       count 2 $ char ' '
-                       name <- restOfLine
-                       subClasses <- many subClassParser
-                       return ( cid
-                              , (name, IM.fromList subClasses)
-                              )
-
-      subClassParser :: Parser String (SubClassID, (SubClassName, ProtocolDB))
-      subClassParser = do tab
-                          scid <- hexId 2
-                          count 2 $ char ' '
-                          name <- restOfLine
-                          protocols <- many (try protocolParser)
-                          return ( scid
-                                 , (name, IM.fromList protocols)
-                                 )
-
-      protocolParser :: Parser String (ProtocolID, ProtocolName)
-      protocolParser = do count 2 tab
-                          protId <- hexId 2
-                          count 2 $ char ' '
-                          name <- restOfLine
-                          return (protId, name)
-
--- |Construct a database from the data available at
--- <http://linux-usb.org/usb.ids>.
-fromWeb :: IO (Maybe IDDB)
-fromWeb = fmap ( either (const Nothing)
-                        parseDb
-               ) $ openURIString dbURL
-
--- |Load a vendor database from file. If the file can not be read for
--- some reason an error will be thrown.
+-- |Load a database from file. If the file can not be read for some reason an
+-- error will be thrown.
 fromFile :: FilePath -> IO (Maybe IDDB)
 fromFile = fmap parseDb . readFile
 
@@ -127,9 +149,13 @@
 --  supplied with the package.
 staticDb :: IO IDDB
 staticDb = getDataFileName staticDbPath >>= fmap fromJust . fromFile
-
-staticDbPath :: FilePath
-staticDbPath = "usb_id_repo_db.txt"
+    where
+      staticDbPath :: FilePath
+      staticDbPath = "usb_id_repo_db.txt"
 
+-- |<http://linux-usb.org/usb.ids>
+--
+-- The source of the database. Download this file for the most up-to-date
+-- version.
 dbURL :: String
 dbURL = "http://linux-usb.org/usb.ids"
diff --git a/System/USB/IDDB/UsbDotOrg.hs b/System/USB/IDDB/UsbDotOrg.hs
--- a/System/USB/IDDB/UsbDotOrg.hs
+++ b/System/USB/IDDB/UsbDotOrg.hs
@@ -1,17 +1,18 @@
+{-| Functions to acquire a database from <http://www.usb.org>. -}
+
 module System.USB.IDDB.UsbDotOrg
     ( parseDb
     , staticDb
     , fromFile
-    , fromWeb
+    , dbURL
     ) where
 
 import Control.Monad        ( fmap )
 import Data.Maybe           ( fromJust )
-import Network.Download     ( openURIString )
 import Parsimony
 import Parsimony.Char       ( char, digit )
 import System.IO            ( FilePath, readFile )
-import System.USB.IDDB.Base ( IDDB(..), VendorID, VendorName
+import System.USB.IDDB.Base ( IDDB(..)
                             , getDataFileName
                             )
 import System.USB.IDDB.Misc ( eitherMaybe, swap, restOfLine )
@@ -25,14 +26,24 @@
 parseDb = eitherMaybe . parse staticDbParser
 
 staticDbParser :: Parser String IDDB
-staticDbParser = do vendors <- many vendorParser
-                    return IDDB { dbVendorNameId = MP.fromList $ fmap swap vendors
-                                , dbVendorIdName = IM.fromList vendors
-                                , dbProducts = IM.empty
-                                , dbClasses  = IM.empty
-                                }
+staticDbParser = do
+  vendors <- many vendorParser
+  return IDDB { dbVendorNameId = MP.fromList $ fmap swap vendors
+              , dbVendorIdName = IM.fromList vendors
+              , dbProducts     = IM.empty
+              , dbClasses      = IM.empty
+              , dbAudioCTType  = IM.empty
+              , dbVideoCTType  = IM.empty
+              , dbHIDDescType  = IM.empty
+              , dbHIDDescItem  = IM.empty
+              , dbHIDDescCCode = IM.empty
+              , dbHIDUsage     = IM.empty
+              , dbPhysDescBias = IM.empty
+              , dbPhysDescItem = IM.empty
+              , dbLanguages    = IM.empty
+              }
     where
-      vendorParser :: Parser String (VendorID, VendorName)
+      vendorParser :: Parser String (Int, String)
       vendorParser = do vid  <- many1 digit
                         char '|'
                         name <- restOfLine
@@ -43,24 +54,18 @@
 fromFile :: FilePath -> IO (Maybe IDDB)
 fromFile = fmap parseDb . readFile
 
--- |Construct a database from the list of companies available at
---  <http://www.usb.org/developers/tools/comp_dump>. The website
---  informs us that: /"Remember this list changes almost daily, be/
---  /sure to get a fresh copy when you use the tools"/. However, the
---  list seems to be quite stable. Using this function more than once
---  a day is probably overkill.
-fromWeb :: IO (Maybe IDDB)
-fromWeb = fmap ( either (const Nothing)
-                        parseDb
-               ) $ openURIString dbURL
-
 staticDbPath :: FilePath
 staticDbPath = "usb_dot_org_db.txt"
 
-dbURL :: String
-dbURL = "http://www.usb.org/developers/tools/comp_dump"
-
 -- |Load a database from a snapshot of the usb.org database which is
 --  supplied with the package.
 staticDb :: IO IDDB
 staticDb = getDataFileName staticDbPath >>= fmap fromJust . fromFile
+
+-- |<http://www.usb.org/developers/tools/comp_dump>
+--
+-- The source of the database. Download this file for the most up-to-date
+-- version.
+dbURL :: String
+dbURL = "http://www.usb.org/developers/tools/comp_dump"
+
diff --git a/example.hs b/example.hs
--- a/example.hs
+++ b/example.hs
@@ -26,12 +26,3 @@
           -- from the vendor with ID 0x1d6b.
           putStrLn $ maybe "unknown product name!" (printf "0x%04x")
                    $ productId db 0x1d6b "Audio Gadget"
-
-          putStrLn $ maybe "unknown class" id
-                   $ className db 0xe0
-
-          putStrLn $ maybe "unknown subclass" id
-                   $ subClassName db 0xe0 1
-
-          putStrLn $ maybe "unknown protocol" id
-                   $ protocolName db 0xe0 1 2
diff --git a/usb-id-database.cabal b/usb-id-database.cabal
--- a/usb-id-database.cabal
+++ b/usb-id-database.cabal
@@ -1,5 +1,5 @@
 name:          usb-id-database
-version:       0.3.0.1
+version:       0.4
 cabal-version: >=1.6
 build-type:    Simple
 stability:     provisional
@@ -11,8 +11,9 @@
 category:      System
 synopsis:      A database of USB identifiers
 description:
-  Functions to find the names associated with numerical vendor and
-  product identifiers.
+  Functions to find the names associated with various identifiers from the USB
+  specification. This is useful if you want to display full human-readable names
+  instead of cryptic numeric codes.
 
 extra-source-files: example.hs
 data-files: usb_dot_org_db.txt
@@ -28,10 +29,8 @@
 
 library
   build-depends: base        >= 3 && < 4.2
-               , binary      == 0.5.*
                , bytestring  == 0.9.*
                , containers  == 0.2.*
-               , download    == 0.3.*
                , parsimony   >= 1 && < 1.1
   ghc-options: -Wall
   cpp-options: -DBUILD_WITH_CABAL
diff --git a/usb_dot_org_db.txt b/usb_dot_org_db.txt
--- a/usb_dot_org_db.txt
+++ b/usb_dot_org_db.txt
@@ -19,7 +19,6 @@
 1060|SMSC
 1062|Integrated Device Technology
 1071|Molex Inc.
-1072|Fujitsu Component Limited
 1074|Unisys Corp.
 1080|Advanced Micro Devices
 1085|Lexmark International Inc.
@@ -230,7 +229,6 @@
 2554|Mtek Vision
 2578|Cambridge Silicon Radio Ltd.
 2580|Spacelabs Healthcare
-2582|Trek Technology (S) Pte Ltd
 2583|HOYA Corporation
 2593|Medtronic Physio Control Corp.
 2631|Hirose Electric
@@ -255,7 +253,6 @@
 2856|Kenwood Corporation
 2876|Olivetti S.p.A
 2894|Musical Electronics Ltd.
-2900|Sinbon Electronics Co., Ltd.
 2922|Maxim Integrated Products
 2965|ASIX Electronics Corporation
 2967|O2 Micro, Inc.
@@ -311,14 +308,12 @@
 3562|UTECH Electronic (D.G.) Co., Ltd.
 3607|Walex Electronic Ltd.
 3619|Liou Yuane International Ltd.
-3636|Micro Computer Control Corp.
 3641|Smart Modular Technologies, Inc.
 3642|Neostar Technology Co., Ltd.
 3675|Union Power Information Industrial Co., Ltd.
 3677|Neltron Industrial Co., Ltd.
 3690|Megawin Technology Co., Ltd.
 3698|Hsi-Chin Electronics Co., Ltd.
-3714|Ching Tai Electric Wire & Cable Co., Ltd.
 3715|Shin An Wire & Cable Co.
 3724|Well Force Electronic Co., Ltd
 3725|MediaTek Inc.
@@ -348,7 +343,6 @@
 4027|Bitwise Systems, Inc.
 4046|Sony Ericsson Mobile Communications AB
 4087|CHI SHING COMPUTER ACCESSORIES CO., LTD.
-4100|LG Electronics Inc.
 4134|Newly Corporation
 4168|Targus Group International
 4172|AMCO TEC International Inc.
@@ -388,6 +382,7 @@
 4716|Aristocrat Technologies
 4717|Bel Stewart
 4721|Foxda Technology Industrial (Shenzhen) Co., Ltd.
+4742|MARVELL SEMICONDUCTOR, INC.
 4756|RISO KAGAKU CORP.
 4779|Honey Bee Electronic International Ltd.
 4792|Zhejiang Xinya Electronic Technology Co., Ltd.
@@ -441,7 +436,6 @@
 5488|ALLTOP TECHNOLOGY CO., LTD.
 5499|Ketron SRL
 5510|Sitor Electronics (Shenzhen) Co., Ltd.
-5517|Oakley Inc.
 5528|Kunshan Guoji Electronics Co., Ltd.
 5538|Freescale Semiconductor, Inc.
 5546|Gearway Electronics (Dong Guan) Co., Ltd.
@@ -480,7 +474,6 @@
 6133|K.K. Rocky
 6134|Unicomp, Inc
 6193|Gwo Jinn Industries Co., Ltd.
-6194|Huizhou Shenghua Industrial Co., Ltd.
 6228|Memory Devices Ltd.
 6242|Teridian Semiconductor Corp.
 6257|Aveo Technology Corp.
@@ -502,7 +495,6 @@
 6537|Nuconn Technology Corp.
 6541|Fairchild Imaging
 6556|Richnex Microelectronics Corporation
-6568|Biforst Technology Inc.
 6607|Parrot SA
 6632|Industrial Technology Research Institute
 6639|Pak Heng Technology (Shenzhen) Co., Ltd.
@@ -559,9 +551,7 @@
 7329|Symwave, Inc.
 7347|Aces Electronic Co., Ltd.
 7348|OPEX CORPORATION
-7358|Texas Instruments - Stellaris
 7359|FORTAT SKYMARK INDUSTRIAL COMPANY
-7360|PlantSense
 7370|NextWave Broadband Inc.
 7390|Telecommunications Technology Association (TTA)
 7391|WonTen Technology Co., Ltd.
@@ -618,15 +608,7 @@
 7911|EPCOS
 7912|ONDA COMMUNICATION S.p.a.
 7913|PC PARTNER LIMITED
-7936|YUEQING ZHONGLI COMPUTER ELECTRONICS CO., LTD.
-7950|Inflexis Corporation
-7951|Action Technology (SZ) Co., Ltd.
-7952|LTW TECHNOLOGY CO., LTD.
-7953|VIRAGE LOGIC
-7954|Photometrics
 7958|Olidata SpA
-7965|How Weih Precision Metal (Shenzhen) Co., Ltd.
-7968|Shenzhen Tenwei Electronics Co., Ltd.
 7977|Analogix Semiconductor, Inc.
 7985|SASKEN COMMUNICATION TECH LTD.
 7989|Amphenol Shouh Min Industry
@@ -697,4 +679,7 @@
 8457|VIA Labs, Inc.
 8469|Alliance Material Co., Ltd.
 8470|KT Tech Inc.
+8492|Shenzhen Linoya Electronic Co., Ltd.
+8493|Dong Guan City Marubeni Electronic Co., Ltd.
+8494|Amphenol AssembleTech (Xiamen) Co., Ltd.
 8888|Motorola MDS
