diff --git a/src/python/dm/common/mongodb/__init__.py b/src/python/dm/common/mongodb/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/python/dm/common/mongodb/api/__init__.py b/src/python/dm/common/mongodb/api/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/python/dm/common/mongodb/api/dmMongoDbApi.py b/src/python/dm/common/mongodb/api/dmMongoDbApi.py
new file mode 100755
index 0000000000000000000000000000000000000000..6d9f79961d1a6b0587ff126b309138cce5f2023b
--- /dev/null
+++ b/src/python/dm/common/mongodb/api/dmMongoDbApi.py
@@ -0,0 +1,61 @@
+#!/usr/bin/env python
+
+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. """
+    def __init__(self):
+        self.logger = LoggingManager.getInstance().getLogger(self.__class__.__name__)
+        self.dbClient = MongoDbManager.getInstance().getDbClient()
+
+    # Decorator for all DB methods
+    @classmethod
+    def executeDbCall(cls, func):
+        def dbCall(*args, **kwargs):
+            try:
+                try:
+                    return func(*args, **kwargs)
+                except DmException, ex:
+                    raise
+                except Exception, ex:
+                    cls.getLogger().exception('%s' % ex)
+                    raise DmException(exception=ex)
+            finally:
+                # For now, do nothing
+                pass
+        return dbCall
+
+    @classmethod
+    def getLogger(cls):
+        logger = LoggingManager.getInstance().getLogger(cls.__name__)
+        return logger
+
+    @classmethod
+    def listToDmObjects(cls, mongoDbObjectList, dmObjectClass):
+        dmObjectList = []
+        for o in mongoDbObjectList:
+            dmObjectList.append(cls.toDmObject(o, dmObjectClass))
+        return dmObjectList
+
+    @classmethod
+    def toDmObject(cls, mongoDbObject, dmObjectClass):
+        cls.scrubMongoDbObject(mongoDbObject)
+        return dmObjectClass(mongoDbObject)
+
+    @classmethod
+    def scrubMongoDbObject(cls, mongoDbObject):
+        for key in ['_id']:
+            if mongoDbObject.has_key(key):
+                # Remove leading underscore
+                newKey = key[1:]
+                mongoDbObject[newKey] = str(mongoDbObject[key])
+                del mongoDbObject[key]
+
+#######################################################################
+# Testing.
+if __name__ == '__main__':
+    api = DmMongoDbApi()
+
+
diff --git a/src/python/dm/common/mongodb/api/fileMongoDbApi.py b/src/python/dm/common/mongodb/api/fileMongoDbApi.py
new file mode 100755
index 0000000000000000000000000000000000000000..ec24befd2fed319cc8a86dbd846eea371c32a2a0
--- /dev/null
+++ b/src/python/dm/common/mongodb/api/fileMongoDbApi.py
@@ -0,0 +1,82 @@
+#!/usr/bin/env python
+
+import copy
+from dm.common.exceptions.dmException import DmException
+from dm.common.mongodb.api.dmMongoDbApi import DmMongoDbApi
+from dm.common.mongodb.impl.fileCollection import FileCollection
+from dm.common.mongodb.api.dmMongoDbApi import DmMongoDbApi
+from dm.common.objects.fileMetadata import FileMetadata
+
+class FileMongoDbApi(DmMongoDbApi):
+
+    def __init__(self):
+        DmMongoDbApi.__init__(self)
+        self.fileCollection = FileCollection(self.dbClient)
+
+    @DmMongoDbApi.executeDbCall
+    def addExperimentFile(self, fileInfo, **kwargs):
+        dbFileMetadata = self.fileCollection.addByUniqueKeys(fileInfo)
+        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)
+
+    @DmMongoDbApi.executeDbCall
+    def getFileById(self, id, **kwargs):
+        dbFileMetadata = self.fileCollection.findById(id)
+        return self.toDmObject(dbFileMetadata, FileMetadata)
+
+    @DmMongoDbApi.executeDbCall
+    def getExperimentFile(self, experimentName, fileName, **kwargs):
+        queryDict = { 'name' : 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 
+        return self.getFiles(queryDict2, returnFieldDict)
+
+    @DmMongoDbApi.executeDbCall
+    def updateFileById(self, fileInfo, **kwargs):
+        dbFileMetadata = self.fileCollection.updateById(fileInfo)
+        return self.toDmObject(dbFileMetadata, FileMetadata)
+
+    @DmMongoDbApi.executeDbCall
+    def updateExperimentFile(self, fileInfo, **kwargs):
+        dbFileMetadata = self.fileCollection.updateByUniqueKeys(fileInfo)
+        return self.toDmObject(dbFileMetadata, FileMetadata)
+
+    @DmMongoDbApi.executeDbCall
+    def updateOrAddExperimentFile(self, fileInfo, **kwargs):
+        dbFileMetadata = self.fileCollection.updateOrAddByUniqueKeys(fileInfo)
+        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
+    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)
+    print '\nADDED FILE\n', file
+
+
+    fileInfo = {'name' : fileName, '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'})
+
+
diff --git a/src/python/dm/common/mongodb/impl/__init__.py b/src/python/dm/common/mongodb/impl/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/python/dm/common/mongodb/impl/datasetCollection.py b/src/python/dm/common/mongodb/impl/datasetCollection.py
new file mode 100755
index 0000000000000000000000000000000000000000..c6195e235bae4e1bfd0b80ee1c86cf7efd2c0898
--- /dev/null
+++ b/src/python/dm/common/mongodb/impl/datasetCollection.py
@@ -0,0 +1,36 @@
+#!/usr/bin/env python
+
+from dm.common.utility.loggingManager import LoggingManager
+from dm.common.exceptions.invalidArgument import InvalidArgument
+from dm.common.exceptions.objectAlreadyExists import ObjectAlreadyExists
+from dm.common.exceptions.objectNotFound import ObjectNotFound
+from dm.common.exceptions.dbError import DbError
+from dmMongoCollection import DmMongoCollection
+
+class DatasetCollection(DmMongoCollection):
+    """Class responsible for updating dataset collection in mongo db."""
+
+    UNIQUE_KEYS_LIST = [ 'name' ]
+
+    def __init__(self, dbClient):
+        DmMongoCollection.__init__(self, 'datasets', dbClient)
+
+#######################################################################
+# Testing
+if __name__ == '__main__':
+    from dmMongoClient import DmMongoClient
+    mongo = DmMongoClient('dm')
+    datasetCollection = DatasetCollection(mongo)
+    datasetInfo = {'name' : 'ds-001', 
+        'owner' : 'sv',
+        'experiment' : 'exp-001',
+        'voltage' : { 'gt' : 400},
+        'current' : { 'lt' : 100},
+    }
+    #print datasetCollection.add(datasetInfo)
+    print datasetCollection.updateByName(datasetInfo)
+    print datasetCollection.findByName('ds-001')
+    print datasetCollection.findByQueryDict({'dataset' : 'ds-001'}, {'owner' : 1})
+
+
+
diff --git a/src/python/dm/common/mongodb/impl/dmMongoClient.py b/src/python/dm/common/mongodb/impl/dmMongoClient.py
new file mode 100755
index 0000000000000000000000000000000000000000..da7e2b032529cd05dddabe1b9adb596f12634fe8
--- /dev/null
+++ b/src/python/dm/common/mongodb/impl/dmMongoClient.py
@@ -0,0 +1,63 @@
+#!/usr/bin/env python
+
+from pymongo import MongoClient
+
+from dm.common.utility.loggingManager import LoggingManager
+from dm.common.exceptions.dbError import DbError
+
+class DmMongoClient(object):
+    """ DM MongoDB client."""
+
+    def __init__(self, dbName, dbUri='mongodb://localhost:27017/'):
+        self.logger = LoggingManager.getInstance().getLogger(self.__class__.__name__)
+        try:
+            self.client = MongoClient(dbUri)
+            self.db = self.client[dbName]
+            self.dbName = dbName
+        except Exception, ex:
+            self.logger.error('Cannot connect to Mongo DB: %s' % ex)
+            raise DbError(exception=ex)
+
+    def drop(self, collection):
+        return self.db[collection].drop()
+
+    def insert(self, collection, dict, **kwargs):
+        return self.db[collection].insert(dict, **kwargs)
+
+    def update(self, collection, query, update, **kwargs):
+        key = '.'.join((collection, str(update['$set'].keys()[0])))
+        return self.db[collection].update(query, update, **kwargs)
+
+    def findOne(self, collection, criteria={}):
+        return self.db[collection].find_one(criteria)
+
+    def find(self, collection, criteria={}, projections={}):
+        return self.db[collection].find(criteria, projections)
+
+    def findAsList(self, collection, criteria={}, projections={}):
+        return list(self.db[collection].find(criteria, projections))
+
+    def getCollectionNames(self):
+        return self.db.collection_names()
+
+#######################################################################
+# Testing
+if __name__ == '__main__':
+    mongo = DmMongoClient('dm')
+    mongo.drop('students')
+    id = mongo.insert('students', { '_id' : 1, 'semester' : 1, 'grades' : [ 70, 87, 90 ]   })
+    print 'Student #1 id: ', id
+    id = mongo.insert('students', { '_id' : 2, 'semester' : 1, 'grades' : [ 90, 88, 92 ] } )
+    print 'Student #2 id: ', id
+    print mongo.findAsList('students', criteria={ 'semester' : 1, 'grades': { '$gte' : 85 } }, projections={ 'grades.$' : 1 } )
+    result = mongo.update('files', {'_id' : 2}, {'$set' : {'experimentId' : 2}}, upsert=True)
+    print result
+    doc = mongo.findOne('files', {'experimentId' : 1})
+    print doc
+    docs = mongo.find('files', projections={'experimentId' : 1})
+    print docs.count()
+    docs = mongo.findAsList('files', projections={'experimentId' : 1})
+    print docs
+    print 'Collection names: ', mongo.getCollectionNames()
+    mongo.drop('students')
+    print 'Collection names (after drop): ', mongo.getCollectionNames()
diff --git a/src/python/dm/common/mongodb/impl/dmMongoCollection.py b/src/python/dm/common/mongodb/impl/dmMongoCollection.py
new file mode 100755
index 0000000000000000000000000000000000000000..52bbe10e9c14c9987574896e7e3ddace1854576d
--- /dev/null
+++ b/src/python/dm/common/mongodb/impl/dmMongoCollection.py
@@ -0,0 +1,221 @@
+#!/usr/bin/env python
+
+from bson.objectid import ObjectId
+from dm.common.utility.loggingManager import LoggingManager
+from dm.common.exceptions.invalidArgument import InvalidArgument
+from dm.common.exceptions.objectAlreadyExists import ObjectAlreadyExists
+from dm.common.exceptions.objectNotFound import ObjectNotFound
+from dm.common.exceptions.dbError import DbError
+
+class DmMongoCollection(object):
+    """Base collection in mongo db."""
+
+    ALL_FIELDS_DICT = {'__return_only_id__' : False}
+    UNIQUE_KEYS_LIST = []
+
+    def __init__(self, collectionName, dbClient):
+        self.logger = LoggingManager.getInstance().getLogger(self.__class__.__name__)
+        self.dbClient = dbClient
+
+        # Collection consists of items: [item]
+        self.collectionName = collectionName
+
+        # items => item
+        self.itemName = collectionName[:-1] 
+
+        # item => Item
+        self.capitalizedItemName = self.itemName.capitalize() 
+
+    @classmethod
+    def getUniqueKeys(cls):
+        return cls.UNIQUE_KEYS_LIST
+
+    def findByKey(self, key, value):
+        dbObjectDict = self.dbClient.findOne(self.collectionName, {key : value})
+        if dbObjectDict is None:
+            raise ObjectNotFound('%s with %s=%s not found.' % (self.capitalizedItemName, key, value))
+        return dbObjectDict
+
+    def findByKeys(self, keyList, queryDict):
+        for key in keyList:
+            if not queryDict.has_key(key):
+                raise InvalidArgument('%s query dictionary does not specify key %s.' % (self.capitalizedItemName, key))
+
+        dbObjectDict = self.dbClient.findOne(self.collectionName, queryDict)
+        if dbObjectDict is None:
+            raise ObjectNotFound('%s with properties %s not found.' % (self.capitalizedItemName, queryDict))
+        return dbObjectDict
+
+    def findByUniqueKeys(self, queryDict):
+        return self.findByKeys(self.UNIQUE_KEYS_LIST, queryDict)
+
+    def findById(self, id):
+        return self.findByKey('_id', ObjectId(id))
+
+    def findByName(self, name):
+        return self.findByKey('name', name)
+
+    def findByQueryDict(self, queryDict, returnFieldDict=ALL_FIELDS_DICT):
+        return self.dbClient.findAsList(self.collectionName, queryDict, returnFieldDict)
+
+    def listByKey(self, key):
+        return self.dbClient.findAsList(self.collectionName, {}, {key : True})
+
+    def listById(self):
+        return self.dbClient.findAsList(self.collectionName, {}, {})
+
+    def listByName(self):
+        return self.findByName('name')
+
+    def listByKeys(self, keyList):
+        returnFieldDict = {}
+        for key in keyList:
+            returnFieldDict[key] = True
+        return self.dbClient.findAsList(self.collectionName, {}, returnFieldDict)
+    def listAll(self):
+        return self.dbClient.findAsList(self.collectionName, {}, DmMongoCollection.ALL_FIELDS_DICT)
+
+    def __addDbObject(self, objectDict):
+        try:
+            self.dbClient.insert(self.collectionName, objectDict)
+        except Exception, ex:
+            self.logger.error('Cannot add %s with %s set to %s: %s' % (self.itemName, key, value, ex))
+            raise DbError(exception=ex)
+        return objectDict
+
+    def addByKey(self, key, objectDict):
+        value = objectDict.get(key)
+        if value is None:
+            raise InvalidArgument('%s info dictionary does not specify key %s.' % (self.capitalizedItemName, key))
+
+        dbObjectDict = self.dbClient.findOne(self.collectionName, {key : value})
+        if dbObjectDict is not None:
+            raise ObjectAlreadyExists('%s with %s set to %s already exists.' % (self.capitalizedItemName, key, value))
+
+        return self.__addDbObject(objectDict)
+
+    def addByName(self, objectDict):
+        return self.addByKey('name', objectDict)
+
+    def addByKeys(self, keyList, objectDict):
+        queryDict = {}
+        for key in keyList:
+            value = objectDict.get(key)
+            if value is None:
+                raise InvalidArgument('%s info dictionary does not specify key %s.' % (self.capitalizedItemName, key))
+            queryDict[key] = value
+
+        dbObjectDict = self.dbClient.findOne(self.collectionName, queryDict)
+        if dbObjectDict is not None:
+            raise ObjectAlreadyExists('%s with properties %s already exists.' % (self.capitalizedItemName, queryDict))
+
+        return self.__addDbObject(objectDict)
+
+    def addByUniqueKeys(self, objectDict):
+        return self.addByKeys(self.UNIQUE_KEYS_LIST, objectDict)
+
+    def __updateDbObject(self, dbObjectDict, objectDict):
+        try:
+            id = dbObjectDict.get('_id')
+            dbObjectDict.update(objectDict)
+            self.dbClient.update(self.collectionName,
+                {'_id' : id},
+                {'$set' : dbObjectDict})
+        except Exception, ex:
+            self.logger.error('Cannot update %s %s with %s: %s' % (self.itemName, dbObjectDict, objectDict, ex))
+            raise DbError(exception=ex)
+        return dbObjectDict
+
+    def updateByKey(self, key, objectDict):
+        value = objectDict.get(key)
+        if value is None:
+            raise InvalidArgument('%s info dictionary does not specify key %s.' % (self.capitalizedItemName, key))
+
+        dbObjectDict = self.dbClient.findOne(self.collectionName, {key : value})
+        if dbObjectDict is None:
+            raise ObjectNotFound('%s with %s set to %s not found.' % (self.capitalizedItemName, key, value))
+
+        return self.__updateDbObject(dbObjectDict, objectDict)
+
+    def updateByKeys(self, keyList, objectDict):
+        queryDict = {}
+        for key in keyList:
+            value = objectDict.get(key)
+            if value is None:
+                raise InvalidArgument('%s info dictionary does not specify key %s.' % (self.capitalizedItemName, key))
+            queryDict[key] = value
+
+        dbObjectDict = self.dbClient.findOne(self.collectionName, queryDict)
+        if dbObjectDict is None:
+            raise ObjectNotFound('%s with properties %s not found.' % (self.capitalizedItemName, queryDict))
+
+        return self.__updateDbObject(dbObjectDict, objectDict)
+
+    def updateByUniqueKeys(self, objectDict):
+        return self.updateByKeys(self.UNIQUE_KEYS_LIST, objectDict)
+
+    def updateById(self, objectDict):
+        # Convert 'id' to '_id' key if needed, and wrap it with ObjectId()
+        if not objectDict.has_key('_id') and objectDict.has_key('id'):
+            objectDict['_id'] = ObjectId(objectDict['id'])
+            del objectDict['id']
+        return self.updateByKey('_id', objectDict)
+
+    def updateByName(self, objectDict):
+        return self.updateByKey('name', objectDict)
+
+    def updateOrAddByKey(self, key, objectDict):
+        value = objectDict.get(key)
+        if value is None:
+            raise InvalidArgument('%s info dictionary does not specify key %s.' % (self.capitalizedItemName, key))
+
+        dbObjectDict = self.dbClient.findOne(self.collectionName, {key : value})
+        if dbObjectDict is None:
+            return self.__addDbObject(objectDict)
+        else:
+            return self.__updateDbObject(dbObjectDict, objectDict)
+
+    def updateOrAddByKeys(self, keyList, objectDict):
+        queryDict = {}
+        for key in keyList:
+            value = objectDict.get(key)
+            if value is None:
+                raise InvalidArgument('%s info dictionary does not specify key %s.' % (self.capitalizedItemName, key))
+            queryDict[key] = value
+
+        dbObjectDict = self.dbClient.findOne(self.collectionName, queryDict)
+        if dbObjectDict is None:
+            return self.__addDbObject(objectDict)
+        else:
+            return self.__updateDbObject(dbObjectDict, objectDict)
+
+    def updateOrAddByUniqueKeys(self, objectDict):
+        return self.updateOrAddByKeys(self.UNIQUE_KEYS_LIST, objectDict)
+
+    def updateOrAddByName(self, objectDict):
+        return self.updateOrAddByKey('name', objectDict)
+
+#######################################################################
+# Testing
+if __name__ == '__main__':
+    from dmMongoClient import DmMongoClient
+    from bson.objectid import ObjectId
+    mongo = DmMongoClient('dm')
+    fileCollectionImpl = DmMongoCollection('files', mongo)
+    #objectDict = {'name' : 'xyz-001', 'experiment' : 'myexp-D', 'update' : 'sv2', 'locationList' : '[/opt/xyz, /data/xyz]'}
+    #print fileCollectionImpl.updateOrAddByKey('name', objectDict)
+    #f = fileCollectionImpl.findByKey('name', 'xyz-001')
+    #print f
+    #print type(f['_id'])
+    #print fileCollectionImpl.findById('556de0059e058b0ef4c4413b')
+    #print fileCollectionImpl.findByQueryDict({'experiment' : 'exp-001'}, {'locationList' : 1})
+
+    #print 'LIST BY ID\n', fileCollectionImpl.listById()
+    #print 'LIST BY NAME\n', fileCollectionImpl.listByKey('name')
+    print 'LIST ALL\n'
+    for f in fileCollectionImpl.listAll():
+        print 'FILE: %s\n' % f
+
+
+    #print fileCollectionImpl.updateByKeys(['name', 'experiment'], objectDict)
+
diff --git a/src/python/dm/common/mongodb/impl/experimentCollection.py b/src/python/dm/common/mongodb/impl/experimentCollection.py
new file mode 100755
index 0000000000000000000000000000000000000000..114f27a92ec96fcec72123be2025b1d442c8d395
--- /dev/null
+++ b/src/python/dm/common/mongodb/impl/experimentCollection.py
@@ -0,0 +1,31 @@
+#!/usr/bin/env python
+
+from dm.common.utility.loggingManager import LoggingManager
+from dm.common.exceptions.invalidArgument import InvalidArgument
+from dm.common.exceptions.objectAlreadyExists import ObjectAlreadyExists
+from dm.common.exceptions.objectNotFound import ObjectNotFound
+from dm.common.exceptions.dbError import DbError
+from dmMongoCollection import DmMongoCollection
+
+class ExperimentCollection(DmMongoCollection):
+    """Class responsible for updating experiment collection in mongo db."""
+
+    UNIQUE_KEYS_LIST = [ 'name' ]
+
+    def __init__(self, dbClient):
+        DmMongoCollection.__init__(self, 'experiments', dbClient)
+
+#######################################################################
+# Testing
+if __name__ == '__main__':
+    from dmMongoClient import DmMongoClient
+    mongo = DmMongoClient('dm')
+    experimentCollection = ExperimentCollection(mongo)
+    experimentInfo = {'name' : 'exp-001', 'owner' : 'sv'}
+    #print experimentCollection.add(experimentInfo)
+    print experimentCollection.updateByName(experimentInfo)
+    print experimentCollection.findByName('exp-001')
+    print experimentCollection.findByQueryDict({'experiment' : 'exp-001'}, {'owner' : 1})
+
+
+
diff --git a/src/python/dm/common/mongodb/impl/fileCollection.py b/src/python/dm/common/mongodb/impl/fileCollection.py
new file mode 100755
index 0000000000000000000000000000000000000000..1bc00ca6858e4ceed772f29fad281bd18515d757
--- /dev/null
+++ b/src/python/dm/common/mongodb/impl/fileCollection.py
@@ -0,0 +1,32 @@
+#!/usr/bin/env python
+
+from dm.common.utility.loggingManager import LoggingManager
+from dm.common.exceptions.invalidArgument import InvalidArgument
+from dm.common.exceptions.objectAlreadyExists import ObjectAlreadyExists
+from dm.common.exceptions.objectNotFound import ObjectNotFound
+from dm.common.exceptions.dbError import DbError
+from dmMongoCollection import DmMongoCollection
+
+class FileCollection(DmMongoCollection):
+    """Class responsible for updating file collection in mongo db."""
+
+    UNIQUE_KEYS_LIST = [ 'name', 'experimentName' ]
+
+    def __init__(self, dbClient):
+        DmMongoCollection.__init__(self, 'files', dbClient)
+
+#######################################################################
+# Testing
+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'))
+    print fileCollection.findByQueryDict({'experiment' : 'exp-001'}, {'locationList' : 1})
+    fileInfo['experimentName'] = 'ddm1'
+    print fileCollection.addByUniqueKeys(fileInfo)
+
+
+
diff --git a/src/python/dm/common/mongodb/impl/mongoDbManager.py b/src/python/dm/common/mongodb/impl/mongoDbManager.py
new file mode 100755
index 0000000000000000000000000000000000000000..653b36e844f25085ee3ef290277dde18307e2faf
--- /dev/null
+++ b/src/python/dm/common/mongodb/impl/mongoDbManager.py
@@ -0,0 +1,75 @@
+#!/usr/bin/env python
+
+import threading
+import os.path
+import sqlalchemy 
+from sqlalchemy.orm import sessionmaker
+from sqlalchemy.orm import mapper
+from sqlalchemy.orm import relationship
+
+from dm.common.exceptions.commandFailed import CommandFailed
+from dm.common.exceptions.configurationError import ConfigurationError
+from dm.common.utility.loggingManager import LoggingManager
+from dm.common.utility.configurationManager import ConfigurationManager
+from dmMongoClient import DmMongoClient
+
+class MongoDbManager:
+    """ Singleton class for mongo db management. """
+
+    CONFIG_SECTION_NAME = 'MongoDbManager'
+    MONGO_DB_NAME_KEY = 'mongoDbName'
+    MONGO_DB_USER_KEY = 'mongoDbUser'
+    MONGO_DB_URI_KEY = 'mongoDbUri' 
+    MONGO_DB_PASSWORD_FILE_KEY = 'mongoDbPasswordFile' 
+    CONFIG_OPTION_NAME_LIST = [ 'dbName', 'dbUser', 'dbPasswordFile' ]
+
+    # Singleton.
+    __lock = threading.RLock()
+    __instance = None
+
+    @classmethod
+    def getInstance(cls):
+        from dm.common.mongodb.impl.mongoDbManager import MongoDbManager
+        try:
+            mgr = MongoDbManager()
+        except MongoDbManager, ex:
+            mgr = ex
+        return mgr 
+
+    def __init__(self):
+        MongoDbManager.__lock.acquire()
+        try:
+            if MongoDbManager.__instance is not None:
+                raise MongoDbManager.__instance
+            MongoDbManager.__instance = self
+            self.lock = threading.RLock()
+            self.logger = LoggingManager.getInstance().getLogger(self.__class__.__name__)
+            cm = ConfigurationManager.getInstance()
+            self.dbName = cm.getConfigOption(MongoDbManager.CONFIG_SECTION_NAME, MongoDbManager.MONGO_DB_NAME_KEY)
+            self.logger.debug('Mongo DB name: %s' % self.dbName)
+            self.dbUri = cm.getConfigOption(MongoDbManager.CONFIG_SECTION_NAME, MongoDbManager.MONGO_DB_URI_KEY)
+            self.logger.debug('Mongo DB URI: %s' % self.dbUri)
+            self.dbUser = cm.getConfigOption(MongoDbManager.CONFIG_SECTION_NAME, MongoDbManager.MONGO_DB_USER_KEY)
+            self.logger.debug('Mongo DB user: %s' % self.dbUser)
+            self.dbPasswordFile = cm.getConfigOption(MongoDbManager.CONFIG_SECTION_NAME, MongoDbManager.MONGO_DB_PASSWORD_FILE_KEY)
+            self.logger.debug('Mongo DB password file: %s' % self.dbPasswordFile)
+            #dbPassword = open(dbPasswordFile, 'r').readline().strip()
+
+        finally:
+            MongoDbManager.__lock.release()
+
+    def getLogger(self):
+        return self.logger
+
+    def getDbClient(self):
+        return DmMongoClient(self.dbName, self.dbUri)
+
+
+#######################################################################
+# Testing.
+if __name__ == '__main__':
+    ConfigurationManager.getInstance().setConsoleLogLevel('debug')
+    mgr = MongoDbManager.getInstance()
+
+
+