diff --git a/src/Make_all.mak b/src/Make_all.mak
index 466f17e..4aa30b8 100644
--- a/src/Make_all.mak
+++ b/src/Make_all.mak
@@ -186,6 +186,7 @@
 	test_terminal_fail \
 	test_textformat \
 	test_textobjects \
+	test_textprop \
 	test_timers \
 	test_true_false \
 	test_undo \
diff --git a/src/Make_cyg_ming.mak b/src/Make_cyg_ming.mak
index 1f62d86..79bff50 100644
--- a/src/Make_cyg_ming.mak
+++ b/src/Make_cyg_ming.mak
@@ -751,6 +751,7 @@
 	$(OUTDIR)/syntax.o \
 	$(OUTDIR)/tag.o \
 	$(OUTDIR)/term.o \
+	$(OUTDIR)/textprop.o \
 	$(OUTDIR)/ui.o \
 	$(OUTDIR)/undo.o \
 	$(OUTDIR)/userfunc.o \
@@ -1090,6 +1091,9 @@
 $(OUTDIR)/terminal.o:	terminal.c $(INCL) $(TERM_DEPS)
 	$(CC) -c $(CFLAGS) terminal.c -o $(OUTDIR)/terminal.o
 
+$(OUTDIR)/textprop.o:	textprop.c $(INCL)
+	$(CC) -c $(CFLAGS) textprop.c -o $(OUTDIR)/textprop.o
+
 
 CCCTERM = $(CC) -c $(CFLAGS) -Ilibvterm/include -DINLINE="" \
 	  -DVSNPRINTF=vim_vsnprintf \
diff --git a/src/Make_mvc.mak b/src/Make_mvc.mak
index e281c89..a35708d 100644
--- a/src/Make_mvc.mak
+++ b/src/Make_mvc.mak
@@ -754,6 +754,7 @@
 	$(OUTDIR)\syntax.obj \
 	$(OUTDIR)\tag.obj \
 	$(OUTDIR)\term.obj \
+	$(OUTDIR)\textprop.obj \
 	$(OUTDIR)\ui.obj \
 	$(OUTDIR)\undo.obj \
 	$(OUTDIR)\userfunc.obj \
@@ -1529,6 +1530,8 @@
 
 $(OUTDIR)/term.obj:	$(OUTDIR) term.c  $(INCL)
 
+$(OUTDIR)/textprop.obj:	$(OUTDIR) textprop.c  $(INCL)
+
 $(OUTDIR)/ui.obj:	$(OUTDIR) ui.c  $(INCL)
 
 $(OUTDIR)/undo.obj:	$(OUTDIR) undo.c  $(INCL)
@@ -1667,6 +1670,7 @@
 	proto/syntax.pro \
 	proto/tag.pro \
 	proto/term.pro \
+	proto/textprop.pro \
 	proto/ui.pro \
 	proto/undo.pro \
 	proto/userfunc.pro \
diff --git a/src/Makefile b/src/Makefile
index ad0b718..aca1236 100644
--- a/src/Makefile
+++ b/src/Makefile
@@ -1577,8 +1577,6 @@
 #	     TAGS_INCL: include files used for make tags
 #	       ALL_SRC: source files used for make depend and make lint
 
-TAGS_INCL = *.h
-
 BASIC_SRC = \
 	arabic.c \
 	beval.c \
@@ -1636,6 +1634,7 @@
 	tag.c \
 	term.c \
 	terminal.c \
+	textprop.c \
 	ui.c \
 	undo.c \
 	userfunc.c \
@@ -1657,7 +1656,8 @@
 	$(WORKSHOP_SRC) \
 	$(WSDEBUG_SRC)
 
-TAGS_SRC = *.c *.cpp if_perl.xs
+TAGS_SRC = *.c *.cpp $(PERL_SRC) $(TERM_SRC) $(XDIFF_SRC)
+TAGS_INCL = *.h $(TERM_DEPS) $(XDIFF_INCL)
 
 EXTRA_SRC = hangulin.c if_lua.c if_mzsch.c auto/if_perl.c if_perlsfio.c \
 	    if_python.c if_python3.c if_tcl.c if_ruby.c \
@@ -1747,6 +1747,7 @@
 	objects/tag.o \
 	objects/term.o \
 	objects/terminal.o \
+	objects/textprop.o \
 	objects/ui.o \
 	objects/undo.o \
 	objects/userfunc.o \
@@ -1881,6 +1882,7 @@
 	term.pro \
 	terminal.pro \
 	termlib.pro \
+	textprop.pro \
 	ui.pro \
 	undo.pro \
 	userfunc.pro \
@@ -2092,7 +2094,7 @@
 #	Motif and Athena GUI
 # You can ignore error messages for missing files.
 tags TAGS: notags
-	$(TAGPRG) $(TAGS_SRC) $(TAGS_INCL) $(TERM_SRC) $(TERM_DEPS)
+	$(TAGPRG) $(TAGS_SRC) $(TAGS_INCL)
 
 # Make a highlight file for types.  Requires Exuberant ctags and awk
 types: types.vim
@@ -3211,6 +3213,9 @@
 objects/terminal.o: terminal.c $(TERM_DEPS)
 	$(CCC) -o $@ terminal.c
 
+objects/textprop.o: textprop.c
+	$(CCC) -o $@ textprop.c
+
 objects/ui.o: ui.c
 	$(CCC) -o $@ ui.c
 
@@ -3602,6 +3607,10 @@
  proto/gui_beval.pro structs.h regexp.h gui.h alloc.h ex_cmds.h spell.h \
  proto.h globals.h farsi.h arabic.h libvterm/include/vterm.h \
  libvterm/include/vterm_keycodes.h
+objects/textprop.o: textprop.c vim.h protodef.h auto/config.h feature.h os_unix.h \
+ auto/osdef.h ascii.h keymap.h term.h macros.h option.h beval.h \
+ proto/gui_beval.pro structs.h regexp.h gui.h alloc.h ex_cmds.h spell.h \
+ proto.h globals.h farsi.h arabic.h
 objects/ui.o: ui.c vim.h protodef.h auto/config.h feature.h os_unix.h \
  auto/osdef.h ascii.h keymap.h term.h macros.h option.h beval.h \
  proto/gui_beval.pro structs.h regexp.h gui.h alloc.h ex_cmds.h spell.h \
diff --git a/src/buffer.c b/src/buffer.c
index 8235a4f..bb94069 100644
--- a/src/buffer.c
+++ b/src/buffer.c
@@ -823,6 +823,9 @@
 #ifdef FEAT_SYN_HL
     syntax_clear(&buf->b_s);	    /* reset syntax info */
 #endif
+#ifdef FEAT_TEXT_PROP
+    clear_buf_prop_types(buf);
+#endif
     buf->b_flags &= ~BF_READERR;    /* a read error is no longer relevant */
 }
 
diff --git a/src/edit.c b/src/edit.c
index 6b5bc0f..205dc65 100644
--- a/src/edit.c
+++ b/src/edit.c
@@ -10302,6 +10302,9 @@
 		if ((State & REPLACE_FLAG) && !(State & VREPLACE_FLAG))
 		    for (temp = i; --temp >= 0; )
 			replace_join(repl_off);
+#ifdef FEAT_TEXT_PROP
+		curbuf->b_ml.ml_line_len -= i;
+#endif
 	    }
 #ifdef FEAT_NETBEANS_INTG
 	    if (netbeans_active())
diff --git a/src/evalfunc.c b/src/evalfunc.c
index d3b2da7..6e68755 100644
--- a/src/evalfunc.c
+++ b/src/evalfunc.c
@@ -772,6 +772,17 @@
     {"prompt_setinterrupt", 2, 2, f_prompt_setinterrupt},
     {"prompt_setprompt", 2, 2, f_prompt_setprompt},
 #endif
+#ifdef FEAT_TEXT_PROP
+    {"prop_add",	3, 3, f_prop_add},
+    {"prop_clear",	1, 3, f_prop_clear},
+    {"prop_list",	1, 2, f_prop_list},
+    {"prop_remove",	2, 3, f_prop_remove},
+    {"prop_type_add",	2, 2, f_prop_type_add},
+    {"prop_type_change", 2, 2, f_prop_type_change},
+    {"prop_type_delete", 1, 2, f_prop_type_delete},
+    {"prop_type_get",	1, 2, f_prop_type_get},
+    {"prop_type_list",	0, 1, f_prop_type_list},
+#endif
     {"pumvisible",	0, 0, f_pumvisible},
 #ifdef FEAT_PYTHON3
     {"py3eval",		1, 1, f_py3eval},
@@ -6478,6 +6489,9 @@
 #ifdef FEAT_TEXTOBJ
 	"textobjects",
 #endif
