updated for version 7.1a
diff --git a/runtime/indent/bst.vim b/runtime/indent/bst.vim
new file mode 100644
index 0000000..5933d80
--- /dev/null
+++ b/runtime/indent/bst.vim
@@ -0,0 +1,75 @@
+" Vim indent file
+" Language:	bst
+" Author:	Tim Pope <vimNOSPAM@tpope.info>
+" $Id$
+
+if exists("b:did_indent")
+    finish
+endif
+let b:did_indent = 1
+
+setlocal expandtab
+setlocal indentexpr=GetBstIndent(v:lnum)
+"setlocal smartindent
+setlocal cinkeys&
+setlocal cinkeys-=0#
+setlocal indentkeys&
+"setlocal indentkeys+=0%
+
+" Only define the function once.
+if exists("*GetBstIndent")
+    finish
+endif
+
+function! s:prevgood(lnum)
+    " Find a non-blank line above the current line.
+    " Skip over comments.
+    let lnum = a:lnum
+    while lnum > 0
+        let lnum = prevnonblank(lnum - 1)
+        if getline(lnum) !~ '^\s*%.*$'
+            break
+        endif
+    endwhile
+    return lnum
+endfunction
+
+function! s:strip(lnum)
+    let line = getline(a:lnum)
+    let line = substitute(line,'"[^"]*"','""','g')
+    let line = substitute(line,'%.*','','')
+    let line = substitute(line,'^\s\+','','')
+    return line
+endfunction
+
+function! s:count(string,char)
+    let str = substitute(a:string,'[^'.a:char.']','','g')
+    return strlen(str)
+endfunction
+
+function! GetBstIndent(lnum) abort
+    if a:lnum == 1
+        return 0
+    endif
+    let lnum = s:prevgood(a:lnum)
+    if lnum <= 0
+        return indent(a:lnum - 1)
+    endif
+    let line = s:strip(lnum)
+    let cline = s:strip(a:lnum)
+    if cline =~ '^}' && exists("b:current_syntax")
+        call cursor(a:lnum,indent(a:lnum))
+        if searchpair('{','','}','bW',"synIDattr(synID(line('.'),col('.'),1),'name') =~? 'comment\\|string'")
+            if col('.')+1 == col('$')
+                return indent('.')
+            else
+                return virtcol('.')-1
+            endif
+        endif
+    endif
+    let fakeline = substitute(line,'^}','','').matchstr(cline,'^}')
+    let ind = indent(lnum)
+    let ind = ind + &sw * s:count(line,'{')
+    let ind = ind - &sw * s:count(fakeline,'}')
+    return ind
+endfunction
diff --git a/runtime/indent/cobol.vim b/runtime/indent/cobol.vim
new file mode 100644
index 0000000..9ed8a47
--- /dev/null
+++ b/runtime/indent/cobol.vim
@@ -0,0 +1,216 @@
+" Vim indent file
+" Language:	cobol
+" Author:	Tim Pope <vimNOSPAM@tpope.info>
+" $Id$
+
+if exists("b:did_indent")
+    finish
+endif
+let b:did_indent = 1
+
+setlocal expandtab
+setlocal indentexpr=GetCobolIndent(v:lnum)
+setlocal indentkeys&
+setlocal indentkeys+=0<*>,0/,0$,0=01,=~division,=~section,0=~end,0=~then,0=~else,0=~when,*<Return>,.
+
+" Only define the function once.
+if exists("*GetCobolIndent")
+    finish
+endif
+
+let s:skip = 'getline(".") =~ "^.\\{6\\}[*/$-]\\|\"[^\"]*\""'
+
+function! s:prevgood(lnum)
+    " Find a non-blank line above the current line.
+    " Skip over comments.
+    let lnum = a:lnum
+    while lnum > 0
+        let lnum = prevnonblank(lnum - 1)
+        let line = getline(lnum)
+        if line !~? '^\s*[*/$-]' && line !~? '^.\{6\}[*/$CD-]'
+            break
+        endif
+    endwhile
+    return lnum
+endfunction
+
+function! s:stripped(lnum)
+    return substitute(strpart(getline(a:lnum),0,72),'^\s*','','')
+endfunction
+
+function! s:optionalblock(lnum,ind,blocks,clauses)
+    let ind = a:ind
+    let clauses = '\c\<\%(\<NOT\s\+\)\@<!\%(NOT\s\+\)\=\%('.a:clauses.'\)'
+    let begin = '\c-\@<!\<\%('.a:blocks.'\)\>'
+    let beginfull = begin.'\ze.*\%(\n\%(\s*\%([*/$-].*\)\=\n\)*\)\=\s*\%('.clauses.'\)'
+    let end   = '\c\<end-\%('.a:blocks.'\)\>\|\%(\.\%( \|$\)\)\@='
+    let cline = s:stripped(a:lnum)
+    let line  = s:stripped(s:prevgood(a:lnum))
+    if cline =~? clauses "&& line !~? '^search\>'
+        call cursor(a:lnum,1)
+        let lastclause = searchpair(beginfull,clauses,end,'bWr',s:skip)
+        if getline(lastclause) =~? clauses && s:stripped(lastclause) !~? '^'.begin
+            let ind = indent(lastclause)
+        elseif lastclause > 0
+            let ind = indent(lastclause) + &sw
+            "let ind = ind + &sw
+        endif
+    elseif line =~? clauses && cline !~? end
+        let ind = ind + &sw
+    endif
+    return ind
+endfunction
+
+function! GetCobolIndent(lnum) abort
+    let minshft = 6
+    let ashft = minshft + 1
+    let bshft = ashft + 4
+    " (Obsolete) numbered lines
+    if getline(a:lnum) =~? '^\s*\d\{6\}\%($\|[ */$CD-]\)'
+        return 0
+    endif
+    let cline = s:stripped(a:lnum)
+    " Comments, etc. must start in the 7th column
+    if cline =~? '^[*/$-]'
+        return minshft
+    elseif cline =~# '^[CD]' && indent(a:lnum) == minshft
+        return minshft
+    endif
+    " Divisions, sections, and file descriptions start in area A
+    if cline =~? '\<\(DIVISION\|SECTION\)\%($\|\.\)' || cline =~? '^[FS]D\>'
+        return ashft
+    endif
+    " Fields
+    if cline =~? '^0*\(1\|77\)\>'
+        return ashft
+    endif
+    if cline =~? '^\d\+\>'
+        let cnum = matchstr(cline,'^\d\+\>')
+        let default = 0
+        let step = -1
+        while step < 2
+        let lnum = a:lnum
+        while lnum > 0 && lnum < line('$') && lnum > a:lnum - 500 && lnum < a:lnum + 500
+            let lnum = step > 0 ? nextnonblank(lnum + step) : prevnonblank(lnum + step)
+            let line = getline(lnum)
+            let lindent = indent(lnum)
+            if line =~? '^\s*\d\+\>'
+                let num = matchstr(line,'^\s*\zs\d\+\>')
+                if 0+cnum == num
+                    return lindent
+                elseif 0+cnum > num && default < lindent + &sw
+                    let default = lindent + &sw
+                endif
+            elseif lindent < bshft && lindent >= ashft
+                break
+            endif
+        endwhile
+        let step = step + 2
+        endwhile
+        return default ? default : bshft
+    endif
+    let lnum = s:prevgood(a:lnum)
+    " Hit the start of the file, use "zero" indent.
+    if lnum == 0
+        return ashft
+    endif
+    " Initial spaces are ignored
+    let line = s:stripped(lnum)
+    let ind = indent(lnum)
+    " Paragraphs.  There may be some false positives.
+    if cline =~? '^\(\a[A-Z0-9-]*[A-Z0-9]\|\d[A-Z0-9-]*\a\)\.' "\s*$'
+        if cline !~? '^EXIT\s*\.' && line =~? '\.\s*$'
+            return ashft
+        endif
+    endif
+    " Paragraphs in the identification division.
+    "if cline =~? '^\(PROGRAM-ID\|AUTHOR\|INSTALLATION\|' .
+                "\ 'DATE-WRITTEN\|DATE-COMPILED\|SECURITY\)\>'
+        "return ashft
+    "endif
+    if line =~? '\.$'
+        " XXX
+        return bshft
+    endif
+    if line =~? '^PERFORM\>'
+        let perfline = substitute(line, '\c^PERFORM\s*', "", "")
+        if perfline =~? '^\%(\k\+\s\+TIMES\)\=\s*$'
+            let ind = ind + &sw
+        elseif perfline =~? '^\%(WITH\s\+TEST\|VARYING\|UNTIL\)\>.*[^.]$'
+            let ind = ind + &sw
+        endif
+    endif
+    if line =~? '^\%(IF\|THEN\|ELSE\|READ\|EVALUATE\|SEARCH\|SELECT\)\>'
+        let ind = ind + &sw
+    endif
+    let ind = s:optionalblock(a:lnum,ind,'ADD\|COMPUTE\|DIVIDE\|MULTIPLY\|SUBTRACT','ON\s\+SIZE\s\+ERROR')
+    let ind = s:optionalblock(a:lnum,ind,'STRING\|UNSTRING\|ACCEPT\|DISPLAY\|CALL','ON\s\+OVERFLOW\|ON\s\+EXCEPTION')
+    if cline !~? '^AT\s\+END\>' || line !~? '^SEARCH\>'
+        let ind = s:optionalblock(a:lnum,ind,'DELETE\|REWRITE\|START\|WRITE\|READ','INVALID\s\+KEY\|AT\s\+END\|NO\s\+DATA\|AT\s\+END-OF-PAGE')
+    endif
+    if cline =~? '^WHEN\>'
+        call cursor(a:lnum,1)
+        " We also search for READ so that contained AT ENDs are skipped
+        let lastclause = searchpair('\c-\@<!\<\%(SEARCH\|EVALUATE\|READ\)\>','\c\<\%(WHEN\|AT\s\+END\)\>','\c\<END-\%(SEARCH\|EVALUATE\|READ\)\>','bW',s:skip)
+        let g:foo = s:stripped(lastclause)
+        if s:stripped(lastclause) =~? '\c\<\%(WHEN\|AT\s\+END\)\>'
+            "&& s:stripped(lastclause) !~? '^\%(SEARCH\|EVALUATE\|READ\)\>'
+            let ind = indent(lastclause)
+        elseif lastclause > 0
+            let ind = indent(lastclause) + &sw
+        endif
+    elseif line =~? '^WHEN\>'
+        let ind = ind + &sw
+    endif
+    "I'm not sure why I had this
+    "if line =~? '^ELSE\>-\@!' && line !~? '\.$'
+        "let ind = indent(s:prevgood(lnum))
+    "endif
+    if cline =~? '^\(END\)\>-\@!'
+        " On lines with just END, 'guess' a simple shift left
+        let ind = ind - &sw
+    elseif cline =~? '^\(END-IF\|THEN\|ELSE\)\>-\@!'
+        call cursor(a:lnum,indent(a:lnum))
+        let match = searchpair('\c-\@<!\<IF\>','\c-\@<!\%(THEN\|ELSE\)\>','\c-\@<!\<END-IF\>\zs','bnW',s:skip)
+        if match > 0
+            let ind = indent(match)
+        endif
+    elseif cline =~? '^END-[A-Z]'
+        let beginword = matchstr(cline,'\c\<END-\zs[A-Z0-9-]\+')
+        let endword = 'END-'.beginword
+        let first = 0
+        let suffix = '.*\%(\n\%(\%(\s*\|.\{6\}\)[*/].*\n\)*\)\=\s*'
+        if beginword =~? '^\%(ADD\|COMPUTE\|DIVIDE\|MULTIPLY\|SUBTRACT\)$'
+            let beginword = beginword . suffix . '\<\%(NOT\s\+\)\=ON\s\+SIZE\s\+ERROR'
+            let g:beginword = beginword
+            let first = 1
+        elseif beginword =~? '^\%(STRING\|UNSTRING\)$'
+            let beginword = beginword . suffix . '\<\%(NOT\s\+\)\=ON\s\+OVERFLOW'
+            let first = 1
+        elseif beginword =~? '^\%(ACCEPT\|DISPLAY\)$'
+            let beginword = beginword . suffix . '\<\%(NOT\s\+\)\=ON\s\+EXCEPTION'
+            let first = 1
+        elseif beginword ==? 'CALL'
+            let beginword = beginword . suffix . '\<\%(NOT\s\+\)\=ON\s\+\%(EXCEPTION\|OVERFLOW\)'
+            let first = 1
+        elseif beginword =~? '^\%(DELETE\|REWRITE\|START\|READ\|WRITE\)$'
+            let first = 1
+            let beginword = beginword . suffix . '\<\%(NOT\s\+\)\=\(INVALID\s\+KEY'
+            if beginword =~? '^READ'
+                let first = 0
+                let beginword = beginword . '\|AT\s\+END\|NO\s\+DATA'
+            elseif beginword =~? '^WRITE'
+                let beginword = beginword . '\|AT\s\+END-OF-PAGE'
+            endif
+            let beginword = beginword . '\)'
+        endif
+        call cursor(a:lnum,indent(a:lnum))
+        let match = searchpair('\c-\@<!\<'.beginword.'\>','','\c\<'.endword.'\>\zs','bnW'.(first? 'r' : ''),s:skip)
+        if match > 0
+            let ind = indent(match)
+        elseif cline =~? '^\(END-\(READ\|EVALUATE\|SEARCH\|PERFORM\)\)\>'
+            let ind = ind - &sw
+        endif
+    endif
+    return ind < bshft ? bshft : ind
+endfunction
diff --git a/runtime/indent/fortran.vim b/runtime/indent/fortran.vim
index 94b9da1..7a6b04f 100644
--- a/runtime/indent/fortran.vim
+++ b/runtime/indent/fortran.vim
@@ -2,7 +2,7 @@
 " Language:	Fortran95 (and Fortran90, Fortran77, F and elf90)
 " Version:	0.37
 " URL:		http://www.unb.ca/chem/ajit/indent/fortran.vim
