diff --git a/runtime/indent/php.vim b/runtime/indent/php.vim
index 9f1a1ed..bc196ed 100644
--- a/runtime/indent/php.vim
+++ b/runtime/indent/php.vim
@@ -2,12 +2,13 @@
 " Language:	PHP
 " Author:	John Wellesz <John.wellesz (AT) teaser (DOT) fr>
 " URL:		http://www.2072productions.com/vim/indent/php.vim
-" Last Change:  2008 November 22nd
-" Newsletter:   http://www.2072productions.com/?to=php-indent-for-vim-newsletter.php
-" Version:	1.30
+" Last Change:	2010 Jully 26th
+" Newsletter:	http://www.2072productions.com/?to=php-indent-for-vim-newsletter.php
+" Version:	1.33
 "
 "
-"  If you find a bug, please e-mail me at John.wellesz (AT) teaser (DOT) fr
+"  If you find a bug, please report it on GitHub:
+"	http://github.com/2072/PHP-Indenting-for-VIm/issues
 "  with an example of code that breaks the algorithm.
 "
 "
@@ -15,7 +16,7 @@
 "
 "
 " NOTE: This script must be used with PHP syntax ON and with the php syntax
-"	script by Lutz Eymers (http://www.isp.de/data/php.vim ) or with the
+"	script by Lutz Eymers (http://www.ipdienste.net/data/php.vim ) or with the
 "	script by Peter Hodge (http://www.vim.org/scripts/script.php?script_id=1571 )
 "	the later is bunbdled by default with Vim 7.
 "
@@ -68,8 +69,15 @@
     let b:PHP_autoformatcomment = 1
 endif
 
-if exists("PHP_vintage_case_default_indent")
-    let b:PHP_vintage_case_default_indent = PHP_vintage_case_default_indent
+if exists("PHP_outdentphpescape")
+    let b:PHP_outdentphpescape = PHP_outdentphpescape
+else
+    let b:PHP_outdentphpescape = 1
+endif
+
+
+if exists("PHP_vintage_case_default_indent") && PHP_vintage_case_default_indent
+    let b:PHP_vintage_case_default_indent = 1
 else
     let b:PHP_vintage_case_default_indent = 0
 endif
@@ -108,12 +116,11 @@
 
 if exists("*GetPhpIndent")
     call ResetPhpOptions()
-    finish " XXX
+    finish
 endif
 
 let s:endline= '\s*\%(//.*\|#.*\|/\*.*\*/\s*\)\=$'
 let s:PHP_startindenttag = '<?\%(.*?>\)\@!\|<script[^>]*>\%(.*<\/script>\)\@!'
-"setlocal debug=msg " XXX
 
 
 function! GetLastRealCodeLNum(startline) " {{{
@@ -164,8 +171,8 @@
 	    endif
 
 
-	elseif lastline =~? '^\a\w*;\=$' && lastline !~? s:notPhpHereDoc " XXX 0607
-	    let tofind=substitute( lastline, '\(\a\w*\);\=', '<<<''\\=\1''\\=$', '') " XXX 0607
+	elseif lastline =~? '^\a\w*;\=$' && lastline !~? s:notPhpHereDoc
+	    let tofind=substitute( lastline, '\(\a\w*\);\=', '<<<''\\=\1''\\=$', '')
 	    while getline(lnum) !~? tofind && lnum > 1
 		let lnum = lnum - 1
 	    endwhile
@@ -174,7 +181,7 @@
 	endif
     endwhile
 
-    if lnum==1 && getline(lnum)!~ '<?'
+    if lnum==1 && getline(lnum) !~ '<?'
 	let lnum=0
     endif
 
@@ -198,7 +205,7 @@
    endif
 endfun
 
