diff --git a/openbis_ng_ui/src/js/components/AppController.js b/openbis_ng_ui/src/js/components/AppController.js
index 0c9546bf9356569e8bce50292672bf703b2c4c5b..26b06fbd9b4b44b325770904358c0c663f94628c 100644
--- a/openbis_ng_ui/src/js/components/AppController.js
+++ b/openbis_ng_ui/src/js/components/AppController.js
@@ -488,7 +488,11 @@ export class AppController {
 
     await this.context.setState({ settings: newSettings })
 
-    await this._saveSettings(settingId, settingObject)
+    try {
+      await this._saveSettings(settingId, settingObject)
+    } catch (error) {
+      this.errorChange(error)
+    }
   }
 
   async _loadSettings() {
diff --git a/openbis_ng_ui/src/js/components/common/browser/BrowserController.js b/openbis_ng_ui/src/js/components/common/browser/BrowserController.js
index 271cb71682cb9eeb3713702140f284becee4f50f..caadc2325841d3610fc28846e3c6692bded5bdf0 100644
--- a/openbis_ng_ui/src/js/components/common/browser/BrowserController.js
+++ b/openbis_ng_ui/src/js/components/common/browser/BrowserController.js
@@ -387,5 +387,6 @@ export default class BrowserController {
     if (onError) {
       onError(error)
     }
+    throw error
   }
 }
