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 2d7f14fce10e90a18a7cca313ed9f43b444bcd89..7cbb895a66da0854b470695f4020f3cb869de35b 100644
--- a/openbis_ng_ui/src/js/components/common/grid/GridController.js
+++ b/openbis_ng_ui/src/js/components/common/grid/GridController.js
@@ -13,6 +13,8 @@ export default class GridController {
   }
 
   init(context) {
+    const props = context.getProps()
+
     context.initState({
       loaded: false,
       loading: false,
@@ -29,8 +31,10 @@ export default class GridController {
       allRows: [],
       selectedRow: null,
       multiselectedRows: {},
-      sort: null,
-      sortDirection: null,
+      sort: props.sort,
+      sortDirection: props.sortDirection
+        ? props.sortDirection
+        : GridSortingOptions.ASC,
       totalCount: 0,
       exportOptions: {
         columns: GridExportOptions.VISIBLE_COLUMNS,
@@ -127,15 +131,6 @@ export default class GridController {
       newState.columnsVisibility = newColumnsVisibility
       newState.columnsSorting = newColumnsSorting
 
-      if (!state.loaded && !settings) {
-        newState.allColumns.forEach(column => {
-          if (column.sort) {
-            newState.sort = column.name
-            newState.sortDirection = column.sort
-          }
-        })
-      }
-
       newState.allRows = result.rows
       newState.filteredRows = this._filterRows(
         newState.allRows,
diff --git a/openbis_ng_ui/src/js/components/tools/common/PluginsGrid.jsx b/openbis_ng_ui/src/js/components/tools/common/PluginsGrid.jsx
index b40ff28f385d73d8cbeced800a433ca8326c0f99..e87d2f38a7e56dfd97b172d99a7603c4510f33fe 100644
--- a/openbis_ng_ui/src/js/components/tools/common/PluginsGrid.jsx
+++ b/openbis_ng_ui/src/js/components/tools/common/PluginsGrid.jsx
@@ -25,11 +25,11 @@ class PluginsGrid extends React.PureComponent {
         id={id}
         controllerRef={controllerRef}
         header={this.getHeader()}
+        sort='name'
         columns={[
           {
             name: 'name',
             label: messages.get(messages.NAME),
-            sort: 'asc',
             getValue: ({ row }) => row.name.value,
             renderValue: ({ row }) => {
               return (
diff --git a/openbis_ng_ui/src/js/components/tools/common/QueriesGrid.jsx b/openbis_ng_ui/src/js/components/tools/common/QueriesGrid.jsx
index ec2cdb9ce16f9d7188f32a3d3b533bf9b2e5ce2f..b64fbdc9adac3a0ffd33c4293a812805c953aef0 100644
--- a/openbis_ng_ui/src/js/components/tools/common/QueriesGrid.jsx
+++ b/openbis_ng_ui/src/js/components/tools/common/QueriesGrid.jsx
@@ -18,11 +18,11 @@ class QueriesGrid extends React.PureComponent {
         id={id}
         controllerRef={controllerRef}
         header={messages.get(messages.QUERIES)}
+        sort='name'
         columns={[
           {
             name: 'name',
             label: messages.get(messages.NAME),
-            sort: 'asc',
             getValue: ({ row }) => row.name.value,
             renderValue: ({ value }) => {
               return <QueryLink queryName={value} />
diff --git a/openbis_ng_ui/src/js/components/types/common/TypesGrid.jsx b/openbis_ng_ui/src/js/components/types/common/TypesGrid.jsx
index 0c2f210994ec0f4a97e7e0bbe09b222aae261357..c9c2d58a45943d71ec5b4e73c9973637052981b8 100644
--- a/openbis_ng_ui/src/js/components/types/common/TypesGrid.jsx
+++ b/openbis_ng_ui/src/js/components/types/common/TypesGrid.jsx
@@ -20,6 +20,7 @@ class TypesGrid extends React.PureComponent {
         header={this.getHeader()}
         columns={this.getColumns()}
         rows={rows}
+        sort='code'
         selectable={true}
         selectedRowId={selectedRowId}
         onSelectedRowChange={onSelectedRowChange}
@@ -48,7 +49,6 @@ class TypesGrid extends React.PureComponent {
     columns.push({
       name: 'code',
       label: messages.get(messages.CODE),
-      sort: 'asc',
       getValue: ({ row }) => row.code,
       renderValue: ({ row }) => {
         return <TypeLink typeCode={row.code} typeKind={kind} />
diff --git a/openbis_ng_ui/src/js/components/types/common/VocabulariesGrid.jsx b/openbis_ng_ui/src/js/components/types/common/VocabulariesGrid.jsx
index b0075b5f40d37b90e9cad2050e91d574e85df797..ab7ee679c7a986a9d573366fb03f2a3c4cc0eb51 100644
--- a/openbis_ng_ui/src/js/components/types/common/VocabulariesGrid.jsx
+++ b/openbis_ng_ui/src/js/components/types/common/VocabulariesGrid.jsx
@@ -20,7 +20,6 @@ class VocabulariesGrid extends React.PureComponent {
           {
             name: 'code',
             label: messages.get(messages.CODE),
-            sort: 'asc',
             getValue: ({ row }) => row.code,
             renderValue: ({ row }) => {
               return <VocabularyLink vocabularyCode={row.code} />
@@ -38,6 +37,7 @@ class VocabulariesGrid extends React.PureComponent {
           }
         ]}
         rows={rows}
+        sort='code'
         selectable={true}
         selectedRowId={selectedRowId}
         onSelectedRowChange={onSelectedRowChange}
diff --git a/openbis_ng_ui/src/js/components/types/form/VocabularyForm.jsx b/openbis_ng_ui/src/js/components/types/form/VocabularyForm.jsx
index 479e6cc4f83738d95604532a9c2b217bb87078ac..dd6985f7036b90c444253e6f0115a5cf4573edbd 100644
--- a/openbis_ng_ui/src/js/components/types/form/VocabularyForm.jsx
+++ b/openbis_ng_ui/src/js/components/types/form/VocabularyForm.jsx
@@ -23,7 +23,6 @@ const columns = [
   {
     name: 'code',
     label: messages.get(messages.CODE),
-    sort: 'asc',
     getValue: ({ row }) => row.code.value
   },
   {
@@ -117,6 +116,7 @@ class VocabularyForm extends React.PureComponent {
           header={messages.get(messages.TERMS)}
           columns={columns}
           rows={terms}
+          sort='code'
           selectable={true}
           selectedRowId={
             selection && selection.type === VocabularyFormSelectionType.TERM
diff --git a/openbis_ng_ui/src/js/components/users/common/RolesGrid.jsx b/openbis_ng_ui/src/js/components/users/common/RolesGrid.jsx
index fdafcdffdefbb5c28a58bd79cfc8e9c73af1870d..175a1b9602dbf05d47d2213ee22d027959d9edde 100644
--- a/openbis_ng_ui/src/js/components/users/common/RolesGrid.jsx
+++ b/openbis_ng_ui/src/js/components/users/common/RolesGrid.jsx
@@ -55,6 +55,7 @@ class RolesGrid extends React.PureComponent {
         header={this.getHeader()}
         columns={columns}
         rows={rows}
+        sort={this.getSort()}
         selectable={true}
         selectedRowId={selectedRowId}
         onSelectedRowChange={onSelectedRowChange}
@@ -77,14 +78,25 @@ class RolesGrid extends React.PureComponent {
     return messages.get(message)
   }
 
-  getColumns() {
+  getSort() {
     const { id } = this.props
 
+    if (id === ids.ROLES_OF_USERS_GRID_ID) {
+      return 'user'
+    } else if (id === ids.ROLES_OF_GROUPS_GRID_ID) {
+      return 'group'
+    } else if (id === ids.ROLES_OF_USER_GRID_ID) {
+      return 'inheritedFrom'
+    } else if (id === ids.ROLES_OF_GROUP_GRID_ID) {
+      return 'level'
+    }
+  }
+
+  getColumns() {
     return [
       {
         name: 'user',
         label: messages.get(messages.USER),
-        sort: id === ids.ROLES_OF_USERS_GRID_ID ? 'asc' : null,
         getValue: this.getUserValue,
         renderValue: this.renderUserValue,
         compareValue: params => {
@@ -102,7 +114,6 @@ class RolesGrid extends React.PureComponent {
       {
         name: 'group',
         label: messages.get(messages.GROUP),
-        sort: id === ids.ROLES_OF_GROUPS_GRID_ID ? 'asc' : null,
         getValue: this.getGroupValue,
         renderValue: this.renderGroupValue,
         compareValue: params => {
@@ -120,7 +131,6 @@ class RolesGrid extends React.PureComponent {
       {
         name: 'inheritedFrom',
         label: messages.get(messages.INHERITED_FROM),
-        sort: id === ids.ROLES_OF_USER_GRID_ID ? 'asc' : null,
         getValue: this.getInheritedFromValue,
         renderValue: this.renderInheritedFromValue,
         compareValue: params => {
@@ -137,7 +147,6 @@ class RolesGrid extends React.PureComponent {
       {
         name: 'level',
         label: messages.get(messages.LEVEL),
-        sort: id === ids.ROLES_OF_GROUP_GRID_ID ? 'asc' : null,
         getValue: this.getLevelValue,
         renderValue: this.renderLevelValue,
         compareValue: params => {
diff --git a/openbis_ng_ui/src/js/components/users/common/UserGroupsGrid.jsx b/openbis_ng_ui/src/js/components/users/common/UserGroupsGrid.jsx
index 7158fc330f88b46a892a843a16f5e208857aff22..6db0a3228913f10688811aa722c4cbcc80f39a95 100644
--- a/openbis_ng_ui/src/js/components/users/common/UserGroupsGrid.jsx
+++ b/openbis_ng_ui/src/js/components/users/common/UserGroupsGrid.jsx
@@ -16,11 +16,11 @@ export default class GroupsGrid extends React.PureComponent {
         id={id}
         controllerRef={controllerRef}
         header={messages.get(messages.GROUPS)}
+        sort='code'
         columns={[
           {
             name: 'code',
             label: messages.get(messages.CODE),
-            sort: 'asc',
             getValue: ({ row }) => row.code.value,
             renderValue: ({ value }) => {
               if (value) {
diff --git a/openbis_ng_ui/src/js/components/users/common/UsersGrid.jsx b/openbis_ng_ui/src/js/components/users/common/UsersGrid.jsx
index 9ccf9675f039acb776527067e1b15802848ef0bd..97f4a0c49a3d0a5d2d8881a27147214716bcdb2b 100644
--- a/openbis_ng_ui/src/js/components/users/common/UsersGrid.jsx
+++ b/openbis_ng_ui/src/js/components/users/common/UsersGrid.jsx
@@ -26,11 +26,11 @@ class UsersGrid extends React.PureComponent {
         id={id}
         controllerRef={controllerRef}
         header={messages.get(messages.USERS)}
+        sort='userId'
         columns={[
           {
             name: 'userId',
             label: messages.get(messages.USER_ID),
-            sort: 'asc',
             getValue: ({ row }) => row.userId.value,
             renderValue: ({ value }) => {
               return <UserLink userId={value} />