diff --git a/src/python/dm/cat_web_service/api/fileRestApi.py b/src/python/dm/cat_web_service/api/fileRestApi.py
index 6ba48a61fa348ec4343208edd725f75da319a047..ea9f62310ed4ac344d6b2aeedf0b97de2b256155 100755
--- a/src/python/dm/cat_web_service/api/fileRestApi.py
+++ b/src/python/dm/cat_web_service/api/fileRestApi.py
@@ -20,12 +20,12 @@ class FileRestApi(CatRestApi):
         experimentName = fileInfo.get('experimentName')
         if not experimentName:
             raise InvalidRequest('File metadata must contain experimentName key.')
-        fileName = fileInfo.get('name')
+        fileName = fileInfo.get('fileName')
         if not fileName:
-            raise InvalidRequest('File metadata must contain name key.')
+            raise InvalidRequest('File metadata must contain fileName key.')
         url = '%s/filesByExperiment/%s/%s' % (self.getContextRoot(), experimentName, fileName)
         url += '?fileInfo=%s' % (Encoder.encode(json.dumps(fileInfo)))
-        responseData = self.sendRequest(url=url, method='POST')
+        responseData = self.sendSessionRequest(url=url, method='POST')
         return FileMetadata(responseData)
 
     @CatRestApi.execute
@@ -33,12 +33,12 @@ class FileRestApi(CatRestApi):
         experimentName = fileInfo.get('experimentName')
         if not experimentName:
             raise InvalidRequest('File metadata must contain experimentName key.')
-        fileName = fileInfo.get('name')
+        fileName = fileInfo.get('fileName')
         if not fileName:
-            raise InvalidRequest('File metadata must contain name key.')
+            raise InvalidRequest('File metadata must contain fileName key.')
         url = '%s/filesByExperiment/%s/%s' % (self.getContextRoot(), experimentName, fileName)
         url += '?fileInfo=%s' % (Encoder.encode(json.dumps(fileInfo)))
-        responseData = self.sendRequest(url=url, method='PUT')
+        responseData = self.sendSessionRequest(url=url, method='PUT')
         return FileMetadata(responseData)
 
     @CatRestApi.execute
@@ -48,14 +48,14 @@ class FileRestApi(CatRestApi):
             raise InvalidRequest('File metadata must contain id key.')
         url = '%s/files/%s' % (self.getContextRoot(), id)
         url += '?fileInfo=%s' % (Encoder.encode(json.dumps(fileInfo)))
-        responseData = self.sendRequest(url=url, method='PUT')
+        responseData = self.sendSessionRequest(url=url, method='PUT')
         return FileMetadata(responseData)
 
     @CatRestApi.execute
     def getFiles(self, queryDict={}):
         url = '%s/files' % (self.getContextRoot())
         url += '?queryDict=%s' % (Encoder.encode(json.dumps(queryDict)))
-        responseData = self.sendRequest(url=url, method='GET')
+        responseData = self.sendSessionRequest(url=url, method='GET')
         return self.toDmObjectList(responseData, FileMetadata)
 
     @CatRestApi.execute
@@ -64,7 +64,7 @@ class FileRestApi(CatRestApi):
             raise InvalidRequest('Invalid experiment name provided.')
         url = '%s/filesByExperiment/%s' % (self.getContextRoot(), experimentName)
         url += '?queryDict=%s' % (Encoder.encode(json.dumps(queryDict)))
-        responseData = self.sendRequest(url=url, method='GET')
+        responseData = self.sendSessionRequest(url=url, method='GET')
         return self.toDmObjectList(responseData, FileMetadata)
 
     @CatRestApi.execute
@@ -72,7 +72,7 @@ class FileRestApi(CatRestApi):
         if not id:
             raise InvalidRequest('Invalid file id provided.')
         url = '%s/files/%s' % (self.getContextRoot(), id)
-        responseData = self.sendRequest(url=url, method='GET')
+        responseData = self.sendSessionRequest(url=url, method='GET')
         return FileMetadata(responseData)
 
     @CatRestApi.execute
@@ -82,7 +82,7 @@ class FileRestApi(CatRestApi):
         if not fileName:
             raise InvalidRequest('Invalid file name provided.')
         url = '%s/filesByExperiment/%s/%s' % (self.getContextRoot(), experimentName, fileName)
-        responseData = self.sendRequest(url=url, method='GET')
+        responseData = self.sendSessionRequest(url=url, method='GET')
         return FileMetadata(responseData)
 
 #######################################################################
