diff --git src/simutrans/simfab.cc src/simutrans/simfab.cc
index 408826c29..58f00b903 100644
--- src/simutrans/simfab.cc
+++ src/simutrans/simfab.cc
@@ -2923,106 +2923,126 @@ void fabrik_t::open_info_window()
 void fabrik_t::info_prod(cbuffer_t& buf) const
 {
 	buf.clear();
-	buf.append( translator::translate("Durchsatz") );
-	buf.append(get_current_production(), 0);
-	buf.append( translator::translate("units/day") );
-	buf.append("\n");
-	buf.printf(translator::translate("Produces: %.1f units/minute"),
-		get_production_per_second() * 60.0
+	buf.printf(translator::translate("Production cycles: %d/month (%.1f/minute)"),
+		get_current_production(), get_production_per_second() * 60.0
 	);
 
-	if (!output.empty()) {
-		buf.append("\n\n");
-		buf.append(translator::translate("Produktion"));
-
-		for (uint32 index = 0; index < output.get_count(); index++) {
-			goods_desc_t const *const type = output[index].get_typ();
-			sint64 const pfactor = (sint64)desc->get_product(index)->get_factor();
-
-			buf.append("\n - ");
-			if(  welt->get_settings().get_just_in_time() >= 2  ) {
-				double const pfraction = (double)pfactor / (double)DEFAULT_PRODUCTION_FACTOR;
-				double const storage_unit = (double)(1 << fabrik_t::precision_bits);
-				buf.printf(translator::translate("%s %.0f%% : %.0f/%.0f @ %.1f%%"),
-					translator::translate(type->get_name()),
-					pfraction * 100.0,
-					(double)output[index].menge * pfraction / storage_unit,
-					(double)output[index].max * pfraction / storage_unit,
-					(double)output[index].calculate_output_production_rate() * 100.0 / (double)(1 << 16)
-				);
-			}
-			else {
-				buf.printf("%s %u/%u%s",
-					translator::translate(type->get_name()),
-					(uint32) convert_goods( (sint64)output[index].menge * pfactor),
-					(uint32) convert_goods( (sint64)output[index].max * pfactor),
-					translator::translate(type->get_mass())
-				);
-
-				if(type->get_catg() != 0) {
-					buf.append(", ");
-					buf.append(translator::translate(type->get_catg_name()));
-				}
-
-				buf.printf(", %u%%", (uint32)((FAB_PRODFACT_UNIT_HALF + (sint32)pfactor * 100) >> DEFAULT_PRODUCTION_FACTOR_BITS));
-			}
-		}
-	}
-
 	if (!input.empty()) {
-		buf.append("\n\n");
+		buf.append("\n");
 		buf.append(translator::translate("Verbrauch"));
 
 		for (uint32 index = 0; index < input.get_count(); index++) {
 			sint64 const pfactor = (sint64)desc->get_supplier(index)->get_consumption();
 
-			const char *cat_name = "";
-			const char *cat_seperator = "";
+			const char *catg_name = NULL;
 			if(  input[index].get_typ()->get_catg() > 0  ) {
-				cat_name = translator::translate(input[index].get_typ()->get_catg_name());
-				cat_seperator = ", ";
+				catg_name = translator::translate(input[index].get_typ()->get_catg_name());
 			}
 
 			buf.append("\n - ");
 			if(  welt->get_settings().get_just_in_time() >= 2  ) {
-				double const pfraction = (double)pfactor / (double)DEFAULT_PRODUCTION_FACTOR;
+				double const pfraction    = (double)pfactor / (double)DEFAULT_PRODUCTION_FACTOR;
 				double const storage_unit = (double)(1 << fabrik_t::precision_bits);
-				buf.printf(translator::translate("%s %.0f%% : %.0f+%u/%.0f%s, %s%s%.1f%%"),
-					translator::translate(input[index].get_typ()->get_name()),
+
+				buf.printf(translator::translate("%.0f%% %s%s%s%s @ %.1f%%, %.0f+%u/%.0f%s"),
 					pfraction * 100.0,
+
+					translator::translate(input[index].get_typ()->get_name()),
+					catg_name ? " ("      : "",
+					catg_name ? catg_name : "",
+					catg_name ? ")"       : "",
+					(double)input[index].calculate_demand_production_rate() * 100.0 / (double)(1 << 16),
+
 					(double)input[index].menge * pfraction / storage_unit,
 					(uint32)input[index].get_in_transit(),
-					(double)input[index].max * pfraction / storage_unit,
-					translator::translate(input[index].get_typ()->get_mass()),
-					cat_name, cat_seperator,
-					(double)input[index].calculate_demand_production_rate() * 100.0 / (double)(1 << 16)
+					(double)input[index].max   * pfraction / storage_unit,
+					translator::translate(input[index].get_typ()->get_mass())
 				);
 			}
 			else if(  welt->get_settings().get_factory_maximum_intransit_percentage()  ) {
-				buf.printf("%s %u/%i(%i)/%u%s, %s%s%u%%",
+				buf.printf("%u%% %s%s%s%s %u+%i(%i)/%u%s",
+					(uint32)((FAB_PRODFACT_UNIT_HALF + (sint32)pfactor * 100) >> DEFAULT_PRODUCTION_FACTOR_BITS),
+
 					translator::translate(input[index].get_typ()->get_name()),
+					catg_name ? " ("      : "",
+					catg_name ? catg_name : "",
+					catg_name ? ")"       : "",
+
 					(uint32) convert_goods( (sint64)input[index].menge * pfactor),
 					input[index].get_in_transit(),
 					input[index].max_transit,
 					(uint32) convert_goods( (sint64)input[index].max * pfactor),
-					translator::translate(input[index].get_typ()->get_mass()),
-					cat_name, cat_seperator,
-					(uint32)((FAB_PRODFACT_UNIT_HALF + (sint32)pfactor * 100) >> DEFAULT_PRODUCTION_FACTOR_BITS)
+					translator::translate(input[index].get_typ()->get_mass())
 				);
 			}
 			else {
-				buf.printf("%s %u/%i/%u%s, %s%s%u%%",
+				buf.printf("%u%% %s%s%s%s, %u+%i/%u%s",
+					(uint32)((FAB_PRODFACT_UNIT_HALF + (sint32)pfactor * 100) >> DEFAULT_PRODUCTION_FACTOR_BITS),
+
 					translator::translate(input[index].get_typ()->get_name()),
+					catg_name ? " ("      : "",
+					catg_name ? catg_name : "",
+					catg_name ? ")"       : "",
+
 					(uint32) convert_goods( (sint64)input[index].menge * pfactor),
 					input[index].get_in_transit(),
 					(uint32) convert_goods( (sint64)input[index].max * pfactor),
-					translator::translate(input[index].get_typ()->get_mass()),
-					cat_name, cat_seperator,
-					(uint32)((FAB_PRODFACT_UNIT_HALF + (sint32)pfactor * 100) >> DEFAULT_PRODUCTION_FACTOR_BITS)
+					translator::translate(input[index].get_typ()->get_mass())
 				);
 			}
 		}
 	}
+
+	if (!output.empty()) {
+		buf.append("\n");
+		buf.append(translator::translate("Produktion"));
+
+		for (uint32 index = 0; index < output.get_count(); index++) {
+			goods_desc_t const *const type = output[index].get_typ();
+			sint64 const pfactor = (sint64)desc->get_product(index)->get_factor();
+
+			const char *catg_name = NULL;
+			if(  output[index].get_typ()->get_catg() > 0  ) {
+				catg_name = translator::translate(output[index].get_typ()->get_catg_name());
+			}
+
+			buf.append("\n - ");
+			if(  welt->get_settings().get_just_in_time() >= 2  ) {
+				double const pfraction    = (double)pfactor / (double)DEFAULT_PRODUCTION_FACTOR;
+				double const storage_unit = (double)(1 << fabrik_t::precision_bits);
+
+				buf.printf(translator::translate("%.0f%% %s%s%s%s @ %.1f%%, %.0f/%.0f%s"),
+					pfraction * 100.0,
+
+					translator::translate(type->get_name()),
+					catg_name ? " ("      : "",
+					catg_name ? catg_name : "",
+					catg_name ? ")"       : "",
+
+					(double)output[index].calculate_output_production_rate() * 100.0 / (double)(1 << 16),
+					(double)output[index].menge * pfraction / storage_unit,
+					(double)output[index].max   * pfraction / storage_unit,
+					translator::translate(type->get_mass())
+				);
+			}
+			else {
+				buf.printf(translator::translate("%u%% %s%s%s%s, %u/%u%s"),
+					(uint32)((FAB_PRODFACT_UNIT_HALF + (sint32)pfactor * 100) >> DEFAULT_PRODUCTION_FACTOR_BITS),
+
+					translator::translate(type->get_name()),
+					catg_name ? " ("      : "",
+					catg_name ? catg_name : "",
+					catg_name ? ")"       : "",
+
+					(uint32) convert_goods( (sint64)output[index].menge * pfactor),
+					(uint32) convert_goods( (sint64)output[index].max   * pfactor),
+					translator::translate(type->get_mass())
+				);
+			}
+		}
+	}
+
+	buf.append("\n");
 }
 
 