+#ifdef FEAT_TEXT_PROP
+	"textprop",
+#endif
 #ifdef HAVE_TGETENT
 	"tgetent",
 #endif
diff --git a/src/ex_getln.c b/src/ex_getln.c
index bfda942..4ea8bfa 100644
--- a/src/ex_getln.c
+++ b/src/ex_getln.c
@@ -769,6 +769,21 @@
 		    stuffcharReadbuff(*c);
 		    *c = '\\';
 		}
+#ifdef FEAT_MBYTE
+		// add any composing characters
+		if (mb_char2len(*c) != mb_ptr2len(ml_get_cursor()))
+		{
+		    int save_c = *c;
+
+		    while (mb_char2len(*c) != mb_ptr2len(ml_get_cursor()))
+		    {
+			curwin->w_cursor.col += mb_char2len(*c);
+			*c = gchar_cursor();
+			stuffcharReadbuff(*c);
+		    }
+		    *c = save_c;
+		}
+#endif
 		return FAIL;
 	    }
 	}
diff --git a/src/feature.h b/src/feature.h
index 9e87345..9615a9f 100644
--- a/src/feature.h
+++ b/src/feature.h
@@ -502,6 +502,13 @@
 #endif
 
 /*
+ * +textprop		Text properties
+ */
+#if defined(FEAT_EVAL) && defined(FEAT_SYN_HL)
+# define FEAT_TEXT_PROP
+#endif
+
+/*
  * +spell		spell checking
  *
  * Disabled for EBCDIC: * Doesn't work (SIGSEGV).
diff --git a/src/memline.c b/src/memline.c
index 1d65a44..59e4502 100644
--- a/src/memline.c
+++ b/src/memline.c
@@ -2487,7 +2487,6 @@
 {
     bhdr_T	*hp;
     DATA_BL	*dp;
-    char_u	*ptr;
     static int	recursive = 0;
 
     if (lnum > buf->b_ml.ml_line_count)	/* invalid line number */
@@ -2518,6 +2517,10 @@
      */
     if (buf->b_ml.ml_line_lnum != lnum || mf_dont_release)
     {
+	unsigned    start, end;
+	colnr_T	    len;
+	int	    idx;
+
 	ml_flush_line(buf);
 
 	/*
@@ -2540,8 +2543,18 @@
 
 	dp = (DATA_BL *)(hp->bh_data);
 
-	ptr = (char_u *)dp + ((dp->db_index[lnum - buf->b_ml.ml_locked_low]) & DB_INDEX_MASK);
-	buf->b_ml.ml_line_ptr = ptr;
+	idx = lnum - buf->b_ml.ml_locked_low;
+	start = ((dp->db_index[idx]) & DB_INDEX_MASK);
+	// The text ends where the previous line starts.  The first line ends
+	// at the end of the block.
+	if (idx == 0)
+	    end = dp->db_txt_end;
+	else
+	    end = ((dp->db_index[idx - 1]) & DB_INDEX_MASK);
+	len = end - start;
+
+	buf->b_ml.ml_line_ptr = (char_u *)dp + start;
+	buf->b_ml.ml_line_len = len;
 	buf->b_ml.ml_line_lnum = lnum;
 	buf->b_ml.ml_flags &= ~ML_LINE_DIRTY;
     }
@@ -2614,20 +2627,21 @@
     static int
 ml_append_int(
     buf_T	*buf,
-    linenr_T	lnum,		/* append after this line (can be 0) */
-    char_u	*line,		/* text of the new line */
-    colnr_T	len,		/* length of line, including NUL, or 0 */
-    int		newfile,	/* flag, see above */
-    int		mark)		/* mark the new line */
+    linenr_T	lnum,		// append after this line (can be 0)
+    char_u	*line,		// text of the new line
+    colnr_T	len_arg,	// length of line, including NUL, or 0
+    int		newfile,	// flag, see above
+    int		mark)		// mark the new line
 {
+    colnr_T	len = len_arg;	// length of line, including NUL, or 0
     int		i;
-    int		line_count;	/* number of indexes in current block */
+    int		line_count;	// number of indexes in current block
     int		offset;
     int		from, to;
-    int		space_needed;	/* space needed for new line */
+    int		space_needed;	// space needed for new line
     int		page_size;
     int		page_count;
-    int		db_idx;		/* index for lnum in data block */
+    int		db_idx;		// index for lnum in data block
     bhdr_T	*hp;
     memfile_T	*mfp;
     DATA_BL	*dp;
@@ -2642,8 +2656,8 @@
 	lowest_marked = lnum + 1;
 
     if (len == 0)
-	len = (colnr_T)STRLEN(line) + 1;	/* space needed for the text */
-    space_needed = len + INDEX_SIZE;	/* space needed for text + index */
+	len = (colnr_T)STRLEN(line) + 1;	// space needed for the text
+    space_needed = len + INDEX_SIZE;	// space needed for text + index
 
     mfp = buf->b_ml.ml_mfp;
     page_size = mfp->mf_page_size;
@@ -2728,7 +2742,8 @@
 		dp->db_index[i + 1] = dp->db_index[i] - len;
 	    dp->db_index[db_idx + 1] = offset - len;
 	}
-	else				    /* add line at the end */
+	else
+	    // add line at the end (which is the start of the text)
 	    dp->db_index[db_idx + 1] = dp->db_txt_start;
 
 	/*
@@ -3128,6 +3143,19 @@
     int
 ml_replace(linenr_T lnum, char_u *line, int copy)
 {
+    colnr_T len = -1;
+
+    if (line != NULL)
+	len = STRLEN(line);
+    return ml_replace_len(lnum, line, len, copy);
+}
+
+    int
+ml_replace_len(linenr_T lnum, char_u *line_arg, colnr_T len_arg, int copy)
+{
+    char_u *line = line_arg;
+    colnr_T len = len_arg;
+
     if (line == NULL)		/* just checking... */
 	return FAIL;
 
@@ -3135,7 +3163,7 @@
     if (curbuf->b_ml.ml_mfp == NULL && open_buffer(FALSE, NULL, 0) == FAIL)
 	return FAIL;
 
-    if (copy && (line = vim_strsave(line)) == NULL) /* allocate memory */
+    if (copy && (line = vim_strnsave(line, len)) == NULL) /* allocate memory */
 	return FAIL;
 #ifdef FEAT_NETBEANS_INTG
     if (netbeans_active())
@@ -3144,11 +3172,48 @@
 	netbeans_inserted(curbuf, lnum, 0, line, (int)STRLEN(line));
     }
 #endif
-    if (curbuf->b_ml.ml_line_lnum != lnum)	    /* other line buffered */
-	ml_flush_line(curbuf);			    /* flush it */
-    else if (curbuf->b_ml.ml_flags & ML_LINE_DIRTY) /* same line allocated */
+    if (curbuf->b_ml.ml_line_lnum != lnum)
+    {
+	// another line is buffered, flush it
+	ml_flush_line(curbuf);
+
+#ifdef FEAT_TEXT_PROP
+	curbuf->b_ml.ml_flags &= ~ML_LINE_DIRTY;
+	if (has_any_text_properties(curbuf))
+	    // Need to fetch the old line to copy over any text properties.
+	    ml_get_buf(curbuf, lnum, TRUE);
+#endif
+    }
+
+#ifdef FEAT_TEXT_PROP
+    if (has_any_text_properties(curbuf))
+    {
+	size_t	oldtextlen = STRLEN(curbuf->b_ml.ml_line_ptr) + 1;
+
+	if (oldtextlen < (size_t)curbuf->b_ml.ml_line_len)
+	{
+	    char_u *newline;
+	    size_t textproplen = curbuf->b_ml.ml_line_len - oldtextlen;
+
+	    // Need to copy over text properties, stored after the text.
+	    newline = alloc(len + 1 + textproplen);
+	    if (newline != NULL)
+	    {
+		mch_memmove(newline, line, len + 1);
+		mch_memmove(newline + len + 1, curbuf->b_ml.ml_line_ptr + oldtextlen, textproplen);
+		vim_free(line);
+		line = newline;
+		len += textproplen;
+	    }
+	}
+    }
+#endif
+
+    if (curbuf->b_ml.ml_flags & ML_LINE_DIRTY) /* same line allocated */
 	vim_free(curbuf->b_ml.ml_line_ptr);	    /* free it */
+
     curbuf->b_ml.ml_line_ptr = line;
+    curbuf->b_ml.ml_line_len = len + 1;
     curbuf->b_ml.ml_line_lnum = lnum;
     curbuf->b_ml.ml_flags = (curbuf->b_ml.ml_flags | ML_LINE_DIRTY) & ~ML_EMPTY;
 
@@ -3490,7 +3555,7 @@
 		old_len = dp->db_txt_end - start;
 	    else		/* text of previous line follows */
 		old_len = (dp->db_index[idx - 1] & DB_INDEX_MASK) - start;