diff --git a/openbis_ng_ui/src/js/components/common/grid/GridController.js b/openbis_ng_ui/src/js/components/common/grid/GridController.js
index f1dd5d07edd500cd11de7666bd3f4bad895a4200..da869ebb8e6fc009cf2c1338a9610232ca973f7f 100644
--- a/openbis_ng_ui/src/js/components/common/grid/GridController.js
+++ b/openbis_ng_ui/src/js/components/common/grid/GridController.js
@@ -90,153 +90,158 @@ export default class GridController {
   }
 
   async load() {
-    const props = this.context.getProps()
+    try {
+      const props = this.context.getProps()
 
-    if ((props.rows && props.loadRows) || (!props.rows && !props.loadRows)) {
-      throw new Error(
-        'Incorrect grid configuration. Please set "rows" or "loadRows" property.'
-      )
-    }
+      if ((props.rows && props.loadRows) || (!props.rows && !props.loadRows)) {
+        throw new Error(
+          'Incorrect grid configuration. Please set "rows" or "loadRows" property.'
+        )
+      }
 
-    if (
-      (props.columns && props.loadColumns) ||
-      (!props.columns && !props.loadColumns)
-    ) {
-      throw new Error(
-        'Incorrect grid configuration. Please set "columns" or "loadColumns" property.'
-      )
-    }
+      if (
+        (props.columns && props.loadColumns) ||
+        (!props.columns && !props.loadColumns)
+      ) {
+        throw new Error(
+          'Incorrect grid configuration. Please set "columns" or "loadColumns" property.'
+        )
+      }
 
-    await this.context.setState(() => ({
-      loading: true
-    }))
+      await this.context.setState(() => ({
+        loading: true
+      }))
 
-    const state = this.context.getState()
-    const newState = {
-      ...state,
-      heights: {},
-      loading: false,
-      loaded: true
-    }
+      const state = this.context.getState()
+      const newState = {
+        ...state,
+        heights: {},
+        loading: false,
+        loaded: true
+      }
 
-    let settings = null
+      let settings = null
 
-    if (!state.loaded) {
-      settings = await this._loadSettings()
-      _.merge(newState, settings)
-    }
+      if (!state.loaded) {
+        settings = await this._loadSettings()
+        _.merge(newState, settings)
+      }
 
-    let result = {}
+      let result = {}
 
-    if (props.rows) {
-      result.rows = props.rows
-      result.totalCount = props.rows.length
-      result.local = true
-    } else if (props.loadRows) {
-      const columns = {}
+      if (props.rows) {
+        result.rows = props.rows
+        result.totalCount = props.rows.length
+        result.local = true
+      } else if (props.loadRows) {
+        const columns = {}
 
-      newState.allColumns.forEach(column => {
-        columns[column.name] = column
-      })
+        newState.allColumns.forEach(column => {
+          columns[column.name] = column
+        })
 
-      const loadedResult = await props.loadRows({
-        columns: columns,
-        filterMode: newState.filterMode,
-        filters: newState.filters,
-        globalFilter: newState.globalFilter,
-        page: newState.page,
-        pageSize: newState.pageSize,
-        sortings: newState.sortings
-      })
-      if (_.isArray(loadedResult)) {
-        result.rows = loadedResult
-        result.totalCount = loadedResult.length
-        result.local = true
-      } else {
-        result.rows = loadedResult.rows
-        result.totalCount = loadedResult.totalCount
-        result.local = false
+        const loadedResult = await props.loadRows({
+          columns: columns,
+          filterMode: newState.filterMode,
+          filters: newState.filters,
+          globalFilter: newState.globalFilter,
+          page: newState.page,
+          pageSize: newState.pageSize,
+          sortings: newState.sortings
+        })
+
+        if (_.isArray(loadedResult)) {
+          result.rows = loadedResult
+          result.totalCount = loadedResult.length
+          result.local = true
+        } else {
+          result.rows = loadedResult.rows
+          result.totalCount = loadedResult.totalCount
+          result.local = false
+        }
       }
-    }
 
-    newState.local = result.local
+      newState.local = result.local
 
-    if (result.local) {
-      const { newAllColumns, newColumnsVisibility, newColumnsSorting } =
-        await this._loadColumns(
-          result.rows,
-          newState.columnsVisibility,
-          newState.columnsSorting
-        )
+      if (result.local) {
+        const { newAllColumns, newColumnsVisibility, newColumnsSorting } =
+          await this._loadColumns(
+            result.rows,
+            newState.columnsVisibility,
+            newState.columnsSorting
+          )
 
-      newState.allColumns = newAllColumns
-      newState.columnsVisibility = newColumnsVisibility
-      newState.columnsSorting = newColumnsSorting
-
-      newState.allRows = result.rows
-      newState.filteredRows = this._filterRows(
-        newState.allRows,
-        newState.allColumns,
-        newState.columnsVisibility,
-        newState.filterMode,
-        newState.filters,
-        newState.globalFilter
-      )
-      newState.sortedRows = this._sortRows(
-        newState.filteredRows,
-        newState.allColumns,
-        newState.sortings
-      )
-      newState.totalCount = newState.filteredRows.length
+        newState.allColumns = newAllColumns
+        newState.columnsVisibility = newColumnsVisibility
+        newState.columnsSorting = newColumnsSorting
 
-      const pageCount = Math.max(
-        Math.ceil(newState.totalCount / newState.pageSize),
-        1
-      )
+        newState.allRows = result.rows
+        newState.filteredRows = this._filterRows(
+          newState.allRows,
+          newState.allColumns,
+          newState.columnsVisibility,
+          newState.filterMode,
+          newState.filters,
+          newState.globalFilter
+        )
+        newState.sortedRows = this._sortRows(
+          newState.filteredRows,
+          newState.allColumns,
+          newState.sortings
+        )
+        newState.totalCount = newState.filteredRows.length
 
-      newState.page = Math.min(newState.page, pageCount - 1)
-      newState.rows = this._pageRows(
-        newState.sortedRows,
-        newState.page,
-        newState.pageSize
-      )
-    } else {
-      newState.allRows = result.rows
-      newState.filteredRows = result.rows
-      newState.sortedRows = result.rows
-      newState.rows = result.rows
-      newState.totalCount = result.totalCount
-
-      const pageCount = Math.max(
-        Math.ceil(result.totalCount / newState.pageSize),
-        1
-      )
-      newState.page = Math.min(newState.page, pageCount - 1)
+        const pageCount = Math.max(
+          Math.ceil(newState.totalCount / newState.pageSize),
+          1
+        )
 
-      const { newAllColumns, newColumnsVisibility, newColumnsSorting } =
-        await this._loadColumns(
-          newState.rows,
-          newState.columnsVisibility,
-          newState.columnsSorting
+        newState.page = Math.min(newState.page, pageCount - 1)
+        newState.rows = this._pageRows(
+          newState.sortedRows,
+          newState.page,
+          newState.pageSize
+        )
+      } else {
+        newState.allRows = result.rows
+        newState.filteredRows = result.rows
+        newState.sortedRows = result.rows
+        newState.rows = result.rows
+        newState.totalCount = result.totalCount
+
+        const pageCount = Math.max(
+          Math.ceil(result.totalCount / newState.pageSize),
+          1
         )
+        newState.page = Math.min(newState.page, pageCount - 1)
 
-      newState.allColumns = newAllColumns
-      newState.columnsVisibility = newColumnsVisibility
-      newState.columnsSorting = newColumnsSorting
-    }
+        const { newAllColumns, newColumnsVisibility, newColumnsSorting } =
+          await this._loadColumns(
+            newState.rows,
+            newState.columnsVisibility,
+            newState.columnsSorting
+          )
 
-    // do not update filters (this would override filter changes that a user could do while grid was loading)
-    delete newState.filters
-    delete newState.globalFilter
+        newState.allColumns = newAllColumns
+        newState.columnsVisibility = newColumnsVisibility
+        newState.columnsSorting = newColumnsSorting
+      }
 
-    await this.context.setState(newState)
+      // do not update filters (this would override filter changes that a user could do while grid was loading)
+      delete newState.filters
+      delete newState.globalFilter
 
-    if (!state.loaded) {
-      this.selectRow(props.selectedRowId)
-      this.multiselectRows(props.multiselectedRowIds)
-    } else {
-      this.selectRow(newState.selectedRow ? newState.selectedRow.id : null)
-      this.multiselectRows(Object.keys(newState.multiselectedRows))
+      await this.context.setState(newState)
+
+      if (!state.loaded) {
+        this.selectRow(props.selectedRowId)
+        this.multiselectRows(props.multiselectedRowIds)
+      } else {
+        this.selectRow(newState.selectedRow ? newState.selectedRow.id : null)
+        this.multiselectRows(Object.keys(newState.multiselectedRows))
+      }
+    } catch (error) {
+      this._onError(error)
     }
   }
 
@@ -1584,4 +1589,12 @@ export default class GridController {
   _split(str) {
     return str.split(' ').filter(token => !this._isEmpty(token))
   }
+
+  _onError(error) {
+    const { onError } = this.context.getProps()
+    if (onError) {
+      onError(error)
+    }
+    throw error
+  }
 }
diff --git a/openbis_ng_ui/src/js/components/common/grid/GridWithOpenbis.jsx b/openbis_ng_ui/src/js/components/common/grid/GridWithOpenbis.jsx
index 5788a990192821c7ef8a7e8838394c808fcc1006..ccadf20b2342f22d55d2d274888421739857ff45 100644
--- a/openbis_ng_ui/src/js/components/common/grid/GridWithOpenbis.jsx
+++ b/openbis_ng_ui/src/js/components/common/grid/GridWithOpenbis.jsx
@@ -28,6 +28,7 @@ export default class GridWithOpenbis extends React.PureComponent {
         {...this.props}
         loadSettings={this.loadSettings}
         onSettingsChange={this.onSettingsChange}
+        onError={this.onError}
         exportXLS={this.exportXLS}
       />
     )
@@ -57,6 +58,10 @@ export default class GridWithOpenbis extends React.PureComponent {
     await AppController.getInstance().setSetting(settingsId, settings)
   }
 
+  async onError(error) {
+    await AppController.getInstance().errorChange(error)
+  }
+
   async exportXLS({
     exportedFilePrefix,
     exportedIds,
diff --git a/openbis_ng_ui/src/js/components/tools/common/HistoryGrid.jsx b/openbis_ng_ui/src/js/components/tools/common/HistoryGrid.jsx
index 938bf7d31c9433d6c6b313688908ec8eba6341aa..05955d098395a31fcb79767f364a92ad4b4ae73e 100644
--- a/openbis_ng_ui/src/js/components/tools/common/HistoryGrid.jsx
+++ b/openbis_ng_ui/src/js/components/tools/common/HistoryGrid.jsx
@@ -10,7 +10,6 @@ import DateRangeField from '@src/js/components/common/form/DateRangeField.jsx'
 import FormUtil from '@src/js/components/common/form/FormUtil.js'
 import EntityType from '@src/js/components/common/dto/EntityType.js'
 import HistoryGridContentCell from '@src/js/components/tools/common/HistoryGridContentCell.jsx'
-import AppController from '@src/js/components/AppController.js'
 import openbis from '@src/js/services/openbis.js'
 import messages from '@src/js/common/messages.js'
 import date from '@src/js/common/date.js'
@@ -24,11 +23,7 @@ class HistoryGrid extends React.PureComponent {
   }
 
   async load(params) {
-    try {
-      return await this.loadHistory(this.props.eventType, params)
-    } catch (error) {
-      AppController.getInstance().errorChange(error)
-    }
+    return await this.loadHistory(this.props.eventType, params)
   }
 
   async loadHistory(eventType, { filters, page, pageSize, sortings }) {