diff --git a/internal/frontend/frontend_test.go b/internal/frontend/frontend_test.go
index ff35894..7a7066a 100644
--- a/internal/frontend/frontend_test.go
+++ b/internal/frontend/frontend_test.go
@@ -12,7 +12,6 @@
 
 	"github.com/google/safehtml/template"
 	"golang.org/x/pkgsite/internal"
-	"golang.org/x/pkgsite/internal/middleware"
 	"golang.org/x/pkgsite/internal/postgres"
 	"golang.org/x/pkgsite/internal/proxy/proxytest"
 	"golang.org/x/pkgsite/internal/queue"
@@ -45,13 +44,13 @@
 	docs           []*internal.Documentation
 }
 
-func newTestServer(t *testing.T, proxyModules []*proxytest.Module, cacher Cacher, experimentNames ...string) (*Server, http.Handler, func()) {
+func newTestServer(t *testing.T, proxyModules []*proxytest.Module, cacher Cacher) (*Server, http.Handler, func()) {
 	t.Helper()
 	proxyClient, teardown := proxytest.SetupTestClient(t, proxyModules)
 	sourceClient := source.NewClient(sourceTimeout)
 	ctx := context.Background()
 
-	q := queue.NewInMemory(ctx, 1, experimentNames,
+	q := queue.NewInMemory(ctx, 1, nil,
 		func(ctx context.Context, mpath, version string) (int, error) {
 			return FetchAndUpdateState(ctx, mpath, version, proxyClient, sourceClient, testDB)
 		})
@@ -73,16 +72,7 @@
 	mux := http.NewServeMux()
 	s.Install(mux.Handle, cacher, nil)
 
-	var exps []*internal.Experiment
-	for _, n := range experimentNames {
-		exps = append(exps, &internal.Experiment{Name: n, Rollout: 100})
-	}
-	exp, err := middleware.NewExperimenter(ctx, time.Hour, func(context.Context) ([]*internal.Experiment, error) { return exps, nil }, nil)
-	if err != nil {
-		t.Fatal(err)
-	}
-	mw := middleware.Experiment(exp)
-	return s, mw(mux), func() {
+	return s, mux, func() {
 		teardown()
 		postgres.ResetTestDB(testDB, t)
 	}
diff --git a/internal/frontend/server_test.go b/internal/frontend/server_test.go
index 0bd94a1..d5926dd 100644
--- a/internal/frontend/server_test.go
+++ b/internal/frontend/server_test.go
@@ -30,7 +30,6 @@
 	"golang.org/x/pkgsite/internal"
 	"golang.org/x/pkgsite/internal/cookie"
 	"golang.org/x/pkgsite/internal/derrors"
-	"golang.org/x/pkgsite/internal/experiment"
 	"golang.org/x/pkgsite/internal/middleware"
 	"golang.org/x/pkgsite/internal/postgres"
 	"golang.org/x/pkgsite/internal/testing/htmlcheck"
@@ -62,8 +61,6 @@
 	wantLocation string
 	// if non-nil, call the checker on the HTML root node
 	want htmlcheck.Checker
-	// list of experiments that must be enabled for this test to run
-	requiredExperiments *experiment.Set
 }
 
 // Units with this prefix will be marked as excluded.
@@ -1102,7 +1099,6 @@
 	for _, test := range []struct {
 		name          string
 		testCasesFunc func() []serverTestCase
-		experiments   []string
 	}{
 		{
 			name: "no experiments",
@@ -1114,32 +1110,23 @@
 		},
 	} {
 		t.Run(test.name, func(t *testing.T) {
-			testServer(t, test.testCasesFunc(), test.experiments...)
+			testServer(t, test.testCasesFunc())
 		})
 	}
 }
 
-func testServer(t *testing.T, testCases []serverTestCase, experimentNames ...string) {
+func testServer(t *testing.T, testCases []serverTestCase) {
 	ctx, cancel := context.WithTimeout(context.Background(), testTimeout)
 	defer cancel()
 	defer postgres.ResetTestDB(testDB, t)
 
-	// Experiments need to be set in the context, for DB work, and as a
-	// middleware, for request handling.
-	ctx = experiment.NewContext(ctx, experimentNames...)
 	insertTestModules(ctx, t, testModules)
 	if err := testDB.InsertExcludedPrefix(ctx, excludedModulePath, "testuser", "testreason"); err != nil {
 		t.Fatal(err)
 	}
-	_, handler, _ := newTestServer(t, nil, nil, experimentNames...)
-
-	experimentsSet := experiment.NewSet(experimentNames...)
+	_, handler, _ := newTestServer(t, nil, nil)
 
 	for _, test := range testCases {
-		if !isSubset(test.requiredExperiments, experimentsSet) {
-			continue
-		}
-
 		t.Run(test.name, func(t *testing.T) { // remove initial '/' for name
 			w := httptest.NewRecorder()
 			handler.ServeHTTP(w, httptest.NewRequest("GET", test.urlPath, nil))
@@ -1170,16 +1157,6 @@
 	}
 }
 
-func isSubset(subset, set *experiment.Set) bool {
-	for _, e := range subset.Active() {
-		if !set.IsActive(e) {
-			return false
-		}
-	}
-
-	return true
-}
-
 func TestServerErrors(t *testing.T) {
 	_, handler, _ := newTestServer(t, nil, nil)
 	for _, test := range []struct {
