diff --git a/gitk b/gitk
index e8e0c731f6f..fa1e83c494e 100755
--- a/gitk
+++ b/gitk
@@ -1113,17 +1113,6 @@ proc optimize_rows {row col endrow} {
 	set idlist [lindex $rowidlist $row]
 	set offs [lindex $rowoffsets $row]
 	set haspad 0
-	set downarrowcols {}
-	if {[info exists linesegends($row)]} {
-	    set downarrowcols $linesegends($row)
-	    if {$col > 0} {
-		while {$downarrowcols ne {}} {
-		    set i [lsearch -exact $idlist [lindex $downarrowcols 0]]
-		    if {$i < 0 || $i >= $col} break
-		    set downarrowcols [lrange $downarrowcols 1 end]
-		}
-	    }
-	}
 	for {} {$col < [llength $offs]} {incr col} {
 	    if {[lindex $idlist $col] eq {}} {
 		set haspad 1
@@ -1141,10 +1130,6 @@ proc optimize_rows {row col endrow} {
 		    $y0 > [lindex $idrowranges($id) 0]} {
 		    set isarrow 1
 		}
-	    } elseif {$downarrowcols ne {} &&
-		      [lindex $idlist $col] eq [lindex $downarrowcols 0]} {
-		set downarrowcols [lrange $downarrowcols 1 end]
-		set isarrow 1
 	    }
 	    if {$z < -1 || ($z < 0 && $isarrow)} {
 		set npad [expr {-1 - $z + $isarrow}]
@@ -1258,7 +1243,7 @@ proc linewidth {id} {
 proc drawlineseg {id i} {
     global rowoffsets rowidlist idrowranges
     global displayorder
-    global canv colormap
+    global canv colormap linespc
 
     set startrow [lindex $idrowranges($id) [expr {2 * $i}]]
     set row [lindex $idrowranges($id) [expr {2 * $i + 1}]]
@@ -1306,6 +1291,26 @@ proc drawlineseg {id i} {
     }
     if {[llength $coords] < 4} return
     set last [expr {[llength $idrowranges($id)] / 2 - 1}]
+    if {$i < $last} {
+	# This line has an arrow at the lower end: check if the arrow is
+	# on a diagonal segment, and if so, work around the Tk 8.4
+	# refusal to draw arrows on diagonal lines.
+	set x0 [lindex $coords 0]
+	set x1 [lindex $coords 2]
+	if {$x0 != $x1} {
+	    set y0 [lindex $coords 1]
+	    set y1 [lindex $coords 3]
+	    if {$y0 - $y1 <= 2 * $linespc && $x1 == [lindex $coords 4]} {
+		# we have a nearby vertical segment, just trim off the diag bit
+		set coords [lrange $coords 2 end]
+	    } else {
+		set slope [expr {($x0 - $x1) / ($y0 - $y1)}]
+		set xi [expr {$x0 - $slope * $linespc / 2}]
+		set yi [expr {$y0 - $linespc / 2}]
+		set coords [lreplace $coords 0 1 $xi $y0 $xi $yi]
+	    }
+	}
+    }
     set arrow [expr {2 * ($i > 0) + ($i < $last)}]
     set arrow [lindex {none first last both} $arrow]
     set t [$canv create line $coords -width [linewidth $id] \