diff --git a/plugin/magit.vim b/plugin/magit.vim
index b149cebc07036d11e187f13014b26b0633c39e25..910737a5d3afbd9c554bbfce053fb31a5a514ea8 100644
--- a/plugin/magit.vim
+++ b/plugin/magit.vim
@@ -227,6 +227,10 @@ function! s:mg_get_stashes()
 	endif
 endfunction
 
+" b:magit_current_commit_msg: this variable store the current commit message,
+" saving it among refreshes (remember? the whole buffer is wiped at each
+" refresh).
+let b:magit_current_commit_msg = []
 
 " s:mg_get_commit_section: this function writes in current buffer the commit
 " section. It is a commit message, depending on b:magit_current_commit_mode
@@ -241,7 +245,6 @@ function! s:mg_get_commit_section()
 		silent put =g:magit_sections.commit_start
 		call <SID>mg_section_help('commit')
 		silent put =magit#utils#underline(g:magit_sections.commit_start)
-		silent put =''
 
 		let git_dir=magit#git#git_dir()
 		" refresh the COMMIT_EDITMSG file
@@ -257,6 +260,10 @@ function! s:mg_get_commit_section()
 			let commit_msg=magit#utils#join_list(filter(readfile(git_dir . 'COMMIT_EDITMSG'), 'v:val !~ "^' . comment_char . '"'))
 			silent put =commit_msg
 		endif
+		if ( !empty(b:magit_current_commit_msg) )
+			silent put =b:magit_current_commit_msg
+		endif
+		silent put =''
 		silent put =g:magit_sections.commit_end
 	endif
 endfunction
@@ -274,15 +281,20 @@ endfunction
 " (smallest region search)
 " param[in] upperlimit_pattern: regex of upper limit. If start_pattern line is
 " inferior to upper_limit line, block is discarded
+" \param[in] out_of_block: bool, if set it will search out of block
 " return: [startline, endline]
-function! s:mg_search_block(start_pattern, end_pattern, upper_limit_pattern)
+function! s:mg_search_block(start_pattern, end_pattern, upper_limit_pattern,
+			\ ... )
 
+	let out_of_block = a:0 == 1 ? a:1 : 0
 	let upper_limit=0
 	if ( a:upper_limit_pattern != "" )
-		let upper_limit=search(a:upper_limit_pattern, "cbnW")
+		let upper_limit=search(a:upper_limit_pattern, "cbn" .
+					\ out_of_block == 1 ? "" : "W")
 	endif
 
-	let start=search(a:start_pattern[0], "cbnW")
+	let start=search(a:start_pattern[0], "cbn" .
+				\ out_of_block == 1 ? "" : "W")
 	if ( start == 0 || start < upper_limit )
 		throw "out_of_block"
 	endif
@@ -291,7 +303,8 @@ function! s:mg_search_block(start_pattern, end_pattern, upper_limit_pattern)
 	let end=0
 	let min=line('$')
 	for end_p in a:end_pattern
-		let curr_end=search(end_p[0], "nW")
+		let curr_end=search(end_p[0], "n" .
+					\ out_of_block == 1 ? "" : "W")
 		if ( curr_end != 0 && curr_end <= min )
 			let end=curr_end + end_p[1]
 			let min=curr_end
@@ -312,8 +325,8 @@ function! s:mg_get_commit_msg()
 	let commit_jump_line = 2 + <SID>mg_get_inline_help_line_nb('commit')
 	let [start, end] = <SID>mg_search_block(
 				\ [commit_section_pat_start, commit_jump_line],
-				\ [ [commit_section_pat_end, -1] ], "")
-	return getline(start, end)
+				\ [ [commit_section_pat_end, -1] ], "", 1)
+	return filter(getline(start, end), "v:val != ''")
 endfunction
 
 " s:mg_git_commit: commit staged stuff with message prepared in commit section
@@ -532,6 +545,15 @@ function! magit#update_buffer(...)
 		echoerr "Not in magit buffer but in " . buffer_name
 		return
 	endif
+
+	echom "mode " . b:magit_current_commit_mode
+	if ( b:magit_current_commit_mode != '' )
+		try
+			let b:magit_current_commit_msg = s:mg_get_commit_msg()
+		catch /^out_of_block$/
+			let b:magit_current_commit_msg = []
+		endtry
+	endif
 	" FIXME: find a way to save folding state. According to help, this won't
 	" help:
 	" > This does not save fold information.
@@ -567,6 +589,9 @@ function! magit#update_buffer(...)
 		let commit_section_pat_start='^'.g:magit_sections.commit_start.'$'
 		silent! let section_line=search(commit_section_pat_start, "w")
 		silent! call cursor(section_line+2+<SID>mg_get_inline_help_line_nb('commit'), 0)
+		if exists('#User#VimagitEnterCommit')
+			doautocmd User VimagitEnterCommit
+		endif
 	endif
 
 	set filetype=magit
@@ -982,6 +1007,7 @@ function! magit#commit_command(mode)
 			" (.i.e normal or amend), whatever we commit with CC or CA.
 			call <SID>mg_git_commit(b:magit_current_commit_mode)
 			let b:magit_current_commit_mode=''
+			let b:magit_current_commit_msg=[]
 		else
 			let b:magit_current_commit_mode=a:mode
 		endif
@@ -1004,6 +1030,7 @@ function! magit#close_commit()
   endif
 
   let b:magit_current_commit_mode=''
+  let b:magit_current_commit_msg=[]
   call magit#update_buffer()
 endfunction