diff --git a/runtime/doc/map.txt b/runtime/doc/map.txt
index 131e1bd..87cdf1d 100644
--- a/runtime/doc/map.txt
+++ b/runtime/doc/map.txt
@@ -486,9 +486,9 @@ scenario: >
 	:imap <M-C> foo
 	:set encoding=utf-8
 The mapping for <M-C> is defined with the latin1 encoding, resulting in a 0xc3
-byte.  If you type the character ? (0xe1 <M-a>) in UTF-8 encoding this is the
+byte.  If you type the character á (0xe1 <M-a>) in UTF-8 encoding this is the
 two bytes 0xc3 0xa1.  You don't want the 0xc3 byte to be mapped then,
-otherwise it would be impossible to type the ? character.
+otherwise it would be impossible to type the á character.
 
 					*<Leader>* *mapleader*
 To define a mapping which uses the "mapleader" variable, the special string
@@ -840,7 +840,21 @@ Example: >
    :ab hh	hello
 <	    "hh<Space>" is expanded to "hello<Space>"
 	    "hh<C-]>" is expanded to "hello"
-
+						*<AbbrExpand>*
+Also there is a pseudo key <AbbrExpand>.  All keys other than <AbbrExpand>
+don't expand abbreviations if they come from key mappings which cannot be
+remapped (|:noremap| and others).  But <AbbrExpand> does expand an
+abbreviation even if it comes from such key mappings.  For exmaple, the
+following key mapping will insert <CR> regardless of the popup menu is
+appeared or not, but then, <CR> won't expand abbreviations.  <AbbrExpand> is
+useful for such case: >
+
+	" This <CR> doesn't expand abbreviations.
+	ino <expr> <CR> pumvisible() ? "\<C-Y>\<CR>" : "\<CR>"
+
+	" This <CR> expand abbreviations.
+	ino <expr> <CR> pumvisible() ? "\<C-Y>\<CR>" : "\<AbbrExpand>\<CR>"
+<
 The characters before the cursor must match the abbreviation.  Each type has
 an additional rule:
 
diff --git a/src/getchar.c b/src/getchar.c
index ec5ae87..3983f7a 100644
--- a/src/getchar.c
+++ b/src/getchar.c
@@ -4257,8 +4257,8 @@ check_abbr(c, ptr, col, mincol)
 
     if (typebuf.tb_no_abbr_cnt)	/* abbrev. are not recursive */
 	return FALSE;
-    if ((KeyNoremap & (RM_NONE|RM_SCRIPT)) != 0)
-	/* no remapping implies no abbreviation */
+    if (((KeyNoremap & (RM_NONE|RM_SCRIPT)) != 0) && (c != K_ABBREXPAND))
+	/* no remapping implies no abbreviation except <AbbrExpand> */
 	return FALSE;
 
     /*
@@ -4359,7 +4359,7 @@ check_abbr(c, ptr, col, mincol)
 	     */
 	    j = 0;
 					/* special key code, split up */
-	    if (c != Ctrl_RSB)
+	    if ((c != Ctrl_RSB) && (c != K_ABBREXPAND))
 	    {
 		if (IS_SPECIAL(c) || c == K_SPECIAL)
 		{
diff --git a/src/keymap.h b/src/keymap.h
index 39837e5..0758dcb 100644
--- a/src/keymap.h
+++ b/src/keymap.h
@@ -256,6 +256,7 @@ enum key_extra
     , KE_NOP		/* doesn't do something */
     , KE_FOCUSGAINED	/* focus gained */
     , KE_FOCUSLOST	/* focus lost */
+    , KE_ABBREXPAND	/* expand abbreviation */
 };
 
 /*
@@ -452,6 +453,8 @@ enum key_extra
 
 #define K_CURSORHOLD	TERMCAP2KEY(KS_EXTRA, KE_CURSORHOLD)
 
+#define K_ABBREXPAND	TERMCAP2KEY(KS_EXTRA, KE_ABBREXPAND)
+
 /* Bits for modifier mask */
 /* 0x01 cannot be used, because the modifier must be 0x02 or higher */
 #define MOD_MASK_SHIFT	    0x02
diff --git a/src/misc2.c b/src/misc2.c
index 04f038b..53cc239 100644
--- a/src/misc2.c
+++ b/src/misc2.c
@@ -2272,6 +2272,7 @@ static struct key_name_entry
     {K_SNR,		(char_u *)"SNR"},
 #endif
     {K_PLUG,		(char_u *)"Plug"},
+    {K_ABBREXPAND,	(char_u *)"AbbrExpand"},
     {0,			NULL}
 };
 
