Index: trunk/src/simutrans/dataobj/translator.cc
===================================================================
--- trunk/src/simutrans/dataobj/translator.cc	(Revision 11132)
+++ trunk/src/simutrans/dataobj/translator.cc	(Arbeitskopie)
@@ -651,7 +651,20 @@
 	return get_lang()->translate(str);
 }
 
+const char *translator::translate_obj_details(const char *str)
+{
+	char text_key[256];
+	sprintf(text_key, "obj_%s_details", str);
+	const char* translatet_detail = get_lang()->translate(text_key);
+	if (translatet_detail && translatet_detail != text_key) {
+		return translatet_detail;
+	}
+	else {
+		return NULL;
+	}
+}
 
+
 const char *translator::translate(const char *str, int lang)
 {
 	return langs[lang].translate(str);
Index: trunk/src/simutrans/dataobj/translator.h
===================================================================
--- trunk/src/simutrans/dataobj/translator.h	(Revision 11132)
+++ trunk/src/simutrans/dataobj/translator.h	(Arbeitskopie)
@@ -118,6 +118,11 @@
 	static const char *translate(const char* str, int lang);
 
 	/**
+	 * Returns a translated detail text or NULL if not present
+	 */
+	static const char *translate_obj_details(const char* str);
+
+	/**
 	 * @return replacement info for almost any object within the game
 	 */
 	static const char *compatibility_name(const char* str);
Index: trunk/src/simutrans/ground/grund.cc
===================================================================
--- trunk/src/simutrans/ground/grund.cc	(Revision 11132)
+++ trunk/src/simutrans/ground/grund.cc	(Arbeitskopie)
@@ -590,10 +590,10 @@
 	if(!is_water()) {
 		if(flags&has_way1) {
 			// bridges / tunnels only carry dummy ways
-			if(ist_tunnel()  ||  ist_bruecke()) {
-				buf.append(translator::translate(get_weg_nr(0)->get_name()));
-				buf.append("\n");
-			}
+//			if(ist_tunnel()  ||  ist_bruecke()) {
+//				buf.append(translator::translate(get_weg_nr(0)->get_name()));
+//				buf.append("\n");
+//			}
 			obj_bei(0)->info(buf);
 			// creator of bridge or tunnel graphic
 			const char* maker = NULL;
Index: trunk/src/simutrans/gui/obj_info.cc
===================================================================
--- trunk/src/simutrans/gui/obj_info.cc	(Revision 11132)
+++ trunk/src/simutrans/gui/obj_info.cc	(Arbeitskopie)
@@ -24,6 +24,11 @@
 void obj_infowin_t::fill_buffer()
 {
 	buf.clear();
+	const char* translatet_detail = translator::translate_obj_details(get_obj()->get_name());
+	if (translatet_detail != NULL) {
+		buf.append( translatet_detail );
+		buf.append( "\n\n" );
+	}
 	get_obj()->info(buf);
 }
Index: trunk/src/simutrans/gui/vehiclelist_frame.cc
===================================================================
--- trunk/src/simutrans/gui/vehiclelist_frame.cc	(Revision 11133)
+++ trunk/src/simutrans/gui/vehiclelist_frame.cc	(Arbeitskopie)
@@ -45,13 +45,17 @@
 	}
 	height = h;
 
-	// name is the widest entry in column 1
-	name_width = proportional_string_width( translator::translate( veh->get_name(), world()->get_settings().get_name_language_id() ) );
+	// build name part
+	part_name.clear();
+	part_name.append(translator::translate( veh->get_name(), world()->get_settings().get_name_language_id() ));
 	if( veh->get_power() > 0 ) {
-		char str[ 256 ];
-		sprintf( str, " (%s)", translator::translate( vehicle_builder_t::engine_type_names[ veh->get_engine_type() + 1 ] ) );
-		name_width += proportional_string_width( str );
+		part_name.printf( " (%s)", translator::translate( vehicle_builder_t::engine_type_names[ veh->get_engine_type() + 1 ] ) );
 	}
+	const char* translatet_detail = translator::translate_obj_details(veh->get_name());
+	if (translatet_detail != NULL) {
+		part_name.append( "\n" );
+		part_name.append( translatet_detail );
+	}
 
 	// column 1
 	part1.clear();
@@ -101,7 +105,36 @@
 	display_calc_proportional_multiline_string_len_width( text2w, text2h, part2);
 	col2_width = text2w;
 
-	height = max( height, max( text1h, text2h ) + LINESPACE );
+	// calculate name and detail-text for with of no more as column 1 + column 2
+	// break line if longer then with of column 1 + column 2
+	char* next_char  = const_cast<char*>(part_name.get_str());
+	char* last_space = NULL;
+	char* last_break = next_char;
+	do {
+		if (*next_char <= ' ' && last_space != NULL) {
+			if (col1_width + col2_width < display_calc_proportional_string_len_width(last_break, next_char-last_break/*=len*/)) {
+				*last_space = '\n'; // change ' ' to '\n' in part_name
+				last_break = last_space +1;
+				last_space = NULL;
+			}
+		}
+		if (*next_char == '\n') {
+			last_space = NULL;
+			last_break = next_char +1;
+		}
+		if (*next_char == ' ') {
+			last_space = next_char;
+		}
+		if (*next_char == 0) break;
+		next_char++;
+	} while (1);
+
+	int part_name_w, part_name_h;
+	display_calc_proportional_multiline_string_len_width( part_name_w, part_name_h, part_name);
+	name_width = part_name_w;
+	name_height = part_name_h;
+
+	height = max( height, name_height + max( text1h, text2h ) );
 }
 
 
@@ -118,20 +151,10 @@
 
 	// first name
 	offset.x += img_width;
-	int dx = display_proportional_rgb(
-		offset.x, offset.y,
-		translator::translate( veh->get_name(), world()->get_settings().get_name_language_id() ),
-		ALIGN_LEFT|DT_CLIP,
-		veh->is_future(month) ? SYSCOL_TEXT_HIGHLIGHT : (veh->is_available(month) ? SYSCOL_TEXT : gui_theme_t::gui_color_obsolete),
-		false
-	);
-	if( veh->get_power() > 0 ) {
-		char str[ 256 ];
-		sprintf( str, " (%s)", translator::translate( vehicle_builder_t::engine_type_names[ veh->get_engine_type() + 1 ] ) );
-		display_proportional_rgb( offset.x+dx, offset.y, str, ALIGN_LEFT|DT_CLIP, SYSCOL_TEXT, false );
-	}
+	int yyy = offset.y;
+	display_multiline_text_rgb( offset.x, yyy, part_name, veh->is_future(month) ? SYSCOL_TEXT_HIGHLIGHT : (veh->is_available(month) ? SYSCOL_TEXT : gui_theme_t::gui_color_obsolete) );
 
-	int yyy = offset.y + LINESPACE;
+	yyy += name_height;
 	display_multiline_text_rgb( offset.x, yyy, part1, SYSCOL_TEXT );
 
 	display_multiline_text_rgb( offset.x + col1_width, yyy, part2, SYSCOL_TEXT );
Index: trunk/src/simutrans/gui/vehiclelist_frame.h
===================================================================
--- trunk/src/simutrans/gui/vehiclelist_frame.h	(Revision 11133)
+++ trunk/src/simutrans/gui/vehiclelist_frame.h	(Arbeitskopie)
@@ -54,8 +54,9 @@
 {
 private:
 	const vehicle_desc_t *veh;
-	cbuffer_t part1, part2;
+	cbuffer_t part_name,part1, part2;
 	int name_width;
+	int name_height;
 	int col1_width;
 	int col2_width;
 	int height;
 
Index: trunk/src/simutrans/obj/baum.cc
===================================================================
--- trunk/src/simutrans/obj/baum.cc	(Revision 11132)
+++ trunk/src/simutrans/obj/baum.cc	(Arbeitskopie)
@@ -301,7 +301,7 @@
 	obj_t::info(buf);
 
 	buf.append( translator::translate(get_desc()->get_name()) );
-	buf.append( "\n" );
+	buf.append( "\n\n" );
 
 	const int age = (int)get_age();
 	buf.printf( translator::translate("%i years %i months old."), age/12, (age%12) );
Index: trunk/src/simutrans/obj/way/weg.cc
===================================================================
--- trunk/src/simutrans/obj/way/weg.cc	(Revision 11132)
+++ trunk/src/simutrans/obj/way/weg.cc	(Arbeitskopie)
@@ -225,6 +225,15 @@
 }
 
 
+void weg_t::show_info()
+{
+	// check for way details
+	if (translator::translate_obj_details(get_desc()->get_name())) {
+		obj_t::show_info();
+	}
+}
+
+
 void weg_t::info(cbuffer_t & buf) const
 {
 	obj_t::info(buf);
Index: trunk/src/simutrans/obj/way/weg.h
===================================================================
--- trunk/src/simutrans/obj/way/weg.h	(Revision 11132)
+++ trunk/src/simutrans/obj/way/weg.h	(Arbeitskopie)
@@ -169,6 +169,10 @@
 	/**
 	* Info-text for this way
 	*/
+	/// @copydoc obj_t::show_info
+	void show_info() OVERRIDE;
+
+	/// @copydoc obj-t::info
 	void info(cbuffer_t & buf) const OVERRIDE;
 
 	/**
