diff -r ef3bf3644034 src/command.cpp
--- a/src/command.cpp	Sun May 17 23:40:22 2009 +0200
+++ b/src/command.cpp	Sun May 17 23:56:52 2009 +0200
@@ -9,6 +9,8 @@
 #include "gui.h"
 #include "command_func.h"
 #include "network/network.h"
+#include "network/network_base.h"
+#include "network/network_func.h"
 #include "genworld.h"
 #include "newgrf_storage.h"
 #include "strings_func.h"
@@ -20,6 +22,8 @@
 #include "company_func.h"
 #include "company_base.h"
 #include "signal_func.h"
+#include "window_func.h"
+#include "viewport_func.h"
 
 #include "table/strings.h"
 
@@ -468,9 +472,9 @@
  * @param my_cmd indicator if the command is from a company or server (to display error messages for a user)
  * @return true if the command succeeded, else false
  */
-bool DoCommandP(const CommandContainer *container, bool my_cmd)
+bool DoCommandP(const CommandContainer *container, ClientID client)
 {
-	return DoCommandP(container->tile, container->p1, container->p2, container->cmd, container->callback, container->text, my_cmd);
+	return DoCommandP(container->tile, container->p1, container->p2, container->cmd, container->callback, container->text, client);
 }
 
 /*!
@@ -488,8 +492,10 @@
  * @param my_cmd indicator if the command is from a company or server (to display error messages for a user)
  * @return true if the command succeeded, else false
  */
