elif ret['_verb'] == '401':  # ERR_NOSUCHNICK
             raise TargetUserOffline(ret['missing'])
         elif ret['_verb'] == '432':  # ERR_ERRONEOUSNICKNAME
-            alert = 'nickname refused for bad format'
-            if 'nick' not in ret:
-                alert += ', giving up'
-                self.close()
-            self._alert(alert)
+            self._alert('nickname refused for bad format, '
+                        + ('keeping current one' if 'nick' in ret
+                           else 'giving up'))
         elif ret['_verb'] == '433':  # ERR_NICKNAMEINUSE
             self._alert('nickname already in use, trying increment')
             self.send('NICK', _NickUserHost(nick=ret['used']).incremented)
 
         _MsgTok.SERVER,
         ('*',
          _MsgTok.ANY,  # bad one probably fails our NICKNAME tests
-         _MsgTok.ANY)),  # comment
+         _MsgTok.ANY),  # comment
+        bonus_tasks=('do_close:',)),
     _MsgParseExpectation(
         '432',  # ERR_ERRONEOUSNICKNAME
         _MsgTok.SERVER,
 
 > /nick @foo
 1 .> NICK :@foo
 0:1 .< :*.?.net 432 foo1 @foo :Erroneous nickname
-1 .!$ nickname refused for bad format
+1 .!$ nickname refused for bad format, keeping current one
 
 # join channel, collect topic, residents; update me:user from JOIN message; ensure topic.who not affecting users DB
 > /join #test