diff --git a/database/database.go b/database/database.go
index 234a2e6..8e33b0f 100644
--- a/database/database.go
+++ b/database/database.go
@@ -231,9 +231,6 @@
 	return err
 }
 
-// TODO(stephenmw): bgCtx is not necessary anymore.
-var bgCtx = context.Background // replaced by tests
-
 // Put adds the package documentation to the database.
 func (db *Database) Put(pdoc *doc.Package, nextCrawl time.Time, hide bool) error {
 	c := db.Pool.Get()
@@ -298,20 +295,19 @@
 	if err != nil {
 		return err
 	}
-	ctx := bgCtx()
 
 	if score > 0 {
-		if err := db.PutIndex(ctx, pdoc, id, score, n); err != nil {
+		if err := db.PutIndex(db.AppEngineContext, pdoc, id, score, n); err != nil {
 			log.Printf("Cannot put %q in index: %v", pdoc.ImportPath, err)
 		}
 
 		if old != nil {
-			if err := db.updateImportsIndex(c, ctx, old, pdoc); err != nil {
+			if err := db.updateImportsIndex(c, db.AppEngineContext, old, pdoc); err != nil {
 				return err
 			}
 		}
 	} else {
-		if err := deleteIndex(ctx, id); err != nil {
+		if err := deleteIndex(db.AppEngineContext, id); err != nil {
 			return err
 		}
 	}
@@ -382,13 +378,13 @@
 	// For each import change, re-index that package with updated NumImported.
 	// In practice this should not happen often and when it does, the changes are
 	// likely to be a small amount.
-	for p, _ := range changes {
+	for p := range changes {
 		id, n, err := pkgIDAndImportCount(c, p)
 		if err != nil {
 			return err
 		}
 		if id != "" {
-			db.PutIndex(ctx, nil, id, -1, n)
+			db.PutIndex(db.AppEngineContext, nil, id, -1, n)
 		}
 	}
 	return nil
@@ -625,7 +621,6 @@
 	c := db.Pool.Get()
 	defer c.Close()
 
-	ctx := bgCtx()
 	id, err := redis.String(c.Do("HGET", "ids", path))
 	if err == redis.ErrNil {
 		return nil
@@ -633,7 +628,7 @@
 	if err != nil {
 		return err
 	}
-	if err := deleteIndex(ctx, id); err != nil {
+	if err := deleteIndex(db.AppEngineContext, id); err != nil {
 		return err
 	}
 
@@ -1263,11 +1258,9 @@
 }
 
 func (db *Database) Search(ctx context.Context, q string) ([]Package, error) {
-	// TODO(stephenmw): merge ctx with AppEngineContext
 	return searchAE(db.AppEngineContext, q)
 }
 
 func (db *Database) PutIndex(ctx context.Context, pdoc *doc.Package, id string, score float64, importCount int) error {
-	// TODO(stephenmw): merge ctx with AppEngineContext
 	return putIndex(db.AppEngineContext, pdoc, id, score, importCount)
 }
diff --git a/database/database_test.go b/database/database_test.go
index c9d63b3..f8fd70b 100644
--- a/database/database_test.go
+++ b/database/database_test.go
@@ -14,7 +14,6 @@
 	"time"
 
 	"github.com/garyburd/redigo/redis"
-	"golang.org/x/net/context"
 	"google.golang.org/appengine/aetest"
 
 	"github.com/golang/gddo/doc"
@@ -40,7 +39,14 @@
 	if n != 0 || err != nil {
 		t.Errorf("DBSIZE returned %d, %v", n, err)
 	}
-	return &Database{Pool: p}
+
+	ctx, done, err := aetest.NewContext()
+	if err != nil {
+		t.Fatal(err)
+	}
+	defer done()
+
+	return &Database{Pool: p, AppEngineContext: ctx}
 }
 
 func closeDB(db *Database) {
@@ -51,14 +57,6 @@
 
 func TestPutGet(t *testing.T) {
 	var nextCrawl = time.Unix(time.Now().Add(time.Hour).Unix(), 0).UTC()
-	ctx, done, err := aetest.NewContext()
-	if err != nil {
-		t.Fatal(err)
-	}
-	defer done()
-	bgCtx = func() context.Context {
-		return ctx
-	}
 
 	db := newDB(t)
 	defer closeDB(db)
diff --git a/database/indexae_test.go b/database/indexae_test.go
index 42530d7..c1b567a 100644
--- a/database/indexae_test.go
+++ b/database/indexae_test.go
@@ -32,7 +32,7 @@
 	}
 	defer done()
 
-	if err := PutIndex(c, nil, "", 0, 0); err == nil {
+	if err := putIndex(c, nil, "", 0, 0); err == nil {
 		t.Errorf("PutIndex succeeded unexpectedly")
 	}
 }
@@ -44,7 +44,7 @@
 	}
 	defer done()
 
-	if err := PutIndex(c, nil, "12345", -1, 2); err == nil {
+	if err := putIndex(c, nil, "12345", -1, 2); err == nil {
 		t.Errorf("PutIndex succeeded unexpectedly")
 	}
 }
@@ -57,7 +57,7 @@
 	defer done()
 
 	// Put a new package into search index.
-	if err := PutIndex(c, pdoc, "12345", 0.99, 1); err != nil {
+	if err := putIndex(c, pdoc, "12345", 0.99, 1); err != nil {
 		t.Fatal(err)
 	}
 
@@ -84,7 +84,7 @@
 	}
 
 	// Update the import count of the package.
-	if err := PutIndex(c, nil, "12345", -1, 2); err != nil {
+	if err := putIndex(c, nil, "12345", -1, 2); err != nil {
 		t.Fatal(err)
 	}
 	if err := idx.Get(c, "12345", &got); err != nil && err != search.ErrNoSuchDocument {
@@ -109,11 +109,11 @@
 	for i := 2; i < 6; i++ {
 		id += strconv.Itoa(i)
 		pdoc.Synopsis = id
-		if err := PutIndex(c, pdoc, id, math.Pow(0.9, float64(i)), 10*i); err != nil {
+		if err := putIndex(c, pdoc, id, math.Pow(0.9, float64(i)), 10*i); err != nil {
 			t.Fatal(err)
 		}
 	}
-	got, err := Search(c, "test")
+	got, err := searchAE(c, "test")
 	if err != nil {
 		t.Fatal(err)
 	}