-	    new_len = (colnr_T)STRLEN(new_line) + 1;
+	    new_len = buf->b_ml.ml_line_len;
 	    extra = new_len - old_len;	    /* negative if lines gets smaller */
 
 	    /*
@@ -5009,8 +5074,7 @@
 	 */
 	buf->b_ml.ml_usedchunks = 1;
 	buf->b_ml.ml_chunksize[0].mlcs_numlines = 1;
-	buf->b_ml.ml_chunksize[0].mlcs_totalsize =
-				  (long)STRLEN(buf->b_ml.ml_line_ptr) + 1;
+	buf->b_ml.ml_chunksize[0].mlcs_totalsize = (long)buf->b_ml.ml_line_len;
 	return;
     }
 
diff --git a/src/misc1.c b/src/misc1.c
index f1f0074..40d6f93 100644
--- a/src/misc1.c
+++ b/src/misc1.c
@@ -2631,9 +2631,10 @@
 {
     char_u	*oldp, *newp;
     colnr_T	oldlen;
+    colnr_T	newlen;
     linenr_T	lnum = curwin->w_cursor.lnum;
     colnr_T	col = curwin->w_cursor.col;
-    int		was_alloced;
+    int		alloc_newp;
     long	movelen;
     int		fixpos = fixpos_arg;
 
@@ -2710,6 +2711,7 @@
 	count = oldlen - col;
 	movelen = 1;
     }
+    newlen = oldlen - count;
 
     /*
      * If the old line has been allocated the deletion can be done in the
@@ -2720,24 +2722,34 @@
      */
 #ifdef FEAT_NETBEANS_INTG
     if (netbeans_active())
-	was_alloced = FALSE;
+	alloc_newp = TRUE;
     else
 #endif
-	was_alloced = ml_line_alloced();    /* check if oldp was allocated */
-    if (was_alloced)
-	newp = oldp;			    /* use same allocated memory */
+	alloc_newp = !ml_line_alloced();    // check if oldp was allocated
+    if (!alloc_newp)
+	newp = oldp;			    // use same allocated memory
     else
-    {					    /* need to allocate a new line */
-	newp = alloc((unsigned)(oldlen + 1 - count));
+    {					    // need to allocate a new line
+	newp = alloc((unsigned)(newlen + 1));
 	if (newp == NULL)
 	    return FAIL;
 	mch_memmove(newp, oldp, (size_t)col);
     }
     mch_memmove(newp + col, oldp + col + count, (size_t)movelen);
-    if (!was_alloced)
+    if (alloc_newp)
 	ml_replace(lnum, newp, FALSE);
+#ifdef FEAT_TEXT_PROP
+    else
+    {
+	// Also move any following text properties.
+	if (oldlen + 1 < curbuf->b_ml.ml_line_len)
+	    mch_memmove(newp + newlen + 1, oldp + oldlen + 1,
+			       (size_t)curbuf->b_ml.ml_line_len - oldlen - 1);
+	curbuf->b_ml.ml_line_len -= count;
+    }
+#endif
 
-    /* mark the buffer as changed and prepare for displaying */
+    // mark the buffer as changed and prepare for displaying
     changed_bytes(lnum, curwin->w_cursor.col);
 
     return OK;
diff --git a/src/misc2.c b/src/misc2.c
index ce69597..87799b0 100644
--- a/src/misc2.c
+++ b/src/misc2.c
@@ -1191,6 +1191,9 @@
 # ifdef FEAT_CMDHIST
     init_history();
 # endif
+#ifdef FEAT_TEXT_PROP
+    clear_global_prop_types();
+#endif
 
 #ifdef FEAT_QUICKFIX
     {
diff --git a/src/proto.h b/src/proto.h
index 8570af9..92d9714 100644
--- a/src/proto.h
+++ b/src/proto.h
@@ -183,6 +183,9 @@
 # if defined(HAVE_TGETENT) && (defined(AMIGA) || defined(VMS))
 #  include "termlib.pro"
 # endif
+# ifdef FEAT_TEXT_PROP
+#  include "textprop.pro"
+# endif
 # include "ui.pro"
 # include "undo.pro"
 # include "userfunc.pro"
diff --git a/src/proto/memline.pro b/src/proto/memline.pro
index d18ede3..3fa11c7 100644
--- a/src/proto/memline.pro
+++ b/src/proto/memline.pro
@@ -24,6 +24,7 @@
 int ml_append(linenr_T lnum, char_u *line, colnr_T len, int newfile);
 int ml_append_buf(buf_T *buf, linenr_T lnum, char_u *line, colnr_T len, int newfile);
 int ml_replace(linenr_T lnum, char_u *line, int copy);
+int ml_replace_len(linenr_T lnum, char_u *line_arg, colnr_T len_arg, int copy);
 int ml_delete(linenr_T lnum, int message);
 void ml_setmarked(linenr_T lnum);
 linenr_T ml_firstmarked(void);
diff --git a/src/proto/textprop.pro b/src/proto/textprop.pro
new file mode 100644
index 0000000..62aef4f
--- /dev/null
+++ b/src/proto/textprop.pro
@@ -0,0 +1,17 @@
+/* textprop.c */
+void f_prop_add(typval_T *argvars, typval_T *rettv);
+int has_any_text_properties(buf_T *buf);
+int get_text_props(buf_T *buf, linenr_T lnum, char_u **props, int will_change);
+proptype_T *text_prop_type_by_id(buf_T *buf, int id);
+void f_prop_clear(typval_T *argvars, typval_T *rettv);
+void f_prop_list(typval_T *argvars, typval_T *rettv);
+void f_prop_remove(typval_T *argvars, typval_T *rettv);
+void prop_type_set(typval_T *argvars, int add);
+void f_prop_type_add(typval_T *argvars, typval_T *rettv);
+void f_prop_type_change(typval_T *argvars, typval_T *rettv);
+void f_prop_type_delete(typval_T *argvars, typval_T *rettv);
+void f_prop_type_get(typval_T *argvars, typval_T *rettv);
+void f_prop_type_list(typval_T *argvars, typval_T *rettv);
+void clear_global_prop_types(void);
+void clear_buf_prop_types(buf_T *buf);
+/* vim: set ft=c : */
diff --git a/src/screen.c b/src/screen.c
index 1cf90ee..4a61807 100644
--- a/src/screen.c
+++ b/src/screen.c
@@ -3128,6 +3128,15 @@
     int		draw_color_col = FALSE;	/* highlight colorcolumn */
     int		*color_cols = NULL;	/* pointer to according columns array */
 #endif
+#ifdef FEAT_TEXT_PROP
+    int		text_prop_count;
+    int		text_prop_next = 0;	// next text property to use
+    textprop_T	*text_props = NULL;
+    int		*text_prop_idxs = NULL;
+    int		text_props_active = 0;
+    proptype_T  *text_prop_type = NULL;
+    int		text_prop_attr = 0;
+#endif
 #ifdef FEAT_SPELL
     int		has_spell = FALSE;	/* this buffer has spell checking */
 # define SPWORDLEN 150
@@ -3144,7 +3153,7 @@
     static linenr_T capcol_lnum = 0;	/* line number where "cap_col" used */
     int		cur_checked_col = 0;	/* checked column for current line */
 #endif
-    int		extra_check = 0;	// has syntax or linebreak
+    int		extra_check = 0;	// has extra highlighting
 #ifdef FEAT_MBYTE
     int		multi_attr = 0;		/* attributes desired by multibyte */
     int		mb_l = 1;		/* multi-byte byte length */
@@ -3784,6 +3793,30 @@
     }
 #endif
 
+#ifdef FEAT_TEXT_PROP
+    {
+	char_u *prop_start;
+
+	text_prop_count = get_text_props(wp->w_buffer, lnum,
+							   &prop_start, FALSE);
+	if (text_prop_count > 0)
+	{
+	    // Make a copy of the properties, so that they are properly
+	    // aligned.
+	    text_props = (textprop_T *)alloc(
+					 text_prop_count * sizeof(textprop_T));
+	    if (text_props != NULL)
+		mch_memmove(text_props, prop_start,
+					 text_prop_count * sizeof(textprop_T));
+
+	    // Allocate an array for the indexes.
+	    text_prop_idxs = (int *)alloc(text_prop_count * sizeof(int));
+	    area_highlighting = TRUE;
+	    extra_check = TRUE;
+	}
+    }
+#endif
+
     off = (unsigned)(current_ScreenLine - ScreenLines);
     col = 0;
 #ifdef FEAT_RIGHTLEFT
@@ -4283,6 +4316,11 @@
 	    else
 	    {
 		attr_pri = FALSE;
+#ifdef FEAT_TEXT_PROP
+		if (text_prop_type != NULL)
+		    char_attr = text_prop_attr;
+		else
+#endif
 #ifdef FEAT_SYN_HL
 		if (has_syntax)
 		    char_attr = syntax_attr;
@@ -4663,6 +4701,66 @@
 		}
 #endif
 
+#ifdef FEAT_TEXT_PROP
+		if (text_props != NULL)
+		{
+		    int pi;
+
+		    // Check if any active property ends.
+		    for (pi = 0; pi < text_props_active; ++pi)
+		    {
+			int tpi = text_prop_idxs[pi];
+
+			if (col >= text_props[tpi].tp_col - 1
+						      + text_props[tpi].tp_len)
+			{
+			    if (pi + 1 < text_props_active)
+				mch_memmove(text_prop_idxs + pi,
+					    text_prop_idxs + pi + 1,
+					    sizeof(int)
+					     * (text_props_active - (pi + 1)));
+			    --text_props_active;
+			    --pi;
+			}
+		    }
+
+		    // Add any text property that starts in this column.
+		    while (text_prop_next < text_prop_count
+			       && col >= text_props[text_prop_next].tp_col - 1)
+			text_prop_idxs[text_props_active++] = text_prop_next++;
+
+		    text_prop_type = NULL;
+		    if (text_props_active > 0)
+		    {
+			int max_priority = INT_MIN;
+			int max_col = 0;
+
+			// Get the property type with the highest priority
+			// and/or starting last.
+			for (pi = 0; pi < text_props_active; ++pi)
+			{
+			    int		tpi = text_prop_idxs[pi];
+			    proptype_T  *pt;
+
+			    pt = text_prop_type_by_id(
+				    curwin->w_buffer, text_props[tpi].tp_type);
+			    if (pt != NULL
+				    && (pt->pt_priority > max_priority
+					|| (pt->pt_priority == max_priority
+					&& text_props[tpi].tp_col >= max_col)))
+			    {
+				text_prop_type = pt;
+				max_priority = pt->pt_priority;
+				max_col = text_props[tpi].tp_col;
+			    }
+			}
+			if (text_prop_type != NULL)
+			    text_prop_attr =
+					 syn_id2attr(text_prop_type->pt_hl_id);
+		    }
+		}
+#endif
+
 #ifdef FEAT_SPELL
 		/* Check spelling (unless at the end of the line).
 		 * Only do this when there is no syntax highlighting, the
@@ -6025,6 +6123,10 @@
 	cap_col = 0;
     }
 #endif
+#ifdef FEAT_TEXT_PROP
+    vim_free(text_props);
+    vim_free(text_prop_idxs);
+#endif
 
     vim_free(p_extra_free);
     return row;
diff --git a/src/structs.h b/src/structs.h
index cd9b5a5..6f50785 100644
--- a/src/structs.h
+++ b/src/structs.h
@@ -684,6 +684,7 @@
 
     linenr_T	ml_line_lnum;	/* line number of cached line, 0 if not valid */
     char_u	*ml_line_ptr;	/* pointer to cached line */
+    colnr_T	ml_line_len;	/* length of the cached line, including NUL */
 
     bhdr_T	*ml_locked;	/* block used by last ml_get */
     linenr_T	ml_locked_low;	/* first line in ml_locked */
@@ -696,6 +697,41 @@
 #endif
 } memline_T;
 
