diff --git a/src/Make_mvc.mak b/src/Make_mvc.mak
index 6889a91..23852df 100644
--- a/src/Make_mvc.mak
+++ b/src/Make_mvc.mak
@@ -34,7 +34,6 @@
 #	IME support: IME=yes	(default is yes)
 #	  DYNAMIC_IME=[yes or no]  (to load the imm32.dll dynamically, default
 #	  is yes)
-#	Global IME support: GIME=yes (requires GUI=yes)
 #
 #	Terminal support: TERMINAL=yes (default is yes if FEATURES is HUGE)
 #	  Will also enable CHANNEL
@@ -898,11 +897,6 @@
 ! endif
 !endif
 
-!if "$(GIME)" == "yes"
-CFLAGS = $(CFLAGS) -DGLOBAL_IME
-OBJ = $(OBJ) $(OUTDIR)\dimm_i.obj $(OUTDIR)\glbl_ime.obj
-!endif
-
 !if "$(GUI)" == "yes"
 SUBSYSTEM = windows
 CFLAGS = $(CFLAGS) -DFEAT_GUI_MSWIN
@@ -1475,9 +1469,6 @@
 	- if exist uninstall.exe del uninstall.exe
 	- if exist if_perl.c del if_perl.c
 	- if exist auto\if_perl.c del auto\if_perl.c
-	- if exist dimm.h del dimm.h
-	- if exist dimm_i.c del dimm_i.c
-	- if exist dimm.tlb del dimm.tlb
 	- if exist dosinst.exe del dosinst.exe
 	cd xxd
 	$(MAKE) /NOLOGO -f Make_mvc.mak clean
@@ -1893,13 +1884,6 @@
 	midl /nologo /error none /proxy nul /iid iid_ole.c /tlb vim.tlb \
 		/header if_ole.h if_ole.idl
 
-dimm.h dimm_i.c: dimm.idl
-	midl /nologo /error none /proxy nul dimm.idl
-
-$(OUTDIR)/dimm_i.obj: $(OUTDIR) dimm_i.c $(INCL)
-
-$(OUTDIR)/glbl_ime.obj:	$(OUTDIR) glbl_ime.cpp  dimm.h $(INCL)
-
 
 CCCTERM = $(CC) $(CFLAGS) -Ilibvterm/include -DINLINE="" \
 	-DVSNPRINTF=vim_vsnprintf \
