diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,18 @@
+
+40600.1.0
+=========
+
+API changes:
+ * The `UserSearch` type now wraps optional fields with `Maybe`. The
+   field types changed from `Text` to the appropriate ID type.
+ * Removed defunct `Network.Mattermost.Types.mkSession` function.
+ * Added an API endpoint function `mmGetUsersByIds` for getting users by
+   ID.
+
+Other changes:
+ * The `doRequest` function used by APIv4 endpoint functions now invokes
+   the connection's logger to log request method and URI.
+
 40600.0.0
 =========
 
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:             40600.0.0
+version:             40600.1.0
 synopsis:            Client API for Mattermost chat system
 description:         Client API for Mattermost chat system
 license:             BSD3
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
@@ -90,6 +90,7 @@
             ] ++ autoCloseToHeader (cdAutoClose cd)
           , HTTP.rqBody    = B.unpack payload
           }
+    runLogger cd "doRequest" (HttpRequest method uri Nothing)
     HTTP.simpleHTTP_ con request
   rsp <- hoistE (left ConnectionException rawResponse)
   case HTTP.rspCode rsp of
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
@@ -1463,12 +1463,12 @@
 -- mmGetUserByUsername username =
 --   inGet (printf "/users/username/%s" username) noBody jsonResponse
 
--- -- | Get a list of users based on a provided list of user ids.
--- --
--- --   /Permissions/: Requires an active session but no other permissions.
--- mmGetUsersByIds :: (Seq Text) -> Session -> IO (Seq User)
--- mmGetUsersByIds body =
---   inPost "/users/ids" (jsonBody body) jsonResponse
+-- | Get a list of users based on a provided list of user ids.
+--
+--   /Permissions/: Requires an active session but no other permissions.
+mmGetUsersByIds :: Seq UserId -> Session -> IO (Seq User)
+mmGetUsersByIds body =
+  inPost "/users/ids" (jsonBody body) jsonResponse
 
 -- -- | Attach a mobile device id to the currently logged in session. This
 -- --   will enable push notiofications for a user, if configured by the
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
@@ -93,11 +93,6 @@
   , sessTok  :: Token
   }
 
-mkSession :: ConnectionData -> Token -> Session
-mkSession = Session
-
---
-
 data Login
   = Login
   { username :: Text
@@ -1376,13 +1371,13 @@
     -- ^ When `true`, include deactivated users in the results
   , userSearchWithoutTeam :: Bool
     -- ^ Set this to `true` if you would like to search for users that are not on a team. This option takes precendence over `team_id`, `in_channel_id`, and `not_in_channel_id`.
-  , userSearchInChannelId :: Text
+  , userSearchInChannelId :: Maybe ChannelId
     -- ^ If provided, only search users in this channel
-  , userSearchNotInTeamId :: Text
+  , userSearchNotInTeamId :: Maybe TeamId
     -- ^ If provided, only search users not on this team
-  , userSearchNotInChannelId :: Text
+  , userSearchNotInChannelId :: Maybe ChannelId
     -- ^ If provided, only search users not in this channel. Must specifiy `team_id` when using this option
-  , userSearchTeamId :: Text
+  , userSearchTeamId :: Maybe TeamId
     -- ^ If provided, only search users on this team
   } deriving (Read, Show, Eq)
 
