diff --git a/runtime/indent/falcon.vim b/runtime/indent/falcon.vim
new file mode 100644
index 0000000..933eb61
--- /dev/null
+++ b/runtime/indent/falcon.vim
@@ -0,0 +1,156 @@
+" Vim indent file
+" Language: Falcon
+" Maintainer: Steven Oliver <oliver.steven@gmail.com>
+" Website: https://steveno@github.com/steveno/falconpl-vim.git
+" Credits: Thanks to the ruby.vim authors, I borrow a lot!
+" Previous Maintainer: Brent A. Fulgham <bfulgham@debian.org>
+" -----------------------------------------------------------
+" GetLatestVimScripts: 2752 1 :AutoInstall: falcon.vim
+
+"======================================
+"       SETUP
+"======================================
+
+" Only load this indent file when no other was loaded.
+if exists("b:did_indent")
+    finish
+endif
+let b:did_indent = 1
+
+setlocal nosmartindent
+
+" Setup indent function and when to use it
+setlocal indentexpr=FalconGetIndent()
+setlocal indentkeys=0{,0},0),0],!^F,o,O,e
+setlocal indentkeys+==~case,=~catch,=~default,=~elif,=~else,=~end,=~\"
+
+" Define the appropriate indent function but only once
+if exists("*FalconGetIndent")
+    finish
+endif
+
+let s:cpo_save = &cpo
+set cpo&vim
+
+"======================================
+"       VARIABLES
+"======================================
+
+" Regex of syntax group names that are strings AND comments
+let s:syng_strcom = '\<falcon\%(String\|StringEscape\|Comment\)\>'
+
+" Regex of syntax group names that are strings
+let s:syng_string = '\<falcon\%(String\|StringEscape\)\>'
+
+" Keywords to indent on
+let s:falcon_indent_keywords = '^\s*\(case\|catch\|class\|enum\|default\|elif\|else' .
+    \ '\|for\|function\|if.*"[^"]*:.*"\|if \(\(:\)\@!.\)*$\|loop\|object\|select' .
+    \ '\|switch\|try\|while\|\w*\s*=\s*\w*([$\)'
+
+" Keywords to deindent on
+let s:falcon_deindent_keywords = '^\s*\(case\|catch\|default\|elif\|else\|end\)'
+
+"======================================
+"       FUNCTIONS
+"======================================
+
+" Check if the character at lnum:col is inside a string
+function s:IsInStringOrComment(lnum, col)
+    return synIDattr(synID(a:lnum, a:col, 1), 'name') =~ s:syng_strcom
+endfunction
+
+"======================================
+"       INDENT ROUTINE
+"======================================
+
+function FalconGetIndent()
+    " Get the line to be indented
+    let cline = getline(v:lnum)
+
+    " Don't reindent comments on first column
+    if cline =~ '^\/\/'
+        return 0
+    endif
+
+    " 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 prevline=getline(lnum)
+    let ind = indent(lnum)
+    let chg = 0
+
+    " If we are in a multi-line string or line-comment, don't do anything
+    if s:IsInStringOrComment(v:lnum, matchend(cline, '^\s*') + 1 )
+        return indent('.')
+    endif
+
+    " If the start of the line equals a double quote, then indent to the
+    " previous lines first double quote
+    if cline =~? '^\s*"'
+        let chg = chg + &sw
+    endif
+
+    " If previous line started with a double quote and this one
+    " doesn't, unindent
+    if prevline =~? '^\s*"' && cline =~? '^\s*'
+        let chg = chg - &sw
+    endif
+
+    " Indent if proper keyword
+    if prevline =~? s:falcon_indent_keywords
+        let chg = &sw
+    " If previous line opened a parenthesis, and did not close it, indent
+    elseif prevline =~ '^.*(\s*[^)]*\((.*)\)*[^)]*$'
+        " Make sure this isn't just a function split between two lines
+        if prevline =~ ',\s*$'
+            return indent(prevnonblank(v:lnum - 1)) + &sw
+        else
+            return match(prevline, '(.*\((.*)\|[^)]\)*.*$') + 1
+        endif
+    elseif prevline =~ '^[^(]*)\s*$'
+        " This line closes a parenthesis. Finds opening.
+        let curr_line = prevnonblank(lnum - 1)
+        while curr_line >= 0
+            let str = getline(curr_line)
+            if str !~ '^.*(\s*[^)]*\((.*)\)*[^)]*$'
+                let curr_line = prevnonblank(curr_line - 1)
+            else
+                break
+            endif
+        endwhile
+        if curr_line < 0
+            return -1
+        endif
+        let ind = indent(curr_line)
+    endif
+
+    " If previous line ends in a semi-colon reset indent to previous
+    " lines setting
+    if prevline =~? ';\s*$' && prevnonblank(prevline) =~? ',\s*$'
+        return chg = chg - (2 * &sw)
+    endif
+
+    " If previous line ended in a comma, indent again
+    if prevline =~? ',\s*$'
+        let chg = chg + &sw
+    endif
+
+    " If previous line ended in a =>, indent again
+    if prevline =~? '=>\s*$'
+        let chg = chg + &sw
+    endif
+
+    " Deindent on proper keywords
+    if cline =~? s:falcon_deindent_keywords
+        let chg = chg - &sw
+    endif
+
+    return ind + chg
+endfunction
+
+" vim: set sw=4 sts=4 et tw=80 :