diff --git a/src/dimm.idl b/src/dimm.idl
deleted file mode 100644
index ac44965..0000000
--- a/src/dimm.idl
+++ /dev/null
@@ -1,544 +0,0 @@
-//+-------------------------------------------------------------------------
-//
-//  Microsoft Windows
-//  Copyright (C) Microsoft Corporation, 1992-2000.
-//
-//  File: dimm.idl
-//
-//  Contents: ActiveIMM interface definitions
-//
-//
-//--------------------------------------------------------------------------
-
-cpp_quote("//=--------------------------------------------------------------------------=")
-cpp_quote("// dimm.h")
-cpp_quote("//=--------------------------------------------------------------------------=")
-cpp_quote("// (C) Copyright 1995-1998 Microsoft Corporation.  All Rights Reserved.")
-cpp_quote("//")
-cpp_quote("// THIS CODE AND INFORMATION IS PROVIDED \"AS IS\" WITHOUT WARRANTY OF")
-cpp_quote("// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO")
-cpp_quote("// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A")
-cpp_quote("// PARTICULAR PURPOSE.")
-cpp_quote("//=--------------------------------------------------------------------------=")
-cpp_quote("")
-cpp_quote("#pragma comment(lib,\"uuid.lib\")")
-cpp_quote("")
-cpp_quote("//--------------------------------------------------------------------------")
-cpp_quote("// IActiveIMM Interfaces.")
-cpp_quote("")
-
-/*
-Disable a warning about lack of polymorphic type support for the following reasons
-- the only reason to have library block in the file is to make midl accept coclass
-  statement and generate CLSID for CActiveIMM.
-- the generated dimm_i.c has the clsid and that file is used to have clsid available
-- the dimm.tlb is not used at all
-- on top of it, there is no plans to port the app using dimm.idl to 64b platform.
-*/
-/*
- * midl_pragma is unsupported in midl version 3.01 shipped with VC5.0.
- * It is supported in midl version 5.01 shipped with VC6.0
- * I could not produce message 2395. Is this needed? W.Briscoe 2001-08-14
- */
-#if (__midl >= 501)
-midl_pragma warning( disable: 2395) // polymorphic types not supported in the TLB
-#endif
-
-#ifndef DO_NO_IMPORTS
-import "unknwn.idl";
-#endif
-
-[
-    uuid(4955DD30-B159-11d0-8FCF-00AA006BCC59),
-    helpstring("ActiveIMM"),
-    lcid(0x0000),
-    version(0.1)
-]
-library ActiveIMM
-{
-    importlib("stdole2.tlb");
-
-    cpp_quote("#include <imm.h>")
-
-    cpp_quote("#if 0")
-
-    typedef WORD LANGID;
-
-    typedef struct
-    {
-        LPSTR   lpReading;
-        LPSTR   lpWord;
-    } REGISTERWORDA;
-
-    typedef struct
-    {
-        LPWSTR   lpReading;
-        LPWSTR   lpWord;
-    } REGISTERWORDW;
-
-    #define LF_FACESIZE         32
-
-    typedef struct
-    {
-        LONG      lfHeight;
-        LONG      lfWidth;
-        LONG      lfEscapement;
-        LONG      lfOrientation;
-        LONG      lfWeight;
-        BYTE      lfItalic;
-        BYTE      lfUnderline;
-        BYTE      lfStrikeOut;
-        BYTE      lfCharSet;
-        BYTE      lfOutPrecision;
-        BYTE      lfClipPrecision;
-        BYTE      lfQuality;
-        BYTE      lfPitchAndFamily;
-        CHAR      lfFaceName[LF_FACESIZE];
-    } LOGFONTA;
-
-    typedef struct
-    {
-        LONG      lfHeight;
-        LONG      lfWidth;
-        LONG      lfEscapement;
-        LONG      lfOrientation;
-        LONG      lfWeight;
-        BYTE      lfItalic;
-        BYTE      lfUnderline;
-        BYTE      lfStrikeOut;
-        BYTE      lfCharSet;
-        BYTE      lfOutPrecision;
-        BYTE      lfClipPrecision;
-        BYTE      lfQuality;
-        BYTE      lfPitchAndFamily;
-        WCHAR     lfFaceName[LF_FACESIZE];
-    } LOGFONTW;
-
-    typedef DWORD     HIMC;
-    typedef DWORD     HIMCC;
-
-    typedef struct
-    {
-        DWORD dwIndex;
-        DWORD dwStyle;
-        POINT ptCurrentPos;
-        RECT  rcArea;
-    } CANDIDATEFORM;
-
-    typedef struct
-    {
-        DWORD dwStyle;
-        POINT ptCurrentPos;
-        RECT  rcArea;
-    } COMPOSITIONFORM;
-
-    typedef struct
-    {
-        DWORD dwSize;
-        DWORD dwStyle;
-        DWORD dwCount;
-        DWORD dwSelection;
-        DWORD dwPageStart;
-        DWORD dwPageSize;
-        DWORD dwOffset[1];
-    } CANDIDATELIST;
-
-    #define STYLE_DESCRIPTION_SIZE  32
-
-    typedef struct
-    {
-        DWORD       dwStyle;
-        CHAR        szDescription[STYLE_DESCRIPTION_SIZE];
-    } STYLEBUFA;
-
-    typedef struct
-    {
-        DWORD       dwStyle;
-        WCHAR       szDescription[STYLE_DESCRIPTION_SIZE];
-    } STYLEBUFW;
-
-    typedef WORD ATOM;
-
-    cpp_quote("#endif")
-
-    cpp_quote("#if (WINVER < 0x040A)")
-
-    #define IMEMENUITEM_STRING_SIZE 80
-
-    typedef struct
-    {
-        UINT        cbSize;
-        UINT        fType;
-        UINT        fState;
-        UINT        wID;
-        HBITMAP     hbmpChecked;
-        HBITMAP     hbmpUnchecked;
-        DWORD       dwItemData;
-        CHAR        szString[IMEMENUITEM_STRING_SIZE];
-        HBITMAP     hbmpItem;
-    } IMEMENUITEMINFOA;
-
-    typedef struct
-    {
-        UINT        cbSize;
-        UINT        fType;
-        UINT        fState;
-        UINT        wID;
-        HBITMAP     hbmpChecked;
-        HBITMAP     hbmpUnchecked;
-        DWORD       dwItemData;
-        WCHAR       szString[IMEMENUITEM_STRING_SIZE];
-        HBITMAP     hbmpItem;
-    } IMEMENUITEMINFOW;
-
-    cpp_quote("#endif")
-
-    cpp_quote("#ifndef _DDKIMM_H_")
-
-    typedef struct
-    {
-        HWND                hWnd;
-        BOOL                fOpen;
-        POINT               ptStatusWndPos;
-        POINT               ptSoftKbdPos;
-        DWORD               fdwConversion;
-        DWORD               fdwSentence;
-        union
-        {
-            LOGFONTA        A;
-            LOGFONTW        W;
-        } lfFont;
-        COMPOSITIONFORM     cfCompForm;
-        CANDIDATEFORM       cfCandForm[4];
-        HIMCC               hCompStr;
-        HIMCC               hCandInfo;
-        HIMCC               hGuideLine;
-        HIMCC               hPrivate;
-        DWORD               dwNumMsgBuf;
-        HIMCC               hMsgBuf;
-        DWORD               fdwInit;
-        DWORD               dwReserve[3];
-    } INPUTCONTEXT;
-
-    typedef struct
-    {
-        DWORD       dwPrivateDataSize;
-        DWORD       fdwProperty;
-        DWORD       fdwConversionCaps;
-        DWORD       fdwSentenceCaps;
-        DWORD       fdwUICaps;
-        DWORD       fdwSCSCaps;
-        DWORD       fdwSelectCaps;
-    } IMEINFO;
-
-    cpp_quote("#endif")
-
-    [
-      object,
-      uuid(08C03412-F96B-11d0-A475-00AA006BCC59),
-      pointer_default(unique)
-    ]
-    interface IEnumRegisterWordA : IUnknown
-    {
-        HRESULT Clone([out] IEnumRegisterWordA **ppEnum);
-        HRESULT Next([in] ULONG ulCount, [out] REGISTERWORDA *rgRegisterWord, [out] ULONG *pcFetched);
-        HRESULT Reset();
-        HRESULT Skip([in] ULONG ulCount);
-    };
-
-    [
-      object,
-      uuid(4955DD31-B159-11d0-8FCF-00AA006BCC59),
-      pointer_default(unique)
-    ]
-    interface IEnumRegisterWordW : IUnknown
-    {
-        HRESULT Clone([out] IEnumRegisterWordW **ppEnum);
-        HRESULT Next([in] ULONG ulCount, [out] REGISTERWORDW *rgRegisterWord, [out] ULONG *pcFetched);
-        HRESULT Reset();
-        HRESULT Skip([in] ULONG ulCount);
-    };
-
-
-    [
-      object,
-      uuid(09b5eab0-f997-11d1-93d4-0060b067b86e),
-      pointer_default(unique)
-    ]
-    interface IEnumInputContext : IUnknown
-    {
-        HRESULT Clone([out] IEnumInputContext **ppEnum);
-        HRESULT Next([in] ULONG ulCount, [out] HIMC *rgInputContext, [out] ULONG *pcFetched);
-        HRESULT Reset();
-        HRESULT Skip([in] ULONG ulCount);
-    };
-
-
-    [
-      object,
-      uuid(b3458082-bd00-11d1-939b-0060b067b86e),
-      pointer_default(unique)
-    ]
-    interface IActiveIMMRegistrar : IUnknown
-    {
-        HRESULT RegisterIME([in] REFCLSID rclsid, [in] LANGID lgid, [in] LPCWSTR pszIconFile, [in] LPCWSTR pszDesc);
-        HRESULT UnregisterIME([in] REFCLSID rclsid);
-    };
-
-    [
-      object,
-      uuid(b5cf2cfa-8aeb-11d1-9364-0060b067b86e),
-      pointer_default(unique)
-    ]
-    interface IActiveIMMMessagePumpOwner : IUnknown
-    {
-        HRESULT Start();
-        HRESULT End();
-        HRESULT OnTranslateMessage([in] const MSG *pMsg);
-        HRESULT Pause([out] DWORD *pdwCookie);
-        HRESULT Resume([in] DWORD dwCookie);
-    }
-
-    [
-      object,
-      uuid(08c0e040-62d1-11d1-9326-0060b067b86e),
-      pointer_default(unique)
-    ]
-    interface IActiveIMMApp : IUnknown
-    {
-        HRESULT AssociateContext([in] HWND hWnd, [in] HIMC hIME, [out] HIMC *phPrev);
-        HRESULT ConfigureIMEA([in] HKL hKL, [in] HWND hWnd, [in] DWORD dwMode, [in] REGISTERWORDA *pData);
-        HRESULT ConfigureIMEW([in] HKL hKL, [in] HWND hWnd, [in] DWORD dwMode, [in] REGISTERWORDW *pData);
-        HRESULT CreateContext([out] HIMC *phIMC);
-        HRESULT DestroyContext([in] HIMC hIME);
-        HRESULT EnumRegisterWordA([in] HKL hKL, [in] LPSTR szReading, [in] DWORD dwStyle, [in] LPSTR szRegister, [in] LPVOID pData, [out] IEnumRegisterWordA **pEnum);
-        HRESULT EnumRegisterWordW([in] HKL hKL, [in] LPWSTR szReading, [in] DWORD dwStyle, [in] LPWSTR szRegister, [in] LPVOID pData, [out] IEnumRegisterWordW **pEnum);
-        HRESULT EscapeA([in] HKL hKL, [in] HIMC hIMC, [in] UINT uEscape, [in, out] LPVOID pData, [out] LRESULT *plResult);
-        HRESULT EscapeW([in] HKL hKL, [in] HIMC hIMC, [in] UINT uEscape, [in, out] LPVOID pData, [out] LRESULT *plResult);
-        HRESULT GetCandidateListA([in] HIMC hIMC, [in] DWORD dwIndex, [in] UINT uBufLen, [out] CANDIDATELIST *pCandList, [out] UINT *puCopied);
-        HRESULT GetCandidateListW([in] HIMC hIMC, [in] DWORD dwIndex, [in] UINT uBufLen, [out] CANDIDATELIST *pCandList, [out] UINT *puCopied);
-        HRESULT GetCandidateListCountA([in] HIMC hIMC, [out] DWORD *pdwListSize, [out] DWORD *pdwBufLen);
-        HRESULT GetCandidateListCountW([in] HIMC hIMC, [out] DWORD *pdwListSize, [out] DWORD *pdwBufLen);
-        HRESULT GetCandidateWindow([in] HIMC hIMC, [in] DWORD dwIndex, [out] CANDIDATEFORM *pCandidate);
-        HRESULT GetCompositionFontA([in] HIMC hIMC, [out] LOGFONTA *plf);
-        HRESULT GetCompositionFontW([in] HIMC hIMC, [out] LOGFONTW *plf);
-        HRESULT GetCompositionStringA([in] HIMC hIMC, [in] DWORD dwIndex, [in] DWORD dwBufLen, [out] LONG *plCopied, [out] LPVOID pBuf);
-        HRESULT GetCompositionStringW([in] HIMC hIMC, [in] DWORD dwIndex, [in] DWORD dwBufLen, [out] LONG *plCopied, [out] LPVOID pBuf);
-        HRESULT GetCompositionWindow([in] HIMC hIMC, [out] COMPOSITIONFORM *pCompForm);
-        HRESULT GetContext([in] HWND hWnd, [out] HIMC *phIMC);
-        HRESULT GetConversionListA([in] HKL hKL, [in] HIMC hIMC, [in] LPSTR pSrc, [in] UINT uBufLen, [in] UINT uFlag, [out] CANDIDATELIST *pDst, [out] UINT *puCopied);
-        HRESULT GetConversionListW([in] HKL hKL, [in] HIMC hIMC, [in] LPWSTR pSrc, [in] UINT uBufLen, [in] UINT uFlag, [out] CANDIDATELIST *pDst, [out] UINT *puCopied);
-        HRESULT GetConversionStatus([in] HIMC hIMC, [out] DWORD *pfdwConversion, [out] DWORD *pfdwSentence);
-        HRESULT GetDefaultIMEWnd([in] HWND hWnd, [out] HWND *phDefWnd);
-        HRESULT GetDescriptionA([in] HKL hKL, [in] UINT uBufLen, [out] LPSTR szDescription, [out] UINT *puCopied);
-        HRESULT GetDescriptionW([in] HKL hKL, [in] UINT uBufLen, [out] LPWSTR szDescription, [out] UINT *puCopied);
-        HRESULT GetGuideLineA([in] HIMC hIMC, [in] DWORD dwIndex, [in] DWORD dwBufLen, [out] LPSTR pBuf, [out] DWORD *pdwResult);
-        HRESULT GetGuideLineW([in] HIMC hIMC, [in] DWORD dwIndex, [in] DWORD dwBufLen, [out] LPWSTR pBuf, [out] DWORD *pdwResult);
-        HRESULT GetIMEFileNameA([in] HKL hKL, [in] UINT uBufLen, [out] LPSTR szFileName, [out] UINT *puCopied);
-        HRESULT GetIMEFileNameW([in] HKL hKL, [in] UINT uBufLen, [out] LPWSTR szFileName, [out] UINT *puCopied);
-        HRESULT GetOpenStatus([in] HIMC hIMC);
-        HRESULT GetProperty([in] HKL hKL, [in] DWORD fdwIndex, [out] DWORD *pdwProperty);
-        HRESULT GetRegisterWordStyleA([in] HKL hKL, [in] UINT nItem, [out] STYLEBUFA *pStyleBuf, [out] UINT *puCopied);
-        HRESULT GetRegisterWordStyleW([in] HKL hKL, [in] UINT nItem, [out] STYLEBUFW *pStyleBuf, [out] UINT *puCopied);
-        HRESULT GetStatusWindowPos([in] HIMC hIMC, [out] POINT *pptPos);
-        HRESULT GetVirtualKey([in] HWND hWnd, [out] UINT *puVirtualKey);
-        HRESULT InstallIMEA([in] LPSTR szIMEFileName, [in] LPSTR szLayoutText, [out] HKL *phKL);
-        HRESULT InstallIMEW([in] LPWSTR szIMEFileName, [in] LPWSTR szLayoutText, [out] HKL *phKL);
-        HRESULT IsIME([in] HKL hKL);
-        HRESULT IsUIMessageA([in] HWND hWndIME, [in] UINT msg, [in] WPARAM wParam, [in] LPARAM lParam);
-        HRESULT IsUIMessageW([in] HWND hWndIME, [in] UINT msg, [in] WPARAM wParam, [in] LPARAM lParam);
-        HRESULT NotifyIME([in] HIMC hIMC, [in] DWORD dwAction, [in] DWORD dwIndex, [in] DWORD dwValue);
-        HRESULT RegisterWordA([in] HKL hKL, [in] LPSTR szReading, [in] DWORD dwStyle, [in] LPSTR szRegister);
-        HRESULT RegisterWordW([in] HKL hKL, [in] LPWSTR szReading, [in] DWORD dwStyle, [in] LPWSTR szRegister);
-        HRESULT ReleaseContext([in] HWND hWnd, [in] HIMC hIMC);
-        HRESULT SetCandidateWindow([in] HIMC hIMC, [in] CANDIDATEFORM *pCandidate);
-        HRESULT SetCompositionFontA([in] HIMC hIMC, [in] LOGFONTA *plf);
-        HRESULT SetCompositionFontW([in] HIMC hIMC, [in] LOGFONTW *plf);
-        HRESULT SetCompositionStringA([in] HIMC hIMC, [in] DWORD dwIndex, [in] LPVOID pComp, [in] DWORD dwCompLen, [in] LPVOID pRead, [in] DWORD dwReadLen);
-        HRESULT SetCompositionStringW([in] HIMC hIMC, [in] DWORD dwIndex, [in] LPVOID pComp, [in] DWORD dwCompLen, [in] LPVOID pRead, [in] DWORD dwReadLen);
-        HRESULT SetCompositionWindow([in] HIMC hIMC, [in] COMPOSITIONFORM *pCompForm);
-        HRESULT SetConversionStatus([in] HIMC hIMC, [in] DWORD fdwConversion, [in] DWORD fdwSentence);
-        HRESULT SetOpenStatus([in] HIMC hIMC, [in] BOOL fOpen);
-        HRESULT SetStatusWindowPos([in] HIMC hIMC, [in] POINT *pptPos);
-        HRESULT SimulateHotKey([in] HWND hWnd, [in] DWORD dwHotKeyID);
-        HRESULT UnregisterWordA([in] HKL hKL, [in] LPSTR szReading, [in] DWORD dwStyle, [in] LPSTR szUnregister);
-        HRESULT UnregisterWordW([in] HKL hKL, [in] LPWSTR szReading, [in] DWORD dwStyle, [in] LPWSTR szUnregister);
-
-        HRESULT Activate([in] BOOL fRestoreLayout);
-        HRESULT Deactivate();
-
-        HRESULT OnDefWindowProc([in] HWND hWnd, [in] UINT Msg, [in] WPARAM wParam, [in] LPARAM lParam, [out] LRESULT *plResult);
-
-        HRESULT FilterClientWindows([in] ATOM *aaClassList, [in] UINT uSize);
-
-        HRESULT GetCodePageA([in] HKL hKL, [out] UINT *uCodePage);
-        HRESULT GetLangId([in] HKL hKL, [out] LANGID *plid);
-
-        // win98/nt5 apis
-        HRESULT AssociateContextEx([in] HWND hWnd, [in] HIMC hIMC, [in] DWORD dwFlags);
-        HRESULT DisableIME([in] DWORD idThread);
-        HRESULT GetImeMenuItemsA([in] HIMC hIMC, [in] DWORD dwFlags, [in] DWORD dwType, [in] IMEMENUITEMINFOA *pImeParentMenu, [out] IMEMENUITEMINFOA *pImeMenu, [in] DWORD dwSize, [out] DWORD *pdwResult);
-        HRESULT GetImeMenuItemsW([in] HIMC hIMC, [in] DWORD dwFlags, [in] DWORD dwType, [in] IMEMENUITEMINFOW *pImeParentMenu, [out] IMEMENUITEMINFOW *pImeMenu, [in] DWORD dwSize, [out] DWORD *pdwResult);
-        HRESULT EnumInputContext([in] DWORD idThread, [out] IEnumInputContext **ppEnum);
-    };
-
-    [
-      object,
-      uuid(08C03411-F96B-11d0-A475-00AA006BCC59),
-      pointer_default(unique)
-    ]
-    interface IActiveIMMIME : IUnknown
-    {
-        HRESULT AssociateContext([in] HWND hWnd, [in] HIMC hIME, [out] HIMC *phPrev);
-        HRESULT ConfigureIMEA([in] HKL hKL, [in] HWND hWnd, [in] DWORD dwMode, [in] REGISTERWORDA *pData);
-        HRESULT ConfigureIMEW([in] HKL hKL, [in] HWND hWnd, [in] DWORD dwMode, [in] REGISTERWORDW *pData);
-        HRESULT CreateContext([out] HIMC *phIMC);
-        HRESULT DestroyContext([in] HIMC hIME);
-        HRESULT EnumRegisterWordA([in] HKL hKL, [in] LPSTR szReading, [in] DWORD dwStyle, [in] LPSTR szRegister, [in] LPVOID pData, [out] IEnumRegisterWordA **pEnum);
-        HRESULT EnumRegisterWordW([in] HKL hKL, [in] LPWSTR szReading, [in] DWORD dwStyle, [in] LPWSTR szRegister, [in] LPVOID pData, [out] IEnumRegisterWordW **pEnum);
-        HRESULT EscapeA([in] HKL hKL, [in] HIMC hIMC, [in] UINT uEscape, [in, out] LPVOID pData, [out] LRESULT *plResult);
-        HRESULT EscapeW([in] HKL hKL, [in] HIMC hIMC, [in] UINT uEscape, [in, out] LPVOID pData, [out] LRESULT *plResult);
-        HRESULT GetCandidateListA([in] HIMC hIMC, [in] DWORD dwIndex, [in] UINT uBufLen, [out] CANDIDATELIST *pCandList, [out] UINT *puCopied);
-        HRESULT GetCandidateListW([in] HIMC hIMC, [in] DWORD dwIndex, [in] UINT uBufLen, [out] CANDIDATELIST *pCandList, [out] UINT *puCopied);
-        HRESULT GetCandidateListCountA([in] HIMC hIMC, [out] DWORD *pdwListSize, [out] DWORD *pdwBufLen);
-        HRESULT GetCandidateListCountW([in] HIMC hIMC, [out] DWORD *pdwListSize, [out] DWORD *pdwBufLen);
-        HRESULT GetCandidateWindow([in] HIMC hIMC, [in] DWORD dwIndex, [out] CANDIDATEFORM *pCandidate);
-        HRESULT GetCompositionFontA([in] HIMC hIMC, [out] LOGFONTA *plf);
-        HRESULT GetCompositionFontW([in] HIMC hIMC, [out] LOGFONTW *plf);
-        HRESULT GetCompositionStringA([in] HIMC hIMC, [in] DWORD dwIndex, [in] DWORD dwBufLen, [out] LONG *plCopied, [out] LPVOID pBuf);
-        HRESULT GetCompositionStringW([in] HIMC hIMC, [in] DWORD dwIndex, [in] DWORD dwBufLen, [out] LONG *plCopied, [out] LPVOID pBuf);
-        HRESULT GetCompositionWindow([in] HIMC hIMC, [out] COMPOSITIONFORM *pCompForm);
-        HRESULT GetContext([in] HWND hWnd, [out] HIMC *phIMC);
-        HRESULT GetConversionListA([in] HKL hKL, [in] HIMC hIMC, [in] LPSTR pSrc, [in] UINT uBufLen, [in] UINT uFlag, [out] CANDIDATELIST *pDst, [out] UINT *puCopied);
-        HRESULT GetConversionListW([in] HKL hKL, [in] HIMC hIMC, [in] LPWSTR pSrc, [in] UINT uBufLen, [in] UINT uFlag, [out] CANDIDATELIST *pDst, [out] UINT *puCopied);
-        HRESULT GetConversionStatus([in] HIMC hIMC, [out] DWORD *pfdwConversion, [out] DWORD *pfdwSentence);
-        HRESULT GetDefaultIMEWnd([in] HWND hWnd, [out] HWND *phDefWnd);
-        HRESULT GetDescriptionA([in] HKL hKL, [in] UINT uBufLen, [out] LPSTR szDescription, [out] UINT *puCopied);
-        HRESULT GetDescriptionW([in] HKL hKL, [in] UINT uBufLen, [out] LPWSTR szDescription, [out] UINT *puCopied);
-        HRESULT GetGuideLineA([in] HIMC hIMC, [in] DWORD dwIndex, [in] DWORD dwBufLen, [out] LPSTR pBuf, [out] DWORD *pdwResult);
-        HRESULT GetGuideLineW([in] HIMC hIMC, [in] DWORD dwIndex, [in] DWORD dwBufLen, [out] LPWSTR pBuf, [out] DWORD *pdwResult);
-        HRESULT GetIMEFileNameA([in] HKL hKL, [in] UINT uBufLen, [out] LPSTR szFileName, [out] UINT *puCopied);
-        HRESULT GetIMEFileNameW([in] HKL hKL, [in] UINT uBufLen, [out] LPWSTR szFileName, [out] UINT *puCopied);
-        HRESULT GetOpenStatus([in] HIMC hIMC);
-        HRESULT GetProperty([in] HKL hKL, [in] DWORD fdwIndex, [out] DWORD *pdwProperty);
-        HRESULT GetRegisterWordStyleA([in] HKL hKL, [in] UINT nItem, [out] STYLEBUFA *pStyleBuf, [out] UINT *puCopied);
-        HRESULT GetRegisterWordStyleW([in] HKL hKL, [in] UINT nItem, [out] STYLEBUFW *pStyleBuf, [out] UINT *puCopied);
-        HRESULT GetStatusWindowPos([in] HIMC hIMC, [out] POINT *pptPos);
-        HRESULT GetVirtualKey([in] HWND hWnd, [out] UINT *puVirtualKey);
-        HRESULT InstallIMEA([in] LPSTR szIMEFileName, [in] LPSTR szLayoutText, [out] HKL *phKL);
-        HRESULT InstallIMEW([in] LPWSTR szIMEFileName, [in] LPWSTR szLayoutText, [out] HKL *phKL);
-        HRESULT IsIME([in] HKL hKL);
-        HRESULT IsUIMessageA([in] HWND hWndIME, [in] UINT msg, [in] WPARAM wParam, [in] LPARAM lParam);
-        HRESULT IsUIMessageW([in] HWND hWndIME, [in] UINT msg, [in] WPARAM wParam, [in] LPARAM lParam);
-        HRESULT NotifyIME([in] HIMC hIMC, [in] DWORD dwAction, [in] DWORD dwIndex, [in] DWORD dwValue);
-        HRESULT RegisterWordA([in] HKL hKL, [in] LPSTR szReading, [in] DWORD dwStyle, [in] LPSTR szRegister);
-        HRESULT RegisterWordW([in] HKL hKL, [in] LPWSTR szReading, [in] DWORD dwStyle, [in] LPWSTR szRegister);
-        HRESULT ReleaseContext([in] HWND hWnd, [in] HIMC hIMC);
-        HRESULT SetCandidateWindow([in] HIMC hIMC, [in] CANDIDATEFORM *pCandidate);
-        HRESULT SetCompositionFontA([in] HIMC hIMC, [in] LOGFONTA *plf);
-        HRESULT SetCompositionFontW([in] HIMC hIMC, [in] LOGFONTW *plf);
-        HRESULT SetCompositionStringA([in] HIMC hIMC, [in] DWORD dwIndex, [in] LPVOID pComp, [in] DWORD dwCompLen, [in] LPVOID pRead, [in] DWORD dwReadLen);
-        HRESULT SetCompositionStringW([in] HIMC hIMC, [in] DWORD dwIndex, [in] LPVOID pComp, [in] DWORD dwCompLen, [in] LPVOID pRead, [in] DWORD dwReadLen);
-        HRESULT SetCompositionWindow([in] HIMC hIMC, [in] COMPOSITIONFORM *pCompForm);
-        HRESULT SetConversionStatus([in] HIMC hIMC, [in] DWORD fdwConversion, [in] DWORD fdwSentence);
-        HRESULT SetOpenStatus([in] HIMC hIMC, [in] BOOL fOpen);
-        HRESULT SetStatusWindowPos([in] HIMC hIMC, [in] POINT *pptPos);
-        HRESULT SimulateHotKey([in] HWND hWnd, [in] DWORD dwHotKeyID);
-        HRESULT UnregisterWordA([in] HKL hKL, [in] LPSTR szReading, [in] DWORD dwStyle, [in] LPSTR szUnregister);
-        HRESULT UnregisterWordW([in] HKL hKL, [in] LPWSTR szReading, [in] DWORD dwStyle, [in] LPWSTR szUnregister);
-
-        // ime helper methods
-        HRESULT GenerateMessage([in] HIMC hIMC);
-
-        // HIMC and HIMCC management api's
-        HRESULT LockIMC([in] HIMC hIMC, [out] INPUTCONTEXT **ppIMC);
-        HRESULT UnlockIMC([in] HIMC hIMC);
-        HRESULT GetIMCLockCount([in] HIMC hIMC, [out] DWORD *pdwLockCount);
-        HRESULT CreateIMCC([in] DWORD dwSize, [out] HIMCC *phIMCC);
-        HRESULT DestroyIMCC([in] HIMCC hIMCC);
-        HRESULT LockIMCC([in] HIMCC hIMCC, [out] void **ppv);
-        HRESULT UnlockIMCC([in] HIMCC hIMCC);
-        HRESULT ReSizeIMCC([in] HIMCC hIMCC, [in] DWORD dwSize, [out] HIMCC *phIMCC);
-        HRESULT GetIMCCSize([in] HIMCC hIMCC, [out] DWORD *pdwSize);
-        HRESULT GetIMCCLockCount([in] HIMCC hIMCC, [out] DWORD *pdwLockCount);
-
-        // hot key manipulation api's
-        HRESULT GetHotKey([in] DWORD dwHotKeyID, [out] UINT *puModifiers, [out] UINT *puVKey, [out] HKL *phKL);
-        HRESULT SetHotKey([in] DWORD dwHotKeyID, [in] UINT uModifiers, [in] UINT uVKey, [in] HKL hKL);
-
-        // soft keyboard api's
-        HRESULT CreateSoftKeyboard([in] UINT uType, [in] HWND hOwner, [in] int x, [in] int y, [out] HWND *phSoftKbdWnd);
-        HRESULT DestroySoftKeyboard([in] HWND hSoftKbdWnd);
-        HRESULT ShowSoftKeyboard([in] HWND hSoftKbdWnd, [in] int nCmdShow);
-
-        HRESULT GetCodePageA([in] HKL hKL, [out] UINT *uCodePage);
-        HRESULT GetLangId([in] HKL hKL, [out] LANGID *plid);
-
-        HRESULT KeybdEvent([in] LANGID lgidIME, [in] BYTE bVk, [in] BYTE bScan, [in] DWORD dwFlags, [in] DWORD dwExtraInfo);
-
-        HRESULT LockModal();
-        HRESULT UnlockModal();
-
-        // win98/nt5 apis
-        HRESULT AssociateContextEx([in] HWND hWnd, [in] HIMC hIMC, [in] DWORD dwFlags);
-        HRESULT DisableIME([in] DWORD idThread);
-        HRESULT GetImeMenuItemsA([in] HIMC hIMC, [in] DWORD dwFlags, [in] DWORD dwType, [in] IMEMENUITEMINFOA *pImeParentMenu, [out] IMEMENUITEMINFOA *pImeMenu, [in] DWORD dwSize, [out] DWORD *pdwResult);
-        HRESULT GetImeMenuItemsW([in] HIMC hIMC, [in] DWORD dwFlags, [in] DWORD dwType, [in] IMEMENUITEMINFOW *pImeParentMenu, [out] IMEMENUITEMINFOW *pImeMenu, [in] DWORD dwSize, [out] DWORD *pdwResult);
-        HRESULT EnumInputContext([in] DWORD idThread, [out] IEnumInputContext **ppEnum);
-        HRESULT RequestMessageA([in] HIMC hIMC, [in] WPARAM wParam, [in] LPARAM lParam, [out] LRESULT *plResult);
-        HRESULT RequestMessageW([in] HIMC hIMC, [in] WPARAM wParam, [in] LPARAM lParam, [out] LRESULT *plResult);
-
-        HRESULT SendIMCA([in] HWND hWnd, [in] UINT uMsg, [in] WPARAM wParam, [in] LPARAM lParam, [out] LRESULT *plResult);
-        HRESULT SendIMCW([in] HWND hWnd, [in] UINT uMsg, [in] WPARAM wParam, [in] LPARAM lParam, [out] LRESULT *plResult);
-
-        HRESULT IsSleeping();
-    };
-
-    [
-      object,
-      uuid(6FE20962-D077-11d0-8FE7-00AA006BCC59),
-      pointer_default(unique)
-    ]
-    interface IActiveIME : IUnknown
-    {
-        HRESULT Inquire([in] DWORD dwSystemInfoFlags, [out] IMEINFO *pIMEInfo, [out] LPWSTR szWndClass, [out] DWORD *pdwPrivate);
-        HRESULT ConversionList([in] HIMC hIMC, [in] LPWSTR szSource, [in] UINT uFlag, [in] UINT uBufLen, [out] CANDIDATELIST *pDest, [out] UINT *puCopied);
-        HRESULT Configure([in] HKL hKL, [in] HWND hWnd, [in] DWORD dwMode, [in] REGISTERWORDW *pRegisterWord);
-        HRESULT Destroy([in] UINT uReserved);
-        HRESULT Escape([in] HIMC hIMC, [in] UINT uEscape, [in, out] void *pData, [out] LRESULT *plResult);
-        HRESULT SetActiveContext([in] HIMC hIMC, [in] BOOL fFlag);
-        HRESULT ProcessKey([in] HIMC hIMC, [in] UINT uVirKey, [in] DWORD lParam, [in] BYTE *pbKeyState);
-        HRESULT Notify([in] HIMC hIMC, [in] DWORD dwAction, [in] DWORD dwIndex, [in] DWORD dwValue);
-        HRESULT Select([in] HIMC hIMC, [in] BOOL fSelect);
-        HRESULT SetCompositionString([in] HIMC hIMC, [in] DWORD dwIndex, [in] void *pComp, [in] DWORD dwCompLen, [in] void *pRead, [in] DWORD dwReadLen);
-        HRESULT ToAsciiEx([in] UINT uVirKey, [in] UINT uScanCode, [in] BYTE *pbKeyState, [in] UINT fuState, [in] HIMC hIMC, [out] DWORD *pdwTransBuf, [out] UINT *puSize);
-        HRESULT RegisterWord([in] LPWSTR szReading, [in] DWORD dwStyle, [in] LPWSTR szString);
-        HRESULT UnregisterWord([in] LPWSTR szReading, [in] DWORD  dwStyle, [in] LPWSTR szString);
-        HRESULT GetRegisterWordStyle([in] UINT nItem, [out] STYLEBUFW *pStyleBuf, [out] UINT *puBufSize);
-        HRESULT EnumRegisterWord([in] LPWSTR szReading, [in] DWORD dwStyle, [in] LPWSTR szRegister, [in] LPVOID pData, [out] IEnumRegisterWordW **ppEnum);
-        HRESULT GetCodePageA([out] UINT *uCodePage);
-        HRESULT GetLangId([out] LANGID *plid);
-    };
-
-    [
-      object,
-      uuid(e1c4bf0e-2d53-11d2-93e1-0060b067b86e),
-      pointer_default(unique)
-    ]
-    interface IActiveIME2 : IActiveIME
-    {
-        HRESULT Sleep();
-        HRESULT Unsleep([in] BOOL fDead);
-    };
-
-    [
-      uuid(4955DD33-B159-11d0-8FCF-00AA006BCC59),
-    ]
-    coclass CActiveIMM
-    {
-        [default] interface IActiveIMMApp;
-        interface IActiveIMMIME;
-        interface IActiveIMMRegistrar;
-        interface IActiveIMMMessagePumpOwner;
-    };
-}
diff --git a/src/glbl_ime.cpp b/src/glbl_ime.cpp
deleted file mode 100644
index 6fd84ec..0000000
--- a/src/glbl_ime.cpp
+++ /dev/null
@@ -1,256 +0,0 @@
-/* vi:set ts=8 sts=4 sw=4 noet:
- *
- * VIM - Vi IMproved		by Bram Moolenaar
- *
- * Do ":help uganda"  in Vim to read copying and usage conditions.
- * Do ":help credits" in Vim to see a list of people who contributed.
- */
-
-/*
- * DESCRIPTION:
- * This module produces Global IME for Vim, on Windows with Internet
- * Explorer 5.01 or higher.  You need three files "dimm.idl", "dimm.h", and
- * "dimm_i.c" when compile this module at your self.  "dimm.h", and
- * "dimm_i.c" are generated from "dimm.idl" by using MIDL.EXE as like
- * "if_ole.h".  You can get "dimm.idl" in MSDN web site.  I got it below
- * URL.
- *
- * WHAT IS THE GLOBAL IME?:
- * Global IME makes capability input Chinese, Japanese, and Korean text into
- * Vim buffer on any language version of Windows 98, Windows 95, and Windows
- * NT 4.0.  See below URL for detail of Global IME.  You can also find
- * various language version of Global IME at same place.
- *
- * RUNTIME REQUIREMENTS:
- * - Internet Explorer 5.01 or higher.
- * - Global IME (with language pack?).
- * - Of course Vim for Windows.
- *
- * URLS:
- * - Where you can probably get "dimm.idl".
- * http://msdn.microsoft.com/downloads/samples/internet/libraries/ie5_lib/sample.asp
- * - Global IME detailed information.
- * http://www.microsoft.com/windows/ie/features/ime.asp
- */
-
-#ifdef GLOBAL_IME
-
-#define WIN32_LEAN_AND_MEAN
-#include <windows.h>
-#include <objbase.h>
-extern "C" {
-#include "vim.h"
-}
-#include "dimm.h"
-#include "glbl_ime.h"
-
-static IActiveIMMApp *pIApp = NULL;
-static IActiveIMMMessagePumpOwner *pIMsg = NULL;
-static HWND s_hWnd = NULL;
-static BOOL s_bStatus = FALSE; /* for evacuate */
-
-/*
- * Initialize Global IME.
- * "atom" must be return value of RegisterClass(Ex).
- */
-    void
-global_ime_init(ATOM atom, HWND hWnd)
-{
-    IUnknown *pI;
-    HRESULT hr;
-
-    if (pIApp != NULL || pIMsg != NULL)
-	return;
-    OleInitialize(NULL);
-
-    /*
-     * Get interface IUnknown
-     */
-    hr = CoCreateInstance(CLSID_CActiveIMM, NULL, CLSCTX_SERVER,
-	    IID_IUnknown, (void**)&pI);
-    if (FAILED(hr) || !pI)
-	return;
-
-    /*
-     * Get interface IActiveIMMApp
-     */
-    hr = pI->QueryInterface(IID_IActiveIMMApp, (void**)&pIApp);
-    if (FAILED(hr))
-	pIApp = NULL;
-
-    /*
-     * Get interface IActiveIMMMessagePumpOwner
-     */
-    hr = pI->QueryInterface(IID_IActiveIMMMessagePumpOwner, (void**)&pIMsg);
-    if (FAILED(hr))
-	pIMsg = NULL;
-
-    if (pIApp != NULL)
-    {
-	pIApp->Activate(TRUE);
-	pIApp->FilterClientWindows(&atom, 1);
-    }
-    if (pIMsg != NULL)
-	pIMsg->Start();
-
-    pI->Release();
-    s_hWnd = hWnd;
-}
-
-/*
- * Reset and clear Global IME.
- */
-    void
-global_ime_end()
-{
-    if (pIApp != NULL)
-    {
-	IActiveIMMApp *p = pIApp;
-
-	pIApp = NULL;
-	p->FilterClientWindows(NULL, 0);
-	p->Deactivate();
-	p->Release();
-    }
-    if (pIMsg != NULL)
-    {
-	IActiveIMMMessagePumpOwner *p = pIMsg;
-
-	pIMsg = NULL;
-	p->End();
-	p->Release();
-    }
-    OleUninitialize();
-}
-
-/*
- * Replacement for DefWindowProc().
- */
-    LRESULT WINAPI
-global_ime_DefWindowProc(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam)
-{
-    LRESULT lResult;
-
-    if (pIApp == NULL || pIApp->OnDefWindowProc(hWnd, Msg,
-					    wParam, lParam, &lResult) != S_OK)
-	lResult = DefWindowProcW(hWnd, Msg, wParam, lParam);
-    return lResult;
-}
-
-/*
- * Replace with TranslateMessage()
- */
-    BOOL WINAPI
-global_ime_TranslateMessage(CONST MSG *lpMsg)
-{
-    if (pIMsg == NULL || pIMsg->OnTranslateMessage(lpMsg) == S_FALSE)
-	return TranslateMessage(lpMsg);
-    return TRUE;
-}
-
-/*
- * Set position of IME composition window.
- *
- * You have to call this before starting composition.  If once composition
- * started, this can take no effect until that composition have finished.  So
- * you should handle WM_IME_STARTCOMPOSITION and call this function.
- */
-    void WINAPI
-global_ime_set_position(POINT *pPoint)
-{
-    HIMC hImc = NULL;
-
-    if (pIApp == NULL || pPoint == NULL)
-	return;
-
-    if (SUCCEEDED(pIApp->GetContext(s_hWnd, &hImc)))
-    {
-	COMPOSITIONFORM CompForm;
-
-	CompForm.dwStyle = CFS_POINT;
-	CompForm.ptCurrentPos = *pPoint;
-	pIApp->SetCompositionWindow(hImc, &CompForm);
-	pIApp->ReleaseContext(s_hWnd, hImc);
-    }
-}
-
-/*
- * Set font to Global IME
- */
-/* GIME_TEST */
-    void WINAPI
-global_ime_set_font(LOGFONT *pFont)
-{
-    HIMC hImc = NULL;
-
-    if (pIApp == NULL || pFont == NULL)
-	return;
-
-    if (SUCCEEDED(pIApp->GetContext(s_hWnd, &hImc)))
-    {
-	pIApp->SetCompositionFontA(hImc, pFont);
-	pIApp->ReleaseContext(s_hWnd, hImc);
-    }
-}
-
-#if 0
-/*
- * for IME control.  Save current status of IME, and set force new-status to
- * English (turn off).
- */
-    void WINAPI
-global_ime_status_evacuate()
-{
-    HIMC    hImc;
-
-    if (pIApp != NULL && SUCCEEDED(pIApp->GetContext(s_hWnd, &hImc)))
-    {
-	s_bStatus = (pIApp->GetOpenStatus(hImc) == 0) ? TRUE : FALSE;
-	pIApp->SetOpenStatus(hImc, FALSE);
-	pIApp->ReleaseContext(s_hWnd, hImc);
-    }
-}
-
-/*
- * for IME control.  Change IME status to last saved one.
- */
-    void WINAPI
-global_ime_status_restore()
-{
-    HIMC    hImc;
-
-    if (pIApp != NULL && SUCCEEDED(pIApp->GetContext(s_hWnd, &hImc)))
-    {
-	pIApp->SetOpenStatus(hImc, s_bStatus);
-	pIApp->ReleaseContext(s_hWnd, hImc);
-    }
-}
-#endif
-
-    void WINAPI
-global_ime_set_status(int status)
-{
-    HIMC    hImc;
-
-    if (pIApp != NULL && SUCCEEDED(pIApp->GetContext(s_hWnd, &hImc)))
-    {
-	pIApp->SetOpenStatus(hImc, status ? TRUE : FALSE);
-	pIApp->ReleaseContext(s_hWnd, hImc);
-    }
-}
-
-    int WINAPI
-global_ime_get_status()
-{
-    int status = 0;
-    HIMC    hImc;
-
-    if (pIApp != NULL && SUCCEEDED(pIApp->GetContext(s_hWnd, &hImc)))
-    {
-	status = pIApp->GetOpenStatus(hImc) ? 1 : 0;
-	pIApp->ReleaseContext(s_hWnd, hImc);
-    }
-    return status;
-}
-
-#endif /* GLOBAL_IME */
diff --git a/src/glbl_ime.h b/src/glbl_ime.h
deleted file mode 100644
index bce9c73..0000000
--- a/src/glbl_ime.h
+++ /dev/null
@@ -1,33 +0,0 @@
-/* vi:set ts=8 sts=4 sw=4 noet:
- *
- * VIM - Vi IMproved		by Bram Moolenaar
- *
- * Do ":help uganda"  in Vim to read copying and usage conditions.
- * Do ":help credits" in Vim to see a list of people who contributed.
- */
-
-#ifdef GLOBAL_IME
-# ifndef _INC_GLOBAL_IME
-#  define _INC_GLOBAL_IME
-
-#  ifdef __cplusplus
-extern "C" {
-#  endif
-    void global_ime_init(ATOM, HWND);
-    void global_ime_end(void);
-    LRESULT WINAPI global_ime_DefWindowProc(HWND, UINT, WPARAM, LPARAM);
-    BOOL WINAPI global_ime_TranslateMessage(CONST MSG *);
-    void WINAPI global_ime_set_position(POINT*);
-    void WINAPI global_ime_set_font(LOGFONT*);
-#  if 0
-    void WINAPI global_ime_status_evacuate(void);
-    void WINAPI global_ime_status_restore(void);
-#  endif
-    void WINAPI global_ime_set_status(int status);
-    int WINAPI global_ime_get_status(void);
-#  ifdef __cplusplus
-}
-#  endif
-
-# endif // _INC_GLOBAL_IME
-#endif // GLOBAL_IME
diff --git a/src/gui_w32.c b/src/gui_w32.c
index 4f047f1..cbbae9e 100644
--- a/src/gui_w32.c
+++ b/src/gui_w32.c
@@ -197,10 +197,6 @@
 # endif
 # include <windowsx.h>
 
