diff --git src/simutrans/simhalt.cc src/simutrans/simhalt.cc
index bca327953..befbdf752 100644
--- src/simutrans/simhalt.cc
+++ src/simutrans/simhalt.cc
@@ -2674,27 +2674,31 @@ sint64 haltestelle_t::calc_maintenance() const
 
 
 // changes this to a public transfer exchange stop
-void haltestelle_t::change_owner( player_t *player )
+void haltestelle_t::change_owner( player_t *player, player_t *whom )
 {
 	// process every tile of stop
 	slist_tpl<halthandle_t> joining;
+	bool tiles_converted = false;
 	for(tile_t const& i : tiles) {
 
 		grund_t* const gr = i.grund;
 		if(  gebaeude_t* gb = gr->find<gebaeude_t>()  ) {
 			// change ownership
-			player_t *gbplayer =gb->get_owner();
-			gb->set_owner(player);
-			gb->set_flag(obj_t::dirty);
-			sint64 const monthly_costs = welt->get_settings().maint_building * gb->get_tile()->get_desc()->get_level();
-			waytype_t const costs_type = gb->get_waytype();
-			player_t::add_maintenance(gbplayer, -monthly_costs, costs_type);
-			player_t::add_maintenance(player, monthly_costs, costs_type);
+			player_t *gbplayer = gb->get_owner();
+			if(  !whom  ||  whom == gbplayer  ) {
+				gb->set_owner(player);
+				gb->set_flag(obj_t::dirty);
+				sint64 const monthly_costs = welt->get_settings().maint_building * gb->get_tile()->get_desc()->get_level();
+				waytype_t const costs_type = gb->get_waytype();
+				player_t::add_maintenance(gbplayer, -monthly_costs, costs_type);
+				player_t::add_maintenance(player, monthly_costs, costs_type);
 
-			// cost is computed as cst_make_public_months
-			sint64 const cost = -welt->scale_with_month_length(monthly_costs * welt->get_settings().cst_make_public_months);
-			player_t::book_construction_costs(gbplayer, cost, get_basis_pos(), costs_type);
-			player_t::book_construction_costs(player, -cost, koord::invalid, costs_type);
+				// cost is computed as cst_make_public_months
+				sint64 const cost = -welt->scale_with_month_length(monthly_costs * welt->get_settings().cst_make_public_months);
+				player_t::book_construction_costs(gbplayer, cost, get_basis_pos(), costs_type);
+				player_t::book_construction_costs(player, -cost, koord::invalid, costs_type);
+				tiles_converted = true;
+			}
 		}
 
 		// change way ownership
@@ -2703,7 +2707,7 @@ void haltestelle_t::change_owner( player_t *player )
 			if(  weg_t *w=gr->get_weg_nr(j)  ) {
 				// change ownership of way...
 				player_t *wplayer = w->get_owner();
-				if(  wplayer!=player) {
+				if( ( !whom || whom == wplayer ) &&  wplayer!=player  ) {
 					w->set_owner( player );
 					w->set_flag(obj_t::dirty);
 					sint64 cost = w->get_desc()->get_maintenance();
@@ -2733,7 +2737,7 @@ void haltestelle_t::change_owner( player_t *player )
 		for(  uint8 i = 1;  i < gr->obj_count();  i++  ) {
 			if(  wayobj_t *const wo = obj_cast<wayobj_t>(gr->obj_bei(i))  ) {
 				player_t *woplayer = wo->get_owner();
-				if(  player==woplayer  ) {
+				if( ( !whom || whom == woplayer ) &&  player==woplayer  ) {
 					sint64 const cost = wo->get_desc()->get_maintenance();
 					// change ownership
 					wo->set_owner( player );
@@ -2746,7 +2750,15 @@ void haltestelle_t::change_owner( player_t *player )
 			}
 		}
 	}
-	owners = 1 << player->get_player_nr();
+	if (whom) {
+		// no tiles belong to player anymore
+		owners &= ~(1 << whom->get_player_nr());
+		if (tiles_converted) {
+			owners |= 1 << player->get_player_nr();
+		}
+	} else {
+		owners = 1 << player->get_player_nr();
+	}
 	if (permissions & (permissions - 1)) {
 		// multiple permissions
 		set_permissions(permissions);
diff --git src/simutrans/simhalt.h src/simutrans/simhalt.h
index eed7cd85b..f960f7e9e 100644
--- src/simutrans/simhalt.h
+++ src/simutrans/simhalt.h
@@ -431,7 +431,11 @@ public:
 
 	void merge_halt( halthandle_t halt_to_join );
 
-	void change_owner( player_t *player );
+	/**
+	 * Changes ownership of halt buildings
+	 * if @p whom != NULL, only this player's buildings are changed
+	 */
+	void change_owner( player_t *player, player_t *whom );
 
 	vector_tpl<connection_t> const& get_pax_connections()  const { return all_links[goods_manager_t::INDEX_PAS].connections;  }
 	vector_tpl<connection_t> const& get_mail_connections() const { return all_links[goods_manager_t::INDEX_MAIL].connections; }
diff --git src/simutrans/tool/simtool.cc src/simutrans/tool/simtool.cc
index fcc8172eb..9f9b58d0c 100644
--- src/simutrans/tool/simtool.cc
+++ src/simutrans/tool/simtool.cc
@@ -7126,7 +7126,7 @@ const char *tool_make_stop_public_t::work( player_t *player, koord3d p )
 	}
 
 	// change ownership
-	halt->change_owner( welt->get_public_player() );
+	halt->change_owner( welt->get_public_player(), player );
 	halt->merge_halt( merge_to );
 
 	return NULL;
