diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -2,6 +2,20 @@
 50200.7.0
 =========
 
+API changes:
+ * Added a `WMUnknownEvent` constructor to the `WebsocketEventType` data
+   type to hold unknown event types to avoid parse failures for new
+   event types.
+ * Added `mmListCommandsForTeam` to get commands for a team and
+   implemented a JSON parser for the `Command` type.
+
+Package changes:
+ * Upgraded to HTTP 4000.3.15 to get an `Eq` instance fix for HTTP
+   header name comparisons.
+
+50200.7.0
+=========
+
  * Added `mmUpdateChannelNotifications` and fixed the JSON encoding of
    the `ChannelNotifyProps` type.
 
diff --git a/mattermost-api.cabal b/mattermost-api.cabal
--- a/mattermost-api.cabal
+++ b/mattermost-api.cabal
@@ -1,5 +1,5 @@
 name:                mattermost-api
-version:             50200.7.0
+version:             50200.8.0
 synopsis:            Client API for Mattermost chat system
 
 description:         Client API for Mattermost chat system.  Mattermost is a
@@ -11,9 +11,8 @@
 
 license:             BSD3
 license-file:        LICENSE
-author:              Jason Dagit
-maintainer:          dagitj@gmail.com
-copyright:           2016-2017 Jason Dagit, Getty Ritter, Jonathan Daugherty
+maintainer:          matterhorn@galois.com
+copyright:           2016-2020 Jason Dagit, Getty Ritter, Jonathan Daugherty
 category:            Web
 build-type:          Simple
 extra-doc-files:     README.md,
@@ -60,7 +59,9 @@
                      , binary >= 0.8.1
                      , bytestring
                      , process
-                     , HTTP
+                     -- We depend on this lower bound to get a fix for
+                     -- https://github.com/haskell/HTTP/issues/128
+                     , HTTP >= 4000.3.15
                      , http-media
                      , network-uri
                      , modern-uri
diff --git a/src/Network/Mattermost/Connection.hs b/src/Network/Mattermost/Connection.hs
--- a/src/Network/Mattermost/Connection.hs
+++ b/src/Network/Mattermost/Connection.hs
@@ -180,17 +180,8 @@
         Left _ ->
           throwIO (HTTPResponseException ("Server returned unexpected " ++ show code ++ " response"))
 
