diff --git a/lang/cat.l b/lang/cat.l
index 9a98ad922..e02f91061 100644
--- a/lang/cat.l
+++ b/lang/cat.l
@@ -3455,7 +3455,7 @@ NICK_HELP_UNGROUP
 	nick in your group.
 
 NICK_HELP_IDENTIFY
-	Sintaxis: IDENTIFY clau
+	Sintaxis: IDENTIFY [account] clau
 	
 	Informa a %S que tu ets realment el propietari del teu nick.
 	Moltes comandes requereixen que t'identifiquis amb aquesta
diff --git a/lang/de.l b/lang/de.l
index 782f91e5f..e307831bf 100644
--- a/lang/de.l
+++ b/lang/de.l
@@ -3536,7 +3536,7 @@ NICK_HELP_UNGROUP
 	nick in your group.
 
 NICK_HELP_IDENTIFY
-	Syntax: IDENTIFY Passwort
+	Syntax: IDENTIFY [account] Passwort
 	
 	Beweist %S, dass du wirklich der Besitzer dieses 
 	Nicknamens bist. Viele Befehle erzwingen, dass 
diff --git a/lang/en_us.l b/lang/en_us.l
index 8dcdb47a8..352d3cec2 100644
--- a/lang/en_us.l
+++ b/lang/en_us.l
@@ -373,7 +373,7 @@ NICK_UNGROUP_SUCCESSFUL
 
 # IDENTIFY responses
 NICK_IDENTIFY_SYNTAX
-	IDENTIFY password
+	IDENTIFY [account] password
 NICK_IDENTIFY_FAILED
 	Sorry, identification failed.
 NICK_IDENTIFY_SUCCEEDED
@@ -3430,7 +3430,7 @@ NICK_HELP_UNGROUP
 	nick in your group.
 
 NICK_HELP_IDENTIFY
-	Syntax: IDENTIFY password
+	Syntax: IDENTIFY [account] password
 	
 	Tells %S that you are really the owner of this
 	nick.  Many commands require you to authenticate yourself
diff --git a/lang/es.l b/lang/es.l
index ade7b9f54..5b65250f4 100644
--- a/lang/es.l
+++ b/lang/es.l
@@ -3537,7 +3537,7 @@ NICK_HELP_UNGROUP
 	nick in your group.
 
 NICK_HELP_IDENTIFY
-	Sintaxis: IDENTIFY clave
+	Sintaxis: IDENTIFY [account] clave
 	
 	Informa a %S que tu eres realmente el dueño de tu nick.
 	Muchos comandos requieren que te autentifiques con este
diff --git a/lang/fr.l b/lang/fr.l
index c3283a140..1e8892cab 100644
--- a/lang/fr.l
+++ b/lang/fr.l
@@ -3580,7 +3580,7 @@ NICK_HELP_GROUP
 	Note: tous les pseudos du groupe ont le même mot de passe.
 
 NICK_HELP_IDENTIFY
-	Syntaxe: IDENTIFY motdepasse
+	Syntaxe: IDENTIFY [account] motdepasse
 	
 	Informe %S que vous êtes vraiment le propriétaire de
 	ce pseudo. Beaucoup de commandes nécessitent que vous soyez
diff --git a/lang/gr.l b/lang/gr.l
index 28b385d75..bb2bddf33 100644
--- a/lang/gr.l
+++ b/lang/gr.l
@@ -3563,7 +3563,7 @@ NICK_HELP_UNGROUP
 	nick in your group.
 
 NICK_HELP_IDENTIFY
-	Óýíôáîç: IDENTIFY êùäéêü
+	Óýíôáîç: IDENTIFY [account] êùäéêü
 	
 	ËÝåé óôïí %S áí åßóáé üíôïò ï êÜôï÷ïò áõôïý ôïõ øåõäþíõìïõ.
 	ÐïëëÝò åíôïëÝò áðáéôïýí íá êÜíåéò åíôïëÞ áíáãíþñéóçò, äçë ìå ôçí åíôïëÞ
