diff --git a/elements/nuxeo-results/nuxeo-default-results.js b/elements/nuxeo-results/nuxeo-default-results.js
index 6d411281c9..05da358cf5 100644
--- a/elements/nuxeo-results/nuxeo-default-results.js
+++ b/elements/nuxeo-results/nuxeo-default-results.js
@@ -82,11 +82,12 @@ Polymer({
         empty-label="[[emptyLabel]]"
         empty-label-when-filtered="[[emptyLabelWhenFiltered]]"
         selection-enabled
+        last-index="[[_lastIndex]]"
       >
         <template>
           <nuxeo-document-grid-thumbnail
             class="grid-box"
-            tabindex$="{{tabIndex}}"
+            tabindex$="{{_computeTabAndLastIndex(index)}"
             selected$="{{selected}}"
             selected-items="[[selectedItems]]"
             index="[[index]]"
@@ -263,6 +264,11 @@ Polymer({
       notify: true,
     },
 
+    _lastIndex: {
+      type: Number,
+      value: 0,
+    },
+
     emptyLabel: String,
     emptyLabelWhenFiltered: String,
   },
@@ -291,4 +297,10 @@ Polymer({
   _contentStoredInColdStorage(doc) {
     return this.hasFacet(doc, 'ColdStorage') && doc.properties && doc.properties['coldstorage:coldContent'];
   },
+
+  _computeTabAndLastIndex(index) {
+    const tabindex = index + 1;
+    this._lastIndex = this.nxProvider.resultsCount;
+    return tabindex.toString();
+  },
 });
diff --git a/elements/nuxeo-results/nuxeo-document-content.js b/elements/nuxeo-results/nuxeo-document-content.js
index 9832ea8f2d..144de76e3c 100644
--- a/elements/nuxeo-results/nuxeo-document-content.js
+++ b/elements/nuxeo-results/nuxeo-document-content.js
@@ -119,11 +119,12 @@ Polymer({
         selection-enabled
         draggable$="[[_hasWritePermission(document)]]"
         drop-target-filter="[[_dropTargetFilter]]"
+        last-index="[[_lastIndex]]"
       >
         <template>
           <nuxeo-document-grid-thumbnail
             class="grid-box"
-            tabindex$="{{tabIndex}}"
+            tabindex$="{{_computeTabAndLastIndex(index)}}"
             selected$="{{selected}}"
             index="[[index]]"
             doc="[[item]]"
@@ -363,9 +364,19 @@ Polymer({
      * The label to be dislayed when there are no results with filtering applied.
      */
     emptyLabelWhenFiltered: String,
+    _lastIndex: {
+      type: Number,
+      value: 0,
+    },
   },
 
   _contentStoredInColdStorage(doc) {
     return this.hasFacet(doc, 'ColdStorage') && doc.properties && doc.properties['coldstorage:coldContent'];
   },
+
+  _computeTabAndLastIndex(index) {
+    const tabindex = index + 1;
+    this._lastIndex = this.nxProvider.resultsCount;
+    return tabindex.toString();
+  },
 });
diff --git a/elements/nuxeo-results/nuxeo-document-trash-content.js b/elements/nuxeo-results/nuxeo-document-trash-content.js
index e70e41e70d..149e57ba94 100644
--- a/elements/nuxeo-results/nuxeo-document-trash-content.js
+++ b/elements/nuxeo-results/nuxeo-document-trash-content.js
@@ -129,11 +129,12 @@ Polymer({
         empty-label="[[emptyLabel]]"
         empty-label-when-filtered="[[emptyLabelWhenFiltered]]"
         selection-enabled
+        last-index="[[_lastIndex]]"
       >
         <template>
           <nuxeo-document-grid-thumbnail
             class="grid-box"
-            tabindex$="{{tabIndex}}"
+            tabindex$="{{_computeTabAndLastIndex(index)}}"
             selected$="{{selected}}"
             index="[[index]]"
             doc="[[item]]"
@@ -339,6 +340,10 @@ Polymer({
      * The label to be dislayed when there are no results with filtering applied.
      */
     emptyLabelWhenFiltered: String,
+    _lastIndex: {
+      type: Number,
+      value: 0,
+    },
   },
 
   _emptyTrash() {
@@ -368,4 +373,10 @@ Polymer({
       { field: 'dc:lastContributor', label: this.i18n('searchResults.sort.field.lastContributor'), order: 'asc' },
     ];
   },
+
+  _computeTabAndLastIndex(index) {
+    const tabindex = index + 1;
+    this._lastIndex = this.nxProvider.resultsCount;
+    return tabindex.toString();
+  },
 });
diff --git a/elements/search/default/nuxeo-default-search-results.html b/elements/search/default/nuxeo-default-search-results.html
index 4419d47cc2..0e7627b9a5 100644
--- a/elements/search/default/nuxeo-default-search-results.html
+++ b/elements/search/default/nuxeo-default-search-results.html
@@ -44,10 +44,11 @@
         icon="nuxeo:view-thumbnails"
         empty-label="[[i18n('searchResults.noResults')]]"
         selection-enabled
+        last-index="[[_lastIndex]]"
       >
         <template>
           <nuxeo-document-grid-thumbnail
-            tabindex$="{{_computeTabIndex(index)}}"
+            tabindex$="{{_computeTabAndLastIndex(index)}}"
             selected$="{{selected}}"
             doc="[[item]]"
             index="[[index]]"
@@ -225,6 +226,11 @@
           type: Array,
           value: [],
         },
+
+        _lastIndex: {
+          type: Number,
+          value: 0,
+        },
       },
 
       attached() {
@@ -247,8 +253,10 @@
         return this.hasFacet(doc, 'ColdStorage') && doc.properties && doc.properties['coldstorage:coldContent'];
       },
 
-      _computeTabIndex(index) {
-        return (index + 1).toString();
+      _computeTabAndLastIndex(index) {
+        const tabindex = index + 1;
+        this._lastIndex = this.nxProvider.resultsCount;
+        return tabindex.toString();
       },
     });
   </script>
diff --git a/elements/search/document_picker/nuxeo-document_picker-search-results.html b/elements/search/document_picker/nuxeo-document_picker-search-results.html
index 3c54095a13..1fe86dd6ca 100644
--- a/elements/search/document_picker/nuxeo-document_picker-search-results.html
+++ b/elements/search/document_picker/nuxeo-document_picker-search-results.html
@@ -22,10 +22,11 @@
         class="results"
         empty-label="[[i18n('searchResults.noResults')]]"
         selection-enabled
+        last-index="[[_lastIndex]]"
       >
         <template>
           <nuxeo-document-grid-thumbnail
-            tabindex$="{{tabIndex}}"
+            tabindex$="{{_computeTabAndLastIndex(index)}}"
             selected$="{{selected}}"
             doc="[[item]]"
             index="[[index]]"
@@ -41,6 +42,16 @@
       behaviors: [Nuxeo.LayoutBehavior],
       properties: {
         nxProvider: Object,
+        _lastIndex: {
+          type: Number,
+          value: 0,
+        },
+      },
+
+      _computeTabAndLastIndex(index) {
+        const tabindex = index + 1;
+        this._lastIndex = this.nxProvider.resultsCount;
+        return tabindex.toString();
       },
     });
   </script>
