diff --git a/Kevin/IRC/Protocol/Send.hs b/Kevin/IRC/Protocol/Send.hs
--- a/Kevin/IRC/Protocol/Send.hs
+++ b/Kevin/IRC/Protocol/Send.hs
@@ -65,10 +65,16 @@
     where mode = levelToMode m
 
 sendChangeUserMode us rm old new = unless (oldMode == newMode) $
-    sendPacket $ printf "%s MODE %s -%s+%s %s" [hostname, rm, oldMode, newMode, us]
+    sendPacket $ printf "%s MODE %s %s" [hostname, rm, modesAndUser]
     where
         oldMode = levelToMode old
         newMode = levelToMode new
+        modesAndUser = case (oldMode, newMode) of
+            ("", "") -> T.concat ["-v ", us]
+            ("", _) -> T.concat ["+", newMode, " ", us]
+            (_, "") -> T.concat ["-", oldMode, " ", us]
+            (a, b) -> T.concat ["-", a, "+", b, " ", us, " ", us]
+
 
 sendNotice =
     sendPacket . printf "NOTICE AUTH :%s" . return
diff --git a/kevin.cabal b/kevin.cabal
--- a/kevin.cabal
+++ b/kevin.cabal
@@ -1,5 +1,5 @@
 Name:             kevin
-Version:          0.1.5.1
+Version:          0.1.5.2
 Synopsis:         a dAmn ↔ IRC proxy
 Description:      a dAmn ↔ IRC proxy
 License:          GPL
@@ -20,4 +20,4 @@
     Other-Modules:    Kevin, Kevin.Protocol, Kevin.Base, Kevin.Util.Logger, Kevin.IRC.Protocol, Kevin.Damn.Protocol, Kevin.Util.Entity, Kevin.Util.Tablump, Kevin.Damn.Packet, Kevin.Damn.Protocol.Send, Kevin.IRC.Protocol.Send, Kevin.IRC.Packet, Kevin.Settings, Kevin.Types, Kevin.Util.Token
     extensions:       CPP, DeriveDataTypeable, ExistentialQuantification, OverloadedStrings, ScopedTypeVariables, TemplateHaskell
     ghc-options:      -Wall -fno-warn-unused-do-bind -threaded
-    cpp-options:      -DVERSION="0.1.5.1"
+    cpp-options:      -DVERSION="0.1.5.2"
