Index: src/lang/english.txt
===================================================================
--- src/lang/english.txt	(revision 13565)
+++ src/lang/english.txt	(working copy)
@@ -2336,8 +2336,12 @@
 STR_7070_BUILD_COMPANY_HEADQUARTERS                             :{BLACK}Build company headquarters / view company headquarters
 STR_RELOCATE_COMPANY_HEADQUARTERS                               :{BLACK}Rebuild company headquarters elsewhere for 1% cost of company value
 STR_7071_CAN_T_BUILD_COMPANY_HEADQUARTERS                       :{WHITE}Can't build company headquarters...
+STR_PLAYER_CENTER_VIEWPORT                                      :{BLACK}Center viewport to place where player built last time
+STR_PLAYER_OPEN_VIEWPORT                                        :{BLACK}Open new viewport to watch player's actions
 STR_7072_VIEW_HQ                                                :{BLACK}View HQ
 STR_RELOCATE_HQ                                                 :{BLACK}Relocate HQ
+STR_PLAYER_CENTER                                               :{BLACK}Center view
+STR_PLAYER_OPEN                                                 :{BLACK}Open window
 STR_COMPANY_PASSWORD                                            :{BLACK}Password
 STR_COMPANY_PASSWORD_TOOLTIP                                    :{BLACK}Password-protect your company to prevent unauthorised users from joining.
 STR_SET_COMPANY_PASSWORD                                        :{BLACK}Set company password
Index: src/smallmap_gui.cpp
===================================================================
--- src/smallmap_gui.cpp	(revision 13565)
+++ src/smallmap_gui.cpp	(working copy)
@@ -1230,7 +1230,7 @@
 	_extra_view_port_widgets,
 };
 
-void ShowExtraViewPortWindow(TileIndex tile)
+int ShowExtraViewPortWindow(TileIndex tile)
 {
 	int i = 0;
 
@@ -1238,6 +1238,8 @@
 	while (FindWindowById(WC_EXTRA_VIEW_PORT, i) != NULL) i++;
 
 	new ExtraViewportWindow(&_extra_view_port_desc, i, tile);
+
+	return i;
 }
 
 bool ScrollMainWindowTo(int x, int y, bool instant)
Index: src/command.cpp
===================================================================
--- src/command.cpp	(revision 13565)
+++ src/command.cpp	(working copy)
@@ -18,6 +18,9 @@
 #include "town.h"
 #include "date_func.h"
 #include "debug.h"
+#include "window_func.h"
+#include "viewport_type.h"
+#include "viewport_func.h"
 #include "player_func.h"
 #include "player_base.h"
 #include "signal_func.h"
@@ -449,7 +452,17 @@
 		SubtractMoneyFromPlayer(res);
 		/* XXX - Old AI hack which doesn't use DoCommandDP; update last build coord of player */
 		if (tile != 0 && IsValidPlayer(_current_player)) {
-			GetPlayer(_current_player)->last_build_coordinate = tile;
+			Player *p = GetPlayer(_current_player);
+			if (p->last_build_coordinate != tile) {
+				p->last_build_coordinate = tile;
+				if (p->window != -1) {
+					Window *w = FindWindowById(WC_EXTRA_VIEW_PORT, p->window);
+					if (w != NULL)
+						ScrollWindowTo(TileX(tile) * TILE_SIZE + TILE_SIZE / 2, TileY(tile) * TILE_SIZE + TILE_SIZE / 2, w, true);
+					else
+						p->window = -1;  // TODO: player initiated to '0'
+				}
+			}
 		}
 	}
 
