diff --git a/src/groups/list.js b/src/groups/list.js
index a91f2f15e6b13412631910ac5d18c1609111f46a..bb7fc1bf36bf2a043d3f3a76c0ac2820792b51c1 100644
--- a/src/groups/list.js
+++ b/src/groups/list.js
@@ -21,8 +21,21 @@ export default class GroupList {
     this.ctrl = new DatalistController('groups', {}, ['name']);
     this.data = [];
 
-    this.ctrl.getPageData(1).then((data) => {
-      this.data = data;
+    this.ctrl.getPageData(1).then((firstPage) => {
+      const pages = { 1: firstPage };
+      // now fetch all the missing pages
+      console.log(this.ctrl.totalPages);
+      Array.from(new Array(this.ctrl.totalPages - 1), (x, i) => i + 2).forEach((pageNum) => {
+        this.ctrl.getPageData(pageNum).then((newPage) => {
+          pages[pageNum] = newPage;
+          // collect all the so-far loaded pages in order (sorted keys)
+          // and flatten them into 1 array
+          this.data = [].concat(...Object.keys(pages).sort().map(key => pages[key]));
+          m.redraw();
+        });
+      });
+      // see above
+      this.data = [].concat(...Object.keys(pages).sort().map(key => pages[key]));
       m.redraw();
     });
   }
diff --git a/src/listcontroller.js b/src/listcontroller.js
index 90cead72257097328bcdef17b9f0a8e17072bf42..36ef1d58f29ac324945a8e94849610745dd9ee0a 100644
--- a/src/listcontroller.js
+++ b/src/listcontroller.js
@@ -23,6 +23,8 @@ export default class DatalistController {
       this.refresh();
       m.redraw();
     }, 100);
+    // keep track of the total number of pages
+    this.totalPages = null;
   }
 
   refresh() {
@@ -46,6 +48,8 @@ export default class DatalistController {
 
     return new Promise((resolve) => {
       this.handler.get(query).then((data) => {
+        // update total number of pages
+        this.totalPages = Math.ceil(data._meta.total / 10);
         // If onlineSearch is false, we filter the page-results at the client
         // because the API would not understand the search pattern, e.g. for
         // embedded keys like user.firstname