diff --git a/scripts/upgrade_oniro/upgrade_oniro.py b/scripts/upgrade_oniro/upgrade_oniro.py
index 02809f89e5b8f2b7b3d4f4d9e4f1053e9e31ed70..cc8214fe89f95e39ce83d109189e8286f27c1240 100644
--- a/scripts/upgrade_oniro/upgrade_oniro.py
+++ b/scripts/upgrade_oniro/upgrade_oniro.py
@@ -45,6 +45,8 @@
 
 import argparse
 import pathlib
+import tarfile
+import os
 
 script_description = "[WIP] A tool to upgrade to a newer version of Oniro"
 
@@ -58,6 +60,9 @@ conf_directory = pathlib.Path()
 dry_run = False
 store_backup = False
 
+# Global vars
+backup_archive_name = ""
+
 def init_script_options():
     parser = argparse.ArgumentParser(description=script_description)
 
@@ -112,8 +117,7 @@ def backup_oniro():
     # TODO add more verbose log
     from upgrade_oniro_utils import get_manifest_projects
     from datetime import datetime
-    import tarfile
-
+    
     backup_folders = [layer["path"] for layer in get_manifest_projects()] # add all manifest layers
     backup_folders.append(".repo")
     if build_directory.exists():
@@ -121,16 +125,44 @@ def backup_oniro():
             if child.is_dir() and "tmp" not in child.name and child.name != "downloads":
                 backup_folders.append(f"{build_directory.name}/{child.name}")
     
+    # Create a metadata file containing all the folders that have been backed up
+    with open("backup_folders", "w") as f:
+        for folder in backup_folders:
+            f.write(f"{folder}\n")
+
     archive_name = f"upgrade_oniro_backup-{datetime.timestamp(datetime.now())}.tar.gz"
     with tarfile.open(archive_name, "w:gz") as tar_archive:
+        tar_archive.add("backup_folders")
         for folder in backup_folders:
             tar_archive.add(folder)
             print(f"{folder} has been backed up")
     
+    # Remove the uncompressed copy of backup_folders
+    os.remove("backup_folders")
+
+    # Save the name of the backup for later use in the script
+    global backup_archive_name
+    backup_archive_name = archive_name
     return
 
 def restore_oniro():
-    # TODO
+    # TODO implement a way to scan the directory and find the latest backup
+    # TODO add a subcommand to restore oniro from a backup
+    import shutil
+    print(f"Restoring {backup_archive_name}")
+    with tarfile.open(backup_archive_name) as backup_archive:
+        # Extract the metadata file and delete all the old folders
+        backup_folders_file = backup_archive.extract("backup_folders")
+        with open("backup_folders") as bf:
+            for folder in bf.readlines():
+                shutil.rmtree(folder.strip())
+        # Restore the backed up folders
+        backup_archive.extractall(".")
+
+    # Remove the uncompressed copy of backup_folders
+    os.remove("backup_folders")
+
+    print(f"{backup_archive_name} successfully restored!")
     return
 
 def upgrade_oniro():
@@ -142,4 +174,7 @@ if __name__ == "__main__":
     upgrade_tool()
     perform_pre_upgrade_checks()
     backup_oniro()
+    with open("oe-core/test.txt", "w") as f:
+        f.write("sos")
+    restore_oniro()
     upgrade_oniro()
\ No newline at end of file