diff --git src/simutrans/gui/server_frame.cc src/simutrans/gui/server_frame.cc
index 7fc587eed..9b3f46b93 100644
--- src/simutrans/gui/server_frame.cc
+++ src/simutrans/gui/server_frame.cc
@@ -548,6 +548,7 @@ void server_frame_t::draw (scr_coord pos, scr_size size)
 	// update nickname if necessary
 	if (  get_focus() != &nick  &&  env_t::nickname != nick_buf  ) {
 		tstrncpy( nick_buf, env_t::nickname.c_str(), min( lengthof( nick_buf ), env_t::nickname.length() + 1 ) );
+		// TODO: really tell the user about already-taken nickname?
 	}
 
 	gui_frame_t::draw( pos, size );
diff --git src/simutrans/network/network_cmd_ingame.cc src/simutrans/network/network_cmd_ingame.cc
index 0981af9bb..fc4399138 100644
--- src/simutrans/network/network_cmd_ingame.cc
+++ src/simutrans/network/network_cmd_ingame.cc
@@ -167,7 +167,13 @@ bool nwc_nick_t::execute(karte_t *welt)
 		uint32 client_id = socket_list_t::get_client_id(packet->get_sender());
 
 		if(nickname==NULL  ||  nickname=="Admin"  || nick_already_taken(nickname, client_id)) {
-			goto generate_default_nick;
+			if (nickname  &&  id == NWC_NICK) {
+				// Player tried to change nickname, but it is already taken
+				nwc_nick_t::server_tools(welt, client_id, NICK_TAKEN, nickname);
+				return true;
+			} else {
+				goto generate_default_nick;
+			}
 		}
 
 		if (id == NWC_NICK) {
@@ -259,6 +265,20 @@ void nwc_nick_t::server_tools(karte_t *welt, uint32 client_id, uint8 what, const
 			}
 			break;
 		}
+
+		case NICK_TAKEN: {
+			if (client_id > 0) {
+				// send old nickname back to client
+				nwc_nick_t nwc(info.nickname);
+				nwc.send(info.socket);
+			}
+			else {
+				// human at server
+				env_t::nickname = info.nickname;
+			}
+			return;
+		}
+
 		case FAREWELL: {
 			buf.printf(translator::translate("%s has left.", welt->get_settings().get_name_language_id()),
 				   info.nickname.c_str());
diff --git src/simutrans/network/network_cmd_ingame.h src/simutrans/network/network_cmd_ingame.h
index 5748885e0..4b10ad542 100644
--- src/simutrans/network/network_cmd_ingame.h
+++ src/simutrans/network/network_cmd_ingame.h
@@ -56,6 +56,7 @@ public:
 	enum {
 		WELCOME,
 		CHANGE_NICK,
+		NICK_TAKEN,
 		FAREWELL
 	};
 
@@ -63,6 +64,7 @@ public:
 	 * Server-side nickname related stuff:
 	 * what = WELCOME     .. new player joined: send welcome message
 	 * what = CHANGE_NICK .. change nickname: in socket_list per client, send new nick back to client, tell others as well
+	 * what = NICK_TAKEN  .. player tried to use a nickname already taken, send old nick instead
 	 * what = FAREWELL    .. player has left: send message
 	 */
 	static void server_tools(karte_t *welt, uint32 client_id, uint8 what, const char* nick);