@@ -609,7 +622,17 @@
 
 	/* update last build coordinate of player. */
 	if (tile != 0 && IsValidPlayer(_current_player)) {
-		GetPlayer(_current_player)->last_build_coordinate = tile;
+		Player *p = GetPlayer(_current_player);
+		if (p->last_build_coordinate != tile) {
+			p->last_build_coordinate = tile;
+			if (p->window != -1) {
+				Window *w = FindWindowById(WC_EXTRA_VIEW_PORT, p->window);
+				if (w != NULL)
+					ScrollWindowTo(TileX(tile) * TILE_SIZE + TILE_SIZE / 2, TileY(tile) * TILE_SIZE + TILE_SIZE / 2, w, true);
+				else
+					p->window = -1;  // TODO: player initiated to '0'
+			}
+		}
 	}
 
 	/* Actually try and execute the command. If no cost-type is given
Index: src/player_base.h
===================================================================
--- src/player_base.h	(revision 13565)
+++ src/player_base.h	(working copy)
@@ -62,6 +62,8 @@
 	bool is_active;
 	bool is_ai;
 
+	int window;
+
 	Money yearly_expenses[3][EXPENSES_END];
 	PlayerEconomyEntry cur_economy;
 	PlayerEconomyEntry old_economy[24];
Index: src/gui.h
===================================================================
--- src/gui.h	(revision 13565)
+++ src/gui.h	(working copy)
@@ -60,7 +60,7 @@
 void ShowErrorMessage(StringID msg_1, StringID msg_2, int x, int y);
 
 void ShowSmallMap();
-void ShowExtraViewPortWindow(TileIndex tile = INVALID_TILE);
+int ShowExtraViewPortWindow(TileIndex tile = INVALID_TILE);
 
 void BuildFileList();
 void SetFiosType(const byte fiostype);
Index: src/player_gui.cpp
===================================================================
--- src/player_gui.cpp	(revision 13565)
+++ src/player_gui.cpp	(working copy)
@@ -1048,6 +1048,8 @@
 	PCW_WIDGET_COMPANY_NAME,
 	PCW_WIDGET_BUILD_VIEW_HQ,
 	PCW_WIDGET_RELOCATE_HQ,
+	PCW_WIDGET_CENTER,
+	PCW_WIDGET_OPEN,
 	PCW_WIDGET_BUY_SHARE,
 	PCW_WIDGET_SELL_SHARE,
 	PCW_WIDGET_COMPANY_PASSWORD,
@@ -1063,6 +1065,8 @@
 { WWT_PUSHTXTBTN,   RESIZE_NONE,    14,   270,   359,   158,   169, STR_7008_COMPANY_NAME,             STR_7033_CHANGE_THE_COMPANY_NAME},
 {    WWT_TEXTBTN,   RESIZE_NONE,    14,   266,   355,    18,    29, STR_7072_VIEW_HQ,                  STR_7070_BUILD_COMPANY_HEADQUARTERS},
 {    WWT_TEXTBTN,   RESIZE_NONE,    14,   266,   355,    32,    43, STR_RELOCATE_HQ,                   STR_RELOCATE_COMPANY_HEADQUARTERS},
+{ WWT_PUSHTXTBTN,   RESIZE_NONE,    14,   266,   355,    46,    57, STR_PLAYER_CENTER,                 STR_PLAYER_CENTER_VIEWPORT},
+{ WWT_PUSHTXTBTN,   RESIZE_NONE,    14,   266,   355,    60,    71, STR_PLAYER_OPEN,                   STR_PLAYER_OPEN_VIEWPORT},
 { WWT_PUSHTXTBTN,   RESIZE_NONE,    14,     0,   179,   158,   169, STR_7077_BUY_25_SHARE_IN_COMPANY,  STR_7079_BUY_25_SHARE_IN_THIS_COMPANY},
 { WWT_PUSHTXTBTN,   RESIZE_NONE,    14,   180,   359,   158,   169, STR_7078_SELL_25_SHARE_IN_COMPANY, STR_707A_SELL_25_SHARE_IN_THIS_COMPANY},
 { WWT_PUSHTXTBTN,   RESIZE_NONE,    14,   266,   355,   138,   149, STR_COMPANY_PASSWORD,              STR_COMPANY_PASSWORD_TOOLTIP},
@@ -1286,6 +1290,20 @@
 				this->InvalidateWidget(PCW_WIDGET_RELOCATE_HQ);
 				break;
 
+			case PCW_WIDGET_CENTER:
+				ScrollMainWindowToTile(GetPlayer((PlayerID)this->window_number)->last_build_coordinate);
+				break;
+
+			case PCW_WIDGET_OPEN: {
+				int window = ShowExtraViewPortWindow();
+				Player *p = GetPlayer((PlayerID)this->window_number);
+				TileIndex tile = p->last_build_coordinate;
+
+				p->window = window;
+				ScrollWindowTo(TileX(tile) * TILE_SIZE + TILE_SIZE / 2, TileY(tile) * TILE_SIZE + TILE_SIZE / 2, FindWindowById(WC_EXTRA_VIEW_PORT, window), true);
+				break;
+			}
+
 			case PCW_WIDGET_BUY_SHARE:
 				DoCommandP(0, this->window_number, 0, NULL, CMD_BUY_SHARE_IN_COMPANY | CMD_MSG(STR_707B_CAN_T_BUY_25_SHARE_IN_THIS));
 				break;