-function! Skippmatch()  " {{{
+function! Skippmatch()	" {{{
     let synname = synIDattr(synID(line("."), col("."), 0), "name")
     if synname == "Delimiter" || synname == "phpRegionDelimiter" || synname =~# "^phpParent" || synname == "phpArrayParens" || synname =~# '^php\%(Block\|Brace\)' || synname == "javaScriptBraces" || synname =~# "^phpComment" && b:UserIsTypingComment
 	return 0
@@ -243,7 +250,7 @@
 
     if getline(beforeelse) !~# '^\s*if\>' && beforeelse>1 || s:iftoskip && beforeelse>1
 
-	if  s:iftoskip && getline(beforeelse) =~# '^\s*if\>'
+	if s:iftoskip && getline(beforeelse) =~# '^\s*if\>'
 	    let s:iftoskip = s:iftoskip - 1
 	endif
 
@@ -255,6 +262,36 @@
 
 endfunction " }}}
 
+let s:defaultORcase = '^\s*\%(default\|case\).*:'
+
+function! FindTheSwitchIndent (lnum) " {{{
+
+
+    let test = GetLastRealCodeLNum(a:lnum - 1)
+
+    if test <= 1
+	return indent(1) - &sw * b:PHP_vintage_case_default_indent
+    end
+
+    if getline(test) =~ '^\s*}'
+	let test = FindOpenBracket(test)
+
+	if getline(test) =~ '^\s*{'
+	    let test = GetLastRealCodeLNum(GetLastRealCodeLNum(test - 1) - 1)
+	endif
+    endif
+
+    if getline(test) =~# '^\s*switch\>'
+	return indent(test)
+    elseif getline(test) =~# s:defaultORcase
+	return indent(test) - &sw * b:PHP_vintage_case_default_indent
+    else
+	return FindTheSwitchIndent(test)
+    endif
+
+endfunction "}}}
+
+
 function! IslinePHP (lnum, tofind) " {{{
     let cline = getline(a:lnum)
 
@@ -278,7 +315,7 @@
 endfunction " }}}
 
 let s:notPhpHereDoc = '\%(break\|return\|continue\|exit\|else\)'
-let s:blockstart = '\%(\%(\%(}\s*\)\=else\%(\s\+\)\=\)\=if\>\|else\>\|while\>\|switch\>\|for\%(each\)\=\>\|declare\>\|class\>\|interface\>\|abstract\>\|try\>\|catch\>\)'
+let s:blockstart = '\%(\%(\%(}\s*\)\=else\%(\s\+\)\=\)\=if\>\|else\>\|while\>\|switch\>\|case\>\|default\>\|for\%(each\)\=\>\|declare\>\|class\>\|interface\>\|abstract\>\|try\>\|catch\>\)'
 
 let s:autoresetoptions = 0
 if ! s:autoresetoptions
@@ -286,7 +323,7 @@
 endif
 
 function! ResetPhpOptions()
-    if ! b:optionsset && &filetype == "php" 
+    if ! b:optionsset && &filetype == "php"
 	if b:PHP_autoformatcomment
 
 	    setlocal comments=s1:/*,mb:*,ex:*/,://,:#
@@ -324,7 +361,7 @@
     if !b:PHP_indentinghuge && b:PHP_lastindented > b:PHP_indentbeforelast
 	if b:PHP_indentbeforelast
 	    let b:PHP_indentinghuge = 1
-	    echom 'Large indenting detected, speed optimizations engaged (v1.30)'
+	    echom 'Large indenting detected, speed optimizations engaged (v1.33)'
 	endif
 	let b:PHP_indentbeforelast = b:PHP_lastindented
     endif
@@ -383,7 +420,7 @@
 		    let lnum = lnum - 1
 		endwhile
 
-		let b:InPHPcode_tofind = substitute( getline(lnum), '^.*<<<''\=\(\a\w*\)''\=$', '^\\s*\1;\\=$', '') " XXX 0607
+		let b:InPHPcode_tofind = substitute( getline(lnum), '^.*<<<''\=\(\a\w*\)''\=$', '^\\s*\1;\\=$', '')
 	    endif
 	else
 	    let b:InPHPcode = 0