@@ -97,7 +97,7 @@ if __name__ == '__main__':
     import time
     t = long(time.time())
     fileInfo = {
-        'name' : 'sv-%s' % t,
+        'fileName' : 'sv-%s' % t,
         'experimentName' : 'exp1',
         'power' : 12,
         'powerUnits' : 'kW',
diff --git a/src/python/dm/cat_web_service/cli/addExperimentFileCli.py b/src/python/dm/cat_web_service/cli/addExperimentFileCli.py
index 4e7c1f86646f8b03ce213e76d35e43e3bf528746..942b05d0e0049f84007df77a91f3e1166e179f11 100755
--- a/src/python/dm/cat_web_service/cli/addExperimentFileCli.py
+++ b/src/python/dm/cat_web_service/cli/addExperimentFileCli.py
@@ -7,7 +7,7 @@ from catWebServiceSessionCli import CatWebServiceSessionCli
 class AddExperimentFileCli(CatWebServiceSessionCli):
     def __init__(self):
         CatWebServiceSessionCli.__init__(self, validArgCount=self.ANY_NUMBER_OF_POSITIONAL_ARGS)
-        self.addOption('', '--name', dest='fileName', help='File name.')
+        self.addOption('', '--file', dest='fileName', help='File name.')
         self.addOption('', '--experiment', dest='experimentName', help='Experiment name.')
 
     def checkArgs(self):
@@ -24,7 +24,7 @@ class AddExperimentFileCli(CatWebServiceSessionCli):
 
     def runCommand(self):
         self.parseArgs(usage="""
-    dm-add-experiment-file --name=FILENAME --experiment=EXPERIMENTNAME 
+    dm-add-experiment-file --file=FILENAME --experiment=EXPERIMENTNAME 
         [key1:value1, key2:value2, ...]
 
 Description:
@@ -35,7 +35,7 @@ Description:
         api = FileRestApi(self.getLoginUsername(), self.getLoginPassword(), self.getServiceHost(), self.getServicePort(), self.getServiceProtocol())
         fileInfo = self.splitArgsIntoDict()
         fileInfo['experimentName'] = self.getExperimentName()
-        fileInfo['name'] = self.getFileName()
+        fileInfo['fileName'] = self.getFileName()
         fileMetadata = api.addExperimentFile(fileInfo)
         print fileMetadata.getDisplayString(self.getDisplayKeys(), self.getDisplayFormat())
 
diff --git a/src/python/dm/cat_web_service/cli/getExperimentFileCli.py b/src/python/dm/cat_web_service/cli/getExperimentFileCli.py
index a397feb5d3970c9a2a4fd06a0dbe21507a6710d7..865d16b98bfec915dd191f65c07109a8684071c3 100755
--- a/src/python/dm/cat_web_service/cli/getExperimentFileCli.py
+++ b/src/python/dm/cat_web_service/cli/getExperimentFileCli.py
@@ -7,7 +7,7 @@ from catWebServiceSessionCli import CatWebServiceSessionCli
 class GetExperimentFileCli(CatWebServiceSessionCli):
     def __init__(self):
         CatWebServiceSessionCli.__init__(self, validArgCount=self.ANY_NUMBER_OF_POSITIONAL_ARGS)
-        self.addOption('', '--name', dest='fileName', help='File name.')
+        self.addOption('', '--file', dest='fileName', help='File name.')
         self.addOption('', '--experiment', dest='experimentName', help='Experiment name.')
 
     def checkArgs(self):
@@ -24,7 +24,7 @@ class GetExperimentFileCli(CatWebServiceSessionCli):
 
     def runCommand(self):
         self.parseArgs(usage="""
-    dm-get-experiment-file --name=FILENAME --experiment=EXPERIMENTNAME 
+    dm-get-experiment-file --file=FILENAME --experiment=EXPERIMENTNAME 
 
 Description:
     Retrieve experiment file metadata from the catalog. 
diff --git a/src/python/dm/cat_web_service/cli/updateExperimentFileCli.py b/src/python/dm/cat_web_service/cli/updateExperimentFileCli.py
index d5bfa2f3ae099862283015b3861aa89780e88913..341ae981071775f6fe3b0393fdbb1cfa91d01fa2 100755
--- a/src/python/dm/cat_web_service/cli/updateExperimentFileCli.py
+++ b/src/python/dm/cat_web_service/cli/updateExperimentFileCli.py
@@ -7,7 +7,7 @@ from catWebServiceSessionCli import CatWebServiceSessionCli
 class UpdateExperimentFileCli(CatWebServiceSessionCli):
     def __init__(self):
         CatWebServiceSessionCli.__init__(self, validArgCount=self.ANY_NUMBER_OF_POSITIONAL_ARGS)
-        self.addOption('', '--name', dest='fileName', help='File name.')
+        self.addOption('', '--file', dest='fileName', help='File name.')
         self.addOption('', '--experiment', dest='experimentName', help='Experiment name.')
 
     def checkArgs(self):
@@ -24,7 +24,7 @@ class UpdateExperimentFileCli(CatWebServiceSessionCli):
 
     def runCommand(self):
         self.parseArgs(usage="""
-    dm-update-experiment-file --name=FILENAME --experiment=EXPERIMENTNAME 
+    dm-update-experiment-file --file=FILENAME --experiment=EXPERIMENTNAME 
         [key1:value1, key2:value2, ...]
 
 Description:
@@ -37,7 +37,7 @@ Description:
         api = FileRestApi(self.getLoginUsername(), self.getLoginPassword(), self.getServiceHost(), self.getServicePort(), self.getServiceProtocol())
         fileInfo = self.splitArgsIntoDict()
         fileInfo['experimentName'] = self.getExperimentName()
-        fileInfo['name'] = self.getFileName()
+        fileInfo['fileName'] = self.getFileName()
         fileMetadata = api.updateExperimentFile(fileInfo)
         print fileMetadata.getDisplayString(self.getDisplayKeys(), self.getDisplayFormat())
 
diff --git a/src/python/dm/cat_web_service/service/catWebServiceRouteMapper.py b/src/python/dm/cat_web_service/service/catWebServiceRouteMapper.py
index f84f2e4972a87dbadf50c3ede29fa53448857607..32fe1568efbc3c3227b8718972a7f1fdb7f1ffde 100755
--- a/src/python/dm/cat_web_service/service/catWebServiceRouteMapper.py
+++ b/src/python/dm/cat_web_service/service/catWebServiceRouteMapper.py
@@ -12,6 +12,7 @@ from dm.common.utility.loggingManager import LoggingManager
 from dm.common.utility.configurationManager import ConfigurationManager
 from dm.common.service.loginRouteDescriptor import LoginRouteDescriptor
 from fileRouteDescriptor import FileRouteDescriptor
+from datasetRouteDescriptor import DatasetRouteDescriptor
 
 class CatWebServiceRouteMapper:
 
@@ -25,6 +26,7 @@ class CatWebServiceRouteMapper:
         # Get routes.
         routes = LoginRouteDescriptor.getRoutes() 
         routes += FileRouteDescriptor.getRoutes()
+        routes += DatasetRouteDescriptor.getRoutes()
 
         # Add routes to dispatcher. 
         d = cherrypy.dispatch.RoutesDispatcher()
diff --git a/src/python/dm/cat_web_service/service/fileRouteDescriptor.py b/src/python/dm/cat_web_service/service/fileRouteDescriptor.py
index 5f5f4bd9d5d65d942aca08ef7a02a708dd18d87b..700a8df8459d6fa81fd9d30bd2d794ffa9fe0c21 100755
--- a/src/python/dm/cat_web_service/service/fileRouteDescriptor.py
+++ b/src/python/dm/cat_web_service/service/fileRouteDescriptor.py
@@ -1,11 +1,11 @@
 #!/usr/bin/env python
 
 #
-# User route descriptor.
+# File route descriptor.
 #
 
 from dm.common.utility.configurationManager import ConfigurationManager
-from fileController import FileController
+from fileSessionController import FileSessionController
 
 class FileRouteDescriptor:
 
@@ -14,7 +14,7 @@ class FileRouteDescriptor:
         contextRoot = ConfigurationManager.getInstance().getContextRoot()
 
         # Static instances shared between different routes
-        fileController = FileController()
+        fileSessionController = FileSessionController()
 
         # Define routes.
         routes = [
@@ -23,7 +23,7 @@ class FileRouteDescriptor:
             {
                 'name' : 'addExperimentFile',
                 'path' : '%s/filesByExperiment/:(experimentName)/:(fileName)' % contextRoot,
-                'controller' : fileController,
+                'controller' : fileSessionController,
                 'action' : 'addExperimentFile',
                 'method' : ['POST']
             },
@@ -32,7 +32,7 @@ class FileRouteDescriptor:
             {
                 'name' : 'updateFileById',
                 'path' : '%s/files/:(id)' % contextRoot,
-                'controller' : fileController,
+                'controller' : fileSessionController,
                 'action' : 'updateFileById',
                 'method' : ['PUT']
             },
@@ -41,7 +41,7 @@ class FileRouteDescriptor:
             {
                 'name' : 'updateExperimentFile',
                 'path' : '%s/filesByExperiment/:(experimentName)/:(fileName)' % contextRoot,
-                'controller' : fileController,
+                'controller' : fileSessionController,
                 'action' : 'updateExperimentFile',
                 'method' : ['PUT']
             },
@@ -50,7 +50,7 @@ class FileRouteDescriptor:
             {
                 'name' : 'getFiles',
                 'path' : '%s/files' % contextRoot,
-                'controller' : fileController,
+                'controller' : fileSessionController,
                 'action' : 'getFiles',
                 'method' : ['GET']
             },
@@ -59,7 +59,7 @@ class FileRouteDescriptor:
             {
                 'name' : 'getExperimentFiles',
                 'path' : '%s/filesByExperiment/:(experimentName)' % contextRoot,
-                'controller' : fileController,
+                'controller' : fileSessionController,
                 'action' : 'getExperimentFiles',
                 'method' : ['GET']
             },
@@ -68,7 +68,7 @@ class FileRouteDescriptor:
             {
                 'name' : 'getFileById',
                 'path' : '%s/files/:(id)' % contextRoot,
-                'controller' : fileController,
+                'controller' : fileSessionController,
                 'action' : 'getFileById',
                 'method' : ['GET']
             },
@@ -77,7 +77,7 @@ class FileRouteDescriptor:
             {
                 'name' : 'getExperimentFile',
                 'path' : '%s/filesByExperiment/:(experimentName)/:(fileName)' % contextRoot,
-                'controller' : fileController,
+                'controller' : fileSessionController,
                 'action' : 'getExperimentFile',
                 'method' : ['GET']
             },
diff --git a/src/python/dm/cat_web_service/service/fileController.py b/src/python/dm/cat_web_service/service/fileSessionController.py
similarity index 62%
rename from src/python/dm/cat_web_service/service/fileController.py
rename to src/python/dm/cat_web_service/service/fileSessionController.py
index f1a6f43b73c51d1e02bf9e17e714a5ac0062b015..f2ff6b8bcb2f3a0c5b2ce13a825dad7976f45b59 100755
--- a/src/python/dm/cat_web_service/service/fileController.py
+++ b/src/python/dm/cat_web_service/service/fileSessionController.py
@@ -3,17 +3,18 @@
 import cherrypy
 import json
 from dm.common.utility.encoder import Encoder
-from dm.common.service.dmController import DmController
-from dm.cat_web_service.service.impl.fileControllerImpl import FileControllerImpl
+from dm.common.service.dmSessionController import DmSessionController
+from dm.cat_web_service.service.impl.fileSessionControllerImpl import FileSessionControllerImpl
 
-class FileController(DmController):
+class FileSessionController(DmSessionController):
 
     def __init__(self):
-        DmController.__init__(self)
-        self.fileControllerImpl = FileControllerImpl()
+        DmSessionController.__init__(self)
+        self.fileSessionControllerImpl = FileSessionControllerImpl()
 
     @cherrypy.expose
-    @DmController.execute
+    @DmSessionController.require(DmSessionController.isAdministrator())
+    @DmSessionController.execute
     def addExperimentFile(self, experimentName, fileName, **kwargs):
         if not experimentName:
             raise InvalidRequest('Invalid experiment name provided.')
@@ -23,14 +24,15 @@ class FileController(DmController):
         if not encodedFileInfo:
             raise InvalidRequest('Invalid file info provided.')
         fileInfo = json.loads(Encoder.decode(encodedFileInfo))
-        fileInfo['name'] = fileName
+        fileInfo['fileName'] = fileName
         fileInfo['experimentName'] = experimentName
-        response = self.fileControllerImpl.addExperimentFile(fileInfo).getFullJsonRep()
+        response = self.fileSessionControllerImpl.addExperimentFile(fileInfo).getFullJsonRep()
         self.logger.debug('Added file %s: %s' % (fileName,response))
         return response
 
     @cherrypy.expose
-    @DmController.execute
+    @DmSessionController.require(DmSessionController.isAdministrator())
+    @DmSessionController.execute
     def updateExperimentFile(self, experimentName, fileName, **kwargs):
         if not experimentName:
             raise InvalidRequest('Invalid experiment name provided.')
@@ -40,14 +42,15 @@ class FileController(DmController):
         if not encodedFileInfo:
             raise InvalidRequest('Invalid file info provided.')
         fileInfo = json.loads(Encoder.decode(encodedFileInfo))
-        fileInfo['name'] = fileName
+        fileInfo['fileName'] = fileName
         fileInfo['experimentName'] = experimentName
-        response = self.fileControllerImpl.updateExperimentFile(fileInfo).getFullJsonRep()
+        response = self.fileSessionControllerImpl.updateExperimentFile(fileInfo).getFullJsonRep()
         self.logger.debug('Updated file %s: %s' % (fileName,response))
         return response
 
     @cherrypy.expose
-    @DmController.execute
+    @DmSessionController.require(DmSessionController.isAdministrator())
+    @DmSessionController.execute
     def updateFileById(self, id, **kwargs):
         if not id:
             raise InvalidRequest('Invalid file id provided.')
@@ -55,21 +58,23 @@ class FileController(DmController):
         if not encodedFileInfo:
             raise InvalidRequest('Invalid file info provided.')
         fileInfo = json.loads(Encoder.decode(encodedFileInfo))
-        response = self.fileControllerImpl.updateFileById(fileInfo).getFullJsonRep()
+        response = self.fileSessionControllerImpl.updateFileById(fileInfo).getFullJsonRep()
         self.logger.debug('Updated file id %s: %s' % (id,response))
         return response
 
     @cherrypy.expose
-    @DmController.execute
+    @DmSessionController.require(DmSessionController.isAdministrator())
+    @DmSessionController.execute
     def getFiles(self, **kwargs):
         encodedQueryDict = kwargs.get('queryDict')
         queryDict = {}
         if encodedQueryDict:
             queryDict = json.loads(Encoder.decode(encodedQueryDict))
-        return self.listToJson(self.fileControllerImpl.getFiles(queryDict=queryDict))
+        return self.listToJson(self.fileSessionControllerImpl.getFiles(queryDict=queryDict))
 
     @cherrypy.expose
-    @DmController.execute
+    @DmSessionController.require(DmSessionController.isAdministrator())
+    @DmSessionController.execute
     def getExperimentFiles(self, experimentName, **kwargs):
         if not experimentName:
             raise InvalidRequest('Invalid experiment name provided.')
@@ -77,25 +82,27 @@ class FileController(DmController):
         queryDict = {}
         if encodedQueryDict:
             queryDict = json.loads(Encoder.decode(encodedQueryDict))
-        return self.listToJson(self.fileControllerImpl.getExperimentFiles(experimentName, queryDict=queryDict))
+        return self.listToJson(self.fileSessionControllerImpl.getExperimentFiles(experimentName, queryDict=queryDict))
 
     @cherrypy.expose
-    @DmController.execute
+    @DmSessionController.require(DmSessionController.isAdministrator())
+    @DmSessionController.execute
     def getFileById(self, id, **kwargs):
         if not id:
             raise InvalidRequest('Invalid id provided.')
-        response = self.fileControllerImpl.getFileById(id).getFullJsonRep()
+        response = self.fileSessionControllerImpl.getFileById(id).getFullJsonRep()
         self.logger.debug('Returning file id %s: %s' % (id,response))
         return response
 
     @cherrypy.expose
-    @DmController.execute
+    @DmSessionController.require(DmSessionController.isAdministrator())
+    @DmSessionController.execute
     def getExperimentFile(self, experimentName, fileName, **kwargs):
         if not experimentName:
             raise InvalidRequest('Invalid experiment name provided.')
         if not fileName:
             raise InvalidRequest('Invalid file name provided.')
-        response = self.fileControllerImpl.getExperimentFile(experimentName, fileName).getFullJsonRep()
+        response = self.fileSessionControllerImpl.getExperimentFile(experimentName, fileName).getFullJsonRep()
         self.logger.debug('Returning file %s: %s' % (fileName,response))
         return response
 
diff --git a/src/python/dm/cat_web_service/service/impl/fileControllerImpl.py b/src/python/dm/cat_web_service/service/impl/fileSessionControllerImpl.py
similarity index 96%
rename from src/python/dm/cat_web_service/service/impl/fileControllerImpl.py
rename to src/python/dm/cat_web_service/service/impl/fileSessionControllerImpl.py
index 3ce0413206c82b8f3a06c0955a5bc4dbaca94085..8cae782911aa15d95bda91e14abfde772c1e82f3 100755
--- a/src/python/dm/cat_web_service/service/impl/fileControllerImpl.py
+++ b/src/python/dm/cat_web_service/service/impl/fileSessionControllerImpl.py
@@ -8,7 +8,7 @@ from dm.common.objects.dmObject import DmObject
 from dm.common.objects.dmObjectManager import DmObjectManager
 from dm.common.mongodb.api.fileMongoDbApi import FileMongoDbApi
 
-class FileControllerImpl(DmObjectManager):
+class FileSessionControllerImpl(DmObjectManager):
     """ File controller implementation class. """
 
     def __init__(self):
diff --git a/src/python/dm/common/mongodb/api/dmMongoDbApi.py b/src/python/dm/common/mongodb/api/dmMongoDbApi.py
index 6d9f79961d1a6b0587ff126b309138cce5f2023b..b58d23deffb212ddde2cdade8c90c27efa5e0e2f 100755
--- a/src/python/dm/common/mongodb/api/dmMongoDbApi.py
+++ b/src/python/dm/common/mongodb/api/dmMongoDbApi.py
@@ -1,11 +1,15 @@
 #!/usr/bin/env python
 
+import copy
 from dm.common.exceptions.dmException import DmException
 from dm.common.utility.loggingManager import LoggingManager
 from dm.common.mongodb.impl.mongoDbManager import MongoDbManager
 
 class DmMongoDbApi:
     """ Base Mongo DB API class. """
+
+    SYSTEM_KEY_LIST = ['_id']
+
     def __init__(self):
         self.logger = LoggingManager.getInstance().getLogger(self.__class__.__name__)
         self.dbClient = MongoDbManager.getInstance().getDbClient()
@@ -46,13 +50,28 @@ class DmMongoDbApi:
 
     @classmethod
     def scrubMongoDbObject(cls, mongoDbObject):
-        for key in ['_id']:
+        for key in cls.SYSTEM_KEY_LIST:
             if mongoDbObject.has_key(key):
                 # Remove leading underscore
                 newKey = key[1:]
                 mongoDbObject[newKey] = str(mongoDbObject[key])
                 del mongoDbObject[key]
 
+    @classmethod
+    def getMongoDict(cls, dict):
+        mongoDict = copy.copy(dict)
+        for key in cls.SYSTEM_KEY_LIST:
+            # if dictionary has system key, do not modify it
+            if mongoDict.has_key(key):
+                continue
+            # If provided dict has system key without leading underscore
+            # modify it
+            key2 = key[1:]
+            if mongoDict.has_key(key2):
+                mongoDict[key] = mongoDict[key2]
+                del mongoDict[key2]
+        return mongoDict
+
 #######################################################################
 # Testing.
 if __name__ == '__main__':
diff --git a/src/python/dm/common/mongodb/api/fileMongoDbApi.py b/src/python/dm/common/mongodb/api/fileMongoDbApi.py
index ec24befd2fed319cc8a86dbd846eea371c32a2a0..f022c93bf5f596b018e7718ecd9ae92fc155c129 100755
--- a/src/python/dm/common/mongodb/api/fileMongoDbApi.py
+++ b/src/python/dm/common/mongodb/api/fileMongoDbApi.py
@@ -9,18 +9,22 @@ from dm.common.objects.fileMetadata import FileMetadata
 
 class FileMongoDbApi(DmMongoDbApi):
 
+    SYSTEM_KEY_LIST = ['_id', '_fileName', '_experimentName']
+
     def __init__(self):
         DmMongoDbApi.__init__(self)
         self.fileCollection = FileCollection(self.dbClient)
 
     @DmMongoDbApi.executeDbCall
     def addExperimentFile(self, fileInfo, **kwargs):
-        dbFileMetadata = self.fileCollection.addByUniqueKeys(fileInfo)
+        fileInfo2 = self.getMongoDict(fileInfo)
+        dbFileMetadata = self.fileCollection.addByUniqueKeys(fileInfo2)
         return self.toDmObject(dbFileMetadata, FileMetadata)
 
     @DmMongoDbApi.executeDbCall
     def getFiles(self, queryDict={}, returnFieldDict=FileCollection.ALL_FIELDS_DICT, **kwargs):
-        return self.listToDmObjects(self.fileCollection.findByQueryDict(queryDict, returnFieldDict), FileMetadata)
+        queryDict2 = self.getMongoDict(queryDict)
+        return self.listToDmObjects(self.fileCollection.findByQueryDict(queryDict2, returnFieldDict), FileMetadata)
 
     @DmMongoDbApi.executeDbCall
     def getFileById(self, id, **kwargs):
@@ -29,54 +33,62 @@ class FileMongoDbApi(DmMongoDbApi):
 
     @DmMongoDbApi.executeDbCall
     def getExperimentFile(self, experimentName, fileName, **kwargs):
-        queryDict = { 'name' : fileName, 'experimentName' : experimentName }
+        queryDict = { '_fileName' : fileName, '_experimentName' : experimentName }
         dbFileMetadata = self.fileCollection.findByUniqueKeys(queryDict)
         return self.toDmObject(dbFileMetadata, FileMetadata)
 
     @DmMongoDbApi.executeDbCall
     def getExperimentFiles(self, experimentName, queryDict={}, returnFieldDict=FileCollection.ALL_FIELDS_DICT, **kwargs):
         queryDict2 = copy.copy(queryDict)
-        queryDict2['experimentName'] = experimentName 
+        queryDict2['_experimentName'] = experimentName 
         return self.getFiles(queryDict2, returnFieldDict)
 
     @DmMongoDbApi.executeDbCall
     def updateFileById(self, fileInfo, **kwargs):
-        dbFileMetadata = self.fileCollection.updateById(fileInfo)
+        fileInfo2 = self.getMongoDict(fileInfo)
+        dbFileMetadata = self.fileCollection.updateById(fileInfo2)
         return self.toDmObject(dbFileMetadata, FileMetadata)
 
     @DmMongoDbApi.executeDbCall
     def updateExperimentFile(self, fileInfo, **kwargs):
-        dbFileMetadata = self.fileCollection.updateByUniqueKeys(fileInfo)
+        fileInfo2 = self.getMongoDict(fileInfo)
+        dbFileMetadata = self.fileCollection.updateByUniqueKeys(fileInfo2)
         return self.toDmObject(dbFileMetadata, FileMetadata)
 
     @DmMongoDbApi.executeDbCall
     def updateOrAddExperimentFile(self, fileInfo, **kwargs):
-        dbFileMetadata = self.fileCollection.updateOrAddByUniqueKeys(fileInfo)
+        fileInfo2 = self.getMongoDict(fileInfo)
+        dbFileMetadata = self.fileCollection.updateOrAddByUniqueKeys(fileInfo2)
         return self.toDmObject(dbFileMetadata, FileMetadata)
 
 #######################################################################
 # Testing.
 if __name__ == '__main__':
     api = FileMongoDbApi()
-    files = api.getFiles()
-    for file in files:
-        print file.getDictRep()
-        print file.__dict__
-    file = api.getExperimentFile('exp-01', 'xyz-001')
-    print file
+
+    fileName = 'file02'
+    experimentName = 'exp-01'
+    fileInfo = {'fileName' : fileName, 'intKey' : 1, 'doubleKey' : 2.0, 'stringKey' : 'myString' , 'experimentName' : experimentName}
+    file = api.updateOrAddExperimentFile(fileInfo)
+    print '\nADDED FILE\n', file
+
     import time
     t = long(time.time())
-    print t
     fileName = 'f-%s' % t
-    fileInfo = {'name' : fileName, 'intKey' : 1, 'doubleKey' : 2.0, 'stringKey' : 'myString' , 'dictKey' : {'a' : 'A', 'b' : 'B', 'c' : 3}, 'experimentName' : 'exp2'}
-    file = api.addExperimentFile(fileInfo)
+    experimentName = 'exp-01'
+    fileInfo = {'fileName' : fileName, 'intKey' : 1, 'doubleKey' : 2.0, 'stringKey' : 'myString' , 'dictKey' : {'a' : 'A', 'b' : 'B', 'c' : 3}, 'experimentName' : experimentName}
+    file = api.updateOrAddExperimentFile(fileInfo)
     print '\nADDED FILE\n', file
 
+    files = api.getFiles()
+    for file in files:
+        print 'FILE: %s\n' % file.getDictRep()
 
-    fileInfo = {'name' : fileName, 'intKey' : 101}
+    fileInfo = {'fileName' : fileName, 'experimentName' : experimentName, 'intKey' : 101}
     file = api.updateExperimentFile(fileInfo)
     print '\nUPDATED FILE\n', file
-    print '\nFILES: \n', api.getFiles()
-    print '\nFILES FOR EXPERIMENT exp1: \n', api.getFiles(queryDict={'experimentName' : 'exp1'})
+
+    print '\nFILES FOR EXPERIMENT exp1: \n', api.getExperimentFiles(experimentName)
+    print '\nFILES FOR EXPERIMENT exp1 with fileName=file01: \n', api.getExperimentFiles(experimentName, queryDict={'fileName':'file01'})
 
 
diff --git a/src/python/dm/common/mongodb/impl/datasetCollection.py b/src/python/dm/common/mongodb/impl/datasetCollection.py
index c6195e235bae4e1bfd0b80ee1c86cf7efd2c0898..43f7e812b2540dc8725e52af2492044a6da10f0a 100755
--- a/src/python/dm/common/mongodb/impl/datasetCollection.py
+++ b/src/python/dm/common/mongodb/impl/datasetCollection.py
@@ -10,7 +10,7 @@ from dmMongoCollection import DmMongoCollection
 class DatasetCollection(DmMongoCollection):
     """Class responsible for updating dataset collection in mongo db."""
 
-    UNIQUE_KEYS_LIST = [ 'name' ]
+    UNIQUE_KEYS_LIST = [ '_datasetName', '_experimentName' ]
 
     def __init__(self, dbClient):
         DmMongoCollection.__init__(self, 'datasets', dbClient)
@@ -23,7 +23,7 @@ if __name__ == '__main__':
     datasetCollection = DatasetCollection(mongo)
     datasetInfo = {'name' : 'ds-001', 
         'owner' : 'sv',
-        'experiment' : 'exp-001',
+        'experimentName' : 'exp-001',
         'voltage' : { 'gt' : 400},
         'current' : { 'lt' : 100},
     }
diff --git a/src/python/dm/common/mongodb/impl/dmMongoCollection.py b/src/python/dm/common/mongodb/impl/dmMongoCollection.py
index 52bbe10e9c14c9987574896e7e3ddace1854576d..2d1664b682f13e967571968e8245783bb7c79cc8 100755
--- a/src/python/dm/common/mongodb/impl/dmMongoCollection.py
+++ b/src/python/dm/common/mongodb/impl/dmMongoCollection.py
@@ -53,7 +53,7 @@ class DmMongoCollection(object):
         return self.findByKey('_id', ObjectId(id))
 
     def findByName(self, name):
-        return self.findByKey('name', name)
+        return self.findByKey('_name', name)
 
     def findByQueryDict(self, queryDict, returnFieldDict=ALL_FIELDS_DICT):
         return self.dbClient.findAsList(self.collectionName, queryDict, returnFieldDict)
@@ -65,7 +65,7 @@ class DmMongoCollection(object):
         return self.dbClient.findAsList(self.collectionName, {}, {})
 
     def listByName(self):
-        return self.findByName('name')
+        return self.findByName('_name')
 
     def listByKeys(self, keyList):
         returnFieldDict = {}
@@ -95,7 +95,7 @@ class DmMongoCollection(object):
         return self.__addDbObject(objectDict)
 
     def addByName(self, objectDict):
-        return self.addByKey('name', objectDict)
+        return self.addByKey('_name', objectDict)
 
     def addByKeys(self, keyList, objectDict):
         queryDict = {}
@@ -162,7 +162,7 @@ class DmMongoCollection(object):
         return self.updateByKey('_id', objectDict)
 
     def updateByName(self, objectDict):
-        return self.updateByKey('name', objectDict)
+        return self.updateByKey('_name', objectDict)
 
     def updateOrAddByKey(self, key, objectDict):
         value = objectDict.get(key)
@@ -193,7 +193,7 @@ class DmMongoCollection(object):
         return self.updateOrAddByKeys(self.UNIQUE_KEYS_LIST, objectDict)
 
     def updateOrAddByName(self, objectDict):
-        return self.updateOrAddByKey('name', objectDict)
+        return self.updateOrAddByKey('_name', objectDict)
 
 #######################################################################
 # Testing
diff --git a/src/python/dm/common/mongodb/impl/fileCollection.py b/src/python/dm/common/mongodb/impl/fileCollection.py
index 1bc00ca6858e4ceed772f29fad281bd18515d757..b794b3d126ac0abdf0221ad0e3cce45c367faa87 100755
--- a/src/python/dm/common/mongodb/impl/fileCollection.py
+++ b/src/python/dm/common/mongodb/impl/fileCollection.py
@@ -10,7 +10,7 @@ from dmMongoCollection import DmMongoCollection
 class FileCollection(DmMongoCollection):
     """Class responsible for updating file collection in mongo db."""
 
-    UNIQUE_KEYS_LIST = [ 'name', 'experimentName' ]
+    UNIQUE_KEYS_LIST = [ '_fileName', '_experimentName' ]
 
     def __init__(self, dbClient):
         DmMongoCollection.__init__(self, 'files', dbClient)
@@ -21,11 +21,11 @@ if __name__ == '__main__':
     from dmMongoClient import DmMongoClient
     mongo = DmMongoClient('dm')
     fileCollection = FileCollection(mongo)
-    fileInfo = {'name' : 'xyz-001', 'experimentName' : 'myexp-001', 'update' : 'sv2', 'locationList' : '[/opt/xyz, /data/xyz]'}
-    print fileCollection.updateByName(fileInfo)
-    print type(fileCollection.findByName('xyz-001'))
+    fileInfo = {'_fileName' : 'xyz-001', '_experimentName' : 'myexp-001', 'update' : 'sv2', 'locationList' : '[/opt/xyz, /data/xyz]'}
+    print fileCollection.updateByUniqueKeys(fileInfo)
+    #print type(fileCollection.findByName('xyz-001'))
     print fileCollection.findByQueryDict({'experiment' : 'exp-001'}, {'locationList' : 1})
-    fileInfo['experimentName'] = 'ddm1'
+    fileInfo['_experimentName'] = 'ddm1'
     print fileCollection.addByUniqueKeys(fileInfo)
 
 
diff --git a/src/python/dm/common/objects/fileMetadata.py b/src/python/dm/common/objects/fileMetadata.py
index 16ecc4f1de94688bf38d6b3b1316ff5c8f33a2e5..e2e292ed6cd561871dec9b9cb0f5eaa8e3d4128b 100755
--- a/src/python/dm/common/objects/fileMetadata.py
+++ b/src/python/dm/common/objects/fileMetadata.py
@@ -4,7 +4,7 @@ from dmObject import DmObject
 
 class FileMetadata(DmObject):
 
-    DEFAULT_KEY_LIST = [ 'id', 'name', 'locationList' ]
+    DEFAULT_KEY_LIST = [ 'id', 'fileName', 'experimentName', 'locationList' ]
 
     def __init__(self, dict):
         DmObject.__init__(self, dict)