diff --git a/System/USB/IDDB.hs b/System/USB/IDDB.hs
--- a/System/USB/IDDB.hs
+++ b/System/USB/IDDB.hs
@@ -6,43 +6,46 @@
 Example usage:
 
 @
-import Data.ByteString.Char8 ('pack', 'unpack')
 import System.USB.IDDB
-import System.USB.IDDB.LinuxUsbIdRepo
-import Text.Printf
+import System.USB.IDDB.LinuxUsbIdRepo (staticDb)
+import Text.Printf (printf)
 
 main :: IO ()
 main = do -- Load a snapshot from the linux-usb.org database.
           db <- 'staticDb'
+@
+
+@
           -- Print the name of vendor 0x1d6b
-          'putStrLn' $ 'maybe' \"unknown VID!\" 'unpack'
+          putStrLn $ maybe \"unknown VID!\" id
                    $ 'vendorName' db 0x1d6b
 @
 
 @
           -- Print the ID of \"Linux Foundation\"
-          'putStrLn' $ 'maybe' \"unknown vendor name!\" ('printf' \"0x%04x\")
-                   $ 'vendorId' db ('pack' "Linux Foundation")
+          putStrLn $ maybe \"unknown vendor name!\" ('printf' \"0x%04x\")
+                   $ 'vendorId' db \"Linux Foundation\"
 @
 
 @
           -- Print the name of the product with ID 0x0101 from the
           -- vendor with ID 0x1d6b.
-          'putStrLn' $ 'maybe' \"unknown PID!\" 'unpack'
+          putStrLn $ maybe \"unknown PID!\" id
                    $ 'productName' db 0x1d6b 0x0101
 @
 
 @
           -- Print the ID of the product with the name \"Audio Gadget\"
           -- from the vendor with ID 0x1d6b.
