diff --git a/brian_dashboard_manager/grafana/dashboard.py b/brian_dashboard_manager/grafana/dashboard.py
index 3ab43d34d96c8bb498e5798ce5f1bb9964df4e14..8deec69f8044bf3aa97d4898c1390c884df34eff 100644
--- a/brian_dashboard_manager/grafana/dashboard.py
+++ b/brian_dashboard_manager/grafana/dashboard.py
@@ -73,26 +73,17 @@ def delete_dashboards(request: TokenRequest):
     return True
 
 
-# lists all dashboards, optionally within a folder
-def list_dashboards(request: TokenRequest, folder_id=None):
-    params = {
-        'query': ''
-    }
-    if folder_id is not None:
-        params['folderIds'] = folder_id
-
-    r = request.get('api/search', params=params)
-    return r
-
-
 # Searches for a dashboard with given title
-def find_dashboard(request: TokenRequest, title=None):
+def find_dashboard(request: TokenRequest, title=None, folder_id=None):
     param = {
         **({'query': title} if title else {}),
         'type': 'dash-db',
         'limit': 5000,
         'page': 1
     }
+    if folder_id is not None:
+        param['folderIds'] = folder_id
+
     r = request.get('api/search', params=param)
     if r and len(r) > 0:
         if title:
diff --git a/brian_dashboard_manager/grafana/folder.py b/brian_dashboard_manager/grafana/folder.py
index 64e6ad46b645d9693a3ea0264e8999fc2c1688b4..fb214ddd9b9a3ed6d449ad355df96cddfc2ef784 100644
--- a/brian_dashboard_manager/grafana/folder.py
+++ b/brian_dashboard_manager/grafana/folder.py
@@ -6,7 +6,7 @@ from brian_dashboard_manager.grafana.utils.request import TokenRequest
 logger = logging.getLogger(__name__)
 
 
-def delete_folder(request: TokenRequest, title, uid=None):
+def delete_folder(request: TokenRequest, title=None, uid=None):
     if uid:
         r = request.delete(f'api/folders/{uid}')
         return r is not None
diff --git a/brian_dashboard_manager/grafana/provision.py b/brian_dashboard_manager/grafana/provision.py
index 7a9bc702a9dfe5c55b18b442efbdb7f3cee4e917..9acd02bed82a8daacb45e037ab1fc3caff4eafac 100644
--- a/brian_dashboard_manager/grafana/provision.py
+++ b/brian_dashboard_manager/grafana/provision.py
@@ -18,12 +18,11 @@ from brian_dashboard_manager.grafana.organization import \
     get_organizations, create_organization, create_api_token, \
     delete_api_token, delete_expired_api_tokens, set_home_dashboard
 from brian_dashboard_manager.grafana.dashboard import find_dashboard, \
-    get_dashboard_definitions, create_dashboard, delete_dashboard, \
-    list_dashboards
+    get_dashboard_definitions, create_dashboard, delete_dashboard
 from brian_dashboard_manager.grafana.datasource import \
     check_provisioned, create_datasource
 from brian_dashboard_manager.grafana.folder import find_folder, \
-    delete_folder
+    delete_folder, get_folders
 from brian_dashboard_manager.inventory_provider.interfaces import \
     get_gws_direct, get_gws_indirect, get_interfaces
 
@@ -309,6 +308,11 @@ def provision(config):
         updated = find_dashboard(token_request) or []
         updated = reduce(get_uid, updated, {})
 
+        # General is a base folder present in Grafana
+        folders_to_keep = ['General', 'Aggregates']
+        folders_to_keep.extend([dash['folder_name']
+                                for dash in dashboards.values()])
+
         def update_dash_list(dashboards):
             for dashboard in dashboards:
                 if isinstance(dashboard, Future):
@@ -452,12 +456,16 @@ def provision(config):
         # get dashboard UIDs from ignored folders
         # and make sure we don't touch them
         for name in ignored_folders:
+            folders_to_keep.append(name)
             logger.info(
                 f'Ignoring dashboards under the folder {org["name"]}/{name}')
             folder = find_folder(token_request, name, create=False)
             if folder is None:
                 continue
-            to_ignore = list_dashboards(token_request, folder['id'])
+            to_ignore = find_dashboard(token_request, folder_id=folder['id'])
+
+            if to_ignore is None:
+                continue
 
             for dash in to_ignore:
                 # mark it updated, so we don't modify it.
@@ -468,6 +476,13 @@ def provision(config):
                 logger.info(f'Deleting stale dashboard with UID {dash}')
                 delete_dashboard(token_request, {'uid': dash})
 
+        all_folders = get_folders(token_request)
+        folders_to_keep = set(folders_to_keep)
+
+        for folder in all_folders:
+            if folder['title'] not in folders_to_keep:
+                delete_folder(token_request, uid=folder['uid'])
+
     logger.info(f'Time to complete: {time.time() - start}')
     for org_id, token in tokens:
         delete_api_token(request, org_id, token)
diff --git a/changelog.md b/changelog.md
index c5374a4daba918e1a42f6fa69d250275b826ef8e..6047e161ec477f8abe959ccee6e0398b5efa5e51 100644
--- a/changelog.md
+++ b/changelog.md
@@ -2,8 +2,11 @@
 
 All notable changes to this project will be documented in this file.
 
+## [0.21] - 2021-09-14
+- Delete left-over and unmanaged folders
+
 ## [0.20] - 2021-09-13
-- Don't automatically create ignored folders, just ignore them if they are present.
+- Don't automatically create ignored folders, just ignore them if they are present
 
 ## [0.19] - 2021-09-13
 - [POL1-501] create config option ignored_folders for provisioning folders with manually maintained dashboards
diff --git a/setup.py b/setup.py
index 1b5e7aa93bf018ba54ba3cc5304acbeeb89dffad..6a02e312571526a640b4214596b6e552760fe747 100644
--- a/setup.py
+++ b/setup.py
@@ -2,7 +2,7 @@ from setuptools import setup, find_packages
 
 setup(
     name='brian-dashboard-manager',
-    version="0.20",
+    version="0.21",
     author='GEANT',
     author_email='swd@geant.org',
     description='',