@@ -399,7 +436,7 @@
 
     if b:InPHPcode_tofind!=""
 	if cline =~? b:InPHPcode_tofind
-	    let	b:InPHPcode = 1
+	    let b:InPHPcode = 1
 	    let b:InPHPcode_tofind = ""
 	    let b:UserIsTypingComment = 0
 	    if cline =~ '\*/'
@@ -436,9 +473,9 @@
 		let b:InPHPcode_and_script = 1
 	    endif
 
-	elseif last_line =~? '<<<''\=\a\w*''\=$' " XXX 0607
+	elseif last_line =~? '<<<''\=\a\w*''\=$'
 	    let b:InPHPcode = 0
-	    let b:InPHPcode_tofind = substitute( last_line, '^.*<<<''\=\(\a\w*\)''\=$', '^\\s*\1;\\=$', '') " XXX 0607
+	    let b:InPHPcode_tofind = substitute( last_line, '^.*<<<''\=\(\a\w*\)''\=$', '^\\s*\1;\\=$', '')
 
 	elseif !UserIsEditing && cline =~ '^\s*/\*\%(.*\*/\)\@!' && getline(v:lnum + 1) !~ '^\s*\*'
 	    let b:InPHPcode = 0
@@ -488,15 +525,15 @@
 
 
     " Things always indented at col 1 (PHP delimiter: <?, ?>, Heredoc end) {{{
-    if cline =~# '^\s*<?' && cline !~ '?>'
+    if cline =~# '^\s*<?' && cline !~ '?>' && b:PHP_outdentphpescape
 	return 0
     endif
 
-    if  cline =~ '^\s*?>' && cline !~# '<?'
+    if	cline =~ '^\s*?>' && cline !~# '<?' && b:PHP_outdentphpescape
 	return 0
     endif
 
-    if cline =~? '^\s*\a\w*;$\|^\a\w*$' && cline !~? s:notPhpHereDoc " XXX 0607
+    if cline =~? '^\s*\a\w*;$\|^\a\w*$' && cline !~? s:notPhpHereDoc
 	return 0
     endif " }}}
 
@@ -539,9 +576,8 @@
 	endif
     endif
 
-    let defaultORcase = '^\s*\%(default\|case\).*:'
 
-    if last_line =~ '[;}]'.endline && last_line !~ '^)' && last_line !~# defaultORcase " Added && last_line !~ '^)' on 2007-12-30
+    if last_line =~ '[;}]'.endline && last_line !~ '^)' && last_line !~# s:defaultORcase
 	if ind==b:PHP_default_indenting
 	    return b:PHP_default_indenting
 	elseif b:PHP_indentinghuge && ind==b:PHP_CurrentIndentLevel && cline !~# '^\s*\%(else\|\%(case\|default\).*:\|[})];\=\)' && last_line !~# '^\s*\%(\%(}\s*\)\=else\)' && getline(GetLastRealCodeLNum(lnum - 1))=~';'.endline
@@ -551,13 +587,15 @@
 
     let LastLineClosed = 0
 
-    let terminated = '\%(;\%(\s*?>\)\=\|<<<''\=\a\w*''\=$\|^\s*}\)'.endline " XXX 0607
+    let terminated = '\%(;\%(\s*?>\)\=\|<<<''\=\a\w*''\=$\|^\s*}\)'.endline
 
     let unstated   = '\%(^\s*'.s:blockstart.'.*)\|\%(//.*\)\@<!\<e'.'lse\>\)'.endline
 
     if ind != b:PHP_default_indenting && cline =~# '^\s*else\%(if\)\=\>'
 	let b:PHP_CurrentIndentLevel = b:PHP_default_indenting
 	return indent(FindTheIfOfAnElse(v:lnum, 1))
