diff --git a/cmd/jiri/snapshot.go b/cmd/jiri/snapshot.go
index de89012..437cd81 100644
--- a/cmd/jiri/snapshot.go
+++ b/cmd/jiri/snapshot.go
@@ -153,7 +153,7 @@
 func createSnapshot(jirix *jiri.X, snapshotDir, snapshotFile, label string) error {
 	// Create a snapshot that encodes the current state of master
 	// branches for all local projects.
-	if err := project.CreateSnapshot(jirix, snapshotFile); err != nil {
+	if err := project.CreateSnapshot(jirix, snapshotFile, ""); err != nil {
 		return err
 	}
 
diff --git a/cmd/jiri/update.go b/cmd/jiri/update.go
index f87107d..9dccf97 100644
--- a/cmd/jiri/update.go
+++ b/cmd/jiri/update.go
@@ -57,7 +57,7 @@
 	if err := retry.Function(jirix.Context, updateFn, retry.AttemptsOpt(attemptsFlag)); err != nil {
 		return err
 	}
-	if err := project.WriteUpdateHistorySnapshot(jirix); err != nil {
+	if err := project.WriteUpdateHistorySnapshot(jirix, ""); err != nil {
 		return err
 	}
 
diff --git a/project/.api b/project/.api
index 28a5de7..7ce2b0a 100644
--- a/project/.api
+++ b/project/.api
@@ -4,8 +4,7 @@
 pkg project, func BuildTools(*jiri.X, Projects, Tools, string) error
 pkg project, func CheckoutSnapshot(*jiri.X, string, bool) error
 pkg project, func CleanupProjects(*jiri.X, Projects, bool) error
-pkg project, func CreateSnapshot(*jiri.X, string) error
-pkg project, func CurrentManifest(*jiri.X) (*Manifest, error)
+pkg project, func CreateSnapshot(*jiri.X, string, string) error
 pkg project, func CurrentProjectKey(*jiri.X) (ProjectKey, error)
 pkg project, func DataDirPath(*jiri.X, string) (string, error)
 pkg project, func GetProjectStates(*jiri.X, bool) (map[ProjectKey]*ProjectState, error)
@@ -21,7 +20,7 @@
 pkg project, func ProjectFromFile(*jiri.X, string) (*Project, error)
 pkg project, func TransitionBinDir(*jiri.X) error
 pkg project, func UpdateUniverse(*jiri.X, bool) error
-pkg project, func WriteUpdateHistorySnapshot(*jiri.X) error
+pkg project, func WriteUpdateHistorySnapshot(*jiri.X, string) error
 pkg project, method (*Import) ProjectKey() ProjectKey
 pkg project, method (*Manifest) ToBytes() ([]byte, error)
 pkg project, method (*Manifest) ToFile(*jiri.X, string) error
diff --git a/project/project.go b/project/project.go
index dc47bdd..0a59d01 100644
--- a/project/project.go
+++ b/project/project.go
@@ -46,7 +46,7 @@
 	Projects     []Project     `xml:"projects>project"`
 	Tools        []Tool        `xml:"tools>tool"`
 	// SnapshotPath is the relative path to the snapshot file from JIRI_ROOT.
-	// It is only set when running "jiri snapshot checkout <path>".
+	// It is only set when creating a snapshot.
 	SnapshotPath string   `xml:"snapshotpath,attr,omitempty"`
 	XMLName      struct{} `xml:"manifest"`
 }
@@ -591,11 +591,27 @@
 
 // CreateSnapshot creates a manifest that encodes the current state of master
 // branches of all projects and writes this snapshot out to the given file.
-func CreateSnapshot(jirix *jiri.X, path string) error {
+func CreateSnapshot(jirix *jiri.X, file, snapshotPath string) error {
 	jirix.TimerPush("create snapshot")
 	defer jirix.TimerPop()
 
-	manifest := Manifest{}
+	// If snapshotPath is empty, use the file as the path.
+	if snapshotPath == "" {
+		snapshotPath = file
+	}
+
+	// Get a clean, symlink-free, relative path to the snapshot.
+	snapshotPath = filepath.Clean(snapshotPath)
+	if evaledSnapshotPath, err := filepath.EvalSymlinks(snapshotPath); err == nil {
+		snapshotPath = evaledSnapshotPath
+	}
+	if relSnapshotPath, err := filepath.Rel(jirix.Root, snapshotPath); err == nil {
+		snapshotPath = relSnapshotPath
+	}
+
+	manifest := Manifest{
+		SnapshotPath: snapshotPath,
+	}
 
 	// Add all local projects to manifest.
 	localProjects, err := LocalProjects(jirix, FullScan)
@@ -629,7 +645,7 @@
 	for _, tool := range tools {
 		manifest.Tools = append(manifest.Tools, tool)
 	}
-	return manifest.ToFile(jirix, path)
+	return manifest.ToFile(jirix, file)
 }
 
 // CheckoutSnapshot updates project state to the state specified in the given
@@ -651,50 +667,7 @@
 	if err := updateTo(jirix, localProjects, remoteProjects, remoteTools, gc); err != nil {
 		return err
 	}
-	if err := WriteUpdateHistorySnapshot(jirix); err != nil {
-		return err
-	}
-
-	// Get a clean, symlink-free, relative path to the snapshot.
-	snapshotPath := filepath.Clean(snapshot)
-	evaledSnapshotPath, err := filepath.EvalSymlinks(snapshotPath)
-	if err != nil {
-		evaledSnapshotPath = snapshotPath
-
-	}
-	relSnapshotPath, err := filepath.Rel(jirix.Root, evaledSnapshotPath)
-	if err != nil {
-		relSnapshotPath = evaledSnapshotPath
-	}
-	// Write current manifest, including the SnapshotPath.
-	manifest := &Manifest{
-		SnapshotPath: relSnapshotPath,
-		Projects:     remoteProjects.toSlice(),
-		Tools:        remoteTools.toSlice(),
-	}
-	return writeCurrentManifest(jirix, manifest)
-}
-
-// CurrentManifest returns a manifest that identifies the result of
-// the most recent "jiri update" invocation.
-func CurrentManifest(jirix *jiri.X) (*Manifest, error) {
-	filename := filepath.Join(jirix.Root, ".current_manifest")
-	m, err := ManifestFromFile(jirix, filename)
-	if runutil.IsNotExist(err) {
-		fmt.Fprintf(jirix.Stderr(), `WARNING: Could not find %s.
-The contents of this file are stored as metadata in binaries the jiri
-tool builds. To fix this problem, please run "jiri update".
-`, filename)
-		return &Manifest{}, nil
-	}
-	return m, err
-}
-
-// writeCurrentManifest writes the given manifest to a file that
-// stores the result of the most recent "jiri update" invocation.
-func writeCurrentManifest(jirix *jiri.X, manifest *Manifest) error {
-	filename := filepath.Join(jirix.Root, ".current_manifest")
-	return manifest.ToFile(jirix, filename)
+	return WriteUpdateHistorySnapshot(jirix, snapshot)
 }
 
 // CurrentProjectKey gets the key of the current project from the current
@@ -1032,10 +1005,10 @@
 
 // WriteUpdateHistorySnapshot creates a snapshot of the current state of all
 // projects and writes it to the update history directory.
-func WriteUpdateHistorySnapshot(jirix *jiri.X) error {
+func WriteUpdateHistorySnapshot(jirix *jiri.X, snapshotPath string) error {
 	seq := jirix.NewSeq()
 	snapshotFile := filepath.Join(jirix.UpdateHistoryDir(), time.Now().Format(time.RFC3339))
-	if err := CreateSnapshot(jirix, snapshotFile); err != nil {
+	if err := CreateSnapshot(jirix, snapshotFile, snapshotPath); err != nil {
 		return err
 	}
 
@@ -1791,10 +1764,9 @@
 			return err
 		}
 	}
-	manifest := &Manifest{}
 	s := jirix.NewSeq()
 	for _, op := range ops {
-		updateFn := func() error { return op.Run(jirix, manifest) }
+		updateFn := func() error { return op.Run(jirix) }
 		// Always log the output of updateFn, irrespective of
 		// the value of the verbose flag.
 		if err := s.Verbose(true).Call(updateFn, "%v", op).Done(); err != nil {
@@ -1804,10 +1776,7 @@
 	if err := runHooks(jirix, ops); err != nil {
 		return err
 	}
-	if err := applyGitHooks(jirix, ops); err != nil {
-		return err
-	}
-	return writeCurrentManifest(jirix, manifest)
+	return applyGitHooks(jirix, ops)
 }
 
 // runHooks runs all hooks for the given operations.
@@ -1918,39 +1887,6 @@
 	return project.ToFile(jirix, metadataFile)
 }
 
-// addProjectToManifest records the information about the given
-// project in the given manifest. The function is used to create a
-// manifest that records the current state of jiri projects, which
-// can be used to restore this state at some later point.
-//
-// NOTE: The function assumes that the the given project is on a
-// master branch.
-func addProjectToManifest(jirix *jiri.X, manifest *Manifest, project Project) error {
-	if manifest == nil {
-		return nil
-	}
-	// If the project uses relative revision, replace it with an absolute one.
-	switch project.Protocol {
-	case "git":
-		if project.Revision == "HEAD" {
-			revision, err := gitutil.New(jirix.NewSeq(), gitutil.RootDirOpt(project.Path)).CurrentRevision()
-			if err != nil {
-				return err
-			}
-			project.Revision = revision
-		}
-	default:
-		return UnsupportedProtocolErr(project.Protocol)
-	}
-	relPath, err := filepath.Rel(jirix.Root, project.Path)
-	if err != nil {
-		return err
-	}
-	project.Path = relPath
-	manifest.Projects = append(manifest.Projects, project)
-	return nil
-}
-
 // fsUpdates is used to track filesystem updates made by operations.
 // TODO(nlacasse): Currently we only use fsUpdates to track deletions so that
 // jiri can delete and create a project in the same directory in one update.
@@ -1984,7 +1920,7 @@
 	// Root returns the operation's root directory, relative to JIRI_ROOT.
 	Root() string
 	// Run executes the operation.
-	Run(jirix *jiri.X, manifest *Manifest) error
+	Run(jirix *jiri.X) error
 	// String returns a string representation of the operation.
 	String() string
 	// Test checks whether the operation would fail.
@@ -2022,7 +1958,7 @@
 	return "create"
 }
 
-func (op createOperation) Run(jirix *jiri.X, manifest *Manifest) (e error) {
+func (op createOperation) Run(jirix *jiri.X) (e error) {
 	s := jirix.NewSeq()
 
 	path, perm := filepath.Dir(op.destination), os.FileMode(0755)
@@ -2059,10 +1995,7 @@
 		Rename(tmpDir, op.destination).Done(); err != nil {
 		return err
 	}
-	if err := syncProjectMaster(jirix, op.project); err != nil {
-		return err
-	}
-	return addProjectToManifest(jirix, manifest, op.project)
+	return syncProjectMaster(jirix, op.project)
 }
 
 func (op createOperation) String() string {
@@ -2092,7 +2025,7 @@
 func (op deleteOperation) Kind() string {
 	return "delete"
 }
-func (op deleteOperation) Run(jirix *jiri.X, _ *Manifest) error {
+func (op deleteOperation) Run(jirix *jiri.X) error {
 	s := jirix.NewSeq()
 	if op.gc {
 		// Never delete projects with non-master branches, uncommitted
@@ -2154,7 +2087,7 @@
 func (op moveOperation) Kind() string {
 	return "move"
 }
-func (op moveOperation) Run(jirix *jiri.X, manifest *Manifest) error {
+func (op moveOperation) Run(jirix *jiri.X) error {
 	s := jirix.NewSeq()
 	path, perm := filepath.Dir(op.destination), os.FileMode(0755)
 	if err := s.MkdirAll(path, perm).Rename(op.source, op.destination).Done(); err != nil {
@@ -2166,10 +2099,7 @@
 	if err := syncProjectMaster(jirix, op.project); err != nil {
 		return err
 	}
-	if err := writeMetadata(jirix, op.project, op.project.Path); err != nil {
-		return err
-	}
-	return addProjectToManifest(jirix, manifest, op.project)
+	return writeMetadata(jirix, op.project, op.project.Path)
 }
 
 func (op moveOperation) String() string {
@@ -2203,17 +2133,14 @@
 func (op updateOperation) Kind() string {
 	return "update"
 }
-func (op updateOperation) Run(jirix *jiri.X, manifest *Manifest) error {
+func (op updateOperation) Run(jirix *jiri.X) error {
 	if err := reportNonMaster(jirix, op.project); err != nil {
 		return err
 	}
 	if err := syncProjectMaster(jirix, op.project); err != nil {
 		return err
 	}
-	if err := writeMetadata(jirix, op.project, op.project.Path); err != nil {
-		return err
-	}
-	return addProjectToManifest(jirix, manifest, op.project)
+	return writeMetadata(jirix, op.project, op.project.Path)
 }
 
 func (op updateOperation) String() string {
@@ -2234,11 +2161,8 @@
 	return "null"
 }
 
-func (op nullOperation) Run(jirix *jiri.X, manifest *Manifest) error {
-	if err := writeMetadata(jirix, op.project, op.project.Path); err != nil {
-		return err
-	}
-	return addProjectToManifest(jirix, manifest, op.project)
+func (op nullOperation) Run(jirix *jiri.X) error {
+	return writeMetadata(jirix, op.project, op.project.Path)
 }
 
 func (op nullOperation) String() string {
diff --git a/snapshot.go b/snapshot.go
index f990280..21d572d 100644
--- a/snapshot.go
+++ b/snapshot.go
@@ -153,7 +153,7 @@
 func createSnapshot(jirix *jiri.X, snapshotDir, snapshotFile, label string) error {
 	// Create a snapshot that encodes the current state of master
 	// branches for all local projects.
-	if err := project.CreateSnapshot(jirix, snapshotFile); err != nil {
+	if err := project.CreateSnapshot(jirix, snapshotFile, ""); err != nil {
 		return err
 	}
 
diff --git a/update.go b/update.go
index f87107d..9dccf97 100644
--- a/update.go
+++ b/update.go
@@ -57,7 +57,7 @@
 	if err := retry.Function(jirix.Context, updateFn, retry.AttemptsOpt(attemptsFlag)); err != nil {
 		return err
 	}
-	if err := project.WriteUpdateHistorySnapshot(jirix); err != nil {
+	if err := project.WriteUpdateHistorySnapshot(jirix, ""); err != nil {
 		return err
 	}
 
