diff --git a/dvc/dvcfile.py b/dvc/dvcfile.py
--- a/dvc/dvcfile.py
+++ b/dvc/dvcfile.py
@@ -233,7 +233,11 @@ def remove_stage(self, stage):
 
         logger.debug("Removing '%s' from '%s'", stage.name, self.path)
         del d["stages"][stage.name]
-        dump_yaml(self.path, d)
+
+        if d["stages"]:
+            dump_yaml(self.path, d)
+        else:
+            super().remove()
 
 
 class Lockfile(FileMixin):
@@ -286,7 +290,10 @@ def remove_stage(self, stage):
         logger.debug("Removing '%s' from '%s'", stage.name, self.path)
         del d[stage.name]
 
-        dump_yaml(self.path, d)
+        if d:
+            dump_yaml(self.path, d)
+        else:
+            self.remove()
 
 
 class Dvcfile:

The implementaiton of it seems quite straightforward. May I pick it up?
@nik123 Sure! Thank you so much for looking into it! :pray: 
diff --git a/tests/func/test_dvcfile.py b/tests/func/test_dvcfile.py
--- a/tests/func/test_dvcfile.py
+++ b/tests/func/test_dvcfile.py
@@ -285,6 +285,23 @@ def test_remove_stage_preserves_comment(tmp_dir, dvc, run_copy):
     )
 
 
+def test_remove_stage_removes_dvcfiles_if_no_stages_left(
+    tmp_dir, dvc, run_copy
+):
+    tmp_dir.gen("foo", "foo")
+    run_copy("foo", "bar", name="run_copy")
+
+    dvc_file = Dvcfile(dvc, PIPELINE_FILE)
+
+    assert dvc_file.exists()
+    assert (tmp_dir / PIPELINE_LOCK).exists()
+    assert (tmp_dir / "foo").exists()
+
+    dvc_file.remove_stage(dvc_file.stages["run_copy"])
+    assert not dvc_file.exists()
+    assert not (tmp_dir / PIPELINE_LOCK).exists()
+
+
 def test_dvcfile_dump_preserves_meta(tmp_dir, dvc, run_copy):
     tmp_dir.gen("foo", "foo")
     stage = run_copy("foo", "bar", name="run_copy")

remove: remove dvc.yaml and dvc.lock if they are empty
https://github.com/iterative/dvc/pull/4074#issuecomment-648097445

```
$ cat dvc.lock
{}                                               
$ cat dvc.yaml
stages: {}                                       
```

tests/func/test_dvcfile.py::test_remove_stage_removes_dvcfiles_if_no_stages_left
tests/func/test_dvcfile.py::test_run_load_one_for_multistage tests/func/test_dvcfile.py::test_run_load_one_for_multistage_non_existing tests/func/test_dvcfile.py::test_run_load_one_for_multistage_non_existing_stage_name tests/func/test_dvcfile.py::test_run_load_one_on_single_stage tests/func/test_dvcfile.py::test_has_stage_with_name tests/func/test_dvcfile.py::test_load_all_multistage tests/func/test_dvcfile.py::test_load_all_singlestage tests/func/test_dvcfile.py::test_try_get_single_stage_from_pipeline_file tests/func/test_dvcfile.py::test_stage_collection tests/func/test_dvcfile.py::test_remove_stage tests/func/test_dvcfile.py::test_remove_stage_lockfile tests/func/test_dvcfile.py::test_remove_stage_dvcfiles tests/func/test_dvcfile.py::test_remove_stage_on_lockfile_format_error tests/func/test_dvcfile.py::test_remove_stage_preserves_comment tests/func/test_dvcfile.py::test_dvcfile_dump_preserves_meta tests/func/test_dvcfile.py::test_dvcfile_dump_preserves_comments