+
+/*
+ * Structure defining text properties.  These stick with the text.
+ * When stored in memline they are after the text, ml_line_len is larger than
+ * STRLEN(ml_line_ptr) + 1.
+ */
+typedef struct textprop_S
+{
+    colnr_T	tp_col;		// start column
+    colnr_T	tp_len;		// length in bytes
+    int		tp_id;		// identifier
+    int		tp_type;	// property type
+    int		tp_flags;	// TP_FLAG_ values
+} textprop_T;
+
+#define TP_FLAG_CONT_NEXT	1	// property continues in next line
+#define TP_FLAG_CONT_PREV	2	// property was continued from prev line
+
+/*
+ * Structure defining a property type.
+ */
+typedef struct proptype_S
+{
+    int		pt_id;		// value used for tp_id
+    int		pt_type;	// number used for tp_type
+    int		pt_hl_id;	// highlighting
+    int		pt_priority;	// priority
+    int		pt_flags;	// PT_FLAG_ values
+    char_u	pt_name[1];	// property type name, actually longer
+} proptype_T;
+
+#define PT_FLAG_INS_START_INCL	1	// insert at start included in property
+#define PT_FLAG_INS_END_INCL	2	// insert at end included in property
+
+
 #if defined(FEAT_SIGNS) || defined(PROTO)
 typedef struct signlist signlist_T;
 
@@ -2358,6 +2394,9 @@
     dictitem_T	b_bufvar;	/* variable for "b:" Dictionary */
     dict_T	*b_vars;	/* internal variables, local to buffer */
 #endif
+#ifdef FEAT_TEXT_PROP
+    hashtab_T	*b_proptypes;	/* text property types local to buffer */
+#endif
 
 #if defined(FEAT_BEVAL) && defined(FEAT_EVAL)
     char_u	*b_p_bexpr;	/* 'balloonexpr' local value */
diff --git a/src/testdir/Make_all.mak b/src/testdir/Make_all.mak
index 5b85156..941cbd3 100644
--- a/src/testdir/Make_all.mak
+++ b/src/testdir/Make_all.mak
@@ -177,6 +177,7 @@
 	    test_terminal_fail.res \
 	    test_textformat.res \
 	    test_textobjects.res \
+	    test_textprop.res \
 	    test_undo.res \
 	    test_user_func.res \
 	    test_usercommands.res \
