patch 8.0.1285: occasional crash when using a channel

Problem:    Occasional crash when using a channel. (Marek)
Solution:   Decrement reference count later. (closes #2315)
diff --git a/Filelist b/Filelist
index 56962c8..7083eed 100644
--- a/Filelist
+++ b/Filelist
@@ -659,6 +659,7 @@
 		runtime/makemenu.vim \
 		runtime/autoload/*.vim \
 		runtime/autoload/README.txt \
+		runtime/autoload/dist/*.vim \
 		runtime/autoload/xml/*.vim \
 		runtime/colors/*.vim \
 		runtime/colors/README.txt \
diff --git a/nsis/gvim.nsi b/nsis/gvim.nsi
index 4e9bbfb..871ce67 100644
--- a/nsis/gvim.nsi
+++ b/nsis/gvim.nsi
@@ -268,6 +268,9 @@
 	SetOutPath $0\autoload
 	File ${VIMRT}\autoload\*.*
 
+	SetOutPath $0\autoload\dist
+	File ${VIMRT}\autoload\dist\*.*
+
 	SetOutPath $0\autoload\xml
 	File ${VIMRT}\autoload\xml\*.*
 
diff --git a/runtime/autoload/filetype.vim b/runtime/autoload/dist/ft.vim
similarity index 92%
rename from runtime/autoload/filetype.vim
rename to runtime/autoload/dist/ft.vim
index 66e64b2..2603c68 100644
--- a/runtime/autoload/filetype.vim
+++ b/runtime/autoload/dist/ft.vim
@@ -1,7 +1,7 @@
 " Vim functions for file type detection
 "
 " Maintainer:	Bram Moolenaar <Bram@vim.org>
-" Last Change:	2017 Nov 09
+" Last Change:	2017 Nov 11
 
 " These functions are moved here from runtime/filetype.vim to make startup
 " faster.
@@ -10,7 +10,7 @@
 let s:cpo_save = &cpo
 set cpo&vim
 
-func filetype#Check_inp()
+func dist#ft#Check_inp()
   if getline(1) =~ '^\*'
     setf abaqus
   else
@@ -32,14 +32,14 @@
 
 " This function checks for the kind of assembly that is wanted by the user, or
 " can be detected from the first five lines of the file.
-func filetype#FTasm()
+func dist#ft#FTasm()
   " make sure b:asmsyntax exists
   if !exists("b:asmsyntax")
     let b:asmsyntax = ""
   endif
 
   if b:asmsyntax == ""
-    call filetype#FTasmsyntax()
+    call dist#ft#FTasmsyntax()
   endif
 
   " if b:asmsyntax still isn't set, default to asmsyntax or GNU
@@ -54,7 +54,7 @@
   exe "setf " . fnameescape(b:asmsyntax)
 endfunc
 
-func filetype#FTasmsyntax()
+func dist#ft#FTasmsyntax()
   " see if file contains any asmsyntax=foo overrides. If so, change
   " b:asmsyntax appropriately
   let head = " ".getline(1)." ".getline(2)." ".getline(3)." ".getline(4).
@@ -69,7 +69,7 @@
 
 " Check if one of the first five lines contains "VB_Name".  In that case it is
 " probably a Visual Basic file.  Otherwise it's assumed to be "alt" filetype.
-func filetype#FTVB(alt)
+func dist#ft#FTVB(alt)
   if getline(1).getline(2).getline(3).getline(4).getline(5) =~? 'VB_Name\|Begin VB\.\(Form\|MDIForm\|UserControl\)'
     setf vb
   else
@@ -77,7 +77,7 @@
   endif
 endfunc
 
-func filetype#FTbtm()
+func dist#ft#FTbtm()
   if exists("g:dosbatch_syntax_for_btm") && g:dosbatch_syntax_for_btm
     setf dosbatch
   else
@@ -85,7 +85,7 @@
   endif
 endfunc
 
-func filetype#BindzoneCheck(default)
+func dist#ft#BindzoneCheck(default)
   if getline(1).getline(2).getline(3).getline(4) =~ '^; <<>> DiG [0-9.]\+.* <<>>\|$ORIGIN\|$TTL\|IN\s\+SOA'
     setf bindzone
   elseif a:default != ''
@@ -93,7 +93,7 @@
   endif
 endfunc
 
-func filetype#FTlpc()
+func dist#ft#FTlpc()
   if exists("g:lpc_syntax_for_c")
     let lnum = 1
     while lnum <= 12
@@ -107,7 +107,7 @@
   setf c
 endfunc
 
-func filetype#FTheader()
+func dist#ft#FTheader()
   if match(getline(1, min([line("$"), 200])), '^@\(interface\|end\|class\)') > -1
     if exists("g:c_syntax_for_h")
       setf objc
@@ -128,7 +128,7 @@
 " If the first line starts with # or ! it's probably a ch file.
 " If a line has "main", "include", "//" ir "/*" it's probably ch.
 " Otherwise CHILL is assumed.
-func filetype#FTchange()
+func dist#ft#FTchange()
   let lnum = 1
   while lnum <= 10
     if getline(lnum)[0] == '@'
@@ -152,7 +152,7 @@
   setf chill
 endfunc
 
-func filetype#FTent()
+func dist#ft#FTent()
   " This function checks for valid cl syntax in the first five lines.
   " Look for either an opening comment, '#', or a block start, '{".
   " If not found, assume SGML.
@@ -172,7 +172,7 @@
   setf dtd
 endfunc
 
-func filetype#EuphoriaCheck()
+func dist#ft#EuphoriaCheck()
   if exists('g:filetype_euphoria')
     exe 'setf ' . g:filetype_euphoria
   else
@@ -180,7 +180,7 @@
   endif
 endfunc
 
-func filetype#DtraceCheck()
+func dist#ft#DtraceCheck()
   let lines = getline(1, min([line("$"), 100]))
   if match(lines, '^module\>\|^import\>') > -1
     " D files often start with a module and/or import statement.
@@ -192,7 +192,7 @@
   endif
 endfunc
 
-func filetype#FTe()
+func dist#ft#FTe()
   if exists('g:filetype_euphoria')
     exe 'setf ' . g:filetype_euphoria
   else
@@ -209,7 +209,7 @@
 endfunc
 
 " Distinguish between HTML, XHTML and Django
-func filetype#FThtml()
+func dist#ft#FThtml()
   let n = 1
   while n < 10 && n < line("$")
     if getline(n) =~ '\<DTD\s\+XHTML\s'
@@ -226,7 +226,7 @@
 endfunc
 
 " Distinguish between standard IDL and MS-IDL
-func filetype#FTidl()
+func dist#ft#FTidl()
   let n = 1
   while n < 50 && n < line("$")
     if getline(n) =~ '^\s*import\s\+"\(unknwn\|objidl\)\.idl"'
@@ -239,7 +239,7 @@
 endfunc
 
 " Distinguish between "default" and Cproto prototype file. */
-func filetype#ProtoCheck(default)
+func dist#ft#ProtoCheck(default)
   " Cproto files have a comment in the first line and a function prototype in
   " the second line, it always ends in ";".  Indent files may also have
   " comments, thus we can't match comments to see the difference.
@@ -252,7 +252,7 @@
   endif
 endfunc
 
-func filetype#FTm()
+func dist#ft#FTm()
   let n = 1
   let saw_comment = 0 " Whether we've seen a multiline comment leader.
   while n < 100
@@ -296,7 +296,7 @@
   endif
 endfunc
 
-func filetype#FTmms()
+func dist#ft#FTmms()
   let n = 1
   while n < 10
     let line = getline(n)
@@ -315,7 +315,7 @@
 
 " This function checks if one of the first five lines start with a dot.  In
 " that case it is probably an nroff file: 'filetype' is set and 1 is returned.
-func filetype#FTnroff()
+func dist#ft#FTnroff()
   if getline(1)[0] . getline(2)[0] . getline(3)[0] . getline(4)[0] . getline(5)[0] =~ '\.'
     setf nroff
     return 1
@@ -323,7 +323,7 @@
   return 0
 endfunc
 
-func filetype#FTmm()
+func dist#ft#FTmm()
   let n = 1
   while n < 10
     let line = getline(n)
@@ -336,7 +336,7 @@
   setf nroff
 endfunc
 
-func filetype#FTpl()
+func dist#ft#FTpl()
   if exists("g:filetype_pl")
     exe "setf " . g:filetype_pl
   else
@@ -351,7 +351,7 @@
   endif
 endfunc
 
-func filetype#FTinc()
+func dist#ft#FTinc()
   if exists("g:filetype_inc")
     exe "setf " . g:filetype_inc
   else
@@ -363,7 +363,7 @@
     elseif lines =~ "<?"
       setf php
     else
-      call filetype#FTasmsyntax()
+      call dist#ft#FTasmsyntax()
       if exists("b:asmsyntax")
 	exe "setf " . fnameescape(b:asmsyntax)
       else
@@ -373,7 +373,7 @@
   endif
 endfunc
 
-func filetype#FTprogress_cweb()
+func dist#ft#FTprogress_cweb()
   if exists("g:filetype_w")
     exe "setf " . g:filetype_w
     return
@@ -385,7 +385,7 @@
   endif
 endfunc
 
-func filetype#FTprogress_asm()
+func dist#ft#FTprogress_asm()
   if exists("g:filetype_i")
     exe "setf " . g:filetype_i
     return
@@ -396,7 +396,7 @@
   while lnum <= 10 && lnum < line('$')
     let line = getline(lnum)
     if line =~ '^\s*;' || line =~ '^\*'
-      call filetype#FTasm()
+      call dist#ft#FTasm()
       return
     elseif line !~ '^\s*$' || line =~ '^/\*'
       " Not an empty line: Doesn't look like valid assembly code.
@@ -408,7 +408,7 @@
   setf progress
 endfunc
 
-func filetype#FTprogress_pascal()
+func dist#ft#FTprogress_pascal()
   if exists("g:filetype_p")
     exe "setf " . g:filetype_p
     return
@@ -433,7 +433,7 @@
   setf progress
 endfunc
 
-func filetype#FTr()
+func dist#ft#FTr()
   let max = line("$") > 50 ? 50 : line("$")
 
   for n in range(1, max)
@@ -466,7 +466,7 @@
   endif
 endfunc
 
-func filetype#McSetf()
+func dist#ft#McSetf()
   " Rely on the file to start with a comment.
   " MS message text files use ';', Sendmail files use '#' or 'dnl'
   for lnum in range(1, min([line("$"), 20]))
@@ -483,21 +483,21 @@
 endfunc
 
 " Called from filetype.vim and scripts.vim.
-func filetype#SetFileTypeSH(name)
+func dist#ft#SetFileTypeSH(name)
   if expand("<amatch>") =~ g:ft_ignore_pat
     return
   endif
   if a:name =~ '\<csh\>'
     " Some .sh scripts contain #!/bin/csh.
-    call filetype#SetFileTypeShell("csh")
+    call dist#ft#SetFileTypeShell("csh")
     return
   elseif a:name =~ '\<tcsh\>'
     " Some .sh scripts contain #!/bin/tcsh.
-    call filetype#SetFileTypeShell("tcsh")
+    call dist#ft#SetFileTypeShell("tcsh")
     return
   elseif a:name =~ '\<zsh\>'
     " Some .sh scripts contain #!/bin/zsh.
-    call filetype#SetFileTypeShell("zsh")
+    call dist#ft#SetFileTypeShell("zsh")
     return
   elseif a:name =~ '\<ksh\>'
     let b:is_kornshell = 1
@@ -524,13 +524,13 @@
       unlet b:is_bash
     endif
   endif
-  call filetype#SetFileTypeShell("sh")
+  call dist#ft#SetFileTypeShell("sh")
 endfunc
 
 " For shell-like file types, check for an "exec" command hidden in a comment,
 " as used for Tcl.
 " Also called from scripts.vim, thus can't be local to this script.
-func filetype#SetFileTypeShell(name)
+func dist#ft#SetFileTypeShell(name)
   if expand("<amatch>") =~ g:ft_ignore_pat
     return
   endif
@@ -550,18 +550,18 @@
   exe "setf " . a:name
 endfunc
 
-func filetype#CSH()
+func dist#ft#CSH()
   if exists("g:filetype_csh")
-    call filetype#SetFileTypeShell(g:filetype_csh)
+    call dist#ft#SetFileTypeShell(g:filetype_csh)
   elseif &shell =~ "tcsh"
-    call filetype#SetFileTypeShell("tcsh")
+    call dist#ft#SetFileTypeShell("tcsh")
   else
-    call filetype#SetFileTypeShell("csh")
+    call dist#ft#SetFileTypeShell("csh")
   endif
 endfunc
 
 let s:ft_rules_udev_rules_pattern = '^\s*\cudev_rules\s*=\s*"\([^"]\{-1,}\)/*".*'
-func filetype#FTRules()
+func dist#ft#FTRules()
   let path = expand('<amatch>:p')
   if path =~ '^/\(etc/udev/\%(rules\.d/\)\=.*\.rules\|lib/udev/\%(rules\.d/\)\=.*\.rules\)$'
     setf udevrules
@@ -594,7 +594,7 @@
   setf hog
 endfunc
 
-func filetype#SQL()
+func dist#ft#SQL()
   if exists("g:filetype_sql")
     exe "setf " . g:filetype_sql
   else
@@ -608,7 +608,7 @@
 " file.
 " (Slow test) If a file contains a 'use' statement then it is almost certainly
 " a Perl file.
-func filetype#FTperl()
+func dist#ft#FTperl()
   let dirname = expand("%:p:h:t")
   if expand("%:e") == 't' && (dirname == 't' || dirname == 'xt')
     setf perl
@@ -629,7 +629,7 @@
 " 1. Check the first line of the file for "%&<format>".
 " 2. Check the first 1000 non-comment lines for LaTeX or ConTeXt keywords.
 " 3. Default to "latex" or to g:tex_flavor, can be set in user's vimrc.
-func filetype#FTtex()
+func dist#ft#FTtex()
   let firstline = getline(1)
   if firstline =~ '^%&\s*\a\+'
     let format = tolower(matchstr(firstline, '\a\+'))
@@ -681,7 +681,7 @@
   return
 endfunc
 
-func filetype#FTxml()
+func dist#ft#FTxml()
   let n = 1
   while n < 100 && n < line("$")
     let line = getline(n)
@@ -707,7 +707,7 @@
   setf xml
 endfunc
 
-func filetype#FTy()
+func dist#ft#FTy()
   let n = 1
   while n < 100 && n < line("$")
     let line = getline(n)
@@ -724,7 +724,7 @@
   setf yacc
 endfunc
 
-func filetype#Redif()
+func dist#ft#Redif()
   let lnum = 1
   while lnum <= 5 && lnum < line('$')
     if getline(lnum) =~ "^\ctemplate-type:"
diff --git a/runtime/filetype.vim b/runtime/filetype.vim
index 55f99fc..d176cf1 100644
--- a/runtime/filetype.vim
+++ b/runtime/filetype.vim
@@ -1,7 +1,7 @@
 " Vim support file to detect file types
 "
 " Maintainer:	Bram Moolenaar <Bram@vim.org>
-" Last Change:	2017 Nov 09
+" Last Change:	2017 Nov 11
 
 " Listen very carefully, I will say this only once
 if exists("did_load_filetypes")
@@ -52,7 +52,7 @@
 au BufNewFile,BufRead $VIMRUNTIME/doc/*.txt	setf help
 
 " Abaqus or Trasys
-au BufNewFile,BufRead *.inp			call filetype#Check_inp()
+au BufNewFile,BufRead *.inp			call dist#ft#Check_inp()
 
 " A-A-P recipe
 au BufNewFile,BufRead *.aap			setf aap
@@ -154,7 +154,7 @@
 
 " Assembly (all kinds)
 " *.lst is not pure assembly, it has two extra columns (address, byte codes)
-au BufNewFile,BufRead *.asm,*.[sS],*.[aA],*.mac,*.lst	call filetype#FTasm()
+au BufNewFile,BufRead *.asm,*.[sS],*.[aA],*.mac,*.lst	call dist#ft#FTasm()
 
 " Macro (VAX)
 au BufNewFile,BufRead *.mar			setf vmasm
@@ -184,7 +184,7 @@
 au BufNewFile,BufRead *.mch,*.ref,*.imp		setf b
 
 " BASIC or Visual Basic
-au BufNewFile,BufRead *.bas			call filetype#FTVB("basic")
+au BufNewFile,BufRead *.bas			call dist#ft#FTVB("basic")
 
 " Visual Basic Script (close to Visual Basic) or Visual Basic .NET
 au BufNewFile,BufRead *.vb,*.vbs,*.dsm,*.ctl	setf vb
@@ -202,7 +202,7 @@
 	\ if getline(1) =~ '^/\*' | setf rexx | else | setf dosbatch | endif
 
 " Batch file for 4DOS
-au BufNewFile,BufRead *.btm			call filetype#FTbtm()
+au BufNewFile,BufRead *.btm			call dist#ft#FTbtm()
 
 " BC calculator
 au BufNewFile,BufRead *.bc			setf bc
@@ -222,7 +222,7 @@
 
 " BIND zone
 au BufNewFile,BufRead named.root		setf bindzone
-au BufNewFile,BufRead *.db			call filetype#BindzoneCheck('')
+au BufNewFile,BufRead *.db			call dist#ft#BindzoneCheck('')
 
 " Blank
 au BufNewFile,BufRead *.bl			setf blank
@@ -238,7 +238,7 @@
 endif
 
 " C or lpc
-au BufNewFile,BufRead *.c			call filetype#FTlpc()
+au BufNewFile,BufRead *.c			call dist#ft#FTlpc()
 
 " Calendar
 au BufNewFile,BufRead calendar			setf calendar
@@ -292,7 +292,7 @@
 " .h files can be C, Ch C++, ObjC or ObjC++.
 " Set c_syntax_for_h if you want C, ch_syntax_for_h if you want Ch. ObjC is
 " detected automatically.
-au BufNewFile,BufRead *.h			call filetype#FTheader()
+au BufNewFile,BufRead *.h			call dist#ft#FTheader()
 
 " Ch (CHscript)
 au BufNewFile,BufRead *.chf			setf ch
@@ -326,7 +326,7 @@
 au BufNewFile,BufRead *..ch			setf chill
 
 " Changes for WEB and CWEB or CHILL
-au BufNewFile,BufRead *.ch			call filetype#FTchange()
+au BufNewFile,BufRead *.ch			call dist#ft#FTchange()
 
 " ChordPro
 au BufNewFile,BufRead *.chopro,*.crd,*.cho,*.crdpro,*.chordpro	setf chordpro
@@ -338,7 +338,7 @@
 au BufNewFile,BufRead *.eni			setf cl
 
 " Clever or dtd
-au BufNewFile,BufRead *.ent			call filetype#FTent()
+au BufNewFile,BufRead *.ent			call dist#ft#FTent()
 
 " Clipper (or FoxPro; could also be eviews)
 au BufNewFile,BufRead *.prg
@@ -393,9 +393,9 @@
 au BufNewFile,BufRead *Eterm/*.cfg		setf eterm
 
 " Euphoria 3 or 4
-au BufNewFile,BufRead *.eu,*.ew,*.ex,*.exu,*.exw  call filetype#EuphoriaCheck()
+au BufNewFile,BufRead *.eu,*.ew,*.ex,*.exu,*.exw  call dist#ft#EuphoriaCheck()
 if has("fname_case")
-   au BufNewFile,BufRead *.EU,*.EW,*.EX,*.EXU,*.EXW  call filetype#EuphoriaCheck()
+   au BufNewFile,BufRead *.EU,*.EW,*.EX,*.EXU,*.EXW  call dist#ft#EuphoriaCheck()
 endif
 
 " Lynx config files
@@ -442,7 +442,7 @@
 au BufNewFile,BufRead *.desc			setf desc
 
 " the D language or dtrace
-au BufNewFile,BufRead *.d			call filetype#DtraceCheck()
+au BufNewFile,BufRead *.d			call dist#ft#DtraceCheck()
 
 " Desktop files
 au BufNewFile,BufRead *.desktop,.directory	setf desktop
@@ -474,7 +474,7 @@
 	\ endif
 
 " DCL (Digital Command Language - vms) or DNS zone file
-au BufNewFile,BufRead *.com			call filetype#BindzoneCheck('dcl')
+au BufNewFile,BufRead *.com			call dist#ft#BindzoneCheck('dcl')
 
 " DOT
 au BufNewFile,BufRead *.dot			setf dot
@@ -522,7 +522,7 @@
 au BufNewFile,BufRead *.ecd			setf ecd
 
 " Eiffel or Specman or Euphoria
-au BufNewFile,BufRead *.e,*.E			call filetype#FTe()
+au BufNewFile,BufRead *.e,*.E			call dist#ft#FTe()
 
 " Elinks configuration
 au BufNewFile,BufRead */etc/elinks.conf,*/.elinks/elinks.conf	setf elinks
@@ -695,7 +695,7 @@
 au BufNewFile,BufRead *.t.html			setf tilde
 
 " HTML (.shtml and .stm for server side)
-au BufNewFile,BufRead *.html,*.htm,*.shtml,*.stm  call filetype#FThtml()
+au BufNewFile,BufRead *.html,*.htm,*.shtml,*.stm  call dist#ft#FThtml()
 
 " HTML with Ruby - eRuby
 au BufNewFile,BufRead *.erb,*.rhtml		setf eruby
@@ -722,7 +722,7 @@
 au BufNewFile,BufRead *.icn			setf icon
 
 " IDL (Interface Description Language)
-au BufNewFile,BufRead *.idl			call filetype#FTidl()
+au BufNewFile,BufRead *.idl			call dist#ft#FTidl()
 
 " Microsoft IDL (Interface Description Language)  Also *.idl
 " MOF = WMI (Windows Management Instrumentation) Managed Object Format
@@ -733,10 +733,10 @@
 
 " Indent profile (must come before IDL *.pro!)
 au BufNewFile,BufRead .indent.pro		setf indent
-au BufNewFile,BufRead indent.pro		call filetype#ProtoCheck('indent')
+au BufNewFile,BufRead indent.pro		call dist#ft#ProtoCheck('indent')
 
 " IDL (Interactive Data Language)
-au BufNewFile,BufRead *.pro			call filetype#ProtoCheck('idlang')
+au BufNewFile,BufRead *.pro			call dist#ft#ProtoCheck('idlang')
 
 " Indent RC
 au BufNewFile,BufRead indentrc			setf indent
@@ -950,7 +950,7 @@
 au BufNewFile,BufRead *.mason,*.mhtml,*.comp	setf mason
 
 " Mathematica, Matlab, Murphi or Objective C
-au BufNewFile,BufRead *.m			call filetype#FTm()
+au BufNewFile,BufRead *.m			call dist#ft#FTm()
 
 " Mathematica notebook
 au BufNewFile,BufRead *.nb			setf mma
@@ -980,7 +980,7 @@
 au BufNewFile,BufRead *.mix,*.mixal		setf mix
 
 " MMIX or VMS makefile
-au BufNewFile,BufRead *.mms			call filetype#FTmms()
+au BufNewFile,BufRead *.mms			call dist#ft#FTmms()
 
 " Symbian meta-makefile definition (MMP)
 au BufNewFile,BufRead *.mmp			setf mmp
@@ -1068,10 +1068,10 @@
 	\   setf nroff |
 	\ endif
 au BufNewFile,BufRead *.tr,*.nr,*.roff,*.tmac,*.mom	setf nroff
-au BufNewFile,BufRead *.[1-9]			call filetype#FTnroff()
+au BufNewFile,BufRead *.[1-9]			call dist#ft#FTnroff()
 
 " Nroff or Objective C++
-au BufNewFile,BufRead *.mm			call filetype#FTmm()
+au BufNewFile,BufRead *.mm			call dist#ft#FTmm()
 
 " Not Quite C
 au BufNewFile,BufRead *.nqc			setf nqc
@@ -1126,9 +1126,9 @@
 
 " Perl
 if has("fname_case")
-  au BufNewFile,BufRead *.pl,*.PL		call filetype#FTpl()
+  au BufNewFile,BufRead *.pl,*.PL		call dist#ft#FTpl()
 else
-  au BufNewFile,BufRead *.pl			call filetype#FTpl()
+  au BufNewFile,BufRead *.pl			call dist#ft#FTpl()
 endif
 au BufNewFile,BufRead *.plx,*.al,*.psgi		setf perl
 au BufNewFile,BufRead *.p6,*.pm6,*.pl6		setf perl6
@@ -1195,7 +1195,7 @@
 au BufNewFile,BufRead .povrayrc			setf povini
 
 " Povray, PHP or assembly
-au BufNewFile,BufRead *.inc			call filetype#FTinc()
+au BufNewFile,BufRead *.inc			call dist#ft#FTinc()
 
 " Printcap and Termcap
 au BufNewFile,BufRead *printcap
@@ -1224,13 +1224,13 @@
 au BufNewFile,BufRead .procmail,.procmailrc	setf procmail
 
 " Progress or CWEB
-au BufNewFile,BufRead *.w			call filetype#FTprogress_cweb()
+au BufNewFile,BufRead *.w			call dist#ft#FTprogress_cweb()
 
 " Progress or assembly
-au BufNewFile,BufRead *.i			call filetype#FTprogress_asm()
+au BufNewFile,BufRead *.i			call dist#ft#FTprogress_asm()
 
 " Progress or Pascal
-au BufNewFile,BufRead *.p			call filetype#FTprogress_pascal()
+au BufNewFile,BufRead *.p			call dist#ft#FTprogress_pascal()
 
 " Software Distributor Product Specification File (POSIX 1387.2-1995)
 au BufNewFile,BufRead *.psf			setf psf
@@ -1316,7 +1316,7 @@
 endif
 
 " Rexx, Rebol or R
-au BufNewFile,BufRead *.r,*.R				call filetype#FTr()
+au BufNewFile,BufRead *.r,*.R				call dist#ft#FTr()
 
 " Remind
 au BufNewFile,BufRead .reminders,*.remind,*.rem		setf remind
@@ -1412,7 +1412,7 @@
 au BufNewFile,BufRead sendmail.cf		setf sm
 
 " Sendmail .mc files are actually m4.  Could also be MS Message text file.
-au BufNewFile,BufRead *.mc			call filetype#McSetf()
+au BufNewFile,BufRead *.mc			call dist#ft#McSetf()
 
 " Services
 au BufNewFile,BufRead */etc/services		setf services
@@ -1453,23 +1453,23 @@
 
 " Shell scripts (sh, ksh, bash, bash2, csh); Allow .profile_foo etc.
 " Gentoo ebuilds and Arch Linux PKGBUILDs are actually bash scripts
-au BufNewFile,BufRead .bashrc*,bashrc,bash.bashrc,.bash[_-]profile*,.bash[_-]logout*,.bash[_-]aliases*,*.bash,*/{,.}bash[_-]completion{,.d,.sh}{,/*},*.ebuild,*.eclass,PKGBUILD* call filetype#SetFileTypeSH("bash")
-au BufNewFile,BufRead .kshrc*,*.ksh call filetype#SetFileTypeSH("ksh")
-au BufNewFile,BufRead */etc/profile,.profile*,*.sh,*.env call filetype#SetFileTypeSH(getline(1))
+au BufNewFile,BufRead .bashrc*,bashrc,bash.bashrc,.bash[_-]profile*,.bash[_-]logout*,.bash[_-]aliases*,*.bash,*/{,.}bash[_-]completion{,.d,.sh}{,/*},*.ebuild,*.eclass,PKGBUILD* call dist#ft#SetFileTypeSH("bash")
+au BufNewFile,BufRead .kshrc*,*.ksh call dist#ft#SetFileTypeSH("ksh")
+au BufNewFile,BufRead */etc/profile,.profile*,*.sh,*.env call dist#ft#SetFileTypeSH(getline(1))
 
 " Shell script (Arch Linux) or PHP file (Drupal)
 au BufNewFile,BufRead *.install
 	\ if getline(1) =~ '<?php' |
 	\   setf php |
 	\ else |
-	\   call filetype#SetFileTypeSH("bash") |
+	\   call dist#ft#SetFileTypeSH("bash") |
 	\ endif
 
 " tcsh scripts
-au BufNewFile,BufRead .tcshrc*,*.tcsh,tcsh.tcshrc,tcsh.login	call filetype#SetFileTypeShell("tcsh")
+au BufNewFile,BufRead .tcshrc*,*.tcsh,tcsh.tcshrc,tcsh.login	call dist#ft#SetFileTypeShell("tcsh")
 
 " csh scripts, but might also be tcsh scripts (on some systems csh is tcsh)
-au BufNewFile,BufRead .login*,.cshrc*,csh.cshrc,csh.login,csh.logout,*.csh,.alias  call filetype#CSH()
+au BufNewFile,BufRead .login*,.cshrc*,csh.cshrc,csh.login,csh.logout,*.csh,.alias  call dist#ft#CSH()
 
 " Z-Shell script
 au BufNewFile,BufRead .zprofile,*/etc/zprofile,.zfbfmarks  setf zsh
@@ -1540,7 +1540,7 @@
 
 " Snort Configuration
 au BufNewFile,BufRead *.hog,snort.conf,vision.conf	setf hog
-au BufNewFile,BufRead *.rules			call filetype#FTRules()
+au BufNewFile,BufRead *.rules			call dist#ft#FTRules()
 
 " Spec (Linux RPM)
 au BufNewFile,BufRead *.spec			setf spec
@@ -1564,7 +1564,7 @@
 au BufNewFile,BufRead *.tyb,*.typ,*.tyc,*.pkb,*.pks	setf sql
 
 " SQL
-au BufNewFile,BufRead *.sql			call filetype#SQL()
+au BufNewFile,BufRead *.sql			call dist#ft#SQL()
 
 " SQLJ
 au BufNewFile,BufRead *.sqlj			setf sqlj
@@ -1613,7 +1613,7 @@
 
 " Tads (or Nroff or Perl test file)
 au BufNewFile,BufRead *.t
-	\ if !filetype#FTnroff() && !filetype#FTperl() | setf tads | endif
+	\ if !dist#ft#FTnroff() && !dist#ft#FTperl() | setf tads | endif
 
 " Tags
 au BufNewFile,BufRead tags			setf tags
@@ -1642,7 +1642,7 @@
 
 " TeX
 au BufNewFile,BufRead *.latex,*.sty,*.dtx,*.ltx,*.bbl	setf tex
-au BufNewFile,BufRead *.tex			call filetype#FTtex()
+au BufNewFile,BufRead *.tex			call dist#ft#FTtex()
 
 " ConTeXt
 au BufNewFile,BufRead *.mkii,*.mkiv,*.mkvi   setf context
@@ -1740,7 +1740,7 @@
 	\ endif
 
 " Visual Basic (also uses *.bas) or FORM
-au BufNewFile,BufRead *.frm			call filetype#FTVB("form")
+au BufNewFile,BufRead *.frm			call dist#ft#FTVB("form")
 
 " SaxBasic is close to Visual Basic
 au BufNewFile,BufRead *.sba			setf vb
@@ -1830,10 +1830,10 @@
 " Xmath
 au BufNewFile,BufRead *.msc,*.msf		setf xmath
 au BufNewFile,BufRead *.ms
-	\ if !filetype#FTnroff() | setf xmath | endif
+	\ if !dist#ft#FTnroff() | setf xmath | endif
 
 " XML  specific variants: docbk and xbl
-au BufNewFile,BufRead *.xml			call filetype#FTxml()
+au BufNewFile,BufRead *.xml			call dist#ft#FTxml()
 
 " XMI (holding UML models) is also XML
 au BufNewFile,BufRead *.xmi			setf xml
@@ -1876,7 +1876,7 @@
 au BufNewFile,BufRead *.yy,*.yxx,*.y++		setf yacc
 
 " Yacc or racc
-au BufNewFile,BufRead *.y			call filetype#FTy()
+au BufNewFile,BufRead *.y			call dist#ft#FTy()
 
 " Yaml
 au BufNewFile,BufRead *.yaml,*.yml		setf yaml
@@ -1892,9 +1892,9 @@
 " Zope
 "   dtml (zope dynamic template markup language), pt (zope page template),
 "   cpt (zope form controller page template)
-au BufNewFile,BufRead *.dtml,*.pt,*.cpt		call filetype#FThtml()
+au BufNewFile,BufRead *.dtml,*.pt,*.cpt		call dist#ft#FThtml()
 "   zsql (zope sql method)
-au BufNewFile,BufRead *.zsql			call filetype#SQL()
+au BufNewFile,BufRead *.zsql			call dist#ft#SQL()
 
 " Z80 assembler asz80
 au BufNewFile,BufRead *.z8a			setf z8a
@@ -2048,7 +2048,7 @@
 
 " ReDIF
 " Only used when the .rdf file was not detected to be XML.
-au BufRead,BufNewFile *.rdf			call filetype#Redif()
+au BufRead,BufNewFile *.rdf			call dist#ft#Redif()
 
 " Remind
 au BufNewFile,BufRead .reminders*		call s:StarSetf('remind')
diff --git a/runtime/scripts.vim b/runtime/scripts.vim
index 24799c4..18263e2 100644
--- a/runtime/scripts.vim
+++ b/runtime/scripts.vim
@@ -1,7 +1,7 @@
 " Vim support file to detect file types in scripts
 "
 " Maintainer:	Bram Moolenaar <Bram@vim.org>
-" Last change:	2017 Nov 09
+" Last change:	2017 Nov 11
 
 " This file is called by an autocommand for every file that has just been
 " loaded into a buffer.  It checks if the type of file can be recognized by
@@ -66,19 +66,19 @@
 
   " Bourne-like shell scripts: bash bash2 ksh ksh93 sh
   if s:name =~# '^\(bash\d*\|\|ksh\d*\|sh\)\>'
-    call filetype#SetFileTypeSH(s:line1)	" defined in filetype.vim
+    call dist#ft#SetFileTypeSH(s:line1)	" defined in filetype.vim
 
     " csh scripts
   elseif s:name =~# '^csh\>'
     if exists("g:filetype_csh")
-      call filetype#SetFileTypeShell(g:filetype_csh)
+      call dist#ft#SetFileTypeShell(g:filetype_csh)
     else
-      call filetype#SetFileTypeShell("csh")
+      call dist#ft#SetFileTypeShell("csh")
     endif
 
     " tcsh scripts
   elseif s:name =~# '^tcsh\>'
-    call filetype#SetFileTypeShell("tcsh")
+    call dist#ft#SetFileTypeShell("tcsh")
 
     " Z shell scripts
   elseif s:name =~# '^zsh\>'
@@ -185,7 +185,7 @@
 
   " Bourne-like shell scripts: sh ksh bash bash2
   if s:line1 =~# '^:$'
-    call filetype#SetFileTypeSH(s:line1)	" defined in filetype.vim
+    call dist#ft#SetFileTypeSH(s:line1)	" defined in filetype.vim
 
     " Z shell scripts
   elseif s:line1 =~# '^#compdef\>' || s:line1 =~# '^#autoload\>' ||
diff --git a/src/Makefile b/src/Makefile
index eda355a..1cdacf9 100644
--- a/src/Makefile
+++ b/src/Makefile
@@ -2381,8 +2381,8 @@
 # install the help files; first adjust the contents for the final location
 installrtbase: $(HELPSOURCE)/vim.1 $(DEST_VIM) $(DEST_RT) \
 		$(DEST_HELP) $(DEST_PRINT) $(DEST_COL) $(DEST_SYN) $(DEST_IND) \
-		$(DEST_FTP) $(DEST_AUTO) $(DEST_AUTO)/xml $(DEST_PLUG) \
-		$(DEST_TUTOR) $(DEST_SPELL) $(DEST_COMP)
+		$(DEST_FTP) $(DEST_AUTO) $(DEST_AUTO)/dist $(DEST_AUTO)/xml \
+		$(DEST_PLUG) $(DEST_TUTOR) $(DEST_SPELL) $(DEST_COMP)
 	-$(SHELL) ./installman.sh install $(DEST_MAN) "" $(INSTALLMANARGS)
 # Generate the help tags with ":helptags" to handle all languages.
 # Move the distributed tags file aside and restore it, to avoid it being
@@ -2458,6 +2458,8 @@
 # install the standard autoload files
 	cd $(AUTOSOURCE); $(INSTALL_DATA) *.vim README.txt $(DEST_AUTO)
 	cd $(DEST_AUTO); chmod $(HELPMOD) *.vim README.txt
+	cd $(AUTOSOURCE)/dist; $(INSTALL_DATA) *.vim $(DEST_AUTO)/dist
+	cd $(DEST_AUTO)/dist; chmod $(HELPMOD) *.vim
 	cd $(AUTOSOURCE)/xml; $(INSTALL_DATA) *.vim $(DEST_AUTO)/xml
 	cd $(DEST_AUTO)/xml; chmod $(HELPMOD) *.vim
 # install the standard plugin files
@@ -2653,7 +2655,7 @@
 		$(DEST_PRINT) $(DEST_COL) $(DEST_SYN) $(DEST_IND) $(DEST_FTP) \
 		$(DEST_LANG) $(DEST_KMAP) $(DEST_COMP) $(DEST_MACRO) \
 		$(DEST_PACK) $(DEST_TOOLS) $(DEST_TUTOR) $(DEST_SPELL) \
-		$(DEST_AUTO) $(DEST_AUTO)/xml $(DEST_PLUG):
+		$(DEST_AUTO) $(DEST_AUTO)/dist $(DEST_AUTO)/xml $(DEST_PLUG):
 	$(MKDIR_P) $@
 	-chmod $(DIRMOD) $@
 
@@ -2808,9 +2810,11 @@
 	-rm -f $(DEST_PRINT)/*.ps
 	-rmdir $(DEST_HELP) $(DEST_PRINT) $(DEST_COL) $(DEST_SYN) $(DEST_IND)
 	-rm -rf $(DEST_FTP)/*.vim $(DEST_FTP)/README.txt $(DEST_FTP)/logtalk.dict
-	-rm -f $(DEST_AUTO)/*.vim $(DEST_AUTO)/README.txt $(DEST_AUTO)/xml/*.vim
+	-rm -f $(DEST_AUTO)/*.vim $(DEST_AUTO)/README.txt
+	-rm -f $(DEST_AUTO)/dist/*.vim $(DEST_AUTO)/xml/*.vim
 	-rm -f $(DEST_PLUG)/*.vim $(DEST_PLUG)/README.txt
-	-rmdir $(DEST_FTP) $(DEST_AUTO)/xml $(DEST_AUTO) $(DEST_PLUG) $(DEST_RT)
+	-rmdir $(DEST_FTP) $(DEST_AUTO)/dist $(DEST_AUTO)/xml $(DEST_AUTO)
+	-rmdir $(DEST_PLUG) $(DEST_RT)
 #	This will fail when other Vim versions are installed, no worries.
 	-rmdir $(DEST_VIM)
 
diff --git a/src/version.c b/src/version.c
index 65cc66f..8dd7230 100644
--- a/src/version.c
+++ b/src/version.c
@@ -762,6 +762,8 @@
 static int included_patches[] =
 {   /* Add new patch number below this line */
 /**/
+    1285,
+/**/
     1284,
 /**/
     1283,