diff --git a/ibus-HEAD.patch b/ibus-HEAD.patch
index f54ac73..8250001 100644
--- a/ibus-HEAD.patch
+++ b/ibus-HEAD.patch
@@ -17,6 +17,121 @@ index 7245bd3..425dd86 100644
if (!retval) {
g_printerr ("Can not listen on %s! Please try remove directory %s and run again.", address, path);
+diff --git a/client/gtk2/ibusimcontext.c b/client/gtk2/ibusimcontext.c
+index 5da4dec..168e45a 100644
+--- a/client/gtk2/ibusimcontext.c
++++ b/client/gtk2/ibusimcontext.c
+@@ -190,14 +190,20 @@ _key_snooper_cb (GtkWidget *widget,
+ IBusIMContext *ibusimcontext;
+ ibusimcontext = (IBusIMContext *) _focus_im_context;
+
+- if (!_use_key_snooper)
++ if (G_UNLIKELY (!_use_key_snooper))
+ return retval;
+
+ if (ibusimcontext == NULL)
+- return retval;
++ return FALSE;
+
+- if (ibusimcontext->ibuscontext == NULL || ibusimcontext->has_focus == FALSE)
+- return retval;
++ if (G_UNLIKELY (ibusimcontext->ibuscontext == NULL || ibusimcontext->has_focus == FALSE))
++ return FALSE;
++
++ if (G_UNLIKELY (event->state & IBUS_HANDLED_MASK))
++ return TRUE;
++
++ if (G_UNLIKELY (event->state & IBUS_IGNORED_MASK))
++ return FALSE;
+
+ switch (event->type) {
+ case GDK_KEY_RELEASE:
+@@ -212,6 +218,14 @@ _key_snooper_cb (GtkWidget *widget,
+ break;
+ default:
+ retval = FALSE;
++ break;
++ }
++
++ if (retval) {
++ event->state |= IBUS_HANDLED_MASK;
++ }
++ else {
++ event->state |= IBUS_IGNORED_MASK;
+ }
+
+ return retval;
+@@ -383,11 +397,18 @@ ibus_im_context_filter_keypress (GtkIMContext *context,
+
+ IBusIMContext *ibusimcontext = (IBusIMContext *) context;
+
+- if (ibusimcontext->ibuscontext && ibusimcontext->has_focus) {
++ if (G_LIKELY (ibusimcontext->ibuscontext && ibusimcontext->has_focus)) {
+ /* If context does not have focus, ibus will process key event in sync mode.
+ * It is a workaround for increase search in treeview.
+ */
+- gboolean retval;
++ gboolean retval = FALSE;
++
++ if (event->state & IBUS_HANDLED_MASK)
++ return TRUE;
++
++ if (event->state & IBUS_IGNORED_MASK)
++ return gtk_im_context_filter_keypress (ibusimcontext->slave, event);
++
+ switch (event->type) {
+ case GDK_KEY_RELEASE:
+ retval = ibus_input_context_process_key_event (ibusimcontext->ibuscontext,
+@@ -404,9 +425,13 @@ ibus_im_context_filter_keypress (GtkIMContext *context,
+ }
+
+ if (retval) {
++ event->state |= IBUS_HANDLED_MASK;
+ return TRUE;
+ }
+- return gtk_im_context_filter_keypress (ibusimcontext->slave, event);
++ else {
++ event->state |= IBUS_IGNORED_MASK;
++ return gtk_im_context_filter_keypress (ibusimcontext->slave, event);
++ }
+ }
+ else {
+ return gtk_im_context_filter_keypress (ibusimcontext->slave, event);
+diff --git a/data/ibus.schemas.in b/data/ibus.schemas.in
+index be4b980..a976eec 100644
+--- a/data/ibus.schemas.in
++++ b/data/ibus.schemas.in
+@@ -18,7 +18,7 @@
+ ibus
+ list
+ string
+- [Control+space,Zenkaku_Hankaku,Alt+Zenkaku_Hankaku,Alt+grave,Hangul]
++ [Control+space,Zenkaku_Hankaku,Alt+Zenkaku_Hankaku,Alt+grave,Hangul,Alt+Release+Alt_R]
+
+ Trigger Hotkey
+ Trigger hotkey for enable or disable input context
+diff --git a/ibus/modifier.py b/ibus/modifier.py
+index 7f6afad..56d8be9 100644
+--- a/ibus/modifier.py
++++ b/ibus/modifier.py
+@@ -33,11 +33,15 @@ BUTTON2_MASK = 1 << 9
+ BUTTON3_MASK = 1 << 10
+ BUTTON4_MASK = 1 << 11
+ BUTTON5_MASK = 1 << 12
+-
++
++HANDLED_MASK = 1 << 24
++IGNORED_MASK = 1 << 25
++FORWARD_MASK = 1 << 25
++
+ SUPER_MASK = 1 << 26
+ HYPER_MASK = 1 << 27
+ META_MASK = 1 << 28
+-
++
+ RELEASE_MASK = 1 << 30
+
+ MODIFIER_MASK = 0x5c001fff
diff --git a/po/as.po b/po/as.po
index 8e33ca2..9b81669 100644
--- a/po/as.po
@@ -416,3 +531,166 @@ index 8e33ca2..9b81669 100644
+#~ msgid "prev engine"
+#~ msgstr "আগৰ কলঘৰ"
+diff --git a/po/te.po b/po/te.po
+index 3b8c0da..9c65afd 100644
+--- a/po/te.po
++++ b/po/te.po
+@@ -1,21 +1,21 @@
+-# translation of ibus.master.ibus.po to Telugu
++# translation of ibus.master.te.po to Telugu
+ # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+ # This file is distributed under the same license as the PACKAGE package.
+ #
+ # Krishna Babu K , 2009.
+ msgid ""
+ msgstr ""
+-"Project-Id-Version: ibus.master.ibus\n"
++"Project-Id-Version: ibus.master.te\n"
+ "Report-Msgid-Bugs-To: \n"
+-"POT-Creation-Date: 2009-04-07 15:38+0800\n"
+-"PO-Revision-Date: 2009-04-07 00:39+0530\n"
++"POT-Creation-Date: 2009-04-06 11:45+0800\n"
++"PO-Revision-Date: 2009-04-14 15:04+0530\n"
+ "Last-Translator: Krishna Babu K \n"
+ "Language-Team: Telugu \n"
+ "MIME-Version: 1.0\n"
+ "Content-Type: text/plain; charset=UTF-8\n"
+ "Content-Transfer-Encoding: 8bit\n"
+ "X-Generator: KBabel 1.11.4\n"
+-"Plural-Forms: nplurals=2; plural=(n!=1);\n"
++"Plural-Forms: nplurals=2; plural=(n!=1);\n\n"
+ "\n"
+
+ #: ../bus/ibus.desktop.in.h:1
+@@ -49,23 +49,20 @@ msgstr "కృష్ణబాబు కె 2009."
+
+ #. create input methods menu
+ #: ../ui/gtk/languagebar.py:84
+-#, fuzzy
+ msgid "Switch input method"
+-msgstr "ఎటువంటి ఇన్పుట్ పద్దతిలేదు"
++msgstr "ఇన్పుట్ పద్దతి మార్చుము"
+
+ #: ../setup/main.py:103
+ msgid "trigger"
+ msgstr "బిస (ట్రిగ్గర్)"
+
+ #: ../setup/main.py:113
+-#, fuzzy
+ msgid "next input method"
+-msgstr "తరువాతి ఇన్పుట్ పద్దతి:"
++msgstr "తరువాతి ఇన్పుట్ పద్దతి"
+
+ #: ../setup/main.py:123
+-#, fuzzy
+ msgid "previous input method"
+-msgstr "మునుపటి ఇన్పుట్ పద్దతి:"
++msgstr "మునుపటి ఇన్పుట్ పద్దతి"
+
+ #: ../setup/main.py:204
+ msgid "IBus daemon is not started. Do you want to start it now?"
+@@ -201,7 +198,6 @@ msgid "Next input method:"
+ msgstr "తరువాతి ఇన్పుట్ పద్దతి:"
+
+ #: ../setup/setup.glade.h:25
+-#, fuzzy
+ msgid "Previous input method:"
+ msgstr "మునుపటి ఇన్పుట్ పద్దతి:"
+
+@@ -285,14 +281,7 @@ msgstr "మలచుకొనిన ఫాంటు వుపయోగించ
+ msgid "Use custom font name for language panel"
+ msgstr "భాషా ప్యానల్ కొరకు మలచుకొనిన ఫాంట్ నామము వుపయోగించుము"
+
+-#~ msgid "Switch engine"
+-#~ msgstr "ఇంజన్ను మార్చుము"
+-
+-#~ msgid "next engine"
+-#~ msgstr "తరువాతి యింజన్"
+-
+-#~ msgid "prev engine"
+-#~ msgstr "మునుపటి యింజన్"
++#: ../data/ibus.schemas.in.h:17
++msgid "[Control+space]"
++msgstr "[Control+space]"
+
+-#~ msgid "[Control+space]"
+-#~ msgstr "[Control+space]"
+diff --git a/setup/keyboardshortcut.py b/setup/keyboardshortcut.py
+index a9e2233..f954343 100644
+--- a/setup/keyboardshortcut.py
++++ b/setup/keyboardshortcut.py
+@@ -27,6 +27,7 @@ __all__ = (
+ import gobject
+ import gtk
+ from gtk import gdk
++from gtk import keysyms
+
+ from gettext import dgettext
+ _ = lambda a : dgettext("ibus", a)
+@@ -217,8 +218,29 @@ class KeyboardShortcutSelection(gtk.VBox):
+ if id != gtk.RESPONSE_OK or not out:
+ return
+ keyevent = out[0]
++ state = keyevent.state & (gdk.CONTROL_MASK | \
++ gdk.SHIFT_MASK | \
++ gdk.MOD1_MASK | \
++ gdk.META_MASK | \
++ gdk.SUPER_MASK | \
++ gdk.HYPER_MASK)
++ if state == 0:
++ state = state | gdk.RELEASE_MASK
++ elif keyevent.keyval in (keysyms.Control_L, keysyms.Control_R) and state == gdk.CONTROL_MASK:
++ state = state | gdk.RELEASE_MASK
++ elif keyevent.keyval in (keysyms.Shift_L, keysyms.Shift_R) and state == gdk.SHIFT_MASK:
++ state = state | gdk.RELEASE_MASK
++ elif keyevent.keyval in (keysyms.Alt_L, keysyms.Alt_R) and state == gdk.MOD1_MASK:
++ state = state | gdk.RELEASE_MASK
++ elif keyevent.keyval in (keysyms.Meta_L, keysyms.Meta_R) and state == gdk.META_MASK:
++ state = state | gdk.RELEASE_MASK
++ elif keyevent.keyval in (keysyms.Super_L, keysyms.Super_R) and state == gdk.SUPER_MASK:
++ state = state | gdk.RELEASE_MASK
++ elif keyevent.keyval in (keysyms.Hyper_L, keysyms.Hyper_R) and state == gdk.HYPER_MASK:
++ state = state | gdk.RELEASE_MASK
++
+ for name, button, mask in self.__modifier_buttons:
+- if keyevent.state & mask:
++ if state & mask:
+ button.set_active(True)
+ else:
+ button.set_active(False)
+diff --git a/src/ibusinputcontext.c b/src/ibusinputcontext.c
+index 95754cf..52547ff 100644
+--- a/src/ibusinputcontext.c
++++ b/src/ibusinputcontext.c
+@@ -553,7 +553,10 @@ ibus_input_context_process_key_event (IBusInputContext *context,
+ IBusError *error = NULL;
+ gboolean retval;
+
+- if (state & IBUS_FORWARD_MASK)
++ if (state & IBUS_HANDLED_MASK)
++ return TRUE;
++
++ if (state & IBUS_IGNORED_MASK)
+ return FALSE;
+
+ retval = ibus_proxy_call_with_reply ((IBusProxy *) context,
+diff --git a/src/ibustypes.h b/src/ibustypes.h
+index d2f15ba..2f7c0bf 100644
+--- a/src/ibustypes.h
++++ b/src/ibustypes.h
+@@ -69,11 +69,13 @@ typedef enum
+ IBUS_BUTTON5_MASK = 1 << 12,
+
+ /* The next few modifiers are used by XKB, so we skip to the end.
+- * Bits 15 - 24 are currently unused. Bit 29 is used internally.
++ * Bits 15 - 23 are currently unused. Bit 29 is used internally.
+ */
+
+- /* forward mask */
++ /* ibus mask */
++ IBUS_HANDLED_MASK = 1 << 24,
+ IBUS_FORWARD_MASK = 1 << 25,
++ IBUS_IGNORED_MASK = IBUS_FORWARD_MASK,
+
+ IBUS_SUPER_MASK = 1 << 26,
+ IBUS_HYPER_MASK = 1 << 27,
diff --git a/ibus.spec b/ibus.spec
index 3cf1b51..e51fd3e 100644
--- a/ibus.spec
+++ b/ibus.spec
@@ -8,7 +8,7 @@
Name: ibus
Version: 1.1.0.20090413
-Release: 2%{?dist}
+Release: 3%{?dist}
Summary: Intelligent Input Bus for Linux OS
License: LGPLv2+
Group: System Environment/Libraries
@@ -217,6 +217,13 @@ fi
%{_libdir}/pkgconfig/*
%changelog
+* Wed Apr 15 2009 Huang Peng - 1.1.0.20090413-3
+- Update ibus-HEAD.patch.
+- Fix bug 495431 - ibus Release modifier doesn't work with Alt
+- Fix bug 494445 - ibus-hangul missing Hangul Han/En mode
+ (and Alt_R+release hotkey)
+- Update te.po
+
* Tue Apr 14 2009 Huang Peng - 1.1.0.20090413-2
- Update ibus-HEAD.patch.
- Change the mode of /tmp/ibus-$USER to 0700 to improve security