-" Last Change:	2006 Apr. 22
+" Last Change:	2006 Nov 16
 " Maintainer:	Ajit J. Thakkar <ajit@unb.ca>; <http://www.unb.ca/chem/ajit/>
 " Usage:	Do :help fortran-indent from Vim
 
@@ -72,7 +72,7 @@
   let prevstat=substitute(prevline, '!.*$', '', '')
 
   "Indent do loops only if they are all guaranteed to be of do/end do type
-  if exists("b:fortran_do_enddo") || exists("fortran_do_enddo")
+  if exists("b:fortran_do_enddo") || exists("g:fortran_do_enddo")
     if prevstat =~? '^\s*\(\d\+\s\)\=\s*\(\a\w*\s*:\)\=\s*do\>'
       let ind = ind + &sw
     endif
diff --git a/runtime/indent/hamster.vim b/runtime/indent/hamster.vim
new file mode 100644
index 0000000..93e7db4
--- /dev/null
+++ b/runtime/indent/hamster.vim
@@ -0,0 +1,55 @@
+" Vim indent file
+" Language:    Hamster Script 
+" Version:     2.0.6.0
+" Last Change: Wed Nov 08 2006 12:02:42 PM
+" Maintainer:  David Fishburn <fishburn@ianywhere.com>
+
+" Only load this indent file when no other was loaded.
+if exists("b:did_indent")
+  finish
+endif
+let b:did_indent = 1
+
+setlocal indentkeys+==~if,=~else,=~endif,=~endfor,=~endwhile
+setlocal indentkeys+==~do,=~until,=~while,=~repeat,=~for,=~loop
+setlocal indentkeys+==~sub,=~endsub
+
+" Define the appropriate indent function but only once
+setlocal indentexpr=HamGetFreeIndent()
+if exists("*HamGetFreeIndent")
+  finish
+endif
+
+function HamGetIndent(lnum)
+  let ind = indent(a:lnum)
+  let prevline=getline(a:lnum)
+
+  " Add a shiftwidth to statements following if,  else, elseif,
+  " case, select, default, do, until, while, for, start
+  if prevline =~? '^\s*\<\(if\|else\%(if\)\?\|for\|repeat\|do\|while\|sub\)\>' 
+    let ind = ind + &sw
+  endif
+
+  " Subtract a shiftwidth from else, elseif, end(if|while|for), until
+  let line = getline(v:lnum)
+  if line =~? '^\s*\(else\|elseif\|loop\|until\|end\%(if\|while\|for\|sub\)\)\>'
+    let ind = ind - &sw
+  endif
+
+  return ind
+endfunction
+
+function HamGetFreeIndent()
+  " Find the previous non-blank line
+  let lnum = prevnonblank(v:lnum - 1)
+
+  " Use zero indent at the top of the file
+  if lnum == 0
+    return 0
+  endif
+
+  let ind=HamGetIndent(lnum)
+  return ind
+endfunction
+
+" vim:sw=2 tw=80