diff --git simutrans/history.txt simutrans/history.txt
index 7f42fa317..cfcba75a5 100644
--- simutrans/history.txt
+++ simutrans/history.txt
@@ -1,3 +1,4 @@
+	ADD: new freight sorting order "via (player)" groups goods by owner of their next transfer stop
 	FIX: stations on bridge heads drawn too low
 
 
diff --git simutrans/text/en/convoiinfo.txt simutrans/text/en/convoiinfo.txt
index 1247aa449..1c0af9524 100644
--- simutrans/text/en/convoiinfo.txt
+++ simutrans/text/en/convoiinfo.txt
@@ -91,3 +91,4 @@ The option-button (which changes its name with your selection) sorts the list of
  - <em>via (amount):</em> sorts items carried by quantity headed to first transfer <a href="station.txt">stop</a>.<br>
  - <em>amount:</em> sorts items carried by quantity in descending order.
 </p>
+ - <em>via (player):</em> sorts items carried by quantity headed to transfer <a href="station.txt">stops</a> of different players.<br>
diff --git simutrans/text/en/station.txt simutrans/text/en/station.txt
index 32eb3aa6b..c062b330d 100644
--- simutrans/text/en/station.txt
+++ simutrans/text/en/station.txt
@@ -60,6 +60,7 @@ Option-button (changes name with selection) sorts of items within groups:<br>
  - <em>via (amount):</em> ?sorts items by quantity headed to first transfer Stop.<br>
  - <em>amount:</em> sorts items by quantity in descending order.<br>
 {Tips: goods-colour-bars above a Stop in game-view (use [!] to toggle) indicate quantity of items that wait for transport and are the same colour as <a href="goods_filter.txt">colour-squares</a> in Goods List.}
+ - <em>via (player):</em> ?sorts items by quantity headed to transfer Stops of different player.<br>
 </p>
 <p>
 <em>Chart:</em> click option-button to toggle graph (button is indentented when graph is visible) in <strong>Stop Information</strong>.<br>
diff --git src/simutrans/freight_list_sorter.cc src/simutrans/freight_list_sorter.cc
index a067a1809..9b704fa48 100644
--- src/simutrans/freight_list_sorter.cc
+++ src/simutrans/freight_list_sorter.cc
@@ -12,6 +12,7 @@
 #include "simfab.h"
 #include "simmem.h"
 #include "world/simworld.h"
+#include "player/simplay.h"
 
 #include "dataobj/translator.h"
 
@@ -160,6 +161,26 @@ void freight_list_sorter_t::sort_freight(vector_tpl<ware_t> const& warray, cbuff
 				}
 			}
 		}
+
+		else if(  sort_mode == by_via_player  ) {
+			// player sort mode merges packets which next stop is owned by the
+			// same player
+			for(  int i=0;  i<pos;  i++  ) {
+				ware_t& wi = wlist[i];
+				if(  wi.get_index()==ware.get_index()  &&  ware.get_via_halt().is_bound() && wi.get_via_halt().is_bound()  &&  ware.get_via_halt()->get_owner() == wi.get_via_halt()->get_owner()  ) {
+					ware_t::goods_amount_t const remaining_amount = wi.add_goods(ware.amount);
+					if(  remaining_amount > 0  ) {
+						// reached goods amount limit, have to discard amount and track category totals separatly
+						if(  categories_goods_amount_lost == NULL  ) {
+							categories_goods_amount_lost = new uint64[256](); // this should be tied to a category index limit constant
+						}
+						categories_goods_amount_lost[wi.get_desc()->get_catg_index()]+= remaining_amount;
+					}
+					--pos;
+					break;
+				}
+			}
+		}
 		pos++;
 	}
 
