diff --git a/autoload/magit/state.vim b/autoload/magit/state.vim
index 032416eacd461d1ef8b82abd57206c605157e2a8..cd626db68bcf68f4615d038275bf47bd3cbf8ee1 100644
--- a/autoload/magit/state.vim
+++ b/autoload/magit/state.vim
@@ -199,6 +199,17 @@ function! magit#state#add_file(mode, status, filename, depth) dict
 	endif
 endfunction
 
+function! magit#state#get_files_lines() dict
+	let lines = {}
+	for diff_dict_mode in values(self.dict)
+		for file in values(diff_dict_mode)
+			let lines[file.filename] = magit#sign#get_lines(
+				\ file.sign_start, file.sign_end)
+		endfor
+	endfor
+	return lines
+endfunction
+
 " magit#state#update: update self.dict
 " if a file does not exists anymore (because all its changes have been
 " committed, deleted, discarded), it is removed from g:mg_diff_dict
@@ -284,6 +295,7 @@ let magit#state#state = {
 			\ 'add_file': function("magit#state#add_file"),
 			\ 'set_files_visible': function("magit#state#set_files_visible"),
 			\ 'update': function("magit#state#update"),
+			\ 'get_files_lines': function("magit#state#get_files_lines"),
 			\ 'dict': { 'staged': {}, 'unstaged': {}},
 			\ }
 
diff --git a/autoload/magit/utils.vim b/autoload/magit/utils.vim
index 6be7df154753667583c371fe83f5179291682185..1a0bf63441731433f9364c40be60b83b521ce2c7 100644
--- a/autoload/magit/utils.vim
+++ b/autoload/magit/utils.vim
@@ -173,3 +173,30 @@ endfunction
 function! magit#utils#bufnr()
 	return s:bufnr
 endfunction
+
+function! magit#utils#set_debug()
+	echom "Log into " . g:magit_log_file
+	execute "edit " . g:magit_log_file
+	execute '%delete _'
+	write!
+	let g:magit_debug = 1
+endfunction
+
+function! magit#utils#debug_cmd(cmd)
+	if ( g:magit_debug != 0 )
+		execute "a:cmd"
+	endif
+endfunc
+
+function! magit#utils#debug_log(message)
+	if ( g:magit_debug != 0 )
+		if ( type(a:message) == type("") )
+			let msg = split(a:message, '\n')
+		elseif ( type(a:message) == type({}) )
+			let msg = split(string(a:message), '\n')
+		else
+			let msg = a:message
+		endif
+		call magit#utils#append_file(g:magit_log_file, msg)
+	endif
+endfunction
diff --git a/plugin/magit.vim b/plugin/magit.vim
index 86078177b83b6ed03d983a2e1ba751a413aa58f8..2fbf30f4bbf6b380242e2a12edfc9016bfef8be5 100644
--- a/plugin/magit.vim
+++ b/plugin/magit.vim
@@ -50,6 +50,10 @@ let g:magit_default_fold_level     = get(g:, 'magit_default_fold_level',
 
 let g:magit_warning_max_lines      = get(g:, 'magit_warning_max_lines',         10000)
 
+
+let g:magit_debug                  = get(g:, 'magit_debug',                     1)
+let g:magit_log_file               = get(g:, 'magit_log_file',                  '/tmp/vimagit.log')
+
 execute "nnoremap <silent> " . g:magit_show_magit_mapping . " :call magit#show_magit('v')<cr>"
 " }}}
 
@@ -834,4 +838,8 @@ endfunction
 
 command! Magit call magit#show_magit('v')
 
+command! MagitDebugFilesLines call magit#utils#append_file(g:magit_log_file, magit#utils#flatten(items(s:state.get_files_lines())))
+
+command! MagitDebug call magit#utils#set_debug()
+
 " }}}