+    elseif cline =~# s:defaultORcase
+	return FindTheSwitchIndent(v:lnum) + &sw * b:PHP_vintage_case_default_indent
     elseif cline =~ '^\s*)\=\s*{'
 	let previous_line = last_line
 	let last_line_num = lnum
@@ -580,10 +618,10 @@
 	endwhile
 
     elseif last_line =~# unstated && cline !~ '^\s*);\='.endline
-	let ind = ind + &sw " we indent one level further when the preceding line is not stated
+	let ind = ind + &sw
 	return ind
 
-    elseif (ind != b:PHP_default_indenting || last_line =~ '^)' ) && last_line =~ terminated " Added || last_line =~ '^)' on 2007-12-30 (array indenting [rpblem broke other things)
+    elseif (ind != b:PHP_default_indenting || last_line =~ '^)' ) && last_line =~ terminated
 	let previous_line = last_line
 	let last_line_num = lnum
 	let LastLineClosed = 1
@@ -616,7 +654,7 @@
 		let previous_line = getline(last_line_num)
 
 
-		if previous_line =~# defaultORcase.'\|{'.endline
+		if previous_line =~# s:defaultORcase.'\|{'.endline
 		    break
 		endif
 
@@ -636,15 +674,12 @@
 	    let ind = indent(last_match)
 	    let b:PHP_CurrentIndentLevel = b:PHP_default_indenting
 
-	    if cline =~# defaultORcase
-		let ind = ind - &sw
-	    endif
 	    return ind
 	endif
     endif
 
     let plinnum = GetLastRealCodeLNum(lnum - 1)
-    let pline = getline(plinnum)
+    let AntepenultimateLine = getline(plinnum)
 
     let last_line = substitute(last_line,"\\(//\\|#\\)\\(\\(\\([^\"']*\\([\"']\\)[^\"']*\\5\\)\\+[^\"']*$\\)\\|\\([^\"']*$\\)\\)",'','')
 
@@ -658,13 +693,13 @@
     if !LastLineClosed
 
 
-	if last_line =~# '[{(]'.endline || last_line =~? '\h\w*\s*(.*,$' && pline !~ '[,(]'.endline
+	if last_line =~# '[{(]'.endline || last_line =~? '\h\w*\s*(.*,$' && AntepenultimateLine !~ '[,(]'.endline
 
 	    if !b:PHP_BracesAtCodeLevel || last_line !~# '^\s*{'
 		let ind = ind + &sw
 	    endif
 
-	    if b:PHP_BracesAtCodeLevel || b:PHP_vintage_case_default_indent == 1 || cline !~# defaultORcase
+	    if b:PHP_BracesAtCodeLevel || b:PHP_vintage_case_default_indent == 1
 		let b:PHP_CurrentIndentLevel = ind
 
 		return ind
@@ -677,15 +712,13 @@
 	    if openedparent != lnum
 		let ind = indent(openedparent)
 	    endif
+	
 	elseif last_line =~ '^\s*'.s:blockstart
 	    let ind = ind + &sw
 
-	elseif last_line =~# defaultORcase && cline !~# defaultORcase
-	    let ind = ind + &sw
 
 
-	elseif pline =~ '\%(;\%(\s*?>\)\=\|<<<''\=\a\w*''\=$\|^\s*}\|{\)'.endline . '\|' . defaultORcase && cline !~# defaultORcase
-
+	elseif AntepenultimateLine =~ '\%(;\%(\s*?>\)\=\|<<<''\=\a\w*''\=$\|^\s*}\|{\)'.endline . '\|' . s:defaultORcase
 	    let ind = ind + &sw
 	endif
 
@@ -693,9 +726,6 @@
 
     if cline =~  '^\s*);\='
 	let ind = ind - &sw
-    elseif cline =~# defaultORcase && last_line !~# defaultORcase
-	let ind = ind - &sw
-
     endif
 
     let b:PHP_CurrentIndentLevel = ind
