Index: Src/Provider/FdoRfpBandRaster.cpp
===================================================================
--- Src/Provider/FdoRfpBandRaster.cpp	(revision 4508)
+++ Src/Provider/FdoRfpBandRaster.cpp	(working copy)
@@ -193,7 +193,7 @@
     if( m_dataModel != NULL )
         return FDO_SAFE_ADDREF(m_dataModel.p);
 
-    FdoGdalMutexHolder oHolder;
+    //FdoGdalMutexHolder oHolder;
     FdoPtr<FdoRasterDataModel> dataModel = FdoRasterDataModel::Create();
     FdoPtr<FdoRfpImage> image =m_geoBandRaster->GetImage();
 
@@ -409,7 +409,7 @@
     FdoPtr<FdoDataValue> val;
     FdoRasterDataModel* dataModel = GetDataModel ();
     FdoPtr<FdoRfpImage> image = m_geoBandRaster->GetImage();
-    FdoGdalMutexHolder oHolder;
+    //FdoGdalMutexHolder oHolder;
 
     int bGotNoData;
     double dfNoData;
Index: Src/Provider/FdoRfpCommonReader.h
===================================================================
--- Src/Provider/FdoRfpCommonReader.h	(revision 4508)
+++ Src/Provider/FdoRfpCommonReader.h	(working copy)
@@ -49,7 +49,16 @@
 
 // protected constructor
 protected:
-	FdoRfpCommonReader(const FdoPtr<FdoRfpQueryResult>& queryResult) : m_queryResult(queryResult), m_cursor(-1) {}
+	FdoRfpCommonReader(FdoIConnection* conn, const FdoPtr<FdoRfpQueryResult>& queryResult) : m_queryResult(queryResult), m_cursor(-1) 
+    {
+        m_connection = FDO_SAFE_ADDREF(conn);
+    }
+
+    virtual ~FdoRfpCommonReader()
+    {
+        FDO_SAFE_RELEASE(m_connection);
+    }
+
 	void Dispose() { delete this; }
 
 //
@@ -221,6 +230,9 @@
 	// get column index according to the property name
 	int _getColumnIndex(FdoString* propertyName);
 
+    //the owner connection
+    FdoIConnection* m_connection;
+
 };
 
 template<typename READER>
Index: Src/Provider/FdoRfpConnection.cpp
===================================================================
--- Src/Provider/FdoRfpConnection.cpp	(revision 4508)
+++ Src/Provider/FdoRfpConnection.cpp	(working copy)
@@ -48,6 +48,7 @@
 #include <gdal.h>
 #include <ogr_srs_api.h>
 #include <FdoCommonConnStringParser.h>
+#include <FdoCommonSchemaUtil.h>
 
 // external access to connection for client services
 extern "C" FDOGRFP_API FdoIConnection* CreateConnection ()
@@ -245,12 +246,25 @@
 // no feature schema.
 void FdoRfpConnection::_buildUpDefaultFeatureSchema()
 {
-    FdoIoMemoryStreamP stream = FdoIoMemoryStream::Create(); 
-    for (int i = 0; defaultSchema[i] != NULL; i++)
-        stream->Write( (FdoByte*) defaultSchema[i], strlen(defaultSchema[i]));
-    stream->Reset();
-    FdoXmlReaderP reader = FdoXmlReader::Create(stream);
-    m_featureSchemas->ReadXml(reader);    
+    //We will parse the default schemas from XML only once
+    //and store them here. For all subsequent requests
+    //we will return a clone of this object.
+    static FdoFeatureSchemaCollection* s_cachedDefaultSchema = NULL;
+
+    FdoGdalMutexHolder oHolder;
+
+    if (s_cachedDefaultSchema == NULL)
+    {
+        s_cachedDefaultSchema = FdoFeatureSchemaCollection::Create(NULL);
+        FdoIoMemoryStreamP stream = FdoIoMemoryStream::Create(); 
+        for (int i = 0; defaultSchema[i] != NULL; i++)
+            stream->Write( (FdoByte*) defaultSchema[i], strlen(defaultSchema[i]));
+        stream->Reset();
+        FdoXmlReaderP reader = FdoXmlReader::Create(stream);
+        s_cachedDefaultSchema->ReadXml(reader);    
+    }
+
+    m_featureSchemas = FdoCommonSchemaUtil::DeepCopyFdoFeatureSchemas(s_cachedDefaultSchema);
 }
 
 // Build up the default schema overrides according to the default feature schema