diff --git a/elements/search/expired/nuxeo-expired-search-results.html b/elements/search/expired/nuxeo-expired-search-results.html
index 2eb5ffaf25..81c5c1088a 100644
--- a/elements/search/expired/nuxeo-expired-search-results.html
+++ b/elements/search/expired/nuxeo-expired-search-results.html
@@ -40,10 +40,11 @@
         class="results"
         empty-label="[[i18n('searchResults.noResults')]]"
         selection-enabled
+        last-index="[[_lastIndex]]"
       >
         <template>
           <nuxeo-document-grid-thumbnail
-            tabindex$="{{tabIndex}}"
+            tabindex$="{{_computeTabAndLastIndex(index)}}"
             selected$="{{selected}}"
             doc="[[item]]"
             index="[[index]]"
@@ -202,6 +203,10 @@
           type: Array,
           value: [],
         },
+        _lastIndex: {
+          type: Number,
+          value: 0,
+        },
       },
 
       attached() {
@@ -224,6 +229,12 @@
       _contentStoredInColdStorage(doc) {
         return this.hasFacet(doc, 'ColdStorage') && doc.properties && doc.properties['coldstorage:coldContent'];
       },
+
+      _computeTabAndLastIndex(index) {
+        const tabindex = index + 1;
+        this._lastIndex = this.nxProvider.resultsCount;
+        return tabindex.toString();
+      },
     });
   </script>
 </dom-module>
