--- src/network/network_func.h	2014-10-21 21:36:31.000000000 +0300
+++ src/network/network_func.h	2014-11-09 21:37:49.000000000 +0200
@@ -74,7 +74,8 @@
 bool NetworkServerStart();
 void NetworkServerNewCompany(const Company *company, NetworkClientInfo *ci);
 bool NetworkServerChangeClientName(ClientID client_id, const char *new_name);
-
+void NetworkSavePassword();
+void NetworkLoadPassword();
 
 void NetworkServerDoMove(ClientID client_id, CompanyID company_id);
 void NetworkServerSendRcon(ClientID client_id, TextColour colour_code, const char *string);
--- src/network/network_server.cpp	2014-10-21 21:36:31.000000000 +0300
+++ src/network/network_server.cpp	2014-11-09 21:37:49.000000000 +0200
@@ -32,7 +32,7 @@
 #include "../core/pool_func.hpp"
 #include "../core/random_func.hpp"
 #include "../rev.h"
-
+#include "../fileio_func.h"
 #include "../safeguards.h"
 
 
@@ -500,6 +500,7 @@
 	/* Reset 'lag' counters */
 	this->last_frame = this->last_frame_server = _frame_counter;
 
+	DEBUG( net, 1, "requesting GAME password" );
 	Packet *p = new Packet(PACKET_SERVER_NEED_GAME_PASSWORD);
 	this->SendPacket(p);
 	return NETWORK_RECV_STATUS_OKAY;
@@ -1684,6 +1685,9 @@
 				IConsolePrintF(CC_DEFAULT, "Auto-removed protection from company #%d", c->index + 1);
 				_network_company_states[c->index].months_empty = 0;
 				NetworkServerUpdateCompanyPassworded(c->index, false);
+                                if (_settings_client.network.save_password) {
+                                        NetworkSavePassword( );
+                        	}
 			}
 			/* Is the company empty for autoclean_novehicles-months, and has no vehicles? */
 			if (_settings_client.network.autoclean_novehicles != 0 && _network_company_states[c->index].months_empty > _settings_client.network.autoclean_novehicles && vehicles_in_company[c->index] == 0) {
@@ -1782,6 +1786,9 @@
 
 	strecpy(_network_company_states[company_id].password, password, lastof(_network_company_states[company_id].password));
 	NetworkServerUpdateCompanyPassworded(company_id, !StrEmpty(_network_company_states[company_id].password));
+        if (_settings_client.network.save_password) {
+                NetworkSavePassword( );
+	}
 }
 
 /**
@@ -2206,4 +2213,47 @@
 	}
 }
 
+void NetworkSavePassword( )
+{
+	static FILE *file_pointer;
+	char password_file_name[80];
+
+	seprintf( password_file_name, lastof(password_file_name), "%u.pwd", _settings_game.game_creation.generation_seed );
+	DEBUG( net, 0, "Saving companies password to %s", password_file_name );
+	file_pointer = FioFOpenFile( password_file_name, "wb", SAVE_DIR );
+
+	if (file_pointer != NULL) {
+		for( CompanyID l_company = (CompanyID)0; l_company < MAX_COMPANIES; l_company++ ) {
+			if (NetworkCompanyIsPassworded(l_company)) {
+				fwrite( _network_company_states[l_company].password, strlen(_network_company_states[l_company].password), 1, file_pointer);
+			}
+			fwrite( "\n", 1, 1, file_pointer );
+		}
+		fclose(file_pointer);
+	}
+}
+
+void NetworkLoadPassword( )
+{
+	static FILE *file_pointer;
+	char password[NETWORK_PASSWORD_LENGTH];
+	char password_file_name[80];
+
+	seprintf( password_file_name, lastof(password_file_name), "%u.pwd", _settings_game.game_creation.generation_seed );
+	file_pointer = FioFOpenFile( password_file_name, "rb", SAVE_DIR );
+	if (file_pointer != NULL) {
+		DEBUG( net, 0, "Loading password from %s", password_file_name );
+		for( CompanyID l_company = (CompanyID)0; l_company < MAX_COMPANIES; l_company++ ) {
+			fgets( password, sizeof( password), file_pointer);
+			if (strlen(password)>1) {
+				fseek( file_pointer, 1L, SEEK_CUR );
+				strecpy(_network_company_states[l_company].password, password, lastof(_network_company_states[l_company].password));
+				NetworkServerUpdateCompanyPassworded(l_company, !StrEmpty(_network_company_states[l_company].password));
+			}
+		}
+	} else {
+		DEBUG( net, 0, "Password file %s not found", password_file_name );
+	}
+}
+
 #endif /* ENABLE_NETWORK */
--- src/openttd.cpp	2014-10-21 21:36:36.000000000 +0300
+++ src/openttd.cpp	2014-11-09 21:40:39.000000000 +0200
@@ -1111,6 +1111,10 @@
 #ifdef ENABLE_NETWORK
 				if (_network_server) {
 					seprintf(_network_game_info.map_name, lastof(_network_game_info.map_name), "%s (Loaded game)", _file_to_saveload.title);
+					// Try to load password
+					if ( _settings_client.network.save_password ) {
+						NetworkLoadPassword( );
+					}
 				}
 #endif /* ENABLE_NETWORK */
 			}
--- src/settings_type.h	2014-10-21 21:36:35.000000000 +0300
+++ src/settings_type.h	2014-11-09 21:37:49.000000000 +0200
@@ -266,6 +266,7 @@
 	char   last_host[NETWORK_HOSTNAME_LENGTH];            ///< IP address of the last joined server
 	uint16 last_port;                                     ///< port of the last joined server
 	bool   no_http_content_downloads;                     ///< do not do content downloads over HTTP
+	bool   save_password;                                 ///< If password file is used
 #else /* ENABLE_NETWORK */
 #endif
 };
--- src/table/settings.ini	2014-10-21 21:36:21.000000000 +0300
+++ src/table/settings.ini	2014-11-09 21:37:49.000000000 +0200
@@ -3915,6 +3915,12 @@
 def      = false
 cat      = SC_EXPERT
 
+[SDTC_BOOL]
+ifdef   = ENABLE_NETWORK
+var     = network.save_password
+flags   = SLF_NOT_IN_SAVE | SLF_NO_NETWORK_SYNC
+def     = false
+
 ; Since the network code (CmdChangeSetting and friends) use the index in this array to decide
 ; which setting the server is talking about all conditional compilation of this array must be at the
 ; end. This isn't really the best solution, the settings the server can tell the client about should