Index: Src/Provider/FdoRfpDataReader.cpp
===================================================================
--- Src/Provider/FdoRfpDataReader.cpp	(revision 4508)
+++ Src/Provider/FdoRfpDataReader.cpp	(working copy)
@@ -26,14 +26,14 @@
 #include "FDORFP.h"
 #include "FdoRfpDataReader.h"
 
-FdoRfpDataReader::FdoRfpDataReader(const FdoPtr<FdoRfpQueryResult>& queryResult) :
-											FdoRfpCommonReader<FdoIDataReader>(queryResult)
+FdoRfpDataReader::FdoRfpDataReader(FdoIConnection* conn, const FdoPtr<FdoRfpQueryResult>& queryResult) :
+											FdoRfpCommonReader<FdoIDataReader>(conn, queryResult)
 {
 }
 
-FdoRfpDataReader* FdoRfpDataReader::Create(const FdoPtr<FdoRfpQueryResult>& queryResult)
+FdoRfpDataReader* FdoRfpDataReader::Create(FdoIConnection* conn, const FdoPtr<FdoRfpQueryResult>& queryResult)
 {
-	FdoRfpDataReaderP fr = new FdoRfpDataReader(queryResult);
+	FdoRfpDataReaderP fr = new FdoRfpDataReader(conn, queryResult);
 
 	return FDO_SAFE_ADDREF(fr.p);
 }
Index: Src/Provider/FdoRfpDataReader.h
===================================================================
--- Src/Provider/FdoRfpDataReader.h	(revision 4508)
+++ Src/Provider/FdoRfpDataReader.h	(working copy)
@@ -51,10 +51,10 @@
 // Constructor(s), desctrucotr, factory function(s)
 //
 protected:
-	FdoRfpDataReader(const FdoPtr<FdoRfpQueryResult>& queryResult);
+	FdoRfpDataReader(FdoIConnection* conn, const FdoPtr<FdoRfpQueryResult>& queryResult);
 public:
 	// Static factory function
-	static FdoRfpDataReader* Create(const FdoPtr<FdoRfpQueryResult>& queryResult);
+	static FdoRfpDataReader* Create(FdoIConnection* conn, const FdoPtr<FdoRfpQueryResult>& queryResult);
 
 // 
 // Exposed functions