diff --git a/lang/hun.l b/lang/hun.l
index a2e4ba2eb..bf9dd3e30 100644
--- a/lang/hun.l
+++ b/lang/hun.l
@@ -3482,7 +3482,7 @@ NICK_HELP_GROUP
 			 a jelszava.
 
 NICK_HELP_IDENTIFY
-	Syntax: IDENTIFY jelszó
+	Syntax: IDENTIFY [account] jelszó
 	
 	Tudatja a %S-vel, hogy te vagy a tulajdonosa ennek a 
 	nicknek. Jelszónak ugyanannak kell lennie amit a 
diff --git a/lang/it.l b/lang/it.l
index c33018f4f..930b31bb8 100644
--- a/lang/it.l
+++ b/lang/it.l
@@ -3444,7 +3444,7 @@ NICK_HELP_UNGROUP
 	nick in your group.
 
 NICK_HELP_IDENTIFY
-	Sintassi: IDENTIFY password
+	Sintassi: IDENTIFY [account] password
 	
 	Indica a %S che sei davvero il proprietario del nick.
 	Molti comandi richiedono che tu ti sia autentificato
diff --git a/lang/nl.l b/lang/nl.l
index d3c53ca85..99aef7771 100644
--- a/lang/nl.l
+++ b/lang/nl.l
@@ -3519,7 +3519,7 @@ NICK_HELP_UNGROUP
 	nick in your group.
 
 NICK_HELP_IDENTIFY
-	Gebruik: IDENTIFY wachtwoord
+	Gebruik: IDENTIFY [account] wachtwoord
 	
 	Vertelt %S dat je echt de eigenaar van deze nick bent. Veel
 	commandos vereisen dat je jezelf identificeert met dit commando
diff --git a/lang/pl.l b/lang/pl.l
index 50c4b5241..faf76a6df 100644
--- a/lang/pl.l
+++ b/lang/pl.l
@@ -4499,7 +4499,7 @@ NICK_HELP_UNGROUP
 	nick in your group.
 
 NICK_HELP_IDENTIFY
-	Sk³adnia: IDENTIFY has³o
+	Sk³adnia: IDENTIFY [account] has³o
 	
 	Informuje %S, ¿e nick którego w³a¶nie u¿ywasz 
 	nale¿y do Ciebie. Wiele komend wymaga identyfikacji 
diff --git a/lang/pt.l b/lang/pt.l
index f94ca74dc..c082b91fa 100644
--- a/lang/pt.l
+++ b/lang/pt.l
@@ -3464,7 +3464,7 @@ NICK_HELP_UNGROUP
 	nick in your group.
 
 NICK_HELP_IDENTIFY
-	Sintaxe: IDENTIFY senha
+	Sintaxe: IDENTIFY [account] senha
 	
 	Identifica você ao %S como sendo dono do nick.
 	Muitos comandos exigem que você se identifique com este
diff --git a/lang/ru.l b/lang/ru.l
index daa809186..b2f54a384 100644
--- a/lang/ru.l
+++ b/lang/ru.l
@@ -3459,7 +3459,7 @@ NICK_HELP_UNGROUP
 	nick in your group.
 
 NICK_HELP_IDENTIFY
-	Ñèíòàêñèñ: IDENTIFY ïàðîëü
+	Ñèíòàêñèñ: IDENTIFY [account] ïàðîëü
 	
 	Ïîçâîëÿåò âàì èäåíòèôèöèðîâàòüñÿ íà %S ê çàðåãèñòðèðîâàííîìó
 	ðàíåå íèêó. Áîëüøèíñòâî ñåðâèñíûõ êîìàíä, òàêèå êàê SET, OP, BAN
diff --git a/lang/tr.l b/lang/tr.l
index 88095efeb..4e8c3f76e 100644
--- a/lang/tr.l
+++ b/lang/tr.l
@@ -3560,7 +3560,7 @@ NICK_HELP_UNGROUP
 	nick in your group.
 
 NICK_HELP_IDENTIFY