diff --git a/src/testdir/test_textprop.vim b/src/testdir/test_textprop.vim
new file mode 100644
index 0000000..67038a2
--- /dev/null
+++ b/src/testdir/test_textprop.vim
@@ -0,0 +1,200 @@
+" Tests for defining text property types and adding text properties to the
+" buffer.
+
+if !has('textprop')
+  finish
+endif
+
+func Test_proptype_global()
+  call prop_type_add('comment', {'highlight': 'Directory', 'priority': 123, 'start_incl': 1, 'end_incl': 1})
+  let proptypes = prop_type_list()
+  call assert_equal(1, len(proptypes))
+  call assert_equal('comment', proptypes[0])
+
+  let proptype = prop_type_get('comment')
+  call assert_equal('Directory', proptype['highlight'])
+  call assert_equal(123, proptype['priority'])
+  call assert_equal(1, proptype['start_incl'])
+  call assert_equal(1, proptype['end_incl'])
+
+  call prop_type_delete('comment')
+  call assert_equal(0, len(prop_type_list()))
+
+  call prop_type_add('one', {})
+  call assert_equal(1, len(prop_type_list()))
+  let proptype = prop_type_get('one')
+  call assert_false(has_key(proptype, 'highlight'))
+  call assert_equal(0, proptype['priority'])
+  call assert_equal(0, proptype['start_incl'])
+  call assert_equal(0, proptype['end_incl'])
+
+  call prop_type_add('two', {})
+  call assert_equal(2, len(prop_type_list()))
+  call prop_type_delete('one')
+  call assert_equal(1, len(prop_type_list()))
+  call prop_type_delete('two')
+  call assert_equal(0, len(prop_type_list()))
+endfunc
+
+func Test_proptype_buf()
+  let bufnr = bufnr('')
+  call prop_type_add('comment', {'bufnr': bufnr, 'highlight': 'Directory', 'priority': 123, 'start_incl': 1, 'end_incl': 1})
+  let proptypes = prop_type_list({'bufnr': bufnr})
+  call assert_equal(1, len(proptypes))
+  call assert_equal('comment', proptypes[0])
+
+  let proptype = prop_type_get('comment', {'bufnr': bufnr})
+  call assert_equal('Directory', proptype['highlight'])
+  call assert_equal(123, proptype['priority'])
+  call assert_equal(1, proptype['start_incl'])
+  call assert_equal(1, proptype['end_incl'])
+
+  call prop_type_delete('comment', {'bufnr': bufnr})
+  call assert_equal(0, len(prop_type_list({'bufnr': bufnr})))
+
+  call prop_type_add('one', {'bufnr': bufnr})
+  let proptype = prop_type_get('one', {'bufnr': bufnr})
+  call assert_false(has_key(proptype, 'highlight'))
+  call assert_equal(0, proptype['priority'])
+  call assert_equal(0, proptype['start_incl'])
+  call assert_equal(0, proptype['end_incl'])
+
+  call prop_type_add('two', {'bufnr': bufnr})
+  call assert_equal(2, len(prop_type_list({'bufnr': bufnr})))
+  call prop_type_delete('one', {'bufnr': bufnr})
+  call assert_equal(1, len(prop_type_list({'bufnr': bufnr})))
+  call prop_type_delete('two', {'bufnr': bufnr})
+  call assert_equal(0, len(prop_type_list({'bufnr': bufnr})))
+endfunc
+
+func AddPropTypes()
+  call prop_type_add('one', {})
+  call prop_type_add('two', {})
+  call prop_type_add('three', {})
+  call prop_type_add('whole', {})
+endfunc
+
+func DeletePropTypes()
+  call prop_type_delete('one')
+  call prop_type_delete('two')
+  call prop_type_delete('three')
+  call prop_type_delete('whole')
+endfunc
+
+func SetupPropsInFirstLine()
+  call setline(1, 'one two three')
+  call prop_add(1, 1, {'length': 3, 'id': 11, 'type': 'one'})
+  call prop_add(1, 5, {'length': 3, 'id': 12, 'type': 'two'})
+  call prop_add(1, 8, {'length': 5, 'id': 13, 'type': 'three'})
+  call prop_add(1, 1, {'length': 13, 'id': 14, 'type': 'whole'})
+endfunc
+
+let s:expected_props = [{'col': 1, 'length': 13, 'id': 14, 'type': 'whole', 'start': 1, 'end': 1},
+      \ {'col': 1, 'length': 3, 'id': 11, 'type': 'one', 'start': 1, 'end': 1},
+      \ {'col': 5, 'length': 3, 'id': 12, 'type': 'two', 'start': 1, 'end': 1},
+      \ {'col': 8, 'length': 5, 'id': 13, 'type': 'three', 'start': 1, 'end': 1},
+      \ ]
+
+func Test_prop_add()
+  new
+  call AddPropTypes()
+  call SetupPropsInFirstLine()
+  call assert_equal(s:expected_props, prop_list(1))
+  call assert_fails("call prop_add(10, 1, {'length': 1, 'id': 14, 'type': 'whole'})", 'E966:')
+  call assert_fails("call prop_add(1, 22, {'length': 1, 'id': 14, 'type': 'whole'})", 'E964:')
+ 
+  " Insert a line above, text props must still be there.
+  call append(0, 'empty')
+  call assert_equal(s:expected_props, prop_list(2))
+  " Delete a line above, text props must still be there.
+  1del
+  call assert_equal(s:expected_props, prop_list(1))
+
+  call DeletePropTypes()
+  bwipe!
+endfunc
+
+func Test_prop_remove()
+  new
+  call AddPropTypes()
+  call SetupPropsInFirstLine()
+  let props = deepcopy(s:expected_props)
+  call assert_equal(props, prop_list(1))
+
+  " remove by id
+  call prop_remove({'id': 12}, 1)
+  unlet props[2]
+  call assert_equal(props, prop_list(1))
+
+  " remove by type
+  call prop_remove({'type': 'one'}, 1)
+  unlet props[1]
+  call assert_equal(props, prop_list(1))
+
+  call DeletePropTypes()
+  bwipe!
+endfunc
+
+func Test_prop_add_remove_buf()
+  new
+  let bufnr = bufnr('')
+  call AddPropTypes()
+  call setline(1, 'one two three')
+  wincmd w
+  call prop_add(1, 1, {'length': 3, 'id': 11, 'type': 'one', 'bufnr': bufnr})
+  call prop_add(1, 5, {'length': 3, 'id': 12, 'type': 'two', 'bufnr': bufnr})
+  call prop_add(1, 11, {'length': 3, 'id': 13, 'type': 'three', 'bufnr': bufnr})
+  
+  let props = [
+	\ {'col': 1, 'length': 3, 'id': 11, 'type': 'one', 'start': 1, 'end': 1},
+	\ {'col': 5, 'length': 3, 'id': 12, 'type': 'two', 'start': 1, 'end': 1},
+	\ {'col': 11, 'length': 3, 'id': 13, 'type': 'three', 'start': 1, 'end': 1},
+	\]
+  call assert_equal(props, prop_list(1, {'bufnr': bufnr}))
+ 
+  " remove by id
+  call prop_remove({'id': 12, 'bufnr': bufnr}, 1)
+  unlet props[1]
+  call assert_equal(props, prop_list(1, {'bufnr': bufnr}))
+
+  " remove by type
+  call prop_remove({'type': 'one', 'bufnr': bufnr}, 1)
+  unlet props[0]
+  call assert_equal(props, prop_list(1, {'bufnr': bufnr}))
+
+  call DeletePropTypes()
+  wincmd w
+  bwipe!
+endfunc
+
+
+func Test_prop_clear()
+  new
+  call AddPropTypes()
+  call SetupPropsInFirstLine()
+  call assert_equal(s:expected_props, prop_list(1))
+
+  call prop_clear(1)
+  call assert_equal([], prop_list(1))
+
+  call DeletePropTypes()
+  bwipe!
+endfunc
+
+func Test_prop_clear_buf()
+  new
+  call AddPropTypes()
+  call SetupPropsInFirstLine()
+  let bufnr = bufnr('')
+  wincmd w
+  call assert_equal(s:expected_props, prop_list(1, {'bufnr': bufnr}))
+
+  call prop_clear(1, 1, {'bufnr': bufnr})
+  call assert_equal([], prop_list(1, {'bufnr': bufnr}))
+
+  wincmd w
+  call DeletePropTypes()
+  bwipe!
+endfunc
+
+" TODO: screenshot test with highlighting
diff --git a/src/textprop.c b/src/textprop.c
new file mode 100644
index 0000000..fa28e80
--- /dev/null
+++ b/src/textprop.c
@@ -0,0 +1,869 @@
+/* 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.
+ * See README.txt for an overview of the Vim source code.
+ */
+
+/*
+ * Text properties implementation.
+ *
+ * Text properties are attached to the text.  They move with the text when
+ * text is inserted/deleted.
+ *
+ * Text properties have a user specified ID number, which can be unique.
+ * Text properties have a type, which can be used to specify highlighting.
+ *
+ * TODO:
+ * - Add an arrray for global_proptypes, to quickly lookup a proptype by ID
+ * - Add an arrray for b_proptypes, to quickly lookup a proptype by ID
+ * - adjust property column when text is inserted/deleted
+ * - support properties that continue over a line break
+ * - add mechanism to keep track of changed lines.
+ */
+
+#include "vim.h"
+
+#if defined(FEAT_TEXT_PROP) || defined(PROTO)
+
+/*
+ * In a hashtable item "hi_key" points to "pt_name" in a proptype_T.
+ * This avoids adding a pointer to the hashtable item.
+ * PT2HIKEY() converts a proptype pointer to a hashitem key pointer.
+ * HIKEY2PT() converts a hashitem key pointer to a proptype pointer.
+ * HI2PT() converts a hashitem pointer to a proptype pointer.
+ */
+#define PT2HIKEY(p)  ((p)->pt_name)
+#define HIKEY2PT(p)   ((proptype_T *)((p) - offsetof(proptype_T, pt_name)))
+#define HI2PT(hi)      HIKEY2PT((hi)->hi_key)
+
+// The global text property types.
+static hashtab_T *global_proptypes = NULL;
+
+// The last used text property type ID.
+static int proptype_id = 0;
+
+static char_u e_type_not_exist[] = N_("E971: Property type %s does not exist");
+static char_u e_invalid_col[] = N_("E964: Invalid column number: %ld");
+
+/*
+ * Find a property type by name, return the hashitem.
+ * Returns NULL if the item can't be found.
+ */
+    static hashitem_T *
+find_prop_hi(char_u *name, buf_T *buf)
+{
+    hashtab_T	*ht;
+    hashitem_T	*hi;
+
+    if (*name == NUL)
+	return NULL;
+    if (buf == NULL)
+	ht = global_proptypes;
+    else
+	ht = buf->b_proptypes;
+
+    if (ht == NULL)
+	return NULL;
+    hi = hash_find(ht, name);
+    if (HASHITEM_EMPTY(hi))
+	return NULL;
+    return hi;
+}
+
+/*
+ * Like find_prop_hi() but return the property type.
+ */
+    static proptype_T *
+find_prop(char_u *name, buf_T *buf)
+{
+    hashitem_T	*hi = find_prop_hi(name, buf);
+
+    if (hi == NULL)
+	return NULL;
+    return HI2PT(hi);
+}
+
+/*
+ * Lookup a property type by name.  First in "buf" and when not found in the
+ * global types.
+ * When not found gives an error message and returns NULL.
+ */
+    static proptype_T *
+lookup_prop_type(char_u *name, buf_T *buf)
+{
+    proptype_T *type = find_prop(name, buf);
+
+    if (type == NULL)
+	type = find_prop(name, NULL);
+    if (type == NULL)
+	EMSG2(_(e_type_not_exist), name);
+    return type;
+}
+
+/*
+ * Get an optional "bufnr" item from the dict in "arg".
+ * When the argument is not used or "bufnr" is not present then "buf" is
+ * unchanged.
+ * If "bufnr" is valid or not present return OK.
+ * When "arg" is not a dict or "bufnr" is invalide return FAIL.
+ */
+    static int
+get_bufnr_from_arg(typval_T *arg, buf_T **buf)
+{
+    dictitem_T	*di;
+
+    if (arg->v_type != VAR_DICT)
+    {
+	EMSG(_(e_dictreq));
+	return FAIL;
+    }
+    if (arg->vval.v_dict == NULL)
+	return OK;  // NULL dict is like an empty dict
+    di = dict_find(arg->vval.v_dict, (char_u *)"bufnr", -1);
+    if (di != NULL)
+    {
+	*buf = get_buf_tv(&di->di_tv, FALSE);
+	if (*buf == NULL)
+	    return FAIL;
+    }
+    return OK;
+}
+
+/*
+ * prop_add({lnum}, {col}, {props})
+ */
+    void
+f_prop_add(typval_T *argvars, typval_T *rettv UNUSED)
+{
+    linenr_T	lnum;
+    colnr_T	col;
+    dict_T	*dict;
+    colnr_T	length = 1;
+    char_u	*type_name;
+    proptype_T	*type;
+    buf_T	*buf = curbuf;
+    int		id = 0;
+    char_u	*newtext;
+    int		proplen;
+    size_t	textlen;
+    char_u	*props;
+    char_u	*newprops;
+    static textprop_T	tmp_prop; // static to get it aligned.
+    int		i;
+
+    lnum = get_tv_number(&argvars[0]);
+    col = get_tv_number(&argvars[1]);
+    if (col < 1)
+    {
+	EMSGN(_(e_invalid_col), (long)col);
+	return;
+    }
+    if (argvars[2].v_type != VAR_DICT)
+    {
+	EMSG(_(e_dictreq));
+	return;
+    }
+    dict = argvars[2].vval.v_dict;
+
+    if (dict == NULL || dict_find(dict, (char_u *)"type", -1) == NULL)
+    {
+	EMSG(_("E965: missing property type name"));
+	return;
+    }
+    type_name = get_dict_string(dict, (char_u *)"type", FALSE);
+
+    if (dict_find(dict, (char_u *)"end_lnum", -1) != NULL)
+    {
+	// TODO: handle end_lnum
+	EMSG("Sorry, end_lnum not supported yet");
+	return;
+    }
+
+    if (dict_find(dict, (char_u *)"length", -1) != NULL)
+	length = get_dict_number(dict, (char_u *)"length");
+    else if (dict_find(dict, (char_u *)"end_col", -1) != NULL)
+    {
+	length = get_dict_number(dict, (char_u *)"end_col") - col;
+	if (length <= 0)
+	{
+	    EMSG2(_(e_invargval), "end_col");
+	    return;
+	}
+    }
+
+    if (dict_find(dict, (char_u *)"id", -1) != NULL)
+	id = get_dict_number(dict, (char_u *)"id");
+
+    if (get_bufnr_from_arg(&argvars[2], &buf) == FAIL)
+	return;
+
+    type = lookup_prop_type(type_name, buf);
+    if (type == NULL)
+	return;
+
+    if (lnum < 1 || lnum > buf->b_ml.ml_line_count)
+    {
+	EMSGN(_("E966: Invalid line number: %ld"), (long)lnum);
+	return;
+    }
+
+    // Fetch the line to get the ml_line_len field updated.
+    proplen = get_text_props(buf, lnum, &props, TRUE);
+
+    if (col >= (colnr_T)STRLEN(buf->b_ml.ml_line_ptr))
+    {
+	EMSGN(_(e_invalid_col), (long)col);
+	return;
+    }
+
+    // Allocate the new line with space for the new proprety.
+    newtext = alloc(buf->b_ml.ml_line_len + sizeof(textprop_T));
+    if (newtext == NULL)
+	return;
+    // Copy the text, including terminating NUL.
+    textlen = buf->b_ml.ml_line_len - proplen * sizeof(textprop_T);
+    mch_memmove(newtext, buf->b_ml.ml_line_ptr, textlen);
+
+    // Find the index where to insert the new property.
+    // Since the text properties are not aligned properly when stored with the
+    // text, we need to copy them as bytes before using it as a struct.
+    for (i = 0; i < proplen; ++i)
+    {
+	mch_memmove(&tmp_prop, props + i * sizeof(proptype_T),
+							   sizeof(proptype_T));
+	if (tmp_prop.tp_col >= col)
+	    break;
+    }
+    newprops = newtext + textlen;
+    if (i > 0)
+	mch_memmove(newprops, props, sizeof(textprop_T) * i);
+
+    tmp_prop.tp_col = col;
+    tmp_prop.tp_len = length;
+    tmp_prop.tp_id = id;
+    tmp_prop.tp_type = type->pt_id;
+    tmp_prop.tp_flags = 0;
+    mch_memmove(newprops + i * sizeof(textprop_T), &tmp_prop,
+							   sizeof(textprop_T));
+
+    if (i < proplen)
+	mch_memmove(newprops + (i + 1) * sizeof(textprop_T),
+					props + i * sizeof(textprop_T),
+					sizeof(textprop_T) * (proplen - i));
+
+    if (buf->b_ml.ml_flags & ML_LINE_DIRTY)
+	vim_free(buf->b_ml.ml_line_ptr);
+    buf->b_ml.ml_line_ptr = newtext;
+    buf->b_ml.ml_line_len += sizeof(textprop_T);
+    buf->b_ml.ml_flags |= ML_LINE_DIRTY;
+
+    redraw_buf_later(buf, NOT_VALID);
+}
+
+/*
+ * Return TRUE if any text properties are defined globally or for buffer
+ * 'buf".
+ */
+    int
+has_any_text_properties(buf_T *buf)
+{
+    return buf->b_proptypes != NULL || global_proptypes != NULL;
+}
+
+/*
+ * Fetch the text properties for line "lnum" in buffer 'buf".
+ * Returns the number of text properties and, when non-zero, a pointer to the
+ * first one in "props" (note that it is not aligned, therefore the char_u
+ * pointer).
+ */
+    int
+get_text_props(buf_T *buf, linenr_T lnum, char_u **props, int will_change)
+{
+    char_u *text;
+    size_t textlen;
+    size_t proplen;
+
+    // Be quick when no text property types are defined.
+    if (!has_any_text_properties(buf))
+	return 0;
+
+    // Fetch the line to get the ml_line_len field updated.
+    text = ml_get_buf(buf, lnum, will_change);
+    textlen = STRLEN(text) + 1;
+    proplen = buf->b_ml.ml_line_len - textlen;
+    if (proplen % sizeof(textprop_T) != 0)
+    {
+	IEMSG(_("E967: text property info corrupted"));
+	return 0;
+    }
+    if (proplen > 0)
+	*props = text + textlen;
+    return proplen / sizeof(textprop_T);
+}
+
+    static proptype_T *
+find_type_by_id(hashtab_T *ht, int id)
+{
+    long	todo;
+    hashitem_T	*hi;
+
+    if (ht == NULL)
+	return NULL;
+
+    // TODO: Make this faster by keeping a list of types sorted on ID and use
+    // a binary search.
+
+    todo = (long)ht->ht_used;
+    for (hi = ht->ht_array; todo > 0; ++hi)
+    {
+	if (!HASHITEM_EMPTY(hi))
+	{
+	    proptype_T *prop = HI2PT(hi);
+
+	    if (prop->pt_id == id)
+		return prop;
+	    --todo;
+	}
+    }
+    return NULL;
+}
+
+/*
+ * Find a property type by ID in "buf" or globally.
+ * Returns NULL if not found.
+ */
+    proptype_T *
+text_prop_type_by_id(buf_T *buf, int id)
+{
+    proptype_T *type;
+
+    type = find_type_by_id(buf->b_proptypes, id);
+    if (type == NULL)
+	type = find_type_by_id(global_proptypes, id);
+    return type;
+}
+
+/*
+ * prop_clear({lnum} [, {lnum_end} [, {bufnr}]])
+ */
+    void
+f_prop_clear(typval_T *argvars, typval_T *rettv UNUSED)
+{
+    linenr_T start = get_tv_number(&argvars[0]);
+    linenr_T end = start;
+    linenr_T lnum;
+    buf_T    *buf = curbuf;
+
+    if (argvars[1].v_type != VAR_UNKNOWN)
+    {
+	end = get_tv_number(&argvars[1]);
+	if (argvars[2].v_type != VAR_UNKNOWN)
+	{
+	    if (get_bufnr_from_arg(&argvars[2], &buf) == FAIL)
+		return;
+	}
+    }
+    if (start < 1 || end < 1)
+    {
+	EMSG(_(e_invrange));
+	return;
+    }
+
+    for (lnum = start; lnum <= end; ++lnum)
+    {
+	char_u *text;
+	size_t len;
+
+	if (lnum > buf->b_ml.ml_line_count)
+	    break;
+	text = ml_get_buf(buf, lnum, FALSE);
+	len = STRLEN(text) + 1;
+	if ((size_t)buf->b_ml.ml_line_len > len)
+	{
+	    if (!(buf->b_ml.ml_flags & ML_LINE_DIRTY))
+	    {
+		char_u *newtext = vim_strsave(text);
+
+		// need to allocate the line now
+		if (newtext == NULL)
+		    return;
+		buf->b_ml.ml_line_ptr = newtext;
+		buf->b_ml.ml_flags |= ML_LINE_DIRTY;
+	    }
+	    buf->b_ml.ml_line_len = len;
+	}
+    }
+    redraw_buf_later(buf, NOT_VALID);
+}
+
+/*
+ * prop_list({lnum} [, {bufnr}])
+ */
+    void
+f_prop_list(typval_T *argvars, typval_T *rettv)
+{
+    linenr_T lnum = get_tv_number(&argvars[0]);
+    buf_T    *buf = curbuf;
+
+    if (argvars[1].v_type != VAR_UNKNOWN)
+    {
+	if (get_bufnr_from_arg(&argvars[1], &buf) == FAIL)
+	    return;
+    }
+    if (lnum < 1 || lnum > buf->b_ml.ml_line_count)
+    {
+	EMSG(_(e_invrange));
+	return;
+    }
+
+    if (rettv_list_alloc(rettv) == OK)
+    {
+	char_u	    *text = ml_get_buf(buf, lnum, FALSE);
+	size_t	    textlen = STRLEN(text) + 1;
+	int	    count = (buf->b_ml.ml_line_len - textlen)
+							  / sizeof(textprop_T);
+	int	    i;
+	textprop_T  prop;
+	proptype_T  *pt;
+
+	for (i = 0; i < count; ++i)
+	{
+	    dict_T *d = dict_alloc();
+
+	    if (d == NULL)
+		break;
+	    mch_memmove(&prop, text + textlen + i * sizeof(textprop_T),
+							   sizeof(textprop_T));
+	    dict_add_number(d, "col", prop.tp_col);
+	    dict_add_number(d, "length", prop.tp_len);
+	    dict_add_number(d, "id", prop.tp_id);
+	    dict_add_number(d, "start", !(prop.tp_flags & TP_FLAG_CONT_PREV));
+	    dict_add_number(d, "end", !(prop.tp_flags & TP_FLAG_CONT_NEXT));
+	    pt = text_prop_type_by_id(buf, prop.tp_type);
+	    if (pt != NULL)
+		dict_add_string(d, "type", pt->pt_name);
+
+	    list_append_dict(rettv->vval.v_list, d);
+	}
+    }
+}
+
+/*
+ * prop_remove({props} [, {lnum} [, {lnum_end}]])
+ */
+    void
+f_prop_remove(typval_T *argvars, typval_T *rettv)
+{
+    linenr_T	start = 1;
+    linenr_T	end = 0;
+    linenr_T	lnum;
+    dict_T	*dict;
+    buf_T	*buf = curbuf;
+    dictitem_T	*di;
+    int		do_all = FALSE;
+    int		id = -1;
+    int		type_id = -1;
+
+    rettv->vval.v_number = 0;
+    if (argvars[0].v_type != VAR_DICT || argvars[0].vval.v_dict == NULL)
+    {
+	EMSG(_(e_invarg));
+	return;
+    }
+
+    if (argvars[1].v_type != VAR_UNKNOWN)
+    {
+	start = get_tv_number(&argvars[1]);
+	end = start;
+	if (argvars[2].v_type != VAR_UNKNOWN)
+	    end = get_tv_number(&argvars[2]);
+	if (start < 1 || end < 1)
+	{
+	    EMSG(_(e_invrange));
+	    return;
+	}
+    }
+
+    dict = argvars[0].vval.v_dict;
+    di = dict_find(dict, (char_u *)"bufnr", -1);
+    if (di != NULL)
+    {
+	buf = get_buf_tv(&di->di_tv, FALSE);
+	if (buf == NULL)
+	    return;
+    }
+
+    di = dict_find(dict, (char_u*)"all", -1);
+    if (di != NULL)
+	do_all = get_dict_number(dict, (char_u *)"all");
+
+    if (dict_find(dict, (char_u *)"id", -1) != NULL)
+	id = get_dict_number(dict, (char_u *)"id");
+    if (dict_find(dict, (char_u *)"type", -1))
+    {
+	char_u	    *name = get_dict_string(dict, (char_u *)"type", FALSE);
+	proptype_T  *type = lookup_prop_type(name, buf);
+
+	if (type == NULL)
+	    return;
+	type_id = type->pt_id;
+    }
+    if (id == -1 && type_id == -1)
+    {
+	EMSG(_("E968: Need at least one of 'id' or 'type'"));
+	return;
+    }
+
+    if (end == 0)
+	end = buf->b_ml.ml_line_count;
+    for (lnum = start; lnum <= end; ++lnum)
+    {
+	char_u *text;
+	size_t len;
+
+	if (lnum > buf->b_ml.ml_line_count)
+	    break;
+	text = ml_get_buf(buf, lnum, FALSE);
+	len = STRLEN(text) + 1;
+	if ((size_t)buf->b_ml.ml_line_len > len)
+	{
+	    static textprop_T textprop;  // static because of alignment
+	    unsigned          idx;
+
+	    for (idx = 0; idx < (buf->b_ml.ml_line_len - len)
+						   / sizeof(textprop_T); ++idx)
+	    {
+		char_u *cur_prop = buf->b_ml.ml_line_ptr + len
+						    + idx * sizeof(textprop_T);
+		size_t	taillen;
+
+		mch_memmove(&textprop, cur_prop, sizeof(textprop_T));
+		if (textprop.tp_id == id || textprop.tp_type == type_id)
+		{
+		    if (!(buf->b_ml.ml_flags & ML_LINE_DIRTY))
+		    {
+			char_u *newptr = alloc(buf->b_ml.ml_line_len);
+
+			// need to allocate the line to be able to change it
+			if (newptr == NULL)
+			    return;
+			mch_memmove(newptr, buf->b_ml.ml_line_ptr,
+							buf->b_ml.ml_line_len);
+			buf->b_ml.ml_line_ptr = newptr;
+			curbuf->b_ml.ml_flags |= ML_LINE_DIRTY;
+		    }
+
+		    taillen = buf->b_ml.ml_line_len - len
+					      - (idx + 1) * sizeof(textprop_T);
+		    if (taillen > 0)
+			mch_memmove(cur_prop, cur_prop + sizeof(textprop_T),
+								      taillen);
+		    buf->b_ml.ml_line_len -= sizeof(textprop_T);
+		    --idx;
+
+		    ++rettv->vval.v_number;
+		    if (!do_all)
+			break;
+		}
+	    }
+	}
+    }
+    redraw_buf_later(buf, NOT_VALID);
+}
+
+/*
+ * Common for f_prop_type_add() and f_prop_type_change().
+ */
+    void
+prop_type_set(typval_T *argvars, int add)
+{
+    char_u	*name;
+    buf_T	*buf = NULL;
+    dict_T	*dict;
+    dictitem_T  *di;
+    proptype_T	*prop;
+
+    name = get_tv_string(&argvars[0]);
+    if (*name == NUL)
+    {
+	EMSG(_(e_invarg));
+	return;
+    }
+
+    if (get_bufnr_from_arg(&argvars[1], &buf) == FAIL)
+	return;
+    dict = argvars[1].vval.v_dict;
+
+    prop = find_prop(name, buf);
+    if (add)
+    {
+	hashtab_T **htp;
+
+	if (prop != NULL)
+	{
+	    EMSG2(_("E969: Property type %s already defined"), name);
+	    return;
+	}
+	prop = (proptype_T *)alloc_clear(sizeof(proptype_T) + STRLEN(name));
+	if (prop == NULL)
+	    return;
+	STRCPY(prop->pt_name, name);
+	prop->pt_id = ++proptype_id;
+	htp = buf == NULL ? &global_proptypes : &buf->b_proptypes;
+	if (*htp == NULL)
+	{
+	    *htp = (hashtab_T *)alloc(sizeof(hashtab_T));
+	    if (*htp == NULL)
+		return;
+	    hash_init(*htp);
+	}
+	hash_add(buf == NULL ? global_proptypes : buf->b_proptypes,
+							       PT2HIKEY(prop));
+    }
+    else
+    {
+	if (prop == NULL)
+	{
+	    EMSG2(_(e_type_not_exist), name);
+	    return;
+	}
+    }
+
+    if (dict != NULL)
+    {
+	di = dict_find(dict, (char_u *)"highlight", -1);
+	if (di != NULL)
+	{
+	    char_u	*highlight;
+	    int		hl_id = 0;
+
+	    highlight = get_dict_string(dict, (char_u *)"highlight", TRUE);
+	    if (highlight != NULL && *highlight != NUL)
+		hl_id = syn_name2id(highlight);
+	    if (hl_id <= 0)
+	    {
+		EMSG2(_("E970: Unknown highlight group name: '%s'"),
+			highlight == NULL ? (char_u *)"" : highlight);
+		return;
+	    }
+	    prop->pt_hl_id = hl_id;
+	}
+
+	di = dict_find(dict, (char_u *)"priority", -1);
+	if (di != NULL)
+	    prop->pt_priority = get_tv_number(&di->di_tv);
+
+	di = dict_find(dict, (char_u *)"start_incl", -1);
+	if (di != NULL)
+	{
+	    if (get_tv_number(&di->di_tv))
+		prop->pt_flags |= PT_FLAG_INS_START_INCL;
+	    else
+		prop->pt_flags &= ~PT_FLAG_INS_START_INCL;
+	}
+
+	di = dict_find(dict, (char_u *)"end_incl", -1);
+	if (di != NULL)
+	{
+	    if (get_tv_number(&di->di_tv))
+		prop->pt_flags |= PT_FLAG_INS_END_INCL;
+	    else
+		prop->pt_flags &= ~PT_FLAG_INS_END_INCL;
+	}
+    }
+}
+
+/*
+ * prop_type_add({name}, {props})
+ */
+    void
+f_prop_type_add(typval_T *argvars, typval_T *rettv UNUSED)
+{
+    prop_type_set(argvars, TRUE);
+}
+
+/*
+ * prop_type_change({name}, {props})
+ */
+    void
+f_prop_type_change(typval_T *argvars, typval_T *rettv UNUSED)
+{
+    prop_type_set(argvars, FALSE);
+}
+
+/*
+ * prop_type_delete({name} [, {bufnr}])
+ */
+    void
+f_prop_type_delete(typval_T *argvars, typval_T *rettv UNUSED)
+{
+    char_u	*name;
+    buf_T	*buf = NULL;
+    hashitem_T	*hi;
+
+    name = get_tv_string(&argvars[0]);
+    if (*name == NUL)
+    {
+	EMSG(_(e_invarg));
+	return;
+    }
+
+    if (argvars[1].v_type != VAR_UNKNOWN)
+    {
+	if (get_bufnr_from_arg(&argvars[1], &buf) == FAIL)
+	    return;
+    }
+
+    hi = find_prop_hi(name, buf);
+    if (hi != NULL)
+    {
+	hashtab_T	*ht;
+
+	if (buf == NULL)
+	    ht = global_proptypes;
+	else
+	    ht = buf->b_proptypes;
+	hash_remove(ht, hi);
+    }
+}
+
+/*
+ * prop_type_get({name} [, {bufnr}])
+ */
+    void
+f_prop_type_get(typval_T *argvars, typval_T *rettv UNUSED)
+{
+    char_u *name = get_tv_string(&argvars[0]);
+
+    if (*name == NUL)
+    {
+	EMSG(_(e_invarg));
+	return;
+    }
+    if (rettv_dict_alloc(rettv) == OK)
+    {
+	proptype_T  *prop = NULL;
+	buf_T	    *buf = NULL;
+
+	if (argvars[1].v_type != VAR_UNKNOWN)
+	{
+	    if (get_bufnr_from_arg(&argvars[1], &buf) == FAIL)
+		return;
+	}
+
+	prop = find_prop(name, buf);
+	if (prop != NULL)
+	{
+	    dict_T *d = rettv->vval.v_dict;
+
+	    if (prop->pt_hl_id > 0)
+		dict_add_string(d, "highlight", syn_id2name(prop->pt_hl_id));
+	    dict_add_number(d, "priority", prop->pt_priority);
+	    dict_add_number(d, "start_incl",
+			    (prop->pt_flags & PT_FLAG_INS_START_INCL) ? 1 : 0);
+	    dict_add_number(d, "end_incl",
+			      (prop->pt_flags & PT_FLAG_INS_END_INCL) ? 1 : 0);
+	    if (buf != NULL)
+		dict_add_number(d, "bufnr", buf->b_fnum);
+	}
+    }
+}
+
+    static void
+list_types(hashtab_T *ht, list_T *l)
+{
+    long	todo;
+    hashitem_T	*hi;
+
+    todo = (long)ht->ht_used;
+    for (hi = ht->ht_array; todo > 0; ++hi)
+    {
+	if (!HASHITEM_EMPTY(hi))
+	{
+	    proptype_T *prop = HI2PT(hi);
+
+	    list_append_string(l, prop->pt_name, -1);
+	    --todo;
+	}
+    }
+}
+
+/*
+ * prop_type_list([{bufnr}])
+ */
+    void
+f_prop_type_list(typval_T *argvars, typval_T *rettv UNUSED)
+{
+    buf_T *buf = NULL;
+
+    if (rettv_list_alloc(rettv) == OK)
+    {
+	if (argvars[0].v_type != VAR_UNKNOWN)
+	{
+	    if (get_bufnr_from_arg(&argvars[0], &buf) == FAIL)
+		return;
+	}
+	if (buf == NULL)
+	{
+	    if (global_proptypes != NULL)
+		list_types(global_proptypes, rettv->vval.v_list);
+	}
+	else if (buf->b_proptypes != NULL)
+	    list_types(buf->b_proptypes, rettv->vval.v_list);
+    }
+}
+
+/*
+ * Free all property types in "ht".
+ */
+    static void
+clear_ht_prop_types(hashtab_T *ht)
+{
+    long	todo;
+    hashitem_T	*hi;
+
+    if (ht == NULL)
+	return;
+
+    todo = (long)ht->ht_used;
+    for (hi = ht->ht_array; todo > 0; ++hi)
+    {
+	if (!HASHITEM_EMPTY(hi))
+	{
+	    proptype_T *prop = HI2PT(hi);
+
+	    vim_free(prop);
+	    --todo;
+	}
+    }
+
+    hash_clear(ht);
+    vim_free(ht);
+}
+
+#if defined(EXITFREE) || defined(PROTO)
+/*
+ * Free all property types for "buf".
+ */
+    void
+clear_global_prop_types(void)
+{
+    clear_ht_prop_types(global_proptypes);
+    global_proptypes = NULL;
+}
+#endif
+
+/*
+ * Free all property types for "buf".
+ */
+    void
+clear_buf_prop_types(buf_T *buf)
+{
+    clear_ht_prop_types(buf->b_proptypes);
+    buf->b_proptypes = NULL;
+}
+
+#endif // FEAT_TEXT_PROP
diff --git a/src/userfunc.c b/src/userfunc.c
index 8bfebec..e76e6d8 100644
--- a/src/userfunc.c
+++ b/src/userfunc.c
@@ -25,7 +25,7 @@
 
 /* From user function to hashitem and back. */
 #define UF2HIKEY(fp) ((fp)->uf_name)
