diff --git src/simutrans/simhalt.cc src/simutrans/simhalt.cc
index 41bdde604..888b82802 100644
--- src/simutrans/simhalt.cc
+++ src/simutrans/simhalt.cc
@@ -477,6 +477,8 @@ haltestelle_t::haltestelle_t(loadsave_t* file)
 	status_color = SYSCOL_TEXT_UNUSED;
 	last_status_color = gfx->palette_lookup(COL_PURPLE);
 	last_bar_count = 0;
+	last_permissions = 0;
+	last_player_count = 0;
 
 	reconnect_counter = welt->get_schedule_counter()-1;
 
@@ -3193,6 +3195,14 @@ void haltestelle_t::recalc_status()
  */
 void haltestelle_t::display_status(sint16 xpos, sint16 ypos)
 {
+	// Do we need to display permissions?
+	uint16 player_count = 0;
+	for(  uint16 i = 0;  i <	PLAYER_UNOWNED;  i++  ) {
+		if(  (permissions&(1<<i))  &&  welt->get_player(i)  &&  !welt->get_player(i)->is_public_service()  ) {
+			player_count += 1;
+		}
+	}
+ 
 	// ignore freight that cannot reach to this station
 	sint16 count = 0;
 	for(  uint16 i = 0;  i < goods_manager_t::get_count();  i++  ) {
@@ -3205,8 +3215,33 @@ void haltestelle_t::display_status(sint16 xpos, sint16 ypos)
 	}
 	ypos += -D_WAITINGBAR_WIDTH - LINESPACE/6;
 
-	if(  count != last_bar_count  ) {
-		// bars will shift x positions, mark entire station bar region dirty
+	bool players_dirty = false;
+	if(  permissions != last_permissions  ) {
+		if(  last_player_count  ) {
+			// erase old permissions display
+			const sint16 x = xpos - (last_player_count * 17 - gfx->get_tile_raster_width()) / 2;
+			gfx->mark_rect_dirty_wc( x, ypos, x + last_player_count * 17, ypos + D_WAITINGBAR_WIDTH );
+		}
+		last_permissions = permissions;
+		last_player_count = player_count;
+		players_dirty = true;
+	}
+	if(  player_count > 1  ) {
+		uint8 old_count = 0;
+		sint16 x = xpos - (player_count * 17 - gfx->get_tile_raster_width()) / 2;
+		for(  uint16 i = 0;  i <PLAYER_UNOWNED;  i++  ) {
+			if(  (permissions&(1<<i))  &&  welt->get_player(i)  &&  !welt->get_player(i)->is_public_service()  ) {
+				const PIXVAL color = gfx->palette_lookup(welt->get_player(i)->get_player_color1()+4);
+				gfx->draw_rect_clipped( x, ypos, 16, D_WAITINGBAR_WIDTH, color, false CLIP_NUM_DEFAULT);
+				x += 17;
+			}
+		}
+		ypos += -D_WAITINGBAR_WIDTH - 1;
+	}
+
+	if(  count != last_bar_count  ||  players_dirty  ) {
+		// bars will shift x positions, extra players may shift y positions,
+		// mark entire station bar region dirty
 		scr_coord_val max_bar_height = 0;
 		for(  sint16 i = 0;  i < last_bar_count;  i++  ) {
 			if(  last_bar_height[i] > max_bar_height  ) {
diff --git src/simutrans/simhalt.h src/simutrans/simhalt.h
index 63a26dbd6..b0a3d3318 100644
--- src/simutrans/simhalt.h
+++ src/simutrans/simhalt.h
@@ -116,6 +116,8 @@ private:
 	void init_financial_history();
 
 	PIXVAL status_color, last_status_color;
+	uint16 last_permissions;
+	uint16 last_player_count;
 	sint16 last_bar_count;
 	vector_tpl<scr_coord_val> last_bar_height; // caches the last height of the station bar for each good type drawn in display_status(). used for dirty tile management
 	uint32 capacity[3]; // passenger, mail, goods
