diff --git a/runtime/indent/java.vim b/runtime/indent/java.vim
new file mode 100644
index 0000000..a600c4b
--- /dev/null
+++ b/runtime/indent/java.vim
@@ -0,0 +1,128 @@
+" Vim indent file
+" Language:	Java
+" Maintainer:	Toby Allsopp <toby.allsopp@peace.com>
+" Last Change:	2003 Oct 21
+
+" Only load this indent file when no other was loaded.
+if exists("b:did_indent")
+  finish
+endif
+let b:did_indent = 1
+
+" Indent Java anonymous classes correctly.
+setlocal cinoptions& cinoptions+=j1
+
+" The "extends" and "implements" lines start off with the wrong indent.
+setlocal indentkeys& indentkeys+=0=extends indentkeys+=0=implements
+
+" Set the function to do the work.
+setlocal indentexpr=GetJavaIndent()
+
+" Only define the function once.
+if exists("*GetJavaIndent")
+  finish
+endif
+
+function! SkipJavaBlanksAndComments(startline)
+  let lnum = a:startline
+  while lnum > 1
+    let lnum = prevnonblank(lnum)
+    if getline(lnum) =~ '\*/\s*$'
+      while getline(lnum) !~ '/\*' && lnum > 1
+        let lnum = lnum - 1
+      endwhile
+      if getline(lnum) =~ '^\s*/\*'
+        let lnum = lnum - 1
+      else
+        break
+      endif
+    elseif getline(lnum) =~ '^\s*//'
+      let lnum = lnum - 1
+    else
+      break
+    endif
+  endwhile
+  return lnum
+endfunction
+
+function GetJavaIndent()
+
+  " Java is just like C; use the built-in C indenting and then correct a few
+  " specific cases.
+  let theIndent = cindent(v:lnum)
+
+  " If we're in the middle of a comment then just trust cindent
+  if getline(v:lnum) =~ '^\s*\*'
+    return theIndent
+  endif
+
+  " find start of previous line, in case it was a continuation line
+  let lnum = SkipJavaBlanksAndComments(v:lnum - 1)
+  let prev = lnum
+  while prev > 1
+    let next_prev = SkipJavaBlanksAndComments(prev - 1)
+    if getline(next_prev) !~ ',\s*$'
+      break
+    endif
+    let prev = next_prev
+  endwhile
+
+  " Try to align "throws" lines for methods and "extends" and "implements" for
+  " classes.
+  if getline(v:lnum) =~ '^\s*\(extends\|implements\)\>'
+        \ && getline(lnum) !~ '^\s*\(extends\|implements\)\>'
+    let theIndent = theIndent + &sw
+  endif
+
+  " correct for continuation lines of "throws", "implements" and "extends"
+  let cont_kw = matchstr(getline(prev),
+        \ '^\s*\zs\(throws\|implements\|extends\)\>\ze.*,\s*$')
+  if strlen(cont_kw) > 0
+    let amount = strlen(cont_kw) + 1
+    if getline(lnum) !~ ',\s*$'
+      let theIndent = theIndent - (amount + &sw)
+      if theIndent < 0
+        let theIndent = 0
+      endif
+    elseif prev == lnum
+      let theIndent = theIndent + amount
+      if cont_kw ==# 'throws'
+        let theIndent = theIndent + &sw
+      endif
+    endif
+  elseif getline(prev) =~ '^\s*\(throws\|implements\|extends\)\>'
+        \ && (getline(prev) =~ '{\s*$'
+        \  || getline(v:lnum) =~ '^\s*{\s*$')
+    let theIndent = theIndent - &sw
+  endif
+
+  " When the line starts with a }, try aligning it with the matching {,
+  " skipping over "throws", "extends" and "implements" clauses.
+  if getline(v:lnum) =~ '^\s*}\s*\(//.*\|/\*.*\)\=$'
+    call cursor(v:lnum, 1)
+    silent normal %
+    let lnum = line('.')
+    if lnum < v:lnum
+      while lnum > 1
+        let next_lnum = SkipJavaBlanksAndComments(lnum - 1)
+        if getline(lnum) !~ '^\s*\(throws\|extends\|implements\)\>'
+              \ && getline(next_lnum) !~ ',\s*$'
+          break
+        endif
+        let lnum = prevnonblank(next_lnum)
+      endwhile
+      return indent(lnum)
+    endif
+  endif
+
+  " Below a line starting with "}" never indent more.  Needed for a method
+  " below a method with an indented "throws" clause.
+  let lnum = SkipJavaBlanksAndComments(v:lnum - 1)
+  if getline(lnum) =~ '^\s*}\s*\(//.*\|/\*.*\)\=$' && indent(lnum) < theIndent
+    let theIndent = indent(lnum)
+  endif
+
+  return theIndent
+endfunction
+
+" vi: sw=2 et
