--- virtualbox-ose-4.0.14.orig/Config.kmk
+++ virtualbox-ose-4.0.14/Config.kmk
@@ -510,7 +510,7 @@
  VBOX_WITH_CROGL = 1
 endif
 # Enable the VNC server in VBoxHeadless (GPL only).
-#VBOX_WITH_VNC = 1
+VBOX_WITH_VNC = 1
 # Enable S3 support (requires libcurl)
 VBOX_WITH_S3 = 1
 ## @}
@@ -582,7 +582,7 @@
 # Enables hardening.
 # Most developers will want to disable this in their LocalConfig.kmk.
 ifn1of ($(KBUILD_TARGET), win)
- VBOX_WITH_HARDENING = 1
+ VBOX_WITH_HARDENING = 0
 endif
 # Where the application files are (going to be) installed.
 #VBOX_PATH_APP_PRIVATE       = /usr/lib/virtualbox
--- virtualbox-ose-4.0.14.orig/src/VBox/Frontends/VBoxHeadless/FramebufferVNC.cpp
+++ virtualbox-ose-4.0.14/src/VBox/Frontends/VBoxHeadless/FramebufferVNC.cpp
@@ -30,6 +30,7 @@
 
 #include <png.h>
 #include <rfb/rfb.h>
+#include <rfb/keysym.h>
 
 // constructor / destructor
 /////////////////////////////////////////////////////////////////////////////
@@ -56,6 +57,7 @@
 {
     LogFlow(("Creating VNC object %p, width=%u, height=%u, port=%u\n",
              this, mWidth,  mHeight, mVncPort));
+    kbdShiftState = 0;
 }
 
 VNCFB::~VNCFB()