-bool DoCommandP(TileIndex tile, uint32 p1, uint32 p2, uint32 cmd, CommandCallback *callback, const char *text, bool my_cmd)
+bool DoCommandP(TileIndex tile, uint32 p1, uint32 p2, uint32 cmd, CommandCallback *callback, const char *text, ClientID client)
 {
+	bool my_cmd = (client != INVALID_CLIENT_ID && client == _network_own_client_id) || (!_networking && _current_company == _local_company);
+
 	assert(_docommand_recursive == 0);
 
 	CommandCost res, res2;
@@ -592,6 +598,16 @@
 	/* update last build coordinate of company. */
 	if (tile != 0 && Company::IsValidID(_current_company)) {
 		Company::Get(_current_company)->last_build_coordinate = tile;
+		if (client != INVALID_CLIENT_ID) {
+			NetworkClientInfo *ci = NetworkFindClientInfoFromClientID(client);
+			if (ci != NULL && Company::IsValidID(ci->client_playas) && ci->client_playas == _current_company) {
+				if (ci->last_build_coordinate != tile) {
+					ci->last_build_coordinate = tile;
+					Window *w = FindWindowById(WC_BIG_BROTHER_WINDOW, client);
+					if (w != NULL) ScrollWindowTo(TileX(tile) * TILE_SIZE + TILE_SIZE / 2, TileY(tile) * TILE_SIZE + TILE_SIZE / 2, -1, w, true);
+				}
+			}
+		}
 	}
 
 	/* Actually try and execute the command. If no cost-type is given
diff -r ef3bf3644034 src/command_func.h
--- a/src/command_func.h	Sun May 17 23:40:22 2009 +0200
+++ b/src/command_func.h	Sun May 17 23:56:52 2009 +0200
@@ -6,6 +6,7 @@
 #define COMMAND_FUNC_H
 
 #include "command_type.h"
+#include "network/network_func.h"
 
 /**
  * Checks if a command failes.
@@ -59,8 +60,8 @@
 /**
  * Execute a network safe DoCommand function
  */
-bool DoCommandP(TileIndex tile, uint32 p1, uint32 p2, uint32 cmd, CommandCallback *callback = NULL, const char *text = NULL, bool my_cmd = true);
-bool DoCommandP(const CommandContainer *container, bool my_cmd = true);
+bool DoCommandP(TileIndex tile, uint32 p1, uint32 p2, uint32 cmd, CommandCallback *callback = NULL, const char *text = NULL, ClientID client = _network_own_client_id);
+bool DoCommandP(const CommandContainer *container, ClientID client = _network_own_client_id);
 
 #ifdef ENABLE_NETWORK
 
diff -r ef3bf3644034 src/gui.h
--- a/src/gui.h	Sun May 17 23:40:22 2009 +0200
+++ b/src/gui.h	Sun May 17 23:56:52 2009 +0200
@@ -12,6 +12,7 @@
 #include "tile_type.h"
 #include "strings_type.h"
 #include "transport_type.h"
+#include "network/network_type.h"
 
 /* main_gui.cpp */
 void CcPlaySound10(bool success, TileIndex tile, uint32 p1, uint32 p2);
@@ -62,6 +63,7 @@
 
 void ShowSmallMap();
 void ShowExtraViewPortWindow(TileIndex tile = INVALID_TILE);
+void ShowBigBrotherWindow(ClientID cid);
 
 void BuildFileList();
 void SetFiosType(const byte fiostype);
diff -r ef3bf3644034 src/lang/english.txt
--- a/src/lang/english.txt	Sun May 17 23:40:22 2009 +0200
+++ b/src/lang/english.txt	Sun May 17 23:56:52 2009 +0200
@@ -710,6 +710,7 @@
 ############ end of the 'Display map' dropdown
 
 STR_TOWN_POPULATION                                             :{BLACK}World population: {COMMA}
+STR_BIG_BROTHER_CLIENT_NAME                                     :{WHITE}{CLIENTNAME}
 STR_EXTRA_VIEW_PORT_TITLE                                       :{WHITE}Viewport {COMMA}
 STR_EXTRA_VIEW_MOVE_VIEW_TO_MAIN                                :{BLACK}Copy to viewport
 STR_EXTRA_VIEW_MOVE_VIEW_TO_MAIN_TT                             :{BLACK}Copy the location of the global view to this viewport
@@ -1526,6 +1527,7 @@
 STR_NETWORK_CLIENTLIST_SPEAK_TO_ALL                             :Speak to all
 STR_NETWORK_CLIENTLIST_SPEAK_TO_COMPANY                         :Speak to company
 STR_NETWORK_CLIENTLIST_SPEAK_TO_CLIENT                          :Private message
+STR_NETWORK_CLIENTLIST_OPEN_WINDOW                              :Open window
 
 
 STR_NETWORK_SEND                                                :{BLACK}Send
diff -r ef3bf3644034 src/network/network_base.h
--- a/src/network/network_base.h	Sun May 17 23:40:22 2009 +0200
+++ b/src/network/network_base.h	Sun May 17 23:56:52 2009 +0200
@@ -9,6 +9,8 @@
 
 #include "network_type.h"
 #include "../oldpool.h"
+#include "../tile_type.h"
+#include "core/address.h"
 
 DECLARE_OLD_POOL(NetworkClientInfo, NetworkClientInfo, NCI_BITS_PER_POOL_BLOCK, MAX_CLIENT_SLOTS >> NCI_BITS_PER_POOL_BLOCK);
 
@@ -20,6 +22,7 @@
 	NetworkAddress client_address;                  ///< IP-address of the client (so he can be banned)
 	Date join_date;                                 ///< Gamedate the client has joined
 	char unique_id[NETWORK_UNIQUE_ID_LENGTH];       ///< Every play sends an unique id so we can indentify him
+	TileIndex last_build_coordinate;
 
 	NetworkClientInfo(ClientID client_id = INVALID_CLIENT_ID) : client_id(client_id) {}
 	~NetworkClientInfo() { client_id = INVALID_CLIENT_ID; }
diff -r ef3bf3644034 src/network/network_client.cpp
--- a/src/network/network_client.cpp	Sun May 17 23:40:22 2009 +0200
+++ b/src/network/network_client.cpp	Sun May 17 23:56:52 2009 +0200
@@ -690,6 +690,7 @@
 	const char *err = MY_CLIENT->Recv_Command(p, &cp);
 	cp.frame    = p->Recv_uint32();
 	cp.my_cmd   = p->Recv_bool();
+	cp.client   = p->pos + 4 == p->size ? (ClientID)p->Recv_uint32() : (cp.my_cmd ? _network_own_client_id : INVALID_CLIENT_ID);
 	cp.next     = NULL;
 
 	if (err != NULL) {
diff -r ef3bf3644034 src/network/network_command.cpp
--- a/src/network/network_command.cpp	Sun May 17 23:40:22 2009 +0200
+++ b/src/network/network_command.cpp	Sun May 17 23:56:52 2009 +0200
@@ -72,6 +72,7 @@
 		 */
 		c.frame = _frame_counter_max + 1;
 		c.my_cmd = true;
+		c.client = _network_own_client_id;
 
 		NetworkAddCommandQueue(c);
 
@@ -113,7 +114,7 @@
 		/* We can execute this command */
 		_current_company = cp->company;
 		cp->cmd |= CMD_NETWORK_COMMAND;
-		DoCommandP(cp, cp->my_cmd);
+		DoCommandP(cp, cp->client);
 
 		_local_command_queue = _local_command_queue->next;
 		free(cp);
diff -r ef3bf3644034 src/network/network_gui.cpp
--- a/src/network/network_gui.cpp	Sun May 17 23:40:22 2009 +0200
+++ b/src/network/network_gui.cpp	Sun May 17 23:56:52 2009 +0200
@@ -1778,6 +1778,12 @@
 	ShowNetworkChatQueryWindow(DESTTYPE_BROADCAST, 0);
 }
 
+static void ClientList_OpenWindow(byte client_no)
+{
+	const NetworkClientInfo *ci = NetworkFindClientInfo(client_no);
+	if (ci != NULL && Company::IsValidID(ci->client_playas)) ShowBigBrotherWindow(ci->client_id);
+}
+
 static void ClientList_None(byte client_no)
 {
 	/* No action ;) */
@@ -1815,6 +1821,9 @@
 		GetString(this->action[i], STR_NETWORK_CLIENTLIST_SPEAK_TO_ALL, lastof(this->action[i]));
 		this->proc[i++] = &ClientList_SpeakToAll;
 
+		GetString(this->action[i], STR_NETWORK_CLIENTLIST_OPEN_WINDOW, lastof(this->action[i]));
+		this->proc[i++] = &ClientList_OpenWindow;
+
 		if (_network_own_client_id != ci->client_id) {
 			/* We are no spectator and the company we want to give money to is no spectator and money gifts are allowed */
 			if (Company::IsValidID(_network_playas) && Company::IsValidID(ci->client_playas) && _settings_game.economy.give_money) {
diff -r ef3bf3644034 src/network/network_internal.h
--- a/src/network/network_internal.h	Sun May 17 23:40:22 2009 +0200
+++ b/src/network/network_internal.h	Sun May 17 23:56:52 2009 +0200
@@ -144,6 +144,7 @@
 	CompanyByte company; ///< company that is executing the command
 	uint32 frame;        ///< the frame in which this packet is executed
 	bool my_cmd;         ///< did the command originate from "me"
+	ClientID client;
 };
 
 void NetworkAddCommandQueue(CommandPacket cp, NetworkClientSocket *cs = NULL);
diff -r ef3bf3644034 src/network/network_server.cpp
--- a/src/network/network_server.cpp	Sun May 17 23:40:22 2009 +0200
+++ b/src/network/network_server.cpp	Sun May 17 23:56:52 2009 +0200
@@ -484,6 +484,7 @@
 	cs->Send_Command(p, cp);
 	p->Send_uint32(cp->frame);
 	p->Send_bool  (cp->my_cmd);
+	p->Send_uint32(cp->client);
 
 	cs->Send_Packet(p);
 }
@@ -928,12 +929,14 @@
 			 *  first place. This filters that out. */
 			cp.callback = (new_cs != cs) ? NULL : callback;
 			cp.my_cmd = (new_cs == cs);
+			cp.client = ci->client_id;
 			NetworkAddCommandQueue(cp, new_cs);
 		}
 	}
 
 	cp.callback = NULL;
 	cp.my_cmd = false;