-# ifdef GLOBAL_IME
-#  include "glbl_ime.h"
-# endif
-
 #endif // PROTO
 
 #ifdef FEAT_MENU
@@ -358,12 +354,6 @@
 // problems (e.g., while ":s" is working).
 static int allow_scrollbar = FALSE;
 
-#ifdef GLOBAL_IME
-# define MyTranslateMessage(x) global_ime_TranslateMessage(x)
-#else
-# define MyTranslateMessage(x) TranslateMessage(x)
-#endif
-
 #ifndef _DPI_AWARENESS_CONTEXTS_
 typedef HANDLE DPI_AWARENESS_CONTEXT;
 
@@ -449,9 +439,6 @@
 }
 #endif
 
-// use of WindowProc depends on Global IME
-static LRESULT WINAPI MyWindowProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam);
-
 extern int current_font_height;	    // this is in os_mswin.c
 
 static struct
@@ -561,11 +548,9 @@
  *
  * These LOGFONTW used for IME.
  */
-#if defined(FEAT_MBYTE_IME) || defined(GLOBAL_IME)
+#ifdef FEAT_MBYTE_IME
 // holds LOGFONTW for 'guifontwide' if available, otherwise 'guifont'
 static LOGFONTW norm_logfont;
-#endif
-#ifdef FEAT_MBYTE_IME
 // holds LOGFONTW for 'guifont' always.
 static LOGFONTW sub_logfont;
 #endif
