diff --git a/gitweb/gitweb.perl b/gitweb/gitweb.perl
index 126cf3c2e2..c9e57f0516 100755
--- a/gitweb/gitweb.perl
+++ b/gitweb/gitweb.perl
@@ -2871,6 +2871,30 @@ sub git_tree {
print "
\n";
print "
\n";
my $alternate = 1;
+ # '..' (top directory) link if possible
+ if (defined $hash_base &&
+ defined $file_name && $file_name =~ m![^/]+$!) {
+ if ($alternate) {
+ print "\n";
+ } else {
+ print "
\n";
+ }
+ $alternate ^= 1;
+
+ my $up = $file_name;
+ $up =~ s!/?[^/]+$!!;
+ undef $up unless $up;
+ # based on git_print_tree_entry
+ print '' . mode_str('040000') . " | \n";
+ print '';
+ print $cgi->a({-href => href(action=>"tree", hash_base=>$hash_base,
+ file_name=>$up)},
+ "..");
+ print " | \n";
+ print " | \n";
+
+ print "
\n";
+ }
foreach my $line (@entries) {
my %t = parse_ls_tree_line($line, -z => 1);