@@ -227,6 +248,13 @@ void freight_list_sorter_t::sort_freight(vector_tpl<ware_t> const& warray, cbuff
 			char const *const good_description_format = sortby == by_via_sum  &&  ware.is_goods_amount_maxed() ? "  >=%u%s %s > " : "  %u%s %s > ";
 			buf.printf(good_description_format, ware.amount, translator::translate(desc.get_mass()), translator::translate(desc.get_name()));
 
+			// special mode: simply retrieve player name
+			if(  sortby==by_via_player  ) {
+				buf.append(via_halt->get_owner()->get_name());
+				buf.append("\n");
+				continue;
+			}
+
 			// the target name is not correct for the via sort
 			const bool is_factory_going = ( sortby!=by_via_sum  &&  ware.to_factory ); // exclude merged packets
 			if(  sortby!=by_via_sum  ||  via_halt==halt  ) {
diff --git src/simutrans/freight_list_sorter.h src/simutrans/freight_list_sorter.h
index 9afdf05f8..6a3d5fab4 100644
--- src/simutrans/freight_list_sorter.h
+++ src/simutrans/freight_list_sorter.h
@@ -22,10 +22,11 @@ class freight_list_sorter_t
 {
 public:
 	enum sort_mode_t {
-		by_name    = 0,
-		by_via     = 1,
-		by_via_sum = 2,
-		by_amount  = 3
+		by_name       = 0,
+		by_via        = 1,
+		by_via_sum    = 2,
+		by_amount     = 3,
+		by_via_player = 4
 	};
 
 	static void sort_freight(vector_tpl<ware_t> const& warray, cbuffer_t& buf, sort_mode_t sort_mode, const slist_tpl<ware_t>* full_list, const char* what_doing);
diff --git src/simutrans/gui/convoi_info.cc src/simutrans/gui/convoi_info.cc
index 21b1cbfeb..2036691f6 100644
--- src/simutrans/gui/convoi_info.cc
+++ src/simutrans/gui/convoi_info.cc
@@ -64,12 +64,14 @@ bool convoi_info_t::route_search_in_progress=false;
  *                 1 = via
  *                 2 = via_amount
  *                 3 = amount
+ *                 4 = via_player
  */
 const char *convoi_info_t::sort_text[SORT_MODES] = {
 	"Zielort",
 	"via",
 	"via Menge",
-	"Menge"
+	"Menge",
+	"via Spieler"
 };
 
 
diff --git src/simutrans/gui/convoi_info.h src/simutrans/gui/convoi_info.h
index 0d9c45501..331d25255 100644
--- src/simutrans/gui/convoi_info.h
+++ src/simutrans/gui/convoi_info.h
@@ -39,7 +39,8 @@ public:
 		by_via         = 1,
 		by_amount_via  = 2,
 		by_amount      = 3,
-		SORT_MODES     = 4
+		by_via_player  = 4,
+		SORT_MODES     = 5
 	};
 
 private:
diff --git src/simutrans/gui/halt_info.cc src/simutrans/gui/halt_info.cc
index 7bf897f3a..59c9c560a 100644
--- src/simutrans/gui/halt_info.cc
+++ src/simutrans/gui/halt_info.cc
@@ -191,11 +191,12 @@ karte_ptr_t gui_departure_board_t::welt;
 karte_ptr_t gui_halt_detail_t::gui_line_button_t::welt;
 
 
-static const char *sort_text[4] = {
+static const char *sort_text[5] = {
 	"Zielort",
 	"via",
 	"via Menge",
-	"Menge"
+	"Menge",
+	"via Spieler"
 };
 
 const char cost_type[MAX_HALT_COST][64] =
@@ -966,7 +967,7 @@ void gui_departure_board_t::insert_image(convoihandle_t cnv)
 bool halt_info_t::action_triggered( gui_action_creator_t *comp,value_t /* */)
 {
 	if (comp == &sort_button) {
-		env_t::default_sortmode = ((int)(halt->get_sortby())+1)%4;
+		env_t::default_sortmode = ((int)(halt->get_sortby())+1)%5;
 		halt->set_sortby((freight_list_sorter_t::sort_mode_t) env_t::default_sortmode);
 		sort_button.set_text(sort_text[env_t::default_sortmode]);
 	}