diff --git a/elements/search/nxql/nuxeo-nxql-search-results.html b/elements/search/nxql/nuxeo-nxql-search-results.html
index 3296a6e98a..07ca8aa50a 100644
--- a/elements/search/nxql/nuxeo-nxql-search-results.html
+++ b/elements/search/nxql/nuxeo-nxql-search-results.html
@@ -45,10 +45,11 @@
         icon="nuxeo:view-thumbnails"
         empty-label="[[i18n('searchResults.noResults')]]"
         selection-enabled
+        last-index="[[_lastIndex]]"
       >
         <template>
           <nuxeo-document-grid-thumbnail
-            tabindex$="{{tabIndex}}"
+            tabindex$="{{_computeTabAndLastIndex(index)}}"
             selected$="{{selected}}"
             doc="[[item]]"
             index="[[index]]"
@@ -195,11 +196,22 @@
       behaviors: [Nuxeo.LayoutBehavior],
       properties: {
         nxProvider: Object,
+
+        _lastIndex: {
+          type: Number,
+          value: 0,
+        },
       },
 
       _navigate(e) {
         this.fire('navigate', { doc: (e.model || e.detail).item, index: (e.detail || e.model).index });
       },
+
+      _computeTabAndLastIndex(index) {
+        const tabindex = index + 1;
+        this._lastIndex = this.nxProvider.resultsCount;
+        return tabindex.toString();
+      },
     });
   </script>
 </dom-module>
diff --git a/elements/search/trash/nuxeo-trash-search-results.html b/elements/search/trash/nuxeo-trash-search-results.html
index 266a084b0a..736e741201 100644
--- a/elements/search/trash/nuxeo-trash-search-results.html
+++ b/elements/search/trash/nuxeo-trash-search-results.html
@@ -44,10 +44,11 @@
         icon="nuxeo:view-thumbnails"
         empty-label="[[i18n('searchResults.noResults')]]"
         selection-enabled
+        last-index="[[_lastIndex]]"
       >
         <template>
           <nuxeo-document-grid-thumbnail
-            tabindex$="{{tabIndex}}"
+            tabindex$="{{_computeTabAndLastIndex(index)}}"
             selected$="{{selected}}"
             doc="[[item]]"
             index="[[index]]"
@@ -233,6 +234,11 @@
           type: Array,
           value: [],
         },
+
+        _lastIndex: {
+          type: Number,
+          value: 0,
+        },
       },
 
       attached() {
@@ -254,6 +260,12 @@
       _contentStoredInColdStorage(doc) {
         return this.hasFacet(doc, 'ColdStorage') && doc.properties && doc.properties['coldstorage:coldContent'];
       },
+
+      _computeTabAndLastIndex(index) {
+        const tabindex = index + 1;
+        this._lastIndex = this.nxProvider.resultsCount;
+        return tabindex.toString();
+      },
     });
   </script>
 </dom-module>