diff --git a/web/org.openbravo.mobile.core/source/data/ob-datasource.js b/web/org.openbravo.mobile.core/source/data/ob-datasource.js
--- a/web/org.openbravo.mobile.core/source/data/ob-datasource.js
+++ b/web/org.openbravo.mobile.core/source/data/ob-datasource.js
@@ -537,6 +537,43 @@
       } else {
         OB.UTIL.showLoadingMessage(OB.I18N.getLabel('OBMOBC_LoadingMessageModelPage', [me.request.model.prototype.modelName, offset / limit + 1]));
       }
+
+      function dropModelIndexes(callback) {
+        if (typeof me.request.model.getIndexes === 'function') {
+          OB.Data.localDB.transaction(function (tx) {
+            _.forEach(me.request.model.getIndexes(), function (index) {
+              var st = "DROP INDEX IF EXISTS " + index.name + ";";
+              tx.executeSql(st, [], null, null);
+            });
+          }, function (tx, err) {
+            console.error(err);
+            callback();
+          }, function () {
+            callback();
+          });
+        } else {
+          callback();
+        }
+      }
+
+      function createModelIndexes(callback) {
+        if (typeof me.request.model.getIndexes === 'function') {
+          OB.Data.localDB.transaction(function (tx) {
+            _.forEach(me.request.model.getIndexes(), function (index) {
+              var st = me.request.model.getCreateIndexStatement(index);
+              tx.executeSql(st, [], null, null);
+            });
+          }, function (tx, err) {
+            console.error(err);
+            callback();
+          }, function () {
+            callback();
+          });
+        } else {
+          callback();
+        }
+      }
+
       me.request.exec(params, function (data, message, lastUpdated, totalRows) {
         var newLastId;
 
@@ -570,7 +607,9 @@
                 OB.UTIL.localStorage.setItem('lastUpdatedTimestamp' + me.request.model.prototype.modelName, OB.UTIL.localStorage.getItem('requestTimestamp' + me.request.model.prototype.modelName));
               }
             }
-            me.trigger('ready');
+            createModelIndexes(function () {
+              me.trigger('ready');
+            });
           }
         }
         if (data.exception) {
@@ -583,7 +622,13 @@
         }
         if (me.request.model && !me.request.model.prototype.online) {
           if (offset === 0) {
-            OB.Dal.initCache(me.request.model, data, success, handleError, incremental);
+            if (!incremental) {
+              dropModelIndexes(function () {
+                OB.Dal.initCache(me.request.model, data, success, handleError, incremental);
+              });
+            } else {
+              OB.Dal.initCache(me.request.model, data, success, handleError, incremental);
+            }
           } else {
             OB.Dal.insertData(me.request.model, data, success, handleError, incremental, dataLoaded);
           }
