diff --git a/src/simutrans/simconvoi.cc b/src/simutrans/simconvoi.cc
index a36173c86..7ea74145f 100644
--- a/src/simutrans/simconvoi.cc
+++ b/src/simutrans/simconvoi.cc
@@ -654,6 +654,7 @@ void convoi_t::add_running_cost( const weg_t *weg )
 	if(  weg  &&  weg->get_owner()!=get_owner()  &&  weg->get_owner()!=NULL  ) {
 		// running on non-public way costs toll (since running costs are positive => invert)
 		sint64 toll = -(sum_running_costs*welt->get_settings().get_way_toll_runningcost_percentage())/100l;
+		sint64 toll_wayobj = 0;
 		if(  welt->get_settings().get_way_toll_waycost_percentage()  ) {
 			if(  weg->is_electrified()  &&  (needs_electrification()  ||  can_use_electrification())) {
 				// toll for using electricity
@@ -663,7 +664,8 @@ void convoi_t::add_running_cost( const weg_t *weg )
 					obj_t *d=gr->obj_bei(i);
 					if(  wayobj_t const* const wo = obj_cast<wayobj_t>(d)  )  {
 						if(  wo->get_waytype()==weg->get_waytype()  ) {
-							toll += (wo->get_desc()->get_maintenance()*welt->get_settings().get_way_toll_waycost_percentage())/100l;
+							toll_wayobj += (wo->get_desc()->get_maintenance()*welt->get_settings().get_way_toll_waycost_percentage())/100l;
+							wo->get_owner()->book_toll_received( toll_wayobj, get_schedule()->get_waytype() );
 							break;
 						}
 					}
@@ -677,9 +679,9 @@ void convoi_t::add_running_cost( const weg_t *weg )
 			toll += (weg->get_desc()->get_maintenance()*welt->get_settings().get_way_toll_waycost_percentage())/100l;
 		}
 		weg->get_owner()->book_toll_received( toll, get_schedule()->get_waytype() );
-		get_owner()->book_toll_paid(         -toll, get_schedule()->get_waytype() );
-		book( -toll, CONVOI_WAYTOLL);
-		book( -toll, CONVOI_PROFIT);
+		get_owner()->book_toll_paid(         -toll-toll_wayobj, get_schedule()->get_waytype() );
+		book( -toll-toll_wayobj, CONVOI_WAYTOLL);
+		book( -toll-toll_wayobj, CONVOI_PROFIT);
 	}
 	get_owner()->book_running_costs( sum_running_costs, get_schedule()->get_waytype());
 
diff --git a/src/simutrans/tool/simtool.cc b/src/simutrans/tool/simtool.cc
index fdcebfc0d..e5f70337f 100644
--- a/src/simutrans/tool/simtool.cc
+++ b/src/simutrans/tool/simtool.cc
@@ -313,7 +313,7 @@ static halthandle_t suche_nahe_haltestelle(player_t *player, karte_t *welt, koor
 
 
 // converts a 2d koord to a suitable ground pointer
-static grund_t *tool_intern_koord_to_weg_grund(player_t *player, karte_t *welt, koord3d pos, waytype_t wt)
+static grund_t *tool_intern_koord_to_weg_grund(player_t *player, karte_t *welt, koord3d pos, waytype_t wt, const bool need_wayobj_check=true)
 {
 	// check for valid ground
 	grund_t *gr=welt->lookup(pos);
@@ -350,6 +350,11 @@ static grund_t *tool_intern_koord_to_weg_grund(player_t *player, karte_t *welt,
 	}
 	// check for ownership
 	if(gr->get_weg(wt)->get_removal_error(player)!=NULL){
+		// the way owner is not me, but we must check wayobj owner in some cases:
+		if(need_wayobj_check&&gr->get_wayobj(wt)&&gr->get_wayobj(wt)->get_removal_error(player)==NULL) {
+			// active player's wayobj found!
+			return gr;
+		}
 		return NULL;
 	}
 	// ok, now we have a valid ground
@@ -3865,7 +3870,7 @@ bool tool_build_wayobj_t::calc_route( route_t &verbindung, player_t *player, con
 uint8 tool_build_wayobj_t::is_valid_pos( player_t* player, const koord3d& pos, const char *&error, const koord3d & )
 {
 	// search for starting ground
-	grund_t *gr=tool_intern_koord_to_weg_grund(player, welt, pos, wt );
+	grund_t *gr=tool_intern_koord_to_weg_grund(player, welt, pos, wt, true );
 	if(  gr == NULL  ) {
 		DBG_MESSAGE("tool_build_wayobj_t::is_within_limits()", "no ground on %s",pos.get_str());
 		// wrong ground or not this way here => exit
