diff -Naur osdteletext-0.4.2/display.c osdteletext/display.c
--- osdteletext-0.4.2/display.c	2005-03-03 17:51:00.000000000 +0100
+++ osdteletext/display.c	2005-03-17 01:24:14.000000000 +0100
@@ -14,6 +14,9 @@
 
 #include <vdr/config.h>
 #include "display.h"
+#ifdef SpeedPatch
+#include "txtfont.h"
+#endif
 
 #include "setup.h"
 #include "colormapping.h"
@@ -27,6 +30,48 @@
 static int bpp=0, messageWidth=0;
 static tColor currentBackground=clrGray50;
 
+#ifdef SpeedPatch
+static int ScaleX=1,ScaleY=1;
+static int OffsetX=0,OffsetY=0;
+
+void InitScaler() {
+	
+	// Some words about scaling:
+	
+	// OSD display is variable width x height, with 3 pixels border
+	// on all sides. There is a virtual coordinate system projected
+	// on this, with (3,3) mapped to (0,0) and (width-3,height-3) 
+	// mapped to (480<<16,250<<16).
+	// The idea is, that each font pixel uses a virtual rectangle
+	// of (1<<16,1<<16) size.
+	
+	// ScaleX,ScaleY represent the (virtual) width and height of a 
+	// physical OSD pixel.
+	
+	int height=ttSetup.OSDheight;
+	int width=ttSetup.OSDwidth;
+
+	ScaleX=(480<<16)/(width-6);
+	ScaleY=(250<<16)/(height-6);
+	OffsetX=3;
+	OffsetY=3;
+	
+	switch (displayMode) {
+	case ZoomUpper:
+		ScaleY=ScaleY/2;
+		break;
+	case ZoomLower:
+		ScaleY=ScaleY/2;
+		OffsetY=OffsetY-(height-6);
+		break;
+	case HalfLower:
+		OffsetY=OffsetY-(height-6)/2;
+		break;
+	default:;
+	}
+	Clear();
+}
+#endif
 
 int Open( Mode mode) {
    if (osd) 
@@ -55,6 +100,9 @@
       osd->SetAreas(Areas, sizeof(Areas) / sizeof(tArea));
       bpp=2;
    }
+   #ifdef SpeedPatch
+   InitScaler();
+   #endif
    font=cFont::GetFont(fontSml);
    
    return (0);
@@ -82,6 +130,9 @@
          return Display::Open(mode);
       } else {
          displayMode=mode; //no need to reopen if size does not change
+         #ifdef SpeedPatch
+         InitScaler();
+         #endif
          return 0;
       }
    } else if (!osd)
@@ -200,6 +251,129 @@
       osd->DrawRectangle(0, 0, messageWidth, font->Height(), configurableBackground);
 }
 
