diff --git a/simutrans/trunk/src/simutrans/display/font.cc b/simutrans/trunk/src/simutrans/display/font.cc
index 02148e192..7699b9dac 100644
--- a/simutrans/trunk/src/simutrans/display/font.cc
+++ b/simutrans/trunk/src/simutrans/display/font.cc
@@ -15,22 +15,20 @@
 #include "../dataobj/environment.h"
 #endif
 
+#include <math.h>
 #include <cassert>
 #include <cstdio>
 #include <cstdlib>
 #include <cstring>
 
 
-// if defined, for the old .fnt files a .bdf core will be generated
-// #define DUMP_OLD_FONTS
-
-
 font_t::glyph_t::glyph_t() :
-	yoff(0),
+	height(0),
 	width(0),
-	advance(0xFF)
+	advance(0xFF),
+	top(0)
 {
-	memset(bitmap, 0, sizeof(bitmap));
+	bitmap = 0;
 }
 
 
@@ -41,6 +39,8 @@ font_t::font_t() :
 	fname[0] = 0;
 }
 
+#if 0
+// FIXME
 
 /// Decodes a single line of a glyph
 static void dsp_decode_bdf_data_row(font_t::glyph_t *target, int y, int xoff, int g_width, const char *str)
@@ -233,7 +233,7 @@ bool font_t::load_from_bdf(FILE *bdf_file)
 
 	return true;
 }
-
+#endif
 
 #ifdef USE_FREETYPE
 
@@ -241,10 +241,13 @@ bool font_t::load_from_bdf(FILE *bdf_file)
 #include FT_FREETYPE_H
 #include FT_GLYPH_H
 #include FT_TRUETYPE_TABLES_H
