diff --git a/brian_dashboard_manager/grafana/provision.py b/brian_dashboard_manager/grafana/provision.py
index 6e784d7a4f8f3f0b3c62ce13c21cb0021c86e997..2bcf558da303a54b1855fd8361aaa55e1ae3ef9d 100644
--- a/brian_dashboard_manager/grafana/provision.py
+++ b/brian_dashboard_manager/grafana/provision.py
@@ -303,18 +303,20 @@ def _provision_interfaces(config, org_config, ds_name, token):
 
     excluded_nrens = org_config['excluded_nrens']
 
-    def excluded(interface):
-        desc = interface['description'].lower()
-        lab = 'lab.office' in interface['router'].lower()
-        to_exclude = any(nren.lower() in desc for nren in excluded_nrens)
-        if not (to_exclude or lab):
-            if 'dashboards_info' not in interface:
-                to_exclude = True
-                logger.info(f'No "dashboards_info" for '
-                            f'{interface["router"]}:{interface["name"]}')
-        return not (to_exclude or lab)
-
-    relevant_interfaces = list(filter(excluded, interfaces))
+    def interfaces_to_keep(interface):
+        dash_info = interface.get('dashboards_info')
+        if dash_info is None:
+            logger.info(f'No "dashboards_info" for '
+                        f'{interface["router"]}:{interface["name"]}')
+            # throw it away
+            return False
+        dashboards = {nren['name'].lower() for nren in dash_info}
+        is_lab_router = 'lab.office' in interface['router'].lower()
+        should_keep = not (is_lab_router or any(
+            nren.lower() in dashboards for nren in excluded_nrens))
+        return should_keep
+
+    relevant_interfaces = list(filter(interfaces_to_keep, interfaces))
     for interface in relevant_interfaces:
         interface['dashboards_info'] = list(filter(
             lambda x: x['name'] != '',
diff --git a/brian_dashboard_manager/templating/helpers.py b/brian_dashboard_manager/templating/helpers.py
index 6f98043061fdf490c393ba9da5d1663e45bfe08f..1b2fd0cc33df4f6e9b0bf9f05adfcf7435a5ee13 100644
--- a/brian_dashboard_manager/templating/helpers.py
+++ b/brian_dashboard_manager/templating/helpers.py
@@ -199,6 +199,7 @@ def get_nren_interface_data(services, interfaces, excluded_dashboards):
             if 'MDVPN' in service['service_type']:
                 # MDVPN type services don't have data in BRIAN
                 continue
+
             title = f'{name} ({sid})'
             dashboard['SERVICES'].append({
                 'measurement': measurement,
@@ -256,6 +257,12 @@ def get_nren_interface_data(services, interfaces, excluded_dashboards):
                 })
 
             result[dashboard_name] = dashboard
+
+    for customer in list(result.keys()):
+        lengths = [len(val) for val in result[customer].values()]
+        if sum(lengths) == 0:
+            # no services/interfaces, so remove it
+            del result[customer]
     return result
 
 
diff --git a/changelog.md b/changelog.md
index a86109fdec8030487cc4dfdf42a6403fecdbcdab..7c31c3019e50d8982859e1dfe55eea5185464c05 100644
--- a/changelog.md
+++ b/changelog.md
@@ -2,6 +2,10 @@
 
 All notable changes to this project will be documented in this file.
 
+## [0.47] - 2023-02-27
+- POL1-653: Changed filtering of excluded_nrens to be based on destination dashboard rather than interface description parsing
+- Changed service-based dashboards code to not provision empty dashboards
+
 ## [0.46] - 2022-12-7
 - POL1-645: Changed NREN aggregate code to not add duplicate interfaces
 
diff --git a/setup.py b/setup.py
index 7b9fafb0dec5baef3d21158dc374504fe77ecc5b..9f4e589fda4a34c0b5c8d411a25cc170857f52b9 100644
--- a/setup.py
+++ b/setup.py
@@ -2,7 +2,7 @@ from setuptools import setup, find_packages
 
 setup(
     name='brian-dashboard-manager',
-    version="0.46",
+    version="0.47",
     author='GEANT',
     author_email='swd@geant.org',
     description='',
diff --git a/tox.ini b/tox.ini
index 0394fae3f9846099fc0e0eae1e6c32bee3888ba0..4210c4fbd48478d94b81e1c91851784950976253 100644
--- a/tox.ini
+++ b/tox.ini
@@ -14,7 +14,7 @@ deps =
 
 commands =
     coverage erase
-    coverage run --source brian_dashboard_manager -m py.test {posargs}
+    coverage run --source brian_dashboard_manager -m pytest {posargs}
     coverage combine
     coverage xml
     coverage html