-          'putStrLn' $ 'maybe' \"unknown product name!\" ('printf' \"0x%04x\")
-                   $ 'productId' db 0x1d6b ('pack' \"Audio Gadget\")
+          putStrLn $ maybe \"unknown product name!\" ('printf' \"0x%04x\")
+                   $ 'productId' db 0x1d6b \"Audio Gadget\"
 @
 -}
 module System.USB.IDDB
     ( -- *Types
       IDDB
 
+    , ID,         Name
     , VendorID,   VendorName
     , ProductID,  ProductName
     , ClassID,    ClassName
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,7 +3,8 @@
 module System.USB.IDDB.Base
     ( IDDB(..)
 
-    , VendorID,   VendorName,   VendorDB
+    , ID,         Name
+    , VendorID,   VendorName
     , ProductID,  ProductName,  ProductDB
     , ClassID,    ClassName,    ClassDB
     , SubClassID, SubClassName, SubClassDB
@@ -23,10 +24,10 @@
     )
     where
 
-import Data.ByteString (ByteString)
+import Data.Binary (Binary(..), Get)
 
-import qualified Data.Bimap as BM
-import qualified Data.Map   as MP
+import qualified Data.IntMap as IM
+import qualified Data.Map    as MP
 
 #ifdef BUILD_WITH_CABAL
 import Paths_usb_id_database (getDataFileName)
@@ -40,7 +41,7 @@
 -------------------------------------------------------------------------------
 
 type ID          = Int
-type Name        = ByteString
+type Name        = String
 
 type VendorID    = ID
 type ProductID   = ID
@@ -54,52 +55,77 @@
 type SubClassName = Name
 type ProtocolName = Name
 
-type VendorDB   = BM.Bimap VendorID VendorName
-type ProductDB  = BM.Bimap ProductID ProductName
-type ClassDB    = MP.Map ClassID (ClassName, SubClassDB)
-type SubClassDB = MP.Map SubClassID (SubClassName, ProtocolDB)
-type ProtocolDB = MP.Map ProtocolID ProtocolName
+type ProductDB  = ( MP.Map ProductName ProductID
+                  , IM.IntMap ProductName
+                  )
+type ClassDB    = IM.IntMap (ClassName, SubClassDB)
+type SubClassDB = IM.IntMap (SubClassName, ProtocolDB)
+type ProtocolDB = IM.IntMap ProtocolName
 
 -- |A database of USB identifiers. Contains both vendor identifiers
 -- and product identifiers.
-data IDDB = IDDB { dbVendors  :: VendorDB
-                 , dbProducts :: MP.Map VendorID ProductDB
-                 , dbClasses  :: ClassDB
+data IDDB = IDDB { dbVendorNameId :: MP.Map VendorName VendorID
+                 , dbVendorIdName :: IM.IntMap VendorName
+                 , dbProducts     :: IM.IntMap ProductDB
+                 , dbClasses      :: ClassDB
                  }
 
--- |An empty database./
+-- |An empty database.
 emptyDb :: IDDB
-emptyDb = IDDB { dbVendors  = BM.empty
-               , dbProducts = MP.empty
-               , dbClasses  = MP.empty
+emptyDb = IDDB { dbVendorNameId = MP.empty
+               , dbVendorIdName = IM.empty
+               , dbProducts     = IM.empty
+               , dbClasses      = 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 db vid = BM.lookup vid $ dbVendors db
+vendorName db vid = IM.lookup vid $ dbVendorIdName db
 
 vendorId :: IDDB -> VendorName -> Maybe VendorID
-vendorId db name = BM.lookupR name $ dbVendors db
+vendorId db name = MP.lookup name $ dbVendorNameId db
 
 productName :: IDDB -> VendorID -> ProductID -> Maybe ProductName
-productName db vid pid = BM.lookup pid =<< MP.lookup vid (dbProducts db)
+productName db vid pid = IM.lookup pid . snd =<< IM.lookup vid (dbProducts db)
 
 productId :: IDDB -> VendorID -> ProductName -> Maybe ProductID
-productId db vid name = BM.lookupR name =<< MP.lookup vid (dbProducts db)
+productId db vid name = MP.lookup name . fst =<< IM.lookup vid (dbProducts db)
 
 className :: IDDB -> ClassID -> Maybe ClassName
-className db cid = fmap fst $ MP.lookup cid $ dbClasses db
+className db cid = fmap fst . IM.lookup cid $ dbClasses db
 
 subClassName :: IDDB -> ClassID -> SubClassID -> Maybe SubClassName
-subClassName db cid scid = fmap fst $   MP.lookup scid . snd
-                                    =<< MP.lookup cid (dbClasses db)
+subClassName db cid scid = fmap fst $   IM.lookup scid . snd
+                                    =<< IM.lookup cid (dbClasses db)
 
 protocolName :: IDDB -> ClassID -> SubClassID -> ProtocolID -> Maybe ProtocolName
-protocolName db cid scid protId =   MP.lookup protId . snd
-                                =<< MP.lookup scid   . snd
-                                =<< MP.lookup cid (dbClasses db)
+protocolName db cid scid protId =   IM.lookup protId . snd
+                                =<< IM.lookup scid   . snd
+                                =<< IM.lookup cid (dbClasses 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
@@ -5,93 +5,89 @@
     , fromWeb
     ) where
 
-import Control.Monad        (liftM)
-import Data.Encoding        ( decodeStrictByteString
-                            , encodeStrictByteString
-                            )
+import Control.Monad        (fmap)
 import Data.Maybe           (fromJust)
-import Data.String.UTF8     (UTF8, fromRep)
-import Network.Download     (openURI)
+import Network.Download     (openURIString)
 import Numeric              (readHex)
 import Parsimony
 import Parsimony.Char       (char, hexDigit, spaces, tab)
-import System.IO            (FilePath)
+import System.IO            (FilePath, readFile)
 import System.USB.IDDB.Base
-import System.USB.IDDB.Misc (BSParser, eitherMaybe, restOfLine)
+import System.USB.IDDB.Misc (eitherMaybe, swap, restOfLine)
 
-import qualified Codec.Binary.UTF8.String as UTF8 (encode)
-import qualified Data.Bimap               as BM   (Bimap, fromList)
-import qualified Data.ByteString          as BS   (ByteString, pack, readFile)
-import qualified Data.Encoding.ISO88591   as Enc  (ISO88591(..))
-import qualified Data.Encoding.UTF8       as Enc  (UTF8(..))
-import qualified Data.Map                 as MP   (Map, fromList)
+import qualified Data.IntMap as IM (IntMap, fromList)
+import qualified Data.Map    as MP (Map,    fromList)
 
 
 -- |Construct a database from a string in the format used by
 -- <http://linux-usb.org>.
-parseDb :: UTF8 BS.ByteString -> Maybe IDDB
+parseDb :: String -> Maybe IDDB
 parseDb = eitherMaybe . parse dbParser
 
-dbParser :: BSParser IDDB
+dbParser :: Parser String IDDB
 dbParser = do spaces
               comments
-              (vendorDB, productDB) <- lexeme vendorSection
+              (vendorNameId, vendorIdName, productDB) <- lexeme vendorSection
               comments
               classDB <- classSection
 
-              return IDDB { dbVendors  = vendorDB
-                          , dbProducts = productDB
-                          , dbClasses  = classDB
+              return IDDB { dbVendorNameId = vendorNameId
+                          , dbVendorIdName = vendorIdName
+                          , dbProducts     = productDB
+                          , dbClasses      = classDB
                           }
     where
-      utf8BS :: String -> BS.ByteString
-      utf8BS = BS.pack . UTF8.encode
-
-      lexeme :: BSParser a -> BSParser a
+      lexeme :: Parser String a -> Parser String a
       lexeme p = do x <- p
                     spaces
                     return x
 
-      comment :: BSParser String
+      comment :: Parser String String
       comment = char '#' >> restOfLine
 
-      comments :: BSParser [String]
+      comments :: Parser String [String]
       comments = many $ lexeme comment
 
-      hexId :: Num n => Int -> BSParser n
+      hexId :: Num n => Int -> Parser String n
       hexId d = do ds <- count d hexDigit
                    case readHex ds of
                      [(n, _)]  -> return n
                      _         -> error "impossible"
 
-      vendorSection :: BSParser (VendorDB, MP.Map VendorID ProductDB)
+      vendorSection :: Parser String ( MP.Map VendorName VendorID
+                                     , IM.IntMap VendorName
+                                     , IM.IntMap ProductDB
+                                     )
       vendorSection = do xs <- lexeme $ many vendorParser
-                         return ( BM.fromList [(vid, name) | (vid, name, _)   <- xs]
-                                , MP.fromList [(vid, pdb)  | (vid, _,    pdb) <- xs]
+                         return ( MP.fromList [(name, vid) | (vid, name, _)   <- xs]
+                                , IM.fromList [(vid, name) | (vid, name, _)   <- xs]
+                                , IM.fromList [(vid, pdb)  | (vid, _,    pdb) <- xs]
                                 )
 
-      vendorParser :: BSParser (VendorID, VendorName, BM.Bimap ProductID ProductName)
+      vendorParser :: Parser String (VendorID, VendorName, ProductDB)
       vendorParser = do vid  <- hexId 4
                         count 2 $ char ' '
                         name <- restOfLine
                         products <- many productParser
                         return ( vid
-                               , utf8BS name
-                               , BM.fromList products
+                               , name
+                               , ( MP.fromList $ fmap swap products
+                                 , IM.fromList products
+                                 )
                                )
 
-      productParser :: BSParser (ProductID, ProductName)
+      productParser :: Parser String (ProductID, ProductName)
       productParser = do tab
                          pid  <- hexId 4
                          count 2 $ char ' '
                          name <- restOfLine
-                         return (pid, utf8BS name)
+                         return (pid, name)
 
-      classSection :: BSParser ClassDB
+      classSection :: Parser String ClassDB
       classSection = do xs <- lexeme $ many classParser
-                        return $ MP.fromList xs
+                        return $ IM.fromList xs
 
-      classParser :: BSParser (ClassID, (ClassName, SubClassDB))
+      classParser :: Parser String (ClassID, (ClassName, SubClassDB))
       classParser = do char 'C'
                        char ' '
                        cid  <- hexId 2
@@ -99,42 +95,42 @@
                        name <- restOfLine
                        subClasses <- many subClassParser
                        return ( cid
-                              , (utf8BS name, MP.fromList subClasses)
+                              , (name, IM.fromList subClasses)
                               )
 
-      subClassParser :: BSParser (SubClassID, (SubClassName, ProtocolDB))
+      subClassParser :: Parser String (SubClassID, (SubClassName, ProtocolDB))
       subClassParser = do tab
                           scid <- hexId 2
                           count 2 $ char ' '
                           name <- restOfLine
                           protocols <- many (try protocolParser)
                           return ( scid
-                                 , (utf8BS name, MP.fromList protocols)
+                                 , (name, IM.fromList protocols)
                                  )
 
-      protocolParser :: BSParser (ProtocolID, ProtocolName)
+      protocolParser :: Parser String (ProtocolID, ProtocolName)
       protocolParser = do count 2 tab
                           protId <- hexId 2
                           count 2 $ char ' '
                           name <- restOfLine
-                          return (protId, utf8BS name)
+                          return (protId, name)
 
 -- |Construct a database from the data available at
 -- <http://linux-usb.org/usb.ids>.
 fromWeb :: IO (Maybe IDDB)
-fromWeb = liftM ( either (const Nothing)
-                                    (parseDb . fromRep . iso88591_to_utf8)
-                           ) $ openURI dbURL
+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.
 fromFile :: FilePath -> IO (Maybe IDDB)
-fromFile = liftM (parseDb . fromRep . iso88591_to_utf8) . BS.readFile
-
-iso88591_to_utf8 :: BS.ByteString -> BS.ByteString
-iso88591_to_utf8 = encodeStrictByteString Enc.UTF8
-                 . decodeStrictByteString Enc.ISO88591
+fromFile = fmap parseDb . readFile
 
+-- |Load a database from a snapshot of the linux-usb.org database which is
+--  supplied with the package.
 staticDb :: IO IDDB
-staticDb = getDataFileName staticDbPath >>= liftM fromJust . fromFile
+staticDb = getDataFileName staticDbPath >>= fmap fromJust . fromFile
 
 staticDbPath :: FilePath
 staticDbPath = "usb_id_repo_db.txt"
diff --git a/System/USB/IDDB/Misc.hs b/System/USB/IDDB/Misc.hs
--- a/System/USB/IDDB/Misc.hs
+++ b/System/USB/IDDB/Misc.hs
@@ -1,20 +1,19 @@
 module System.USB.IDDB.Misc
-    ( BSParser
-    , eitherMaybe
+    ( eitherMaybe
+    , swap
     , restOfLine
     ) where
 
-import Data.ByteString  (ByteString)
-import Data.String.UTF8 (UTF8)
 import Parsimony        (Parser, manyTill)
 import Parsimony.Char   (anyChar, newline)
 
 
-type BSParser = Parser (UTF8 ByteString)
-
-
 eitherMaybe :: Either e a -> Maybe a
 eitherMaybe = either (const Nothing) Just
 
-restOfLine :: BSParser String
+swap :: (a, b) -> (b, a)
+swap = uncurry $ flip (,)
+
+restOfLine :: Parser String String
 restOfLine = manyTill anyChar newline
+
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
@@ -5,46 +5,47 @@
     , fromWeb
     ) where
 
-import Control.Monad        (liftM)
+import Control.Monad        (fmap)
 import Data.Maybe           (fromJust)
-import Data.String.UTF8     (UTF8, fromRep)
-import Network.Download     (openURI)
+import Network.Download     (openURIString)
 import Parsimony
 import Parsimony.Char       (char, digit)
-import System.IO            (FilePath)
+import System.IO            (FilePath, readFile)
 import System.USB.IDDB.Base ( IDDB(..)
                             , VendorID, VendorName
                             , getDataFileName
                             )
-import System.USB.IDDB.Misc (BSParser, eitherMaybe, restOfLine)
+import System.USB.IDDB.Misc ( eitherMaybe
+                            , swap
+                            , restOfLine
+                            )
 
-import qualified Codec.Binary.UTF8.String as UTF8 (encode)
-import qualified Data.Bimap               as BM   (fromList)
-import qualified Data.ByteString          as BS   (ByteString, pack, readFile)
-import qualified Data.Map                 as MP   (empty)
+import qualified Data.IntMap as IM (fromList, empty)
+import qualified Data.Map    as MP (fromList)
 
 
 -- |Construct a database from a string in the format used by usb.org.
-parseDb :: UTF8 BS.ByteString -> Maybe IDDB
+parseDb :: String -> Maybe IDDB
 parseDb = eitherMaybe . parse staticDbParser
 
-staticDbParser :: BSParser IDDB
+staticDbParser :: Parser String IDDB
 staticDbParser = do vendors <- many vendorParser
-                    return IDDB { dbVendors  = BM.fromList vendors
-                                , dbProducts = MP.empty
-                                , dbClasses  = MP.empty
+                    return IDDB { dbVendorNameId = MP.fromList $ fmap swap vendors
+                                , dbVendorIdName = IM.fromList vendors
+                                , dbProducts = IM.empty
+                                , dbClasses  = IM.empty
                                 }
     where
-      vendorParser :: BSParser (VendorID, VendorName)
+      vendorParser :: Parser String (VendorID, VendorName)
       vendorParser = do vid  <- many1 digit
                         char '|'
                         name <- restOfLine
-                        return (read vid, BS.pack $ UTF8.encode name)
+                        return (read vid, name)
 
 -- |Load a vendor database from file. If the file can not be read for
 --  some reason an error will be thrown.
 fromFile :: FilePath -> IO (Maybe IDDB)
-fromFile = liftM (parseDb . fromRep) . BS.readFile
+fromFile = fmap parseDb . readFile
 
 -- |Construct a database from the list of companies available at
 --  <http://www.usb.org/developers/tools/comp_dump>. The website
@@ -53,9 +54,9 @@
 --  list seems to be quite stable. Using this function more than once
 --  a day is probably overkill.
 fromWeb :: IO (Maybe IDDB)
-fromWeb = liftM ( either (const Nothing)
-                                     (parseDb . fromRep)
-                            ) $ openURI dbURL
+fromWeb = fmap ( either (const Nothing)
+                        parseDb
+               ) $ openURIString dbURL
 
 staticDbPath :: FilePath
 staticDbPath = "usb_dot_org_db.txt"
@@ -66,4 +67,4 @@
 -- |Load a database from a snapshot of the usb.org database which is
 --  supplied with the package.
 staticDb :: IO IDDB
-staticDb = getDataFileName staticDbPath >>= liftM fromJust . fromFile
+staticDb = getDataFileName staticDbPath >>= fmap fromJust . fromFile
diff --git a/example.hs b/example.hs
--- a/example.hs
+++ b/example.hs
@@ -1,9 +1,8 @@
 module Main where
 
-import Data.ByteString.Char8 (pack, unpack)
 import System.USB.IDDB
-import System.USB.IDDB.LinuxUsbIdRepo
-import Text.Printf
+import System.USB.IDDB.LinuxUsbIdRepo (staticDb)
+import Text.Printf (printf)
 
 
 main :: IO ()
@@ -11,19 +10,19 @@
           db <- staticDb
 
           -- Print the name of vendor 0x1d6b
-          putStrLn $ maybe "unknown VID!" unpack
+          putStrLn $ maybe "unknown VID!" id
                    $ vendorName db 0x1d6b
 
           -- Print the ID of "Linux Foundation"
           putStrLn $ maybe "unknown vendor name!" (printf "0x%04x")
-                   $ vendorId db (pack "Linux Foundation")
+                   $ vendorId db "Linux Foundation"
 
           -- Print the name of the product with ID 0x0101 from the
           -- vendor with ID 0x1d6b.
-          putStrLn $ maybe "unknown PID!" unpack
+          putStrLn $ maybe "unknown PID!" id
                    $ productName db 0x1d6b 0x0101
 
           -- Print the ID of the product with the name "Audio Gadget"
           -- from the vendor with ID 0x1d6b.
           putStrLn $ maybe "unknown product name!" (printf "0x%04x")
-                   $ productId db 0x1d6b (pack "Audio Gadget")
+                   $ productId db 0x1d6b "Audio Gadget"
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.2.1
+version:       0.3
 cabal-version: >=1.6
 build-type:    Simple
 stability:     provisional
@@ -22,15 +22,17 @@
   description: Build an example program
   default:     False
 
+flag profile-example
+  description: Enable profiling for the example program
+  default:     False
+
 library
-  build-depends: base        >= 3     && < 4.2
-               , bimap       >= 0.2   && < 0.3
-               , bytestring  >= 0.9   && < 1.0
-               , containers  >= 0.2   && < 0.3
-               , download    >= 0.3   && < 0.4
-               , encoding    >= 0.6.2 && < 0.7
-               , parsimony   >= 1     && < 1.1
-               , utf8-string >= 0.3.5 && < 0.4
+  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
   exposed-modules: System.USB.IDDB
@@ -42,10 +44,15 @@
 
 executable example
   extensions: CPP
-  ghc-options: -Wall
   cpp-options: -DBUILD_WITH_CABAL
   main-is: example.hs
+
   if flag(example)
     buildable: True
   else
     buildable: False
+
+  if flag(profile-example)
+    ghc-options: -Wall -prof -auto-all -caf-all -fforce-recomp
+  else
+    ghc-options: -Wall
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
@@ -1,4 +1,3 @@
-1|Kavi-EVAL
 1003|Atmel Corporation
 1006|Mitsumi
 1008|Hewlett Packard
@@ -182,9 +181,11 @@
 1975|TIME Interconnect Ltd.
 1988|Datafab Systems Inc.
 1994|AVerMedia Technologies, Inc.
+1996|Carry Computer Eng., Co., Ltd.
 1999|Casio Computer Co., Ltd.
 2001|D-Link Corp.
 2010|Arasan Chip Systems Inc.
+2015|David Electronics Company, Ltd.
 2038|Circuit Assembly Corp.
 2039|Century Corporation
 2041|Dotop Technology, Inc.
@@ -201,11 +202,11 @@
 2247|TAI TWUN ENTERPRISE CO., LTD.
 2276|Pioneer Corporation
 2278|Gemalto SA
-2288|CardScan Inc.
 2297|Wipro Technologies
 2310|FARADAY Technology Corp.
 2313|Audio-Technica Corp.
 2316|Silicon Motion, Inc. - Taiwan
+2334|Garmin International
 2338|Dymo Corporation
 2352|Toshiba Corporation
 2362|Pixart Imaging, Inc.
@@ -218,7 +219,6 @@
 2395|Medialogic Corporation
 2438|Panasonic Electric Works Co., Ltd.
 2468|Contech Research, Inc.
-2472|Lin Shiung Enterprise Co., Ltd.
 2475|Japan Cash Machine Co., Ltd.
 2497|ARRIS International
 2498|NISCA Corporation
@@ -260,6 +260,7 @@
 2965|ASIX Electronics Corporation
 2967|O2 Micro, Inc.
 2996|HTC Corporation
+3010|Seagate Technology LLC
 3034|Realtek Semiconductor Corp.
 3035|Ericsson AB
 3044|Elka International Ltd.
@@ -289,18 +290,18 @@
 3351|NALTEC, Inc.
 3353|Hank Connection Industrial Co., Ltd.
 3388|SRI CABLE TECHNOLOGY LTD.
-3393|Ta Yun Terminals Industrial Co., Ltd.
+3393|Ta Yun Electronic Technology Co., Ltd.
 3402|NF Corporation
 3403|Grape Systems Inc.
 3409|Volex (Asia) Pte Ltd
 3413|ASKA Technologies Inc.
 3425|MEILU ELECTRONICS (SHENZHEN) CO., LTD.
 3426|Darfon Electronics Corp.
-3450|MARX CryptoTech LP
 3452|Taiwan Line Tek Electronic Co., Ltd.
 3463|Dolby Laboratories Inc.
 3468|C-MEDIA ELECTRONICS INC.
 3471|Pitney Bowes
+3484|Chee Chen Hi-Technology Co., Ltd.
 3495|IOGEAR, Inc.
 3524|Macpower & Tytech Technology Co., LTD.
 3525|SDK Co, Ltd.
@@ -344,11 +345,13 @@
 4016|Haurtian Wire & Cable Co., Ltd.
 4024|Wistron Corporation
 4026|SAN SHING ELECTRONICS CO., LTD..
+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.
 4183|ON Semiconductor
 4184|Western Digital Technologies, Inc.
 4185|Giesecke & Devrient GmbH
@@ -388,7 +391,6 @@
 4756|RISO KAGAKU CORP.
 4779|Honey Bee Electronic International Ltd.
 4792|Zhejiang Xinya Electronic Technology Co., Ltd.
-4813|Cables Unlimited
 4818|LINE TECH INDUSTRIAL CO., LTD.
 4823|Better Holdings (HK) Limited
 4907|Konica Minolta Holdings, Inc.
@@ -429,6 +431,7 @@
 5377|Pine-Tum Enterprise Co., Ltd.
 5398|Skymedi Corporation
 5404|VeriSilicon Holdings Co., Ltd.
+5421|JMicron Technology Corp.
 5422|HLDS (Hitachi-LG Data Storage, Inc.)
 5440|Phihong Technology Co., Ltd.
 5451|PNY Technologies Inc.
@@ -490,7 +493,6 @@
 6397|FineArch Inc.
 6420|Alco Digital Devices Limited
 6421|Nordic Semiconductor ASA
-6447|Avago Technologies, Pte.
 6448|Shenzhen Xianhe Technology Co., Ltd.
 6449|Ningbo Broad Telecommunication Co., Ltd.
 6473|Lab126
@@ -505,7 +507,6 @@
 6632|Industrial Technology Research Institute
 6639|Pak Heng Technology (Shenzhen) Co., Ltd.
 6666|USB-IF non-workshop
-6693|Amphenol East Asia Ltd.
 6709|Astec Power, a division of Emerson Network Power
 6710|Biwin Technology Ltd.
 6720|TERMINUS TECHNOLOGY INC.
@@ -518,7 +519,7 @@
 6779|Lumberg Connect  GmbH
 6795|SGS Taiwan Ltd.
 6808|Leica Camera AG
-6821|UBeacon Technologies, Inc.
+6809|Asia Tai Technology (Dongguan) Co., Ltd.
 6822|eFortune Technology Corp.
 6830|Johnson Component & Equipments Co., Ltd.
 6859|Salcomp Plc
@@ -531,6 +532,7 @@
 6946|WiLinx Corp.
 6962|Ugobe, Inc.
 6984|Plastron Precision Co., Ltd.
+7001|K.S. Terminals Inc.
 7002|Chao Zhou Kai Yuan Electric Co., Ltd.
 7013|The Hong Kong Standards and Testing Centre Ltd.
 7046|Dongguan Guanshang Electronics Co., Ltd.
@@ -548,16 +550,16 @@
 7184|Lanterra Industrial Co., Ltd.
 7202|ZHONGSHAN CHIANG YU ELECTRIC CO., LTD.
 7207|SHENZHEN D&S INDUSTRIES LIMITED
+7217|LS Mtron
 7229|NONIN MEDICAL INC.
 7275|Philips & Lite-ON Digital Solutions Corporation
 7288|Mindray DS USA, Inc.
-7291|LUXSHARE PRECISION INDUSTRY (SHENZHEN) CO., LTD.
 7310|ASTRON INTERNATIONAL CORP.
 7320|ALPINE ELECTRONICS, INC.
 7329|Symwave, Inc.
 7347|Aces Electronic Co., Ltd.
 7348|OPEX CORPORATION
-7358|Luminary Micro Inc.
+7358|Texas Instruments - Stellaris
 7359|FORTAT SKYMARK INDUSTRIAL COMPANY
 7360|PlantSense
 7370|NextWave Broadband Inc.
@@ -572,6 +574,7 @@
 7490|DRAGON JOY LIMITED
 7491|Montage Technology, Inc.
 7493|Qisda Corporation
+7496|Shenzhen XinYonghui Precise Technology Co., Ltd.
 7497|SHENZHEN LINKCONN ELECTRONICS CO., LTD.
 7501|Pegatron Corporation
 7502|INPHI CORPORATION
@@ -612,12 +615,9 @@
 7863|WIN WIN PRECISION INDUSTRIAL CO., LTD.
 7881|MOSER BAER INDIA LIMITED
 7899|BLACKMAGIC DESIGN PTY.
-7910|SHENZHEN EVERWIN PRECISION TECHNOLOGY CO., LTD.
 7911|EPCOS
 7912|ONDA COMMUNICATION S.p.a.
 7913|PC PARTNER LIMITED
-7923|JIANGXI SHIP ELECTRONICS CO., LTD.
-7924|TATA ELXSI LTD.
 7936|YUEQING ZHONGLI COMPUTER ELECTRONICS CO., LTD.
 7950|Inflexis Corporation
 7951|Action Technology (SZ) Co., Ltd.
@@ -694,4 +694,7 @@
 8439|SOFTHARD Technology Ltd.
 8446|Elektrobit Inc.
 8448|RT Systems Inc.
+8457|VIA Labs, Inc.
+8469|Alliance Material Co., Ltd.
+8470|KT Tech Inc.
 8888|Motorola MDS
diff --git a/usb_id_repo_db.txt b/usb_id_repo_db.txt
--- a/usb_id_repo_db.txt
+++ b/usb_id_repo_db.txt
@@ -9,8 +9,8 @@
 #	The latest version can be obtained from
 #		http://www.linux-usb.org/usb.ids
 #
-# Version: 2009.08.25
-# Date:    2009-08-25 20:34:02
+# Version: 2009.09.17
+# Date:    2009-09-17 20:34:02
 #
 
 # Vendors, devices and interfaces. Please keep sorted.
@@ -870,6 +870,7 @@
 	00d8  WLI-U2-SG54HP
 	00d9  WLI-U2-G54HP
 	00da  WLI-U2-KG54L 802.11bg
+	0157  Buffalo External Hard Drive HD-PEU2
 0412  Award Software International
 0413  Leadtek Research, Inc.
 	1310  WinFast TV - NTSC + FM
@@ -1957,6 +1958,7 @@
 	0a02  Premium Stereo USB Headset 350
 	0a03  Logitech USB Microphone
 	0a04  V20 portable speakers (USB powered)
+	0a13  Z-5 Speakers
 	0b02  BT Mini-Receiver (HID proxy mode)
 	8801  Video Camera
 	b305  BT Mini-Receiver
@@ -2680,6 +2682,7 @@
 	10a8  iP6220D
 	10a9  iP6600D
 	10b6  PIXMA iP4300 Printer
+	10c2  PIXMA iP1800 Printer
 	1404  W6400PG
 	1405  W8400PG
 	150f  BIJ2350 PCL
@@ -4040,6 +4043,7 @@
 	0004  Direct Connect
 	0012  F8T012 Bluetooth Adapter
 	0013  F8T013 Bluetooth Adapter
+	0017  B8T017 Bluetooth+EDR 2.1
 	0050  F5D6050 802.11b Wireless Adapter
 	0081  F8T001v2 Bluetooth
 	0083  Bluetooth Device
@@ -4563,6 +4567,7 @@
 	0010  Graphire
 	0011  Graphire 2
 	0013  Graphire 3 4x5
+	0017  Bamboo Fun
 	0020  Intuos 4x5
 	0021  Intuos 6x8
 	0022  Intuos 9x12
@@ -4994,6 +4999,7 @@
 	017c  HDD/1394B
 	0251  Optical
 	0252  Optical
+	0470  Prestige Portable Hard Drive
 	1052  DVD+RW External Drive
 059c  A-Trend Technology Co., Ltd
 059d  Advanced Input Devices
@@ -5670,6 +5676,7 @@
 0642  VIA Medical Corp.
 0644  TEAC Corp.
 	0000  Floppy
+	0200  All-In-One Multi-Card Reader CA200/B/S
 	1000  CD-ROM Drive
 	800d  TASCAM Portastudio DP-01FX
 	d001  CD-R/RW Unit
@@ -5694,7 +5701,9 @@
 064e  Suyin Corp.
 	a100  Acer OrbiCam
 	a101  Acer CrystalEye Webcam
+	a102  Lenovo Webcam
 	a110  HP Webcam
+	c107  HP webcam [dv6-1190en]
 	d101  Acer CrystalEye Webcam
 064f  WIBU-Systems AG
 	0bd7  BOX/U
@@ -7018,6 +7027,7 @@
 	0002  AVerTV PVR USB/EZMaker Pro Device
 	0026  AVerTV
 	1228  MPEG-2 Capture Device (M038)
+	a309  HP DVB-T TV Tuner [HP dv6-1190en]
 	e880  MPEG-2 Capture Device (E880)
 	e882  MPEG-2 Capture Device (E882)
 07cb  Kingmax Technology, Inc.
@@ -7164,6 +7174,7 @@
 	0002  Cash Drawer I/F
 07ef  STSN
 	0001  Internet Access Device
+07f2  Microcomputer Applications, Inc.
 07f6  Circuit Assembly Corp.
 07f7  Century Corp.
 	0005  ScanLogic/Century Corporation uATA
@@ -7618,6 +7629,7 @@
 	0030  TravelDrive
 	0822  TravelDrive 2C
 	0832  Hi-Speed Mass Storage Device
+	0834  M-Disk 220
 	0998  Kingston Data Traveler2.0 Disk Driver
 	0999  Kingston Data Traveler2.0 Disk Driver
 	1000  TravelDrive 2C
@@ -8266,6 +8278,7 @@
 	2123  Bluetooth dongle
 	2130  2045 Bluetooth 2.0 USB-UHE Device with trace filter
 	2131  2045 Bluetooth 2.0 Device with trace filter
+	2150  BCM2046 Bluetooth Device
 	4500  BCM2046B1 USB 2.0 Hub (part of BCM2046 Bluetooth)
 	4502  Keyboard (Boot Interface Subclass)
 	5800  BCM5880 Secure Applications Processor
@@ -8893,7 +8906,7 @@
 	0153  Mass Storage Device
 	0156  Mass Storage Device
 	0157  Mass Storage Device
-	0158  Mass Storage Device
+	0158  USB 2.0 multicard reader
 	0161  Mass Storage Device
 	0168  Mass Storage Device
 	0169  Mass Storage Device
@@ -9726,6 +9739,7 @@
 	0004  Virtual CCID
 	0005  Virtual Mass Storage
 	0006  Virtual Keyboard
+	f80a  Smoker FX2
 0e16  JMTek, LLC
 0e17  Walex Electronic, Ltd
 0e1b  Crewave
@@ -10638,6 +10652,8 @@
 134e  Digby's Bitpile, Inc. DBA D Bit
 1357  P&E Microcomputer Systems
 	0503  USB-ML-12 HCS08/HCS12 Multilink
+1366  SEGGER
+	0101  J-Link ARM
 136b  STEC
 1370  Swissbit
 	0323  Swissmemory cirrusWHITE
@@ -11235,6 +11251,8 @@
 1772  System Level Solutions, Inc.
 1776  Arowana
 	501c  300K CMOS Camera
+177f  Sweex
+	0313  LW313 802.11n Adapter [ralink rt2770 + rt2720]
 1781  Multiple Vendors
 	083e  MetaGeek Wi-Spy
 	0938  Iguanaworks USB IR Transceiver
@@ -11362,6 +11380,7 @@
 19d2  ONDA Communication S.p.A.
 	0002  ET502HS/MT505UP ZTE MF632
 	0031  ZTE MF636
+	0064  ZTE MF627 AU
 	2000  ZTE MF627/MF628/MF628+ HSDPA
 19e1  WeiDuan Electronic Accessory (S.Z.) Co., Ltd.
 19e8  Industrial Technology Research Institute
@@ -11552,6 +11571,7 @@
 1bc5  AVIXE Technology (China) Ltd.
 1bce  Contac Cable Industrial Limited
 1bcf  Sunplus Innovation Technology Inc.
+	0007  Optical Mouse
 1bd0  Hangzhou Riyue Electronic Co., Ltd.
 1bde  P-TWO INDUSTRIES, INC.
 1bef  Shenzhen Tongyuan Network-Communication Cables Co., Ltd
@@ -11637,6 +11657,7 @@
 1e68  TrekStor GmbH & Co. KG
 	001b  DataStation maxi g.u
 1ebb  NuCORE Technology, Inc.
+1f28  Cal-Comp
 2001  D-Link Corp. [hex]
 	0001  DWL-120 WIRELESS ADAPTER
 	0201  DHN-120 10Mb Home Phoneline Adapter
@@ -11720,6 +11741,8 @@
 2222  MacAlly
 	0004  iWebKey Keyboard
 	4050  AirStick joystick
+2227  SAMWOO Enterprise
+	3105  SKYDATA SKD-U100
 2233  RadioShack Corporation
 	6323  USB Electronic Scale
 22b8  Motorola PCS
@@ -12198,6 +12221,9 @@
 	2000  Flashdisk
 9016  Sitecom
 	182d  WL-022 802.11b Adapter
+9148  GeoLab, Ltd
+# All of GeoLab's devices share the same ID 0004.
+	0004  R3 Compatible Device
 9710  MosChip Semiconductor
 	7703  MCS7703 Serial Port Adapter
 	7705  Printer cable
