diff --git a/autoload/magit/state.vim b/autoload/magit/state.vim
index 1be452b68c40407bdb18ca4a56d50f7cd5fff415..4f2cbb4dbe981d7d1bdee14964efdf6bcb60dbce 100644
--- a/autoload/magit/state.vim
+++ b/autoload/magit/state.vim
@@ -304,13 +304,31 @@ function! magit#state#set_files_visible(is_visible) dict
 	endfor
 endfunction
 
-" magit#state#get_files: global dict getter function
+" magit#state#get_files: global dict file objects getter function
 " param[in] mode: mode to select, can be 'staged' or 'unstaged'
-" return all files belonging to mode
+" return list of file objects belonging to mode
 function! magit#state#get_files(mode) dict
 	return self.dict[a:mode]
 endfunction
 
+" magit#state#get_filenames: global dict filenames getter function
+" param[in] mode: mode to select, can be 'staged' or 'unstaged'
+" return ordered list of filename strings belonging to mode, modified files
+" first
+function! magit#state#get_filenames(mode) dict
+	let modified = []
+	let others = []
+	for filename in sort(keys(self.dict[a:mode]))
+		let file = self.get_file(a:mode, filename)
+		if ( file.status == 'M' )
+			call add(modified, filename)
+		else
+			call add(others, filename)
+		endif
+	endfor
+	return modified + others
+endfunction
+
 
 " dict: structure containing all diffs
 " It is formatted as follow
@@ -330,6 +348,7 @@ let magit#state#state = {
 			\ 'nb_diff_lines': 0,
 			\ 'get_file': function("magit#state#get_file"),
 			\ 'get_files': function("magit#state#get_files"),
+			\ 'get_filenames': function("magit#state#get_filenames"),
 			\ 'add_file': function("magit#state#add_file"),
 			\ 'set_files_visible': function("magit#state#set_files_visible"),
 			\ 'check_max_lines': function("magit#state#check_max_lines"),
diff --git a/plugin/magit.vim b/plugin/magit.vim
index 87714b059ffeff31bcd088cb973355b759fa3779..765deb596906ad374421051bd0a10f673dc32dca 100644
--- a/plugin/magit.vim
+++ b/plugin/magit.vim
@@ -140,7 +140,7 @@ endfunction
 function! s:mg_display_files(mode, curdir, depth)
 
 	" FIXME: ouch, must store subdirs in more efficient way
-	for filename in sort(keys(s:state.get_files(a:mode)))
+	for filename in s:state.get_filenames(a:mode)
 		let file = s:state.get_file(a:mode, filename, 0)
 		if ( file.depth != a:depth || filename !~ a:curdir . '.*' )
 			continue