diff --git a/modules/org.openbravo.client.application/web/org.openbravo.client.application/js/grid/ob-grid.js b/modules/org.openbravo.client.application/web/org.openbravo.client.application/js/grid/ob-grid.js
--- a/modules/org.openbravo.client.application/web/org.openbravo.client.application/js/grid/ob-grid.js
+++ b/modules/org.openbravo.client.application/web/org.openbravo.client.application/js/grid/ob-grid.js
@@ -267,6 +267,25 @@
       this.fireOnPause("performFilter", {}, this.fetchDelay);
     },
 
+    // If the criteria contains an 'or' operator due to the changes made for solving
+    // issue 20722 (https://issues.openbravo.com/view.php?id=20722), remove the criteria
+    // that makes reference to a specific id and return the original one
+    removeSpecificIdFilter: function (criteria) {
+      if (!criteria) {
+        return criteria;
+      }
+      if (criteria.operator !== 'or') {
+        return criteria;
+      }
+      if (criteria.criteria && criteria.criteria.length !== 2) {
+        return criteria;
+      }
+      if (criteria.criteria.get(0).fieldName !== 'id') {
+        return criteria;
+      }
+      return criteria.criteria.get(1);
+    },
+
     // repair that filter criteria on fk fields can be 
     // on the identifier instead of the field itself.
     // after applying the filter the grid will set the criteria
@@ -281,6 +300,9 @@
       // make a copy so that we don't change the object
       // which is maybe used somewhere else
       criteria = isc.clone(criteria);
+      // If a criterion has been added to include the selected record, remove it
+      // See issue https://issues.openbravo.com/view.php?id=20722
+      criteria = this.removeSpecificIdFilter(criteria);
       var internCriteria = criteria.criteria;
       if (internCriteria && this.getEditForm()) {
         // now remove anything which is not a field
@@ -321,7 +343,6 @@
           }
         }
       }
-
       return this.Super('setValuesAsCriteria', [criteria, refresh]);
     },
 
@@ -579,7 +600,7 @@
     }
     return ret;
   },
-  
+
   // = exportData =
   // The exportData function exports the data of the grid to a file. The user will 
   // be presented with a save-as dialog.
diff --git a/modules/org.openbravo.client.application/web/org.openbravo.client.application/js/grid/ob-view-grid.js b/modules/org.openbravo.client.application/web/org.openbravo.client.application/js/grid/ob-view-grid.js
--- a/modules/org.openbravo.client.application/web/org.openbravo.client.application/js/grid/ob-view-grid.js
+++ b/modules/org.openbravo.client.application/web/org.openbravo.client.application/js/grid/ob-view-grid.js
@@ -959,7 +959,14 @@
     }, this.Super('getFilterEditorProperties', arguments));
   },
 