--- NOTE: At least as of HTTP-4000.3.14, custom header names are matched
--- case-sensitively when looking them up in responses. This is a bug
--- (reported at https://github.com/haskell/HTTP/issues/128) and in
--- the mean time we use our own header-matching implementation.
 findHeader :: HTTP.HeaderName -> [HTTP.Header] -> Maybe String
-findHeader n hs = HTTP.hdrValue <$> listToMaybe (filter (matchHeader n) hs)
-
-matchHeader :: HTTP.HeaderName -> HTTP.Header -> Bool
-matchHeader (HTTP.HdrCustom a) (HTTP.Header (HTTP.HdrCustom b) _) =
-    (toLower <$> a) == (toLower <$> b)
-matchHeader a (HTTP.Header b _) = a == b
+findHeader n hs = HTTP.hdrValue <$> listToMaybe (filter ((== n) . HTTP.hdrName) hs)
 
 rateLimitLimitHeader :: HTTP.HeaderName
 rateLimitLimitHeader = HTTP.HdrCustom "X-RateLimit-Limit"
diff --git a/src/Network/Mattermost/Endpoints.hs b/src/Network/Mattermost/Endpoints.hs
--- a/src/Network/Mattermost/Endpoints.hs
+++ b/src/Network/Mattermost/Endpoints.hs
@@ -333,11 +333,12 @@
 -- -- | List commands for a team.
 -- --
 -- --   /Permissions/: @manage_slash_commands@ if need list custom commands.
--- mmListCommandsForTeam :: TeamId -> Maybe Text -> Session -> IO (Seq Command)
--- mmListCommandsForTeam teamId customOnly =
---   inGet (printf "/commands?%s" (mkQueryString [ Just ("team_id", T.unpack (idString teamId)) , sequence ("custom_only", fmap T.unpack customOnly) ])) noBody jsonResponse
-
-
+mmListCommandsForTeam :: TeamId -> Bool -> Session -> IO (Seq Command)
+mmListCommandsForTeam teamId customOnly =
+    let pairs = [ Just ("team_id", T.unpack (idString teamId))
+                , Just ("custom_only", if customOnly then "true" else "false")
+                ]
+    in inGet (printf "/commands?%s" (mkQueryString pairs)) noBody jsonResponse
 
 -- * Compliance
 
diff --git a/src/Network/Mattermost/Types.hs b/src/Network/Mattermost/Types.hs
--- a/src/Network/Mattermost/Types.hs
+++ b/src/Network/Mattermost/Types.hs
@@ -985,13 +985,13 @@
 
 data Command
   = Command
-  { commandId               :: CommandId
-  , commandToken            :: Token
+  { commandId               :: Maybe CommandId
+  , commandToken            :: Text
   , commandCreateAt         :: ServerTime
   , commandUpdateAt         :: ServerTime
   , commandDeleteAt         :: ServerTime
-  , commandCreatorId        :: UserId
-  , commandTeamId           :: TeamId
+  , commandCreatorId        :: Maybe UserId
+  , commandTeamId           :: Maybe TeamId
   , commandTrigger          :: Text
   , commandMethod           :: Text
   , commandUsername         :: Text
@@ -1004,6 +1004,28 @@
   , commandURL              :: Text
   } deriving (Read, Show, Eq)
 
+instance A.FromJSON Command where
+    parseJSON = A.withObject "command" $ \o ->
+        Command <$> (maybeFail $ o A..: "id")
+                <*> o A..: "token"
+                <*> (timeFromServer <$> (o A..: "create_at"))
+                <*> (timeFromServer <$> (o A..: "update_at"))
+                <*> (timeFromServer <$> (o A..: "delete_at"))
+                <*> (maybeFail $ o A..: "creator_id")
+                <*> (maybeFail $ o A..: "team_id")
+                <*> o A..: "trigger"
+                <*> o A..: "method"
+                <*> o A..: "username"
+                <*> o A..: "icon_url"
+                <*> o A..: "auto_complete"
+                <*> o A..: "auto_complete_desc"
+                <*> o A..: "auto_complete_hint"
+                <*> o A..: "display_name"
+                <*> o A..: "description"
+                <*> o A..: "url"
+
+instance A.ToJSON Command where toJSON = error "to command"
+
 newtype CommandId = CmdI { unCmdI :: Id }
   deriving (Read, Show, Eq, Ord, Hashable, ToJSON, ToJSONKey, FromJSONKey, FromJSON)
 
@@ -1011,9 +1033,6 @@
   toId   = unCmdI
   fromId = CmdI
 
-instance HasId Command CommandId where
-  getId = commandId
-
 instance PrintfArg CommandId where
   formatArg = formatArg . idString
 
@@ -1351,8 +1370,6 @@
 
 instance A.ToJSON User where toJSON = error "to user"
 instance A.ToJSON Team where toJSON = error "to team"
-instance A.FromJSON Command where parseJSON = error "from command"
-instance A.ToJSON Command where toJSON = error "to command"
 
 
 -- --
diff --git a/src/Network/Mattermost/WebSocket/Types.hs b/src/Network/Mattermost/WebSocket/Types.hs
--- a/src/Network/Mattermost/WebSocket/Types.hs
+++ b/src/Network/Mattermost/WebSocket/Types.hs
@@ -76,6 +76,7 @@
   | WMPluginStatusesChanged
   | WMPluginEnabled
   | WMPluginDisabled
+  | WMUnknownEvent T.Text
   deriving (Read, Show, Eq, Ord)
 
 instance FromJSON WebsocketEventType where
@@ -113,7 +114,7 @@
     "plugin_statuses_changed" -> return WMPluginStatusesChanged
     "plugin_enabled"     -> return WMPluginEnabled
     "plugin_disabled"    -> return WMPluginDisabled
-    _                    -> fail ("Unknown websocket message: " ++ show s)
+    _                    -> return $ WMUnknownEvent s
 
 instance ToJSON WebsocketEventType where
   toJSON WMTyping                  = "typing"
@@ -149,6 +150,7 @@
   toJSON WMPluginStatusesChanged   = "plugin_statuses_changed"
   toJSON WMPluginEnabled           = "plugin_enabled"
   toJSON WMPluginDisabled          = "plugin_disabled"
+  toJSON (WMUnknownEvent s)        = toJSON s
 
 --
 
