diff --git a/brian_dashboard_manager/templating/helpers.py b/brian_dashboard_manager/templating/helpers.py
index 2e0089a1b535152a7ad2924b81108b01e5299edd..6426eb71d86c0d0f5d29ecb6b3c836407c3ee010 100644
--- a/brian_dashboard_manager/templating/helpers.py
+++ b/brian_dashboard_manager/templating/helpers.py
@@ -231,11 +231,20 @@ def get_nren_interface_data(services, interfaces, excluded_dashboards):
                 # MDVPN type services don't have data in BRIAN
                 continue
 
+            has_v6_interface = False
+            for interface in _interfaces:
+                if 'addresses' in interface:
+                    for address in interface['addresses']:
+                        if address.find(':') > 0:
+                            has_v6_interface = True
+                            break
+
             dashboard['SERVICES'].append({
                 'measurement': measurement,
                 'title': title,
                 'scid': scid,
-                'sort': (sid[:2], name)
+                'sort': (sid[:2], name),
+                'has_v6': has_v6_interface
             })
 
     def _check_in_aggregate(router, interface):
@@ -486,7 +495,7 @@ def get_panel_fields(panel, panel_type, datasource):
     })
 
 
-def default_interface_panel_generator(gridPos):
+def default_interface_panel_generator(gridPos, ipv6_only=False):
     """
     Helper for generating panel definitions for dashboards.
 
@@ -494,6 +503,7 @@ def default_interface_panel_generator(gridPos):
     panel data and panel type.
 
     :param gridPos: generator for grid positions
+    :param ipv6_only: whether to use IPv6 traffic exclusively or not
 
     :return: function that generates panel definitions
     """
@@ -515,20 +525,29 @@ def default_interface_panel_generator(gridPos):
         result = []
 
         for panel in panels:
-            result.append(get_panel_fields({
-                **panel,
-                **next(gridPos)
-            }, 'traffic', datasource))
-            if panel.get('has_v6', False):
-                result.append(get_panel_fields({
-                    **panel,
-                    **next(gridPos)
-                }, 'IPv6', datasource))
-            if errors:
+            if ipv6_only:
+                if panel.get('has_v6', False):
+                    result.append(get_panel_fields({
+                        **panel,
+                        **next(gridPos)
+                    }, 'IPv6', datasource))
+                else:
+                    continue
+            else:
                 result.append(get_panel_fields({
                     **panel,
                     **next(gridPos)
-                }, 'errors', datasource))
+                }, 'traffic', datasource))
+                if panel.get('has_v6', False):
+                    result.append(get_panel_fields({
+                        **panel,
+                        **next(gridPos)
+                    }, 'IPv6', datasource))
+                if errors:
+                    result.append(get_panel_fields({
+                        **panel,
+                        **next(gridPos)
+                    }, 'errors', datasource))
 
         return result
 
@@ -567,6 +586,7 @@ def get_nren_dashboard_data_single(data, datasource, tag):
         agg_panels = []
 
     panel_gen = default_interface_panel_generator(gridPos)
+    panel_ipv6_gen = default_interface_panel_generator(gridPos, ipv6_only=True)
 
     services_dropdown = create_dropdown_panel('Services', **next(gridPos))
 
@@ -578,6 +598,12 @@ def get_nren_dashboard_data_single(data, datasource, tag):
 
     service_panels = panel_gen(
         sorted(dash['SERVICES'], key=sort_key), datasource)
+
+    services_ipv6_dropdown = create_dropdown_panel('Services - IPv6 Only', **next(gridPos))
+    service_ipv6_panels = panel_ipv6_gen(
+        sorted(dash['SERVICES'], key=sort_key), datasource
+    )
+
     iface_dropdown = create_dropdown_panel('Interfaces', **next(gridPos))
     phys_panels = panel_gen(dash['PHYSICAL'], datasource, True)
 
@@ -590,6 +616,10 @@ def get_nren_dashboard_data_single(data, datasource, tag):
                 'dropdown': services_dropdown,
                 'panels': service_panels,
             },
+            {
+                'dropdown': services_ipv6_dropdown,
+                'panels': service_ipv6_panels
+            },
             {
                 'dropdown': iface_dropdown,
                 'panels': phys_panels,
@@ -769,7 +799,7 @@ def get_aggregate_dashboard_data(title, remotes, datasource, tag):
     ingress and one for egress.
 
     :param title: title for the dashboard
-    :param targets: dictionary of targets for the panels, the key is the
+    :param remotes: dictionary of targets for the panels, the key is the
     remote (usually a customer) and the value is a list of targets
     for that remote. A single target represents how to fetch
     data for one interface.
diff --git a/tox.ini b/tox.ini
index 191e414dfae410b640c79022e6cfeb016b0c2013..dc78bc46551ca55171192633bc42e0c3eaaa935f 100644
--- a/tox.ini
+++ b/tox.ini
@@ -1,5 +1,5 @@
 [tox]
-envlist = py36
+envlist = py38, py311
 
 [flake8]
 exclude = venv,.tox