diff --git a/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/v2/AbstractOmniscientTopLevelDataSetRegistrator.java b/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/v2/AbstractOmniscientTopLevelDataSetRegistrator.java
index 142fee8ce8c38c648b59390c3d2adae447de95fc..2c19f07ce96ec9ecfd4e0febe6c099b4cc659cc0 100644
--- a/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/v2/AbstractOmniscientTopLevelDataSetRegistrator.java
+++ b/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/v2/AbstractOmniscientTopLevelDataSetRegistrator.java
@@ -20,6 +20,7 @@ import static ch.systemsx.cisd.etlserver.IStorageProcessorTransactional.STORAGE_
 import static ch.systemsx.cisd.etlserver.ThreadParameters.ON_ERROR_DECISION_KEY;
 
 import java.io.File;
+import java.io.IOException;
 import java.util.List;
 import java.util.Properties;
 import java.util.concurrent.locks.Lock;
@@ -27,6 +28,7 @@ import java.util.concurrent.locks.ReentrantLock;
 
 import org.apache.log4j.Logger;
 
+import ch.systemsx.cisd.base.exceptions.CheckedExceptionTunnel;
 import ch.systemsx.cisd.base.exceptions.InterruptedExceptionUnchecked;
 import ch.systemsx.cisd.common.action.AbstractDelegatedActionWithResult;
 import ch.systemsx.cisd.common.action.IDelegatedActionWithResult;
@@ -384,6 +386,8 @@ public abstract class AbstractOmniscientTopLevelDataSetRegistrator<T extends Dat
             markerFileCleanupAction = new DoNothingDelegatedAction();
         }
 
+        checkAccessRightsRecursively(incomingDataSetFile);
+
         // read from configuration prestaging parameter.
         DataSetRegistrationPreStagingBehavior preStagingUsage =
                 state.getGlobalState().getThreadParameters()
@@ -414,6 +418,28 @@ public abstract class AbstractOmniscientTopLevelDataSetRegistrator<T extends Dat
                     cleanupAction);
         }
     }