+#include FT_BITMAP_H
 
 
 bool font_t::load_from_freetype(const char *fname, int pixel_height)
 {
+	dbg->message( "font_t::load_from_freetype", "trying to load '%s' in size %d", fname, pixel_height);
+
 	FT_Library ft_library = NULL;
 	if(  FT_Init_FreeType(&ft_library) != FT_Err_Ok  ) {
 		dbg->error( "font_t::load_from_freetype", "Freetype initialization failed" );
@@ -255,39 +258,60 @@ bool font_t::load_from_freetype(const char *fname, int pixel_height)
 	FT_Face face;
 
 	if(  FT_New_Face( ft_library, fname, 0, &face ) != FT_Err_Ok  ) {
-		dbg->error( "font_t::load_from_freetype", "Cannot load %s", fname );
+		dbg->warning( "font_t::load_from_freetype", "Cannot load %s", fname );
 		FT_Done_FreeType( ft_library );
 		return false;
 	}
 
 	if(  FT_Set_Pixel_Sizes( face, 0, pixel_height ) != FT_Err_Ok  ) {
-		dbg->error( "font_t::load_from_freetype", "Cannot load %s", fname);
-		FT_Done_Face(face);
-		FT_Done_FreeType(ft_library);
-		return false;
+		dbg->warning( "font_t::load_from_freetype", "Cannot set pixel size %d for %s", pixel_height, fname);
+
+		// try to find closest available pixel_height
+		int best = -1;
+		for (int i=0; i<face->num_fixed_sizes; i++) {
+			int h = (face->available_sizes[i].y_ppem + 32) >> 6;
+			if (best == -1  ||  abs(best - pixel_height) > abs(h - pixel_height)) {
+				best = h;
+			}
+		}
+
+		if (best == -1) {
+			// failed
+			FT_Done_Face(face);
+			FT_Done_FreeType(ft_library);
+			return false;
+		}
+		if(  FT_Set_Pixel_Sizes( face, 0, best) != FT_Err_Ok  ) {
+			dbg->warning( "font_t::load_from_freetype", "Cannot set pixel size %d for %s", best, fname);
+		}
+		// continue anyway
 	}
 
 	glyphs.resize(0x10000);
 
-	const sint16 ascent = face->size->metrics.ascender/64;
-	linespace           = min( face->size->metrics.height/64, (FT_Pos)GLYPH_BITMAP_HEIGHT );
-	descent             = face->size->metrics.descender/64;
+	ascent    = face->size->metrics.ascender/64;
+	linespace = face->size->metrics.height/64;
+	descent   = face->size->metrics.descender/64;
 
 	tstrncpy( this->fname, fname, lengthof(this->fname) );
 
 	uint32 num_glyphs = 0;
 
+	// 8 bit bitmap
+	FT_Bitmap bitmap_8;
+	FT_Bitmap_Init(&bitmap_8);
+
 	for(  uint32 glyph_nr=0;  glyph_nr<0xFFFF;  glyph_nr++  ) {
 
 		/* load glyph image into the slot (erase previous one) */
-		if(  FT_Load_Char( face, glyph_nr, FT_LOAD_RENDER | FT_LOAD_MONOCHROME ) != FT_Err_Ok  ) {
+		if(  FT_Load_Char( face, glyph_nr, FT_LOAD_RENDER) != FT_Err_Ok  ) {
 			// glyph not there ...
 			glyphs[glyph_nr].advance = 0xFF;
 			continue;
 		}
 
-		const FT_Error error = FT_Render_Glyph( face->glyph, FT_RENDER_MODE_MONO );
-		if(  error != FT_Err_Ok  ||  face->glyph->bitmap.pitch == 0  ) {
+		const FT_Error error = FT_Render_Glyph(face->glyph, FT_RENDER_MODE_NORMAL);
+		if(error != FT_Err_Ok) {
 			// glyph not there ...
 			glyphs[glyph_nr].advance = 0xFF;
 			continue;
@@ -301,32 +325,63 @@ bool font_t::load_from_freetype(const char *fname, int pixel_height)
 		 * the glyph base is at slot->bitmap_left, CELL_HEIGHT - slot->bitmap_top
 		 */
 
-		// if the glyph is too high
-		int y_off = ascent - face->glyph->bitmap_top;
-		int by_off = 0;
-		if(  y_off < 0  ) {
-			by_off -= y_off;
-			y_off = 0;
-		}
+		glyph_t & glyph = glyphs[glyph_nr];
 
-		// asked for monocrome so slot->pixel_mode == FT_PIXEL_MODE_MONO
-		for(  uint32 y = y_off, by = by_off;  y < GLYPH_BITMAP_HEIGHT  &&  (uint32)by < face->glyph->bitmap.rows;  y++, by++ ) {
-			glyphs[glyph_nr].bitmap[y] = face->glyph->bitmap.buffer[by * face->glyph->bitmap.pitch];
-		}
+		FT_Bitmap *bitmap = &face->glyph->bitmap;
+		bool one_bit_pp = false;
 
-		if(  face->glyph->bitmap.width > 8  ) {
-			// render second row
-			for(  int y = y_off, by = by_off;  y < (int)GLYPH_BITMAP_HEIGHT  &&  (uint)by < face->glyph->bitmap.rows;  y++, by++ ) {
-				glyphs[glyph_nr].bitmap[y+GLYPH_BITMAP_HEIGHT] = face->glyph->bitmap.buffer[by * face->glyph->bitmap.pitch+1];
+		// check bit depth, for some reason bdf fonts get bitmaps with 1 bit per pixel
+		if (face->glyph->bitmap.pixel_mode != FT_PIXEL_MODE_GRAY) {
+			// need to convert
+			if (FT_Bitmap_Convert(ft_library, &face->glyph->bitmap, &bitmap_8, 4) != FT_Err_Ok) {
+				// should not happen
+				continue;
 			}
+			bitmap = &bitmap_8;
+			one_bit_pp = true;
 		}
 
-		glyphs[glyph_nr].advance = face->glyph->bitmap.width+1;
-		glyphs[glyph_nr].yoff  = y_off; // h_offset
-		glyphs[glyph_nr].width = max(16u, face->glyph->bitmap.width);
+		// set glyph size
+		glyph.height  = bitmap->rows;
+		glyph.width   = bitmap->width;
+		glyph.advance = (face->glyph->advance.x + 31) / 64;
+
+		// the bitmaps are all top aligned. Bitmap top is the ascent
+		// above the base line
+		// to find the real top position, we must take the font ascent
+		// and reduce it by the glyph ascent
+		glyph.top = ascent - face->glyph->bitmap_top - 1;
+
+		glyph.left = face->glyph->bitmap_left;
+
+		// transform glyph to Simutrans bitmap
+		glyph.bitmap = (uint8*)calloc(glyph.height * glyph.width, 1);
+
+		if (!one_bit_pp) {
+			// 8 bit alpha per pixel
+			for(int y = 0; y < glyph.height; y++) {
+				for(int x = 0; x < glyph.width; x++) {
+					uint16 alpha = bitmap->buffer[y * bitmap->pitch + x];
+					// simgraph blend routines want alpha in 0..32
+					glyph.bitmap[y * glyph.width + x] = (alpha * 32) / 255;
+				}
+			}
+		}
+		else {
+			// 1 bit per pixel
+			for(int y = 0; y < glyph.height; y++) {
+				for(int x = 0; x < glyph.width; x++) {
+					uint16 alpha = bitmap->buffer[y * bitmap->pitch + x];
+					// simgraph blend routines want alpha in 0..32
+					glyph.bitmap[y * glyph.width + x] = (alpha * 32);
+				}
+			}
+		}
 	}
 
-	if(  num_glyphs<0x80  ) {
+	FT_Bitmap_Done(ft_library, &bitmap_8);
+
+	if(num_glyphs < 0x80) {
 		FT_Done_Face( face );
 		FT_Done_FreeType( ft_library );
 		return false;
@@ -336,12 +391,15 @@ bool font_t::load_from_freetype(const char *fname, int pixel_height)
 	if(  glyphs[0x3000].advance == 0xFF  &&  glyphs[0x3001].advance != 0xFF  ) {
 		glyphs[0x3000].advance = glyphs[0x3001].advance;
 		glyphs[0x3000].width = 0;
-		glyphs[0x3000].yoff = GLYPH_BITMAP_HEIGHT;
+		glyphs[0x3000].top = 0;
+	}
+
+	if (glyphs[' '].advance == 0xFF) {
+		glyphs[' '].advance = glyphs['n'].advance;
 	}
 
 	// Use only needed amount
 	glyphs.resize(num_glyphs);
-	glyphs[(uint32)' '].advance = glyphs[(uint32)'n'].advance;
 
 	FT_Done_Face( face );
 	FT_Done_FreeType( ft_library );
@@ -356,7 +414,8 @@ void font_t::print_debug() const
 	dbg->debug("font_t::print_debug", "Loaded font %s with %i glyphs\n", get_fname(), get_num_glyphs());
 	dbg->debug("font_t::print_debug", "height: %i, descent: %i", linespace, descent );
 
-	for(  uint8 glyph_nr = ' ';  glyph_nr<128; glyph_nr ++  ) {
+	/*
+	for(uint8 glyph_nr = ' ';  glyph_nr<128; glyph_nr ++) {
 		char msg[128 + GLYPH_BITMAP_HEIGHT * (GLYPH_BITMAP_WIDTH+1)]; // +1 for trailing newline
 
 		char *c = msg + sprintf(msg, "glyph %c: width %i, top %i\n", glyph_nr, get_glyph_width(glyph_nr), get_glyph_yoffset(glyph_nr) );
@@ -373,6 +432,7 @@ void font_t::print_debug() const
 		*c++ = 0;
 		dbg->debug("font_t::print_debug", "glyph data: %s", msg );
 	}
+	*/
 }
 
 
@@ -380,35 +440,8 @@ bool font_t::load_from_file(const char *srcfilename)
 {
 	tstrncpy( fname, srcfilename, lengthof(fname) );
 
-	FILE *fontfile = dr_fopen(fname, "rb");
-
-	if(  fontfile == NULL  ) {
-		dbg->error("font_t::load_from_file", "Cannot open '%s'", fname);
-		return false;
-	}
-
-	const int res = fgetc(fontfile);
-	if(  res==EOF  ) {
-		dbg->error("font_t::load_from_file", "Cannot parse font '%s'", fname);
-		fclose(fontfile);
-		return false;
-	}
-
-	const uint8 c = res & 0xFF;
-
-	// binary => the assume dumped prop file
-	if(  c < ' '  &&  strstr(fname, ".fnt")  ) {
-		rewind(fontfile);
-		return load_from_fnt(fontfile);
-	}
-
-	bool ok = load_from_bdf(fontfile);
-	fclose(fontfile);
-
 #ifdef USE_FREETYPE
-	if(  !ok  ) {
-		ok = load_from_freetype( fname, env_t::fontsize );
-	}
+	bool ok = load_from_freetype( fname, env_t::fontsize );
 #endif
 
 #if MSG_LEVEL>=4
@@ -420,96 +453,7 @@ bool font_t::load_from_file(const char *srcfilename)
 }
 
 
-bool font_t::load_from_fnt(FILE *f)
-{
-	assert(ftell(f) == 0);
-
-	// read classical prop font
-	dbg->message("font_t::load_from_fnt", "Loading font '%s'", fname);
-
-	uint8 npr_fonttab[3072];
-
-	if(  fread(npr_fonttab, sizeof(npr_fonttab), 1, f) != 1  ) {
-		dbg->error( "font_t::load_from_fnt" "%s wrong size for old format prop font!", fname );
-		fclose(f);
-		return false;
-	}
-
-	fclose(f);
-
-#ifdef DUMP_OLD_FONTS
-	f = fopen("C:\\prop.bdf","w");
-#endif
-
-	// convert to new standard font
-	glyphs.resize(0x100);
-
-	linespace = 11;
-	descent   = -2;
-
-	for(  int i = 0; i < 0x100; i++  ) {
-		uint8 start_h;
-
-		glyphs[i].advance = npr_fonttab[0x100 + i];
-		if(  glyphs[i].advance == 0  ) {
-			glyphs[i].advance = 0xFF; // undefined glyph
-		}
-
-		int j = 0;
-		for (; j < 10; j++) {
-			glyphs[i].bitmap[j] = npr_fonttab[512 + i * 10 + j];
-		}
-
-		for (; j < (int)sizeof(glyphs[i].bitmap); j++) {
-			glyphs[i].bitmap[j] = 0;
-		}
-
-		// find the start offset
-		for( start_h=0;  glyphs[i].bitmap[start_h]==0  &&  start_h<10;  start_h++  ) {
-			;
-		}
-
-		glyphs[i].yoff  = start_h;
-		glyphs[i].width = npr_fonttab[i];
-
-#ifdef DUMP_OLD_FONTS
-		//try to make bdf
-		if(  start_h<10  ) {
-			// find bounding box
-			int h=10;
-			while(h>start_h  &&  glyphs[i].bitmap[h-1]==0) {
-				h--;
-			}
-
-			// emulate character
-			fprintf( f, "STARTCHAR char%0i\n", i );
-			fprintf( f, "ENCODING %i\n", i );
-			fprintf( f, "SWIDTH %i 0\n", (int)(0.5+77.875*(double)glyphs[i].advance) );
-			fprintf( f, "DWIDTH %i\n", glyphs[i].advance );
-			fprintf( f, "BBX %i %i %i %i\n", glyphs[i].advance, h-start_h, 0, 8-h );
-			fprintf( f, "BITMAP\n" );
-
-			for(  j=start_h;  j<h;  j++ ) {
-				fprintf( f, "%02x\n", glyphs[i].bitmap[j] );
-			}
-
-			fprintf( f, "ENDCHAR\n" );
-		}
-#endif
-	}
-#ifdef DUMP_OLD_FONTS
-	fclose(f);
-#endif
-
-	glyphs[(uint32)' '].advance = 4;
-	glyphs[(uint32)' '].width = 0;
-
-	dbg->message( "font_t::load_from_fnt", "%s successfully loaded as old format prop font!", fname);
-	return true;
-}
-
-
-uint8 font_t::get_glyph_advance(utf32 c) const
+sint16 font_t::get_glyph_advance(utf32 c) const
 {
 	if(  !is_loaded()  ) {
 		return 0;
@@ -522,40 +466,16 @@ uint8 font_t::get_glyph_advance(utf32 c) const
 }
 
 
-uint8 font_t::get_glyph_width(utf32 c) const
-{
-	if(  !is_loaded()  ) {
-		return 0;
-	}
-	else if(  c >= get_num_glyphs()  ) {
-		c = 0;
-	}
-
-	return glyphs[c].width;
-}
-
-
-uint8 font_t::get_glyph_yoffset(uint32 c) const
-{
-	if(  !is_loaded()  ) {
-		return 0;
-	}
-	else if(  c >= get_num_glyphs()  ) {
-		c = 0;
-	}
-
-	return glyphs[c].yoff;
-}
-
-
-const uint8 *font_t::get_glyph_bitmap(utf32 c) const
+const font_t::glyph_t& font_t::get_glyph(utf32 c) const
 {
-	if(  !is_loaded()  ) {
-		return NULL;
-	}
-	else if(  c >= get_num_glyphs()  ) {
-		c = 0;
+	static glyph_t dummy;
+	if (is_loaded()) {
+		if (c < get_num_glyphs()  &&  glyphs[c].advance < 0xFF) {
+			return glyphs[c];
+		}
+		else {
+			return glyphs[0];
+		}
 	}
-
-	return glyphs[c].bitmap;
+	return dummy;
 }
diff --git a/simutrans/trunk/src/simutrans/display/font.h b/simutrans/trunk/src/simutrans/display/font.h
index 188543c38..6968e9656 100644
--- a/simutrans/trunk/src/simutrans/display/font.h
+++ b/simutrans/trunk/src/simutrans/display/font.h
@@ -13,15 +13,6 @@
 #include <stdio.h>
 #include <vector>
 
-
-#define GLYPH_BITMAP_HEIGHT (23u)
-#define GLYPH_BITMAP_WIDTH  (16u)
-#define GLYPH_BITMAP_BPP    (1u) // cannot be changed currently
-
-// Size in bytes of a single row
-#define GLYPH_ROW_PITCH (((GLYPH_BITMAP_WIDTH*GLYPH_BITMAP_BPP)+CHAR_BIT-1)/CHAR_BIT)
-
-
 /**
  * Terminology:
  *  - glyph:        display data of a single character
@@ -39,10 +30,12 @@ public:
 	{
 		glyph_t();
 
-		uint8 bitmap[GLYPH_ROW_PITCH * GLYPH_BITMAP_HEIGHT];
-		uint8 yoff; // = ascent - bearingY
-		uint8 width;
-		uint8 advance;
+		uint8* bitmap;
+		sint16 height;
+		sint16 width;
+		sint16 advance;
+		sint16 top;
+		sint16 left;
 	};
 
 public:
@@ -55,33 +48,19 @@ public:
 
 	const char *get_fname() const { return fname; }
 	sint16 get_linespace() const { return linespace; }
-	sint16 get_descent() const { return descent; } ///< Note: Because this value is in grid coordinates, it is NEGATIVE.
-	sint16 get_ascent() const { return linespace + descent; }
+	sint16 get_ascent() const { return ascent; }
 
 	/// @returns true if this is a valid (defined) glyph
 	bool is_valid_glyph(utf32 c) const
 	{ return is_loaded() && c < get_num_glyphs() && glyphs[c].advance != 0xFF; }
 
 	/// @returns size in pixels between the start of this glyph and the next glyph
-	uint8 get_glyph_advance(utf32 c) const;
+	sint16 get_glyph_advance(utf32 c) const;
 
-	/// @returns width in pixels of the glyph of a character
-	uint8 get_glyph_width(utf32 c) const;
-
-	/// @returns yoffset in pixels of the glyph of a character
-	uint8 get_glyph_yoffset(uint32 c) const;
-
-	/// @returns glyph data of a character
-	/// @sa font_t::glyph_t::bitmap
-	const uint8 *get_glyph_bitmap(utf32 c) const;
+	/// @returns glyph data for this utf32 char
+	const glyph_t& get_glyph(utf32 c) const;
 
 private:
-	/// Load a BDF font
-	bool load_from_bdf(FILE *fin);
-
-	/// Load a .fnt file
-	bool load_from_fnt(FILE *fin);
-
 #ifdef USE_FREETYPE
 	/// Load a freetype font
 	bool load_from_freetype(const char *fname, int pixel_height);
@@ -94,6 +73,7 @@ private:
 private:
 	char fname[PATH_MAX];
 	sint16 linespace;
+	sint16 ascent;
 	sint16 descent;
 public:	// for simgraph has_character()
 	std::vector<glyph_t> glyphs;
diff --git a/simutrans/trunk/src/simutrans/display/simgraph16.cc b/simutrans/trunk/src/simutrans/display/simgraph16.cc
index d798c9792..6fbd2036a 100644
--- a/simutrans/trunk/src/simutrans/display/simgraph16.cc
+++ b/simutrans/trunk/src/simutrans/display/simgraph16.cc
@@ -2898,37 +2898,7 @@ PIXVAL display_blend_colors_alpha32(PIXVAL background, PIXVAL foreground, int al
 // Blends two colors
 PIXVAL display_blend_colors(PIXVAL background, PIXVAL foreground, int percent_blend)
 {
-	const PIXVAL alpha = (percent_blend*64)/100;
-
-	switch( alpha ) {
-		case 0: // nothing to do ...
-			return background;
-		case 16:
-			return colors_blend25(background, foreground);
-
-		case 32:
-			return colors_blend50(background, foreground);
-
-		case 48:
-			return colors_blend25(background, foreground);
-
-		case 64:
-			return foreground;
-
-		default:
-			// any percentage blending: SLOW!
-			const PIXVAL r_src = red(background);
-			const PIXVAL g_src = green(background);
-			const PIXVAL b_src = blue(background);
-			const PIXVAL r_dest = red(foreground);
-			const PIXVAL g_dest = green(foreground);
-			const PIXVAL b_dest = blue(foreground);
-			const PIXVAL r = (r_dest * alpha + r_src * (64 - alpha) + 32) >> 6;
-			const PIXVAL g = (g_dest * alpha + g_src * (64 - alpha) + 32) >> 6;
-			const PIXVAL b = (b_dest * alpha + b_src * (64 - alpha) + 32) >> 6;
-			return rgb(r, g, b);
-	}
-// ??	return display_blend_colors_alpha32(background, foreground, (percent_blend*32)/100);
+	return display_blend_colors_alpha32(background, foreground, (percent_blend*32)/100);
 }
 
 
@@ -3839,6 +3809,7 @@ void display_calc_proportional_multiline_string_len_width(int &xw, int &yh, cons
 			width = 0;
 			continue;
 		}
+
 		width += fnt->get_glyph_advance(iUnicode);
 	}
 	xw = max( xw, width );
@@ -3846,35 +3817,6 @@ void display_calc_proportional_multiline_string_len_width(int &xw, int &yh, cons
 }
 
 
-
-/**
- * Helper: calculates 8bit mask for clipping.
- * Calculates mask to fit pixel interval [xRL,xR) to clipping interval [cL, cR).
- */
-static unsigned char get_h_mask(const int xL, const int xR, const int cL, const int cR)
-{
-	// do not mask
-	unsigned char mask = 0xff;
-
-	// check, if there is something to display
-	if (xR <= cL || xL >= cR) return 0;
-	// 8bit masks only
-	assert(xR - xL <= 8);
-
-	// check for left border
-	if (xL < cL) {
-		// left border clipped
-		mask = 0xff >> (cL - xL);
-	}
-	// check for right border
-	if (xR > cR) {
-		// right border clipped
-		mask &= 0xff << (xR - cR);
-	}
-	return mask;
-}
-
-
 /**
  * len parameter added - use -1 for previous behaviour.
  * completely renovated for unicode and 10 bit width and variable height
@@ -3928,18 +3870,6 @@ int display_text_proportional_len_clip_rgb(scr_coord_val x, scr_coord_val y, con
 	// store the initial x (for dirty marking)
 	const scr_coord_val x0 = x;
 
-	scr_coord_val y_offset = 0; // real y for display with clipping
-	scr_coord_val glyph_height = fnt->get_linespace();
-	const scr_coord_val yy = y + fnt->get_linespace();
-
-	// calculate vertical y clipping parameters
-	if (y < cT) {
-		y_offset = cT - y;
-	}
-	if (yy > cB) {
-		glyph_height -= yy - cB;
-	}
-
 	// big loop, draw char by char
 	utf8_decoder_t decoder((utf8 const*)txt);
 	size_t iTextPos = 0; // pointer on text position
@@ -3959,33 +3889,37 @@ int display_text_proportional_len_clip_rgb(scr_coord_val x, scr_coord_val y, con
 		}
 
 		// get the data from the font
-		int glyph_width = fnt->get_glyph_width(c);
-		const uint8 glyph_yoffset = std::max(fnt->get_glyph_yoffset(c), (uint8)y_offset);
-
-		// currently max character width 16 bit supported by font.h/font.cc
-		for(  int i=0;  i<2;  i++  ) {
-			const uint8 bits = std::min(8, glyph_width);
-			uint8 mask = get_h_mask(x + i*8, x + i*8 + bits, cL, cR);
-			glyph_width -= bits;
-
-			const uint8 *p = fnt->get_glyph_bitmap(c) + glyph_yoffset + i*GLYPH_BITMAP_HEIGHT;
-			if(  mask!=0  ) {
-				int screen_pos = (y+glyph_yoffset) * disp_width + x + i*8;
-
-				for (int h = glyph_yoffset; h < glyph_height; h++) {
-					unsigned int dat = *p++ & mask;
-					PIXVAL* dst = textur + screen_pos;
-
-					if(  dat  !=  0  ) {
-						for(  size_t dat_offset = 0 ; dat_offset < 8 ; dat_offset++  ) {
-							if(  (dat & (0x80 >> dat_offset))  ) {
-								dst[dat_offset] = color;
-							}
-						}
+		const font_t::glyph_t& glyph = fnt->get_glyph(c);
+		const uint8 *p = glyph.bitmap;
+
+		int screen_pos = (y + glyph.top) * disp_width + x + glyph.left;
+
+		// glyph x clipping
+		int g_left  = max(cL - x - glyph.left, 0);
+		int g_right = min(cR - x - glyph.left, glyph.width);
+
+		// all visible rows
+		for (int h = 0; h < glyph.height; h++) {
+			const int line = y + glyph.top + h;
+			if(line >= cT && line < cB) {
+
+				PIXVAL* dst = textur + screen_pos + g_left;
+
+				// all columns
+				for(int gx=g_left; gx<g_right; gx++) {
+					int alpha = p[h*glyph.width + gx];
+
+					if(alpha > 31) {
+						// opaque
+						*dst++ = color;
+					} else {
+						// partially transparent -> blend it
+						PIXVAL old_color = *dst;
+						*dst++ = colors_blend_alpha32(old_color, color, alpha);
 					}
-					screen_pos += disp_width;
 				}
 			}
+			screen_pos += disp_width;
 		}
 
 		x += fnt->get_glyph_advance(c);
@@ -4719,7 +4653,8 @@ bool simgraph_init(scr_size window_size, sint16 full_screen)
 	textur = dr_textur_init();
 
 	// init, load, and check fonts
-	if(  !display_load_font(env_t::fontname.c_str())  &&  !display_load_font(FONT_PATH_X "prop.fnt") ) {
+	if(!display_load_font(env_t::fontname.c_str()) &&
+	   !display_load_font(FONT_PATH_X "NotoSans-Regular.ttf") ) {
 		dr_fatal_notify("No fonts found!");
 		return false;
 	}
diff --git a/simutrans/trunk/src/simutrans/gui/loadfont_frame.cc b/simutrans/trunk/src/simutrans/gui/loadfont_frame.cc
index eb829f342..2a80f6959 100644
--- a/simutrans/trunk/src/simutrans/gui/loadfont_frame.cc
+++ b/simutrans/trunk/src/simutrans/gui/loadfont_frame.cc
@@ -76,7 +76,7 @@ loadfont_frame_t::loadfont_frame_t() : savegame_frame_t(NULL,false,NULL,false)
 	set_name(translator::translate("Select display font"));
 
 	top_frame.remove_component(&input);
-	fontsize.init( env_t::fontsize, 6, 19, gui_numberinput_t::AUTOLINEAR, false );
+	fontsize.init( env_t::fontsize, 6, 40, gui_numberinput_t::AUTOLINEAR, false );
 	fontsize.add_listener(this);
 	fontsize.enable( is_resizable_font(env_t::fontname.c_str()) );
 
@@ -122,34 +122,7 @@ bool loadfont_frame_t::check_file(const char *filename, const char *)
 
 	// just match textension for buildin fonts
 	const char *start_extension = strrchr(filename, '.' );
-	if(  start_extension  &&  !STRICMP( start_extension, ".fnt" )  ) {
-		return !use_unicode;
-	}
-	if(  start_extension  &&  !STRICMP( start_extension, ".bdf" )  ) {
-		if(  use_unicode  ) {
-			bool is_unicode = false;
-			uint32 numchars=0;
-			test = fopen( filename, "r" );
-
-			while(  !feof(test)  ) {
-				char str[1024];
-				if (fgets( str, lengthof(str), test) == NULL) {
-					break;
-				}
 
-				if(  STRNICMP(str,"CHARSET_REGISTRY", 16 )==0  ) {
-					is_unicode = strstr( str, "ISO10646" );
-				}
-				else if(  STRNICMP( str, "CHARS ", 6)==0  ) {
-					numchars = atol( str+5 );
-					break;
-				}
-			}
-			fclose( test );
-			return is_unicode  &&  numchars>6000;
-		}
-		return true;
-	}
 	// no support for windows fon files, so we skip them to speed things up
 	if(  start_extension  &&  !STRICMP( start_extension, ".fon" )  ) {
 		return false;
@@ -299,6 +272,7 @@ bool loadfont_frame_t::action_triggered(gui_action_creator_t *component, value_t
 
 	if(  &fontsize==component  ) {
 		win_load_font(env_t::fontname.c_str(), fontsize.get_value());
+		fontsize.set_limits(6, 40);
 		return false;
 	}
 
diff --git a/simutrans/trunk/src/simutrans/simticker.cc b/simutrans/trunk/src/simutrans/simticker.cc
index 31eb17a07..d9a377bd5 100644
--- a/simutrans/trunk/src/simutrans/simticker.cc
+++ b/simutrans/trunk/src/simutrans/simticker.cc
@@ -162,18 +162,22 @@ void ticker::draw()
 		mark_rect_dirty_wc(0, env_t::menupos == MENU_BOTTOM ? 0 : start_y - 128, display_get_width(), start_y + 128 + TICKER_HEIGHT);
 		return;
 	}
+	if (dx_since_last_draw <=0) {
+		return;
+	}
 
 	const int width = display_get_width();
 	if (width <= 0) {
 		return;
 	}
-
 	// do partial redraw
 	display_scroll_band( start_y, dx_since_last_draw, TICKER_HEIGHT );
-	display_fillbox_wh_rgb(width-dx_since_last_draw-6, start_y, dx_since_last_draw+6, TICKER_HEIGHT, SYSCOL_TICKER_BACKGROUND, true);
 
+	display_fillbox_wh_rgb(width-dx_since_last_draw, start_y, dx_since_last_draw, TICKER_HEIGHT, SYSCOL_TICKER_BACKGROUND, true);
+
+	mark_rect_dirty_wc(0, start_y, width, start_y + TICKER_HEIGHT);
 	// ok, ready for the text
-	PUSH_CLIP( 0, start_y, width - 1, TICKER_HEIGHT );
+	PUSH_CLIP( width-dx_since_last_draw, start_y, dx_since_last_draw, TICKER_HEIGHT );
 	for(node & n : list) {
 		if (n.xpos < width) {
 			display_proportional_clip_rgb(n.xpos, start_y + TICKER_V_SPACE, n.msg, ALIGN_LEFT, n.color, true);