-	Kullanýmý: IDENTIFY þifreniz
+	Kullanýmý: IDENTIFY [account] þifreniz
 	
 	%S 'e kullandýðýnýz nickin gerçek sahibinin siz olduðunu
 	belirtir. Çoðu komut kullanýlmadan önce bu komutla 
diff --git a/modules/core/ns_group.cpp b/modules/core/ns_group.cpp
index 6bb187908..7c0802e37 100644
--- a/modules/core/ns_group.cpp
+++ b/modules/core/ns_group.cpp
@@ -118,6 +118,7 @@ class CommandNSGroup : public Command
 					u->Login(na->nc);
 					FOREACH_MOD(I_OnNickGroup, OnNickGroup(u, target));
 					ircdproto->SetAutoIdentificationToken(u);
+					u->SetMode(NickServ, UMODE_REGISTERED);
 
 					Log(LOG_COMMAND, u, this) << "makes " << u->nick << " join group of " << target->nick << " (" << target->nc->display << ") (email: " << (!target->nc->email.empty() ? target->nc->email : "none") << ")";
 					notice_lang(Config->s_NickServ, u, NICK_GROUP_JOINED, target->nick.c_str());
diff --git a/modules/core/ns_identify.cpp b/modules/core/ns_identify.cpp
index e87d13d22..943847355 100644
--- a/modules/core/ns_identify.cpp
+++ b/modules/core/ns_identify.cpp
@@ -16,21 +16,21 @@
 class CommandNSIdentify : public Command
 {
  public:
-	CommandNSIdentify(const Anope::string &cname) : Command(cname, 1, 1)
+	CommandNSIdentify(const Anope::string &cname) : Command(cname, 1, 2)
 	{
 		this->SetFlag(CFLAG_ALLOW_UNREGISTERED);
 	}
 
 	CommandReturn Execute(User *u, const std::vector<Anope::string> &params)
 	{
-		Anope::string pass = params[0];
-		NickAlias *na;
-		NickRequest *nr;
-		int res;
+		Anope::string nick = params.size() == 2 ? params[0] : u->nick;
+		Anope::string pass = params[params.size() - 1];
 
-		if (!(na = findnick(u->nick)))
+		NickAlias *na = findnick(nick), *this_na = findnick(u->nick);
+		if (!na)
 		{
-			if ((nr = findrequestnick(u->nick)))
+			NickRequest *nr = findrequestnick(nick);
+			if (nr)
 				notice_lang(Config->s_NickServ, u, NICK_IS_PREREG);
 			else
 				notice_lang(Config->s_NickServ, u, NICK_NOT_REGISTERED);
@@ -47,7 +47,7 @@ class CommandNSIdentify : public Command
 			notice_lang(Config->s_NickServ, u, NICK_ALREADY_IDENTIFIED);
 		else
 		{
-			res = enc_check_password(pass, na->nc->pass);
+			int res = enc_check_password(pass, na->nc->pass);
 			if (!res)
 			{
 				Log(LOG_COMMAND, u, this) << "and failed to identify";
@@ -69,6 +69,9 @@ class CommandNSIdentify : public Command
 				ircdproto->SendAccountLogin(u, u->Account());
 				ircdproto->SetAutoIdentificationToken(u);
 
+				if (this_na && this_na->nc == na->nc)
+					u->SetMode(NickServ, UMODE_REGISTERED);
+
 				u->UpdateHost();
 
 				FOREACH_MOD(I_OnNickIdentify, OnNickIdentify(u));
diff --git a/modules/core/ns_resetpass.cpp b/modules/core/ns_resetpass.cpp
index a0efa373c..63c58d5ed 100644
--- a/modules/core/ns_resetpass.cpp
+++ b/modules/core/ns_resetpass.cpp
@@ -110,6 +110,7 @@ class NSResetPass : public Module
 					u->Login(na->nc);
 					ircdproto->SendAccountLogin(u, u->Account());
 					ircdproto->SetAutoIdentificationToken(u);
+					u->SetMode(NickServ, UMODE_REGISTERED);
 					FOREACH_MOD(I_OnNickIdentify, OnNickIdentify(u));
 
 					Log(LOG_COMMAND, u, &commandnsresetpass) << "confirmed RESETPASS to forcefully identify to " << na->nick;
diff --git a/modules/protocol/bahamut.cpp b/modules/protocol/bahamut.cpp
index 8e54de704..65924c97f 100644
--- a/modules/protocol/bahamut.cpp
+++ b/modules/protocol/bahamut.cpp
@@ -291,7 +291,6 @@ class BahamutIRCdProto : public IRCDProto
 		if (!u->Account())
 			return;
 
-		u->SetMode(NickServ, UMODE_REGISTERED);
 		ircdproto->SendMode(NickServ, u, "+d %d", u->timestamp);
 	}
 
diff --git a/modules/protocol/inspircd11.cpp b/modules/protocol/inspircd11.cpp
index 4b92a694c..557fe7389 100644
--- a/modules/protocol/inspircd11.cpp
+++ b/modules/protocol/inspircd11.cpp
@@ -296,8 +296,6 @@ class InspIRCdProto : public IRCDProto
 
 		u->Account()->Shrink("authenticationtoken");
 		u->Account()->Extend("authenticationtoken", new ExtensibleItemRegular<Anope::string>(svidbuf));
-
-		u->SetMode(NickServ, UMODE_REGISTERED);
 	}
 
 } ircd_proto;
diff --git a/modules/protocol/inspircd12.cpp b/modules/protocol/inspircd12.cpp
index ffc696d94..9532e7669 100644
--- a/modules/protocol/inspircd12.cpp
+++ b/modules/protocol/inspircd12.cpp
@@ -308,14 +308,6 @@ class InspIRCdProto : public IRCDProto
 
 		return true;
 	}
-
-	void SetAutoIdentificationToken(User *u)
-	{
-		if (!u->Account())
-			return;
-
-		u->SetMode(NickServ, UMODE_REGISTERED);
-	}
 } ircd_proto;
 
 int anope_event_ftopic(const Anope::string &source, int ac, const char **av)
