diff --git a/Database/APR/CollectionBase/CollectionBase/CatalogCollectionCursor.h b/Database/APR/CollectionBase/CollectionBase/CatalogCollectionCursor.h
index 1e8c8140e4db3e3cd9d90d41814d532851df338e..c66f08863dcd2b5a2ba3fe182d7f14d0a4a5301d 100755
--- a/Database/APR/CollectionBase/CollectionBase/CatalogCollectionCursor.h
+++ b/Database/APR/CollectionBase/CollectionBase/CatalogCollectionCursor.h
@@ -50,6 +50,10 @@ namespace pool {
     /// Default destructor.
     virtual ~CatalogCollectionCursor();
 
+    /// Disable copy ctor, assignment.
+    CatalogCollectionCursor (const CatalogCollectionCursor&) = delete;
+    CatalogCollectionCursor& operator= (const CatalogCollectionCursor&) = delete;
+
     /// Advances the cursor to the next row of the query result set of the current collection.
     virtual bool next();
 
diff --git a/Database/APR/CollectionBase/CollectionBase/CollectionDescription.h b/Database/APR/CollectionBase/CollectionBase/CollectionDescription.h
index 64e3f17e56428ebc3e5e17fdfcde5fd5bce4442f..6ea5ed57953fbcfa17db518922ece96be2ad4324 100755
--- a/Database/APR/CollectionBase/CollectionBase/CollectionDescription.h
+++ b/Database/APR/CollectionBase/CollectionBase/CollectionDescription.h
@@ -74,7 +74,7 @@ namespace pool {
      * @param rhs source CollectionDescription object to copy.
      */ 
     CollectionDescription& operator=( const CollectionDescription& rhs )
-    { return operator=( (const ICollectionDescription&) rhs ); }
+    { operator=( (const ICollectionDescription&) rhs ); return *this; }
 
     /**
      * Equality operator.
diff --git a/Database/APR/CollectionBase/CollectionBase/TokenList.h b/Database/APR/CollectionBase/CollectionBase/TokenList.h
index 83d16f172e6e60dc58cf3a9bd25af30f402f98f3..560bb87dfd4775c2aed01d89e111b7e75c390233 100755
--- a/Database/APR/CollectionBase/CollectionBase/TokenList.h
+++ b/Database/APR/CollectionBase/CollectionBase/TokenList.h
@@ -128,10 +128,13 @@ namespace pool {
        iterator_base( const TokenList* list, size_t idx = 0 ) 
 	     : m_list( list ), m_index( idx ) {}
        iterator_base( const iterator_base& rhs ) { *this = rhs; }
-       iterator_base& operator=( const iterator_base& rhs ) { 
-	  m_index = rhs.m_index;
-	  m_list = rhs.m_list;
-	  return *this; 
+       iterator_base& operator=( const iterator_base& rhs )
+       { 
+         if (this != &rhs) {
+           m_index = rhs.m_index;
+           m_list = rhs.m_list;
+         }
+         return *this; 
        }
        virtual ~iterator_base() {}
 
diff --git a/Database/APR/CollectionBase/src/CollectionDescription.cpp b/Database/APR/CollectionBase/src/CollectionDescription.cpp
index 2c217c246af0a7f39ceeae029a66b07d3e53a5f0..607a5aa419d5f81cf313d6cfbb72555c0aa71092 100755
--- a/Database/APR/CollectionBase/src/CollectionDescription.cpp
+++ b/Database/APR/CollectionBase/src/CollectionDescription.cpp
@@ -15,6 +15,7 @@
 
 #include <sstream>
 #include <iostream>
+#include <algorithm>
 using namespace std;
 
 pool::CollectionDescription::CollectionDescription( const std::string& name,
@@ -892,7 +893,7 @@ pool::CollectionDescription::dropIndex( const std::vector<std::string>& columnNa
 {
    const std::string& methodName("dropIndex");
   // Check if index already exists for input columns.
-  for ( std::vector< pool::CollectionIndex* >::iterator iIndex = m_indices.begin(); iIndex != m_indices.end(); ++iIndex ) 
+  for ( std::vector< pool::CollectionIndex* >::iterator iIndex = m_indices.begin(); iIndex != m_indices.end();  ) 
   {
     const pool::CollectionIndex& index = **iIndex;
 
@@ -908,7 +909,7 @@ pool::CollectionDescription::dropIndex( const std::vector<std::string>& columnNa
 
       // Drop the index from the collection description.
       delete *iIndex;
-      m_indices.erase( iIndex );
+      iIndex = m_indices.erase( iIndex );
     }
     else
     {
@@ -1049,7 +1050,7 @@ pool::CollectionDescription::unsetUniqueConstraint( const std::string& columnNam
   // Unset unique constraint on column.
   bool constraintFound = false;
   for ( std::vector< pool::CollectionUniqueConstraint* >::iterator iConstraint = 
-        m_uniqueConstraints.begin(); iConstraint != m_uniqueConstraints.end(); ++iConstraint )
+        m_uniqueConstraints.begin(); iConstraint != m_uniqueConstraints.end(); )
   {
     pool::CollectionUniqueConstraint* constraint = *iConstraint;
 
@@ -1058,9 +1059,11 @@ pool::CollectionDescription::unsetUniqueConstraint( const std::string& columnNam
     {
       constraintFound = true;
       delete constraint;
-      m_uniqueConstraints.erase( iConstraint );
+      iConstraint = m_uniqueConstraints.erase( iConstraint );
       column->setIsUnique( false );
     }
+    else
+      ++iConstraint;
   }
 
   // Unique constraint not found.
@@ -1093,7 +1096,7 @@ pool::CollectionDescription::unsetUniqueConstraint( const std::vector< std::stri
   // Find the constraint and drop it and unset uniqueness on columns of constraint.
   bool constraintFound = false;
   for ( std::vector< pool::CollectionUniqueConstraint* >::iterator iConstraint = 
-        m_uniqueConstraints.begin(); iConstraint != m_uniqueConstraints.end(); ++iConstraint ) 
+        m_uniqueConstraints.begin(); iConstraint != m_uniqueConstraints.end(); ) 
   {
     const pool::CollectionUniqueConstraint& constraint = **iConstraint;
 
@@ -1104,13 +1107,15 @@ pool::CollectionDescription::unsetUniqueConstraint( const std::vector< std::stri
     {
       constraintFound = true;
       delete *iConstraint;
-      m_uniqueConstraints.erase( iConstraint );
+      iConstraint = m_uniqueConstraints.erase( iConstraint );
       for ( std::map< std::string, pool::CollectionColumn* >::iterator iColumn = columnForColumnName.begin();
             iColumn != columnForColumnName.end(); iColumn++ )
       {
         iColumn->second->setIsUnique( false );
       }
     }
+    else
+      ++iConstraint;
   }
 
   if ( ! constraintFound )  {
@@ -1230,39 +1235,39 @@ pool::CollectionDescription::dropCollectionFragment( const std::string& fragment
        iColumn != columns.end(); ++iColumn )
   {
     for ( std::vector< pool::CollectionIndex* >::iterator iIndex = m_indices.begin(); 
-          iIndex != m_indices.end(); ++iIndex ) 
+          iIndex != m_indices.end(); ) 
     {
       pool::CollectionIndex* index = *iIndex;
+      bool deleted = false;
       for ( std::vector< std::string >::const_iterator iName = index->columnNames().begin();
             iName != index->columnNames().end(); ++iName )
       {
         if ( *iName == (*iColumn)->name() ) {
           delete index;
-          m_indices.erase( iIndex );
+          iIndex = m_indices.erase( iIndex );
+          deleted = true;
           break;
         }
       }
+      if (!deleted)
+        ++iIndex;
     }
   }
 
   // Drop description objects of all associated unique constraints.
-  for( std::vector< pool::CollectionColumn* >::iterator iColumn = columns.begin(); 
-       iColumn != columns.end(); ++iColumn )
+  for (pool::CollectionColumn* column  : columns)
   {
     for ( std::vector< pool::CollectionUniqueConstraint* >::iterator iConstraint = 
-          m_uniqueConstraints.begin(); iConstraint != m_uniqueConstraints.end(); ++iConstraint ) 
+          m_uniqueConstraints.begin(); iConstraint != m_uniqueConstraints.end();  ) 
     {
       pool::CollectionUniqueConstraint* constraint = *iConstraint;
-      for ( std::vector< std::string >::const_iterator iName = constraint->columnNames().begin();
-            iName != constraint->columnNames().end(); ++iName )
-      {
-        if ( *iName == (*iColumn)->name() ) 
-        {
-          delete constraint;
-          m_uniqueConstraints.erase( iConstraint );
-          break;
-        }
+      std::vector<std::string>& names = constraint->columnNames();
+      if (std::find (names.begin(), names.end(), column->name()) != names.end()) {
+        delete constraint;
+        iConstraint = m_uniqueConstraints.erase( iConstraint );
       }
+      else
+        ++iConstraint;
     }
   }
 
diff --git a/Database/APR/CollectionBase/src/CollectionFactory.cpp b/Database/APR/CollectionBase/src/CollectionFactory.cpp
index a24588feb1d609bf9d389225487756b3dc337211..e988bbb731e1bc85f8987e3d6b04c6aadfff6f2d 100755
--- a/Database/APR/CollectionBase/src/CollectionFactory.cpp
+++ b/Database/APR/CollectionBase/src/CollectionFactory.cpp
@@ -20,6 +20,7 @@
 #else
 #include "Reflex/PluginService.h"
 #endif
+#include "GAUDI_VERSION.h"
 
 #include "PersistencySvc/ISession.h"
 #include "POOLCore/Exception.h"
@@ -66,7 +67,11 @@ pool::CollectionFactory::create_callPlugin( const pool::ICollectionDescription&
 {
    std::string type( description.type() );
 #ifdef HAVE_GAUDI_PLUGINSVC
+#if GAUDI_VERSION > CALC_GAUDI_VERSION(25, 3) 
+   ICollection *coll = Gaudi::PluginService::Factory<ICollection*, const ICollectionDescription*, ICollection::OpenMode, ISession*>::create( type, &description, openMode, session );
+#else  
    ICollection *coll = Gaudi::PluginService::Factory3<ICollection*, const ICollectionDescription*, ICollection::OpenMode, ISession*>::create( type, &description, openMode, session );
+#endif
 #else
    ICollection *coll = Reflex::PluginService::CreateWithId<ICollection*>( type, &description, openMode, session );
 #endif
@@ -513,8 +518,8 @@ pool::ICollectionCursor*
 pool::CollectionFactory::getCatalogCollectionCursor( pool::IFileCatalog* collectionCatalog,
                                                      std::string collectionLevelQuery,
                                                      std::string rowLevelQuery,
-                                                     std::vector<std::string>* attribOutputList,
                                                      std::vector<std::string>* tokenOutputList,
+                                                     std::vector<std::string>* attribOutputList,
                                                      int rowCacheSize,
                                                      pool::ISession* session ) const
 {
@@ -522,8 +527,8 @@ pool::CollectionFactory::getCatalogCollectionCursor( pool::IFileCatalog* collect
   return new pool::CatalogCollectionCursor( *collectionCatalog,
                                             collectionLevelQuery,
                                             rowLevelQuery,
-                                            attribOutputList,
                                             tokenOutputList,
+                                            attribOutputList,
                                             rowCacheSize,
                                             session );
 }
diff --git a/Database/APR/CollectionBase/test/Factory_test.cxx b/Database/APR/CollectionBase/test/Factory_test.cxx
index 3327552acef4ce94b3a0651d2296b9df666446ae..464bc0d39ed336f6b3d8ab6772b4e949e45bc956 100644
--- a/Database/APR/CollectionBase/test/Factory_test.cxx
+++ b/Database/APR/CollectionBase/test/Factory_test.cxx
@@ -28,7 +28,11 @@ using namespace pool;
 int main(int argc, char** )
 {
   bool crude = argc>1;
-  
+
+  remove ("CollectionCatalog0.xml");
+  remove ("CollectionCatalog1.xml");
+  remove ("CollectionCatalog2.xml");
+   
 //  const string collConnection = "./";
   const string collConnection = "";
   const string collType = "RootCollection";