diff --git a/src/backoffice/locale/de/LC_MESSAGES/django.po b/src/backoffice/locale/de/LC_MESSAGES/django.po
index aa98b3e6edbcd80131a736ee20a06a8e32fd815c..3b8348d13a5a80e3e3f97b08054bb15938b83841 100644
--- a/src/backoffice/locale/de/LC_MESSAGES/django.po
+++ b/src/backoffice/locale/de/LC_MESSAGES/django.po
@@ -342,6 +342,36 @@ msgstr "Diese Veranstaltung wirklich löschen (und nicht vllt. nur unsichtbar ma
 msgid "Events"
 msgstr ""
 
+msgid "walist_info_paginated"
+msgstr "Zeige _START_ bis _END_ von _TOTAL_ Einträgen"
+
+msgid "walist_info_empty"
+msgstr "Zeige 0 Einträge"
+
+msgid "walist_info_filtered"
+msgstr "(gefiltert, insgesamt _MAX_ Einträge)"
+
+msgid "walist_paginate_menu"
+msgstr "Zeige _MENU_ Einträge"
+
+msgid "walist_search"
+msgstr "Suche:"
+
+msgid "walist_noentries"
+msgstr "Keine Einträge."
+
+msgid "walist_paginate_first"
+msgstr "Erste"
+
+msgid "walist_paginate_last"
+msgstr "Letzte"
+
+msgid "walist_paginate_next"
+msgstr "Nächste"
+
+msgid "walist_paginate_previous"
+msgstr "Vorherige"
+
 msgid "assemblylist_info_paginated"
 msgstr "Zeige _START_ bis _END_ von _TOTAL_ Einträgen"
 
diff --git a/src/backoffice/locale/en/LC_MESSAGES/django.po b/src/backoffice/locale/en/LC_MESSAGES/django.po
index 43ea25a8b24e03d1a7a1913d23f51e88205cb2df..2586b84e04eabc5b857b4aefacbc0c1ca894788a 100644
--- a/src/backoffice/locale/en/LC_MESSAGES/django.po
+++ b/src/backoffice/locale/en/LC_MESSAGES/django.po
@@ -342,6 +342,36 @@ msgstr "You are about to delete this event. Sure you don't want to just hide it?
 msgid "Events"
 msgstr ""
 
+msgid "walist_info_paginated"
+msgstr "Showing _START_ to _END_ of _TOTAL_ entries"
+
+msgid "walist_info_empty"
+msgstr "Showing 0 out of 0 entries"
+
+msgid "walist_info_filtered"
+msgstr "(filtered from _MAX_ total entries)"
+
+msgid "walist_paginate_menu"
+msgstr "Show _MENU_ entries"
+
+msgid "walist_search"
+msgstr "Search:"
+
+msgid "walist_noentries"
+msgstr "No entries."
+
+msgid "walist_paginate_first"
+msgstr "First"
+
+msgid "walist_paginate_last"
+msgstr "Last"
+
+msgid "walist_paginate_next"
+msgstr "Next"
+
+msgid "walist_paginate_previous"
+msgstr "Previous"
+
 msgid "assemblylist_info_paginated"
 msgstr "Showing _START_ to _END_ of _TOTAL_ entries"
 
diff --git a/src/backoffice/templates/backoffice/wa-map-list.html b/src/backoffice/templates/backoffice/wa-map-list.html
index 32133b650766e63cc57e85ddcf511881554baaf4..b8048c296c2d565c0b243cdbf23f7c536d97d212 100644
--- a/src/backoffice/templates/backoffice/wa-map-list.html
+++ b/src/backoffice/templates/backoffice/wa-map-list.html
@@ -1,5 +1,46 @@
 {% extends 'backoffice/base.html' %}
 {% load i18n %}
+{% load static %}
+
+{% block htmlhead %}
+    <link rel="stylesheet" href="{% static 'datatables/datatables.min.css' %}">
+{% endblock %}
+
+{% block scripts %}
+    <script src="{% static 'datatables/datatables.min.js' %}"></script>
+    <script>
+      $(document).ready(function() {
+          $('#wa-maps').DataTable({
+            pageLength: 100,
+            language: {
+                "decimal":        "",
+                "emptyTable":     "No data available in table",
+                "info":           "{% trans 'walist_info_paginated' %}",
+                "infoEmpty":      "{% trans 'walist_info_empty' %}",
+                "infoFiltered":   "{% trans 'walist_info_filtered' %}",
+                "infoPostFix":    "",
+                "thousands":      " ",
+                "lengthMenu":     "{% trans 'walist_paginate_menu' %}",
+                "loadingRecords": "LOADING ...",
+                "processing":     "Processing...",
+                "search":         "{% trans 'walist_search' %}",
+                "zeroRecords":    "{% trans 'walist_noentries' %}",
+                "paginate": {
+                    "first":      "{% trans 'walist_paginate_first' %}",
+                    "last":       "{% trans 'walist_paginate_last' %}",
+                    "next":       "{% trans 'walist_paginate_next' %}",
+                    "previous":   "{% trans 'walist_paginate_previous' %}"
+                },
+                "aria": {
+                    "sortAscending":  ": activate to sort column ascending",
+                    "sortDescending": ": activate to sort column descending"
+                }
+              }
+          });
+      });
+    </script>
+{% endblock %}
+
 
 {% block content %}
 
@@ -8,7 +49,7 @@
   <div class="card-header">
     WorkAdventure maps <span class="badge badge-primary">{{ object_list|length }}</span>
   </div>
