diff --git a/godoc/dl/dl.go b/godoc/dl/dl.go
index d86e784..7c1b15c 100644
--- a/godoc/dl/dl.go
+++ b/godoc/dl/dl.go
@@ -255,44 +255,53 @@
 		if r == nil {
 			return
 		}
-		if r.Stable {
-			// Show all stable versions in the archive
-			archive = append(archive, *r)
-
-			// Show the most two recent major version under "Stable".
-			if len(stable) < 2 {
-				if len(stable) == 0 {
-					// Most recent stable version.
-					stableMaj, stableMin, _ = parseVersion(r.Version)
-				} else if maj, _, _ := parseVersion(r.Version); maj == stableMaj {
-					// Older minor version of most recent major version.
-					return
-				}
-				// Split the file list into primary/other ports for the stable releases.
-				// NOTE(cbro): This is only done for stable releases because maintaining the historical
-				// nature of primary/other ports for older versions is infeasible.
-				// If freebsd is considered primary some time in the future, we'd not want to
-				// mark all of the older freebsd binaries as "primary".
-				// It might be better if we set that as a flag when uploading.
-				r.SplitPortTable = true
-				r.Visible = true // Toggle open all stable releases.
-				stable = append(stable, *r)
-			} else if len(stable) == 1 {
-				// Show the second most recent major version (i.e., security release)
+		if !r.Stable {
+			if len(unstable) != 0 {
+				// Only show one (latest) unstable version.
+				return
 			}
+			maj, min, _ := parseVersion(r.Version)
+			if maj < stableMaj || maj == stableMaj && min <= stableMin {
+				// Display unstable version only if newer than the
+				// latest stable release.
+				return
+			}
+			unstable = append(unstable, *r)
+		}
+
+		// Reports whether the release is the most recent minor version of the
+		// two most recent major versions.
+		shouldAddStable := func() bool {
+			if len(stable) >= 2 {
+				// Show up to two stable versions.
+				return false
+			}
+			if len(stable) == 0 {
+				// Most recent stable version.
+				stableMaj, stableMin, _ = parseVersion(r.Version)
+				return true
+			}
+			if maj, _, _ := parseVersion(r.Version); maj == stableMaj {
+				// Older minor version of most recent major version.
+				return false
+			}
+			// Second most recent stable version.
+			return true
+		}
+		if !shouldAddStable() {
+			archive = append(archive, *r)
 			return
 		}
-		if len(unstable) != 0 {
-			// Only show one (latest) unstable version.
-			return
-		}
-		maj, min, _ := parseVersion(r.Version)
-		if maj < stableMaj || maj == stableMaj && min <= stableMin {
-			// Display unstable version only if newer than the
-			// latest stable release.
-			return
-		}
-		unstable = append(unstable, *r)
+
+		// Split the file list into primary/other ports for the stable releases.
+		// NOTE(cbro): This is only done for stable releases because maintaining the historical
+		// nature of primary/other ports for older versions is infeasible.
+		// If freebsd is considered primary some time in the future, we'd not want to
+		// mark all of the older freebsd binaries as "primary".
+		// It might be better if we set that as a flag when uploading.
+		r.SplitPortTable = true
+		r.Visible = true // Toggle open all stable releases.
+		stable = append(stable, *r)
 	}
 	for _, f := range fs {
 		if r == nil || f.Version != r.Version {
diff --git a/godoc/dl/dl_test.go b/godoc/dl/dl_test.go
index 05d85ad..3f61fe9 100644
--- a/godoc/dl/dl_test.go
+++ b/godoc/dl/dl_test.go
@@ -87,7 +87,7 @@
 		{Version: "go1.5", OS: "windows"},
 		{Version: "go1.5beta1", OS: "windows"},
 	}
-	stable, unstable, all := filesToReleases(fs)
+	stable, unstable, archive := filesToReleases(fs)
 	if got, want := len(stable), 2; want != got {
 		t.Errorf("len(stable): got %v, want %v", got, want)
 	} else {
@@ -101,8 +101,8 @@
 	if got, want := len(unstable), 0; want != got {
 		t.Errorf("len(unstable): got %v, want %v", got, want)
 	}
-	if got, want := len(all), 6; want != got {
-		t.Errorf("len(all): got %v, want %v", got, want)
+	if got, want := len(archive), 4; want != got {
+		t.Errorf("len(archive): got %v, want %v", got, want)
 	}
 }
 
diff --git a/godoc/dl/tmpl.go b/godoc/dl/tmpl.go
index 6683241..7dad392 100644
--- a/godoc/dl/tmpl.go
+++ b/godoc/dl/tmpl.go
@@ -135,13 +135,12 @@
 {{end}}
 
 {{with .Archive}}
-<div class="toggle">
-  <a name="archive"></a>
+<div class="toggle" id="archive">
   <div class="collapsed">
-    <h3 class="toggleButton" title="Click to show versions">All versions▹</h3>
+    <h3 class="toggleButton" title="Click to show versions">Archived versions▹</h3>
   </div>
   <div class="expanded">
-    <h3 class="toggleButton" title="Click to hide versions">All versions▾</h3>
+    <h3 class="toggleButton" title="Click to hide versions">Archived versions▾</h3>
     {{template "releases" .}}
   </div>
 </div>
@@ -218,8 +217,7 @@
 
 {{define "releases"}}
 {{range .}}
-<div class="toggle{{if .Visible}}Visible{{end}}">
-	<a name="{{.Version}}"></a> {{/* NOTE(cbro): versions may show multiple times. Don't use "id". */}}
+<div class="toggle{{if .Visible}}Visible{{end}}" id="{{.Version}}">
 	<div class="collapsed">
 		<h2 class="toggleButton" title="Click to show downloads for this version">{{.Version}} ▹</h2>
 	</div>
diff --git a/godoc/static/godocs.js b/godoc/static/godocs.js
index 4f2ce2c..3472452 100644
--- a/godoc/static/godocs.js
+++ b/godoc/static/godocs.js
@@ -246,7 +246,8 @@
 
 function toggleHash() {
   // Open all of the toggles for a particular hash.
-  var els = $(window.location.hash + ", a[name='" + window.location.hash.substring(1) + "']");
+  var els = $(document.getElementById(window.location.hash.substring(1)),
+      $("a[name='" + window.location.hash.substring(1) + "']"));
   while (els.length) {
     for (var i = 0; i < els.length; i++) {
       var el = $(els[i]);
diff --git a/godoc/static/static.go b/godoc/static/static.go
index 0130f4e..4eff119 100644
--- a/godoc/static/static.go
+++ b/godoc/static/static.go
@@ -816,7 +816,8 @@
 
 function toggleHash() {
   // Open all of the toggles for a particular hash.
-  var els = $(window.location.hash + ", a[name='" + window.location.hash.substring(1) + "']");
+  var els = $(document.getElementById(window.location.hash.substring(1)),
+      $("a[name='" + window.location.hash.substring(1) + "']"));
   while (els.length) {
     for (var i = 0; i < els.length; i++) {
       var el = $(els[i]);
