diff --git a/Database/AthenaPOOL/EventSelectorAthenaPool/src/AthenaPoolAddressProviderSvc.cxx b/Database/AthenaPOOL/EventSelectorAthenaPool/src/AthenaPoolAddressProviderSvc.cxx
index 20e847c150cd350c889df7779615062969e8f14f..274f7815c53f0ff3bd728a2430e174cf28266194 100755
--- a/Database/AthenaPOOL/EventSelectorAthenaPool/src/AthenaPoolAddressProviderSvc.cxx
+++ b/Database/AthenaPOOL/EventSelectorAthenaPool/src/AthenaPoolAddressProviderSvc.cxx
@@ -10,7 +10,9 @@
 #include "AthenaPoolAddressProviderSvc.h"
 #include "registerKeys.h"
 
+#include "PersistentDataModel/AthenaAttributeList.h"
 #include "PersistentDataModel/DataHeader.h"
+#include "PersistentDataModel/TokenAddress.h"
 
 // Framework
 #include "GaudiKernel/GenericAddress.h"
@@ -27,10 +29,12 @@
 AthenaPoolAddressProviderSvc::AthenaPoolAddressProviderSvc(const std::string& name, ISvcLocator* pSvcLocator) :
 	::AthService(name, pSvcLocator),
 	m_activeStoreSvc("ActiveStoreSvc", name),
