diff --git a/git-gui b/git-gui
index de67aa2a68e..4aa035a6c45 100755
--- a/git-gui
+++ b/git-gui
@@ -592,16 +592,31 @@ proc fetch_from {remote} {
 	set w [new_console "fetch $remote" \
 		"Fetching new changes from $remote"]
 	set cmd [list git fetch]
-	lappend cmd -v
 	lappend cmd $remote
 	console_exec $w $cmd
 }
 
+proc pull_remote {remote branch} {
+	set w [new_console "pull $remote $branch" \
+		"Pulling new changes from branch $branch in $remote"]
+	set cmd [list git pull]
+	lappend cmd $remote
+	lappend cmd $branch
+	console_exec $w $cmd [list post_pull_remote $remote $branch]
+}
+
+proc post_pull_remote {remote branch success} {
+	if {$success} {
+		update_status "Successfully pulled $branch from $remote."
+	} else {
+		update_status "Conflicts detected while pulling $branch from $remote."
+	}
+}
+
 proc push_to {remote} {
 	set w [new_console "push $remote" \
 		"Pushing changes to $remote"]
 	set cmd [list git push]
-	lappend -v
 	lappend cmd $remote
 	console_exec $w $cmd
 }
@@ -829,7 +844,7 @@ proc load_all_remotes {} {
 }
 
 proc populate_remote_menu {m pfx op} {
-	global gitdir all_remotes mainfont
+	global all_remotes mainfont
 
 	foreach remote $all_remotes {
 		$m add command -label "$pfx $remote..." \
@@ -838,6 +853,40 @@ proc populate_remote_menu {m pfx op} {
 	}
 }
 
+proc populate_pull_menu {m} {
+	global gitdir repo_config all_remotes mainfont
+
+	foreach remote $all_remotes {
+		set rb {}
+		if {[array get repo_config remote.$remote.url] != {}} {
+			if {[array get repo_config remote.$remote.fetch] != {}} {
+				regexp {^([^:]+):} \
+					[lindex $repo_config(remote.$remote.fetch) 0] \
+					line rb
+			}
+		} else {
+			catch {
+				set fd [open [file join $gitdir remotes $remote] r]
+				while {[gets $fd line] >= 0} {
+					if {[regexp {^Pull:[ \t]*([^:]+):} $line line rb]} {
+						break
+					}
+				}
+				close $fd
+			}
+		}
+
+		set rb_short $rb
+		regsub ^refs/heads/ $rb {} rb_short
+		if {$rb_short != {}} {
+			$m add command \
+				-label "Branch $rb_short from $remote..." \
+				-command [list pull_remote $remote $rb] \
+				-font $mainfont
+		}
+	}
+}
+
 ######################################################################
 ##
 ## icons
@@ -966,7 +1015,9 @@ proc show_msg {w top msg} {
 	pack $w.ok -side bottom
 	bind $top <Visibility> "grab $top; focus $top"
 	bind $top <Key-Return> "destroy $top"
-	wm title $top "error: $appname ([file normalize [file dirname $gitdir]])"
+	wm title $w "$appname ([lindex [file split \
+		[file normalize [file dirname $gitdir]]] \
+		end]): error"
 	tkwait window $top
 }
 
@@ -1011,7 +1062,9 @@ proc hook_failed_popup {hook msg} {
 
 	bind $w <Visibility> "grab $w; focus $w"
 	bind $w <Key-Return> "destroy $w"
-	wm title $w "error: $appname ([file normalize [file dirname $gitdir]])"
+	wm title $w "$appname ([lindex [file split \
+		[file normalize [file dirname $gitdir]]] \
+		end]): error"
 	tkwait window $w
 }
 
@@ -1060,11 +1113,13 @@ proc console_init {w} {
 	pack $w.ok -side bottom
 
 	bind $w <Visibility> "focus $w"
-	wm title $w "$appname ([file dirname [file normalize [file dirname $gitdir]]]): [lindex $console_data($w) 0]"
+	wm title $w "$appname ([lindex [file split \
+		[file normalize [file dirname $gitdir]]] \
+		end]): [lindex $console_data($w) 0]"
 	return $w
 }
 
-proc console_exec {w cmd} {
+proc console_exec {w cmd {after {}}} {
 	global tcl_platform
 
 	# -- Windows tosses the enviroment when we exec our child.
@@ -1081,10 +1136,10 @@ proc console_exec {w cmd} {
 
 	set fd_f [open $cmd r]
 	fconfigure $fd_f -blocking 0 -translation binary
-	fileevent $fd_f readable [list console_read $w $fd_f]
+	fileevent $fd_f readable [list console_read $w $fd_f $after]
 }
 
-proc console_read {w fd} {
+proc console_read {w fd after} {
 	global console_cr console_data
 
 	set buf [read $fd]
@@ -1123,13 +1178,18 @@ proc console_read {w fd} {
 			$w.m.s conf -background red -text {Error: Command Failed}
 			$w.ok conf -text Close
 			$w.ok conf -state normal
+			set ok 0
 		} elseif {[winfo exists $w]} {
 			$w.m.s conf -background green -text {Success}
 			$w.ok conf -text Close
 			$w.ok conf -state normal
+			set ok 1
 		}
 		array unset console_cr $w
 		array unset console_data $w
+		if {$after != {}} {
+			uplevel #0 $after $ok
+		}
 		return
 	}
 	fconfigure $fd -blocking 0
@@ -1558,4 +1618,5 @@ load_repo_config
 load_all_remotes
 populate_remote_menu .mbar.fetch From fetch_from
 populate_remote_menu .mbar.push To push_to
+populate_pull_menu .mbar.pull
 update_status