Updated runtime files.
diff --git a/runtime/indent/erlang.vim b/runtime/indent/erlang.vim
index 416c40e..c11bbeb 100644
--- a/runtime/indent/erlang.vim
+++ b/runtime/indent/erlang.vim
@@ -4,7 +4,7 @@
 " Contributors: Edwin Fine <efine145_nospam01 at usa dot net>
 "               Pawel 'kTT' Salata <rockplayer.pl@gmail.com>
 "               Ricardo Catalinas Jiménez <jimenezrick@gmail.com>
-" Last Update:  2013-Mar-05
+" Last Update:  2013-Jun-01
 " License:      Vim license
 " URL:          https://github.com/hcs42/vim-erlang
 
@@ -1086,62 +1086,74 @@
           endif
         endif
 
-      elseif token == 'end'
-        let [lnum_new, col_new] = s:SearchEndPair(lnum, curr_col)
+      elseif index(['end', ')', ']', '}', '>>'], token) != -1
 
-        if lnum_new == 0
-          return s:IndentError('Matching token for "end" not found',
-                              \token, stack)
-        else
-          if lnum_new != lnum
-            call s:Log('    Tokenize for "end" <<<<')
-            let [lnum, indtokens] = s:TokenizeLine(lnum_new, 'up')
-            call s:Log('    >>>> Tokenize for "end"')
+        " If we can be sure that there is synchronization in the Erlang
+        " syntax, we use searchpair to make the script quicker. Otherwise we
+        " just push the token onto the stack and keep parsing.
+    
+        " No synchronization -> no searchpair optimization
+        if !exists('b:erlang_syntax_synced')
+          call s:Push(stack, token)
+
+        " We don't have searchpair optimization for '>>'
+        elseif token == '>>'
+          call s:Push(stack, token)
+
+        elseif token == 'end'
+          let [lnum_new, col_new] = s:SearchEndPair(lnum, curr_col)
+
+          if lnum_new == 0
+            return s:IndentError('Matching token for "end" not found',
+                                \token, stack)
+          else
+            if lnum_new != lnum
+              call s:Log('    Tokenize for "end" <<<<')
+              let [lnum, indtokens] = s:TokenizeLine(lnum_new, 'up')
+              call s:Log('    >>>> Tokenize for "end"')
+            endif
+
+            let [success, i] = s:GetIndtokenAtCol(indtokens, col_new)
+            if !success | return i | endif
+            let [token, curr_vcol, curr_col] = indtokens[i]
+            call s:Log('    Match for "end" in line ' . lnum_new . ': ' .
+                      \string(indtokens[i]))
           endif
 
-          let [success, i] = s:GetIndtokenAtCol(indtokens, col_new)
-          if !success | return i | endif
-          let [token, curr_vcol, curr_col] = indtokens[i]
-          call s:Log('    Match for "end" in line ' . lnum_new . ': ' .
-                    \string(indtokens[i]))
-        endif
+        else " token is one of the following: ')', ']', '}'
 
-      elseif index([')', ']', '}'], token) != -1
+          call s:Push(stack, token)
 
-        call s:Push(stack, token)
+          " We have to escape '[', because this string will be interpreted as a
+          " regexp
+          let open_paren = (token == ')' ? '(' :
+                           \token == ']' ? '\[' :
+                           \               '{')
 
-        " We have to escape '[', because this string will be interpreted as a
-        " regexp
-        let open_paren = (token == ')' ? '(' :
-                         \token == ']' ? '\[' :
-                         \               '{')
+          let [lnum_new, col_new] = s:SearchPair(lnum, curr_col,
+                                                \open_paren, '', token)
 
-        let [lnum_new, col_new] = s:SearchPair(lnum, curr_col,
-                                              \open_paren, '', token)
+          if lnum_new == 0
+            return s:IndentError('Matching token not found',
+                                \token, stack)
+          else
+            if lnum_new != lnum
+              call s:Log('    Tokenize the opening paren <<<<')
+              let [lnum, indtokens] = s:TokenizeLine(lnum_new, 'up')
+              call s:Log('    >>>>')
+            endif
 
-        if lnum_new == 0
-          return s:IndentError('Matching token not found',
-                              \token, stack)
-        else
-          if lnum_new != lnum
-            call s:Log('    Tokenize the opening paren <<<<')
-            let [lnum, indtokens] = s:TokenizeLine(lnum_new, 'up')
-            call s:Log('    >>>>')
+            let [success, i] = s:GetIndtokenAtCol(indtokens, col_new)
+            if !success | return i | endif
+            let [token, curr_vcol, curr_col] = indtokens[i]
+            call s:Log('    Match in line ' . lnum_new . ': ' .
+                      \string(indtokens[i]))
+
+            " Go back to the beginning of the loop and handle the opening paren
+            continue
           endif
-
-          let [success, i] = s:GetIndtokenAtCol(indtokens, col_new)
-          if !success | return i | endif
-          let [token, curr_vcol, curr_col] = indtokens[i]
-          call s:Log('    Match in line ' . lnum_new . ': ' .
-                    \string(indtokens[i]))
-
-          " Go back to the beginning of the loop and handle the opening paren
-          continue
         endif
 
-      elseif token == '>>'
-        call s:Push(stack, token)
-
       elseif token == ';'
 
         if empty(stack)
@@ -1323,7 +1335,10 @@
 
     let curr_col = len(ml[1])
 
-    if ml[2] == 'end'
+    " If we can be sure that there is synchronization in the Erlang
+    " syntax, we use searchpair to make the script quicker.
+    if ml[2] == 'end' && exists('b:erlang_syntax_synced')
+
       let [lnum, col] = s:SearchEndPair(v:lnum, curr_col)
 
       if lnum == 0