+    
+    private void checkAccessRightsRecursively(File file)
+    {
+        if (file.canRead() == false)
+        {
+            throw CheckedExceptionTunnel.wrapIfNecessary(new IOException(
+                    "No reading rights for data set file '" + file.getAbsolutePath() + "'."));
+        }
+        if (file.isDirectory())
+        {
+            if (file.canWrite() == false)
+            {
+                throw CheckedExceptionTunnel.wrapIfNecessary(new IOException(
+                        "No writing rights for data set folder '" + file.getAbsolutePath() + "'."));
+            }
+            File[] files = file.listFiles();
+            for (File child : files)
+            {
+                checkAccessRightsRecursively(child);
+            }
+        }
+    }
 
     /**
      * Make a copy of the file to the prestaging directory.
diff --git a/openbis-common/source/java/ch/systemsx/cisd/openbis/common/log/DefaultAppenderFilter.java b/openbis-common/source/java/ch/systemsx/cisd/openbis/common/log/DefaultAppenderFilter.java
index c6be60e8d999f23f62e349c39c3347c0290897aa..d92470039eeba120221d694465cf709749790068 100644
--- a/openbis-common/source/java/ch/systemsx/cisd/openbis/common/log/DefaultAppenderFilter.java
+++ b/openbis-common/source/java/ch/systemsx/cisd/openbis/common/log/DefaultAppenderFilter.java
@@ -24,6 +24,11 @@ import org.apache.log4j.spi.LoggingEvent;
  */
 public class DefaultAppenderFilter extends Filter
 {
+    public DefaultAppenderFilter()
+    {
+        System.err.println("filter");
+    }
+
     @Override
     public int decide(LoggingEvent event)
     {
@@ -40,9 +45,10 @@ public class DefaultAppenderFilter extends Filter
 
     private int decide(String logger, String message)
     {
-        if ((logger.startsWith("ACCESS.") || logger.startsWith("TRACKING."))
+        if (((logger.startsWith("ACCESS.") || logger.startsWith("TRACKING."))
                 && logger.endsWith("Logger")
                 && message.contains("(START)"))
+                || logger.equals("org.hibernate.orm.deprecation"))
         {
             return Filter.DENY;
         } else
diff --git a/openbis/source/java/ch/ethz/sis/openbis/generic/server/SingleSignOnServlet.java b/openbis/source/java/ch/ethz/sis/openbis/generic/server/SingleSignOnServlet.java
new file mode 100644
index 0000000000000000000000000000000000000000..69103f4388ff2e2b008e513b023e762398bbaf2e
--- /dev/null
+++ b/openbis/source/java/ch/ethz/sis/openbis/generic/server/SingleSignOnServlet.java
@@ -0,0 +1,127 @@
+/*
+ * Copyright 2019 ETH Zuerich, SIS
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package ch.ethz.sis.openbis.generic.server;
+
+import java.io.IOException;
+import java.util.HashMap;
+import java.util.Map;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.apache.log4j.Logger;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.RequestMapping;
+
+import ch.systemsx.cisd.authentication.IPrincipalProvider;
+import ch.systemsx.cisd.authentication.Principal;
+import ch.systemsx.cisd.common.logging.LogCategory;
+import ch.systemsx.cisd.common.logging.LogFactory;
+import ch.systemsx.cisd.common.spring.ExposablePropertyPlaceholderConfigurer;
+import ch.systemsx.cisd.openbis.generic.client.web.server.AbstractServlet;
+import ch.systemsx.cisd.openbis.generic.server.ComponentNames;
+import ch.systemsx.cisd.openbis.generic.shared.IOpenBisSessionManager;
+import ch.systemsx.cisd.openbis.generic.shared.dto.Session;
+
+/**
+ * @author Franz-Josef Elmer
+ */
+@Controller
+public class SingleSignOnServlet extends AbstractServlet
+{
+    public static final String SERVLET_NAME = "ssos";
+
+    public static final String SESSION_ID_KEY = "session-id-key";
+
+    public static final String DEFAULT_SESSION_ID_KEY = "Shib-Session-ID";
+
+    public static final String USER_ID_KEY = "user-id-key";
+
+    public static final String DEFAULT_USER_ID_KEY = "mail";
+
+    public static final String FIRST_NAME_KEY = "first-name-key";
+
+    public static final String DEFAULT_FIRST_NAME_KEY = "givenName";
+
+    public static final String LAST_NAME_KEY = "last-name-key";
+
+    public static final String DEFAULT_LAST_NAME_KEY = "surname";
+
+    public static final String EMAIL_KEY = "email-key";
+
+    public static final String DEFAULT_EMAIL_KEY = "mail";
+    
+    public static final String REDIRECT_URL_KEY = "redirect-url";
+    
+    public static final String DEFAULT_REDIRECT_URL = "webapp/eln-lims";
+
+    private static final Logger operationLog = LogFactory.getLogger(LogCategory.OPERATION, SingleSignOnServlet.class);
+
+    @Resource(name = ExposablePropertyPlaceholderConfigurer.PROPERTY_CONFIGURER_BEAN_NAME)
+    private ExposablePropertyPlaceholderConfigurer configurer;
+
+    @Resource(name = ComponentNames.SESSION_MANAGER)
+    private IOpenBisSessionManager sessionManager;
+    
+    private final Map<String, String> sessionTokenBySessionId = new HashMap<>();
+
+    @Override
+    @RequestMapping({ SERVLET_NAME })
+    protected void respondToRequest(HttpServletRequest request, HttpServletResponse response) throws Exception, IOException
+    {
+        String sessionId = getHeader(request, SESSION_ID_KEY, DEFAULT_SESSION_ID_KEY);
+        String sessionToken = sessionTokenBySessionId.get(sessionId);
+        if (sessionToken != null)
+        {
+            Session session = sessionManager.tryGetSession(sessionToken);
+            if (session != null)
+            {
+                return;
+            }
+        }
+        String userId = getHeader(request, USER_ID_KEY, DEFAULT_USER_ID_KEY);
+        String firstName = getHeader(request, FIRST_NAME_KEY, DEFAULT_FIRST_NAME_KEY);
+        String lastName = getHeader(request, LAST_NAME_KEY, DEFAULT_LAST_NAME_KEY);
+        String email = getHeader(request, EMAIL_KEY, DEFAULT_EMAIL_KEY);
+        Principal principal = new Principal(userId, firstName, lastName, email, true);
+        sessionToken = sessionManager.tryToOpenSession(userId, new IPrincipalProvider()
+            {
+                
+                @Override
+                public Principal tryToGetPrincipal(String userID)
+                {
+                    return principal;
+                }
+            });
+        sessionTokenBySessionId.put(sessionId, sessionToken);
+        operationLog.info("Session " + sessionToken + " created for session id " + sessionId);
+        response.sendRedirect(configurer.getResolvedProps().getProperty(REDIRECT_URL_KEY, DEFAULT_REDIRECT_URL));
+    }
+
+    private String getHeader(HttpServletRequest request, String keyProperty, String defaultKey)
+    {
+        String key = configurer.getResolvedProps().getProperty(keyProperty, defaultKey);
+        String header = request.getHeader(key);
+        if (header != null)
+        {
+            return header;
+        }
+        throw new IllegalArgumentException("Missing header '" + key + "'.");
+    }
+
+}
diff --git a/openbis_ng_ui/.babelrc b/openbis_ng_ui/.babelrc
deleted file mode 100644
index 7683f4458cdc954baa9ef62e6891fdd95821cc54..0000000000000000000000000000000000000000
--- a/openbis_ng_ui/.babelrc
+++ /dev/null
@@ -1,4 +0,0 @@
-{
-    "presets":["@babel/preset-env", "@babel/preset-react"],
-    "plugins": ["@babel/plugin-transform-runtime", "@babel/plugin-proposal-object-rest-spread", "@babel/plugin-proposal-class-properties"]
-}
diff --git a/openbis_ng_ui/babel.config.js b/openbis_ng_ui/babel.config.js
new file mode 100644
index 0000000000000000000000000000000000000000..8f5ca5e35a7fba4fd2b08c31cd02abf0d8b83509
--- /dev/null
+++ b/openbis_ng_ui/babel.config.js
@@ -0,0 +1,20 @@
+/* eslint-disable-next-line no-undef */
+module.exports = function (api) {
+  api.cache(true)
+
+  const presets = [
+    '@babel/preset-env',
+    '@babel/preset-react',
+  ]
+
+  const plugins = [
+    '@babel/plugin-transform-runtime',
+    '@babel/plugin-proposal-object-rest-spread',
+    '@babel/plugin-proposal-class-properties'
+  ]
+
+  return {
+    presets,
+    plugins
+  }
+}
diff --git a/openbis_ng_ui/jest.config.js b/openbis_ng_ui/jest.config.js
new file mode 100644
index 0000000000000000000000000000000000000000..82e9d638d412a254a477bad383680cb442fdd40e
--- /dev/null
+++ b/openbis_ng_ui/jest.config.js
@@ -0,0 +1,10 @@
+/* eslint-disable-next-line no-undef */
+module.exports = {
+  reporters: [
+    'default',
+    'jest-junit'
+  ],
+  setupFilesAfterEnv: [
+    '<rootDir>srcTest/setupTests.js'
+  ]
+}
diff --git a/openbis_ng_ui/package.json b/openbis_ng_ui/package.json
index e204e134575ceea425bdda57d961536dc6f3bb44..364817cd84262470f1e89b2031ed6d7fdd099bdd 100644
--- a/openbis_ng_ui/package.json
+++ b/openbis_ng_ui/package.json
@@ -5,56 +5,60 @@
   "author": "Antti Luomi",
   "license": "Apache-2.0",
   "dependencies": {
-    "@material-ui/core": "^3.9.3",
-    "@material-ui/icons": "^3.0.2",
-    "install": "^0.12.2",
-    "npm": "^6.9.0",
+    "@material-ui/core": "^4.2.0",
+    "@material-ui/icons": "^4.2.1",
+    "connected-react-router": "^6.5.0",
+    "history": "^4.9.0",
+    "install": "^0.13.0",
+    "npm": "^6.10.0",
     "prop-types": "^15.7.2",
     "react": "^16.8.6",
     "react-dnd": "^7.4.5",
     "react-dnd-html5-backend": "^7.4.4",
     "react-dom": "^16.8.6",
-    "react-redux": "^7.0.3",
+    "react-redux": "^7.1.0",
+    "react-router": "^5.0.1",
     "redux": "^4.0.1",
-    "redux-saga": "^1.0.2",
+    "redux-saga": "^1.0.5",
     "reselect": "^4.0.0",
     "typeface-roboto": "^0.0.54"
   },
   "devDependencies": {
-    "auto-bind": "^2.1.0",
-    "@babel/core": "^7.4.4",
-    "@babel/preset-env": "^7.4.4",
+    "@babel/core": "^7.5.0",
+    "@babel/plugin-proposal-class-properties": "^7.5.0",
+    "@babel/plugin-proposal-object-rest-spread": "^7.5.1",
+    "@babel/plugin-transform-modules-commonjs": "^7.5.0",
+    "@babel/plugin-transform-runtime": "^7.5.0",
+    "@babel/preset-env": "^7.5.0",
     "@babel/preset-react": "^7.0.0",
-    "@babel/plugin-transform-runtime": "^7.4.4",
-    "@babel/plugin-proposal-object-rest-spread": "^7.4.4",
-    "@babel/plugin-proposal-class-properties": "^7.4.4",
-    "babel-jest": "^24.7.1",
-    "babel-loader": "^8.0.5",
-    "babel-eslint": "^10.0.1",
-    "css-loader": "^2.1.1",
-    "enzyme": "^3.9.0",
-    "enzyme-adapter-react-16": "^1.12.1",
-    "eslint": "^5.16.0",
+    "auto-bind": "^2.1.0",
+    "babel-eslint": "^10.0.2",
+    "babel-jest": "^24.8.0",
+    "babel-loader": "^8.0.6",
+    "css-loader": "^3.0.0",
+    "enzyme": "^3.10.0",
+    "enzyme-adapter-react-16": "^1.14.0",
+    "eslint": "^6.0.1",
     "eslint-config-standard": "^12.0.0",
-    "eslint-plugin-import": "^2.17.2",
-    "eslint-plugin-jest": "^22.5.1",
-    "eslint-plugin-node": "^9.0.0",
-    "eslint-plugin-promise": "^4.1.1",
-    "eslint-plugin-react": "^7.13.0",
+    "eslint-plugin-import": "^2.18.0",
+    "eslint-plugin-jest": "^22.7.2",
+    "eslint-plugin-node": "^9.1.0",
+    "eslint-plugin-promise": "^4.2.1",
+    "eslint-plugin-react": "^7.14.2",
     "eslint-plugin-standard": "^4.0.0",
-    "file-loader": "^3.0.1",
+    "file-loader": "^4.0.0",
     "html-webpack-plugin": "^3.2.0",
-    "jest": "^24.7.1",
+    "jest": "^24.8.0",
     "jest-junit": "^6.4.0",
-    "raw-loader": "^2.0.0",
-    "react-hot-loader": "^4.8.4",
+    "raw-loader": "^3.0.0",
+    "react-hot-loader": "^4.12.5",
     "react-loader": "^2.4.5",
     "source-map-loader": "^0.2.4",
     "style-loader": "^0.23.1",
-    "url-loader": "^1.1.2",
-    "webpack": "^4.30.0",
-    "webpack-cli": "^3.3.1",
-    "webpack-dev-server": "^3.3.1"
+    "url-loader": "^2.0.1",
+    "webpack": "^4.35.3",
+    "webpack-cli": "^3.3.5",
+    "webpack-dev-server": "^3.7.2"
   },
   "scripts": {
     "dev": "webpack-dev-server --hot --config webpack.config.dev.js",
@@ -64,14 +68,5 @@
     "lint:fix": "eslint --ext .js,.jsx src test --fix",
     "test": "jest",
     "test:watch": "npm test -- --watch"
-  },
-  "jest": {
-    "reporters": [
-      "default",
-      "jest-junit"
-    ],
-    "setupFilesAfterEnv": [
-      "<rootDir>srcTest/setupTests.js"
-    ]
   }
 }
diff --git a/openbis_ng_ui/src/components/common/browser/BrowserNode.jsx b/openbis_ng_ui/src/components/common/browser/BrowserNode.jsx
index 22a2051da6da1aa3376250247d0d46f0da3c42e3..2844eecc2a71beaf7eb266494f8d66853333adc3 100644
--- a/openbis_ng_ui/src/components/common/browser/BrowserNode.jsx
+++ b/openbis_ng_ui/src/components/common/browser/BrowserNode.jsx
@@ -12,10 +12,8 @@ import logger from '../../../common/logger.js'
 
 const styles = {
   icon: {
-    margin: '0px 8px'
-  },
-  text: {
-    marginLeft: '-16px'
+    margin: '0px 8px',
+    minWidth: '24px'
   }
 }
 
@@ -31,7 +29,7 @@ class BrowserNode extends React.Component {
         button
         selected={node.selected}
         onClick={() => this.props.nodeSelect(node.id)}
-        style={{paddingLeft: level * 20 + 'px'}}>
+        style={{paddingLeft: level * 24 + 'px'}}>
         {this.renderIcon(node)}
         {this.renderText(node)}
       </ListItem>
@@ -69,21 +67,17 @@ class BrowserNode extends React.Component {
         root: classes.icon
       }}>{icon}</ListItemIcon>
     }else{
-      return null
+      return <ListItemIcon classes={{
+        root: classes.icon
+      }}><span></span></ListItemIcon>
     }
   }
 
   renderText(node){
     logger.log(logger.DEBUG, 'BrowserNode.renderText "' + node.text + '"')
 
-    const classes = this.props.classes
-
     return <ListItemText
       primary={node.text}
-      inset={true}
-      classes={{
-        primary: classes.text
-      }}
     />
   }
 
diff --git a/openbis_ng_ui/src/components/common/content/ContentTabs.jsx b/openbis_ng_ui/src/components/common/content/ContentTabs.jsx
index 889ca3bdbe6a6a701787267a1c03f91834f8747d..d6eec630b753b230250f13d86a7ff549929463f1 100644
--- a/openbis_ng_ui/src/components/common/content/ContentTabs.jsx
+++ b/openbis_ng_ui/src/components/common/content/ContentTabs.jsx
@@ -4,19 +4,10 @@ import {withStyles} from '@material-ui/core/styles'
 import Tabs from '@material-ui/core/Tabs'
 import Tab from '@material-ui/core/Tab'
 import CloseIcon from '@material-ui/icons/Close'
+import * as objectTypes from '../../../common/consts/objectType.js'
 import logger from '../../../common/logger.js'
 
 const styles = {
-  tabsRoot: {
-    height: '48px'
-  },
-  tabsScrollable: {
-    overflow: 'auto',
-    marginBottom: '0px !important'
-  },
-  tabsScrollButtons: {
-    height: '48px'
-  },
   tabRoot: {
     textTransform: 'none'
   },
@@ -26,7 +17,6 @@ const styles = {
   tabLabel: {
     display: 'inline-flex',
     alignItems: 'center',
-    marginRight: '-16px'
   }
 }
 
@@ -52,11 +42,6 @@ class ContentTabs extends React.Component {
         value={_.findIndex(this.props.objects, this.props.selectedObject)}
         variant="scrollable"
         scrollButtons="on"
-        classes={{
-          root: classes.tabsRoot,
-          scrollable: classes.tabsScrollable,
-          scrollButtons: classes.tabsScrollButtons
-        }}
         onChange={this.handleTabChange}
       >
         {this.props.objects.map(object =>
@@ -72,7 +57,18 @@ class ContentTabs extends React.Component {
   }
 
   renderLabel(object){
-    let label = _.find(this.props.changedObjects, object) ? object.id + '*' : object.id
+    let changed = _.find(this.props.changedObjects, object) ? '*' : ''
+    let label = null
+
+    switch(object.type){
+      case objectTypes.SEARCH:
+        label = 'search: ' + object.id
+        break
+      default:
+        label = object.id + changed
+        break
+    }
+
     return <span className={this.props.classes.tabLabel}>{label}{this.renderIcon(object)}</span>
   }
 
diff --git a/openbis_ng_ui/src/components/common/error/ErrorDialog.jsx b/openbis_ng_ui/src/components/common/error/ErrorDialog.jsx
index c2b40483998ca2036b9395f939dd9f9223cb0da7..f8d504134de996ad6ce90ea6c47a5a0af8c2d2ae 100644
--- a/openbis_ng_ui/src/components/common/error/ErrorDialog.jsx
+++ b/openbis_ng_ui/src/components/common/error/ErrorDialog.jsx
@@ -14,11 +14,11 @@ import logger from '../../../common/logger.js'
 import profile from '../../../profile.js'
 
 
-const dialogStyles = {
+const dialogStyles = (theme) => ({
   paper: {
-    backgroundColor: '#ffd2d2',
-  },
-}
+    backgroundColor: theme.palette.error.main
+  }
+})
 
 const StyledDialog = withStyles(dialogStyles)(Dialog)
 
diff --git a/openbis_ng_ui/src/components/common/form/EditableField.jsx b/openbis_ng_ui/src/components/common/form/EditableField.jsx
index babaa760fa29ff8c28f1cbc25061c6d50060a6d7..c6959a2d8f0d3a8b06fce1d0fb1b78b992e95488 100644
--- a/openbis_ng_ui/src/components/common/form/EditableField.jsx
+++ b/openbis_ng_ui/src/components/common/form/EditableField.jsx
@@ -5,7 +5,7 @@ import {withStyles} from '@material-ui/core/styles'
 import * as util from '../../../common/util.js'
 import logger from '../../../common/logger.js'
 
-const styles = () => ({
+const styles = (theme) => ({
   container: {
     display: 'inline-flex',
     margin: '1px 30px 1px 1px',
@@ -19,7 +19,7 @@ const styles = () => ({
   hovered: {
     margin: '0px',
     border: '1px solid',
-    borderColor: 'rgba(0, 0, 0, 0.14)'
+    borderColor: theme.palette.action.selected
   },
 })
 
diff --git a/openbis_ng_ui/src/components/common/grid/Grid.jsx b/openbis_ng_ui/src/components/common/grid/Grid.jsx
index 49f450a50c0fb3b259369c472a69306a105f9bef..dc9f18dea94ce3c49e4c9096c2a6f3ec6f1bd34d 100644
--- a/openbis_ng_ui/src/components/common/grid/Grid.jsx
+++ b/openbis_ng_ui/src/components/common/grid/Grid.jsx
@@ -24,7 +24,7 @@ const styles = (theme) => ({
   },
   headerContainer: {
     flexGrow: 0,
-    padding: theme.spacing.unit * 2,
+    padding: theme.spacing(2),
     paddingBottom: 0
   },
   footerContainer: {
@@ -35,8 +35,8 @@ const styles = (theme) => ({
   tableContainer: {
     flexGrow: 1,
     overflow: 'auto',
-    paddingLeft: theme.spacing.unit * 2,
-    paddingRight: theme.spacing.unit * 2
+    paddingLeft: theme.spacing(2),
+    paddingRight: theme.spacing(2)
   },
   table: {
     height: '100%'
@@ -83,7 +83,7 @@ class Grid extends React.Component {
 
     this.state = {
       loaded: false,
-      filter: '',
+      filter: this.props.filter || '',
       page: 0,
       pageSize: 10,
       visibleColumns: Object.keys(this.columnsMap),
@@ -179,7 +179,7 @@ class Grid extends React.Component {
       page: 0,
       filter
     }), () => {
-      this.load()
+      this.loadData()
     })
   }
 
@@ -201,7 +201,7 @@ class Grid extends React.Component {
         sortDirection: prevState.sortDirection === 'asc' ? 'desc' : 'asc'
       }), () => {
         this.saveSettings()
-        this.load()
+        this.loadData()
       })
     }
   }
@@ -210,7 +210,7 @@ class Grid extends React.Component {
     this.setState(() => ({
       page
     }), () => {
-      this.load()
+      this.loadData()
     })
   }
 
@@ -220,7 +220,7 @@ class Grid extends React.Component {
       pageSize
     }), () => {
       this.saveSettings()
-      this.load()
+      this.loadData()
     })
   }
 
@@ -273,7 +273,7 @@ class Grid extends React.Component {
     }
 
     const { classes } = this.props
-    const { page, pageSize, filter, visibleColumns, sort, sortDirection } = this.state
+    const { page, pageSize, filter, visibleColumns } = this.state
 
     let pagedObjects = null
     let totalCount = null
@@ -300,40 +300,18 @@ class Grid extends React.Component {
           <Table classes={{ root: classes.table }}>
             <TableHead classes={{ root: classes.tableHeader }}>
               <TableRow>
-                {this.columnsArray.map(column => {
-                  if(visibleColumns.includes(column.field)){
-                    return (
-                      <TableCell key={column.field}>
-                        <TableSortLabel
-                          active={column.sort && sort === column.field}
-                          direction={sortDirection}
-                          onClick={this.handleSortChange(column)}
-                        >
-                          {column.label}
-                        </TableSortLabel>
-                      </TableCell>
-                    )
-                  }else{
-                    return null
-                  }
-                })}
+                {this.columnsArray.map(column =>
+                  this.renderHeaderCell(column)
+                )}
               </TableRow>
             </TableHead>
             <TableBody>
               {pagedObjects.map(row => {
                 return (
                   <TableRow key={row.id} hover>
-                    {this.columnsArray.map(column => {
-                      if(visibleColumns.includes(column.field)){
-                        return (
-                          <TableCell key={column.field}>
-                            {column.render(row)}
-                          </TableCell>
-                        )
-                      }else{
-                        return null
-                      }
-                    })}
+                    {this.columnsArray.map(column =>
+                      this.renderRowCell(column, row)
+                    )}
                   </TableRow>
                 )
               })}
@@ -361,6 +339,49 @@ class Grid extends React.Component {
     )
   }
 
+  renderHeaderCell(column){
+    const { visibleColumns, sort, sortDirection } = this.state
+
+    if(visibleColumns.includes(column.field)){
+      if(column.sort){
+        return (
+          <TableCell key={column.field}>
+            <TableSortLabel
+              active={sort === column.field}
+              direction={sortDirection}
+              onClick={this.handleSortChange(column)}
+            >
+              {column.label}
+            </TableSortLabel>
+          </TableCell>
+        )
+      }else{
+        return (
+          <TableCell key={column.field}>
+            {column.label}
+          </TableCell>
+        )
+      }
+    }else{
+      return null
+    }
+  }
+
+  renderRowCell(column, row){
+    const { visibleColumns } = this.state
+
+    if(visibleColumns.includes(column.field)){
+      let rendered = column.render(row)
+      return (
+        <TableCell key={column.field}>
+          {rendered ? rendered : <span>&nbsp;</span> }
+        </TableCell>
+      )
+    }else{
+      return null
+    }
+  }
+
 }
 
 export default _.flow(
diff --git a/openbis_ng_ui/src/components/common/loading/Loading.jsx b/openbis_ng_ui/src/components/common/loading/Loading.jsx
index 42b0aef09c698670bdf3d8392dc5daa4d3311866..17951d7dbabfd8857a0bb3b42f9fb2a0ddee44d7 100644
--- a/openbis_ng_ui/src/components/common/loading/Loading.jsx
+++ b/openbis_ng_ui/src/components/common/loading/Loading.jsx
@@ -3,13 +3,13 @@ import {withStyles} from '@material-ui/core/styles'
 import CircularProgress from '@material-ui/core/CircularProgress'
 import logger from '../../../common/logger.js'
 
-const styles = {
+const styles = (theme) => ({
   loader: {
     position: 'absolute',
     width: '100%',
     height: '100%',
     zIndex: 1000,
-    backgroundColor: '#FFFFFF',
+    backgroundColor: theme.palette.background.paper,
     opacity: 0.8,
     textAlign: 'center',
   },
@@ -18,7 +18,7 @@ const styles = {
     top: '20%',
     left: 'calc(50% - 20px)'
   }
-}
+})
 
 class Loading extends React.Component {
 
diff --git a/openbis_ng_ui/src/components/common/menu/Menu.jsx b/openbis_ng_ui/src/components/common/menu/Menu.jsx
index d9b3a8b49e8a459e5601fc66903b70a99f42debf..ff4b7684e227720e25a0a73bd16920bb12c50d59 100644
--- a/openbis_ng_ui/src/components/common/menu/Menu.jsx
+++ b/openbis_ng_ui/src/components/common/menu/Menu.jsx
@@ -22,15 +22,15 @@ const styles = (theme) => ({
     flexGrow: 1,
   },
   search: {
-    color: theme.palette.common.white,
-    backgroundColor: fade(theme.palette.common.white, 0.15),
+    color: theme.palette.background.paper,
+    backgroundColor: fade(theme.palette.background.paper, 0.15),
     '&:hover': {
-      backgroundColor: fade(theme.palette.common.white, 0.25),
+      backgroundColor: fade(theme.palette.background.paper, 0.25),
     },
     borderRadius: theme.shape.borderRadius,
-    paddingLeft: theme.spacing.unit,
-    paddingRight: theme.spacing.unit,
-    marginRight: theme.spacing.unit * 2,
+    paddingLeft: theme.spacing(1),
+    paddingRight: theme.spacing(1),
+    marginRight: theme.spacing(2),
     transition: theme.transitions.create('width'),
     width: '200px',
     '&:focus-within': {
@@ -38,8 +38,8 @@ const styles = (theme) => ({
     },
   },
   searchIcon: {
-    paddingLeft: theme.spacing.unit / 2,
-    paddingRight: theme.spacing.unit,
+    paddingLeft: theme.spacing(1) / 2,
+    paddingRight: theme.spacing(1),
     cursor: 'default'
   },
   searchClear: {
diff --git a/openbis_ng_ui/src/components/types/objectType/ObjectType.jsx b/openbis_ng_ui/src/components/types/objectType/ObjectType.jsx
index 778fb80d8e9f17bff15d4fcc4c992f4e2c481038..96d78d7f7eb672da9d1dedf8faeb2eb5106ac117 100644
--- a/openbis_ng_ui/src/components/types/objectType/ObjectType.jsx
+++ b/openbis_ng_ui/src/components/types/objectType/ObjectType.jsx
@@ -19,11 +19,11 @@ const styles = (theme) => ({
   form: {
     flex: '1 1 0',
     overflow: 'auto',
-    padding: theme.spacing.unit * 2
+    padding: theme.spacing(2)
   },
   footer: {
     flex: '0 0',
-    padding: theme.spacing.unit * 2
+    padding: theme.spacing(2)
   }
 })
 
diff --git a/openbis_ng_ui/src/components/types/objectType/ObjectTypeFooter.jsx b/openbis_ng_ui/src/components/types/objectType/ObjectTypeFooter.jsx
index 7b3659efbc7457db90ba0d8867c6399206e91498..04282adde58f352648b291141913cb26ae8b08de 100644
--- a/openbis_ng_ui/src/components/types/objectType/ObjectTypeFooter.jsx
+++ b/openbis_ng_ui/src/components/types/objectType/ObjectTypeFooter.jsx
@@ -5,7 +5,7 @@ import logger from '../../../common/logger.js'
 
 const styles = (theme) => ({
   button: {
-    marginRight: theme.spacing.unit * 2
+    marginRight: theme.spacing(2)
   }
 })
 
diff --git a/openbis_ng_ui/src/components/types/objectType/ObjectTypePropertyRow.jsx b/openbis_ng_ui/src/components/types/objectType/ObjectTypePropertyRow.jsx
index e23c1dd7444b9f0e8b18131f9925e501e44a34d7..f626780e6c1a5901e916d9db469e1ee96c5e5699 100644
--- a/openbis_ng_ui/src/components/types/objectType/ObjectTypePropertyRow.jsx
+++ b/openbis_ng_ui/src/components/types/objectType/ObjectTypePropertyRow.jsx
@@ -16,11 +16,11 @@ const styles = (theme) => ({
   row: {
     backgroundColor: theme.palette.background.paper,
     '&:hover': {
-      backgroundColor: 'rgba(0, 0, 0, 0.08)',
+      backgroundColor: theme.palette.action.hover,
       cursor: 'pointer'
     },
     '&$selected': {
-      backgroundColor: 'rgba(0, 0, 0, 0.14)'
+      backgroundColor: theme.palette.action.selected
     }
   },
   selected: {},
diff --git a/openbis_ng_ui/src/components/types/search/Search.jsx b/openbis_ng_ui/src/components/types/search/Search.jsx
index 320b56fa19b45c16cd3cb7d6870994375d560b7e..4c9591e0cf599a527275733b36c400333a916c33 100644
--- a/openbis_ng_ui/src/components/types/search/Search.jsx
+++ b/openbis_ng_ui/src/components/types/search/Search.jsx
@@ -62,9 +62,6 @@ class Search extends React.Component {
   searchObjectTypes(){
     let criteria = new dto.SampleTypeSearchCriteria()
     let fo = new dto.SampleTypeFetchOptions()
-
-    criteria.withCode().thatContains(this.props.objectId)
-
     return facade.searchSampleTypes(criteria, fo).then(result => {
       return result.objects
     })
@@ -73,9 +70,6 @@ class Search extends React.Component {
   searchCollectionTypes(){
     let criteria = new dto.ExperimentTypeSearchCriteria()
     let fo = new dto.ExperimentTypeFetchOptions()
-
-    criteria.withCode().thatContains(this.props.objectId)
-
     return facade.searchExperimentTypes(criteria, fo).then(result => {
       return result.objects
     })
@@ -84,9 +78,6 @@ class Search extends React.Component {
   searchDataSetTypes(){
     let criteria = new dto.DataSetTypeSearchCriteria()
     let fo = new dto.DataSetTypeFetchOptions()
-
-    criteria.withCode().thatContains(this.props.objectId)
-
     return facade.searchDataSetTypes(criteria, fo).then(result => {
       return result.objects
     })
@@ -95,9 +86,6 @@ class Search extends React.Component {
   searchMaterialTypes(){
     let criteria = new dto.MaterialTypeSearchCriteria()
     let fo = new dto.MaterialTypeFetchOptions()
-
-    criteria.withCode().thatContains(this.props.objectId)
-
     return facade.searchMaterialTypes(criteria, fo).then(result => {
       return result.objects
     })
@@ -128,6 +116,7 @@ class Search extends React.Component {
     return (
       <Grid
         id={ids.TYPES_GRID_ID}
+        filter={this.props.objectId}
         columns={[
           {
             field: 'permId.entityKind',
diff --git a/openbis_ng_ui/src/components/users/search/Search.jsx b/openbis_ng_ui/src/components/users/search/Search.jsx
index 9be872e451444da57f788c340fc024b859493092..03a26ce48bbd1f52b94eae2830c7dc138cb1cb90 100644
--- a/openbis_ng_ui/src/components/users/search/Search.jsx
+++ b/openbis_ng_ui/src/components/users/search/Search.jsx
@@ -42,6 +42,7 @@ class Search extends React.Component {
     return (
       <Grid
         id={ids.USERS_GRID_ID}
+        filter={this.props.objectId}
         columns={[
           {
             field: 'userId'
diff --git a/openbis_ng_ui/src/store/reducers/ui/pages/common/page.js b/openbis_ng_ui/src/store/reducers/ui/pages/common/page.js
index 98d06f6e2b2ecf07f92e21372ad5641f1ecc5475..5af622632607567f19edcf32ced0cb6a70e81612 100644
--- a/openbis_ng_ui/src/store/reducers/ui/pages/common/page.js
+++ b/openbis_ng_ui/src/store/reducers/ui/pages/common/page.js
@@ -58,7 +58,9 @@ export const changedObjects = (state = [], action) => {
 export const selectedObject = (state = null, action) => {
   switch(action.type){
     case actions.SET_SELECTED_OBJECT: {
-      let newState = action.payload.type && action.payload.id ? { type: action.payload.type, id: action.payload.id } : null
+      const { type, id } = action.payload
+
+      let newState = (type === null || type === undefined) && (id === null || id === undefined) ? null :  { type: action.payload.type, id: action.payload.id }
 
       if(_.isEqual(state, newState)){
         return state
diff --git a/openbis_ng_ui/src/store/sagas/app.js b/openbis_ng_ui/src/store/sagas/app.js
index 690fdbc63ddbccc6ca88733f6f8de01537910a27..d37b03ba936d12752280296c92d7256af3ff074b 100644
--- a/openbis_ng_ui/src/store/sagas/app.js
+++ b/openbis_ng_ui/src/store/sagas/app.js
@@ -63,10 +63,8 @@ function* logout() {
 
 function* search(action) {
   const {page, text} = action.payload
-  if(text && text.trim()){
-    yield put(actions.objectOpen(page, objectTypes.SEARCH, text.trim()))
-    yield put(actions.setSearch(''))
-  }
+  yield put(actions.objectOpen(page, objectTypes.SEARCH, text.trim()))
+  yield put(actions.setSearch(''))
 }
 
 function* currentPageChange(action){
diff --git a/openbis_ng_ui/srcTest/components/common/browser/browser.test.js b/openbis_ng_ui/srcTest/components/common/browser/browser.test.js
index 181104e78cf9a33c5ed94ad261da4e5384ee0288..49aa1fef982ebc7ad35daca9d3b5745efe0b6c21 100644
--- a/openbis_ng_ui/srcTest/components/common/browser/browser.test.js
+++ b/openbis_ng_ui/srcTest/components/common/browser/browser.test.js
@@ -72,7 +72,7 @@ describe('browser', () => {
 function simulateNodeIconClick(wrapper, id){
   wrapper.findWhere(node => {
     return node.name() === 'BrowserNode' && node.prop('node').id === id
-  }).find('ListItemIcon').find('SvgIcon').first().simulate('click')
+  }).find('svg').first().simulate('click')
 }
 
 function simulateFilterChange(wrapper, filter){
diff --git a/openbis_standard_technologies/dist/core-plugins/eln-lims/1/as/webapps/eln-lims/html/js/controllers/MainController.js b/openbis_standard_technologies/dist/core-plugins/eln-lims/1/as/webapps/eln-lims/html/js/controllers/MainController.js
index f2d8deeff0a0a358862f9b049f01cb9d1e54f710..142198f6bab65d4da0dce1cf78171022e97001b4 100644
--- a/openbis_standard_technologies/dist/core-plugins/eln-lims/1/as/webapps/eln-lims/html/js/controllers/MainController.js
+++ b/openbis_standard_technologies/dist/core-plugins/eln-lims/1/as/webapps/eln-lims/html/js/controllers/MainController.js
@@ -461,7 +461,7 @@ function MainController(profile) {
 				case "showSpacePage":
 					var _this = this;
 					this.serverFacade.getSpaceFromCode(arg, function(space) {
-						document.title = "Space " + space.code;
+						document.title = "Space " + space;
 						_this._showSpacePage(space);
 						//window.scrollTo(0,0);
 					});
diff --git a/openbis_standard_technologies/dist/core-plugins/eln-lims/1/as/webapps/eln-lims/html/js/server/ServerFacade.js b/openbis_standard_technologies/dist/core-plugins/eln-lims/1/as/webapps/eln-lims/html/js/server/ServerFacade.js
index 64e007e98e0cfec6b754767c377c02d5f2b2090e..781654a1d5cba5321c51acaf63a999af16e765cf 100644
--- a/openbis_standard_technologies/dist/core-plugins/eln-lims/1/as/webapps/eln-lims/html/js/server/ServerFacade.js
+++ b/openbis_standard_technologies/dist/core-plugins/eln-lims/1/as/webapps/eln-lims/html/js/server/ServerFacade.js
@@ -336,10 +336,12 @@ function ServerFacade(openbisServer) {
 	}
 	
 	this.listSpaces = function(callbackFunction) {
-		this.openbisServer.listSpacesWithProjectsAndRoleAssignments(null, function(data) {
+		var spaceRules = { entityKind : "SPACE", logicalOperator : "AND", rules : { } };
+		mainController.serverFacade.searchForSpacesAdvanced(spaceRules, null, function(spacesSearchResult) {
 			var spaces = [];
-			for(var i = 0; i < data.result.length; i++) {
-				spaces.push(data.result[i].code);
+			for(var sIdx = 0; sIdx < spacesSearchResult.objects.length; sIdx++) {
+				var space = spacesSearchResult.objects[sIdx];
+				spaces.push(space.code);
 			}
 			callbackFunction(spaces);
 		});
@@ -350,9 +352,9 @@ function ServerFacade(openbisServer) {
 	}
 	
 	this.getSpaceFromCode = function(spaceCode, callbackFunction) {
-		this.openbisServer.listSpacesWithProjectsAndRoleAssignments(null, function(data) {
-			data.result.forEach(function(space){
-				if(space.code === spaceCode) {
+		this.listSpaces(function(spaces) {
+			spaces.forEach(function(space){
+				if(space === spaceCode) {
 					callbackFunction(space);
 				}
 			});
@@ -2481,11 +2483,13 @@ function ServerFacade(openbisServer) {
 			function(RoleAssignmentSearchCriteria, RoleAssignmentFetchOptions) {
 				var criteria = new RoleAssignmentSearchCriteria();
 
-				if (criteriaParams.space) {
-					criteria.withSpace().withCode().thatEquals(criteriaParams.space);
-				}
 				if (criteriaParams.project) {
 					criteria.withProject().withCode().thatEquals(criteriaParams.project);
+					if (criteriaParams.space) {
+						criteria.withProject().withSpace().withCode().thatEquals(criteriaParams.space);
+					}
+				} else if (criteriaParams.space) {
+					criteria.withSpace().withCode().thatEquals(criteriaParams.space);
 				}
 				if (criteriaParams.user) {
 					criteria.withUser().withUserId().thatEquals(criteriaParams.user);
diff --git a/openbis_standard_technologies/dist/core-plugins/eln-lims/1/as/webapps/eln-lims/html/js/util/FormUtil.js b/openbis_standard_technologies/dist/core-plugins/eln-lims/1/as/webapps/eln-lims/html/js/util/FormUtil.js
index a70b6b6090a7a3e7ff1f16ef2545ff883f1a3a72..21929caa7676b2790e943fdc550df41d0a730761 100644
--- a/openbis_standard_technologies/dist/core-plugins/eln-lims/1/as/webapps/eln-lims/html/js/util/FormUtil.js
+++ b/openbis_standard_technologies/dist/core-plugins/eln-lims/1/as/webapps/eln-lims/html/js/util/FormUtil.js
@@ -1361,8 +1361,8 @@ var FormUtil = new function() {
 		});
 	}
 
-	// params.space: space code (set this or project)
-	// params.project: project code (set this or space)
+	// params.space: space code (or space code of project)
+	// params.project: project code
 	// params.acceptCallback: function to be called with (shareWith, groupOrUser)
 	this.showAuthorizationDialog = function(params) {
 
@@ -1370,7 +1370,7 @@ var FormUtil = new function() {
 		Util.blockUI();
 
 		mainController.serverFacade.searchRoleAssignments({
-			space: params.space ? params.space.code : null,
+			space: params.space ? params.space : (params.project ? params.project.spaceCode : null),
 			project: params.project ? params.project.code : null,
 		}, function(roleAssignments) {
 
@@ -1378,7 +1378,7 @@ var FormUtil = new function() {
 
 			// components
 			var $roleAssignmentTable = _this._getRoleAssignmentTable(roleAssignments, _this._revokeRoleAssignment.bind(_this, params));
-			var spaceOrProjectLabel = params.space ? params.space.code : params.project.code;
+			var spaceOrProjectLabel = params.space ? params.space : params.project.code;
 			var $roleDropdown = FormUtil.getDropdown([
 				{ label: 'Observer', value: 'OBSERVER', selected: true },
 				{ label: 'User', value: 'USER' },
@@ -1453,7 +1453,7 @@ var FormUtil = new function() {
 			user: grantTo == "User" ? groupOrUser : null,
 			group: grantTo == "Group" ? groupOrUser.toUpperCase() : null,
 			role: role,
-			space: dialogParams.space ? dialogParams.space.code : null,
+			space: dialogParams.space ? dialogParams.space : null,
 			project: dialogParams.project ? dialogParams.project.permId : null,
 		}, function(success, result) {
 			if (success) {
@@ -1565,7 +1565,7 @@ var FormUtil = new function() {
 						entity = entityMap[key];
 						if(entity.type == entityTypeOrder[typeOrder]) {
 							$table.append($("<tr>")
-									.append($("<td>").append(_this._getBooleanField('freezing-form-' + key.replace("+", "-"), entity.displayName, true)))
+									.append($("<td>").append(_this._getBooleanField(_this._createFormFieldId(key), entity.displayName, true)))
 									.append($("<td>").append(getTypeDisplayName(entity.type)))
 									.append($("<td>").append(entity.permId))
 									.append($("<td>").append(entity.displayName))
@@ -1609,34 +1609,35 @@ var FormUtil = new function() {
 				$window.append($btnAccept).append('&nbsp;').append($btnCancel);
 				
 				$window.submit(function() {
-					var username = mainController.serverFacade.getUserId();
-					var password = $passField.val();					
-					new openbis().login(
-							username, 
-							password, 
-							function(data) { 
-								if(data.result == null) {
-									Util.showUserError('The given password is not correct.');
-								} else {
-									var sessionToken = data.result;
-									
-									
-									for (key in entityMap) {
-										if(!$('#freezing-form-' + key.replace("+", "-"))[0].checked) {
-											delete entityMap[key];
+					if (_this._atLeastOnyEntitySelectedHasBeenSelectedForFreezing(entityMap)) {
+						var username = mainController.serverFacade.getUserId();
+						var password = $passField.val();					
+						new openbis().login(
+								username, 
+								password, 
+								function(data) { 
+									if(data.result == null) {
+										Util.showUserError('The given password is not correct.');
+									} else {
+										var sessionToken = data.result;
+										
+										
+										for (key in entityMap) {
+											if(!$('#' + _this._createFormFieldId(key))[0].checked) {
+												delete entityMap[key];
+											}
 										}
-									}
-									
-									var parameters = {
-											"method" : "freeze",
-											"sessionToken" : sessionToken,
-											"freezeList" : entityMap
-									}
-									mainController.serverFacade.customASService(parameters, function(result) {
-										if(result.status === "OK") {
-											Util.showSuccess("Freezing succeeded.", function() {
-												Util.unblockUI();
-												switch(entityType) {
+										
+										var parameters = {
+												"method" : "freeze",
+												"sessionToken" : sessionToken,
+												"freezeList" : entityMap
+										}
+										mainController.serverFacade.customASService(parameters, function(result) {
+											if(result.status === "OK") {
+												Util.showSuccess("Freezing succeeded.", function() {
+													Util.unblockUI();
+													switch(entityType) {
 													case "SPACE":
 														mainController.changeView('showSpacePage', permId);
 														break;
@@ -1652,17 +1653,22 @@ var FormUtil = new function() {
 													case "DATASET":
 														mainController.changeView('showViewDataSetPageFromPermId', permId);
 														break;
-												}
-											});
-										} else {
-											Util.showUserError('Freezing failed.', function() {
-												Util.unblockUI();
-											});
-										}
-									}, "freeze-api",  _this.showFreezingError);
-								}
-							});
-					Util.blockUI();
+													}
+												});
+											} else {
+												Util.showUserError('Freezing failed.', function() {
+													Util.unblockUI();
+												});
+											}
+										}, "freeze-api",  _this.showFreezingError);
+									}
+								});
+						Util.blockUI();
+					} else {
+						Util.showUserError('Nothing selected for freezing.', function() {
+							Util.unblockUI();
+						});
+					}
 				});
 					
 				var css = {
@@ -1684,6 +1690,19 @@ var FormUtil = new function() {
 		}, "freeze-api", _this.showFreezingError);
 	}
 	
+	this._atLeastOnyEntitySelectedHasBeenSelectedForFreezing = function(entityMap) {
+		for (key in entityMap) {
+			if ($('#' + this._createFormFieldId(key))[0].checked) {
+				return true;
+			}
+		}
+		return false;
+	}
+	
+	this._createFormFieldId = function(key) {
+		return 'freezing-form-' + key.replace("+", "-");
+	}
+	
 	this.showFreezingError = function(error) {
 		Util.showError(error.message);
 	}
diff --git a/openbis_standard_technologies/dist/core-plugins/eln-lims/1/as/webapps/eln-lims/html/js/views/Inventory/InventoryView.js b/openbis_standard_technologies/dist/core-plugins/eln-lims/1/as/webapps/eln-lims/html/js/views/Inventory/InventoryView.js
index 8265e76b1a8157aa3b811b6f00b2100995ff6155..0f759da88b94ab92a84789bbf2694b36d84ad91d 100644
--- a/openbis_standard_technologies/dist/core-plugins/eln-lims/1/as/webapps/eln-lims/html/js/views/Inventory/InventoryView.js
+++ b/openbis_standard_technologies/dist/core-plugins/eln-lims/1/as/webapps/eln-lims/html/js/views/Inventory/InventoryView.js
@@ -32,13 +32,12 @@ function InventoryView(inventoryController, inventoryView) {
 		//
 		var toolbarModel = [];
 		
-		mainController.serverFacade.listSpacesWithProjectsAndRoleAssignments(null, function(dataWithSpacesAndProjects) {
-				var spaces = dataWithSpacesAndProjects.result;
+		mainController.serverFacade.listSpaces(function(spaces) {
 	            var labSpaces = [];
 				for (var i = 0; i < spaces.length; i++) {
 	                var space = spaces[i];
-	                if(profile.isInventorySpace(space.code) && !space.code.endsWith("STOCK_CATALOG") && !space.code.endsWith("STOCK_ORDERS") && !space.code.endsWith("ELN_SETTINGS")) {
-	                		labSpaces.push({ type: "SPACE", permId : space.code, expand : true });
+	                if(profile.isInventorySpace(space) && !space.endsWith("STOCK_CATALOG") && !space.endsWith("STOCK_ORDERS") && !space.endsWith("ELN_SETTINGS")) {
+	                		labSpaces.push({ type: "SPACE", permId : space, expand : true });
 	                }
 	            }
 	            
diff --git a/openbis_standard_technologies/dist/core-plugins/eln-lims/1/as/webapps/eln-lims/html/js/views/LabNotebook/LabNotebookView.js b/openbis_standard_technologies/dist/core-plugins/eln-lims/1/as/webapps/eln-lims/html/js/views/LabNotebook/LabNotebookView.js
index 3e5ca01092b4d7072940011f3e08ea78948265c3..23f1938cf1390b6dfda0c6f4f697a4609dd820a6 100644
--- a/openbis_standard_technologies/dist/core-plugins/eln-lims/1/as/webapps/eln-lims/html/js/views/LabNotebook/LabNotebookView.js
+++ b/openbis_standard_technologies/dist/core-plugins/eln-lims/1/as/webapps/eln-lims/html/js/views/LabNotebook/LabNotebookView.js
@@ -32,13 +32,12 @@ function LabNotebookView(labNotebookController, labNotebookView) {
 		//
 		var toolbarModel = [];
 		
-		mainController.serverFacade.listSpacesWithProjectsAndRoleAssignments(null, function(dataWithSpacesAndProjects) {
-			var spaces = dataWithSpacesAndProjects.result;
+		mainController.serverFacade.listSpaces(function(spaces) {
 	        var labSpaces = [];
 			for (var i = 0; i < spaces.length; i++) {
 	       		var space = spaces[i];
-	           	if(!profile.isInventorySpace(space.code)) {
-	           		labSpaces.push({ type: "SPACE", permId : space.code, expand : true });
+	           	if(!profile.isInventorySpace(space)) {
+	           		labSpaces.push({ type: "SPACE", permId : space, expand : true });
 	         	}
 	       	}
 	            
diff --git a/openbis_standard_technologies/dist/core-plugins/eln-lims/1/as/webapps/eln-lims/html/js/views/SpaceForm/SpaceFormController.js b/openbis_standard_technologies/dist/core-plugins/eln-lims/1/as/webapps/eln-lims/html/js/views/SpaceForm/SpaceFormController.js
index b2db9fd4456891997c709fe84141b24d83dca6b4..215c023a1e72976b85e2a09b37d0ee5f7919907f 100644
--- a/openbis_standard_technologies/dist/core-plugins/eln-lims/1/as/webapps/eln-lims/html/js/views/SpaceForm/SpaceFormController.js
+++ b/openbis_standard_technologies/dist/core-plugins/eln-lims/1/as/webapps/eln-lims/html/js/views/SpaceForm/SpaceFormController.js
@@ -24,11 +24,11 @@ function SpaceFormController(mainController, space) {
 		
 		require([ "as/dto/space/id/SpacePermId", "as/dto/space/fetchoptions/SpaceFetchOptions" ],
 			function(SpacePermId, SpaceFetchOptions) {
-			var id = new SpacePermId(space.code);
+			var id = new SpacePermId(space);
 			mainController.openbisV3.getSpaces([ id ], new SpaceFetchOptions()).done(function(map) {
                 _this._spaceFormModel.v3_space = map[id];
                 _this._mainController.getUserRole({
-        			space: _this._spaceFormModel.space.code
+        			space: _this._spaceFormModel.space
         		}, function(roles){
         			_this._spaceFormModel.roles = roles;
         			_this._spaceFormView.repaint(views);
@@ -42,7 +42,7 @@ function SpaceFormController(mainController, space) {
 	}
 
 	this.createProject = function() {
-		this._mainController.changeView('showCreateProjectPage', this._spaceFormModel.space.code);
+		this._mainController.changeView('showCreateProjectPage', this._spaceFormModel.space);
 	}
 
 }
\ No newline at end of file
diff --git a/openbis_standard_technologies/dist/core-plugins/eln-lims/1/as/webapps/eln-lims/html/js/views/SpaceForm/SpaceFormView.js b/openbis_standard_technologies/dist/core-plugins/eln-lims/1/as/webapps/eln-lims/html/js/views/SpaceForm/SpaceFormView.js
index 6d25177f692be77db0c5739a34593dac448a0f18..ca91751a9770f772bc44efa4ce3602caf8a3b48a 100644
--- a/openbis_standard_technologies/dist/core-plugins/eln-lims/1/as/webapps/eln-lims/html/js/views/SpaceForm/SpaceFormView.js
+++ b/openbis_standard_technologies/dist/core-plugins/eln-lims/1/as/webapps/eln-lims/html/js/views/SpaceForm/SpaceFormView.js
@@ -29,7 +29,7 @@ function SpaceFormView(spaceFormController, spaceFormModel) {
 		
 		var typeTitle = "Space: ";
 		
-		var $formTitle = $("<h2>").append(typeTitle + this._spaceFormModel.space.code);
+		var $formTitle = $("<h2>").append(typeTitle + this._spaceFormModel.space);
 		
 		//
 		// Toolbar
@@ -43,10 +43,10 @@ function SpaceFormView(spaceFormController, spaceFormModel) {
 		}
 
 		//Export
-		var $exportAll = FormUtil.getExportButton([{ type: "SPACE", permId : _this._spaceFormModel.space.code, expand : true }], false);
+		var $exportAll = FormUtil.getExportButton([{ type: "SPACE", permId : _this._spaceFormModel.space, expand : true }], false);
 		toolbarModel.push({ component : $exportAll, tooltip: "Export Metadata & Data" });
 		
-		var $exportOnlyMetadata = FormUtil.getExportButton([{ type: "SPACE", permId : _this._spaceFormModel.space.code, expand : true }], true);
+		var $exportOnlyMetadata = FormUtil.getExportButton([{ type: "SPACE", permId : _this._spaceFormModel.space, expand : true }], true);
 		toolbarModel.push({ component : $exportOnlyMetadata, tooltip: "Export Metadata only" });
 		
 		//Jupyter Button
diff --git a/openbis_standard_technologies/dist/core-plugins/eln-lims/1/as/webapps/eln-lims/html/js/views/Stock/StockView.js b/openbis_standard_technologies/dist/core-plugins/eln-lims/1/as/webapps/eln-lims/html/js/views/Stock/StockView.js
index 5f9dbaada129d7b0b604c8286a9791173d2062d7..0b05416901f41b9445d21435d0659708a833d245 100644
--- a/openbis_standard_technologies/dist/core-plugins/eln-lims/1/as/webapps/eln-lims/html/js/views/Stock/StockView.js
+++ b/openbis_standard_technologies/dist/core-plugins/eln-lims/1/as/webapps/eln-lims/html/js/views/Stock/StockView.js
@@ -35,13 +35,12 @@ function StockView(stockController, stockView) {
 		var $export = FormUtil.getButtonWithIcon("glyphicon-export", function() {
 			Util.blockUI();
 			var facade = mainController.serverFacade;
-			facade.listSpacesWithProjectsAndRoleAssignments(null, function(dataWithSpacesAndProjects) {
-				var spaces = dataWithSpacesAndProjects.result;
+			facade.listSpaces(function(spaces) {
 	            var stockSpaces = [];
 				for (var i = 0; i < spaces.length; i++) {
 	                var space = spaces[i];
-	                if(space.code === "STOCK_CATALOG" || space.code === "STOCK_ORDERS") {
-	                	stockSpaces.push({ type: "SPACE", permId : space.code, expand : true });
+	                if(space === "STOCK_CATALOG" || space === "STOCK_ORDERS") {
+	                	stockSpaces.push({ type: "SPACE", permId : space, expand : true });
 	                }
 	            }
 	            
diff --git a/openbis_standard_technologies/dist/server/service.properties b/openbis_standard_technologies/dist/server/service.properties
index 5a3431b14ebed33be0ad679a89087ad58659aec1..0e38ec4f10eea30ad869f6b8a5e1f88fb63a0d93 100644
--- a/openbis_standard_technologies/dist/server/service.properties
+++ b/openbis_standard_technologies/dist/server/service.properties
@@ -21,6 +21,15 @@ database.max-idle-connections =
 # connections. Default: 3600s.
 database.active-connections-log-interval = 
 
+# ---------------------------------------------------------------------------
+# Master data by Excel sheets
+# ---------------------------------------------------------------------------
+# Path to the file which stores version information of master data imported from Excel sheets. 
+# Default value: ../../../xls-import-version-info.json. The file will be created. 
+# It should be <openbis installation path>/servers/openBIS-server. 
+# Note, that the folder containing this file has to exist. 
+# xls-import.version-data-file = ../../../xls-import-version-info.json
+
 # ---------------------------------------------------------------------------
 # Imaging database for screening and microscopy (optional, only used if screening technology switched on)
 # ---------------------------------------------------------------------------
diff --git a/rtd_phosphonetx/build.gradle b/rtd_phosphonetx/build.gradle
index 430f4fe6471fdab68e8d595e9be7fc991dee47e4..a53a350ca6216b9c5c52b20743dd3a825c140888 100644
--- a/rtd_phosphonetx/build.gradle
+++ b/rtd_phosphonetx/build.gradle
@@ -18,11 +18,6 @@ dependencies {
 }
 
 sourceSets {
-	main {
-		resources {
-			srcDirs = ['source/java']
-		}
-	}
 	test {
 		resources {
 			srcDirs = ['source/java']
diff --git a/screening/build.gradle b/screening/build.gradle
index 3e859afcbdbe66e41f6be96baefe8acc866e0e9a..4b6fec3fbfddc91e0c1a86675a29b31b26fc03df 100644
--- a/screening/build.gradle
+++ b/screening/build.gradle
@@ -21,11 +21,6 @@ dependencies {
 }
 
 sourceSets {
-    main {
-        resources {
-            srcDirs = ['source/java']
-        }
-    }
     test {
         resources {
             srcDirs = ['source/java']