diff --git a/contrib.go b/contrib.go
index 5c4897b..ebc949b 100644
--- a/contrib.go
+++ b/contrib.go
@@ -100,7 +100,7 @@
 		}
 		aliasesFile = filepath.Join(dataDir, aliasesFileName)
 	}
-	bytes, err := jirix.Run().ReadFile(aliasesFile)
+	bytes, err := jirix.NewSeq().ReadFile(aliasesFile)
 	if err != nil {
 		return nil, err
 	}
@@ -149,8 +149,9 @@
 		if len(projects) == 0 {
 			continue
 		}
+
 		for _, project := range projects {
-			if err := jirix.Run().Chdir(project.Path); err != nil {
+			if err := jirix.NewSeq().Chdir(project.Path).Done(); err != nil {
 				return err
 			}
 			switch project.Protocol {
diff --git a/rebuild.go b/rebuild.go
index 608805b..4b65150 100644
--- a/rebuild.go
+++ b/rebuild.go
@@ -35,13 +35,13 @@
 	}
 
 	// Create a temporary directory in which tools will be built.
-	tmpDir, err := jirix.Run().TempDir("", "tmp-jiri-rebuild")
+	tmpDir, err := jirix.NewSeq().TempDir("", "tmp-jiri-rebuild")
 	if err != nil {
 		return fmt.Errorf("TempDir() failed: %v", err)
 	}
 
 	// Make sure we cleanup the temp directory.
-	defer collect.Error(func() error { return jirix.Run().RemoveAll(tmpDir) }, &e)
+	defer collect.Error(func() error { return jirix.NewSeq().RemoveAll(tmpDir).Done() }, &e)
 
 	// Paranoid sanity checking.
 	if _, ok := tools[project.JiriName]; !ok {
diff --git a/snapshot.go b/snapshot.go
index eef6c0c..1ed9255 100644
--- a/snapshot.go
+++ b/snapshot.go
@@ -131,20 +131,21 @@
 	if remoteFlag {
 		dir = jirix.RemoteSnapshotDir()
 	}
-	switch _, err := jirix.Run().Stat(dir); {
+	s := jirix.NewSeq()
+	switch _, err := s.Stat(dir); {
 	case err == nil:
 		return dir, nil
 	case !runutil.IsNotExist(err):
 		return "", err
 	case remoteFlag:
-		if err := jirix.Run().MkdirAll(dir, 0755); err != nil {
+		if err := s.MkdirAll(dir, 0755).Done(); err != nil {
 			return "", err
 		}
 		return dir, nil
 	}
 	// Create a new local snapshot directory.
 	createFn := func() (e error) {
-		if err := jirix.Run().MkdirAll(dir, 0755); err != nil {
+		if err := s.MkdirAll(dir, 0755).Done(); err != nil {
 			return err
 		}
 		if err := jirix.Git().Init(dir); err != nil {
@@ -154,14 +155,14 @@
 		if err != nil {
 			return err
 		}
-		defer collect.Error(func() error { return jirix.Run().Chdir(cwd) }, &e)
-		if err := jirix.Run().Chdir(dir); err != nil {
+		defer collect.Error(func() error { return jirix.NewSeq().Chdir(cwd).Done() }, &e)
+		if err := s.Chdir(dir).Done(); err != nil {
 			return err
 		}
 		return jirix.Git().Commit()
 	}
 	if err := createFn(); err != nil {
-		jirix.Run().RemoveAll(dir)
+		s.RemoveAll(dir)
 		return "", err
 	}
 	return dir, nil
@@ -174,18 +175,15 @@
 		return err
 	}
 
+	s := jirix.NewSeq()
 	// Update the symlink for this snapshot label to point to the
 	// latest snapshot.
 	symlink := filepath.Join(snapshotDir, label)
 	newSymlink := symlink + ".new"
-	if err := jirix.Run().RemoveAll(newSymlink); err != nil {
-		return err
-	}
 	relativeSnapshotPath := strings.TrimPrefix(snapshotFile, snapshotDir+string(os.PathSeparator))
-	if err := jirix.Run().Symlink(relativeSnapshotPath, newSymlink); err != nil {
-		return err
-	}
-	if err := jirix.Run().Rename(newSymlink, symlink); err != nil {
+	if err := s.RemoveAll(newSymlink).
+		Symlink(relativeSnapshotPath, newSymlink).
+		Rename(newSymlink, symlink).Done(); err != nil {
 		return err
 	}
 
@@ -204,8 +202,8 @@
 	if err != nil {
 		return err
 	}
-	defer collect.Error(func() error { return jirix.Run().Chdir(cwd) }, &e)
-	if err := jirix.Run().Chdir(snapshotDir); err != nil {
+	defer collect.Error(func() error { return jirix.NewSeq().Chdir(cwd).Done() }, &e)
+	if err := jirix.NewSeq().Chdir(snapshotDir).Done(); err != nil {
 		return err
 	}
 	relativeSnapshotPath := strings.TrimPrefix(snapshotFile, snapshotDir+string(os.PathSeparator))
@@ -274,7 +272,7 @@
 	failed := false
 	for _, label := range args {
 		labelDir := filepath.Join(snapshotDir, "labels", label)
-		if _, err := jirix.Run().Stat(labelDir); err != nil {
+		if _, err := jirix.NewSeq().Stat(labelDir); err != nil {
 			if !runutil.IsNotExist(err) {
 				return err
 			}
diff --git a/snapshot_test.go b/snapshot_test.go
index 2891b71..8bbcf1a 100644
--- a/snapshot_test.go
+++ b/snapshot_test.go
@@ -18,8 +18,9 @@
 )
 
 func createLabelDir(t *testing.T, jirix *jiri.X, snapshotDir, name string, snapshots []string) {
+	s := jirix.NewSeq()
 	labelDir, perm := filepath.Join(snapshotDir, "labels", name), os.FileMode(0700)
-	if err := jirix.Run().MkdirAll(labelDir, perm); err != nil {
+	if err := s.MkdirAll(labelDir, perm).Done(); err != nil {
 		t.Fatalf("MkdirAll(%v, %v) failed: %v", labelDir, perm, err)
 	}
 	for i, snapshot := range snapshots {
@@ -30,7 +31,7 @@
 		}
 		if i == 0 {
 			symlinkPath := filepath.Join(snapshotDir, name)
-			if err := jirix.Run().Symlink(path, symlinkPath); err != nil {
+			if err := s.Symlink(path, symlinkPath).Done(); err != nil {
 				t.Fatalf("Symlink(%v, %v) failed: %v", path, symlinkPath, err)
 			}
 		}
@@ -132,11 +133,12 @@
 }
 
 func checkReadme(t *testing.T, jirix *jiri.X, project, message string) {
-	if _, err := jirix.Run().Stat(project); err != nil {
+	s := jirix.NewSeq()
+	if _, err := s.Stat(project); err != nil {
 		t.Fatalf("%v", err)
 	}
 	readmeFile := filepath.Join(project, "README")
-	data, err := jirix.Run().ReadFile(readmeFile)
+	data, err := s.ReadFile(readmeFile)
 	if err != nil {
 		t.Fatalf("%v", err)
 	}
@@ -154,16 +156,17 @@
 }
 
 func writeReadme(t *testing.T, jirix *jiri.X, projectDir, message string) {
+	s := jirix.NewSeq()
 	path, perm := filepath.Join(projectDir, "README"), os.FileMode(0644)
-	if err := jirix.Run().WriteFile(path, []byte(message), perm); err != nil {
+	if err := s.WriteFile(path, []byte(message), perm).Done(); err != nil {
 		t.Fatalf("%v", err)
 	}
 	cwd, err := os.Getwd()
 	if err != nil {
 		t.Fatalf("%v", err)
 	}
-	defer jirix.Run().Chdir(cwd)
-	if err := jirix.Run().Chdir(projectDir); err != nil {
+	defer jirix.NewSeq().Chdir(cwd)
+	if err := s.Chdir(projectDir).Done(); err != nil {
 		t.Fatalf("%v", err)
 	}
 	if err := jirix.Git().CommitFile(path, "creating README"); err != nil {
@@ -174,6 +177,7 @@
 func TestCreate(t *testing.T) {
 	fake, cleanup := jiritest.NewFakeJiriRoot(t)
 	defer cleanup()
+	s := fake.X.NewSeq()
 
 	// Setup the initial remote and local projects.
 	numProjects, remoteProjects := 2, []string{}
@@ -210,7 +214,7 @@
 	// Remove the local project repositories.
 	for i, _ := range remoteProjects {
 		localProject := filepath.Join(fake.X.Root, localProjectName(i))
-		if err := fake.X.Run().RemoveAll(localProject); err != nil {
+		if err := s.RemoveAll(localProject).Done(); err != nil {
 			t.Fatalf("%v", err)
 		}
 	}
@@ -240,7 +244,7 @@
 	// Remove the local project repositories.
 	for i, _ := range remoteProjects {
 		localProject := filepath.Join(fake.X.Root, localProjectName(i))
-		if err := fake.X.Run().RemoveAll(localProject); err != nil {
+		if err := s.RemoveAll(localProject).Done(); err != nil {
 			t.Fatalf("%v", err)
 		}
 	}