+#ifdef SpeedPatch
+
+
+void SetChar(int x, int y, unsigned char c, bool gr_mode, bool double_mode, bool mask_mode, tColor fgColor, tColor bgColor)
+{
+    // Virtual box area of the character
+    int XMin=(x*12)<<16;
+    int YMin=(y*10)<<16;
+    int XMax=XMin+(12<<16)-1;
+    int YMax=YMin+((double_mode?20:10)<<16)-1;
+    
+    // OSD top left pixel of char
+    int OsdX0=XMin/ScaleX+OffsetX;
+    int OsdY0=YMin/ScaleY+OffsetY;
+    // This pixel overlaps the box, but may be almost outside.
+    
+    // map OSD pixel back to virtual coordinate, use center of pixel
+    int VX0=(OsdX0-OffsetX)*ScaleX+ScaleX/2;
+    int VY0=(OsdY0-OffsetY)*ScaleY+ScaleY/2;
+
+    // Move in OSD pixel units until we are inside the box
+    while (VX0<XMin) {
+        OsdX0++;
+        VX0+=ScaleX;
+    }
+    while (VY0<YMin) {
+        OsdY0++;
+        VY0+=ScaleY;
+    }
+    
+    
+    // Map character to font data
+    int lc=(int)(unsigned char)c-0x20;
+    if (gr_mode) {
+		// map graphics mode font
+		if (c<0x20) { 
+			mask_mode=false; 
+		} else if (c<0x40) {
+			lc+=0x80;
+		} else if (c<0x60) {
+			mask_mode=false; 
+		} else if (c<0x80) {
+			lc+=0xA0;
+		} else {
+			mask_mode=false;
+		}
+   	} else {
+		mask_mode=false;
+	}
+   
+    // Get character bitmap
+   	unsigned int myfont[10];
+   	for (int i=0;i<10;i++) {
+      	myfont[i]=TXT_Font[lc][i];
+    	if (mask_mode) myfont[i]=myfont[i] & TXT_Mask[i];
+    }
+
+    // Get direct access to the osd buffer bitmap
+	cBitmap *bm=osd->GetBitmap(0);
+	// Map colors to index once, for speed up
+	int IndexfgC=bm->Index(fgColor);
+	int IndexbgC=bm->Index(bgColor);
+
+
+	// Now draw the character. Start at the top left corner, and walk
+	// through all pixels on OSD. To speed up, keep one pointer to OSD pixel
+	// and one to virtual box coordinates, and move them together.
+	
+    int OsdY=OsdY0;
+    int VY=VY0;
+    while (VY<=YMax) {
+		int bitmask;
+		if (double_mode) {
+    		bitmask=myfont[(VY-YMin)>>17];
+		} else {
+    		bitmask=myfont[(VY-YMin)>>16];
+		}
+    
+        int OsdX=OsdX0;
+        int VX=VX0;
+        while (VX<=XMax) {
+			int Index;
+			int bit=(VX-XMin)>>16;
+            if (bitmask&(0x8000>>bit)) {
+                Index=IndexfgC;
+            } else {
+                Index=IndexbgC;
+            }
+            bm->SetIndex(OsdX,OsdY,Index);
+
+            OsdX++;
+            VX+=ScaleX;
+        }
+
+		OsdY++;
+		VY+=ScaleY;
+	}
+}
+
+void DrawClock() {
+	char zeichen[9];
+	time_t t=time(0);
+	struct tm loct;
+	tColor fgColor=Display::GetColor(Display::ColorWhite, Display::ColorTypeNormal);
+	tColor bgColor=Display::GetColor(Display::ColorBlack, Display::ColorTypeNormal);
+
+	localtime_r(&t, &loct);
+	sprintf(zeichen, "%02d:%02d:%02d", loct.tm_hour, loct.tm_min, loct.tm_sec);
+
+	int i=0;
+	while (zeichen[i]!=0x00) {
+	  	SetChar(32+i,0,zeichen[i],false,false,false,fgColor,bgColor);
+	  	i++;
+	}
+	Update();
+}
+
+void Clear() {
+	osd->DrawRectangle(0, 0, Width() - 1, Height() - 1, Display::GetColor(Display::ColorBlack, Display::ColorTypeNormal));
+}
+
+#endif
+
 void
 Update() {
    if (osd) {
diff -Naur osdteletext-0.4.2/display.h osdteletext/display.h
--- osdteletext-0.4.2/display.h	2004-06-21 19:31:24.000000000 +0200
+++ osdteletext/display.h	2005-03-17 01:24:14.000000000 +0100
@@ -16,6 +16,8 @@
 
 #include <vdr/osd.h>
 
+#define SpeedPatch
+
 namespace Display {
 
 enum Mode { Full, ZoomUpper, ZoomLower, HalfUpper, HalfLower };
@@ -24,6 +26,14 @@
                      ColorBlue, ColorMagenta, ColorCyan, ColorWhite };
 enum TeletextColorType { ColorTypeNormal, ColorTypeInverted };
 
+#ifdef SpeedPatch
+
+void SetChar(int x, int y, unsigned char c, bool gr_mode, bool double_mode, bool mask_mode, tColor fgColor, tColor bgColor);
+void DrawClock();
+void Clear();
+
+#endif
+
 #define configurableBackground Display::GetBackground()
 
 int  Open(Mode mode);
diff -Naur osdteletext-0.4.2/menu.c osdteletext/menu.c
--- osdteletext-0.4.2/menu.c	2005-03-03 17:51:00.000000000 +0100
+++ osdteletext/menu.c	2005-03-17 01:28:21.000000000 +0100
@@ -526,7 +526,11 @@
 
 void TeletextBrowser::ShowPage() {
    if ((pageFound=DecodePage()) && txtbitmap) {
+      #ifdef SpeedPatch
+      Display::Update();
+      #else
       txtbitmap->Display(mode, 0/*cOsd::LineHeight()*/);
+      #endif
       if (ttSetup.autoUpdatePage)
          checkSum=PageCheckSum();
    }
@@ -600,11 +604,19 @@
    
    if ( (fd=s->openForReading(PageID(channel, currentPage, currentSubPage), true)) ) 
    {
+      #ifdef SpeedPatch
+      // Create the dummy cTxtBitmap only once.
+      if (!txtbitmap)
+         txtbitmap = new cTxtBitmap(); 
+      
+      #else
+      
       // generate a basis bitmap object
       if (txtbitmap)
          delete txtbitmap;
    
       txtbitmap = new cTxtBitmap(486,506); 
+      #endif
       
       s->read(cache,9,fd); //irgendwas davor
       s->read(cache,1,fd); //Language
diff -Naur osdteletext-0.4.2/txtbitmap.c osdteletext/txtbitmap.c
--- osdteletext-0.4.2/txtbitmap.c	2005-03-03 17:51:00.000000000 +0100
+++ osdteletext/txtbitmap.c	2005-03-17 00:09:32.000000000 +0100
@@ -15,18 +15,25 @@
 #include "txtfont.h"
 #include "setup.h"
 
+#ifdef SpeedPatch
+cTxtBitmap::cTxtBitmap()
+#else
 cTxtBitmap::cTxtBitmap(int Width, int Height)
 :cBitmap(Width, Height, Display::Bpp())
+#endif
 {
    origFg=(Display::TeletextColor)-1;
    origBg=(Display::TeletextColor)-1;
+   #ifndef SpeedPatch
    Display::SetBitmapPalette(*this);
+   #endif
 }
 
 cTxtBitmap::~cTxtBitmap() {
 }
 
 
+#ifndef SpeedPatch
 void cTxtBitmap::Display(Display::Mode mode, int Offset, tColor, tColor) {
    int y0=0;
    int h=Height();
@@ -99,6 +106,7 @@
    Rueckgabe=Eingabe;
    return Rueckgabe;
 }
+#endif
 
 void cTxtBitmap::SetFGColor(Display::TeletextColor Color)
 {
@@ -122,6 +130,7 @@
    SetFGColor(oldBgColor);
 }
 
+#ifndef SpeedPatch
 void cTxtBitmap::SetChar(int x, int y, unsigned char zeich, bool gr_mode, bool double_mode, bool mask_mode)
 {
    unsigned int myfont[10];
@@ -216,4 +225,5 @@
       i++;
    }
 }
+#endif
 
diff -Naur osdteletext-0.4.2/txtbitmap.h osdteletext/txtbitmap.h
--- osdteletext-0.4.2/txtbitmap.h	2004-07-06 21:57:36.000000000 +0200
+++ osdteletext/txtbitmap.h	2005-03-17 00:08:50.000000000 +0100
@@ -15,6 +15,26 @@
 #include <vdr/osd.h>
 #include "display.h"
 
+#ifdef SpeedPatch
+class cTxtBitmap {
+private:
+   tColor bgColor;
+   tColor fgColor;
+   Display::TeletextColor origFg, origBg;
+public:
+   cTxtBitmap();
+   virtual ~cTxtBitmap();
+   void SetFGColor(Display::TeletextColor Color);
+   void SetBGColor(Display::TeletextColor Color);
+   void SetChar(int x, int y, unsigned char zeich, bool gr_mode, bool double_mode, bool mask_mode) {
+	   Display::SetChar(x,y,zeich,gr_mode,double_mode,mask_mode,fgColor,bgColor);
+   }
+   void ExchangeColor(void);
+   void DisplayClock() {
+	   Display::DrawClock();
+   }
+};
+#else
 class cTxtBitmap : public cBitmap {
 private:
    tColor bgColor;
@@ -36,5 +56,6 @@
    void DisplayClock();
    cBitmap *ScaleBitmap(cBitmap* oldBitmap, int depth, int x0, int y0, int walt, int halt, int wneu, int hneu);
 };
+#endif
 
 #endif