diff --git a/modules/protocol/inspircd20.cpp b/modules/protocol/inspircd20.cpp
index 51784d071..47413da23 100644
--- a/modules/protocol/inspircd20.cpp
+++ b/modules/protocol/inspircd20.cpp
@@ -306,14 +306,6 @@ class InspIRCdProto : public IRCDProto
 
 		return true;
 	}
-
-	void SetAutoIdentificationToken(User *u)
-	{
-		if (!u->Account())
-			return;
-
-		u->SetMode(NickServ, UMODE_REGISTERED);
-	}
 } ircd_proto;
 
 int anope_event_ftopic(const Anope::string &source, int ac, const char **av)
diff --git a/modules/protocol/unreal32.cpp b/modules/protocol/unreal32.cpp
index 249da63b5..0b5b56b08 100644
--- a/modules/protocol/unreal32.cpp
+++ b/modules/protocol/unreal32.cpp
@@ -387,7 +387,6 @@ class UnrealIRCdProto : public IRCDProto
 		if (!u->Account())
 			return;
 
-		u->SetMode(NickServ, UMODE_REGISTERED);
 		ircdproto->SendMode(NickServ, u, "+d %d", u->timestamp);
 	}
 
diff --git a/src/users.cpp b/src/users.cpp
index e5fe7ee04..362ad1717 100644
--- a/src/users.cpp
+++ b/src/users.cpp
@@ -753,6 +753,7 @@ User *do_nick(const Anope::string &source, const Anope::string &nick, const Anop
 				user->UpdateHost();
 				do_on_id(user);
 				ircdproto->SetAutoIdentificationToken(user);
+				user->SetMode(NickServ, UMODE_REGISTERED);
 				Log() << Config->s_NickServ << ": " << user->GetMask() << " automatically identified for group " << user->Account()->display;
 			}
 
