--- /dev/null
+Index: new/ui/vnc.c
+===================================================================
+--- new.orig/ui/vnc.c 2014-11-20 06:45:06.000000000 +0100
++++ new/ui/vnc.c 2014-11-20 06:50:51.000000000 +0100
+@@ -1633,6 +1633,10 @@
+
+ static void do_key_event(VncState *vs, int down, int keycode, int sym)
+ {
++ int mods = keycode & 0xf00;
++
++ keycode &= SCANCODE_KEYMASK;
++
+ /* QEMU console switch */
+ switch(keycode) {
+ case 0x2a: /* Left Shift */
+@@ -1712,7 +1716,24 @@
+ }
+
+ if (qemu_console_is_graphic(NULL)) {
++
++ /* our java vnc client never sends ALTGR, so we create
++ an artificial up/down event */
++
++ int emul_altgr = (mods & SCANCODE_ALTGR) &&
++ !vs->modifiers_state[0xb8];
++
++ if (emul_altgr) {
++ reset_keys(vs);
++ qemu_input_event_send_key_number(vs->vd->dcl.con, 0xb8, true);
++ }
++
+ qemu_input_event_send_key_number(vs->vd->dcl.con, keycode, down);
++
++ if (emul_altgr) {
++ qemu_input_event_send_key_number(vs->vd->dcl.con, 0xb8, false);
++ }
++
+ } else {
+ bool numlock = vs->modifiers_state[0x45];
+ bool control = (vs->modifiers_state[0x1d] ||
+@@ -1851,7 +1872,8 @@
+ lsym = lsym - 'A' + 'a';
+ }
+
+- keycode = keysym2scancode(vs->vd->kbd_layout, lsym & 0xFFFF) & SCANCODE_KEYMASK;
++ keycode = keysym2scancode(vs->vd->kbd_layout, lsym & 0xFFFF);
++
+ trace_vnc_key_event_map(down, sym, keycode, code2name(keycode));
+ do_key_event(vs, down, keycode, sym);
+ }