@@ -1315,20 +1300,10 @@
 	    return TRUE;
 #endif
 	default:
-	    return MyWindowProc(hwnd, uMsg, wParam, lParam);
+	    return DefWindowProcW(hwnd, uMsg, wParam, lParam);
     }
 }
 
-    static LRESULT WINAPI
-MyWindowProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
-{
-#ifdef GLOBAL_IME
-    return global_ime_DefWindowProc(hwnd, message, wParam, lParam);
-#else
-    return DefWindowProcW(hwnd, message, wParam, lParam);
-#endif
-}
-
 /*
  * Called when the foreground or background color has been changed.
  */
@@ -1844,7 +1819,7 @@
     deadCharExpel.hwnd    = originalMsg.hwnd;
     deadCharExpel.wParam  = VK_SPACE;
 
-    MyTranslateMessage(&deadCharExpel);
+    TranslateMessage(&deadCharExpel);
 
     // re-generate the current character free of the dead char influence
     PostMessage(originalMsg.hwnd, originalMsg.message, originalMsg.wParam,
@@ -1919,7 +1894,7 @@
 	 *
 	 * - Before doing something special such as regenerating keypresses to
 	 *   expel the dead character as this could trigger an infinite loop if
-	 *   for some reason MyTranslateMessage() do not trigger a call
+	 *   for some reason TranslateMessage() do not trigger a call
 	 *   immediately to _OnChar() (or _OnSysChar()).
 	 */
 	if (dead_key)
@@ -1939,7 +1914,7 @@
 	    if ((vk == VK_SPACE || vk == VK_BACK || vk == VK_ESCAPE))
 	    {
 		dead_key = 0;
-		MyTranslateMessage(&msg);
+		TranslateMessage(&msg);
 		return;
 	    }
 	    // In modes where we are not typing, dead keys should behave
@@ -2069,10 +2044,10 @@
 		    add_to_input_buf(string, 1);
 		}
 		else