Index: Src/Provider/FdoRfpDatasetCache.cpp
===================================================================
--- Src/Provider/FdoRfpDatasetCache.cpp	(revision 4508)
+++ Src/Provider/FdoRfpDatasetCache.cpp	(working copy)
@@ -55,7 +55,7 @@
 {
     int iDS;
     GDALDatasetH hDS;
-    FdoGdalMutexHolder oHolder;
+    //FdoGdalMutexHolder oHolder;
 
     // Do we already have the dataset open?  If so, add a reference, promote
     // it in the LRU ordering, and return it.
@@ -128,7 +128,7 @@
     if( hDS == NULL )
         return;
 
-    FdoGdalMutexHolder oHolder;
+    //FdoGdalMutexHolder oHolder;
     
     if( GDALDereferenceDataset( hDS ) > 1 
         || nDatasetCount <= nOpenDatasetMaximum )
@@ -147,7 +147,7 @@
 void FdoRfpDatasetCache::CloseDataset( int iDS )
 
 {
-    FdoGdalMutexHolder oHolder;
+    //FdoGdalMutexHolder oHolder;
 
     GDALClose( pahDatasetList[iDS] );
     if( iDS != nDatasetCount-1 )
@@ -160,7 +160,7 @@
 
 {
     int iDS;
-    FdoGdalMutexHolder oHolder;
+    //FdoGdalMutexHolder oHolder;
 
     for( iDS = nDatasetCount-1; iDS >= 0; iDS-- )
     {
@@ -174,7 +174,7 @@
 
 {
     int iDS;
-    FdoGdalMutexHolder oHolder;
+    //FdoGdalMutexHolder oHolder;
 
     for( iDS = nDatasetCount-1; iDS >= 0; iDS-- )
     {
Index: Src/Provider/FdoRfpFeatureReader.cpp
===================================================================
--- Src/Provider/FdoRfpFeatureReader.cpp	(revision 4508)
+++ Src/Provider/FdoRfpFeatureReader.cpp	(working copy)
@@ -27,14 +27,14 @@
 #include "FdoRfpFeatureReader.h"
 #include "FdoCommonSchemaUtil.h"
 
-FdoRfpFeatureReader::FdoRfpFeatureReader(const FdoClassDefinitionP& classDef, const FdoPtr<FdoRfpQueryResult>& queryResult) :
-											FdoRfpCommonReader<FdoIFeatureReader>(queryResult), m_classDef(classDef)
+FdoRfpFeatureReader::FdoRfpFeatureReader(FdoIConnection* conn, const FdoClassDefinitionP& classDef, const FdoPtr<FdoRfpQueryResult>& queryResult) :
+											FdoRfpCommonReader<FdoIFeatureReader>(conn, queryResult), m_classDef(classDef)
 {
 }
 
-FdoRfpFeatureReader* FdoRfpFeatureReader::Create(const FdoClassDefinitionP& classDef, const FdoPtr<FdoRfpQueryResult>& queryResult)
+FdoRfpFeatureReader* FdoRfpFeatureReader::Create(FdoIConnection* conn, const FdoClassDefinitionP& classDef, const FdoPtr<FdoRfpQueryResult>& queryResult)
 {
-	FdoRfpReatureReaderP fr = new FdoRfpFeatureReader(classDef, queryResult);
+	FdoRfpReatureReaderP fr = new FdoRfpFeatureReader(conn, classDef, queryResult);
 
 	return FDO_SAFE_ADDREF(fr.p);
 }
Index: Src/Provider/FdoRfpFeatureReader.h
===================================================================
--- Src/Provider/FdoRfpFeatureReader.h	(revision 4508)
+++ Src/Provider/FdoRfpFeatureReader.h	(working copy)
@@ -54,10 +54,10 @@
 // Constructor(s), desctrucotr, factory function(s)
 //
 protected:
-	FdoRfpFeatureReader(const FdoClassDefinitionP& classDef, const FdoPtr<FdoRfpQueryResult>& queryResult);
+	FdoRfpFeatureReader(FdoIConnection* conn, const FdoClassDefinitionP& classDef, const FdoPtr<FdoRfpQueryResult>& queryResult);
 public:
 	// Static factory function
-	static FdoRfpFeatureReader* Create(const FdoClassDefinitionP& classDef, const FdoPtr<FdoRfpQueryResult>& queryResult);
+	static FdoRfpFeatureReader* Create(FdoIConnection* conn, const FdoClassDefinitionP& classDef, const FdoPtr<FdoRfpQueryResult>& queryResult);
 
 // 
 // Exposed functions
Index: Src/Provider/FdoRfpGeoBandRasterImp.cpp
===================================================================
--- Src/Provider/FdoRfpGeoBandRasterImp.cpp	(revision 4508)
+++ Src/Provider/FdoRfpGeoBandRasterImp.cpp	(working copy)
@@ -177,7 +177,7 @@
     GDALDatasetH hDS;
     FdoPtr<FdoRfpDatasetCache>  datasetCache = m_connection->GetDatasetCache();
 
-    FdoGdalMutexHolder oHolder;
+    //FdoGdalMutexHolder oHolder;
     hDS = datasetCache->LockDataset( m_imagePath, false );
 
     if( hDS == NULL )
Index: Src/Provider/FdoRfpGeoRasterExtractor.cpp
===================================================================
--- Src/Provider/FdoRfpGeoRasterExtractor.cpp	(revision 4508)
+++ Src/Provider/FdoRfpGeoRasterExtractor.cpp	(working copy)
@@ -175,7 +175,7 @@
 
         FdoStringP fileName = filePath.c_str();
 
-		FdoGdalMutexHolder oHolder;
+		//FdoGdalMutexHolder oHolder;
         GDALDatasetH hDS = datasetCache->LockDataset( fileName, true );
         if( hDS == NULL )
             continue;
Index: Src/Provider/FdoRfpImage.cpp
===================================================================
--- Src/Provider/FdoRfpImage.cpp	(revision 4508)
+++ Src/Provider/FdoRfpImage.cpp	(working copy)
@@ -46,7 +46,7 @@
     if( GetDS() == NULL )
         return;
     
-    FdoGdalMutexHolder oHolder;
+    //FdoGdalMutexHolder oHolder;
 
     m_redBand = GDALGetRasterBand( m_ds, 1 );
     
Index: Src/Provider/FdoRfpRasterPropertyDictionary.cpp
===================================================================
--- Src/Provider/FdoRfpRasterPropertyDictionary.cpp	(revision 4508)
+++ Src/Provider/FdoRfpRasterPropertyDictionary.cpp	(working copy)
@@ -98,7 +98,7 @@
 
     FdoDataValue* rv;
     FdoPtr<FdoRfpImage> image = m_raster->GetImage();
-    FdoGdalMutexHolder oHolder;
+    //FdoGdalMutexHolder oHolder;
     GDALColorTableH hCT = GDALGetRasterColorTable( GDALGetRasterBand( image->GetDS(), image->m_bandList[0] ) );
     int numOfEntries = 0;
 
Index: Src/Provider/FdoRfpSelectAggregate.cpp
===================================================================
--- Src/Provider/FdoRfpSelectAggregate.cpp	(revision 4508)
+++ Src/Provider/FdoRfpSelectAggregate.cpp	(working copy)
@@ -76,7 +76,7 @@
 
 	FdoPtr<FdoRfpQueryResult> queryResult = executor.Execute();
 
-	return FdoRfpDataReader::Create(queryResult);
+	return FdoRfpDataReader::Create(connection, queryResult);
 }
 
 /// <summary>Set the distinct option of the selection. Note that grouping criteria is not supported with Distinct. 
Index: Src/Provider/FdoRfpSelectCommand.cpp
===================================================================
--- Src/Provider/FdoRfpSelectCommand.cpp	(revision 4508)
+++ Src/Provider/FdoRfpSelectCommand.cpp	(working copy)
@@ -128,7 +128,7 @@
     if (queryResult->aggregated)
         throw FdoCommandException::Create(NlsMsgGet(GRFP_88_CAN_NOT_SELECT_AGGREGATE, "Can not select aggregated result by Select command."));
 
-    return FdoRfpFeatureReader::Create(classDef, queryResult);
+    return FdoRfpFeatureReader::Create(connection, classDef, queryResult);
 }
 
 
Index: Src/Provider/FdoRfpStreamReaderByTile.cpp
===================================================================
--- Src/Provider/FdoRfpStreamReaderByTile.cpp	(revision 4508)
+++ Src/Provider/FdoRfpStreamReaderByTile.cpp	(working copy)
@@ -417,7 +417,7 @@
         wrkComponents = 3;
 
     // Read into interleaved buffer.
-    FdoGdalMutexHolder oHolder;
+    //FdoGdalMutexHolder oHolder;
     eErr = GDALDatasetRasterIO( m_image->GetDS(), GF_Read, 
                                 fileWinXOff, fileWinYOff, fileWinXSize, fileWinYSize,
                                 m_tileData, wrkBlockXSize, wrkBlockYSize, 

