diff --git a/pygittools/tui/worktree.py b/pygittools/tui/worktree.py
index ccde40b..73f61cd 100644
--- a/pygittools/tui/worktree.py
+++ b/pygittools/tui/worktree.py
@@ -44,9 +44,7 @@ def _index_path(path: str) -> str:
 
 
 def stage_path(repo: Repository, path: str) -> None:
-	index = repo.index
-	index.add(_index_path(path))
-	index.write()
+	stage_paths(repo, [path])
 
 
 def stage_paths(repo: Repository, paths: list[str]) -> None:
@@ -54,7 +52,11 @@ def stage_paths(repo: Repository, paths: list[str]) -> None:
 		return
 	index = repo.index
 	for path in paths:
-		index.add(_index_path(path))
+		status_flags = repo.status().get(path, 0)
+		if status_flags & FileStatus.WT_DELETED:
+			index.remove(path)
+		else:
+			index.add(_index_path(path))
 	index.write()
 
 
diff --git a/pygittools/tui/worktree_test.py b/pygittools/tui/worktree_test.py
index da540a1..10ff96b 100644
--- a/pygittools/tui/worktree_test.py
+++ b/pygittools/tui/worktree_test.py
@@ -77,6 +77,29 @@ def test_stage_paths_accepts_untracked_directory_trailing_slash(repo: Repository
 	assert status["loose.txt"] & FileStatus.INDEX_NEW
 
 
+def test_stage_paths_stages_deleted_files(committed_repo: Repository) -> None:
+	workdir = Path(committed_repo.workdir)
+	(workdir / "tracked.txt").unlink()
+
+	_, unstaged, _ = categorize_status(committed_repo)
+	assert "tracked.txt" in unstaged
+
+	stage_paths(committed_repo, unstaged)
+
+	status = committed_repo.status()
+	assert status["tracked.txt"] & FileStatus.INDEX_DELETED
+
+
+def test_stage_path_stages_deleted_file(committed_repo: Repository) -> None:
+	workdir = Path(committed_repo.workdir)
+	(workdir / "tracked.txt").unlink()
+
+	stage_path(committed_repo, "tracked.txt")
+
+	status = committed_repo.status()
+	assert status["tracked.txt"] & FileStatus.INDEX_DELETED
+
+
 def test_stage_paths_noop_for_empty_list(repo: Repository) -> None:
 	stage_paths(repo, [])
 