-		    MyTranslateMessage(&msg);
+		    TranslateMessage(&msg);
 	    }
 	    else
-		MyTranslateMessage(&msg);
+		TranslateMessage(&msg);
 	}
     }
 #ifdef FEAT_MBYTE_IME
@@ -2080,20 +2055,7 @@
 	_OnImeNotify(msg.hwnd, (DWORD)msg.wParam, (DWORD)msg.lParam);
     else if (msg.message == WM_KEYUP && im_get_status())
 	// added for non-MS IME (Yasuhiro Matsumoto)
-	MyTranslateMessage(&msg);
-#endif
-#if !defined(FEAT_MBYTE_IME) && defined(GLOBAL_IME)
-// GIME_TEST
-    else if (msg.message == WM_IME_STARTCOMPOSITION)
-    {
-	POINT point;
-
-	global_ime_set_font(&norm_logfont);
-	point.x = FILL_X(gui.col);
-	point.y = FILL_Y(gui.row);
-	MapWindowPoints(s_textArea, s_hwnd, &point, 1);
-	global_ime_set_position(&point);
-    }
+	TranslateMessage(&msg);
 #endif
 
 #ifdef FEAT_MENU
@@ -2947,7 +2909,7 @@
 {
     gui_focus_change(TRUE);
     s_getting_focus = TRUE;
-    (void)MyWindowProc(hwnd, WM_SETFOCUS, (WPARAM)hwndOldFocus, 0);
+    (void)DefWindowProcW(hwnd, WM_SETFOCUS, (WPARAM)hwndOldFocus, 0);
 }
 
     static void
