diff --git a/runtime/indent/xml.vim b/runtime/indent/xml.vim
index 7afcc89..bc64aac 100644
--- a/runtime/indent/xml.vim
+++ b/runtime/indent/xml.vim
@@ -1,15 +1,21 @@
-" Language:	xml
-" Repository:   https://github.com/chrisbra/vim-xml-ftplugin
-" Maintainer:	Christian Brabandt <cb@256bit.org>
-" Previous Maintainer:	Johannes Zellner <johannes@zellner.org>
-" Last Change:	20181022 - Do not overwrite indentkeys setting
-"                          https://github.com/chrisbra/vim-xml-ftplugin/issues/1
-"             	20180724 - Correctly indent xml comments https://github.com/vim/vim/issues/3200
-" Notes:	1) does not indent pure non-xml code (e.g. embedded scripts)
-"		2) will be confused by unbalanced tags in comments
-"		or CDATA sections.
-"		2009-05-26 patch by Nikolai Weibull
-" TODO: 	implement pre-like tags, see xml_indent_open / xml_indent_close
+"     Language: xml
+"   Repository: https://github.com/chrisbra/vim-xml-ftplugin
+" Last Changed: Dec 07th, 2018
+"   Maintainer: Christian Brabandt <cb@256bit.org>
+" Previous Maintainer:  Johannes Zellner <johannes@zellner.org>
+" Last Change:
+" 20181116 - Fix indentation when tags start with a colon or an underscore
+"            https://github.com/vim/vim/pull/926
+" 20181022 - Do not overwrite indentkeys setting
+"            https://github.com/chrisbra/vim-xml-ftplugin/issues/1
+" 20180724 - Correctly indent xml comments https://github.com/vim/vim/issues/3200
+"
+" Notes:
+"   1) does not indent pure non-xml code (e.g. embedded scripts)
+"       2) will be confused by unbalanced tags in comments
+"       or CDATA sections.
+"       2009-05-26 patch by Nikolai Weibull
+" TODO:     implement pre-like tags, see xml_indent_open / xml_indent_close
 
 " Only load this indent file when no other was loaded.
 if exists("b:did_indent")
@@ -20,11 +26,12 @@
 set cpo&vim
 
 " [-- local settings (must come before aborting the script) --]
+" Attention: Parameter use_syntax_check is used by the docbk.vim indent script
 setlocal indentexpr=XmlIndentGet(v:lnum,1)
 setlocal indentkeys=o,O,*<Return>,<>>,<<>,/,{,},!^F
 
 if !exists('b:xml_indent_open')
-    let b:xml_indent_open = '.\{-}<\a'
+    let b:xml_indent_open = '.\{-}<[:A-Z_a-z]'
     " pre tag, e.g. <address>
     " let b:xml_indent_open = '.\{-}<[/]\@!\(address\)\@!'
 endif
@@ -40,7 +47,7 @@
 
 " [-- finish, if the function already exists --]
 if exists('*XmlIndentGet')
-  finish
+    finish
 endif
 
 let s:keepcpo= &cpo
@@ -53,13 +60,13 @@
 
 " [-- check if it's xml --]
 fun! <SID>XmlIndentSynCheck(lnum)
-    if '' != &syntax
-	let syn1 = synIDattr(synID(a:lnum, 1, 1), 'name')
-	let syn2 = synIDattr(synID(a:lnum, strlen(getline(a:lnum)) - 1, 1), 'name')
-	if '' != syn1 && syn1 !~ 'xml' && '' != syn2 && syn2 !~ 'xml'
-	    " don't indent pure non-xml code
-	    return 0
-	endif
+    if &syntax != ''
+        let syn1 = synIDattr(synID(a:lnum, 1, 1), 'name')
+        let syn2 = synIDattr(synID(a:lnum, strlen(getline(a:lnum)) - 1, 1), 'name')
+        if syn1 != '' && syn1 !~ 'xml' && syn2 != '' && syn2 !~ 'xml'
+            " don't indent pure non-xml code
+            return 0
+        endif
     endif
     return 1
 endfun
