diff --git cmake/SimutransSourceList.cmake cmake/SimutransSourceList.cmake
index 315789d4f..ba78610c0 100644
--- cmake/SimutransSourceList.cmake
+++ cmake/SimutransSourceList.cmake
@@ -171,7 +171,6 @@ target_sources(simutrans PRIVATE
 		src/simutrans/gui/pakinstaller.cc
 		src/simutrans/gui/pakselector.cc
 		src/simutrans/gui/password_frame.cc
-		src/simutrans/gui/permission_frame.cc
 		src/simutrans/gui/player_frame.cc
 		src/simutrans/gui/player_ranking_frame.cc
 		src/simutrans/gui/privatesign_info.cc
diff --git src/simutrans/gui/halt_info.cc src/simutrans/gui/halt_info.cc
index 4084e868e..c52997078 100644
--- src/simutrans/gui/halt_info.cc
+++ src/simutrans/gui/halt_info.cc
@@ -577,7 +577,7 @@ void gui_halt_detail_t::update_connections( halthandle_t halt )
 	halt_permissions = halt->get_permissions();
 	for (uint16 i = 0; i < MAX_PLAYER_COUNT; i++) {
 		if (player_t *pl = world()->get_player(i)) {
-			if (i == 1 && !pl->get_finance()->has_convoi()) {
+			if (pl->is_public_service() && !pl->get_finance()->has_convoi()) {
 				// only show public service when it owns convois ...
 				continue;
 			}
@@ -587,19 +587,16 @@ void gui_halt_detail_t::update_connections( halthandle_t halt )
 			}
 			connected_players[i].init(button_t::square_automatic,pl->get_name());
 			connected_players[i].text_color = PLAYER_FLAG | gfx->palette_lookup(pl->get_player_color1() + env_t::gui_player_color_dark);
+			new_component<gui_empty_t>();
 			add_component(connected_players + i);
 			how_many++;
 		}
 		connected_players[i].pressed = halt_permissions & (1<<i);
 	}
-	if (how_many == 0) {
-		// just me active => do not show
+	if (how_many == 0  ||  halt->get_owner()->is_public_service()) {
+		// just me active, or public halt => do not show
 		remove_all();
 	}
-	else if (how_many & 1) {
-		// to not leave it uneven ..
-		new_component<gui_empty_t>();
-	}
 
 	const slist_tpl<fabrik_t *> & fab_list = halt->get_fab_list();
 	slist_tpl<const goods_desc_t *> nimmt_an;
diff --git src/simutrans/simhalt.cc src/simutrans/simhalt.cc
index 42aef2f8b..a3a3b7084 100644
--- src/simutrans/simhalt.cc
+++ src/simutrans/simhalt.cc
@@ -613,7 +613,6 @@ void haltestelle_t::rotate90( const sint16 y_size )
 // add other players to share
 void haltestelle_t::set_permissions(uint16 perms)
 {
-	uint16 old_perm = permissions;
 	if (!owner || owner->is_public_service()) {
 		// old style public stops
 		permissions = 0xFFFF;
@@ -3260,9 +3259,11 @@ 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;
+	if(  !owner->is_public_service()  ) {
+		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;
+			}
 		}
 	}
  
@@ -3290,7 +3291,6 @@ void haltestelle_t::display_status(sint16 xpos, sint16 ypos)
 		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()  ) {
diff --git src/simutrans/simhalt.h src/simutrans/simhalt.h
index 06aaa10e3..0f8d182b1 100644
--- src/simutrans/simhalt.h
+++ src/simutrans/simhalt.h
@@ -719,7 +719,7 @@ public:
 	 * will crash on NULL pointer, but no unowned convois ever ...
 	 * @return true if player is allowed to stop here
 	 */
-	inline bool haltestelle_t::can_use_halt(const player_t* player) const
+	inline bool can_use_halt(const player_t* player) const
 	{
 		return player  &&  (permissions & (1 << player->get_player_nr()))!=0;
 	}