@@ -2957,7 +2919,7 @@
 {
     gui_focus_change(FALSE);
     s_getting_focus = FALSE;
-    (void)MyWindowProc(hwnd, WM_KILLFOCUS, (WPARAM)hwndNewFocus, 0);
+    (void)DefWindowProcW(hwnd, WM_KILLFOCUS, (WPARAM)hwndNewFocus, 0);
 }
 
 /*
@@ -2971,7 +2933,7 @@
 {
     // we call gui_focus_change() in _OnSetFocus()
     // gui_focus_change((int)fActivate);
-    return MyWindowProc(hwnd, WM_ACTIVATEAPP, fActivate, (DWORD)dwThreadId);
+    return DefWindowProcW(hwnd, WM_ACTIVATEAPP, fActivate, (DWORD)dwThreadId);
 }
 
     void
@@ -3244,10 +3206,6 @@
 	destroying = TRUE;	// ignore WM_DESTROY message now
 	DestroyWindow(s_hwnd);
     }
-
-#ifdef GLOBAL_IME
-    global_ime_end();
-#endif
 }
 
     static char_u *
@@ -3399,13 +3357,9 @@
 
     if (font_name == NULL)
 	font_name = (char_u *)lf.lfFaceName;
-#if defined(FEAT_MBYTE_IME) || defined(GLOBAL_IME)
+#ifdef FEAT_MBYTE_IME
     norm_logfont = lf;
-#endif
-#ifdef FEAT_MBYTE_IME
     sub_logfont = lf;
-#endif
-#ifdef FEAT_MBYTE_IME
     if (!s_in_dpichanged)
 	update_im_font();
 #endif
@@ -4550,7 +4504,7 @@
 	netbeans_frame_moved(x, y);
     }
     // Allow to send WM_SIZE and WM_MOVE
-    FORWARD_WM_WINDOWPOSCHANGED(hwnd, lpwpos, MyWindowProc);
+    FORWARD_WM_WINDOWPOSCHANGED(hwnd, lpwpos, DefWindowProcW);
 }
 #endif
 
@@ -4716,7 +4670,7 @@
 		    return 0L;
 		}
 	    }
-	    return MyWindowProc(hwnd, uMsg, wParam, lParam);
+	    return DefWindowProcW(hwnd, uMsg, wParam, lParam);
 	}
 	case WM_LBUTTONDBLCLK:
 	{
@@ -4733,7 +4687,7 @@
 		if (pt.y < rect.top)
 		    send_tabline_menu_event(0, TABLINE_MENU_NEW);
 	    }
-	    return MyWindowProc(hwnd, uMsg, wParam, lParam);
+	    return DefWindowProcW(hwnd, uMsg, wParam, lParam);
 	}
 #endif
 
@@ -4773,7 +4727,7 @@
 	}
 #ifdef FEAT_MENU
 	else
-	    return MyWindowProc(hwnd, uMsg, wParam, lParam);
+	    return DefWindowProcW(hwnd, uMsg, wParam, lParam);
 #endif
 
     case WM_SYSKEYUP:
@@ -4782,7 +4736,7 @@
 	// that.  But that caused problems when menu is disabled and using
 	// Alt-Tab-Esc: get into a strange state where no mouse-moved events
 	// are received, mouse pointer remains hidden.
-	return MyWindowProc(hwnd, uMsg, wParam, lParam);
+	return DefWindowProcW(hwnd, uMsg, wParam, lParam);
 #else
 	return 0L;
 #endif
@@ -4923,7 +4877,7 @@
 # ifdef FEAT_GUI_TABLINE
 		if (gui_mch_showing_tabline()
 				  && ((LPNMHDR)lParam)->hwndFrom == s_tabhwnd)
-		    return MyWindowProc(hwnd, uMsg, wParam, lParam);
+		    return DefWindowProcW(hwnd, uMsg, wParam, lParam);
 # endif
 		break;
 	}
@@ -4970,7 +4924,7 @@
 	    int		x, y;
 	    int		xPos = GET_X_LPARAM(lParam);
 
-	    result = MyWindowProc(hwnd, uMsg, wParam, lParam);
+	    result = DefWindowProcW(hwnd, uMsg, wParam, lParam);
 	    if (result == HTCLIENT)
 	    {
 #ifdef FEAT_GUI_TABLINE
@@ -5002,12 +4956,12 @@
 #ifdef FEAT_MBYTE_IME
     case WM_IME_NOTIFY:
 	if (!_OnImeNotify(hwnd, (DWORD)wParam, (DWORD)lParam))
-	    return MyWindowProc(hwnd, uMsg, wParam, lParam);
+	    return DefWindowProcW(hwnd, uMsg, wParam, lParam);
 	return 1L;
 
     case WM_IME_COMPOSITION:
 	if (!_OnImeComposition(hwnd, wParam, lParam))
-	    return MyWindowProc(hwnd, uMsg, wParam, lParam);
+	    return DefWindowProcW(hwnd, uMsg, wParam, lParam);
 	return 1L;
 #endif
     case WM_DPICHANGED:
@@ -5019,10 +4973,10 @@
 	if (uMsg == s_findrep_msg && s_findrep_msg != 0)
 	    _OnFindRepl();
 #endif
-	return MyWindowProc(hwnd, uMsg, wParam, lParam);
+	return DefWindowProcW(hwnd, uMsg, wParam, lParam);
     }
 
-    return DefWindowProc(hwnd, uMsg, wParam, lParam);
+    return DefWindowProcW(hwnd, uMsg, wParam, lParam);
 }
 
 /*
@@ -5366,9 +5320,6 @@
     const WCHAR szVimWndClassW[] = VIM_CLASSW;
     const WCHAR szTextAreaClassW[] = L"VimTextArea";
     WNDCLASSW wndclassw;
-#ifdef GLOBAL_IME
-    ATOM	atom;
-#endif
 
     // Return here if the window was already opened (happens when
     // gui_mch_dialog() is called early).
@@ -5412,11 +5363,7 @@
 	wndclassw.lpszMenuName = NULL;
 	wndclassw.lpszClassName = szVimWndClassW;
 
-	if ((
-#ifdef GLOBAL_IME
-		    atom =
-#endif
-		    RegisterClassW(&wndclassw)) == 0)
+	if (RegisterClassW(&wndclassw) == 0)
 	    return FAIL;
     }
 
@@ -5489,9 +5436,6 @@
 	//TRACE("System DPI: %d, DPI: %d", pGetDpiForSystem(), s_dpi);
     }
 
-#ifdef GLOBAL_IME
-    global_ime_init(atom, s_hwnd);
-#endif
 #if defined(FEAT_MBYTE_IME) && defined(DYNAMIC_IME)
     dyn_imm_load();
 #endif
@@ -6062,42 +6006,6 @@
 
 #endif // FEAT_MBYTE_IME
 
-#if !defined(FEAT_MBYTE_IME) && defined(GLOBAL_IME)
-// Win32 with GLOBAL IME
-
-/*
- * Notify cursor position to IM.
- */
-    void
-im_set_position(int row, int col)
-{
-    // Win32 with GLOBAL IME
-    POINT p;
-
-    p.x = FILL_X(col);
-    p.y = FILL_Y(row);
-    MapWindowPoints(s_textArea, s_hwnd, &p, 1);
-    global_ime_set_position(&p);
-}
-
-/*
- * Set IM status on ("active" is TRUE) or off ("active" is FALSE).
- */
-    void
-im_set_active(int active)
-{
-    global_ime_set_status(active);
-}
-
-/*
- * Get IM status.  When IM is on, return not 0.  Else return 0.
- */
-    int
-im_get_status(void)
-{
-    return global_ime_get_status();
-}
-#endif
 
 /*
  * Convert latin9 text "text[len]" to ucs-2 in "unicodebuf".
diff --git a/src/version.c b/src/version.c
index ef0b3b3..54a9ebe 100644
--- a/src/version.c
+++ b/src/version.c
@@ -751,6 +751,8 @@
 static int included_patches[] =
 {   /* Add new patch number below this line */
 /**/