-  <table class="card-body table table-hover table-sm table-striped">
+  <table class="card-body table table-hover table-sm table-striped" id="wa-maps">
     <thead>
       <tr>
         <th>Assembly</th>
@@ -16,7 +57,6 @@
         <th>State</th>
         <th>Occupants</th>
         <th>Capacity</th>
-        <th></th>
       </tr>
     </thead>
     <tbody>
@@ -31,8 +71,6 @@
         </td>
         <td>{{ obj.occupants|default:"-" }}</td>
         <td>{{ obj.capacity|default:"-" }}</td>
-        <td>
-        </td>
       </tr>
       {% endfor %}
     </tbody>
diff --git a/src/backoffice/views/workadventure.py b/src/backoffice/views/workadventure.py
index 05ef1363345f3a2c606f36fe022dd6b8a85f3914..c356b00db3871b2d2fa1c2284ff051af535350c7 100644
--- a/src/backoffice/views/workadventure.py
+++ b/src/backoffice/views/workadventure.py
@@ -10,6 +10,8 @@ from django.utils import timezone
 from django.views.generic import DetailView, ListView, TemplateView, View
 from django.views.generic.detail import SingleObjectMixin
 
+from django.utils.translation import gettext_lazy as _
+from django.db.models import Q
 
 from core.integrations.workadventure import WorkAdventureIntegration
 from core.models.rooms import Room
@@ -26,35 +28,54 @@ MAX_ROWS = 42
 class WorkAdventureAdminMixin(LoginRequiredMixin, ConferenceMixin):
     permission_required = ['core.workadventure_admin']
 
+    BACKEND_STATUS = {
+        'all': (Q(room_type=Room.RoomType.WORKADVENTURE), 'all'),
+        'new': (Q(room_type=Room.RoomType.WORKADVENTURE, backend_status=Room.BackendStatus.NEW), _('Room__backend_status-new')),
+        'setup': (Q(room_type=Room.RoomType.WORKADVENTURE, backend_status=Room.BackendStatus.SETUP), _('Room__backend_status-setup')),
+        'error': (Q(room_type=Room.RoomType.WORKADVENTURE, backend_status=Room.BackendStatus.ERROR), _('Room__backend_status-error')),
+        'active': (Q(room_type=Room.RoomType.WORKADVENTURE, backend_status=Room.BackendStatus.ACTIVE), _('Room__backend_status-active')),
+        'inactive': (Q(room_type=Room.RoomType.WORKADVENTURE, backend_status=Room.BackendStatus.INACTIVE), _('Room__backend_status-inactive')),
+        'full': (Q(room_type=Room.RoomType.WORKADVENTURE, backend_status=Room.BackendStatus.FULL), _('Room__backend_status-full')),
+    }
+
     def get_context_data(self, *args, **kwargs):
         context = super().get_context_data(*args, **kwargs)
 
-        sidebar = []
+        maps = []
         context['sidebar'] = {
             'title': 'WorkAdventure',
             'title_link': reverse('backoffice:workadventure'),
-            'items': sidebar,
+            'items': [
+                {
+                    'caption': _('Maps'),
+                    'children': maps,
+                    'expanded': True,
+                },
+                {
+                    'caption': _('Sessions'),
+                    'link': reverse('backoffice:workadventure-session-list'),
+                    'expanded': False,
+                    'count': self.conference.workadventure_sessions.count(),
+                }
+            ],
         }
 
-        sidebar.append({
-            'caption': 'Maps',
-            'link': reverse('backoffice:workadventure-map-list'),
-            'count': self.conference.rooms.filter(room_type=Room.RoomType.WORKADVENTURE).count(),
-        })
-
-        sidebar.append({
-            'caption': 'Sessions',
-            'link': reverse('backoffice:workadventure-session-list'),
-            'count': self.conference.workadventure_sessions.count(),
-        })
+        for m, (q, t) in self.BACKEND_STATUS.items():
+            maps.append({
+                'caption': t,
+                'count': self.conference.rooms.filter(q).count(),
+                'link': reverse('backoffice:workadventure-map-list') + '?mode=' + m,
+            })
 
         # try to guess 'active' sidebar item
-        request_url = self.request.META.get('PATH_INFO')
-        for x in sidebar:
+        query_string = ''
+        if self.request.META.get('QUERY_STRING'):
+            query_string = '?' + self.request.META.get('QUERY_STRING')
+        request_url = self.request.META.get('PATH_INFO') + query_string
+        for x in context['sidebar']['items']:
             if 'link' in x and x['link'] == request_url:
                 x['active'] = True
                 x['expanded'] = True
-
             if 'children' in x:
                 for y in x.get('children') or []:
                     if 'link' in y and y['link'] == request_url:
@@ -99,6 +120,20 @@ class WorkAdventureSessionMixin(WorkAdventureAdminMixin):
 
 class MapsView(WorkAdventureMapMixin, ListView):
     template_name = 'backoffice/wa-map-list.html'
+    default_backend_status = 'all'
+
+    def get_queryset(self, *args, **kwargs):
+        qs = super().get_queryset(*args, **kwargs).select_related('assembly').order_by('assembly__slug', 'slug')
+
+        backend_status = (self.request.POST if self.request.method == 'POST' else self.request.GET).get('mode', self.default_backend_status)
+        if backend_status in self.BACKEND_STATUS:
+            qs = qs.filter(self.BACKEND_STATUS[backend_status][0])
+        else:
+            messages.warning(self.request, f'unknown mode "{backend_status}", using "all"')
+            backend_status = 'all'
+        self.backend_status = backend_status
+
+        return qs
 
 
 class MapView(WorkAdventureMapMixin, DetailView):