diff --git a/Network/Wai/Util.hs b/Network/Wai/Util.hs
--- a/Network/Wai/Util.hs
+++ b/Network/Wai/Util.hs
@@ -19,11 +19,12 @@
 	stringHeaders,
 	stringHeaders',
 	responseToMailPart,
-	queryLookup
+	queryLookup,
+	queryLookupAll
 ) where
 
 import Data.Char (isAscii)
-import Data.Maybe (fromMaybe)
+import Data.Maybe (fromMaybe, mapMaybe)
 import Data.List (intercalate)
 import Data.Monoid (mappend, mempty)
 import Control.Monad (liftM2,join)
@@ -203,5 +204,14 @@
 	contentTypeName = fromString "Content-Type"
 
 -- | Lookup a given key in something that acts like a query
-queryLookup :: (QueryLike q, QueryKeyLike k) => q -> k -> Maybe Text
-queryLookup q k = fmap (T.decodeUtf8With lenientDecode) $ join $ lookup (toQueryKey k) (toQuery q)
+queryLookup :: (QueryLike q, QueryKeyLike k) => k -> q -> Maybe Text
+queryLookup k = fmap (T.decodeUtf8With lenientDecode) . join . lookup (toQueryKey k) . toQuery
+
+-- | Get all matches for a given key in something that acts like a query
+queryLookupAll :: (QueryLike q, QueryKeyLike k) => k -> q -> [Text]
+queryLookupAll k = map (T.decodeUtf8With lenientDecode) . mapMaybe f . toQuery
+	where
+	f (ik, mv)
+		| ik == k' = mv
+		| otherwise = Nothing
+	k' = toQueryKey k
diff --git a/wai-util.cabal b/wai-util.cabal
--- a/wai-util.cabal
+++ b/wai-util.cabal
@@ -1,5 +1,5 @@
 name:            wai-util
-version:         0.5
+version:         0.6
 cabal-version:   >= 1.8
 license:         OtherLicense
 license-file:    COPYING