-  refreshGrid: function (callback) {
+  removeOrClause: function(criteria) {
+    // The original criteria is stored in the position #1
+    // The criteria to select the selected record is stored in position #0
+    return criteria.criteria.get(1);
+  },
+
+  refreshGrid: function (callback, forceCurrentRecordID) {
+    var originalCriteria, criteria = {};
     if (this.getSelectedRecord()) {
       this.targetRecordId = this.getSelectedRecord()[OB.Constants.ID];
       // as the record is already selected it is already in the filter
@@ -971,7 +978,39 @@
     var context = {
       showPrompt: false
     };
-    this.filterData(this.getCriteria(), null, context);
+
+    // Removes the 'or' clause, if there is one
+    // See note at the function foot
+    originalCriteria = this.getCriteria();
+    if (this._criteriaWithOrClause) {
+      originalCriteria = this.removeOrClause(originalCriteria);
+      this._criteriaWithOrClause = false;
+    }
+
+    // If a record has to be included in the refresh, it must be included
+    // in the filter with an 'or' operator, along with the original filter,
+    // but only if there is an original filter
+    if (forceCurrentRecordID && originalCriteria.criteria.length > 0) {
+      // Adds the current record to the criteria
+      this._criteriaWithOrClause = true;
+      criteria._constructor = 'AdvancedCriteria';
+      criteria._OrExpression = true; // trick to get a really _or_ in the backend
+      criteria.operator = 'or';
+      criteria.criteria = [{
+        fieldName: 'id',
+        operator: 'equals',
+        value: forceCurrentRecordID
+      }];
+      criteria.criteria.push(originalCriteria); // original filter
+    } else {
+      criteria = originalCriteria;
+    }
+    this.filterData(criteria, null, context);
+    // At this point the original criteria should be restored, to prevent
+    // the 'or' clause that was just added to be used in subsequent refreshes.
+    // It is not possible to do it here, though, because a this.setCriteria(originalCriteria)
+    // would trigger an automatic refresh that would leave without effect that last filterData
+    // The additional criteria will be removed in the next call to refreshGrid
   },
 
   // with a delay to handle the target record when the body has been drawn
@@ -2085,9 +2124,9 @@
       this.view.standardWindow.doActionAfterAutoSave(actionObject, true);
       return;
     }
-    
+
     this._leavingCell = true;
-    
+
     if (newValue) {
       this.Super('cellEditEnd', [editCompletionEvent, newValue]);
     } else {
diff --git a/modules/org.openbravo.client.application/web/org.openbravo.client.application/js/main/ob-standard-view.js b/modules/org.openbravo.client.application/web/org.openbravo.client.application/js/main/ob-standard-view.js
--- a/modules/org.openbravo.client.application/web/org.openbravo.client.application/js/main/ob-standard-view.js
+++ b/modules/org.openbravo.client.application/web/org.openbravo.client.application/js/main/ob-standard-view.js
@@ -1347,7 +1347,10 @@
   // - refresh the current selected record without changing the selection
   // - refresh the parent/grand-parent in the same way without changing the selection
   // - recursive to children: refresh the children, put the children in grid mode and refresh
-  refresh: function (refreshCallback, autoSaveDone) {
+  refresh: function (refreshCallback, autoSaveDone, forceCurrentRecordId) {
+    // If a record should be visible after the refresh, even if it does not comply with the
+    // current filter, its ID should be entered in the forceCurrentRecordId parameter
+    // See issue https://issues.openbravo.com/view.php?id=20722
     var me = this,
         view = this,
         actionObject, formRefresh, callback;
@@ -1357,7 +1360,7 @@
       actionObject = {
         target: this,
         method: this.refresh,
-        parameters: [refreshCallback, true]
+        parameters: [refreshCallback, true, forceCurrentRecordId]
       };
       this.standardWindow.doActionAfterAutoSave(actionObject, false);
       return;
@@ -1375,17 +1378,17 @@
     };
 
     if (!this.isShowingForm) {
-      this.viewGrid.refreshGrid(refreshCallback);
+      this.viewGrid.refreshGrid(refreshCallback, forceCurrentRecordId);
     } else {
       if (this.viewForm.hasChanged) {
         callback = function (ok) {
           if (ok) {
-            view.viewGrid.refreshGrid(formRefresh);
+            view.viewGrid.refreshGrid(formRefresh, forceCurrentRecordId);
           }
         };
         isc.ask(OB.I18N.getLabel('OBUIAPP_ConfirmRefresh'), callback);
       } else {
-        this.viewGrid.refreshGrid(formRefresh);
+        this.viewGrid.refreshGrid(formRefresh, forceCurrentRecordId);
       }
     }
   },
diff --git a/modules/org.openbravo.client.application/web/org.openbravo.client.application/js/toolbar/ob-action-button.js b/modules/org.openbravo.client.application/web/org.openbravo.client.application/js/toolbar/ob-action-button.js
--- a/modules/org.openbravo.client.application/web/org.openbravo.client.application/js/toolbar/ob-action-button.js
+++ b/modules/org.openbravo.client.application/web/org.openbravo.client.application/js/toolbar/ob-action-button.js
@@ -144,7 +144,9 @@
         afterRefresh, parsePathPart, parts;
 
     afterRefresh = function (doRefresh) {
-      var undef, refresh = (doRefresh === undef || doRefresh);
+      var undef, refresh = (doRefresh === undef || doRefresh),
+          autosaveDone = false,
+          currentRecordId;
 
       // Refresh context view
       contextView.getTabMessage();
@@ -155,10 +157,15 @@
         // let's set half for each in order to see the message
         contextView.setHalfSplit();
       }
-
       // Refresh in order to show possible new records
       if (refresh) {
-        currentView.refresh(null, false, true);
+        // The selected record should be shown after the refresh, even
+        // if the filter would exclude it
+        // See issue https://issues.openbravo.com/view.php?id=20722
+        if (currentView.viewGrid.getSelectedRecord()) {
+          currentRecordId = currentView.viewGrid.getSelectedRecord()[OB.Constants.ID];
+        }
+        currentView.refresh(null, autosaveDone, currentRecordId);
       }
     };
 