@@ -68,41 +75,72 @@
 fun! <SID>XmlIndentSum(lnum, style, add)
     let line = getline(a:lnum)
     if a:style == match(line, '^\s*</')
-	return (shiftwidth() *
-	\  (<SID>XmlIndentWithPattern(line, b:xml_indent_open)
-	\ - <SID>XmlIndentWithPattern(line, b:xml_indent_close)
-	\ - <SID>XmlIndentWithPattern(line, '.\{-}/>'))) + a:add
+        return (shiftwidth() *
+        \  (<SID>XmlIndentWithPattern(line, b:xml_indent_open)
+        \ - <SID>XmlIndentWithPattern(line, b:xml_indent_close)
+        \ - <SID>XmlIndentWithPattern(line, '.\{-}/>'))) + a:add
     else
-	return a:add
+        return a:add
     endif
 endfun
 
+" Main indent function
 fun! XmlIndentGet(lnum, use_syntax_check)
     " Find a non-empty line above the current line.
-    let lnum = prevnonblank(a:lnum - 1)
+    let plnum = prevnonblank(a:lnum - 1)
+    " Find previous line with a tag (regardless whether open or closed)
+    let ptag = search('.\{-}<[/:A-Z_a-z]', 'bnw')
 
     " Hit the start of the file, use zero indent.
-    if lnum == 0
-	return 0
+    if plnum == 0
+        return 0
     endif
+    let syn_name = ''
 
     if a:use_syntax_check
-	let check_lnum = <SID>XmlIndentSynCheck(lnum)
-	let check_alnum = <SID>XmlIndentSynCheck(a:lnum)
-	if 0 == check_lnum || 0 == check_alnum
-	    return indent(a:lnum)
-	elseif -1 == check_lnum || -1 == check_alnum
-	    return -1
-	endif
+        let check_lnum = <SID>XmlIndentSynCheck(plnum)
+        let check_alnum = <SID>XmlIndentSynCheck(a:lnum)
+        if check_lnum == 0 || check_alnum == 0
+            return indent(a:lnum)
+        endif
+        let syn_name = synIDattr(synID(a:lnum, strlen(getline(a:lnum)) - 1, 1), 'name')
     endif
 
-    let ind = <SID>XmlIndentSum(lnum, -1, indent(lnum))
-    let ind = <SID>XmlIndentSum(a:lnum, 0, ind)
+    if syn_name =~ 'Comment'
+        return <SID>XmlIndentComment(a:lnum)
+    endif
 
+    " Get indent from previous tag line
+    let ind = <SID>XmlIndentSum(ptag, -1, indent(ptag))
+    " Determine indent from current line
+    let ind = <SID>XmlIndentSum(a:lnum, 0, ind)
     return ind
 endfun
 
+" return indent for a commented line,
+" the middle part might be indented on additional level
+func! <SID>XmlIndentComment(lnum)
+    let ptagopen = search(b:xml_indent_open, 'bnw')
+    let ptagclose = search(b:xml_indent_close, 'bnw')
+    if getline(a:lnum) =~ '<!--'
+        " if previous tag was a closing tag, do not add
+        " one additional level of indent
+        if ptagclose > ptagopen && a:lnum > ptagclose
+            return indent(ptagclose)
+        else
+            " start of comment, add one indentation level
+            return indent(ptagopen) + shiftwidth()
+        endif
+    elseif getline(a:lnum) =~ '-->'
+        " end of comment, same as start of comment
+        return indent(search('<!--', 'bnw'))
+    else
+        " middle part of comment, add one additional level
+        return indent(search('<!--', 'bnw')) + shiftwidth()
+    endif
+endfunc
+
 let &cpo = s:keepcpo
 unlet s:keepcpo
 
-" vim:ts=8
+" vim:ts=4 et sts=-1 sw=0