-#define HIKEY2UF(p)  ((ufunc_T *)(p - offsetof(ufunc_T, uf_name)))
+#define HIKEY2UF(p)  ((ufunc_T *)((p) - offsetof(ufunc_T, uf_name)))
 #define HI2UF(hi)     HIKEY2UF((hi)->hi_key)
 
 #define FUNCARG(fp, j)	((char_u **)(fp->uf_args.ga_data))[j]
diff --git a/src/version.c b/src/version.c
index fafba67..2c4dd72 100644
--- a/src/version.c
+++ b/src/version.c
@@ -653,12 +653,6 @@
 # else
 	"-terminfo",
 # endif
-#else		    /* unix always includes termcap support */
-# ifdef HAVE_TGETENT
-	"+tgetent",
-# else
-	"-tgetent",
-# endif
 #endif
 #ifdef FEAT_TERMRESPONSE
 	"+termresponse",
@@ -670,6 +664,19 @@
 #else
 	"-textobjects",
 #endif
+#ifdef FEAT_TEXT_PROP
+	"+textprop",
+#else
+	"-textprop",
+#endif
+#if !defined(UNIX)
+/* unix always includes termcap support */
+# ifdef HAVE_TGETENT
+	"+tgetent",
+# else
+	"-tgetent",
+# endif
+#endif
 #ifdef FEAT_TIMERS
 	"+timers",
 #else
@@ -793,6 +800,8 @@
 static int included_patches[] =
 {   /* Add new patch number below this line */
 /**/
+    579,
+/**/
     578,
 /**/
     577,