+	cp.client = ci->client_id;
 	NetworkAddCommandQueue(cp);
 }
 
diff -r ef3bf3644034 src/smallmap_gui.cpp
--- a/src/smallmap_gui.cpp	Sun May 17 23:40:22 2009 +0200
+++ b/src/smallmap_gui.cpp	Sun May 17 23:56:52 2009 +0200
@@ -20,6 +20,8 @@
 #include "vehicle_base.h"
 #include "sound_func.h"
 #include "window_func.h"
+#include "network/network_base.h"
+#include "network/network_func.h"
 
 #include "table/strings.h"
 #include "table/sprites.h"
@@ -1223,7 +1225,7 @@
 	virtual void OnPaint()
 	{
 		/* set the number in the title bar */
-		SetDParam(0, this->window_number + 1);
+		SetDParam(0, this->window_number + (this->window_class == WC_EXTRA_VIEW_PORT));
 
 		this->DrawWidgets();
 		this->DrawViewport();
@@ -1305,6 +1307,18 @@
 	new ExtraViewportWindow(&_extra_view_port_desc, i, tile);
 }
 
+void ShowBigBrotherWindow(ClientID client)
+{
+	if (BringWindowToFrontById(WC_BIG_BROTHER_WINDOW, client) != NULL) return;
+
+	const NetworkClientInfo *ci = NetworkFindClientInfoFromClientID(client);
+	if (ci == NULL || !Company::IsValidID(ci->client_playas)) return;
+
+	Window *w = new ExtraViewportWindow(&_extra_view_port_desc, client, ci->last_build_coordinate);
+	w->window_class = WC_BIG_BROTHER_WINDOW;
+	w->widget[1].data = STR_BIG_BROTHER_CLIENT_NAME;
+}
+
 /**
  * Scrolls the main window to given coordinates.
  * @param x x coordinate
diff -r ef3bf3644034 src/strings.cpp
--- a/src/strings.cpp	Sun May 17 23:40:22 2009 +0200
+++ b/src/strings.cpp	Sun May 17 23:56:52 2009 +0200
@@ -30,6 +30,8 @@
 #include "video/video_driver.hpp"
 #include "engine_base.h"
 #include "strgen/strgen.h"
+#include "network/network_base.h"
+#include "network/network_func.h"
 #include "gfx_func.h"
 
 #include "table/strings.h"
@@ -1007,6 +1009,13 @@
 				break;
 			}
 
+			case SCC_CLIENT_NAME: { // {CLIENTNAME}
+				const NetworkClientInfo *ci = NetworkFindClientInfoFromClientID((ClientID)GetInt32(&argv));
+				const char *src = (ci == NULL || StrEmpty(ci->client_name)) ? "(unnamed)" : ci->client_name;
+				buff = strecpy(buff, src, last);
+				break;
+			}
+
 			case SCC_SETCASE: { // {SETCASE}
 				/* This is a pseudo command, it's outputted when someone does {STRING.ack}
 				 * The modifier is added to all subsequent GetStringWithArgs that accept the modifier. */