-	m_clidSvc("ClassIDSvc", name) {
+	m_clidSvc("ClassIDSvc", name),
+	m_guid() {
    declareProperty("BackNavigation",      m_backNavigationFlag = false);
    declareProperty("BackNavigationScope", m_backNavigationScope);
    declareProperty("DataHeaderKey",       m_dataHeaderKey = "EventSelector");
+   declareProperty("DataHeaderIterator",  m_dataHeaderIterator = false);
 }
 //________________________________________________________________________________
 AthenaPoolAddressProviderSvc::~AthenaPoolAddressProviderSvc() {
@@ -126,33 +130,61 @@ StatusCode AthenaPoolAddressProviderSvc::loadAddresses(StoreID::type storeID,
    if (storeID != StoreID::EVENT_STORE) {
       return(StatusCode::SUCCESS);
    }
-   const DataHandle<DataHeader> dataHeader;
-   if (!eventStore()->retrieve(dataHeader, m_dataHeaderKey.value()).isSuccess() || !dataHeader.isValid()) {
-      ATH_MSG_ERROR("Cannot retrieve DataHeader from StoreGate.");
-      return(StatusCode::FAILURE);
+
+   Guid thisFile = Guid::null();
+   long int oid2 = 0L;
+   if (m_dataHeaderIterator) {
+      const SG::DataProxy* dhProxy = eventStore()->proxy(ClassID_traits<DataHeader>::ID(), m_dataHeaderKey.value());
+      if (dhProxy != 0 && dhProxy->address() != 0) {
+         Token token;
+         token.fromString(*dhProxy->address()->par());
+         thisFile = token.dbID();
+         oid2 = token.oid().second;
+      }
    }
-   dataHeader->setStatus(DataHeader::Primary);
-   ATH_MSG_DEBUG("The current Event contains: " << dataHeader->size() << " objects");
-   for (std::vector<DataHeaderElement>::const_iterator iter = dataHeader->begin(),
-		   last = dataHeader->end(); iter != last; iter++) {
-      SG::TransientAddress* tadd = iter->getAddress();
-      if (tadd->clID() == ClassID_traits<DataHeader>::ID()) { // self reference
-         if (tadd->name() != "StreamRAW") {
-            if (tadd->name().empty() && dataHeader->sizeProvenance() == 1) { // reading DataHeader satellite
-               SG::TransientAddress* taddDh = dataHeader->beginProvenance()->getAddress();
-               if (taddDh != 0) {
-                  tads.push_back(new SG::TransientAddress(taddDh->clID(), "Full", taddDh->address())); // full DataHeader
+   if (thisFile == Guid::null() || oid2 == 0L || thisFile != m_guid) {
+      const DataHandle<DataHeader> dataHeader;
+      if (!eventStore()->retrieve(dataHeader, m_dataHeaderKey.value()).isSuccess() || !dataHeader.isValid()) {
+         ATH_MSG_ERROR("Cannot retrieve DataHeader from StoreGate.");
+         return(StatusCode::FAILURE);
+      }
+      dataHeader->setStatus(DataHeader::Primary);
+      ATH_MSG_DEBUG("The current Event contains: " << dataHeader->size() << " objects");
+      for (std::vector<DataHeaderElement>::const_iterator iter = dataHeader->begin(),
+		      last = dataHeader->end(); iter != last; iter++) {
+         SG::TransientAddress* tadd = iter->getAddress();
+         if (tadd->clID() == ClassID_traits<DataHeader>::ID()) { // self reference
+            if (tadd->name() != "StreamRAW") {
+               if (tadd->name().empty() && dataHeader->sizeProvenance() == 1) { // reading DataHeader satellite
+                  SG::TransientAddress* taddDh = dataHeader->beginProvenance()->getAddress();
+                  if (taddDh != 0) {
+                     tads.push_back(new SG::TransientAddress(taddDh->clID(), "Full", taddDh->address())); // full DataHeader
+                  }
+                  delete taddDh; taddDh = 0;
                }
-               delete taddDh; taddDh = 0;
+               dataHeader->setProcessTag(tadd->name());
             }
-            dataHeader->setProcessTag(tadd->name());
+            delete tadd; tadd = 0;
+         } else {
+            ATH_MSG_DEBUG("loadAddresses: DataObject address, clid = " << tadd->clID() << ", name = " << tadd->name());
+            tadd->setProvider(this, storeID);
+            if (m_dataHeaderIterator) {
+               tadd->clearAddress(false);
+            }
+            tads.push_back(tadd);
+         }
+         EventSelectorAthenaPoolUtil::registerKeys(*iter, eventStore());
+      }
+      m_guid = thisFile;
+   } else {
+      std::vector<const SG::DataProxy*> preExistingProxies = eventStore()->proxies();
+      for (std::vector<const SG::DataProxy*>::const_iterator iter = preExistingProxies.begin(),
+		      last = preExistingProxies.end(); iter != last; iter++) {
+         TokenAddress* tokAddr = dynamic_cast<TokenAddress*>((*iter)->address());
+         if (tokAddr != 0 && tokAddr->getToken() != 0) {
+            const_cast<Token*>(tokAddr->getToken())->oid().second = oid2;
          }
-         delete tadd; tadd = 0;
-      } else {
-         ATH_MSG_DEBUG("loadAddresses: DataObject address, clid = " << tadd->clID() << ", name = " << tadd->name());
-         tads.push_back(tadd);
       }
-      EventSelectorAthenaPoolUtil::registerKeys(*iter, eventStore());
    }
    return(StatusCode::SUCCESS);
 }
@@ -166,7 +198,7 @@ StatusCode AthenaPoolAddressProviderSvc::updateAddress(StoreID::type storeID,
    // No BackNavigation to DataHeader or AttributeList
    if (tad->clID() == ClassID_traits<DataHeader>::ID()) {
       return(StatusCode::FAILURE);
-   } else if (tad->clID() == 40774348) {
+   } else if (tad->clID() == ClassID_traits<AthenaAttributeList>::ID()) {
       return(StatusCode::FAILURE);
    }
    std::string entry;
diff --git a/Database/AthenaPOOL/EventSelectorAthenaPool/src/AthenaPoolAddressProviderSvc.h b/Database/AthenaPOOL/EventSelectorAthenaPool/src/AthenaPoolAddressProviderSvc.h
index 6cbee13a0c43fee534caa3bf753dae77ee1478ac..b4b54e6ef55415398923f8bbb80dc0a95ed31084 100755
--- a/Database/AthenaPOOL/EventSelectorAthenaPool/src/AthenaPoolAddressProviderSvc.h
+++ b/Database/AthenaPOOL/EventSelectorAthenaPool/src/AthenaPoolAddressProviderSvc.h
@@ -15,6 +15,7 @@
 
 #include "AthenaKernel/IAddressProvider.h"
 #include "AthenaBaseComps/AthService.h"
+#include "PersistentDataModel/Guid.h"
 
 #include <map>
 #include <string>
@@ -58,6 +59,7 @@ public: // Constructor and Destructor
 private: // data
    ServiceHandle<ActiveStoreSvc> m_activeStoreSvc;
    ServiceHandle<IClassIDSvc> m_clidSvc;
+   Guid m_guid;
 
 private: // properties
    /// BackNavigation, switch on back navigation to find objects in input streams: default = false.
@@ -69,6 +71,10 @@ private: // properties
    /// DataHeaderKey, StoreGate key of event entry object (type DataHeader).
    StringProperty m_dataHeaderKey;
 
+   /// DataHeaderIterator, switch to turn on iteration on Token, rather than DataHeader reading.
+   /// Assumes nice/homogeneous input files and may not work for all use cases: default = false.
+   BooleanProperty m_dataHeaderIterator;
+
 private: // internal helper functions
    /// Use back navigation through DataHeaders to locate object, if possible
    StatusCode chaseAddress(SG::TransientAddress* tad,
diff --git a/Database/AthenaPOOL/EventSelectorAthenaPool/src/EventSelectorAthenaPool.cxx b/Database/AthenaPOOL/EventSelectorAthenaPool/src/EventSelectorAthenaPool.cxx
index 0b7cd2f22c6f80a58998901558affc8bd089ec28..e3747a6f135d1849a2513c67133c1c5811e63a41 100755
--- a/Database/AthenaPOOL/EventSelectorAthenaPool/src/EventSelectorAthenaPool.cxx
+++ b/Database/AthenaPOOL/EventSelectorAthenaPool/src/EventSelectorAthenaPool.cxx
@@ -256,12 +256,12 @@ StatusCode EventSelectorAthenaPool::reinit() {
       return(StatusCode::SUCCESS);
    }
    bool retError = false;
-   for (std::vector<ToolHandle<IAthenaSelectorTool> >::const_iterator iter = m_helperTools.begin(),
-		   last = m_helperTools.end(); iter != last; iter++) {
-      if (!(*iter)->postInitialize().isSuccess()) {
-         ATH_MSG_FATAL("Failed to postInitialize() " << (*iter)->name());
-         retError = true;
-      }
+   for (std::vector<ToolHandle<IAthenaSelectorTool> >::iterator iter = m_helperTools.begin(),
+          last = m_helperTools.end(); iter != last; iter++) {
+     if (!(*iter)->postInitialize().isSuccess()) {
+       ATH_MSG_FATAL("Failed to postInitialize() " << (*iter)->name());
+       retError = true;
+     }
    }
    if (retError) {
       ATH_MSG_FATAL("Failed to postInitialize() helperTools");
@@ -274,9 +274,11 @@ StatusCode EventSelectorAthenaPool::reinit() {
    if (m_poolCollectionConverter == 0) {
       ATH_MSG_INFO("No Events found in any Input Collections");
       if (m_processMetadata.value()) {
-         m_inputCollectionsIterator = m_inputCollectionsProp.value().begin();
+	m_inputCollectionsIterator = m_inputCollectionsProp.value().end();
+	if(m_inputCollectionsProp.value().size()>0) m_inputCollectionsIterator--;
+	//NOTE (wb may 2016): this will make the FirstInputFile incident correspond to last file in the collection ... if want it to be first file then move iterator to begin and then move above two lines below this incident firing
          bool isPayload = m_collectionType.value() == "SeekableROOT" || m_collectionType.value() == "ImplicitROOT";
-         if (isPayload && !m_firedIncident) {
+         if (isPayload && !m_firedIncident && m_inputCollectionsProp.value().size()>0) {
             FileIncident firstInputFileIncident(name(), "FirstInputFile", *m_inputCollectionsIterator);
             m_incidentSvc->fireIncident(firstInputFileIncident);
             m_firedIncident = true;
@@ -373,11 +375,13 @@ StatusCode EventSelectorAthenaPool::start() {
    if (m_poolCollectionConverter == 0) {
       ATH_MSG_INFO("No Events found in any Input Collections");
       m_inputCollectionsIterator = m_inputCollectionsProp.value().end();
-      if(m_inputCollectionsProp.value().size()>0) m_inputCollectionsIterator--; //leave iterator in state of last input file 
-      if (m_processMetadata.value()) {
-         // Fire first BeginTagFile incident
-         FileIncident beginTagFileIncident(name(), "BeginTagFile", *m_inputCollectionsIterator);
-         m_incidentSvc->fireIncident(beginTagFileIncident);
+      if(m_inputCollectionsProp.value().size()>0) {
+        m_inputCollectionsIterator--; //leave iterator in state of last input file 
+        if (m_processMetadata.value()) {
+          // Fire first BeginTagFile incident
+          FileIncident beginTagFileIncident(name(), "BeginTagFile", *m_inputCollectionsIterator);
+          m_incidentSvc->fireIncident(beginTagFileIncident);
+        }
       }
       delete m_beginIter; m_beginIter = 0;
       m_beginIter = new EventContextAthenaPool(this);
@@ -456,11 +460,11 @@ StatusCode EventSelectorAthenaPool::finalize() {
       if (!m_counterTool.empty() && !m_counterTool->preFinalize().isSuccess()) {
          ATH_MSG_WARNING("Failed to preFinalize() CounterTool");
       }
-      for (std::vector<ToolHandle<IAthenaSelectorTool> >::const_iterator iter = m_helperTools.begin(),
-		      last = m_helperTools.end(); iter != last; iter++) {
-         if (!(*iter)->preFinalize().isSuccess()) {
-            ATH_MSG_WARNING("Failed to preFinalize() " << (*iter)->name());
-         }
+      for (std::vector<ToolHandle<IAthenaSelectorTool> >::iterator iter = m_helperTools.begin(),
+             last = m_helperTools.end(); iter != last; iter++) {
+        if (!(*iter)->preFinalize().isSuccess()) {
+          ATH_MSG_WARNING("Failed to preFinalize() " << (*iter)->name());
+        }
       }
    }
    delete m_beginIter; m_beginIter = 0;
diff --git a/Database/AthenaPOOL/EventSelectorAthenaPool/src/EventSelectorAthenaPool.h b/Database/AthenaPOOL/EventSelectorAthenaPool/src/EventSelectorAthenaPool.h
index 2acd15db4da68d5b92048cf29930a901b45698cd..13543a8c6aec96a1fb6a8a06d8c0f89a45994ad6 100755
--- a/Database/AthenaPOOL/EventSelectorAthenaPool/src/EventSelectorAthenaPool.h
+++ b/Database/AthenaPOOL/EventSelectorAthenaPool/src/EventSelectorAthenaPool.h
@@ -163,35 +163,35 @@ private: // data
 
 private: // properties
    /// BackNavigation, switch on back navigation to find objects in input streams: default = false.
-   BooleanProperty m_backNavigationFlag;
+   Gaudi::Property<bool> m_backNavigationFlag;
    /// ProcessMetadata, switch on firing of FileIncidents which will trigger processing of metadata: default = true.
-   BooleanProperty m_processMetadata;
+   Gaudi::Property<bool> m_processMetadata;
    /// ShowSizeStat, show size statistics from POOL for all persistified objects: default = false.
-   BooleanProperty m_showSizeStat;
+   Gaudi::Property<bool> m_showSizeStat;
    /// CollectionType, type of the collection: default = "ImplicitROOT".
-   StringProperty m_collectionType;
+   Gaudi::Property<std::string> m_collectionType;
    /// CollectionTree, prefix of the collection TTree: default = "POOLContainer_".
-   StringProperty m_collectionTree;
+   Gaudi::Property<std::string> m_collectionTree;
    /// Connection, connection string.
-   StringProperty m_connection;
+   Gaudi::Property<std::string> m_connection;
    /// RefName, attribute name.
-   StringProperty m_refName;
-   StringProperty m_derRefName;
+   Gaudi::Property<std::string> m_refName;
+   Gaudi::Property<std::string> m_derRefName;
    /// AttributeList SG key
-   StringProperty m_attrListKey;
+   Gaudi::Property<std::string> m_attrListKey;
    /// InputCollections, vector with names of the input collections.
-   StringArrayProperty m_inputCollectionsProp;
+   Gaudi::Property<std::vector<std::string>> m_inputCollectionsProp;
    mutable std::vector<std::string>::const_iterator m_inputCollectionsIterator;
    void inputCollectionsHandler(Property&);
    /// Query, query string.
-   StringProperty m_query;
+   Gaudi::Property<std::string> m_query;
 
    /// SkipBadFiles, boolean flag to allow skipping of non-existing or corrupted files.
-   BooleanProperty m_skipBadFiles;
+   Gaudi::Property<bool> m_skipBadFiles;
 
    /// KeepInputFilesOpen, boolean flag to keep files open after PoolCollection reaches end: default = false.
    /// Needed for PilUp to run without PoolFileCatalog. Relies on POOL to close files when reaching DB_AGE_LIMIT.
-   BooleanProperty m_keepInputFilesOpen;
+   Gaudi::Property<bool> m_keepInputFilesOpen;
 
    /// HelperTools, vector of names of AlgTools that are executed by the EventSelector
    ToolHandleArray<IAthenaSelectorTool> m_helperTools;
@@ -201,29 +201,29 @@ private: // properties
    /// The following are included for compatibility with McEventSelector and are not really used.
    /// However runNo, oldRunNo and overrideRunNumberFromInput are used to reset run number for
    /// simulated events, needed to use conditions
-   IntegerProperty m_runNo;
-   IntegerProperty m_oldRunNo;
-   BooleanProperty m_overrideRunNumberFromInput;
-   IntegerProperty m_firstEventNo;
-   IntegerProperty m_eventsPerRun;
-   IntegerProperty m_firstLBNo;
-   IntegerProperty m_eventsPerLB;
-   IntegerProperty m_initTimeStamp;
-   IntegerProperty m_timeStampInterval;
+   Gaudi::CheckedProperty<int> m_runNo;
+   Gaudi::CheckedProperty<int> m_oldRunNo;
+   Gaudi::Property<bool> m_overrideRunNumberFromInput;
+   Gaudi::CheckedProperty<int> m_firstEventNo;
+   Gaudi::CheckedProperty<int> m_eventsPerRun;
+   Gaudi::CheckedProperty<int> m_firstLBNo;
+   Gaudi::CheckedProperty<int> m_eventsPerLB;
+   Gaudi::CheckedProperty<int> m_initTimeStamp;
+   Gaudi::Property<int> m_timeStampInterval;
 
    /// Flags to indicate override of run/event/time
    /// These are almost always false.
-   BooleanProperty m_overrideRunNumber;
-   BooleanProperty m_overrideEventNumber;
-   BooleanProperty m_overrideTimeStamp;
+   Gaudi::Property<bool> m_overrideRunNumber;
+   Gaudi::Property<bool> m_overrideEventNumber;
+   Gaudi::Property<bool> m_overrideTimeStamp;
 
    mutable long m_curCollection;
    mutable std::vector<int> m_numEvt;
    mutable std::vector<int> m_firstEvt;
 
    /// SkipEvents, numbers of events to skip: default = 0.
-   IntegerProperty m_skipEvents;
-   LongArrayProperty m_skipEventSequenceProp;
+   Gaudi::Property<int> m_skipEvents;
+   Gaudi::Property<std::vector<long>> m_skipEventSequenceProp;
    mutable std::vector<long> m_skipEventSequence;
 
    mutable int m_evtCount; // internal count of events
diff --git a/Database/AthenaPOOL/EventSelectorAthenaPool/src/PoolCollectionConverter.cxx b/Database/AthenaPOOL/EventSelectorAthenaPool/src/PoolCollectionConverter.cxx
index ffdc40761efd377fe08d8d0066630fbde8195241..5034658c2bfc124e56f5ab23e8e25445cad6b2fb 100755
--- a/Database/AthenaPOOL/EventSelectorAthenaPool/src/PoolCollectionConverter.cxx
+++ b/Database/AthenaPOOL/EventSelectorAthenaPool/src/PoolCollectionConverter.cxx
@@ -70,14 +70,14 @@ PoolCollectionConverter::~PoolCollectionConverter() {
 //______________________________________________________________________________
 StatusCode PoolCollectionConverter::initialize() {
    MsgStream log(m_msgSvc, "PoolCollectionConverter");
-   log << MSG::DEBUG << "Initializing PoolCollectionConverter for type: " << m_collectionType << endreq;
+   log << MSG::DEBUG << "Initializing PoolCollectionConverter for type: " << m_collectionType << endmsg;
    std::string collectionTypeString;
    if (m_collectionType == "ExplicitROOT") {
       collectionTypeString = "RootCollection";
    } else if (m_collectionType == "ImplicitROOT" || m_collectionType == "SeekableROOT") {
       collectionTypeString = "ImplicitCollection";
    } else {
-      log << MSG::ERROR << "Undefined collection type " << m_collectionType << endreq;
+      log << MSG::ERROR << "Undefined collection type " << m_collectionType << endmsg;
       return(StatusCode::FAILURE);
    }
    log << MSG::DEBUG << "Create collection type: "
@@ -88,7 +88,7 @@ StatusCode PoolCollectionConverter::initialize() {
 	   << m_connection
 	   << " collection "
 	   << m_inputCollection
-	   << endreq;
+	   << endmsg;
    if (collectionTypeString == "ImplicitCollection") {
       // Check if already prefixed
       if (m_inputCollection.find("PFN:") == 0
@@ -119,13 +119,13 @@ StatusCode PoolCollectionConverter::initialize() {
          m_poolCollection = m_poolSvc->createCollection(collectionTypeString, m_connection, m_inputCollection);
       }
    } catch (std::exception &e) {
-      log << MSG::WARNING << "Unable to create Collection: " << m_connection << endreq;
-      log << MSG::WARNING << e.what() << endreq;
+      log << MSG::WARNING << "Unable to create Collection: " << m_connection << endmsg;
+      log << MSG::WARNING << e.what() << endmsg;
       return(StatusCode::RECOVERABLE);
    }
    if (m_poolCollection == 0) {
       log << MSG::INFO << "Unable to create Collection: " << m_connection 
-          << " container: " << m_inputCollection << endreq;
+          << " container: " << m_inputCollection << endmsg;
    }
    return(StatusCode::SUCCESS);
 }
@@ -172,7 +172,7 @@ std::string PoolCollectionConverter::retrieveToken(const pool::ICollectionCursor
    if (!refName.empty()) {
       MsgStream log(m_msgSvc, "PoolCollectionConverter");
       std::string attrName = refName + "_ref";
-      log << MSG::DEBUG << " Get attribute: " << attrName << " (derived from " << refName << ")" << endreq;
+      log << MSG::DEBUG << " Get attribute: " << attrName << " (derived from " << refName << ")" << endmsg;
       try {
 	 tokenStr = cursor->currentRow().tokenList()[attrName].toString();
       } catch (...) {
@@ -182,7 +182,7 @@ std::string PoolCollectionConverter::retrieveToken(const pool::ICollectionCursor
 	 } catch (std::exception& e) {
 	    log << MSG::ERROR << "Retrieve token for ref name: "
 	            << refName
-	            << " Error caught: " << e.what() << endreq;
+	            << " Error caught: " << e.what() << endmsg;
 	    return("");
 	 }
       }