updated for version 7.3.221
Problem:    Text from the clipboard is sometimes handled as linewise, but not
            consistently.
Solution:   Assume the text is linewise when it ends in a CR or NL.
diff --git a/src/gui_gtk_x11.c b/src/gui_gtk_x11.c
index 0454afb..77be976 100644
--- a/src/gui_gtk_x11.c
+++ b/src/gui_gtk_x11.c
@@ -1173,7 +1173,7 @@
     char_u	    *tmpbuf = NULL;
     guchar	    *tmpbuf_utf8 = NULL;
     int		    len;
-    int		    motion_type;
+    int		    motion_type = MAUTO;
 
     if (data->selection == clip_plus.gtk_sel_atom)
 	cbd = &clip_plus;
@@ -1182,7 +1182,6 @@
 
     text = (char_u *)data->data;
     len  = data->length;
-    motion_type = MCHAR;
 
     if (text == NULL || len <= 0)
     {
diff --git a/src/gui_mac.c b/src/gui_mac.c
index 2c33562..0a8b0bc 100644
--- a/src/gui_mac.c
+++ b/src/gui_mac.c
@@ -4671,7 +4671,7 @@
     if (flavor)
 	type = **textOfClip;
     else
-	type = (strchr(*textOfClip, '\r') != NULL) ? MLINE : MCHAR;
+	type = MAUTO;
 
     tempclip = lalloc(scrapSize + 1, TRUE);
     mch_memmove(tempclip, *textOfClip + flavor, scrapSize);
diff --git a/src/ops.c b/src/ops.c
index c41f844..8c23522 100644
--- a/src/ops.c
+++ b/src/ops.c
@@ -5733,7 +5733,9 @@
     }
 }
 
-/* Convert from the GUI selection string into the '*'/'+' register */
+/*
+ * Convert from the GUI selection string into the '*'/'+' register.
+ */
     void
 clip_yank_selection(type, str, len, cbd)
     int		type;
@@ -6090,9 +6092,6 @@
     if (yank_type == MBLOCK)
 	yank_type = MAUTO;
 #endif
-    if (yank_type == MAUTO)
-	yank_type = ((len > 0 && (str[len - 1] == '\n' || str[len - 1] == '\r'))
-							     ? MLINE : MCHAR);
     str_to_reg(y_current, yank_type, str, len, block_len);
 
 # ifdef FEAT_CLIPBOARD
@@ -6113,13 +6112,14 @@
  * is appended.
  */
     static void
-str_to_reg(y_ptr, type, str, len, blocklen)
+str_to_reg(y_ptr, yank_type, str, len, blocklen)
     struct yankreg	*y_ptr;		/* pointer to yank register */
-    int			type;		/* MCHAR, MLINE or MBLOCK */
+    int			yank_type;	/* MCHAR, MLINE, MBLOCK, MAUTO */
     char_u		*str;		/* string to put in register */
     long		len;		/* length of string */
     long		blocklen;	/* width of Visual block */
 {
+    int		type;			/* MCHAR, MLINE or MBLOCK */
     int		lnum;
     long	start;
     long	i;
@@ -6136,6 +6136,12 @@
     if (y_ptr->y_array == NULL)		/* NULL means empty register */
 	y_ptr->y_size = 0;
 
+    if (yank_type == MAUTO)
+	type = ((len > 0 && (str[len - 1] == NL || str[len - 1] == CAR))
+							     ? MLINE : MCHAR);
+    else
+	type = yank_type;
+
     /*
      * Count the number of lines within the string
      */
diff --git a/src/os_msdos.c b/src/os_msdos.c
index 1b52d72..3449d23 100644
--- a/src/os_msdos.c
+++ b/src/os_msdos.c
@@ -2232,7 +2232,7 @@
     void
 clip_mch_request_selection(VimClipboard *cbd)
 {
-    int		type = MCHAR;
+    int		type = MAUTO;
     char_u	*pAllocated = NULL;
     char_u	*pClipText = NULL;
     int		clip_data_format = 0;
@@ -2280,14 +2280,12 @@
 	{
 	    clip_data_format = CF_TEXT;
 	    pClipText = pAllocated;
-	    type = (vim_strchr((char*)pClipText, '\r') != NULL) ? MLINE : MCHAR;
 	}
 
 	else if ((pAllocated = Win16GetClipboardData(CF_OEMTEXT)) != NULL)
 	{
 	    clip_data_format = CF_OEMTEXT;
 	    pClipText = pAllocated;
-	    type = (vim_strchr((char*)pClipText, '\r') != NULL) ? MLINE : MCHAR;
 	}
 
 	/* Did we get anything? */
diff --git a/src/os_mswin.c b/src/os_mswin.c
index 8be2d40..1a6ccb5 100644
--- a/src/os_mswin.c
+++ b/src/os_mswin.c
@@ -1410,9 +1410,9 @@
     {
 	char_u *temp_clipboard;
 
-	/* If the type is not known guess it. */
+	/* If the type is not known detect it. */
 	if (metadata.type == -1)
-	    metadata.type = (vim_strchr(str, '\n') == NULL) ? MCHAR : MLINE;
+	    metadata.type = MAUTO;
 
 	/* Translate <CR><NL> into <NL>. */
 	temp_clipboard = crnl_to_nl(str, &str_size);
diff --git a/src/os_qnx.c b/src/os_qnx.c
index 1a7250e..84b6a1c 100644
--- a/src/os_qnx.c
+++ b/src/os_qnx.c
@@ -93,7 +93,7 @@
 	    clip_length  = clip_header->length - 1;
 
 	    if( clip_text != NULL && is_type_set == FALSE )
-		type = (strchr( clip_text, '\r' ) != NULL) ? MLINE : MCHAR;
+		type = MAUTO;
 	}
 
 	if( (clip_text != NULL) && (clip_length > 0) )
diff --git a/src/ui.c b/src/ui.c
index 9d940b1..82d83d3 100644
--- a/src/ui.c
+++ b/src/ui.c
@@ -1609,7 +1609,7 @@
 
 #if defined(FEAT_HANGULIN) || defined(PROTO)
     void
-push_raw_key (s, len)
+push_raw_key(s, len)
     char_u  *s;
     int	    len;
 {
@@ -2016,7 +2016,7 @@
     long_u	*length;
     int		*format;
 {
-    int		motion_type;
+    int		motion_type = MAUTO;
     long_u	len;
     char_u	*p;
     char	**text_list = NULL;
@@ -2036,7 +2036,6 @@
 	*(int *)success = FALSE;
 	return;
     }
-    motion_type = MCHAR;
     p = (char_u *)value;
     len = *length;
     if (*type == vim_atom)
diff --git a/src/version.c b/src/version.c
index 7d75de8..9832bef 100644
--- a/src/version.c
+++ b/src/version.c
@@ -710,6 +710,8 @@
 static int included_patches[] =
 {   /* Add new patch number below this line */
 /**/
+    221,
+/**/
     220,
 /**/
     219,