diff --git a/autoload/airline/extensions/branch.vim b/autoload/airline/extensions/branch.vim
index b85c155f..25ebe0aa 100644
--- a/autoload/airline/extensions/branch.vim
+++ b/autoload/airline/extensions/branch.vim
@@ -26,8 +26,9 @@ let s:vcs_config = {
 \    'exe': 'git',
 \    'cmd': 'git status --porcelain -- ',
 \    'untracked_mark': '??',
-\    'update_branch': 's:update_git_branch',
 \    'exclude': '\.git',
+\    'update_branch': 's:update_git_branch',
+\    'display_branch': 's:display_git_branch',
 \    'branch': '',
 \    'untracked': {},
 \  },
@@ -37,6 +38,7 @@ let s:vcs_config = {
 \    'untracked_mark': '?',
 \    'exclude': '\.hg',
 \    'update_branch': 's:update_hg_branch',
+\    'display_branch': 's:display_hg_branch',
 \    'branch': '',
 \    'untracked': {},
 \  },
@@ -83,7 +85,7 @@ endif
 
 
 " Fugitive special revisions. call '0' "staging" ?
-let s:names = {'0': 'index', '1': 'ancestor', '2':'target', '3':'merged'}
+let s:names = {'0': 'index', '1': 'orig', '2':'fetch', '3':'merge'}
 let s:sha1size = get(g:, 'airline#extensions#branch#sha1_len', 7)
 
 function! s:update_git_branch()
@@ -92,8 +94,11 @@ function! s:update_git_branch()
     return
   endif
 
-  let name = fugitive#head(s:sha1size)
+  let s:vcs_config['git'].branch = fugitive#head(s:sha1size)
+endfunction
 
+function! s:display_git_branch()
+  let name = b:buffer_vcs_config['git'].branch
   try
     let commit = fugitive#buffer().commit()
 
@@ -110,7 +115,7 @@ function! s:update_git_branch()
   catch
   endtry
 
-  let s:vcs_config['git'].branch = name
+  return name
 endfunction
 
 function! s:update_hg_branch()
@@ -144,6 +149,10 @@ function! s:update_hg_branch()
   endif
 endfunction
 
+function! s:display_hg_branch()
+  return b:buffer_vcs_config['mercurial'].branch
+endfunction
+
 function! s:update_branch()
   for vcs in keys(s:vcs_config)
     call {s:vcs_config[vcs].update_branch}()
@@ -216,18 +225,21 @@ function! airline#extensions#branch#head()
   let b:airline_head = ''
   let vcs_priority = get(g:, "airline#extensions#branch#vcs_priority", ["git", "mercurial"])
 
-  let heads = {}
+  let heads = []
   for vcs in vcs_priority
     if !empty(b:buffer_vcs_config[vcs].branch)
-      let heads[vcs] = b:buffer_vcs_config[vcs].branch
+      let heads += [vcs]
     endif
   endfor
 
-  for vcs in keys(heads)
+  for vcs in heads
     if !empty(b:airline_head)
       let b:airline_head .= ' | '
     endif
-    let b:airline_head .= (len(heads) > 1 ? s:vcs_config[vcs].exe .':' : '') . s:format_name(heads[vcs])
+    if len(heads) > 1
+      let b:airline_head .= s:vcs_config[vcs].exe .':'
+    endif
+    let b:airline_head .= s:format_name({s:vcs_config[vcs].display_branch}())
     let b:airline_head .= b:buffer_vcs_config[vcs].untracked
   endfor
 
diff --git a/autoload/airline/extensions/fugitiveline.vim b/autoload/airline/extensions/fugitiveline.vim
index e2fcad72..831f9310 100644
--- a/autoload/airline/extensions/fugitiveline.vim
+++ b/autoload/airline/extensions/fugitiveline.vim
@@ -15,15 +15,21 @@ else
 endif
 
 function! airline#extensions#fugitiveline#bufname()
+  if exists('b:fugitive_name')
+    return b:fugitive_name
+  endif
+
+  let b:fugitive_name = fnamemodify(bufname('%'), s:fmod)
+
   try
     let buffer = fugitive#buffer()
     if buffer.type('blob')
-      return fnamemodify(buffer.repo().translate(buffer.path()), s:fmod)
+      let b:fugitive_name = fnamemodify(buffer.repo().translate(buffer.path()), s:fmod)
     endif
   catch
   endtry
 
-  return fnamemodify(bufname('%'), s:fmod)
+  return b:fugitive_name
 endfunction
 
 function! airline#extensions#fugitiveline#init(ext)
@@ -33,5 +39,7 @@ function! airline#extensions#fugitiveline#init(ext)
   else
     call airline#parts#define_raw('file', '%<%{airline#extensions#fugitiveline#bufname()}%m')
   endif
+  autocmd ShellCmdPost,CmdwinLeave * unlet! b:fugitive_name
+  autocmd User AirlineBeforeRefresh unlet! b:fugitive_name
 endfunction