diff -ur old/Game.cpp new/Game.cpp
--- old/Game.cpp	2008-11-01 08:56:50.000000000 +0200
+++ new/Game.cpp	2008-11-01 10:48:33.000000000 +0200
@@ -896,6 +896,7 @@
   Window            m_window;
   Overlay          *m_pauseOverlay;
   Overlay          *m_editOverlay;
+  Overlay          *m_keyboardOverlay;
   //  DemoOverlay       m_demoOverlay;
   Os               *m_os;
 public:
@@ -905,6 +906,7 @@
     m_window(width,height,"Numpty Physics","NPhysics"),
     m_pauseOverlay( NULL ),
     m_editOverlay( NULL ),
+    m_keyboardOverlay( NULL ),
     m_os( Os::get() )
     //,m_demoOverlay( *this )
   {
@@ -1038,6 +1040,14 @@
       && m_overlays.indexOf( m_pauseOverlay ) >= 0;
   }
 
+  void togglePause() 
+  {
+     if ( !m_pauseOverlay ) {
+       m_pauseOverlay = createIconOverlay( *this, "pause.png", 50, 50 );
+     }
+     toggleOverlay( m_pauseOverlay );
+  }
+
   void edit( bool doEdit )
   {
     if ( m_edit != doEdit ) {
@@ -1080,10 +1090,7 @@
       case SDLK_SPACE:
       case SDLK_KP_ENTER:
       case SDLK_RETURN:
-	if ( !m_pauseOverlay ) {
-	  m_pauseOverlay = createIconOverlay( *this, "pause.png", 50, 50 );
-	}
-	toggleOverlay( m_pauseOverlay );
+   togglePause();
 	break;
       case SDLK_s:
       case SDLK_F4: 
@@ -1094,6 +1191,10 @@
 	edit( !m_edit );
 	break;
       case SDLK_d:
+   if ( !m_keyboardOverlay ) {
+     m_keyboardOverlay = createKeyboardOverlay(*this);
+   }
+   toggleOverlay( m_keyboardOverlay );
 	//toggleOverlay( m_demoOverlay );
 	break;
       case SDLK_r:
@@ -1154,6 +1165,19 @@
     return false;
   }
 
+  void undoLastStroke() 
+  {
+     if ( m_createStroke ) {
+     m_scene.deleteStroke( m_createStroke );
+     m_createStroke = NULL;
+    } else {
+      m_scene.deleteStroke( m_scene.strokes().at(m_scene.strokes().size()-1) );
+    }
+    m_refresh = true;
+  }
+
+
+
   bool handlePlayEvent( SDL_Event &ev )
   {
     switch( ev.type ) {      
@@ -1197,13 +1221,7 @@
       break;
     case SDL_KEYDOWN:
       if ( ev.key.keysym.sym == SDLK_ESCAPE ) {
-	if ( m_createStroke ) {
-	  m_scene.deleteStroke( m_createStroke );
-	  m_createStroke = NULL;
-	} else {
-	  m_scene.deleteStroke( m_scene.strokes().at(m_scene.strokes().size()-1) );
-	}
-	m_refresh = true;
+         undoLastStroke();
       }
       break;
     default:
@@ -1250,6 +1268,10 @@
   {
     Overlay *completedOverlay = createNextLevelOverlay(*this);
 
+    //toggle onScreenKeyboard ON
+    m_keyboardOverlay = createKeyboardOverlay(*this);
+    toggleOverlay( m_keyboardOverlay );
+
     m_scene.draw( m_window, FULLSCREEN_RECT );
     m_window.update( FULLSCREEN_RECT );
 
diff -ur old/Game.h new/Game.h
--- old/Game.h	2008-11-01 08:56:50.000000000 +0200
+++ new/Game.h	2008-11-01 09:27:22.000000000 +0200
@@ -41,6 +41,9 @@
   virtual void gotoLevel( int l, bool replay=false ) {}
   Levels& levels() { return m_levels; }
   virtual bool  renderScene( Canvas& c, int level ) =0; 
+  virtual void togglePause() {} 
+  virtual void undoLastStroke() {}
+  virtual void edit( bool editting ) {}
   bool  m_quit;
   bool  m_edit;
   bool  m_refresh;
diff -ur old/Overlay.cpp new/Overlay.cpp
--- old/Overlay.cpp	2008-11-01 08:56:50.000000000 +0200
+++ new/Overlay.cpp	2008-11-01 09:45:57.000000000 +0200
@@ -311,7 +311,60 @@
   }
 };
 
+/*
+class EditOverlay : public IconOverlay
+{
+  int m_saving, m_sending;
+public:
+  EditOverlay( GameControl& game )
+    : IconOverlay(game,"edit.png"),
+      m_saving(0), m_sending(0)
+*/
+class KeyboardOverlay : public IconOverlay
+{
+  int m_saving, m_sending;
+public:
+  KeyboardOverlay( GameControl& game )
+    : IconOverlay(game,"keyb.png",0,0,false),
+      m_saving(0),
+      m_sending(0)
+  {}
+
+  int index( int x, int y ) 
+  {
+    //these values correspond with keyb.png (in pixels)
+    int sizeOfElement = 20;
+
+    int colum = x/sizeOfElement;
+    int row   = y/sizeOfElement;
+    return row*3+colum;
+  }
+
+  virtual void draw( Canvas& screen )
+  {
+    IconOverlay::draw( screen );
+  }
 
+  virtual bool onClick( int x, int y )
+  {
+    int i = index(x,y);
+    //printf("i= %d\n",i); return 0;
+    switch (i) {
+    case -1: return false;
+    case  0: m_game.undoLastStroke(); break;
+    case  1: m_game.togglePause(); break;
+    case  2: m_game.m_quit=true; break;
+    case  3: break;
+    case  4: m_game.edit( !m_game.m_edit ); break;
+    case  5: break;
+    case  6: m_game.gotoLevel(m_game.m_level-1); break;
+    case  7: m_game.gotoLevel(m_game.m_level); break;
+    case  8: m_game.gotoLevel(m_game.m_level+1); break;
+    default: break;
+    }
+    return true;
+  }
+};
 
 
 Overlay* createIconOverlay( GameControl& game, const char* file,
@@ -330,3 +383,8 @@
 {
   return new NextLevelOverlay( game );
 }
+
+extern Overlay* createKeyboardOverlay( GameControl& game )
+{
+  return new KeyboardOverlay( game );
+}
diff -ur old/Overlay.h new/Overlay.h
--- old/Overlay.h	2008-11-01 08:56:50.000000000 +0200
+++ new/Overlay.h	2008-11-01 09:44:16.000000000 +0200
@@ -45,4 +45,5 @@
 
 extern Overlay* createNextLevelOverlay( GameControl& game );
 
+extern Overlay* createKeyboardOverlay( GameControl& game );
 #endif //OVERLAY_H