@@ -211,7 +213,7 @@
  * and a switch() block to handle some special keys. */
 void VNCFB::handleVncKeyboardEvent(int down, int keycode)
 {
-    //RTPrintf("VNC keyboard: down=%d code=%d -> ", down, keycode);
+    RTPrintf("VNC keyboard: down=%d code=%d -> ", down, keycode);
     if (mKeyboard == NULL)
     {
         this->mConsole->COMGETTER(Keyboard)(mKeyboard.asOutParam());
@@ -229,17 +231,7 @@
      * values 0x02?? indicate that the shift key can be ignored, and scancode ?? is sent
      * This is necessary because the VNC protocol sends a shift key sequence, but also
      * sends the 'shifted' version of the characters. */
-    static int codes_low[] =
-    {
-        //Conversion table for VNC key code range 32-127
-        0x0239, 0x0102, 0x0128, 0x0104, 0x0105, 0x0106, 0x0108, 0x0028, 0x010a, 0x010b, 0x0109, 0x010d, 0x0033, 0x000c, 0x0034, 0x0035, //space, !"#$%&'()*+,-./
-        0x0b, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, //0123456789
-        0x0127, 0x0027, 0x0133, 0x000d, 0x0134, 0x0135, 0x0103, //:;<=>?@
-        0x11e, 0x130, 0x12e, 0x120, 0x112, 0x121, 0x122, 0x123, 0x117, 0x124, 0x125, 0x126, 0x132, 0x131, 0x118, 0x119, 0x110, 0x113, 0x11f, 0x114, 0x116, 0x12f, 0x111, 0x12d, 0x115, 0x12c, //A-Z
-        0x001a, 0x002b, 0x001b, 0x0107, 0x010c, 0x0029, //[\]^_`
-        0x1e, 0x30, 0x2e, 0x20, 0x12, 0x21, 0x22, 0x23, 0x17, 0x24, 0x25, 0x26, 0x32, 0x31, 0x18, 0x19, 0x10, 0x13, 0x1f, 0x14, 0x16, 0x2f, 0x11, 0x2d, 0x15, 0x2c, //a-z
-        0x011a, 0x012b, 0x011b, 0x0129 //{|}~
-    };
+
     int shift = -1, code = -1;
     if (keycode < 32)
     {
@@ -247,8 +239,106 @@
     }
     else if (keycode < 127)
     {
+	switch (keycode)
+	{
+		case XK_space: code = 0x0239; break;         // (space)
+		case XK_exclam: code = 0x0102; break;        // !
+		case XK_quotedbl: code = 0x0128; break;      // "
+		case XK_numbersign: code = 0x0104; break;    // #
+		case XK_dollar: code = 0x0105; break;        // $
+		case XK_percent: code = 0x0106; break;       // %
+		case XK_ampersand: code = 0x0108; break;     // &
+		case XK_apostrophe: code = 0x0028; break;    // '
+		case XK_parenleft: code = 0x010a; break;     // (
+		case XK_parenright: code = 0x010b; break;    // )
+		case XK_asterisk: code = 0x0109; break;      // *
+		case XK_plus: code = 0x010d; break;          // +
+		case XK_comma: code = 0x0033; break;         // ,
+		case XK_minus: code = 0x000c; break;         // -
+		case XK_period: code = 0x0034; break;        // .
+		case XK_slash: code = 0x0035; break;         // /
+		case XK_0: code = 0x0b; break;               // 0
+		case XK_1: code = 0x02; break;               // 1
+		case XK_2: code = 0x03; break;               // 2
+		case XK_3: code = 0x04; break;               // 3
+		case XK_4: code = 0x05; break;               // 4
+		case XK_5: code = 0x06; break;               // 5
+		case XK_6: code = 0x07; break;               // 6
+		case XK_7: code = 0x08; break;               // 7
+		case XK_8: code = 0x09; break;               // 8
+		case XK_9: code = 0x0a; break;               // 9
+		case XK_colon: code = 0x0127; break;         // :
+		case XK_semicolon: code = 0x0027; break;     // ;
+		case XK_less: code = 0x0133; break;          // <
+		case XK_equal: code = 0x000d; break;         // =
+		case XK_greater: code = 0x0134; break;       // >
+		case XK_question: code = 0x0135; break;      // ?
+		case XK_at: code = 0x0103; break;            // @
+		case XK_A: code = 0x11e; break;              // A
+		case XK_B: code = 0x130; break;              // B
+		case XK_C: code = 0x12e; break;              // C
+		case XK_D: code = 0x120; break;              // D
+		case XK_E: code = 0x112; break;              // E
+		case XK_F: code = 0x121; break;              // F
+		case XK_G: code = 0x122; break;              // G
+                case XK_H: code = 0x123; break;              // H
+		case XK_I: code = 0x117; break;              // I
+		case XK_J: code = 0x124; break;              // J
+		case XK_K: code = 0x125; break;              // K
+		case XK_L: code = 0x126; break;              // L
+		case XK_M: code = 0x132; break;              // M
+		case XK_N: code = 0x131; break;              // N
+		case XK_O: code = 0x118; break;              // O
+		case XK_P: code = 0x119; break;              // P
+		case XK_Q: code = 0x110; break;              // Q
+		case XK_R: code = 0x113; break;              // R
+		case XK_S: code = 0x11f; break;              // S
+		case XK_T: code = 0x114; break;              // T
+		case XK_U: code = 0x116; break;              // U
+		case XK_V: code = 0x12f; break;              // V
+		case XK_W: code = 0x111; break;              // W
+		case XK_X: code = 0x12d; break;              // X
+		case XK_Y: code = 0x115; break;              // Y
+		case XK_Z: code = 0x12c; break;              // Z
+		case XK_bracketleft: code = 0x001a; break;   // [
+		case XK_backslash: code = 0x002b; break;     // \
+		case XK_bracketright: code = 0x001b; break;  // ]
+		case XK_asciicircum: code = 0x0107; break;   // ^
+		case XK_underscore: code = 0x010c; break;    // _
+		case XK_grave: code = 0x0029; break;         // `
+		case XK_a: code = 0x1e; break;               // a
+		case XK_b: code = 0x30; break;               // b
+		case XK_c: code = 0x2e; break;               // c
+		case XK_d: code = 0x20; break;               // d
+		case XK_e: code = 0x12; break;               // e
+		case XK_f: code = 0x21; break;               // f
+		case XK_g: code = 0x22; break;               // g
+		case XK_h: code = 0x23; break;               // h
+		case XK_i: code = 0x17; break;               // i
+		case XK_j: code = 0x24; break;               // j
+		case XK_k: code = 0x25; break;               // k
+		case XK_l: code = 0x26; break;               // l
+		case XK_m: code = 0x32; break;               // m
+		case XK_n: code = 0x31; break;               // n
+		case XK_o: code = 0x18; break;               // o
+		case XK_p: code = 0x19; break;               // p
+		case XK_q: code = 0x10; break;               // q
+		case XK_r: code = 0x13; break;               // r
+		case XK_s: code = 0x1f; break;               // s
+		case XK_t: code = 0x14; break;               // t
+		case XK_u: code = 0x16; break;               // u
+		case XK_v: code = 0x2f; break;               // v
+		case XK_w: code = 0x11; break;               // w
+		case XK_x: code = 0x2d; break;               // x
+		case XK_y: code = 0x15; break;               // y
+		case XK_z: code = 0x2c; break;               // z
+		case XK_braceleft: code = 0x011a; break;     // {
+		case XK_bar: code = 0x012b; break;           // |
+		case XK_braceright: code = 0x011b;           // }
+		case XK_asciitilde: code = 0x0129;           // ~
+		default: RTPrintf("VNC unhandled keyboard code: down=%d code=%d\n", down, keycode); break;
+	}
         //DEL is in high area
-        code = codes_low[keycode - 32];
         shift = (code >> 8) & 0x03;
         if (shift == 0x02 || code & 0xe000)
             shift = -1;
@@ -261,45 +351,42 @@
     {
         switch(keycode)
         {
-/*Numpad keys - these have to be implemented yet
-Todo: numpad arrows, home, pageup, pagedown, end, insert, delete
-65421 Numpad return
-
-65450 Numpad *
-65451 Numpad +
-65453 Numpad -
-65454 Numpad .
-65455 Numpad /
-65457 Numpad 1
-65458 Numpad 2
-65459 Numpad 3
-
-65460 Numpad 4
-65461 Numpad 5
-65462 Numpad 6
-65463 Numpad 7
-65464 Numpad 8
-65465 Numpad 9
-65456 Numpad 0
-*/
+            case 65450: code =   0x109; break; // Numpad *
+            case 65451: code =   0x10d; break; // Numpad +
+            case 65453: code =   0x0c; break; // Numpad -
+            case 65454: code =   0x34; break; // Numpad .
+            case 65455: code =   0x35; break; // Numpad /
+            case 65457: code =   0x02; break; // Numpad 1
+            case 65458: code =   0x03; break; // Numpad 2
+            case 65459: code =   0x04; break; // Numpad 3
+            case 65460: code =   0x05; break; // Numpad 4
+            case 65461: code =   0x06; break; // Numpad 5
+            case 65462: code =   0x07; break; // Numpad 6
+            case 65463: code =   0x08; break; // Numpad 7
+            case 65464: code =   0x09; break; // Numpad 8
+            case 65465: code =   0x0a; break; // Numpad 9
+            case 65456: code =   0x0b; break; // Numpad 0
+
             case 65288: code =   0x0e; break; //Backspace
             case 65289: code =   0x0f; break; //Tab
 
-            case 65293: code =   0x1c; break; //Return
+            case 65421: case 65293: code =   0x1c; break; //Return
+
             //case 65299: break; Pause/break
             case 65307: code =   0x01; break; //Escape
 
-            case 65360: code = 0xe047; break; //Home
-            case 65361: code = 0xe04b; break; //Left
-            case 65362: code = 0xe048; break; //Up
-            case 65363: code = 0xe04d; break; //Right
-            case 65364: code = 0xe050; break; //Down
-            case 65365: code = 0xe049; break; //Page up
-            case 65366: code = 0xe051; break; //Page down
-            case 65367: code = 0xe04f; break; //End
+            case 65429: case 65360: code = 0xe047; break; //Home
+            case 65430: case 65361: code = 0xe04b; break; //Left
+            case 65431: case 65362: code = 0xe048; break; //Up
+            case 65432: case 65363: code = 0xe04d; break; //Right
+
+            case 65433: case 65364: code = 0xe050; break; //Down
+            case 65434: case 65365: code = 0xe049; break; //Page up
+            case 65435: case 65366: code = 0xe051; break; //Page down
+            case 65436: case 65367: code = 0xe04f; break; //End
 
             //case 65377: break; //Print screen
-            case 65379: code = 0xe052; break; //Insert
+            case 65438: case 65379: code = 0xe052; break; //Insert
 
             case 65383: code = 0xe05d; break; //Menu
 
@@ -316,18 +403,19 @@
             case 65480: code =   0x57; break; //F11
             case 65481: code =   0x58; break; //F12
 
-            case 65505: shift =  down; break; //Shift (left + right)
+            case 65505: shift =  down; break; //Shift (left)
+            case 65506: shift =  down; break; //Shift (left)
             case 65507: code =   0x1d; break; //Left ctrl
             case 65508: code = 0xe01d; break; //Right ctrl
             case 65513: code =   0x38; break; //Left Alt
             case 65514: code = 0xe038; break; //Right Alt
             case 65515: code = 0xe05b; break; //Left windows key
             case 65516: code = 0xe05c; break; //Right windows key
-            case 65535: code = 0xe053; break; //Delete
+            case 65439: case 65535: code = 0xe053; break; //Delete
             default: RTPrintf("VNC unhandled keyboard code: down=%d code=%d\n", down, keycode); break;
         }
     }
-    //RTPrintf("down=%d shift=%d code=%d\n", down, shift, code);
+    RTPrintf("down=%d shift=%d code=%d\n", down, shift, code);
     if (shift != -1 && code != -1)
     {
         kbdPutCodeShift(shift, code, down);
--- virtualbox-ose-4.0.14.orig/debian/LocalConfig.kmk
+++ virtualbox-ose-4.0.14/debian/LocalConfig.kmk
@@ -29,3 +29,5 @@
 VBOX_WITH_RUNPATH          := $(VBOX_PATH_APP_PRIVATE_ARCH)
 VBOX_PATH_APP_PRIVATE      := /usr/share/virtualbox
 VBOX_PATH_APP_DOCS          = $(VBOX_PATH_PACKAGE_DOCS)
+VBOX_WITH_WIN32_ADDITIONS  := 1
+VBOX_WITH_VNC              := 1
--- virtualbox-ose-4.0.14.orig/debian/rules
+++ virtualbox-ose-4.0.14/debian/rules
@@ -42,7 +42,7 @@
 arch     := $(shell dpkg --print-architecture)
 verfile  := $(builddir)/version-generated.mk
 ose      := $(if $(OSE),1,$(if $(wildcard $(vboxroot)/src/VBox/RDP/server),,1))
-svnrev   := 0
+svnrev   := 1
 NOMODS   ?= $(ose)
 NOQT     ?= $(HEADLESS)
 NOWEBSVC ?= $(ose)
--- virtualbox-ose-4.0.14.orig/debian/control
+++ virtualbox-ose-4.0.14/debian/control
@@ -5,12 +5,14 @@
 Standards-Version: 3.2.1
 Build-Depends: debhelper (>= 5), libz-dev, libssl-dev, libqt4-dev,
   libqt4-opengl-dev, libsdl1.2-dev, uuid-dev, libxcursor-dev,
-  libidl-dev, libpam0g-dev, bcc, iasl, xsltproc, linux-headers-generic,
+  libidl-dev, libpam0g-dev, bcc, iasl, xsltproc,
   wine, java2-runtime, lsb-release, g++-multilib [amd64],
   libc6-dev-i386 [amd64], ia32-libs [amd64], libasound-dev,
   libpulse-dev, libxml2-dev, libxslt1-dev, python-dev, gsoap,
   libcap2-dev, libgl1-mesa-dev, libglu1-mesa-dev, libxmu-dev,
-  libxext-dev, libcurl-dev, libxrandr-dev
+  libxext-dev, libcurl-dev, libxrandr-dev, makeself, sun-java6-jdk,
+  libvncserver-dev, texlive-latex-base, texlive-latex-base, libxinerama-dev,
+  texlive-latex-recommended, texlive-latex-extra, texlive-fonts-extra
 XS-Python-Version: >= 2.4
 
 Package: virtualbox-ose