diff -r ef3bf3644034 src/table/control_codes.h
--- a/src/table/control_codes.h	Sun May 17 23:40:22 2009 +0200
+++ b/src/table/control_codes.h	Sun May 17 23:56:52 2009 +0200
@@ -35,6 +35,7 @@
 	SCC_COMPANY_NAME,
 	SCC_COMPANY_NUM,
 	SCC_PRESIDENT_NAME,
+	SCC_CLIENT_NAME,
 	SCC_ENGINE_NAME,
 
 	SCC_CURRENCY_COMPACT,
diff -r ef3bf3644034 src/table/strgen_tables.h
--- a/src/table/strgen_tables.h	Sun May 17 23:40:22 2009 +0200
+++ b/src/table/strgen_tables.h	Sun May 17 23:56:52 2009 +0200
@@ -106,6 +106,7 @@
 	{"COMPANY",         EmitSingleChar, SCC_COMPANY_NAME,       1, C_NONE},
 	{"COMPANYNUM",      EmitSingleChar, SCC_COMPANY_NUM,        1, C_NONE},
 	{"PRESIDENTNAME",   EmitSingleChar, SCC_PRESIDENT_NAME,     1, C_NONE},
+	{"CLIENTNAME",      EmitSingleChar, SCC_CLIENT_NAME,        1, C_NONE},
 
 	{"",                EmitSingleChar, '\n',                   0, C_DONTCOUNT},
 	{"{",               EmitSingleChar, '{',                    0, C_DONTCOUNT},
diff -r ef3bf3644034 src/window_type.h
--- a/src/window_type.h	Sun May 17 23:40:22 2009 +0200
+++ b/src/window_type.h	Sun May 17 23:56:52 2009 +0200
@@ -79,6 +79,7 @@
 	WC_PERFORMANCE_DETAIL,
 	WC_CONSOLE,
 	WC_EXTRA_VIEW_PORT,
+	WC_BIG_BROTHER_WINDOW,
 	WC_CLIENT_LIST,
 	WC_NETWORK_STATUS_WINDOW,
 	WC_CUSTOM_CURRENCY,
