diff --git a/Network/IRC/Client/Events.hs b/Network/IRC/Client/Events.hs
--- a/Network/IRC/Client/Events.hs
+++ b/Network/IRC/Client/Events.hs
@@ -55,10 +55,10 @@
 import           Data.Text                   (Text, breakOn, takeEnd, toUpper)
 import           Data.Time.Clock             (getCurrentTime)
 import           Data.Time.Format            (formatTime)
+import           Network.IRC.CTCP            (fromCTCP)
 import           Network.IRC.Conduit         (Event(..), Message(..),
                                               Source(..))
 import           Network.IRC.Conduit.Lens
-import           Network.IRC.CTCP            (fromCTCP)
 
 #if MIN_VERSION_time(1,5,0)
 import           Data.Time.Format            (defaultTimeLocale)
diff --git a/Network/IRC/Client/Internal.hs b/Network/IRC/Client/Internal.hs
--- a/Network/IRC/Client/Internal.hs
+++ b/Network/IRC/Client/Internal.hs
@@ -36,7 +36,7 @@
 import           Control.Monad.Catch               (SomeException, catch)
 import           Control.Monad.IO.Class            (MonadIO, liftIO)
 import           Control.Monad.Reader              (ask, runReaderT)
-import           Data.ByteString                   (ByteString)
+import           Data.ByteString                   (ByteString, isPrefixOf)
 import           Data.Conduit                      (ConduitM, await,
                                                     awaitForever, yield, (.|))
 import           Data.IORef                        (IORef, newIORef, readIORef,
@@ -130,7 +130,7 @@
 
   let source = sourceTBMChan squeue
                .| antiflood
-               .| logConduit (_logfunc cconf FromClient . toByteString)
+               .| logConduit (_logfunc cconf FromClient . toByteString . concealPass)
   let sink   = forgetful
                .| logConduit (_logfunc cconf FromServer . _raw)
                .| eventSink lastReceived state
@@ -230,6 +230,12 @@
 -- | Do no logging.
 noopLogger :: a -> b -> IO ()
 noopLogger _ _ = return ()
+
+-- | Clear passwords from logs.
+concealPass :: Message ByteString -> Message ByteString
+concealPass (RawMsg msg)
+  | "PASS " `isPrefixOf` msg = rawMessage "PASS" ["<password redacted>"]
+concealPass m = m
 
 
 -------------------------------------------------------------------------------
diff --git a/Network/IRC/Client/Utils.hs b/Network/IRC/Client/Utils.hs
--- a/Network/IRC/Client/Utils.hs
+++ b/Network/IRC/Client/Utils.hs
@@ -47,9 +47,9 @@
 import qualified Data.Set                    as S
 import           Data.Text                   (Text)
 import qualified Data.Text                   as T
+import           Network.IRC.CTCP            (toCTCP)
 import           Network.IRC.Conduit         (Event(..), Message(..),
                                               Source(..))
-import           Network.IRC.CTCP            (toCTCP)
 
 import           Network.IRC.Client.Internal
 import           Network.IRC.Client.Lens
diff --git a/irc-client.cabal b/irc-client.cabal
--- a/irc-client.cabal
+++ b/irc-client.cabal
@@ -10,7 +10,7 @@
 -- PVP summary:      +-+------- breaking API changes
 --                   | | +----- non-breaking API additions
 --                   | | | +--- code changes with no API change
-version:             1.1.2.0
+version:             1.1.2.1
 
 -- A short (one-line) description of the package.
 synopsis:            An IRC client library.
@@ -124,4 +124,4 @@
 source-repository this
   type:     git
   location: https://github.com/barrucadu/irc-client.git
-  tag:      1.1.2.0
+  tag:      1.1.2.1