+    4153,
+/**/
     4152,
 /**/
     4151,
diff --git a/src/vim.h b/src/vim.h
index cb8af5d..357873c 100644
--- a/src/vim.h
+++ b/src/vim.h
@@ -2252,17 +2252,15 @@
 #endif
 
 # if defined(FEAT_EVAL) \
-	&& (!defined(FEAT_GUI_MSWIN) \
-	     || !(defined(FEAT_MBYTE_IME) || defined(GLOBAL_IME)))
+	&& (!defined(FEAT_GUI_MSWIN) || !defined(FEAT_MBYTE_IME))
 // Whether IME is supported by im_get_status() defined in mbyte.c.
-// For Win32 GUI it's in gui_w32.c when FEAT_MBYTE_IME or GLOBAL_IME is defined.
+// For Win32 GUI it's in gui_w32.c when FEAT_MBYTE_IME is defined.
 # define IME_WITHOUT_XIM
 #endif
 
 #if defined(FEAT_XIM) \
 	|| defined(IME_WITHOUT_XIM) \
-	|| (defined(FEAT_GUI_MSWIN) \
-	    && (defined(FEAT_MBYTE_IME) || defined(GLOBAL_IME)))
+	|| (defined(FEAT_GUI_MSWIN) && defined(FEAT_MBYTE_IME))
 // im_set_active() is available
 # define HAVE_INPUT_METHOD
 #endif
