diff --git a/Event/EventTPCnv/CMakeLists.txt b/Event/EventTPCnv/CMakeLists.txt
index a9c7c1a5abc73994463bfa7473c328f955a861f6..df1162dd4f90a65e6fb150f36a413cc60dfea794 100644
--- a/Event/EventTPCnv/CMakeLists.txt
+++ b/Event/EventTPCnv/CMakeLists.txt
@@ -35,9 +35,37 @@ atlas_add_dictionary( OLD_EventTPCnvDict
                       INCLUDE_DIRS ${ROOT_INCLUDE_DIRS}
                       LINK_LIBRARIES ${ROOT_LIBRARIES} AthenaPoolCnvSvcLib EventInfo TestTools AthenaKernel EventTPCnv )
 
-atlas_add_test( vectorize_test
-                SOURCES
-                test/vectorize_test.cxx
-                INCLUDE_DIRS ${ROOT_INCLUDE_DIRS}
-                LINK_LIBRARIES ${ROOT_LIBRARIES} AthenaPoolCnvSvcLib EventInfo TestTools AthenaKernel EventTPCnv )
+foreach( name
+    EventIDCnv_p1_test
+    EventIDCnv_p2_test
+    EventInfoCnv_p1_test
+    EventInfoCnv_p2_test
+    EventInfoCnv_p3_test
+    EventInfoCnv_p4_test
+    EventStreamInfoCnv_p1_test
+    EventStreamInfoCnv_p2_test
+    EventStreamInfoCnv_p3_test
+    EventTypeCnv_p1_test
+    EventTypeCnv_p2_test
+    EventTypeCnv_p3_test
+    MergedEventInfoCnv_p1_test
+    MergedEventInfoCnv_p2_test
+    PileUpEventInfoCnv_p1_test
+    PileUpEventInfoCnv_p2_test
+    PileUpEventInfoCnv_p3_test
+    PileUpEventInfoCnv_p4_test
+    PileUpEventInfoCnv_p5_test
+    TriggerInfoCnv_p1_test
+    TriggerInfoCnv_p2_test
+    TriggerInfoCnv_p3_test
+    AtlasMcWeight_test
+    vectorize_test
+         )
 
+       atlas_add_test( ${name}
+         SOURCES
+         test/${name}.cxx
+         INCLUDE_DIRS ${ROOT_INCLUDE_DIRS}
+         LINK_LIBRARIES ${ROOT_LIBRARIES} AthenaPoolCnvSvcLib EventInfo TestTools AthenaKernel EventTPCnv )
+
+endforeach()
diff --git a/Event/EventTPCnv/EventTPCnv/AtlasMcWeight.h b/Event/EventTPCnv/EventTPCnv/AtlasMcWeight.h
index ea5a9a0fc95a3ac58cdfc4976f1f9f9c58ee5c1a..78d388a32fdc77962ada0aa24bb529a7fe25f399 100644
--- a/Event/EventTPCnv/EventTPCnv/AtlasMcWeight.h
+++ b/Event/EventTPCnv/EventTPCnv/AtlasMcWeight.h
@@ -12,7 +12,7 @@
  *
  * @author Paolo Calafiura <pcalafiura@lbl.gov>, Borut Kersevan <borut.kersevan@cern.ch>
  *
- * $Id: AtlasMcWeight.h 542280 2013-03-25 12:34:31Z schaffer $
+ * $Id: AtlasMcWeight.h 764382 2016-07-26 15:37:04Z ssnyder $
  */
 
 namespace AtlasMcWeight {
@@ -22,6 +22,7 @@ namespace AtlasMcWeight {
     /// Convert weight from unsigned to double
     double decode(number_type binnedWeight);
 
+    number_type encode(double weight);
 }
 
 #endif
diff --git a/Event/EventTPCnv/EventTPCnv/EventIDCnv_p1.h b/Event/EventTPCnv/EventTPCnv/EventIDCnv_p1.h
index 4a5fee3428761a725f719286534ff1097c0ad402..a0e9abb38a8a76d1d3a84bfbf8840df309fdbd48 100644
--- a/Event/EventTPCnv/EventTPCnv/EventIDCnv_p1.h
+++ b/Event/EventTPCnv/EventTPCnv/EventIDCnv_p1.h
@@ -5,6 +5,7 @@
 #ifndef EVENTATHENAPOOL_EVENTIDCNV_P1_H
 #define EVENTATHENAPOOL_EVENTIDCNV_P1_H
 
+#include "EventInfo/EventID.h"
 #include "EventTPCnv/EventID_p1.h"
 #include "AthenaPoolCnvSvc/T_AthenaPoolTPConverter.h"
 
@@ -13,8 +14,13 @@ class MsgStream;
 class EventIDCnv_p1  : public T_AthenaPoolTPCnvBase<EventID, EventID_p1>  {
 public:
   EventIDCnv_p1() {}
-  virtual void   persToTrans(const EventID_p1* persObj, EventID* transObj, MsgStream &log) ;
-  virtual void   transToPers(const EventID* transObj, EventID_p1* persObj, MsgStream &log) ;
+  virtual void   persToTrans(const EventID_p1* persObj, EventID* transObj, MsgStream &log) override;
+  virtual void   transToPers(const EventID* transObj, EventID_p1* persObj, MsgStream &log) override;
+  void   persToTrans(const EventID_p1* persObj, EventID* transObj, MsgStream &log) const;
+  void   transToPers(const EventID* transObj, EventID_p1* persObj, MsgStream &log) const;
+
+  virtual EventID* createTransient (const EventID_p1* persObj, MsgStream& log) override;
+  EventID* createTransient (const EventID_p1* persObj, MsgStream& log) const;
 };
 
 #endif
diff --git a/Event/EventTPCnv/EventTPCnv/EventIDCnv_p2.h b/Event/EventTPCnv/EventTPCnv/EventIDCnv_p2.h
index c163bf367f4971315e7152866bf4611f9e0ec184..5fa51043b2aa66d57d6960facffa9bfe2c9ece5c 100644
--- a/Event/EventTPCnv/EventTPCnv/EventIDCnv_p2.h
+++ b/Event/EventTPCnv/EventTPCnv/EventIDCnv_p2.h
@@ -5,11 +5,12 @@
 #ifndef EVENTATHENAPOOL_EVENTIDCNV_P2_H
 #define EVENTATHENAPOOL_EVENTIDCNV_P2_H
 #include <vector>
+class EventID;
 class EventIDCnv_p2 {
 public:
   EventIDCnv_p2() {}
-  virtual void   persToTrans(std::vector<unsigned int>::const_iterator & nnnnpersObj, EventID* transObj) ;
-  virtual void   transToPers(const EventID* transObj, std::vector<unsigned int> &persObj) ;
+  void   persToTrans(std::vector<unsigned int>::const_iterator & nnnnpersObj, EventID* transObj) const;
+  void   transToPers(const EventID* transObj, std::vector<unsigned int> &persObj) const;
 };
 
 #endif
diff --git a/Event/EventTPCnv/EventTPCnv/EventInfoCnv_p1.h b/Event/EventTPCnv/EventTPCnv/EventInfoCnv_p1.h
index d1c0bad3ba95a908a713d01a73c782c8f0bb9d54..7a86776a33ff2c432825e399934796eceb0b6157 100644
--- a/Event/EventTPCnv/EventTPCnv/EventInfoCnv_p1.h
+++ b/Event/EventTPCnv/EventTPCnv/EventInfoCnv_p1.h
@@ -13,11 +13,14 @@ class MsgStream;
 class EventInfoCnv_p1  : public T_AthenaPoolTPCnvBase<EventInfo, EventInfo_p1>  {
 public:
   EventInfoCnv_p1() {}
-  virtual void   persToTrans(const EventInfo_p1* persObj, EventInfo* transObj, MsgStream &log) ;
-  virtual void   transToPers(const EventInfo* transObj, EventInfo_p1* persObj, MsgStream &log) ;
+  virtual void   persToTrans(const EventInfo_p1* persObj, EventInfo* transObj, MsgStream &log) override;
+  virtual void   transToPers(const EventInfo* transObj, EventInfo_p1* persObj, MsgStream &log) override;
+  void   persToTrans(const EventInfo_p1* persObj, EventInfo* transObj, MsgStream &log) const;
+  void   transToPers(const EventInfo* transObj, EventInfo_p1* persObj, MsgStream &log) const;
 
   // needed to handle specific default constructor of EventInfo
-  virtual EventInfo *createTransient( const EventInfo_p1* persObj, MsgStream &log);
+  virtual EventInfo *createTransient( const EventInfo_p1* persObj, MsgStream &log) override;
+  EventInfo *createTransient( const EventInfo_p1* persObj, MsgStream &log) const;
 };
 
 template<>
diff --git a/Event/EventTPCnv/EventTPCnv/EventInfoCnv_p2.h b/Event/EventTPCnv/EventTPCnv/EventInfoCnv_p2.h
index 0a4ddde7f8b33d93d0d94f550a7a3bb1d21b6b25..dbd9c29b196ff6741572269a40f7a975cd0d4cce 100644
--- a/Event/EventTPCnv/EventTPCnv/EventInfoCnv_p2.h
+++ b/Event/EventTPCnv/EventTPCnv/EventInfoCnv_p2.h
@@ -6,17 +6,22 @@
 #define EVENTATHENAPOOL_EVENTINFOCNV_P2_H
 
 #include "EventTPCnv/EventInfo_p2.h"
+#include "EventInfo/EventInfo.h"
 #include "AthenaPoolCnvSvc/T_AthenaPoolTPConverter.h"
 
 class MsgStream;
 class EventInfoCnv_p2  : public T_AthenaPoolTPCnvBase<EventInfo, EventInfo_p2>  {
 public:
   EventInfoCnv_p2() {}
-  virtual void   persToTrans(const EventInfo_p2* persObj, EventInfo* transObj, MsgStream &log) ;
-  virtual void   transToPers(const EventInfo* transObj, EventInfo_p2* persObj, MsgStream &log) ;
+  virtual void   persToTrans(const EventInfo_p2* persObj, EventInfo* transObj, MsgStream &log) override;
+  virtual void   transToPers(const EventInfo* transObj, EventInfo_p2* persObj, MsgStream &log) override;
+
+  void   persToTrans(const EventInfo_p2* persObj, EventInfo* transObj, MsgStream &log) const;
+  void   transToPers(const EventInfo* transObj, EventInfo_p2* persObj, MsgStream &log) const;
 
   // needed to handle specific default constructor of EventInfo
-  virtual EventInfo *createTransient( const EventInfo_p2* persObj, MsgStream &log);
+  virtual EventInfo *createTransient( const EventInfo_p2* persObj, MsgStream &log) override;
+  EventInfo *createTransient( const EventInfo_p2* persObj, MsgStream &log) const;
 };
 
 template<>
diff --git a/Event/EventTPCnv/EventTPCnv/EventInfoCnv_p3.h b/Event/EventTPCnv/EventTPCnv/EventInfoCnv_p3.h
index cb649a34349382ed6b969267fe3d61326c8f83e1..84d12821da3b675791cb251daa8179c832b52c3b 100644
--- a/Event/EventTPCnv/EventTPCnv/EventInfoCnv_p3.h
+++ b/Event/EventTPCnv/EventTPCnv/EventInfoCnv_p3.h
@@ -6,17 +6,22 @@
 #define EVENTATHENAPOOL_EVENTINFOCNV_P3_H
 
 #include "EventTPCnv/EventInfo_p3.h"
+#include "EventInfo/EventInfo.h"
 #include "AthenaPoolCnvSvc/T_AthenaPoolTPConverter.h"
 
 class MsgStream;
 class EventInfoCnv_p3  : public T_AthenaPoolTPCnvBase<EventInfo, EventInfo_p3>  {
 public:
   EventInfoCnv_p3() {}
-  virtual void   persToTrans(const EventInfo_p3* persObj, EventInfo* transObj, MsgStream &log) ;
-  virtual void   transToPers(const EventInfo* transObj, EventInfo_p3* persObj, MsgStream &log) ;
+  virtual void   persToTrans(const EventInfo_p3* persObj, EventInfo* transObj, MsgStream &log) override;
+  virtual void   transToPers(const EventInfo* transObj, EventInfo_p3* persObj, MsgStream &log) override;
+
+  void   persToTrans(const EventInfo_p3* persObj, EventInfo* transObj, MsgStream &log) const;
+  void   transToPers(const EventInfo* transObj, EventInfo_p3* persObj, MsgStream &log) const;
 
   // needed to handle specific default constructor of EventInfo
-  virtual EventInfo *createTransient( const EventInfo_p3* persObj, MsgStream &log);
+  virtual EventInfo *createTransient( const EventInfo_p3* persObj, MsgStream &log) override;
+  EventInfo *createTransient( const EventInfo_p3* persObj, MsgStream &log) const;
 };
 
 template<>
diff --git a/Event/EventTPCnv/EventTPCnv/EventInfoCnv_p4.h b/Event/EventTPCnv/EventTPCnv/EventInfoCnv_p4.h
index 5bef2e20941075ec45687bdc1a356e387883465a..de23426dd30a2823fe6c52b2f75e86b06725c6b8 100644
--- a/Event/EventTPCnv/EventTPCnv/EventInfoCnv_p4.h
+++ b/Event/EventTPCnv/EventTPCnv/EventInfoCnv_p4.h
@@ -6,17 +6,23 @@
 #define EVENTATHENAPOOL_EVENTINFOCNV_P4_H
 
 #include "EventTPCnv/EventInfo_p4.h"
+#include "EventInfo/EventInfo.h"
 #include "AthenaPoolCnvSvc/T_AthenaPoolTPConverter.h"
 
 class MsgStream;
 class EventInfoCnv_p4  : public T_AthenaPoolTPCnvBase<EventInfo, EventInfo_p4>  {
 public:
   EventInfoCnv_p4() {}
-  virtual void   persToTrans(const EventInfo_p4* persObj, EventInfo* transObj, MsgStream &log) ;
-  virtual void   transToPers(const EventInfo* transObj, EventInfo_p4* persObj, MsgStream &log) ;
+  virtual void   persToTrans(const EventInfo_p4* persObj, EventInfo* transObj, MsgStream &log) override;
+  virtual void   transToPers(const EventInfo* transObj, EventInfo_p4* persObj, MsgStream &log) override;
+
+  void   persToTrans(const EventInfo_p4* persObj, EventInfo* transObj, MsgStream &log) const;
+  void   transToPers(const EventInfo* transObj, EventInfo_p4* persObj, MsgStream &log) const;
 
   // needed to handle specific default constructor of EventInfo
-  virtual EventInfo *createTransient( const EventInfo_p4* persObj, MsgStream &log);
+  virtual EventInfo *createTransient( const EventInfo_p4* persObj, MsgStream &log) override;
+
+  EventInfo *createTransient( const EventInfo_p4* persObj, MsgStream &log) const;
 };
 
 template<>
diff --git a/Event/EventTPCnv/EventTPCnv/EventTypeCnv_p1.h b/Event/EventTPCnv/EventTPCnv/EventTypeCnv_p1.h
index 76f91cfb5a00c6202380fc7c0a232b632d8ef083..01491394badd4475825c9dc5918ccce815ac45c6 100644
--- a/Event/EventTPCnv/EventTPCnv/EventTypeCnv_p1.h
+++ b/Event/EventTPCnv/EventTPCnv/EventTypeCnv_p1.h
@@ -6,14 +6,20 @@
 #define EVENTATHENAPOOL_EVENTTYPECNV_P1_H
 
 #include "EventTPCnv/EventType_p1.h"
+#include "EventInfo/EventType.h"
 #include "AthenaPoolCnvSvc/T_AthenaPoolTPConverter.h"
 
 class MsgStream;
 class EventTypeCnv_p1  : public T_AthenaPoolTPCnvBase<EventType, EventType_p1>  {
 public:
   EventTypeCnv_p1() {}
-  virtual void   persToTrans(const EventType_p1* persObj, EventType* transObj, MsgStream &log);
-  virtual void   transToPers(const EventType* transObj, EventType_p1* persObj, MsgStream &log);
+  virtual void   persToTrans(const EventType_p1* persObj, EventType* transObj, MsgStream &log) override;
+  virtual void   transToPers(const EventType* transObj, EventType_p1* persObj, MsgStream &log) override;
+  void   persToTrans(const EventType_p1* persObj, EventType* transObj, MsgStream &log) const;
+  void   transToPers(const EventType* transObj, EventType_p1* persObj, MsgStream &log) const;
+
+  virtual EventType* createTransient (const EventType_p1* persObj, MsgStream& log) override;
+  EventType* createTransient (const EventType_p1* persObj, MsgStream& log) const;
 };
 
 #endif
diff --git a/Event/EventTPCnv/EventTPCnv/EventTypeCnv_p2.h b/Event/EventTPCnv/EventTPCnv/EventTypeCnv_p2.h
index b6acd149dec250a03294407b2ec32d481acec0f4..cacc5c303e360de8eb2f2d1d5a9ac08fdbf2bb45 100644
--- a/Event/EventTPCnv/EventTPCnv/EventTypeCnv_p2.h
+++ b/Event/EventTPCnv/EventTPCnv/EventTypeCnv_p2.h
@@ -4,12 +4,14 @@
 
 #ifndef EVENTATHENAPOOL_EVENTTYPECNV_P2_H
 #define EVENTATHENAPOOL_EVENTTYPECNV_P2_H
+class EventType;
 #include <vector>
 
 class EventTypeCnv_p2{
 public:
-  void   persToTrans(std::vector<unsigned int>::const_iterator &persObj, EventType* transObj, int version, bool bugcompat);
-  void   transToPers(const EventType* transObj, std::vector<unsigned int> &persObj);
+  EventTypeCnv_p2() {}
+  void   persToTrans(std::vector<unsigned int>::const_iterator &persObj, EventType* transObj, int version, bool bugcompat) const;
+  void   transToPers(const EventType* transObj, std::vector<unsigned int> &persObj) const;
 };
 
 #endif
diff --git a/Event/EventTPCnv/EventTPCnv/EventTypeCnv_p3.h b/Event/EventTPCnv/EventTPCnv/EventTypeCnv_p3.h
index df9eaefd79312a38351906db9c6a87b5f50f05ed..b7227da81e93878b1a8424c7e1b70e5f3941a11b 100644
--- a/Event/EventTPCnv/EventTPCnv/EventTypeCnv_p3.h
+++ b/Event/EventTPCnv/EventTPCnv/EventTypeCnv_p3.h
@@ -6,14 +6,20 @@
 #define EVENTATHENAPOOL_EVENTTYPECNV_P3_H
 
 #include "EventTPCnv/EventType_p3.h"
+#include "EventInfo/EventType.h"
 #include "AthenaPoolCnvSvc/T_AthenaPoolTPConverter.h"
 
 class MsgStream;
 class EventTypeCnv_p3  : public T_AthenaPoolTPCnvBase<EventType, EventType_p3>  {
 public:
   EventTypeCnv_p3() {}
-  virtual void   persToTrans(const EventType_p3* persObj, EventType* transObj, MsgStream &log);
-  virtual void   transToPers(const EventType* transObj, EventType_p3* persObj, MsgStream &log);
+  virtual void   persToTrans(const EventType_p3* persObj, EventType* transObj, MsgStream &log) override;
+  virtual void   transToPers(const EventType* transObj, EventType_p3* persObj, MsgStream &log) override;
+  void   persToTrans(const EventType_p3* persObj, EventType* transObj, MsgStream &log) const;
+  void   transToPers(const EventType* transObj, EventType_p3* persObj, MsgStream &log) const;
+
+  virtual EventType* createTransient (const EventType_p3* persObj, MsgStream& log) override;
+  EventType* createTransient (const EventType_p3* persObj, MsgStream& log) const;
 };
 
 #endif
diff --git a/Event/EventTPCnv/EventTPCnv/PileUpEventInfoCnv_p3.h b/Event/EventTPCnv/EventTPCnv/PileUpEventInfoCnv_p3.h
index 2ff766fcabeddd5f635fdd7cdc0f3a9e37b610cd..fc03c87fe6193f454f72e4976b3f4e4faec39670 100644
--- a/Event/EventTPCnv/EventTPCnv/PileUpEventInfoCnv_p3.h
+++ b/Event/EventTPCnv/EventTPCnv/PileUpEventInfoCnv_p3.h
@@ -6,6 +6,7 @@
 #define EVENTATHENAPOOL_PILEUPEVENTINFOCNV_P3_H
 
 #include "EventTPCnv/PileUpEventInfo_p3.h"
+#include "EventInfo/PileUpEventInfo.h"
 #include "AthenaPoolCnvSvc/T_AthenaPoolTPConverter.h"
 
 class MsgStream;
diff --git a/Event/EventTPCnv/EventTPCnv/PileUpEventInfoCnv_p4.h b/Event/EventTPCnv/EventTPCnv/PileUpEventInfoCnv_p4.h
index 3c52c70e1e7418ba9bfd6edd157b1c179c1da8ee..c0a99f3754193ae56dde705c730d5a252152f8f3 100644
--- a/Event/EventTPCnv/EventTPCnv/PileUpEventInfoCnv_p4.h
+++ b/Event/EventTPCnv/EventTPCnv/PileUpEventInfoCnv_p4.h
@@ -6,6 +6,7 @@
 #define EVENTATHENAPOOL_PILEUPEVENTINFOCNV_P4_H
 
 #include "EventTPCnv/PileUpEventInfo_p4.h"
+#include "EventInfo/PileUpEventInfo.h"
 #include "AthenaPoolCnvSvc/T_AthenaPoolTPConverter.h"
 
 class MsgStream;
diff --git a/Event/EventTPCnv/EventTPCnv/PileUpEventInfoCnv_p5.h b/Event/EventTPCnv/EventTPCnv/PileUpEventInfoCnv_p5.h
index 14a188a822f425702348b5b3d62ad286309d23cb..f8d2ebbad97301df06021b2db9f348690341f516 100644
--- a/Event/EventTPCnv/EventTPCnv/PileUpEventInfoCnv_p5.h
+++ b/Event/EventTPCnv/EventTPCnv/PileUpEventInfoCnv_p5.h
@@ -6,6 +6,7 @@
 #define EVENTATHENAPOOL_PILEUPEVENTINFOCNV_P5_H
 
 #include "EventTPCnv/PileUpEventInfo_p5.h"
+#include "EventInfo/PileUpEventInfo.h"
 #include "AthenaPoolCnvSvc/T_AthenaPoolTPConverter.h"
 
 class MsgStream;
diff --git a/Event/EventTPCnv/EventTPCnv/TriggerInfoCnv_p1.h b/Event/EventTPCnv/EventTPCnv/TriggerInfoCnv_p1.h
index 48fb9c08f6b629dc3df99847980f7bc479567acd..2e9bbcc1d5235c0f2a8b9049e7bac07e542fc3db 100644
--- a/Event/EventTPCnv/EventTPCnv/TriggerInfoCnv_p1.h
+++ b/Event/EventTPCnv/EventTPCnv/TriggerInfoCnv_p1.h
@@ -6,14 +6,23 @@
 #define EVENTATHENAPOOL_TRIGGERINFOCNV_P1_H
 
 #include "EventTPCnv/TriggerInfo_p1.h"
+#include "EventInfo/TriggerInfo.h"
 #include "AthenaPoolCnvSvc/T_AthenaPoolTPConverter.h"
 
 class MsgStream;
 class TriggerInfoCnv_p1  : public T_AthenaPoolTPCnvBase<TriggerInfo, TriggerInfo_p1>  {
 public:
   TriggerInfoCnv_p1() {}
-  virtual void   persToTrans(const TriggerInfo_p1* persObj, TriggerInfo* transObj, MsgStream &log) ;
-  virtual void   transToPers(const TriggerInfo* transObj, TriggerInfo_p1* persObj, MsgStream &log) ;
+  virtual void   persToTrans(const TriggerInfo_p1* persObj, TriggerInfo* transObj, MsgStream &log) override;
+  virtual void   transToPers(const TriggerInfo* transObj, TriggerInfo_p1* persObj, MsgStream &log) override;
+  void   persToTrans(const TriggerInfo_p1* persObj, TriggerInfo* transObj, MsgStream &log) const;
+  void   transToPers(const TriggerInfo* transObj, TriggerInfo_p1* persObj, MsgStream &log) const;
+
+  virtual TriggerInfo* createTransient (const TriggerInfo_p1* persObj, MsgStream& log) override;
+  TriggerInfo* createTransient (const TriggerInfo_p1* persObj, MsgStream& log) const;
+
+  virtual TriggerInfo_p1* createPersistent (const TriggerInfo* transObj, MsgStream& log) override;
+  TriggerInfo_p1* createPersistent (const TriggerInfo* transObj, MsgStream& log) const;
 };
 
 #endif
diff --git a/Event/EventTPCnv/EventTPCnv/TriggerInfoCnv_p2.h b/Event/EventTPCnv/EventTPCnv/TriggerInfoCnv_p2.h
index ab14fe083a4bafbc0357566ddd8dd40d64d776e2..191b4cfdd44360d207c43a4b42577e7b463bac2f 100644
--- a/Event/EventTPCnv/EventTPCnv/TriggerInfoCnv_p2.h
+++ b/Event/EventTPCnv/EventTPCnv/TriggerInfoCnv_p2.h
@@ -6,14 +6,20 @@
 #define EVENTATHENAPOOL_TRIGGERINFOCNV_P2_H
 
 #include "EventTPCnv/TriggerInfo_p2.h"
+#include "EventInfo/TriggerInfo.h"
 #include "AthenaPoolCnvSvc/T_AthenaPoolTPConverter.h"
 
 class MsgStream;
 class TriggerInfoCnv_p2  : public T_AthenaPoolTPCnvBase<TriggerInfo, TriggerInfo_p2>  {
 public:
   TriggerInfoCnv_p2() {}
-  virtual void   persToTrans(const TriggerInfo_p2* persObj, TriggerInfo* transObj, MsgStream &log) ;
-  virtual void   transToPers(const TriggerInfo* transObj, TriggerInfo_p2* persObj, MsgStream &log) ;
+  virtual void   persToTrans(const TriggerInfo_p2* persObj, TriggerInfo* transObj, MsgStream &log) override;
+  virtual void   transToPers(const TriggerInfo* transObj, TriggerInfo_p2* persObj, MsgStream &log) override;
+  void   persToTrans(const TriggerInfo_p2* persObj, TriggerInfo* transObj, MsgStream &log) const;
+  void   transToPers(const TriggerInfo* transObj, TriggerInfo_p2* persObj, MsgStream &log) const;
+
+  virtual TriggerInfo* createTransient (const TriggerInfo_p2* persObj, MsgStream& log) override;
+  TriggerInfo* createTransient (const TriggerInfo_p2* persObj, MsgStream& log) const;
 };
 
 #endif
diff --git a/Event/EventTPCnv/EventTPCnv/TriggerInfoCnv_p3.h b/Event/EventTPCnv/EventTPCnv/TriggerInfoCnv_p3.h
index c09fe0ed4f1a271ce5bb92c06cc5257e85af32de..94b4e3456de8b5166f856509f540ac25bbc9d4bc 100644
--- a/Event/EventTPCnv/EventTPCnv/TriggerInfoCnv_p3.h
+++ b/Event/EventTPCnv/EventTPCnv/TriggerInfoCnv_p3.h
@@ -4,12 +4,15 @@
 
 #ifndef EVENTATHENAPOOL_TRIGGERINFOCNV_P3_H
 #define EVENTATHENAPOOL_TRIGGERINFOCNV_P3_H
+class TriggerInfo;
+#include <vector>
 
 class MsgStream;
 class TriggerInfoCnv_p3 {
 public:
-  void   persToTrans(std::vector<unsigned int>::const_iterator &persObj, TriggerInfo* transObj, bool bugcompat);
-  void   transToPers(const TriggerInfo* transObj, std::vector<unsigned int> &persObj);
+  TriggerInfoCnv_p3() {}
+  void   persToTrans(std::vector<unsigned int>::const_iterator &persObj, TriggerInfo* transObj, bool bugcompat) const;
+  void   transToPers(const TriggerInfo* transObj, std::vector<unsigned int> &persObj) const;
 };
 
 #endif
diff --git a/Event/EventTPCnv/EventTPCnv/TriggerInfo_p2.h b/Event/EventTPCnv/EventTPCnv/TriggerInfo_p2.h
index c451e1f1cf9a854ff158236d3bdf5260a6fc4e26..524537671b56a943c852677b74f981eeaf936493 100644
--- a/Event/EventTPCnv/EventTPCnv/TriggerInfo_p2.h
+++ b/Event/EventTPCnv/EventTPCnv/TriggerInfo_p2.h
@@ -13,6 +13,7 @@
  */
 
 #include <vector>
+#include <string>
 
 class TriggerInfo_p2 {
 public:
diff --git a/Event/EventTPCnv/cmt/requirements b/Event/EventTPCnv/cmt/requirements
index 1de508f8f713e32a04dee42533d384b1c003bcfc..34cb1e9ec27a73d2c8d58d2963c2a49b02dfab84 100644
--- a/Event/EventTPCnv/cmt/requirements
+++ b/Event/EventTPCnv/cmt/requirements
@@ -12,6 +12,8 @@ use AthenaPoolCnvSvc     AthenaPoolCnvSvc-*         Database/AthenaPOOL
 
 
 private
+use GaudiInterface       GaudiInterface-*           External
+use CxxUtils             CxxUtils-*                 Control
 use AthenaKernel         AthenaKernel-*             Control
 end_private
 
@@ -26,4 +28,28 @@ apply_pattern lcgdict dict=OLD_EventTPCnv  selectionfile=OLD_selection.xml heade
 private
 use TestTools       TestTools-*         AtlasTest
 
+apply_pattern UnitTest_run unit_test=EventIDCnv_p1
+apply_pattern UnitTest_run unit_test=EventIDCnv_p2
+apply_pattern UnitTest_run unit_test=EventInfoCnv_p1
+apply_pattern UnitTest_run unit_test=EventInfoCnv_p2
+apply_pattern UnitTest_run unit_test=EventInfoCnv_p3
+apply_pattern UnitTest_run unit_test=EventInfoCnv_p4
+apply_pattern UnitTest_run unit_test=EventStreamInfoCnv_p1
+apply_pattern UnitTest_run unit_test=EventStreamInfoCnv_p2
+apply_pattern UnitTest_run unit_test=EventStreamInfoCnv_p3
+apply_pattern UnitTest_run unit_test=EventTypeCnv_p1
+apply_pattern UnitTest_run unit_test=EventTypeCnv_p2
+apply_pattern UnitTest_run unit_test=EventTypeCnv_p3
+apply_pattern UnitTest_run unit_test=MergedEventInfoCnv_p1
+apply_pattern UnitTest_run unit_test=MergedEventInfoCnv_p2
+apply_pattern UnitTest_run unit_test=PileUpEventInfoCnv_p1
+apply_pattern UnitTest_run unit_test=PileUpEventInfoCnv_p2
+apply_pattern UnitTest_run unit_test=PileUpEventInfoCnv_p3
+apply_pattern UnitTest_run unit_test=PileUpEventInfoCnv_p4
+apply_pattern UnitTest_run unit_test=PileUpEventInfoCnv_p5
+apply_pattern UnitTest_run unit_test=TriggerInfoCnv_p1
+apply_pattern UnitTest_run unit_test=TriggerInfoCnv_p2
+apply_pattern UnitTest_run unit_test=TriggerInfoCnv_p3
+apply_pattern UnitTest_run unit_test=AtlasMcWeight
 apply_pattern UnitTest_run unit_test=vectorize
+
diff --git a/Event/EventTPCnv/share/AtlasMcWeight_test.ref b/Event/EventTPCnv/share/AtlasMcWeight_test.ref
new file mode 100644
index 0000000000000000000000000000000000000000..a5bce3fd2565d8f458555a0c6f42d0504a848bd5
--- /dev/null
+++ b/Event/EventTPCnv/share/AtlasMcWeight_test.ref
@@ -0,0 +1 @@
+test1
diff --git a/Event/EventTPCnv/share/EventIDCnv_p1_test.ref b/Event/EventTPCnv/share/EventIDCnv_p1_test.ref
new file mode 100644
index 0000000000000000000000000000000000000000..a5bce3fd2565d8f458555a0c6f42d0504a848bd5
--- /dev/null
+++ b/Event/EventTPCnv/share/EventIDCnv_p1_test.ref
@@ -0,0 +1 @@
+test1
diff --git a/Event/EventTPCnv/share/EventIDCnv_p2_test.ref b/Event/EventTPCnv/share/EventIDCnv_p2_test.ref
new file mode 100644
index 0000000000000000000000000000000000000000..a5bce3fd2565d8f458555a0c6f42d0504a848bd5
--- /dev/null
+++ b/Event/EventTPCnv/share/EventIDCnv_p2_test.ref
@@ -0,0 +1 @@
+test1
diff --git a/Event/EventTPCnv/share/EventInfoCnv_p1_test.ref b/Event/EventTPCnv/share/EventInfoCnv_p1_test.ref
new file mode 100644
index 0000000000000000000000000000000000000000..a5bce3fd2565d8f458555a0c6f42d0504a848bd5
--- /dev/null
+++ b/Event/EventTPCnv/share/EventInfoCnv_p1_test.ref
@@ -0,0 +1 @@
+test1
diff --git a/Event/EventTPCnv/share/EventInfoCnv_p2_test.ref b/Event/EventTPCnv/share/EventInfoCnv_p2_test.ref
new file mode 100644
index 0000000000000000000000000000000000000000..a5bce3fd2565d8f458555a0c6f42d0504a848bd5
--- /dev/null
+++ b/Event/EventTPCnv/share/EventInfoCnv_p2_test.ref
@@ -0,0 +1 @@
+test1
diff --git a/Event/EventTPCnv/share/EventInfoCnv_p3_test.ref b/Event/EventTPCnv/share/EventInfoCnv_p3_test.ref
new file mode 100644
index 0000000000000000000000000000000000000000..a5bce3fd2565d8f458555a0c6f42d0504a848bd5
--- /dev/null
+++ b/Event/EventTPCnv/share/EventInfoCnv_p3_test.ref
@@ -0,0 +1 @@
+test1
diff --git a/Event/EventTPCnv/share/EventInfoCnv_p4_test.ref b/Event/EventTPCnv/share/EventInfoCnv_p4_test.ref
new file mode 100644
index 0000000000000000000000000000000000000000..a5bce3fd2565d8f458555a0c6f42d0504a848bd5
--- /dev/null
+++ b/Event/EventTPCnv/share/EventInfoCnv_p4_test.ref
@@ -0,0 +1 @@
+test1
diff --git a/Event/EventTPCnv/share/EventStreamInfoCnv_p1_test.ref b/Event/EventTPCnv/share/EventStreamInfoCnv_p1_test.ref
new file mode 100644
index 0000000000000000000000000000000000000000..a5bce3fd2565d8f458555a0c6f42d0504a848bd5
--- /dev/null
+++ b/Event/EventTPCnv/share/EventStreamInfoCnv_p1_test.ref
@@ -0,0 +1 @@
+test1
diff --git a/Event/EventTPCnv/share/EventStreamInfoCnv_p2_test.ref b/Event/EventTPCnv/share/EventStreamInfoCnv_p2_test.ref
new file mode 100644
index 0000000000000000000000000000000000000000..a5bce3fd2565d8f458555a0c6f42d0504a848bd5
--- /dev/null
+++ b/Event/EventTPCnv/share/EventStreamInfoCnv_p2_test.ref
@@ -0,0 +1 @@
+test1
diff --git a/Event/EventTPCnv/share/EventStreamInfoCnv_p3_test.ref b/Event/EventTPCnv/share/EventStreamInfoCnv_p3_test.ref
new file mode 100644
index 0000000000000000000000000000000000000000..a5bce3fd2565d8f458555a0c6f42d0504a848bd5
--- /dev/null
+++ b/Event/EventTPCnv/share/EventStreamInfoCnv_p3_test.ref
@@ -0,0 +1 @@
+test1
diff --git a/Event/EventTPCnv/share/EventTypeCnv_p1_test.ref b/Event/EventTPCnv/share/EventTypeCnv_p1_test.ref
new file mode 100644
index 0000000000000000000000000000000000000000..a5bce3fd2565d8f458555a0c6f42d0504a848bd5
--- /dev/null
+++ b/Event/EventTPCnv/share/EventTypeCnv_p1_test.ref
@@ -0,0 +1 @@
+test1
diff --git a/Event/EventTPCnv/share/EventTypeCnv_p2_test.ref b/Event/EventTPCnv/share/EventTypeCnv_p2_test.ref
new file mode 100644
index 0000000000000000000000000000000000000000..a5bce3fd2565d8f458555a0c6f42d0504a848bd5
--- /dev/null
+++ b/Event/EventTPCnv/share/EventTypeCnv_p2_test.ref
@@ -0,0 +1 @@
+test1
diff --git a/Event/EventTPCnv/share/EventTypeCnv_p3_test.ref b/Event/EventTPCnv/share/EventTypeCnv_p3_test.ref
new file mode 100644
index 0000000000000000000000000000000000000000..a5bce3fd2565d8f458555a0c6f42d0504a848bd5
--- /dev/null
+++ b/Event/EventTPCnv/share/EventTypeCnv_p3_test.ref
@@ -0,0 +1 @@
+test1
diff --git a/Event/EventTPCnv/share/MergedEventInfoCnv_p1_test.ref b/Event/EventTPCnv/share/MergedEventInfoCnv_p1_test.ref
new file mode 100644
index 0000000000000000000000000000000000000000..a5bce3fd2565d8f458555a0c6f42d0504a848bd5
--- /dev/null
+++ b/Event/EventTPCnv/share/MergedEventInfoCnv_p1_test.ref
@@ -0,0 +1 @@
+test1
diff --git a/Event/EventTPCnv/share/MergedEventInfoCnv_p2_test.ref b/Event/EventTPCnv/share/MergedEventInfoCnv_p2_test.ref
new file mode 100644
index 0000000000000000000000000000000000000000..a5bce3fd2565d8f458555a0c6f42d0504a848bd5
--- /dev/null
+++ b/Event/EventTPCnv/share/MergedEventInfoCnv_p2_test.ref
@@ -0,0 +1 @@
+test1
diff --git a/Event/EventTPCnv/share/PileUpEventInfoCnv_p1_test.ref b/Event/EventTPCnv/share/PileUpEventInfoCnv_p1_test.ref
new file mode 100644
index 0000000000000000000000000000000000000000..a5bce3fd2565d8f458555a0c6f42d0504a848bd5
--- /dev/null
+++ b/Event/EventTPCnv/share/PileUpEventInfoCnv_p1_test.ref
@@ -0,0 +1 @@
+test1
diff --git a/Event/EventTPCnv/share/PileUpEventInfoCnv_p2_test.ref b/Event/EventTPCnv/share/PileUpEventInfoCnv_p2_test.ref
new file mode 100644
index 0000000000000000000000000000000000000000..a5bce3fd2565d8f458555a0c6f42d0504a848bd5
--- /dev/null
+++ b/Event/EventTPCnv/share/PileUpEventInfoCnv_p2_test.ref
@@ -0,0 +1 @@
+test1
diff --git a/Event/EventTPCnv/share/PileUpEventInfoCnv_p3_test.ref b/Event/EventTPCnv/share/PileUpEventInfoCnv_p3_test.ref
new file mode 100644
index 0000000000000000000000000000000000000000..a5bce3fd2565d8f458555a0c6f42d0504a848bd5
--- /dev/null
+++ b/Event/EventTPCnv/share/PileUpEventInfoCnv_p3_test.ref
@@ -0,0 +1 @@
+test1
diff --git a/Event/EventTPCnv/share/PileUpEventInfoCnv_p4_test.ref b/Event/EventTPCnv/share/PileUpEventInfoCnv_p4_test.ref
new file mode 100644
index 0000000000000000000000000000000000000000..a5bce3fd2565d8f458555a0c6f42d0504a848bd5
--- /dev/null
+++ b/Event/EventTPCnv/share/PileUpEventInfoCnv_p4_test.ref
@@ -0,0 +1 @@
+test1
diff --git a/Event/EventTPCnv/share/PileUpEventInfoCnv_p5_test.ref b/Event/EventTPCnv/share/PileUpEventInfoCnv_p5_test.ref
new file mode 100644
index 0000000000000000000000000000000000000000..a5bce3fd2565d8f458555a0c6f42d0504a848bd5
--- /dev/null
+++ b/Event/EventTPCnv/share/PileUpEventInfoCnv_p5_test.ref
@@ -0,0 +1 @@
+test1
diff --git a/Event/EventTPCnv/share/TriggerInfoCnv_p1_test.ref b/Event/EventTPCnv/share/TriggerInfoCnv_p1_test.ref
new file mode 100644
index 0000000000000000000000000000000000000000..a5bce3fd2565d8f458555a0c6f42d0504a848bd5
--- /dev/null
+++ b/Event/EventTPCnv/share/TriggerInfoCnv_p1_test.ref
@@ -0,0 +1 @@
+test1
diff --git a/Event/EventTPCnv/share/TriggerInfoCnv_p2_test.ref b/Event/EventTPCnv/share/TriggerInfoCnv_p2_test.ref
new file mode 100644
index 0000000000000000000000000000000000000000..a5bce3fd2565d8f458555a0c6f42d0504a848bd5
--- /dev/null
+++ b/Event/EventTPCnv/share/TriggerInfoCnv_p2_test.ref
@@ -0,0 +1 @@
+test1
diff --git a/Event/EventTPCnv/share/TriggerInfoCnv_p3_test.ref b/Event/EventTPCnv/share/TriggerInfoCnv_p3_test.ref
new file mode 100644
index 0000000000000000000000000000000000000000..a5bce3fd2565d8f458555a0c6f42d0504a848bd5
--- /dev/null
+++ b/Event/EventTPCnv/share/TriggerInfoCnv_p3_test.ref
@@ -0,0 +1 @@
+test1
diff --git a/Event/EventTPCnv/src/AtlasMcWeight.cxx b/Event/EventTPCnv/src/AtlasMcWeight.cxx
index a528ec825bd1e47619d9b618b86b52340aa39270..cce71009bbb89cfb1d9ffa08822b368797b23921 100644
--- a/Event/EventTPCnv/src/AtlasMcWeight.cxx
+++ b/Event/EventTPCnv/src/AtlasMcWeight.cxx
@@ -7,7 +7,7 @@
  *
  * @author Paolo Calafiura <pcalafiura@lbl.gov>, Borut Kersevan <borut.kersevan@cern.ch>
  *
- * $Id: AtlasMcWeight.cxx 566179 2013-10-20 09:27:11Z schaffer $
+ * $Id: AtlasMcWeight.cxx 764382 2016-07-26 15:37:04Z ssnyder $
  */
 #include <iostream>
 #include <limits>
@@ -15,6 +15,8 @@
 #include <cmath>
 
 #include "EventTPCnv/AtlasMcWeight.h"
+#include "GaudiKernel/StatusCode.h"
+#include "GaudiKernel/GaudiException.h"
 
 /* #define AMC_DEBUG 1 */
 
@@ -58,3 +60,32 @@ AtlasMcWeight::decode(number_type binnedWeight) {
     return wt_decode;
 } 
 
+
+AtlasMcWeight::number_type
+AtlasMcWeight::encode(double weight) { 
+    int exponent = int(floor(log10(fabs(weight)))+1);
+    if ( abs(exponent) > 9 ) { 
+        throw GaudiException( "The MC weight abs value is bigger than 1E9,encoding failed","AtlasMcWeight", StatusCode::FAILURE ); 
+    }
+
+    number_type wt_prec = int(fabs(weight)*pow(10,(NPLACES-1-exponent)));
+    number_type wt_exp = abs(exponent);
+    int d_sign = ( weight > 0. ? 0 : 1 );
+    int e_sign = ( exponent > 0. ? 0 : 1 );
+    number_type wt_pref = d_sign+2*e_sign;
+
+    char senc[12];
+    snprintf(senc,12,"%d%d%d",wt_pref, wt_exp, wt_prec);
+    number_type wt_encode=atoll(senc);
+
+#ifdef AMC_DEBUG
+    std::cout << " AtlasMcWeight::encode weight = " << weight << std::endl;
+    printf("encode parts =%d %d %d \n", wt_pref, wt_exp, wt_prec);
+    printf("encoded string=%s \n", senc);
+    std::cout << " weight=" << weight << std::endl;
+    std::cout << " str weight=" << senc << std::endl;
+    std::cout << " exp weight=" << atoll(senc) << std::endl;
+    std::cout << " encoded weight=" << wt_encode << std::endl;
+#endif
+    return wt_encode;
+} 
diff --git a/Event/EventTPCnv/src/EventIDCnv_p1.cxx b/Event/EventTPCnv/src/EventIDCnv_p1.cxx
index 855aa41f489e77d4fdb08dd85fd5c4a046689665..af2f2b20feeeaa3e2f1f0ea2838bd53af30b3670 100644
--- a/Event/EventTPCnv/src/EventIDCnv_p1.cxx
+++ b/Event/EventTPCnv/src/EventIDCnv_p1.cxx
@@ -2,37 +2,58 @@
   Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
 */
 
-#define private public
-#define protected public
 #include "EventInfo/EventID.h"
-#undef private
-#undef protected
-
 #include "EventTPCnv/EventIDCnv_p1.h"
+#include "CxxUtils/make_unique.h"
+
+void EventIDCnv_p1::transToPers(const EventID* trans, EventID_p1* pers, MsgStream &log)
+{
+  const EventIDCnv_p1* cthis = this;
+  cthis->transToPers (trans, pers, log);
+}
+
+void EventIDCnv_p1::transToPers(const EventID* trans, EventID_p1* pers, MsgStream &) const {
+   pers->m_run_number            = trans->run_number();
+   pers->m_event_number          = trans->event_number();
+   pers->m_time_stamp            = trans->time_stamp();
+   pers->m_time_stamp_ns_offset  = trans->time_stamp_ns_offset(); 
+   pers->m_lumiBlock             = trans->lumi_block();
+   pers->m_bunch_crossing_id     = trans->bunch_crossing_id();
+   pers->m_detector_mask0        = trans->detector_mask0();
+   pers->m_detector_mask1        = trans->detector_mask1();
+   pers->m_detector_mask2        = trans->detector_mask2();
+   pers->m_detector_mask3        = trans->detector_mask3();
+}
+
+void EventIDCnv_p1::persToTrans(const EventID_p1* pers, EventID* trans, MsgStream &log)
+{
+  const EventIDCnv_p1* cthis = this;
+  cthis->persToTrans (pers, trans, log);
+}
+
+void EventIDCnv_p1::persToTrans(const EventID_p1* pers, EventID* trans, MsgStream &) const {
+   trans->set_run_number           (pers->m_run_number);
+   trans->set_event_number         (pers->m_event_number);
+   trans->set_time_stamp           (pers->m_time_stamp);
+   trans->set_time_stamp_ns_offset (pers->m_time_stamp_ns_offset);
+   trans->set_lumi_block           (pers->m_lumiBlock);
+   trans->set_bunch_crossing_id    (pers->m_bunch_crossing_id);
+   trans->set_detector_mask        (pers->m_detector_mask0,
+                                    pers->m_detector_mask1,
+                                    pers->m_detector_mask2,
+                                    pers->m_detector_mask3);
+}
 
-void EventIDCnv_p1::transToPers(const EventID* trans, EventID_p1* pers, MsgStream &) {
-   pers->m_run_number            = trans->m_run_number;
-   pers->m_event_number          = trans->m_event_number;
-   pers->m_time_stamp            = trans->m_time_stamp;
-   pers->m_time_stamp_ns_offset  = trans->m_time_stamp_ns_offset; 
-   pers->m_lumiBlock             = trans->m_lumiBlock;
-   pers->m_bunch_crossing_id     = trans->m_bunch_crossing_id;
-   pers->m_detector_mask0        = trans->m_detector_mask0;
-   pers->m_detector_mask1        = trans->m_detector_mask1;
-   pers->m_detector_mask2        = trans->m_detector_mask2;
-   pers->m_detector_mask3        = trans->m_detector_mask3;
+EventID* EventIDCnv_p1::createTransient (const EventID_p1* persObj, MsgStream& log)
+{
+  const EventIDCnv_p1* cthis = this;
+  return cthis->createTransient (persObj, log);
 }
 
-void EventIDCnv_p1::persToTrans(const EventID_p1* pers, EventID* trans, MsgStream &) {
-   trans->m_run_number           = pers->m_run_number;
-   trans->m_event_number         = pers->m_event_number;
-   trans->m_time_stamp           = pers->m_time_stamp;
-   trans->m_time_stamp_ns_offset = pers->m_time_stamp_ns_offset; 
-   trans->m_lumiBlock            = pers->m_lumiBlock;
-   trans->m_bunch_crossing_id    = pers->m_bunch_crossing_id;
-   trans->m_detector_mask0       = pers->m_detector_mask0;
-   trans->m_detector_mask1       = pers->m_detector_mask1;
-   trans->m_detector_mask2       = pers->m_detector_mask2;
-   trans->m_detector_mask3       = pers->m_detector_mask3;
+EventID* EventIDCnv_p1::createTransient (const EventID_p1* persObj, MsgStream& log) const
+{
+  auto trans = CxxUtils::make_unique<EventID>();
+  persToTrans(persObj, trans.get(), log);
+  return(trans.release());
 }
 
diff --git a/Event/EventTPCnv/src/EventIDCnv_p2.cxx b/Event/EventTPCnv/src/EventIDCnv_p2.cxx
index 0cc27a1cfbca49c2ffeb2575134b91e62003da24..4937f16b769dce8da771f1f7a8dc3444a5b47dbd 100644
--- a/Event/EventTPCnv/src/EventIDCnv_p2.cxx
+++ b/Event/EventTPCnv/src/EventIDCnv_p2.cxx
@@ -2,37 +2,33 @@
   Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
 */
 
-#define private public
-#define protected public
 #include "EventInfo/EventID.h"
-#undef private
-#undef protected
-
 #include "EventTPCnv/EventIDCnv_p2.h"
 
 
-void EventIDCnv_p2::persToTrans(std::vector<unsigned int>::const_iterator &i, EventID* trans) {
-    trans->m_run_number           = (*i); ++i;
-    trans->m_event_number         = (*i); ++i;
-    trans->m_time_stamp           = (*i); ++i;
-    trans->m_time_stamp_ns_offset = (*i); ++i; 
-    trans->m_lumiBlock            = (*i); ++i;
-    trans->m_bunch_crossing_id    = (*i); ++i;
-    trans->m_detector_mask0       = (*i); ++i;
-    trans->m_detector_mask1       = (*i); ++i;
+void EventIDCnv_p2::persToTrans(std::vector<unsigned int>::const_iterator &i, EventID* trans) const {
+    trans->set_run_number           (*i); ++i;
+    trans->set_event_number         (*i); ++i;
+    trans->set_time_stamp           (*i); ++i;
+    trans->set_time_stamp_ns_offset (*i); ++i; 
+    trans->set_lumi_block           (*i); ++i;
+    trans->set_bunch_crossing_id    (*i); ++i;
+    EventID::number_type detector_mask0       = (*i); ++i;
+    EventID::number_type detector_mask1       = (*i); ++i;
+    trans->set_detector_mask (detector_mask0, detector_mask1);
     // std::cout<<"persToTrans of EventID \t"<<trans->m_event_number<<std::endl;
 }
 
-void EventIDCnv_p2::transToPers(const EventID* /*trans*/, std::vector<unsigned int>& /*pers*/) {
+void EventIDCnv_p2::transToPers(const EventID* trans, std::vector<unsigned int>& pers) const {
     // Deprecated - writing out with _p1 RDS 2013/03
 
-    // pers.push_back(trans->m_run_number);
-    // pers.push_back(trans->m_event_number);
-    // pers.push_back(trans->m_time_stamp);
-    // pers.push_back(trans->m_time_stamp_ns_offset); 
-    // pers.push_back(trans->m_lumiBlock);
-    // pers.push_back(trans->m_bunch_crossing_id);
-    // pers.push_back(trans->m_detector_mask0);
-    // pers.push_back(trans->m_detector_mask1);
-    // // std::cout<<"transToPers of EventID \t"<<trans->m_event_number<<std::endl;
+    pers.push_back(trans->run_number());
+    pers.push_back(trans->event_number());
+    pers.push_back(trans->time_stamp());
+    pers.push_back(trans->time_stamp_ns_offset()); 
+    pers.push_back(trans->lumi_block());
+    pers.push_back(trans->bunch_crossing_id());
+    pers.push_back(trans->detector_mask0());
+    pers.push_back(trans->detector_mask1());
+    // std::cout<<"transToPers of EventID \t"<<trans->m_event_number<<std::endl;
 }
diff --git a/Event/EventTPCnv/src/EventInfoCnv_p1.cxx b/Event/EventTPCnv/src/EventInfoCnv_p1.cxx
index 2f18dd229d314191fd2b231ca77471718070d259..2fc8b16195bc7d376bcc865d19621fd5204ae85e 100644
--- a/Event/EventTPCnv/src/EventInfoCnv_p1.cxx
+++ b/Event/EventTPCnv/src/EventInfoCnv_p1.cxx
@@ -2,13 +2,8 @@
   Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
 */
 
-#define private public
-#define protected public
 #include "EventInfo/EventInfo.h"
 #include "EventInfo/EventType.h"
-#undef private
-#undef protected
-
 #include "EventInfo/EventID.h"
 #include "EventInfo/TriggerInfo.h"
 
@@ -18,51 +13,67 @@
 #include "EventTPCnv/TriggerInfoCnv_p1.h"
 #include <math.h>
 
-static	EventIDCnv_p1		idConv;
-static	EventTypeCnv_p1		typeConv;
-static	TriggerInfoCnv_p1	trigInfoCnv;
+static const EventIDCnv_p1		idConv;
+static const EventTypeCnv_p1		typeConv;
+static const TriggerInfoCnv_p1	trigInfoCnv;
+
 
+void EventInfoCnv_p1::transToPers(const EventInfo* trans, EventInfo_p1* pers, MsgStream &log)
+{
+  const EventInfoCnv_p1* cthis = this;
+  cthis->transToPers (trans, pers, log);
+}
 
-void EventInfoCnv_p1::transToPers(const EventInfo* trans, EventInfo_p1* pers, MsgStream &log) {
-    idConv.transToPers(trans->m_event_ID, &pers->m_event_ID, log);
-    typeConv.transToPers(trans->m_event_type, &pers->m_event_type, log);
-    if( trans->m_trigger_info ) {
-        pers->m_trigger_info = trigInfoCnv.createPersistent(trans->m_trigger_info, log);
+void EventInfoCnv_p1::transToPers(const EventInfo* trans, EventInfo_p1* pers, MsgStream &log) const {
+    idConv.transToPers(trans->event_ID(), &pers->m_event_ID, log);
+    typeConv.transToPers(trans->event_type(), &pers->m_event_type, log);
+    if( trans->trigger_info() ) {
+      pers->m_trigger_info = trigInfoCnv.createPersistent(trans->trigger_info(), log);
     }
 }
 
-void EventInfoCnv_p1::persToTrans(const EventInfo_p1* pers, EventInfo* trans, MsgStream &log)  {
-    delete trans->m_event_ID;
-    trans->m_event_ID = idConv.createTransient(&pers->m_event_ID, log);
-    delete trans->m_event_type;
-    trans->m_event_type = typeConv.createTransient(&pers->m_event_type, log);
+void EventInfoCnv_p1::persToTrans(const EventInfo_p1* pers, EventInfo* trans, MsgStream &log)
+{
+  const EventInfoCnv_p1* cthis = this;
+  cthis->persToTrans (pers, trans, log);
+}
+
+void EventInfoCnv_p1::persToTrans(const EventInfo_p1* pers, EventInfo* trans, MsgStream &log) const {
+    trans->setEventID (idConv.createTransient(&pers->m_event_ID, log));
+    EventType* event_type = typeConv.createTransient(&pers->m_event_type, log);
     if( pers->m_trigger_info) {
-        delete trans->m_trigger_info;
-        trans->m_trigger_info = trigInfoCnv.createTransient(pers->m_trigger_info, log);
+        trans->setTriggerInfo (trigInfoCnv.createTransient(pers->m_trigger_info, log));
 
         // Fill MC event weight in transient EventType from persistent
         // TriggerInfo. This is only needed for MC events: if the
         // weight is zero, and TriggerInfo exists - was stored at end
         // of eventFilterInfo
 
-        static double MIN_WEIGHT = -1.0e+6;
-        static double MAX_WEIGHT = +1.0e+6;
-        static double BIN_WIDTH( (MAX_WEIGHT - MIN_WEIGHT) / 
+        static const double MIN_WEIGHT = -1.0e+6;
+        static const double MAX_WEIGHT = +1.0e+6;
+        static const double BIN_WIDTH( (MAX_WEIGHT - MIN_WEIGHT) / 
                                  std::numeric_limits<unsigned int>::max() );
-        if (trans->m_event_type->mc_event_weight() == 0 && 
-            trans->m_trigger_info->eventFilterInfo().size()) {
-            double weight = (MIN_WEIGHT + BIN_WIDTH * (double(trans->m_trigger_info->eventFilterInfo().back()) + 0.5));
+        if (event_type->mc_event_weight() == 0 && 
+            trans->trigger_info()->eventFilterInfo().size()) {
+            double weight = (MIN_WEIGHT + BIN_WIDTH * (double(trans->trigger_info()->eventFilterInfo().back()) + 0.5));
             if (fabs(weight - 0.999775) < 0.0001) weight = 1.0;
             else if (fabs(weight + 0.999775) < 0.0001 ) weight = -1.0;
-            trans->m_event_type->set_mc_event_weight(weight);
+            event_type->set_mc_event_weight(weight);
             //trans->m_event_type->m_mc_event_weight = trans->m_trigger_info->eventFilterInfo().back();
         }
     }
+    trans->setEventType (event_type);
 }
 
 // work around the default constructor of EventInfo allocating memory
-EventInfo* EventInfoCnv_p1::createTransient( const EventInfo_p1* persObj, MsgStream &log) {
-    std::auto_ptr<EventInfo> trans( new EventInfo(0,0,0) );
+EventInfo* EventInfoCnv_p1::createTransient( const EventInfo_p1* persObj, MsgStream &log)
+{
+  const EventInfoCnv_p1* cthis = this;
+  return cthis->createTransient (persObj, log);
+}
+
+EventInfo* EventInfoCnv_p1::createTransient( const EventInfo_p1* persObj, MsgStream &log) const {
+    std::unique_ptr<EventInfo> trans( new EventInfo(0,0,0) );
     persToTrans(persObj, trans.get(), log);
     return(trans.release());
 }
diff --git a/Event/EventTPCnv/src/EventInfoCnv_p2.cxx b/Event/EventTPCnv/src/EventInfoCnv_p2.cxx
index 4ac15b6189894a264d9a43b3881269fc965da46a..1867250544c296b3e799d3c38e0fa74b810ab2bc 100644
--- a/Event/EventTPCnv/src/EventInfoCnv_p2.cxx
+++ b/Event/EventTPCnv/src/EventInfoCnv_p2.cxx
@@ -2,12 +2,7 @@
   Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
 */
 
-#define private public
-#define protected public
 #include "EventInfo/EventInfo.h"
-#undef private
-#undef protected
-
 #include "EventInfo/EventID.h"
 #include "EventInfo/EventType.h"
 #include "EventInfo/TriggerInfo.h"
@@ -18,40 +13,56 @@
 #include "EventTPCnv/TriggerInfoCnv_p2.h"
 
 
-static	EventIDCnv_p1		idConv;
-static	EventTypeCnv_p1		typeConv;
-static	TriggerInfoCnv_p2	trigInfoCnv;
+static const EventIDCnv_p1		idConv;
+static const EventTypeCnv_p1		typeConv;
+static const TriggerInfoCnv_p2	trigInfoCnv;
+
 
+void EventInfoCnv_p2::transToPers(const EventInfo* trans, EventInfo_p2* pers, MsgStream &log)
+{
+  const EventInfoCnv_p2* cthis = this;
+  cthis->transToPers (trans, pers, log);
+}
 
-void EventInfoCnv_p2::transToPers(const EventInfo* trans, EventInfo_p2* pers, MsgStream &log) {
-    idConv.transToPers(trans->m_event_ID, &pers->m_event_ID, log);
-    typeConv.transToPers(trans->m_event_type, &pers->m_event_type, log);
-    if( trans->m_trigger_info ) {
-        trigInfoCnv.transToPers(trans->m_trigger_info, &pers->m_trigger_info, log);
+void EventInfoCnv_p2::transToPers(const EventInfo* trans, EventInfo_p2* pers, MsgStream &log) const {
+    idConv.transToPers(trans->event_ID(), &pers->m_event_ID, log);
+    typeConv.transToPers(trans->event_type(), &pers->m_event_type, log);
+    if( trans->trigger_info() ) {
+      trigInfoCnv.transToPers(trans->trigger_info(), &pers->m_trigger_info, log);
     }
     // Don't write out event flags if they are all == 0
-    if (trans->m_event_flags.size()) {
+    const std::vector<unsigned int>& event_flags = trans->eventFlags();
+    if (event_flags.size()) {
         bool copy = false;
-        for (unsigned int i = 0; i < trans->m_event_flags.size(); ++i) {
-            if (trans->m_event_flags[1]) { copy = true; break; }
+        for (unsigned int i = 0; i < event_flags.size(); ++i) {
+          if (event_flags[i]) { copy = true; break; }
         }
-        if (copy) pers->m_event_flags = trans->m_event_flags;
+        if (copy) pers->m_event_flags = event_flags;
     }
 }
 
-void EventInfoCnv_p2::persToTrans(const EventInfo_p2* pers, EventInfo* trans, MsgStream &log)  {
-    delete trans->m_event_ID;
-    trans->m_event_ID     = idConv.createTransient(&pers->m_event_ID, log);
-    delete trans->m_event_type;
-    trans->m_event_type   = typeConv.createTransient(&pers->m_event_type, log);
-    delete trans->m_trigger_info;
-    trans->m_trigger_info = trigInfoCnv.createTransient(&pers->m_trigger_info, log);
+void EventInfoCnv_p2::persToTrans(const EventInfo_p2* pers, EventInfo* trans, MsgStream &log)
+{
+  const EventInfoCnv_p2* cthis = this;
+  cthis->persToTrans (pers, trans, log);
+}
+
+void EventInfoCnv_p2::persToTrans(const EventInfo_p2* pers, EventInfo* trans, MsgStream &log)  const {
+    trans->setEventID (idConv.createTransient(&pers->m_event_ID, log));
+    trans->setEventType (typeConv.createTransient(&pers->m_event_type, log));
+    trans->setTriggerInfo (trigInfoCnv.createTransient(&pers->m_trigger_info, log));
     if (pers->m_event_flags.size()) trans->m_event_flags = pers->m_event_flags;
 }
 
 // work around the default constructor of EventInfo allocating memory
-EventInfo* EventInfoCnv_p2::createTransient( const EventInfo_p2* persObj, MsgStream &log) {
-    std::auto_ptr<EventInfo> trans( new EventInfo(0,0,0) );
+EventInfo* EventInfoCnv_p2::createTransient( const EventInfo_p2* persObj, MsgStream &log)
+{
+  const EventInfoCnv_p2* cthis = this;
+  return cthis->createTransient (persObj, log);
+}
+
+EventInfo* EventInfoCnv_p2::createTransient( const EventInfo_p2* persObj, MsgStream &log) const {
+    std::unique_ptr<EventInfo> trans( new EventInfo(0,0,0) );
     persToTrans(persObj, trans.get(), log);
     return(trans.release());
 }
diff --git a/Event/EventTPCnv/src/EventInfoCnv_p3.cxx b/Event/EventTPCnv/src/EventInfoCnv_p3.cxx
index c72818ff4d152346f6ba0033cbde9ff64d37a07e..4670b25d0278048885654451d2af08a7eb79fd18 100644
--- a/Event/EventTPCnv/src/EventInfoCnv_p3.cxx
+++ b/Event/EventTPCnv/src/EventInfoCnv_p3.cxx
@@ -2,12 +2,7 @@
   Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
 */
 
-#define private public
-#define protected public
 #include "EventInfo/EventInfo.h"
-#undef private
-#undef protected
-
 #include "EventInfo/EventID.h"
 #include "EventInfo/EventType.h"
 #include "EventInfo/TriggerInfo.h"
@@ -17,12 +12,19 @@
 #include "EventTPCnv/EventTypeCnv_p2.h"
 #include "EventTPCnv/TriggerInfoCnv_p3.h"
 
-static	EventIDCnv_p2		idConv;
-static	EventTypeCnv_p2		typeConv;
-static	TriggerInfoCnv_p3	trigInfoCnv;
+static const EventIDCnv_p2		idConv;
+static const EventTypeCnv_p2		typeConv;
+static const TriggerInfoCnv_p3	trigInfoCnv;
+
 
+void EventInfoCnv_p3::persToTrans(const EventInfo_p3* pers, EventInfo* trans, MsgStream &log)
+{
+  const EventInfoCnv_p3* cthis = this;
+  return cthis->persToTrans (pers, trans, log);
+}
 
-void EventInfoCnv_p3::persToTrans(const EventInfo_p3* pers, EventInfo* trans, MsgStream &/* log */)  {
+void EventInfoCnv_p3::persToTrans(const EventInfo_p3* pers, EventInfo* trans, MsgStream &/* log */) const {
+    *trans = EventInfo();
     std::vector<unsigned int>::const_iterator i= pers->m_AllTheData.begin();
 	
     int vers = (*i); i++;
@@ -30,11 +32,18 @@ void EventInfoCnv_p3::persToTrans(const EventInfo_p3* pers, EventInfo* trans, Ms
 
     bool bugcompat = (vers&(1<<24)) == 0;
 
-    idConv.persToTrans (i, trans->m_event_ID);
-    typeConv.persToTrans(i, trans->m_event_type, (vers>>6)&0x003f, bugcompat );
+    EventID *t = new EventID();
+    idConv.persToTrans(i, t);
+    trans->setEventID (t);
+	
+    EventType *et = new EventType();
+    typeConv.persToTrans(i, et, (vers>>6)&0x003f, bugcompat );
+    trans->setEventType (et);;
 	
     if ((vers>>12)&0x003f){ // if there is trigger info
-        trigInfoCnv.persToTrans(i, trans->m_trigger_info, bugcompat);
+        TriggerInfo *ti = new TriggerInfo();
+        trigInfoCnv.persToTrans(i, ti, bugcompat);
+        trans->setTriggerInfo (ti);
     }
     else
       *trans->m_trigger_info = TriggerInfo();
@@ -53,7 +62,14 @@ void EventInfoCnv_p3::persToTrans(const EventInfo_p3* pers, EventInfo* trans, Ms
 
 }
 
-void EventInfoCnv_p3::transToPers(const EventInfo* trans, EventInfo_p3* pers, MsgStream &/* log */) {
+void EventInfoCnv_p3::transToPers(const EventInfo* trans, EventInfo_p3* pers, MsgStream &log)
+{
+  const EventInfoCnv_p3* cthis = this;
+  cthis->transToPers (trans, pers, log);
+}
+
+void EventInfoCnv_p3::transToPers(const EventInfo* trans, EventInfo_p3* pers, MsgStream &/* log */) const
+{
 	
     // std::cout<<"transToPers of EventInfo ..."<<std::endl;
     pers->m_AllTheData.reserve(34);
@@ -97,8 +113,14 @@ void EventInfoCnv_p3::transToPers(const EventInfo* trans, EventInfo_p3* pers, Ms
 
 
 // work around the default constructor of EventInfo allocating memory
-EventInfo* EventInfoCnv_p3::createTransient( const EventInfo_p3* persObj, MsgStream &log) {
-    std::auto_ptr<EventInfo> trans( new EventInfo() );
+EventInfo* EventInfoCnv_p3::createTransient( const EventInfo_p3* persObj, MsgStream &log)
+{
+  const EventInfoCnv_p3* cthis = this;
+  return cthis->createTransient (persObj, log);
+}
+
+EventInfo* EventInfoCnv_p3::createTransient( const EventInfo_p3* persObj, MsgStream &log) const {
+    std::unique_ptr<EventInfo> trans( new EventInfo() );
     persToTrans(persObj, trans.get(), log);
     return(trans.release());
 }
diff --git a/Event/EventTPCnv/src/EventInfoCnv_p4.cxx b/Event/EventTPCnv/src/EventInfoCnv_p4.cxx
index 9e59248508ac3403747d13d11aca00c5a41d18f3..4b47b88b751c36e8f8d6b8b2a1224f0858e3f52a 100644
--- a/Event/EventTPCnv/src/EventInfoCnv_p4.cxx
+++ b/Event/EventTPCnv/src/EventInfoCnv_p4.cxx
@@ -2,12 +2,7 @@
   Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
 */
 
-#define private public
-#define protected public
 #include "EventInfo/EventInfo.h"
-#undef private
-#undef protected
-
 #include "EventInfo/EventID.h"
 #include "EventInfo/EventType.h"
 #include "EventInfo/TriggerInfo.h"
@@ -18,12 +13,18 @@
 #include "EventTPCnv/TriggerInfoCnv_p2.h"
 
 
-static	EventIDCnv_p1		idConv;
-static	EventTypeCnv_p3		typeConv;
-static	TriggerInfoCnv_p2	trigInfoCnv;
+static const EventIDCnv_p1		idConv;
+static const EventTypeCnv_p3		typeConv;
+static const TriggerInfoCnv_p2	trigInfoCnv;
+
 
+void EventInfoCnv_p4::transToPers(const EventInfo* trans, EventInfo_p4* pers, MsgStream &log)
+{
+  const EventInfoCnv_p4* cthis = this;
+  cthis->transToPers (trans, pers, log);
+}
 
-void EventInfoCnv_p4::transToPers(const EventInfo* trans, EventInfo_p4* pers, MsgStream &log) {
+void EventInfoCnv_p4::transToPers(const EventInfo* trans, EventInfo_p4* pers, MsgStream &log) const {
     idConv.transToPers(trans->m_event_ID, &pers->m_event_ID, log);
     typeConv.transToPers(trans->m_event_type, &pers->m_event_type, log);
     if( trans->m_trigger_info ) {
@@ -39,7 +40,13 @@ void EventInfoCnv_p4::transToPers(const EventInfo* trans, EventInfo_p4* pers, Ms
     }
 }
 
-void EventInfoCnv_p4::persToTrans(const EventInfo_p4* pers, EventInfo* trans, MsgStream &log)  {
+void EventInfoCnv_p4::persToTrans(const EventInfo_p4* pers, EventInfo* trans, MsgStream &log)
+{
+  const EventInfoCnv_p4* cthis = this;
+  cthis->persToTrans (pers, trans, log);
+}
+
+void EventInfoCnv_p4::persToTrans(const EventInfo_p4* pers, EventInfo* trans, MsgStream &log) const {
     delete trans->m_event_ID;
     trans->m_event_ID     = idConv.createTransient(&pers->m_event_ID, log);
     delete trans->m_event_type;
@@ -50,8 +57,15 @@ void EventInfoCnv_p4::persToTrans(const EventInfo_p4* pers, EventInfo* trans, Ms
 }
 
 // work around the default constructor of EventInfo allocating memory
-EventInfo* EventInfoCnv_p4::createTransient( const EventInfo_p4* persObj, MsgStream &log) {
-    std::auto_ptr<EventInfo> trans( new EventInfo(0,0,0) );
+EventInfo* EventInfoCnv_p4::createTransient( const EventInfo_p4* persObj, MsgStream &log) const {
+    std::unique_ptr<EventInfo> trans( new EventInfo(0,0,0) );
     persToTrans(persObj, trans.get(), log);
     return(trans.release());
 }
+
+EventInfo* EventInfoCnv_p4::createTransient( const EventInfo_p4* persObj, MsgStream &log)
+{
+  const EventInfoCnv_p4* cthis = this;
+  return cthis->createTransient (persObj, log);
+}
+
diff --git a/Event/EventTPCnv/src/EventStreamInfoCnv_p1.cxx b/Event/EventTPCnv/src/EventStreamInfoCnv_p1.cxx
index 48af3f741ae18338fed69a66a99b69ebae3fd010..46501c183e00b46101a847a3a728e44ccedbcbdf 100644
--- a/Event/EventTPCnv/src/EventStreamInfoCnv_p1.cxx
+++ b/Event/EventTPCnv/src/EventStreamInfoCnv_p1.cxx
@@ -8,41 +8,40 @@
  *  $Id: EventStreamInfoCnv_p1.cxx,v 1.4 2009-03-18 17:40:57 gemmeren Exp $
  **/
 
-#define private public
-#define protected public
 #include "EventInfo/EventStreamInfo.h"
-#undef private
-#undef protected
-
 #include "EventInfo/EventType.h"
 
 #include "EventTPCnv/EventStreamInfoCnv_p1.h"
 #include "EventTPCnv/EventTypeCnv_p1.h"
 
-static EventTypeCnv_p1 typeConv;
+static const EventTypeCnv_p1 typeConv;
 
 void EventStreamInfoCnv_p1::persToTrans(const EventStreamInfo_p1* pers, EventStreamInfo* trans, MsgStream &log)  {
-   trans->m_numberOfEvents = pers->m_numberOfEvents;
-   trans->m_runNumbers = pers->m_runNumbers;
-   trans->m_lumiBlockNumbers = pers->m_lumiBlockNumbers;
-   trans->m_processingTags = pers->m_processingTags;
-   trans->m_itemList = pers->m_itemList;
-   trans->m_eventTypes.clear();
+   *trans = EventStreamInfo();
+   trans->addEvent (pers->m_numberOfEvents);
+   for (unsigned int rn : pers->m_runNumbers)
+     trans->insertRunNumber (rn);
+   for (unsigned int lbn : pers->m_lumiBlockNumbers)
+     trans->insertLumiBlockNumber (lbn);
+   for (const std::string& tag : pers->m_processingTags)
+     trans->insertProcessingTag (tag);
+   for (const std::pair<CLID, std::string>& p : pers->m_itemList)
+     trans->insertItemList (p.first, p.second);
    for (const EventType_p1& ptype : pers->m_eventTypes)
    {
       std::unique_ptr<EventType> p (typeConv.createTransient(&ptype, log));
-      trans->m_eventTypes.insert(*p);
+      trans->insertEventType(*p);
    }
 }
 
 void EventStreamInfoCnv_p1::transToPers(const EventStreamInfo* trans, EventStreamInfo_p1* pers, MsgStream &log) {
-   pers->m_numberOfEvents = trans->m_numberOfEvents;
-   pers->m_runNumbers = trans->m_runNumbers;
-   pers->m_lumiBlockNumbers = trans->m_lumiBlockNumbers;
-   pers->m_processingTags = trans->m_processingTags;
-   pers->m_itemList = trans->m_itemList;
+   pers->m_numberOfEvents = trans->getNumberOfEvents();
+   pers->m_runNumbers = trans->getRunNumbers();
+   pers->m_lumiBlockNumbers = trans->getLumiBlockNumbers();
+   pers->m_processingTags = trans->getProcessingTags();
+   pers->m_itemList = trans->getItemList();
    pers->m_eventTypes.clear();
-   for (const EventType& ttype : trans->m_eventTypes)
+   for (const EventType& ttype : trans->getEventTypes())
    {
      EventType_p1 ptype;
      typeConv.transToPers(&ttype, &ptype, log);
diff --git a/Event/EventTPCnv/src/EventStreamInfoCnv_p2.cxx b/Event/EventTPCnv/src/EventStreamInfoCnv_p2.cxx
index ee9e54a6b7c49d5e1b01c52d53cba6ff0bab5348..4bf9b5ceaf1c63d44dd903132d6c428c1f21c8a1 100644
--- a/Event/EventTPCnv/src/EventStreamInfoCnv_p2.cxx
+++ b/Event/EventTPCnv/src/EventStreamInfoCnv_p2.cxx
@@ -8,68 +8,50 @@
  *  $Id: EventStreamInfoCnv_p2.cxx,v 1.1 2009-03-18 17:42:45 gemmeren Exp $
  **/
 
-#define private public
-#define protected public
 #include "EventInfo/EventStreamInfo.h"
-#undef private
-#undef protected
-
 #include "EventInfo/EventType.h"
 
 #include "EventTPCnv/EventStreamInfoCnv_p2.h"
 #include "EventTPCnv/EventTypeCnv_p1.h"
 
-static EventTypeCnv_p1 typeConv;
+static const EventTypeCnv_p1 typeConv;
 
 void EventStreamInfoCnv_p2::persToTrans(const EventStreamInfo_p2* pers, EventStreamInfo* trans, MsgStream &log)  {
-   trans->m_numberOfEvents = pers->m_numberOfEvents;
-
-   trans->m_runNumbers.clear();
-   trans->m_runNumbers.insert (pers->m_runNumbers.begin(),
-                               pers->m_runNumbers.end());
-
-   trans->m_lumiBlockNumbers.clear();
-   trans->m_lumiBlockNumbers.insert (pers->m_lumiBlockNumbers.begin(),
-                                     pers->m_lumiBlockNumbers.end());
-
-   trans->m_processingTags.clear();
-   trans->m_processingTags.insert (pers->m_processingTags.begin(),
-                                   pers->m_processingTags.end());
-
-   trans->m_itemList.clear();
-   trans->m_itemList.insert (pers->m_itemList.begin(),
-                             pers->m_itemList.end());
-
-   trans->m_eventTypes.clear();
-   std::set<EventType>::iterator lastType = trans->m_eventTypes.begin();
-   for (const EventType_p1& ptype : pers->m_eventTypes) {
+   *trans = EventStreamInfo();
+   trans->addEvent (pers->m_numberOfEvents);
+   for (unsigned int rn : pers->m_runNumbers)
+     trans->insertRunNumber (rn);
+   for (unsigned int lbn : pers->m_lumiBlockNumbers)
+     trans->insertLumiBlockNumber (lbn);
+   for (const std::string& tag : pers->m_processingTags)
+     trans->insertProcessingTag (tag);
+   for (const std::pair<CLID, std::string>& p : pers->m_itemList)
+     trans->insertItemList (p.first, p.second);
+   for (const EventType_p1& ptype : pers->m_eventTypes)
+   {
       std::unique_ptr<EventType> p (typeConv.createTransient(&ptype, log));
-      lastType = trans->m_eventTypes.insert(lastType, *p);
+      trans->insertEventType(*p);
    }
 }
 
 void EventStreamInfoCnv_p2::transToPers(const EventStreamInfo* trans, EventStreamInfo_p2* pers, MsgStream &log) {
-   pers->m_numberOfEvents = trans->m_numberOfEvents;
+   pers->m_numberOfEvents = trans->getNumberOfEvents();
 
-   pers->m_runNumbers.reserve(trans->m_runNumbers.size());
-   pers->m_runNumbers.assign (trans->m_runNumbers.begin(),
-                              trans->m_runNumbers.end());
+   pers->m_runNumbers.assign (trans->getRunNumbers().begin(),
+                              trans->getRunNumbers().end());
 
-   pers->m_lumiBlockNumbers.reserve(trans->m_lumiBlockNumbers.size());
-   pers->m_lumiBlockNumbers.assign (trans->m_lumiBlockNumbers.begin(),
-                                    trans->m_lumiBlockNumbers.end());
+   pers->m_lumiBlockNumbers.assign (trans->getLumiBlockNumbers().begin(),
+                                    trans->getLumiBlockNumbers().end());
 
-   pers->m_processingTags.reserve(trans->m_processingTags.size());
-   pers->m_processingTags.assign (trans->m_processingTags.begin(),
-                                  trans->m_processingTags.end());
+   pers->m_processingTags.assign (trans->getProcessingTags().begin(),
+                                  trans->getProcessingTags().end());
 
-   pers->m_itemList.reserve(trans->m_itemList.size());
-   pers->m_itemList.assign (trans->m_itemList.begin(),
-                            trans->m_itemList.end());
+   pers->m_itemList.assign (trans->getItemList().begin(),
+                            trans->getItemList().end());
 
-   pers->m_eventTypes.reserve(trans->m_eventTypes.size());
+   pers->m_eventTypes.reserve(trans->getEventTypes().size());
    pers->m_eventTypes.clear();
-   for (const EventType& ttype : trans->m_eventTypes) {
+   for (const EventType& ttype : trans->getEventTypes()) {
       EventType_p1 ptype;
       typeConv.transToPers(&ttype, &ptype, log);
       pers->m_eventTypes.push_back(ptype);
diff --git a/Event/EventTPCnv/src/EventStreamInfoCnv_p3.cxx b/Event/EventTPCnv/src/EventStreamInfoCnv_p3.cxx
index 8b979767a2fdea4aadd0c3d009f90349c57b3895..4113a2f159558f046c99eef68217da6d861c7be1 100644
--- a/Event/EventTPCnv/src/EventStreamInfoCnv_p3.cxx
+++ b/Event/EventTPCnv/src/EventStreamInfoCnv_p3.cxx
@@ -8,68 +8,51 @@
  *  $Id: EventStreamInfoCnv_p3.cxx,v 1.1 2009-03-18 17:42:45 gemmeren Exp $
  **/
 
-#define private public
-#define protected public
 #include "EventInfo/EventStreamInfo.h"
-#undef private
-#undef protected
-
 #include "EventInfo/EventType.h"
 
 #include "EventTPCnv/EventStreamInfoCnv_p3.h"
 #include "EventTPCnv/EventTypeCnv_p3.h"
 
-static EventTypeCnv_p3 typeConv;
+static const EventTypeCnv_p3 typeConv;
 
 void EventStreamInfoCnv_p3::persToTrans(const EventStreamInfo_p3* pers, EventStreamInfo* trans, MsgStream &log)  {
-   trans->m_numberOfEvents = pers->m_numberOfEvents;
-
-   trans->m_runNumbers.clear();
-   trans->m_runNumbers.insert (pers->m_runNumbers.begin(),
-                               pers->m_runNumbers.end());
-
-   trans->m_lumiBlockNumbers.clear();
-   trans->m_lumiBlockNumbers.insert (pers->m_lumiBlockNumbers.begin(),
-                                     pers->m_lumiBlockNumbers.end());
-
-   trans->m_processingTags.clear();
-   trans->m_processingTags.insert (pers->m_processingTags.begin(),
-                                   pers->m_processingTags.end());
-
-   trans->m_itemList.clear();
-   trans->m_itemList.insert (pers->m_itemList.begin(),
-                             pers->m_itemList.end());
-
-   trans->m_eventTypes.clear();
-   std::set<EventType>::iterator lastType = trans->m_eventTypes.begin();
-   for (const EventType_p3& ptype : pers->m_eventTypes) {
+   *trans = EventStreamInfo();
+   trans->addEvent (pers->m_numberOfEvents);
+
+   for (unsigned int rn : pers->m_runNumbers)
+     trans->insertRunNumber (rn);
+   for (unsigned int lbn : pers->m_lumiBlockNumbers)
+     trans->insertLumiBlockNumber (lbn);
+   for (const std::string& tag : pers->m_processingTags)
+     trans->insertProcessingTag (tag);
+   for (const std::pair<CLID, std::string>& p : pers->m_itemList)
+     trans->insertItemList (p.first, p.second);
+   for (const EventType_p3& ptype : pers->m_eventTypes)
+   {
       std::unique_ptr<EventType> p (typeConv.createTransient(&ptype, log));
-      lastType = trans->m_eventTypes.insert(lastType, *p);
+      trans->insertEventType(*p);
    }
 }
 
 void EventStreamInfoCnv_p3::transToPers(const EventStreamInfo* trans, EventStreamInfo_p3* pers, MsgStream &log) {
-   pers->m_numberOfEvents = trans->m_numberOfEvents;
+   pers->m_numberOfEvents = trans->getNumberOfEvents();
 
-   pers->m_runNumbers.reserve(trans->m_runNumbers.size());
-   pers->m_runNumbers.assign (trans->m_runNumbers.begin(),
-                              trans->m_runNumbers.end());
+   pers->m_runNumbers.assign (trans->getRunNumbers().begin(),
+                              trans->getRunNumbers().end());
 
-   pers->m_lumiBlockNumbers.reserve(trans->m_lumiBlockNumbers.size());
-   pers->m_lumiBlockNumbers.assign (trans->m_lumiBlockNumbers.begin(),
-                                    trans->m_lumiBlockNumbers.end());
+   pers->m_lumiBlockNumbers.assign (trans->getLumiBlockNumbers().begin(),
+                                    trans->getLumiBlockNumbers().end());
 
-   pers->m_processingTags.reserve(trans->m_processingTags.size());
-   pers->m_processingTags.assign (trans->m_processingTags.begin(),
-                                  trans->m_processingTags.end());
+   pers->m_processingTags.assign (trans->getProcessingTags().begin(),
+                                  trans->getProcessingTags().end());
 
-   pers->m_itemList.reserve(trans->m_itemList.size());
-   pers->m_itemList.assign (trans->m_itemList.begin(),
-                            trans->m_itemList.end());
+   pers->m_itemList.assign (trans->getItemList().begin(),
+                            trans->getItemList().end());
 
-   pers->m_eventTypes.reserve(trans->m_eventTypes.size());
+   pers->m_eventTypes.reserve(trans->getEventTypes().size());
    pers->m_eventTypes.clear();
-   for (const EventType& ttype : trans->m_eventTypes) {
+   for (const EventType& ttype : trans->getEventTypes()) {
       EventType_p3 ptype;
       typeConv.transToPers(&ttype, &ptype, log);
       pers->m_eventTypes.push_back(ptype);
diff --git a/Event/EventTPCnv/src/EventTypeCnv_p1.cxx b/Event/EventTPCnv/src/EventTypeCnv_p1.cxx
index 731f54667dbeef49066a71c17966bfc1dbbf6b8c..1e562c26c8e3f5e203ef1200ac2d5d9baccb09f2 100644
--- a/Event/EventTPCnv/src/EventTypeCnv_p1.cxx
+++ b/Event/EventTPCnv/src/EventTypeCnv_p1.cxx
@@ -2,23 +2,52 @@
   Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
 */
 
-#define private public
-#define protected public
 #include "EventInfo/EventType.h"
-#undef private
-#undef protected
-
 #include "EventTPCnv/EventTypeCnv_p1.h"
+#include "CxxUtils/make_unique.h"
+
+void EventTypeCnv_p1::transToPers(const EventType* trans, EventType_p1* pers, MsgStream &log)
+{
+  const EventTypeCnv_p1* cthis = this;
+  cthis->transToPers (trans, pers, log);
+}
 
-void EventTypeCnv_p1::transToPers(const EventType* /*trans*/, EventType_p1* /*pers*/, MsgStream &) {
+
+void EventTypeCnv_p1::transToPers(const EventType* trans, EventType_p1* pers, MsgStream &) const {
     // Deprecated - writing out with _p3 RDS 2013/10
-    // pers->m_user_type           = trans->m_user_type;
-    // pers->m_bit_mask            = trans->m_bit_mask;
-    // pers->m_mc_event_weight     = trans->m_mc_event_weights[0];
+    pers->m_user_type           = trans->user_type_raw();
+    pers->m_bit_mask            = trans->bit_mask();
+    pers->m_mc_event_weight     = 0;
+    if (trans->n_mc_event_weights() > 0)
+      pers->m_mc_event_weight     = trans->mc_event_weight(0);
+}
+
+void EventTypeCnv_p1::persToTrans(const EventType_p1* pers, EventType* trans, MsgStream &log)
+{
+  const EventTypeCnv_p1* cthis = this;
+  cthis->persToTrans (pers, trans, log);
 }
 
-void EventTypeCnv_p1::persToTrans(const EventType_p1* pers, EventType* trans, MsgStream &) {
-    trans->m_user_type           = pers->m_user_type;
-    trans->m_bit_mask            = pers->m_bit_mask;
-    trans->m_mc_event_weights[0] = (float)pers->m_mc_event_weight;
+void EventTypeCnv_p1::persToTrans(const EventType_p1* pers, EventType* trans, MsgStream &) const {
+    *trans = EventType();
+    trans->set_user_type         (pers->m_user_type);
+    for (size_t i = 0; i < pers->m_bit_mask.size(); i++) {
+      if (pers->m_bit_mask[i])
+        trans->add_type (i);
+    }
+    trans->set_mc_event_weight ((float)pers->m_mc_event_weight, 0, 1);
 }
+
+EventType* EventTypeCnv_p1::createTransient (const EventType_p1* persObj, MsgStream& log)
+{
+  const EventTypeCnv_p1* cthis = this;
+  return cthis->createTransient (persObj, log);
+}
+
+EventType* EventTypeCnv_p1::createTransient (const EventType_p1* persObj, MsgStream& log) const
+{
+  auto trans = CxxUtils::make_unique<EventType>();
+  persToTrans(persObj, trans.get(), log);
+  return(trans.release());
+}
+
diff --git a/Event/EventTPCnv/src/EventTypeCnv_p2.cxx b/Event/EventTPCnv/src/EventTypeCnv_p2.cxx
index d38438b1df638cbb1cb2119374a0f035c0ed26b4..bc8f0b79242903a4471b827ae9ffab93440dc619 100644
--- a/Event/EventTPCnv/src/EventTypeCnv_p2.cxx
+++ b/Event/EventTPCnv/src/EventTypeCnv_p2.cxx
@@ -2,40 +2,51 @@
   Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
 */
 
-#define private public
-#define protected public
 #include "EventInfo/EventType.h"
-#undef private
-#undef protected
 #include <iostream>
 #include "EventTPCnv/EventTypeCnv_p2.h"
 #include "EventTPCnv/vectorize.h"
 #include "EventTPCnv/AtlasMcWeight.h"
 
 
-void   EventTypeCnv_p2::persToTrans(std::vector<unsigned int>::const_iterator &i, EventType* trans, int version, bool bugcompat){
+void   EventTypeCnv_p2::persToTrans(std::vector<unsigned int>::const_iterator &i, EventType* trans, int version, bool bugcompat) const{
 	// std::cout<<"persToTrans of EventType ..."<<std::endl;
-        UITostr(trans->m_user_type, i, bugcompat);
-	UITobitmap(trans->m_bit_mask,i, bugcompat);
+        *trans = EventType();
+
+        std::string user_type;
+        UITostr(user_type, i, bugcompat);
+        trans->set_user_type (user_type);
+
+        std::vector<bool> bit_mask;
+	UITobitmap(bit_mask,i, bugcompat);
+        for (size_t ii = 0; ii < bit_mask.size(); ii++) {
+          if (bit_mask[ii])
+            trans->add_type (ii);
+        }
+
         // we now decode here instead of in EventType
-	trans->m_mc_event_weights[0] = (float)AtlasMcWeight::decode((*i)); ++i; 
+        float event_weight = (float)AtlasMcWeight::decode((*i)); ++i; 
+        trans->set_mc_event_weight (event_weight, 0, 1);
 	if(version>2){
-		trans->m_mc_channel_number = (*i); ++i;
-		trans->m_mc_event_number   = (*i); ++i;
+		trans->set_mc_channel_number (*i); ++i;
+		trans->set_mc_event_number   (*i); ++i;
 	}
 	// std::cout<<"persToTrans of EventType  ver: "<<version<<"\t weight:"<<trans->m_mc_event_weight<<std::endl;
 	
 }
 
-void   EventTypeCnv_p2::transToPers(const EventType* /*trans*/, std::vector<unsigned int> &/*pers*/){
+void   EventTypeCnv_p2::transToPers(const EventType* trans, std::vector<unsigned int> &pers) const {
     // Deprecated - writing out with _p3 RDS 2013/03
 
 // 	// std::cout<<"transToPers of EventType ..."<<std::endl;
-// 	strToUI(trans->m_user_type,pers);
-// 	bitmapToUI(trans->m_bit_mask,pers);
-// 	pers.push_back(trans->m_mc_event_weight);
-// 	pers.push_back(trans->m_mc_channel_number);
-// 	pers.push_back(trans->m_mc_event_number);
+        strToUI(trans->user_type_raw(),pers);
+ 	bitmapToUI(trans->bit_mask(),pers);
+        double wt = 0;
+        if (trans->n_mc_event_weights() > 0)
+          wt     = trans->mc_event_weight(0);
+ 	pers.push_back(AtlasMcWeight::encode(wt));
+ 	pers.push_back(trans->mc_channel_number());
+ 	pers.push_back(trans->mc_event_number());
         
 // 	// std::cout<<"transToPers of EventType. weight: "<<trans->m_mc_event_weight<<std::endl;
 }
diff --git a/Event/EventTPCnv/src/EventTypeCnv_p3.cxx b/Event/EventTPCnv/src/EventTypeCnv_p3.cxx
index 45ea52b8af235f666e3123c69fac2b64ffc690bb..81a41b3bdf35a60676868faf20783ea371012d07 100644
--- a/Event/EventTPCnv/src/EventTypeCnv_p3.cxx
+++ b/Event/EventTPCnv/src/EventTypeCnv_p3.cxx
@@ -2,26 +2,63 @@
   Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
 */
 
-#define private public
-#define protected public
 #include "EventInfo/EventType.h"
-#undef private
-#undef protected
-
 #include "EventTPCnv/EventTypeCnv_p3.h"
+#include "CxxUtils/make_unique.h"
+
+void EventTypeCnv_p3::transToPers(const EventType* trans, EventType_p3* pers, MsgStream &log)
+{
+  const EventTypeCnv_p3* cthis = this;
+  cthis->transToPers (trans, pers, log);
+}
+
+void EventTypeCnv_p3::transToPers(const EventType* trans, EventType_p3* pers, MsgStream &) const {
+   pers->m_bit_mask          = trans->bit_mask();
+   pers->m_user_type         = trans->user_type_raw();
+
+   {
+     unsigned int nwt = trans->n_mc_event_weights();
+     pers->m_mc_event_weights.resize (nwt);
+     for (unsigned int i=0; i < nwt; i++)
+       pers->m_mc_event_weights[i]  = trans->mc_event_weight(i);
+   }
+   pers->m_mc_channel_number = trans->mc_channel_number();
+   pers->m_mc_event_number   = trans->mc_event_number();
+}
+
+void EventTypeCnv_p3::persToTrans(const EventType_p3* pers, EventType* trans, MsgStream &log)
+{
+  const EventTypeCnv_p3* cthis = this;
+  cthis->persToTrans (pers, trans, log);
+}
+
+void EventTypeCnv_p3::persToTrans(const EventType_p3* pers, EventType* trans, MsgStream &) const {
+   *trans = EventType();
+
+    for (size_t i = 0; i < pers->m_bit_mask.size(); i++) {
+      if (pers->m_bit_mask[i])
+        trans->add_type (i);
+    }
+
+    size_t nwt = pers->m_mc_event_weights.size();
+    for (size_t i = 0; i < nwt; i++) {
+      trans->set_mc_event_weight (pers->m_mc_event_weights[i], i, nwt);
+    }
+
+    trans->set_user_type         (pers->m_user_type);
+    trans->set_mc_channel_number (pers->m_mc_channel_number);
+    trans->set_mc_event_number   (pers->m_mc_event_number);
+}
 
-void EventTypeCnv_p3::transToPers(const EventType* trans, EventType_p3* pers, MsgStream &) {
-   pers->m_bit_mask          = trans->m_bit_mask;
-   pers->m_user_type         = trans->m_user_type;
-   pers->m_mc_event_weights  = trans->m_mc_event_weights;
-   pers->m_mc_channel_number = trans->m_mc_channel_number;
-   pers->m_mc_event_number   = trans->m_mc_event_number;
+EventType* EventTypeCnv_p3::createTransient (const EventType_p3* persObj, MsgStream& log)
+{
+  const EventTypeCnv_p3* cthis = this;
+  return cthis->createTransient (persObj, log);
 }
 
-void EventTypeCnv_p3::persToTrans(const EventType_p3* pers, EventType* trans, MsgStream &) {
-   trans->m_bit_mask          = pers->m_bit_mask;
-   trans->m_user_type         = pers->m_user_type;
-   trans->m_mc_event_weights  = pers->m_mc_event_weights;
-   trans->m_mc_channel_number = pers->m_mc_channel_number;
-   trans->m_mc_event_number   = pers->m_mc_event_number;
+EventType* EventTypeCnv_p3::createTransient (const EventType_p3* persObj, MsgStream& log) const
+{
+  auto trans = CxxUtils::make_unique<EventType>();
+  persToTrans(persObj, trans.get(), log);
+  return(trans.release());
 }
diff --git a/Event/EventTPCnv/src/MergedEventInfoCnv_p1.cxx b/Event/EventTPCnv/src/MergedEventInfoCnv_p1.cxx
index 998d9c89fb308102d07b27d3e0c0c7e00287dab2..7b734480f11fc44c573acf9a344ccfc265ddeb23 100644
--- a/Event/EventTPCnv/src/MergedEventInfoCnv_p1.cxx
+++ b/Event/EventTPCnv/src/MergedEventInfoCnv_p1.cxx
@@ -2,12 +2,7 @@
   Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
 */
 
-#define private public
-#define protected public
 #include "EventInfo/MergedEventInfo.h"
-#undef private
-#undef protected
-
 #include "EventInfo/EventID.h"
 
 #include "EventTPCnv/MergedEventInfoCnv_p1.h"
@@ -15,16 +10,22 @@
 #include "EventTPCnv/EventIDCnv_p1.h"
 
 
-static	EventIDCnv_p1		idConv;
-static	EventInfoCnv_p1		baseConv;
+static const EventIDCnv_p1		idConv;
+static const EventInfoCnv_p1		baseConv;
 
 
 void MergedEventInfoCnv_p1::transToPers(const MergedEventInfo* trans, MergedEventInfo_p1* pers, MsgStream &log) {
    baseConv.transToPers(trans, pers, log); 
-   idConv.transToPers(&trans->m_newEventID, &pers->m_newEventID, log);
+   idConv.transToPers(trans->event_ID(), &pers->m_newEventID, log);
 }
 
 void MergedEventInfoCnv_p1::persToTrans(const MergedEventInfo_p1* pers, MergedEventInfo* trans, MsgStream &log) {
-   baseConv.persToTrans(pers, trans, log);
-   idConv.persToTrans(&pers->m_newEventID, &trans->m_newEventID, log);
+   EventInfo base;
+   baseConv.persToTrans(pers, &base, log);
+   EventID newid;
+   idConv.persToTrans(&pers->m_newEventID, &newid, log);
+   *trans = MergedEventInfo (base,
+                             newid.run_number(),
+                             newid.event_number(),
+                             newid.time_stamp());
 }
diff --git a/Event/EventTPCnv/src/MergedEventInfoCnv_p2.cxx b/Event/EventTPCnv/src/MergedEventInfoCnv_p2.cxx
index 6f047f240d2179e350b9d3a2480580876e18314a..2d3dd23c997df15bf8b9c63794f44beff99302ec 100644
--- a/Event/EventTPCnv/src/MergedEventInfoCnv_p2.cxx
+++ b/Event/EventTPCnv/src/MergedEventInfoCnv_p2.cxx
@@ -2,12 +2,7 @@
   Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
 */
 
-#define private public
-#define protected public
 #include "EventInfo/MergedEventInfo.h"
-#undef private
-#undef protected
-
 #include "EventInfo/EventID.h"
 
 #include "EventTPCnv/MergedEventInfoCnv_p2.h"
@@ -15,17 +10,23 @@
 #include "EventTPCnv/EventIDCnv_p2.h"
 
 
-static	EventIDCnv_p2		idConv;
-static	EventInfoCnv_p3		baseConv;
+static const EventIDCnv_p2		idConv;
+static const EventInfoCnv_p3		baseConv;
 
 void MergedEventInfoCnv_p2::persToTrans(const MergedEventInfo_p2* pers, MergedEventInfo* trans, MsgStream &log) {
-	baseConv.persToTrans(pers, trans, log);
-	std::vector<unsigned int>::const_iterator i=pers->m_newEventIDdata.begin();
-	idConv.persToTrans(i, &trans->m_newEventID);
+   EventInfo base;
+   baseConv.persToTrans(pers, &base, log);
+   std::vector<unsigned int>::const_iterator i=pers->m_newEventIDdata.begin();
+   EventID newid;
+   idConv.persToTrans(i, &newid);
+   *trans = MergedEventInfo (base,
+                             newid.run_number(),
+                             newid.event_number(),
+                             newid.time_stamp());
 }
 
 void MergedEventInfoCnv_p2::transToPers(const MergedEventInfo* trans, MergedEventInfo_p2* pers, MsgStream &log) {
 	baseConv.transToPers(trans, pers, log); 
-	idConv.transToPers(&trans->m_newEventID, pers->m_newEventIDdata);
+	idConv.transToPers(trans->event_ID(), pers->m_newEventIDdata);
 }
 
diff --git a/Event/EventTPCnv/src/PileUpEventInfoCnv_p1.cxx b/Event/EventTPCnv/src/PileUpEventInfoCnv_p1.cxx
index 0a90c55bce3d07486a3b84fe21fc2c4127b698f8..7529e0718986256976858616df24b1faee151f6b 100644
--- a/Event/EventTPCnv/src/PileUpEventInfoCnv_p1.cxx
+++ b/Event/EventTPCnv/src/PileUpEventInfoCnv_p1.cxx
@@ -2,17 +2,11 @@
   Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
 */
 
-#define private public
-#define protected public
 #include "EventInfo/PileUpEventInfo.h"
-#undef private
-#undef protected
-
-
 #include "EventTPCnv/PileUpEventInfoCnv_p1.h"
 #include "EventTPCnv/EventInfoCnv_p1.h"
 
-static	EventInfoCnv_p1		evInfoConv;
+static const EventInfoCnv_p1		evInfoConv;
 
 namespace {
   const int MODULO(100000);
@@ -22,13 +16,13 @@ namespace {
 void PileUpEventInfoCnv_p1::transToPers(const PileUpEventInfo* trans, PileUpEventInfo_p1* pers, MsgStream &log) {
    evInfoConv.transToPers(trans, pers, log); 
 
-   size_t	sub_ev_n = trans->m_subEvents.size();
-   pers->m_subEvents.resize(sub_ev_n);
    PileUpEventInfo::SubEvent::const_iterator	sub_iter = trans->beginSubEvt();
+   size_t	sub_ev_n = std::distance (sub_iter, trans->endSubEvt());
+   pers->m_subEvents.resize(sub_ev_n);
    PileUpEventInfo_p1::SubEvVect_t::iterator	p_sub_iter = pers->m_subEvents.begin();
    while( sub_iter!=trans->endSubEvt() ) {
-      short time = sub_iter->m_timeIndex.m_time;
-      short index = sub_iter->m_timeIndex.m_index;
+      short time = sub_iter->time();
+      short index = sub_iter->index();
       p_sub_iter->m_timeIndex = (time - MINTIME) + MODULO * index;
       evInfoConv.transToPers(sub_iter->pSubEvt, &p_sub_iter->m_subEventInfo, log);
       p_sub_iter++;  sub_iter++;
@@ -37,18 +31,20 @@ void PileUpEventInfoCnv_p1::transToPers(const PileUpEventInfo* trans, PileUpEven
 
 void PileUpEventInfoCnv_p1::persToTrans(const PileUpEventInfo_p1* pers, PileUpEventInfo* trans, MsgStream &log) 
 {
+   *trans = PileUpEventInfo();
    evInfoConv.persToTrans(pers, trans, log); 
    
    PileUpEventInfo_p1::SubEvVect_t::const_iterator	p_sub_iter = pers->m_subEvents.begin();
-   trans->m_subEvents.clear();
    while( p_sub_iter != pers->m_subEvents.end() ) {
-      PileUpEventInfo::SubEvent	sub_event;
-      sub_event.m_timeIndex.m_index =  static_cast<short>( (p_sub_iter->m_timeIndex) * (1./MODULO) );
-      unsigned long index = MODULO*sub_event.m_timeIndex.m_index;
-      sub_event.m_timeIndex.m_time  = static_cast<short>( MINTIME+(p_sub_iter->m_timeIndex-index) );
-      sub_event.m_timeIndex.m_type  = PileUpTimeEventIndex::Unknown;
-      sub_event.pSubEvt = evInfoConv.createTransient(&p_sub_iter->m_subEventInfo, log);
-      trans->m_subEvents.push_back( sub_event );
+       short index1 =  static_cast<short>( (p_sub_iter->m_timeIndex)*(1./MODULO) );
+      unsigned long index = MODULO*index1;
+
+      trans->addSubEvt (static_cast<short>( MINTIME+(p_sub_iter->m_timeIndex-index) ),
+                        //index1
+                        PileUpTimeEventIndex::Unknown,
+                        std::unique_ptr<EventInfo>
+                          (evInfoConv.createTransient(&p_sub_iter->m_subEventInfo, log)),
+                        nullptr);
       p_sub_iter++;
    }
 }
diff --git a/Event/EventTPCnv/src/PileUpEventInfoCnv_p2.cxx b/Event/EventTPCnv/src/PileUpEventInfoCnv_p2.cxx
index 42da0ad2bb86899d46ba374e73353bd2858be98c..3d7296e28d5d5b866f5e04d42e90e37e7b21ae1c 100644
--- a/Event/EventTPCnv/src/PileUpEventInfoCnv_p2.cxx
+++ b/Event/EventTPCnv/src/PileUpEventInfoCnv_p2.cxx
@@ -2,17 +2,11 @@
   Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
 */
 
-#define private public
-#define protected public
 #include "EventInfo/PileUpEventInfo.h"
-#undef private
-#undef protected
-
-
 #include "EventTPCnv/PileUpEventInfoCnv_p2.h"
 #include "EventTPCnv/EventInfoCnv_p2.h"
 
-static	EventInfoCnv_p2		evInfoConv;
+static const EventInfoCnv_p2		evInfoConv;
 
 namespace {
   const int MODULO(100000);
@@ -22,13 +16,13 @@ namespace {
 void PileUpEventInfoCnv_p2::transToPers(const PileUpEventInfo* trans, PileUpEventInfo_p2* pers, MsgStream &log) {
    evInfoConv.transToPers(trans, pers, log); 
 
-   size_t	sub_ev_n = trans->m_subEvents.size();
-   pers->m_subEvents.resize(sub_ev_n);
    PileUpEventInfo::SubEvent::const_iterator	sub_iter = trans->beginSubEvt();
+   size_t	sub_ev_n = std::distance (sub_iter, trans->endSubEvt());
+   pers->m_subEvents.resize(sub_ev_n);
    PileUpEventInfo_p2::SubEvVect_t::iterator	p_sub_iter = pers->m_subEvents.begin();
    while( sub_iter!=trans->endSubEvt() ) {
-      short time = sub_iter->m_timeIndex.m_time;
-      short index = sub_iter->m_timeIndex.m_index;
+      short time = sub_iter->time();
+      short index = sub_iter->index();
       p_sub_iter->m_timeIndex = (time - MINTIME) + MODULO * index;
       evInfoConv.transToPers(sub_iter->pSubEvt, &p_sub_iter->m_subEventInfo, log);
       p_sub_iter++;  sub_iter++;
@@ -37,18 +31,20 @@ void PileUpEventInfoCnv_p2::transToPers(const PileUpEventInfo* trans, PileUpEven
 
 void PileUpEventInfoCnv_p2::persToTrans(const PileUpEventInfo_p2* pers, PileUpEventInfo* trans, MsgStream &log) 
 {
+   *trans = PileUpEventInfo();
    evInfoConv.persToTrans(pers, trans, log); 
    
    PileUpEventInfo_p2::SubEvVect_t::const_iterator	p_sub_iter = pers->m_subEvents.begin();
-   trans->m_subEvents.clear();
    while( p_sub_iter != pers->m_subEvents.end() ) {
-      PileUpEventInfo::SubEvent	sub_event;
-      sub_event.m_timeIndex.m_index =  static_cast<short>( (p_sub_iter->m_timeIndex) * (1./MODULO) );
-      unsigned long index = MODULO*sub_event.m_timeIndex.m_index; 
-      sub_event.m_timeIndex.m_time  = static_cast<short>( MINTIME+(p_sub_iter->m_timeIndex-index) );
-      sub_event.m_timeIndex.m_type  = PileUpTimeEventIndex::Unknown;
-      sub_event.pSubEvt = evInfoConv.createTransient(&p_sub_iter->m_subEventInfo, log);
-      trans->m_subEvents.push_back( sub_event );
+     short index1 =  static_cast<short>( (p_sub_iter->m_timeIndex)*(1./MODULO) );
+      unsigned long index = MODULO*index1;
+
+      trans->addSubEvt (static_cast<short>( MINTIME+(p_sub_iter->m_timeIndex-index) ),
+                        //index1
+                        PileUpTimeEventIndex::Unknown,
+                        std::unique_ptr<EventInfo>
+                          (evInfoConv.createTransient(&p_sub_iter->m_subEventInfo, log)),
+                        nullptr);
       p_sub_iter++;
    }
 }
diff --git a/Event/EventTPCnv/src/PileUpEventInfoCnv_p3.cxx b/Event/EventTPCnv/src/PileUpEventInfoCnv_p3.cxx
index 95144d6d756314206f55773c61ff003cd1c618a8..470d547c82d9bbf64ed213178d3c294bcb208bec 100644
--- a/Event/EventTPCnv/src/PileUpEventInfoCnv_p3.cxx
+++ b/Event/EventTPCnv/src/PileUpEventInfoCnv_p3.cxx
@@ -2,29 +2,23 @@
   Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
 */
 
-#define private public
-#define protected public
 #include "EventInfo/PileUpEventInfo.h"
-#undef private
-#undef protected
-
-
 #include "EventTPCnv/PileUpEventInfoCnv_p3.h"
 #include "EventTPCnv/EventInfoCnv_p2.h"
 
-static	EventInfoCnv_p2		evInfoConv;
+static const EventInfoCnv_p2		evInfoConv;
 
 void PileUpEventInfoCnv_p3::transToPers(const PileUpEventInfo* trans, PileUpEventInfo_p3* pers, MsgStream &log) {
    evInfoConv.transToPers(trans, pers, log); 
 
-   size_t	sub_ev_n = trans->m_subEvents.size();
-   pers->m_subEvents.resize(sub_ev_n);
    PileUpEventInfo::SubEvent::const_iterator	sub_iter = trans->beginSubEvt();
+   size_t	sub_ev_n = std::distance (sub_iter, trans->endSubEvt());
+   pers->m_subEvents.resize(sub_ev_n);
    PileUpEventInfo_p3::SubEvVect_t::iterator	p_sub_iter = pers->m_subEvents.begin();
    while( sub_iter!=trans->endSubEvt() ) {
-      p_sub_iter->m_time  = sub_iter->m_timeIndex.m_time;
-      p_sub_iter->m_index = sub_iter->m_timeIndex.m_index;
-      p_sub_iter->m_type  = static_cast<short>(sub_iter->m_timeIndex.m_type);
+      p_sub_iter->m_time  = sub_iter->time();
+      p_sub_iter->m_index = sub_iter->index();
+      p_sub_iter->m_type  = static_cast<short>(sub_iter->type());
       evInfoConv.transToPers(sub_iter->pSubEvt, &p_sub_iter->m_subEventInfo, log);
       p_sub_iter++;  sub_iter++;
    }
@@ -32,17 +26,17 @@ void PileUpEventInfoCnv_p3::transToPers(const PileUpEventInfo* trans, PileUpEven
 
 void PileUpEventInfoCnv_p3::persToTrans(const PileUpEventInfo_p3* pers, PileUpEventInfo* trans, MsgStream &log) 
 {
+   *trans = PileUpEventInfo();
    evInfoConv.persToTrans(pers, trans, log); 
    
    PileUpEventInfo_p3::SubEvVect_t::const_iterator	p_sub_iter = pers->m_subEvents.begin();
-   trans->m_subEvents.clear();
    while( p_sub_iter != pers->m_subEvents.end() ) {
-      PileUpEventInfo::SubEvent	sub_event;
-      sub_event.m_timeIndex.m_time  = p_sub_iter->m_time;
-      sub_event.m_timeIndex.m_index = p_sub_iter->m_index;
-      sub_event.m_timeIndex.m_type  = static_cast<PileUpTimeEventIndex::PileUpType>(p_sub_iter->m_type);
-      sub_event.pSubEvt = evInfoConv.createTransient(&p_sub_iter->m_subEventInfo, log);
-      trans->m_subEvents.push_back( sub_event );
+      trans->addSubEvt (p_sub_iter->m_time,
+                        //p_sub_iter->m_index,
+                        static_cast<PileUpTimeEventIndex::PileUpType>(p_sub_iter->m_type),
+                        std::unique_ptr<EventInfo>
+                          (evInfoConv.createTransient(&p_sub_iter->m_subEventInfo, log)),
+                        nullptr);
       p_sub_iter++;
    }
 }
diff --git a/Event/EventTPCnv/src/PileUpEventInfoCnv_p4.cxx b/Event/EventTPCnv/src/PileUpEventInfoCnv_p4.cxx
index 1cfe4c13b36f8ea6fa1b86cc05a2abae899849f5..97134c94ae8cb9a3bd9f5bef6e09bdd997da212a 100644
--- a/Event/EventTPCnv/src/PileUpEventInfoCnv_p4.cxx
+++ b/Event/EventTPCnv/src/PileUpEventInfoCnv_p4.cxx
@@ -2,29 +2,23 @@
   Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
 */
 
-#define private public
-#define protected public
 #include "EventInfo/PileUpEventInfo.h"
-#undef private
-#undef protected
-
-
 #include "EventTPCnv/PileUpEventInfoCnv_p4.h"
 #include "EventTPCnv/EventInfoCnv_p3.h"
 
-static	EventInfoCnv_p3		evInfoConv;
+static const EventInfoCnv_p3		evInfoConv;
 
 void PileUpEventInfoCnv_p4::transToPers(const PileUpEventInfo* trans, PileUpEventInfo_p4* pers, MsgStream &log) {
    evInfoConv.transToPers(trans, pers, log); 
 
-   size_t	sub_ev_n = trans->m_subEvents.size();
-   pers->m_subEvents.resize(sub_ev_n);
    PileUpEventInfo::SubEvent::const_iterator	sub_iter = trans->beginSubEvt();
+   size_t	sub_ev_n = std::distance (sub_iter, trans->endSubEvt());
+   pers->m_subEvents.resize(sub_ev_n);
    PileUpEventInfo_p4::SubEvVect_t::iterator	p_sub_iter = pers->m_subEvents.begin();
    while( sub_iter!=trans->endSubEvt() ) {
-      p_sub_iter->m_time  = sub_iter->m_timeIndex.m_time;
-      p_sub_iter->m_index = sub_iter->m_timeIndex.m_index;
-      p_sub_iter->m_type  = static_cast<short>(sub_iter->m_timeIndex.m_type);
+      p_sub_iter->m_time  = sub_iter->time();
+      p_sub_iter->m_index = sub_iter->index();
+      p_sub_iter->m_type  = static_cast<short>(sub_iter->type());
       evInfoConv.transToPers(sub_iter->pSubEvt, &p_sub_iter->m_subEventInfo, log);
       p_sub_iter++;  sub_iter++;
    }
@@ -32,17 +26,17 @@ void PileUpEventInfoCnv_p4::transToPers(const PileUpEventInfo* trans, PileUpEven
 
 void PileUpEventInfoCnv_p4::persToTrans(const PileUpEventInfo_p4* pers, PileUpEventInfo* trans, MsgStream &log) 
 {
+   *trans = PileUpEventInfo();
    evInfoConv.persToTrans(pers, trans, log); 
    
    PileUpEventInfo_p4::SubEvVect_t::const_iterator	p_sub_iter = pers->m_subEvents.begin();
-   trans->m_subEvents.clear();
    while( p_sub_iter != pers->m_subEvents.end() ) {
-      PileUpEventInfo::SubEvent	sub_event;
-      sub_event.m_timeIndex.m_time  = p_sub_iter->m_time;
-      sub_event.m_timeIndex.m_index = p_sub_iter->m_index;
-      sub_event.m_timeIndex.m_type  = static_cast<PileUpTimeEventIndex::PileUpType>(p_sub_iter->m_type);
-      sub_event.pSubEvt = evInfoConv.createTransient(&p_sub_iter->m_subEventInfo, log);
-      trans->m_subEvents.push_back( sub_event );
+      trans->addSubEvt (p_sub_iter->m_time,
+                        //p_sub_iter->m_index,
+                        static_cast<PileUpTimeEventIndex::PileUpType>(p_sub_iter->m_type),
+                        std::unique_ptr<EventInfo>
+                          (evInfoConv.createTransient(&p_sub_iter->m_subEventInfo, log)),
+                        nullptr);
       p_sub_iter++;
    }
 }
diff --git a/Event/EventTPCnv/src/PileUpEventInfoCnv_p5.cxx b/Event/EventTPCnv/src/PileUpEventInfoCnv_p5.cxx
index 71b7e0ef3b06d053d1da5b7a374e7f3715a81094..2fa60dd6078e794ac54bb9689d92157484e7ac82 100644
--- a/Event/EventTPCnv/src/PileUpEventInfoCnv_p5.cxx
+++ b/Event/EventTPCnv/src/PileUpEventInfoCnv_p5.cxx
@@ -2,17 +2,11 @@
   Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
 */
 
-#define private public
-#define protected public
 #include "EventInfo/PileUpEventInfo.h"
-#undef private
-#undef protected
-
-
 #include "EventTPCnv/PileUpEventInfoCnv_p5.h"
 #include "EventTPCnv/EventInfoCnv_p4.h"
 
-static	EventInfoCnv_p4		evInfoConv;
+static const EventInfoCnv_p4		evInfoConv;
 
 void PileUpEventInfoCnv_p5::transToPers(const PileUpEventInfo* trans, PileUpEventInfo_p5* pers, MsgStream &log) {
    evInfoConv.transToPers(trans, pers, log); 
@@ -23,10 +17,12 @@ void PileUpEventInfoCnv_p5::transToPers(const PileUpEventInfo* trans, PileUpEven
    pers->m_subEvents.resize(sub_ev_n);
    PileUpEventInfo::SubEvent::const_iterator	sub_iter = trans->beginSubEvt();
    PileUpEventInfo_p5::SubEvVect_t::iterator	p_sub_iter = pers->m_subEvents.begin();
+   size_t	sub_ev_n = std::distance (sub_iter, trans->endSubEvt());
+   pers->m_subEvents.resize(sub_ev_n);
    while( sub_iter!=trans->endSubEvt() ) {
-      p_sub_iter->m_time  = sub_iter->m_timeIndex.m_time;
-      p_sub_iter->m_index = sub_iter->m_timeIndex.m_index;
-      p_sub_iter->m_type  = static_cast<short>(sub_iter->m_timeIndex.m_type);
+      p_sub_iter->m_time  = sub_iter->time();
+      p_sub_iter->m_index = sub_iter->index();
+      p_sub_iter->m_type  = static_cast<short>(sub_iter->type());
       evInfoConv.transToPers(sub_iter->pSubEvt, &p_sub_iter->m_subEventInfo, log);
       p_sub_iter++;  sub_iter++;
    }
@@ -35,17 +31,17 @@ void PileUpEventInfoCnv_p5::transToPers(const PileUpEventInfo* trans, PileUpEven
 
 void PileUpEventInfoCnv_p5::persToTrans(const PileUpEventInfo_p5* pers, PileUpEventInfo* trans, MsgStream &log) 
 {
+   *trans = PileUpEventInfo();
    evInfoConv.persToTrans(pers, trans, log); 
    
    PileUpEventInfo_p5::SubEvVect_t::const_iterator	p_sub_iter = pers->m_subEvents.begin();
-   trans->m_subEvents.clear();
    while( p_sub_iter != pers->m_subEvents.end() ) {
-      PileUpEventInfo::SubEvent	sub_event;
-      sub_event.m_timeIndex.m_time  = p_sub_iter->m_time;
-      sub_event.m_timeIndex.m_index = p_sub_iter->m_index;
-      sub_event.m_timeIndex.m_type  = static_cast<PileUpTimeEventIndex::PileUpType>(p_sub_iter->m_type);
-      sub_event.pSubEvt = evInfoConv.createTransient(&p_sub_iter->m_subEventInfo, log);
-      trans->m_subEvents.push_back( sub_event );
+      trans->addSubEvt (p_sub_iter->m_time,
+                        //p_sub_iter->m_index,
+                        static_cast<PileUpTimeEventIndex::PileUpType>(p_sub_iter->m_type),
+                        std::unique_ptr<EventInfo>
+                          (evInfoConv.createTransient(&p_sub_iter->m_subEventInfo, log)),
+                        nullptr);
       p_sub_iter++;
    }
 }
diff --git a/Event/EventTPCnv/src/TriggerInfoCnv_p1.cxx b/Event/EventTPCnv/src/TriggerInfoCnv_p1.cxx
index 26f9c2800d73334a434cbd544b495a99b9fc5ffb..13750f96ca00f27e7018f108a09ae09167e47646 100644
--- a/Event/EventTPCnv/src/TriggerInfoCnv_p1.cxx
+++ b/Event/EventTPCnv/src/TriggerInfoCnv_p1.cxx
@@ -2,35 +2,71 @@
   Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
 */
 
-#define private public
-#define protected public
 #include "EventInfo/TriggerInfo.h"
-#undef private
-#undef protected
-
 #include "EventTPCnv/TriggerInfoCnv_p1.h"
+#include "CxxUtils/make_unique.h"
 
 
-void TriggerInfoCnv_p1::transToPers(const TriggerInfo* , TriggerInfo_p1*, MsgStream &) 
+void TriggerInfoCnv_p1::transToPers(const TriggerInfo* trans, TriggerInfo_p1* pers, MsgStream &log)
+{
+  const TriggerInfoCnv_p1* cthis = this;
+  cthis->transToPers (trans, pers, log);
+}
+
+void TriggerInfoCnv_p1::transToPers(const TriggerInfo* trans, TriggerInfo_p1* pers, MsgStream &) const
 {
     // Deprecated, p2 is used for writing
-//     pers->m_extendedLevel1ID    = trans->m_extendedLevel1ID;
-//     pers->m_level1TriggerType   = trans->m_level1TriggerType;
-//     pers->m_level2TriggerInfo   = trans->m_level2TriggerInfo;
-//     pers->m_eventFilterInfo     = trans->m_eventFilterInfo;
+     pers->m_extendedLevel1ID    = trans->extendedLevel1ID();
+     pers->m_level1TriggerType   = trans->level1TriggerType();
+     pers->m_level2TriggerInfo   = 0;
+     if (!trans->level2TriggerInfo().empty())
+       pers->m_level2TriggerInfo   = trans->level2TriggerInfo()[0];
+     pers->m_eventFilterInfo     = trans->eventFilterInfo();
 }
 
 
-void TriggerInfoCnv_p1::persToTrans(const TriggerInfo_p1* pers, TriggerInfo* trans, MsgStream &)  
+void TriggerInfoCnv_p1::persToTrans(const TriggerInfo_p1* pers, TriggerInfo* trans, MsgStream &log)
 {
-    trans->m_extendedLevel1ID     = pers->m_extendedLevel1ID;
-    trans->m_level1TriggerType    = pers->m_level1TriggerType;
+  const TriggerInfoCnv_p1* cthis = this;
+  cthis->persToTrans (pers, trans, log);
+}
+
+void TriggerInfoCnv_p1::persToTrans(const TriggerInfo_p1* pers, TriggerInfo* trans, MsgStream &)  const
+{
+    trans->setExtendedLevel1ID    (pers->m_extendedLevel1ID);
+    trans->setLevel1TriggerType   (pers->m_level1TriggerType);
     // For backwards compatibility - add pers->m_level2TriggerInfo to
     // trans vector if not zero
     if (pers->m_level2TriggerInfo != 0) {
-      trans->m_level2TriggerInfo.push_back(pers->m_level2TriggerInfo);
+      std::vector<TriggerInfo::number_type> l2info {pers->m_level2TriggerInfo};
+      trans->setLevel2TriggerInfo (std::move (l2info));
     }
-    trans->m_eventFilterInfo      = pers->m_eventFilterInfo;
+    trans->setEventFilterInfo      (pers->m_eventFilterInfo);
+}
+
+
+TriggerInfo* TriggerInfoCnv_p1::createTransient (const TriggerInfo_p1* persObj, MsgStream& log)
+{
+  const TriggerInfoCnv_p1* cthis = this;
+  return cthis->createTransient (persObj, log);
 }
 
+TriggerInfo* TriggerInfoCnv_p1::createTransient (const TriggerInfo_p1* persObj, MsgStream& log) const
+{
+  auto trans = CxxUtils::make_unique<TriggerInfo>();
+  persToTrans(persObj, trans.get(), log);
+  return(trans.release());
+}
 
+TriggerInfo_p1* TriggerInfoCnv_p1::createPersistent (const TriggerInfo* transObj, MsgStream& log)
+{
+  const TriggerInfoCnv_p1* cthis = this;
+  return cthis->createPersistent (transObj, log);
+}
+
+TriggerInfo_p1* TriggerInfoCnv_p1::createPersistent (const TriggerInfo* transObj, MsgStream& log) const
+{
+  auto pers = CxxUtils::make_unique<TriggerInfo_p1>();
+  transToPers(transObj, pers.get(), log);
+  return(pers.release());
+}
diff --git a/Event/EventTPCnv/src/TriggerInfoCnv_p2.cxx b/Event/EventTPCnv/src/TriggerInfoCnv_p2.cxx
index e257629d59e2f629934b689c7609eb1a894d5007..688da97479ecb5ac0f33f286e8629200065ba026 100644
--- a/Event/EventTPCnv/src/TriggerInfoCnv_p2.cxx
+++ b/Event/EventTPCnv/src/TriggerInfoCnv_p2.cxx
@@ -2,43 +2,68 @@
   Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
 */
 
-#define private public
-#define protected public
 #include "EventInfo/TriggerInfo.h"
-#undef private
-#undef protected
-
 #include "EventTPCnv/TriggerInfoCnv_p2.h"
+#include "CxxUtils/make_unique.h"
+
+void TriggerInfoCnv_p2::transToPers(const TriggerInfo* trans, TriggerInfo_p2* pers, MsgStream &log)
+{
+  const TriggerInfoCnv_p2* cthis = this;
+  cthis->transToPers (trans, pers, log);
+}
 
-void TriggerInfoCnv_p2::transToPers(const TriggerInfo* trans, TriggerInfo_p2* pers, MsgStream &) {
-
-    pers->m_statusElement         = trans->m_statusElement;
-    pers->m_extendedLevel1ID      = trans->m_extendedLevel1ID;
-    pers->m_level1TriggerType     = trans->m_level1TriggerType;
-    pers->m_level1TriggerInfo     = trans->m_level1TriggerInfo;
-    pers->m_level2TriggerInfo     = trans->m_level2TriggerInfo;
-    pers->m_eventFilterInfo       = trans->m_eventFilterInfo;
-    pers->m_streamTags.resize(trans->m_streamTags.size());
-    for (unsigned int i = 0; i < trans->m_streamTags.size(); ++i) {
-	pers->m_streamTags[i].m_name           = trans->m_streamTags[i].m_name;
-	pers->m_streamTags[i].m_type           = trans->m_streamTags[i].m_type;
-	pers->m_streamTags[i].m_obeysLumiblock = trans->m_streamTags[i].m_obeysLumiblock;
+void TriggerInfoCnv_p2::transToPers(const TriggerInfo* trans, TriggerInfo_p2* pers, MsgStream &) const {
+
+    pers->m_statusElement         = trans->statusElement();
+    pers->m_extendedLevel1ID      = trans->extendedLevel1ID();
+    pers->m_level1TriggerType     = trans->level1TriggerType();
+    pers->m_level1TriggerInfo     = trans->level1TriggerInfo();
+    pers->m_level2TriggerInfo     = trans->level2TriggerInfo();
+    pers->m_eventFilterInfo       = trans->eventFilterInfo();
+    size_t sz = trans->streamTags().size();
+    pers->m_streamTags.resize(sz);
+    for (unsigned int i = 0; i < sz; ++i) {
+        const TriggerInfo::StreamTag& st = trans->streamTags()[i];
+	pers->m_streamTags[i].m_name           = st.name();
+	pers->m_streamTags[i].m_type           = st.type();
+	pers->m_streamTags[i].m_obeysLumiblock = st.obeysLumiblock();
     }
     
 }
 
-void TriggerInfoCnv_p2::persToTrans(const TriggerInfo_p2* pers, TriggerInfo* trans, MsgStream &)  {
+void TriggerInfoCnv_p2::persToTrans(const TriggerInfo_p2* pers, TriggerInfo* trans, MsgStream &log)
+{
+  const TriggerInfoCnv_p2* cthis = this;
+  cthis->persToTrans (pers, trans, log);
+}
+
+void TriggerInfoCnv_p2::persToTrans(const TriggerInfo_p2* pers, TriggerInfo* trans, MsgStream &)  const {
 
-    trans->m_statusElement        = pers->m_statusElement;
-    trans->m_extendedLevel1ID     = pers->m_extendedLevel1ID;
-    trans->m_level1TriggerType    = pers->m_level1TriggerType;
-    trans->m_level1TriggerInfo    = pers->m_level1TriggerInfo;
-    trans->m_level2TriggerInfo    = pers->m_level2TriggerInfo;
-    trans->m_eventFilterInfo      = pers->m_eventFilterInfo;
-    trans->m_streamTags.resize(pers->m_streamTags.size());
+    trans->setStatusElement       (pers->m_statusElement);
+    trans->setExtendedLevel1ID    (pers->m_extendedLevel1ID);
+    trans->setLevel1TriggerType   (pers->m_level1TriggerType);
+    trans->setLevel1TriggerInfo   (pers->m_level1TriggerInfo);
+    trans->setLevel2TriggerInfo   (pers->m_level2TriggerInfo);
+    trans->setEventFilterInfo     (pers->m_eventFilterInfo);
+    std::vector<TriggerInfo::StreamTag> st;
+    st.reserve(pers->m_streamTags.size());
     for (unsigned int i = 0; i < pers->m_streamTags.size(); ++i) {
-	trans->m_streamTags[i].m_name           = pers->m_streamTags[i].m_name;
-	trans->m_streamTags[i].m_type           = pers->m_streamTags[i].m_type;
-	trans->m_streamTags[i].m_obeysLumiblock = pers->m_streamTags[i].m_obeysLumiblock;
+        st.emplace_back (pers->m_streamTags[i].m_name,
+                         pers->m_streamTags[i].m_type,
+                         pers->m_streamTags[i].m_obeysLumiblock);
     }
+    trans->setStreamTags (std::move (st));
+}
+
+TriggerInfo* TriggerInfoCnv_p2::createTransient (const TriggerInfo_p2* persObj, MsgStream& log)
+{
+  const TriggerInfoCnv_p2* cthis = this;
+  return cthis->createTransient (persObj, log);
+}
+
+TriggerInfo* TriggerInfoCnv_p2::createTransient (const TriggerInfo_p2* persObj, MsgStream& log) const
+{
+  auto trans = CxxUtils::make_unique<TriggerInfo>();
+  persToTrans(persObj, trans.get(), log);
+  return(trans.release());
 }
diff --git a/Event/EventTPCnv/src/TriggerInfoCnv_p3.cxx b/Event/EventTPCnv/src/TriggerInfoCnv_p3.cxx
index 9dd7505ce5c3507fc4ac8fc92ece76aeec9b82a3..e72e4956b0589130e5cab5eaa92443d2056a10b4 100644
--- a/Event/EventTPCnv/src/TriggerInfoCnv_p3.cxx
+++ b/Event/EventTPCnv/src/TriggerInfoCnv_p3.cxx
@@ -2,70 +2,99 @@
   Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
 */
 
-#define private public
-#define protected public
 #include "EventInfo/TriggerInfo.h"
-#undef private
-#undef protected
-
 #include "EventTPCnv/TriggerInfoCnv_p3.h"
 #include "EventTPCnv/vectorize.h"
 
-void TriggerInfoCnv_p3::persToTrans(std::vector<unsigned int>::const_iterator &i, TriggerInfo* trans, bool bugcompat){
-    trans->m_statusElement           = (*i); ++i;
-    trans->m_extendedLevel1ID        = (*i); ++i;
-    trans->m_level1TriggerType       = (*i); ++i;
+void TriggerInfoCnv_p3::persToTrans(std::vector<unsigned int>::const_iterator &i, TriggerInfo* trans, bool bugcompat) const{
+    trans->setStatusElement           (*i); ++i;
+    trans->setExtendedLevel1ID        (*i); ++i;
+    trans->setLevel1TriggerType       (*i); ++i;
 	
 //	std::cout<<"persToTrans of TriggerInfo\t"<<trans->m_level1TriggerType<<std::endl;
-	
-    unsigned int size=(*i); ++i;
-    trans->m_level1TriggerInfo.resize(size);
-    for (unsigned int w=0;w<size;w++) {trans->m_level1TriggerInfo[w]=(*i); ++i;}
-    size=(*i); ++i;
-    trans->m_level2TriggerInfo.resize(size);
-    for (unsigned int w=0;w<size;w++) {trans->m_level2TriggerInfo[w]=(*i); ++i;}
-    size=(*i); ++i;
-    trans->m_eventFilterInfo.resize(size);
-    for (unsigned int w=0;w<size;w++) {trans->m_eventFilterInfo[w]=(*i); ++i;}
-	
-//	std::cout<<"persToTrans of TriggerInfo\t"<<trans->m_eventFilterInfo.size()<<std::endl;
-    size=(*i); ++i;
-    trans->m_streamTags.resize(size);
-    for (unsigned int w=0;w<size;w++) {
-      UITostr(trans->m_streamTags[w].m_name,i, bugcompat);
-      UITostr(trans->m_streamTags[w].m_type,i, bugcompat);
+
+    {
+      unsigned int size=(*i); ++i;
+      std::vector<TriggerInfo::number_type> l1info (i, i+size);  i += size;
+      trans->setLevel1TriggerInfo (std::move (l1info));
     }
-    std::vector<bool> t;
-    UITobitmap(t, i, bugcompat);
-    for (unsigned int w=0;w<size;w++) {
-        trans->m_streamTags[w].m_obeysLumiblock=t[w];
-//	std::cout<<"persToTrans of TriggerInfo \t"<<trans->m_streamTags[w].m_obeysLumiblock<<std::endl;
+
+    {
+      unsigned int size=(*i); ++i;
+      std::vector<TriggerInfo::number_type> l2info (i, i+size);  i += size;
+      trans->setLevel2TriggerInfo (std::move (l2info));
+    }
+                                   
+    {
+      unsigned int size=(*i); ++i;
+      std::vector<TriggerInfo::number_type> efinfo (i, i+size);  i += size;
+      trans->setEventFilterInfo (std::move (efinfo));
+    }
+                                   
+//	std::cout<<"persToTrans of TriggerInfo\t"<<trans->m_eventFilterInfo.size()<<std::endl;
+    {
+      unsigned int size=(*i); ++i;
+      std::vector<std::string> names(size);
+      std::vector<std::string> types(size);
+      for (unsigned int w=0;w<size;w++) {
+        UITostr(names[w],i, bugcompat);
+        UITostr(types[w],i, bugcompat);
+      }
+
+      std::vector<bool> t;
+      UITobitmap(t, i, bugcompat);
+
+      std::vector<TriggerInfo::StreamTag> st;
+      st.reserve (size);
+      for (unsigned int w=0;w<size;w++) {
+        st.emplace_back (std::move(names[w]), std::move(types[w]), t[w]);
+      }
+
+      trans->setStreamTags (std::move (st));
     }
 }
 
-void TriggerInfoCnv_p3::transToPers(const TriggerInfo* trans, std::vector<unsigned int> &pers){
-    pers.push_back(trans->m_statusElement);
-    pers.push_back(trans->m_extendedLevel1ID);
-    pers.push_back(trans->m_level1TriggerType);
-    // std::cout<<"transToPers of TriggerInfo \t"<<trans->m_level1TriggerType<<std::endl;
-    pers.push_back(trans->m_level1TriggerInfo.size());
-    std::copy (trans->m_level1TriggerInfo.begin(), trans->m_level1TriggerInfo.end(), std::back_inserter (pers));
-    pers.push_back(trans->m_level2TriggerInfo.size());
-    std::copy (trans->m_level2TriggerInfo.begin(), trans->m_level2TriggerInfo.end(), std::back_inserter (pers));
-    pers.push_back(trans->m_eventFilterInfo.size());
-    std::copy (trans->m_eventFilterInfo.begin(), trans->m_eventFilterInfo.end(), std::back_inserter (pers));
-	
-    // std::cout<<"transToPers of TriggerInfo \t"<<trans->m_eventFilterInfo.size()<<std::endl;
-    pers.push_back(trans->m_streamTags.size());
-    std::vector<bool> t; t.reserve(trans->m_streamTags.size());
-    for (unsigned int i = 0; i < trans->m_streamTags.size(); ++i) {
-        strToUI(trans->m_streamTags[i].m_name,pers);
-        strToUI(trans->m_streamTags[i].m_type,pers);
-        t.push_back(trans->m_streamTags[i].m_obeysLumiblock);
+void TriggerInfoCnv_p3::transToPers(const TriggerInfo* trans, std::vector<unsigned int> &pers) const{
+    pers.push_back(trans->statusElement());
+    pers.push_back(trans->extendedLevel1ID());
+    pers.push_back(trans->level1TriggerType());
+
+    {
+      const std::vector<TriggerInfo::number_type>& l1info = 
+        trans->level1TriggerInfo();
+      // std::cout<<"transToPers of TriggerInfo \t"<<trans->m_level1TriggerType<<std::endl;
+      pers.push_back(l1info.size());
+      std::copy (l1info.begin(), l1info.end(), std::back_inserter (pers));
+    }
+
+    {
+      const std::vector<TriggerInfo::number_type>& l2info = 
+        trans->level2TriggerInfo();
+      pers.push_back(l2info.size());
+      std::copy (l2info.begin(), l2info.end(), std::back_inserter (pers));
+    }
+
+    {
+      const std::vector<TriggerInfo::number_type>& efinfo = 
+        trans->eventFilterInfo();
+      pers.push_back(efinfo.size());
+      std::copy (efinfo.begin(), efinfo.end(), std::back_inserter (pers));
+    }
+
+    {
+      size_t sz = trans->streamTags().size();
+      // std::cout<<"transToPers of TriggerInfo \t"<<trans->m_eventFilterInfo.size()<<std::endl;
+      pers.push_back(sz);
+      std::vector<bool> t; t.reserve(sz);
+      for (unsigned int i = 0; i < sz; ++i) {
+        const TriggerInfo::StreamTag& st = trans->streamTags()[i];
+        strToUI(st.name(), pers);
+        strToUI(st.type(), pers);
+        t.push_back(st.obeysLumiblock());
         // std::cout<<"transToPers of TriggerInfo "<<trans->m_streamTags[i].m_obeysLumiblock<<std::endl;
+      }
+      bitmapToUI(t, pers);
     }
-    bitmapToUI(t, pers);
-	
 }
 
 
diff --git a/Event/EventTPCnv/test/AtlasMcWeight_test.cxx b/Event/EventTPCnv/test/AtlasMcWeight_test.cxx
new file mode 100644
index 0000000000000000000000000000000000000000..b0f482ff94e96459b65be7bd3a7643fb59723dc2
--- /dev/null
+++ b/Event/EventTPCnv/test/AtlasMcWeight_test.cxx
@@ -0,0 +1,51 @@
+/*
+  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+*/
+
+// $Id$
+/**
+ * @file EventTPCnv/test/AtlasMcWeight_test.cxx
+ * @author scott snyder <snyder@bnl.gov>
+ * @date Jul, 2016
+ * @brief Regression tests.
+ */
+
+#undef NDEBUG
+#include "EventTPCnv/AtlasMcWeight.h"
+#include "TestTools/leakcheck.h"
+#include "TestTools/FLOATassert.h"
+#include <cstdlib>
+#include <cassert>
+#include <iostream>
+
+
+void testit (double w, unsigned int n, double w2)
+{
+  unsigned int nn = AtlasMcWeight::encode (w);
+  if (nn != n) {
+    std::cout << "encode for " << w << " fails; " << n << " " << nn << "\n";
+    std::abort();
+  }
+  assert (nn == n);
+  assert (Athena_test::isEqual (AtlasMcWeight::decode (nn), w2));
+}
+
+
+void test1()
+{
+  std::cout << "test1\n";
+  Athena_test::Leakcheck check;
+  
+  testit (123.5, 312350000, 123.5);
+  testit (-123.5, 1312350000, -123.5);
+  testit (0.125, 2012500000, 0.125);
+  testit (-0.125, 3012500000, -0.125);
+}
+
+
+int main()
+{
+  test1();
+  return 0;
+}
+
diff --git a/Event/EventTPCnv/test/EventIDCnv_p1_test.cxx b/Event/EventTPCnv/test/EventIDCnv_p1_test.cxx
new file mode 100644
index 0000000000000000000000000000000000000000..996cbf1d90ac0bd1976ece278d2a42967bc9798e
--- /dev/null
+++ b/Event/EventTPCnv/test/EventIDCnv_p1_test.cxx
@@ -0,0 +1,66 @@
+/*
+  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+*/
+
+// $Id$
+/**
+ * @file EventTPCnv/test/EventIDCnv_p1_test.cxx
+ * @author scott snyder <snyder@bnl.gov>
+ * @date Jul, 2016
+ * @brief Regression tests.
+ */
+
+#undef NDEBUG
+#include "EventTPCnv/EventIDCnv_p1.h"
+#include "TestTools/leakcheck.h"
+#include "EventInfo/EventID.h"
+#include "GaudiKernel/MsgStream.h"
+#include <cassert>
+#include <iostream>
+
+
+void compare (const EventID& p1,
+              const EventID& p2)
+{
+  assert (p1.run_number() == p2.run_number());
+  assert (p1.event_number() == p2.event_number());
+  assert (p1.time_stamp() == p2.time_stamp());
+  assert (p1.time_stamp_ns_offset() == p2.time_stamp_ns_offset());
+  assert (p1.lumi_block() == p2.lumi_block());
+  assert (p1.bunch_crossing_id() == p2.bunch_crossing_id());
+  assert (p1.detector_mask0() == p2.detector_mask0());
+  assert (p1.detector_mask1() == p2.detector_mask1());
+  assert (p1.detector_mask2() == p2.detector_mask2());
+  assert (p1.detector_mask3() == p2.detector_mask3());
+}
+
+
+void testit (const EventID& trans1)
+{
+  MsgStream log (0, "test");
+  EventIDCnv_p1 cnv;
+  EventID_p1 pers;
+  cnv.transToPers (&trans1, &pers, log);
+  EventID trans2;
+  cnv.persToTrans (&pers, &trans2, log);
+  compare (trans1, trans2);
+}
+
+
+void test1()
+{
+  std::cout << "test1\n";
+  Athena_test::Leakcheck check;
+  
+
+  EventID trans1 (1234, 2345, 3456, 4567, 5678, 6789,
+                  4321, 5432, 6543, 7654);
+  testit (trans1);
+}
+
+
+int main()
+{
+  test1();
+  return 0;
+}
diff --git a/Event/EventTPCnv/test/EventIDCnv_p2_test.cxx b/Event/EventTPCnv/test/EventIDCnv_p2_test.cxx
new file mode 100644
index 0000000000000000000000000000000000000000..02c54e39bbf8c8d4ecbdbc9c4577315dc8a05feb
--- /dev/null
+++ b/Event/EventTPCnv/test/EventIDCnv_p2_test.cxx
@@ -0,0 +1,67 @@
+/*
+  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+*/
+
+// $Id$
+/**
+ * @file EventTPCnv/test/EventIDCnv_p2_test.cxx
+ * @author scott snyder <snyder@bnl.gov>
+ * @date Jul, 2016
+ * @brief Regression tests.
+ */
+
+#undef NDEBUG
+#include "EventTPCnv/EventIDCnv_p2.h"
+#include "TestTools/leakcheck.h"
+#include "EventInfo/EventID.h"
+#include <cassert>
+#include <iostream>
+
+
+void compare (const EventID& p1,
+              const EventID& p2)
+{
+  assert (p1.run_number() == p2.run_number());
+  assert (p1.event_number() == p2.event_number());
+  assert (p1.time_stamp() == p2.time_stamp());
+  assert (p1.time_stamp_ns_offset() == p2.time_stamp_ns_offset());
+  assert (p1.lumi_block() == p2.lumi_block());
+  assert (p1.bunch_crossing_id() == p2.bunch_crossing_id());
+  assert (p1.detector_mask0() == p2.detector_mask0());
+  assert (p1.detector_mask1() == p2.detector_mask1());
+  assert (0 == p2.detector_mask2());
+  assert (0 == p2.detector_mask3());
+}
+
+
+void testit (const EventID& trans1)
+{
+  EventIDCnv_p2 cnv;
+  std::vector<unsigned int> pers;
+  cnv.transToPers (&trans1, pers);
+  
+  EventID trans2;
+  std::vector<unsigned int>::const_iterator it = pers.begin();
+  cnv.persToTrans (it, &trans2);
+  assert (it == pers.end());
+  compare (trans1, trans2);
+}
+
+
+void test1()
+{
+  std::cout << "test1\n";
+  Athena_test::Leakcheck check;
+  
+
+  EventID trans1 (1234, 2345, 3456, 4567, 5678, 6789,
+                  4321, 5432, 6543, 7654);
+  testit (trans1);
+}
+
+
+int main()
+{
+  test1();
+  return 0;
+}
diff --git a/Event/EventTPCnv/test/EventInfoCnv_p1_test.cxx b/Event/EventTPCnv/test/EventInfoCnv_p1_test.cxx
new file mode 100644
index 0000000000000000000000000000000000000000..fdd22ea5078ed353f624381a4f71b65ce0267465
--- /dev/null
+++ b/Event/EventTPCnv/test/EventInfoCnv_p1_test.cxx
@@ -0,0 +1,167 @@
+/*
+  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+*/
+
+// $Id$
+/**
+ * @file EventTPCnv/test/EventInfoCnv_p1_test.cxx
+ * @author scott snyder <snyder@bnl.gov>
+ * @date Jul, 2016
+ * @brief Regression tests.
+ */
+
+#undef NDEBUG
+#include "EventTPCnv/EventInfoCnv_p1.h"
+#include "TestTools/leakcheck.h"
+#include "EventInfo/EventInfo.h"
+#include "EventInfo/EventID.h"
+#include "EventInfo/EventType.h"
+#include "EventInfo/TriggerInfo.h"
+#include "CxxUtils/make_unique.h"
+#include "GaudiKernel/MsgStream.h"
+#include <cassert>
+#include <iostream>
+
+
+void compare (const EventID& p1,
+              const EventID& p2)
+{
+  assert (p1.run_number() == p2.run_number());
+  assert (p1.event_number() == p2.event_number());
+  assert (p1.time_stamp() == p2.time_stamp());
+  assert (p1.time_stamp_ns_offset() == p2.time_stamp_ns_offset());
+  assert (p1.lumi_block() == p2.lumi_block());
+  assert (p1.bunch_crossing_id() == p2.bunch_crossing_id());
+  assert (p1.detector_mask0() == p2.detector_mask0());
+  assert (p1.detector_mask1() == p2.detector_mask1());
+  //assert (p1.detector_mask2() == p2.detector_mask2());
+  //assert (p1.detector_mask3() == p2.detector_mask3());
+}
+
+
+void compare (const EventType& p1,
+              const EventType& p2)
+{
+  EventType::BitMaskIterator beg1 = p1.bit_mask_begin();
+  EventType::BitMaskIterator end1 = p1.bit_mask_end();
+  EventType::BitMaskIterator beg2 = p2.bit_mask_begin();
+  EventType::BitMaskIterator end2 = p2.bit_mask_end();
+  assert (end1-beg1 == end2-beg2);
+  assert (std::equal (beg1, end1, beg2));
+
+  assert (p1.user_type() == p2.user_type());
+  assert (p1.get_detdescr_tags() == p2.get_detdescr_tags());
+
+  assert (p2.n_mc_event_weights() == 1);
+  assert (static_cast<unsigned int>(p1.mc_event_weight(0)) == p2.mc_event_weight(0));
+  //assert (p1.mc_channel_number() == p2.mc_channel_number());
+  //assert (p1.mc_event_number() == p2.mc_event_number());
+}
+
+
+void compare (const TriggerInfo& p1,
+              const TriggerInfo& p2)
+{
+  //assert (p1.statusElement() == p2.statusElement());
+  assert (p1.extendedLevel1ID() == p2.extendedLevel1ID());
+  assert (p1.level1TriggerType() == p2.level1TriggerType());
+  //assert (p1.level1TriggerInfo() == p2.level1TriggerInfo());
+  assert (p2.level2TriggerInfo().size() == 1);
+  assert (p1.level2TriggerInfo()[0] == p2.level2TriggerInfo()[0]);
+  assert (p1.eventFilterInfo() == p2.eventFilterInfo());
+
+  //assert (p1.streamTags().size() == p2.streamTags().size());
+  //for (size_t i = 0; i < p1.streamTags().size(); i++)
+  //  compare (p1.streamTags()[i], p2.streamTags()[i]);
+}
+
+
+void compare (const EventInfo& p1,
+              const EventInfo& p2)
+{
+  compare (*p1.event_ID(), *p2.event_ID());
+  compare (*p1.event_type(), *p2.event_type());
+  compare (*p1.trigger_info(), *p2.trigger_info());
+  compare (*p1.trigger_info(), *p2.trigger_info());
+
+#if 0
+  for (unsigned int i = 0; i < EventInfo::nDets; i++) {
+    EventInfo::EventFlagSubDet ii = static_cast<EventInfo::EventFlagSubDet>(i);
+    assert (p1.eventFlags(ii) == p2.eventFlags(ii));
+    assert (p1.errorState(ii) == p2.errorState(ii));
+  }
+
+  assert (p1.actualInteractionsPerCrossing() == p2.actualInteractionsPerCrossing());
+  assert (p1.averageInteractionsPerCrossing() == p2.averageInteractionsPerCrossing());
+#endif
+}
+
+
+void testit (const EventInfo& trans1)
+{
+  MsgStream log (0, "test");
+  EventInfoCnv_p1 cnv;
+  EventInfo_p1 pers;
+  cnv.transToPers (&trans1, &pers, log);
+  EventInfo trans2;
+  cnv.persToTrans (&pers, &trans2, log);
+  compare (trans1, trans2);
+}
+
+
+void test1()
+{
+  std::cout << "test1\n";
+  Athena_test::Leakcheck check;
+  
+
+  auto id = CxxUtils::make_unique<EventID> (1234, 2345, 3456, 4567, 5678, 6789,
+                                            4321, 5432, 6543, 7654);
+
+  auto etype = CxxUtils::make_unique<EventType>();
+  etype->add_type (3);
+  etype->add_type (13);
+  etype->add_type (25);
+  etype->add_type (101);
+  etype->set_user_type ("utype");
+  etype->set_mc_event_weight (1.5, 0);
+  etype->set_mc_event_weight (2.5, 1);
+  etype->set_mc_event_weight (3.5, 2);
+  etype->set_mc_channel_number (123);
+  etype->set_mc_event_number (345);
+
+  std::vector<TriggerInfo::StreamTag> streamTags;
+  streamTags.emplace_back ("asd", "zzz", true,
+                           std::set<TriggerInfo::number_type> {3, 4},
+                           std::set<TriggerInfo::number_type> {5, 10, 12});
+  streamTags.emplace_back ("fds", "qwe", false,
+                           std::set<TriggerInfo::number_type> {13, 14},
+                           std::set<TriggerInfo::number_type> {15, 110, 112});
+  auto tinfo = CxxUtils::make_unique<TriggerInfo>
+    (123,
+     234,
+     345,
+     std::vector<TriggerInfo::number_type> {6, 7, 8},
+     std::vector<TriggerInfo::number_type> {9, 10},
+     std::vector<TriggerInfo::number_type> {11, 12, 13, 14},
+     streamTags);
+                                                   
+  
+  EventInfo trans1 (id.release(), etype.release(), tinfo.release());
+  for (unsigned int i = 0; i < EventInfo::nDets; i++) {
+    EventInfo::EventFlagSubDet ii = static_cast<EventInfo::EventFlagSubDet>(i);
+    trans1.setEventFlags (ii, i*100+3);
+    trans1.setErrorState (ii, static_cast<EventInfo::EventFlagErrorState>(i%3));
+  }
+  trans1.setActualInteractionsPerCrossing (123.5);
+  trans1.setAverageInteractionsPerCrossing (321.5);
+
+  testit (trans1);
+}
+
+
+int main()
+{
+  test1();
+  return 0;
+}
diff --git a/Event/EventTPCnv/test/EventInfoCnv_p2_test.cxx b/Event/EventTPCnv/test/EventInfoCnv_p2_test.cxx
new file mode 100644
index 0000000000000000000000000000000000000000..1477e368c1575c6b6ab42672e42f30fc4e9269d3
--- /dev/null
+++ b/Event/EventTPCnv/test/EventInfoCnv_p2_test.cxx
@@ -0,0 +1,175 @@
+/*
+  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+*/
+
+// $Id$
+/**
+ * @file EventTPCnv/test/EventInfoCnv_p2_test.cxx
+ * @author scott snyder <snyder@bnl.gov>
+ * @date Jul, 2016
+ * @brief Regression tests.
+ */
+
+#undef NDEBUG
+#include "EventTPCnv/EventInfoCnv_p2.h"
+#include "TestTools/leakcheck.h"
+#include "EventInfo/EventInfo.h"
+#include "EventInfo/EventID.h"
+#include "EventInfo/EventType.h"
+#include "EventInfo/TriggerInfo.h"
+#include "CxxUtils/make_unique.h"
+#include "GaudiKernel/MsgStream.h"
+#include <cassert>
+#include <iostream>
+
+
+void compare (const EventID& p1,
+              const EventID& p2)
+{
+  assert (p1.run_number() == p2.run_number());
+  assert (p1.event_number() == p2.event_number());
+  assert (p1.time_stamp() == p2.time_stamp());
+  assert (p1.time_stamp_ns_offset() == p2.time_stamp_ns_offset());
+  assert (p1.lumi_block() == p2.lumi_block());
+  assert (p1.bunch_crossing_id() == p2.bunch_crossing_id());
+  assert (p1.detector_mask0() == p2.detector_mask0());
+  assert (p1.detector_mask1() == p2.detector_mask1());
+  //assert (p1.detector_mask2() == p2.detector_mask2());
+  //assert (p1.detector_mask3() == p2.detector_mask3());
+}
+
+
+void compare (const EventType& p1,
+              const EventType& p2)
+{
+  EventType::BitMaskIterator beg1 = p1.bit_mask_begin();
+  EventType::BitMaskIterator end1 = p1.bit_mask_end();
+  EventType::BitMaskIterator beg2 = p2.bit_mask_begin();
+  EventType::BitMaskIterator end2 = p2.bit_mask_end();
+  assert (end1-beg1 == end2-beg2);
+  assert (std::equal (beg1, end1, beg2));
+
+  assert (p1.user_type() == p2.user_type());
+  assert (p1.get_detdescr_tags() == p2.get_detdescr_tags());
+
+  assert (p2.n_mc_event_weights() == 1);
+  assert (static_cast<unsigned int>(p1.mc_event_weight(0)) == p2.mc_event_weight(0));
+  //assert (p1.mc_channel_number() == p2.mc_channel_number());
+  //assert (p1.mc_event_number() == p2.mc_event_number());
+}
+
+
+void compare (const TriggerInfo::StreamTag& p1,
+              const TriggerInfo::StreamTag& p2)
+{
+  assert (p1.name() == p2.name());
+  assert (p1.type() == p2.type());
+  assert (p1.obeysLumiblock() == p2.obeysLumiblock());
+  //assert (p1.robs() == p2.robs());
+  //assert (p1.dets() == p2.dets());
+}
+
+
+void compare (const TriggerInfo& p1,
+              const TriggerInfo& p2)
+{
+  assert (p1.statusElement() == p2.statusElement());
+  assert (p1.extendedLevel1ID() == p2.extendedLevel1ID());
+  assert (p1.level1TriggerType() == p2.level1TriggerType());
+  assert (p1.level1TriggerInfo() == p2.level1TriggerInfo());
+  assert (p1.level2TriggerInfo() == p2.level2TriggerInfo());
+  assert (p1.eventFilterInfo() == p2.eventFilterInfo());
+
+  assert (p1.streamTags().size() == p2.streamTags().size());
+  for (size_t i = 0; i < p1.streamTags().size(); i++)
+    compare (p1.streamTags()[i], p2.streamTags()[i]);
+}
+
+
+void compare (const EventInfo& p1,
+              const EventInfo& p2)
+{
+  compare (*p1.event_ID(), *p2.event_ID());
+  compare (*p1.event_type(), *p2.event_type());
+  compare (*p1.trigger_info(), *p2.trigger_info());
+  compare (*p1.trigger_info(), *p2.trigger_info());
+
+  for (unsigned int i = 0; i < EventInfo::nDets; i++) {
+    EventInfo::EventFlagSubDet ii = static_cast<EventInfo::EventFlagSubDet>(i);
+    assert (p1.eventFlags(ii) == p2.eventFlags(ii));
+    assert (p1.errorState(ii) == p2.errorState(ii));
+  }
+
+  assert (p1.actualInteractionsPerCrossing() == p2.actualInteractionsPerCrossing());
+  assert (p1.averageInteractionsPerCrossing() == p2.averageInteractionsPerCrossing());
+}
+
+
+void testit (const EventInfo& trans1)
+{
+  MsgStream log (0, "test");
+  EventInfoCnv_p2 cnv;
+  EventInfo_p2 pers;
+  cnv.transToPers (&trans1, &pers, log);
+  EventInfo trans2;
+  cnv.persToTrans (&pers, &trans2, log);
+  compare (trans1, trans2);
+}
+
+
+void test1()
+{
+  std::cout << "test1\n";
+  Athena_test::Leakcheck check;
+  
+
+  auto id = CxxUtils::make_unique<EventID> (1234, 2345, 3456, 4567, 5678, 6789,
+                                            4321, 5432, 6543, 7654);
+
+  auto etype = CxxUtils::make_unique<EventType>();
+  etype->add_type (3);
+  etype->add_type (13);
+  etype->add_type (25);
+  etype->add_type (101);
+  etype->set_user_type ("utype");
+  etype->set_mc_event_weight (1.5, 0);
+  etype->set_mc_event_weight (2.5, 1);
+  etype->set_mc_event_weight (3.5, 2);
+  etype->set_mc_channel_number (123);
+  etype->set_mc_event_number (345);
+
+  std::vector<TriggerInfo::StreamTag> streamTags;
+  streamTags.emplace_back ("asd", "zzz", true,
+                           std::set<TriggerInfo::number_type> {3, 4},
+                           std::set<TriggerInfo::number_type> {5, 10, 12});
+  streamTags.emplace_back ("fds", "qwe", false,
+                           std::set<TriggerInfo::number_type> {13, 14},
+                           std::set<TriggerInfo::number_type> {15, 110, 112});
+  auto tinfo = CxxUtils::make_unique<TriggerInfo>
+    (123,
+     234,
+     345,
+     std::vector<TriggerInfo::number_type> {6, 7, 8},
+     std::vector<TriggerInfo::number_type> {9, 10},
+     std::vector<TriggerInfo::number_type> {11, 12, 13, 14},
+     streamTags);
+                                                   
+  
+  EventInfo trans1 (id.release(), etype.release(), tinfo.release());
+  for (unsigned int i = 0; i < EventInfo::nDets; i++) {
+    EventInfo::EventFlagSubDet ii = static_cast<EventInfo::EventFlagSubDet>(i);
+    trans1.setEventFlags (ii, i*100+3);
+    trans1.setErrorState (ii, static_cast<EventInfo::EventFlagErrorState>(i%3));
+  }
+  trans1.setActualInteractionsPerCrossing (123.5);
+  trans1.setAverageInteractionsPerCrossing (321.5);
+
+  testit (trans1);
+}
+
+
+int main()
+{
+  test1();
+  return 0;
+}
diff --git a/Event/EventTPCnv/test/EventInfoCnv_p3_test.cxx b/Event/EventTPCnv/test/EventInfoCnv_p3_test.cxx
new file mode 100644
index 0000000000000000000000000000000000000000..348a1acb4602e688951f6f0f4a600dbe2124b8a9
--- /dev/null
+++ b/Event/EventTPCnv/test/EventInfoCnv_p3_test.cxx
@@ -0,0 +1,175 @@
+/*
+  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+*/
+
+// $Id$
+/**
+ * @file EventTPCnv/test/EventInfoCnv_p3_test.cxx
+ * @author scott snyder <snyder@bnl.gov>
+ * @date Jul, 2016
+ * @brief Regression tests.
+ */
+
+#undef NDEBUG
+#include "EventTPCnv/EventInfoCnv_p3.h"
+#include "TestTools/leakcheck.h"
+#include "EventInfo/EventInfo.h"
+#include "EventInfo/EventID.h"
+#include "EventInfo/EventType.h"
+#include "EventInfo/TriggerInfo.h"
+#include "CxxUtils/make_unique.h"
+#include "GaudiKernel/MsgStream.h"
+#include <cassert>
+#include <iostream>
+
+
+void compare (const EventID& p1,
+              const EventID& p2)
+{
+  assert (p1.run_number() == p2.run_number());
+  assert (p1.event_number() == p2.event_number());
+  assert (p1.time_stamp() == p2.time_stamp());
+  assert (p1.time_stamp_ns_offset() == p2.time_stamp_ns_offset());
+  assert (p1.lumi_block() == p2.lumi_block());
+  assert (p1.bunch_crossing_id() == p2.bunch_crossing_id());
+  assert (p1.detector_mask0() == p2.detector_mask0());
+  assert (p1.detector_mask1() == p2.detector_mask1());
+  //assert (p1.detector_mask2() == p2.detector_mask2());
+  //assert (p1.detector_mask3() == p2.detector_mask3());
+}
+
+
+void compare (const EventType& p1,
+              const EventType& p2)
+{
+  EventType::BitMaskIterator beg1 = p1.bit_mask_begin();
+  EventType::BitMaskIterator end1 = p1.bit_mask_end();
+  EventType::BitMaskIterator beg2 = p2.bit_mask_begin();
+  EventType::BitMaskIterator end2 = p2.bit_mask_end();
+  assert (end1-beg1 == end2-beg2);
+  assert (std::equal (beg1, end1, beg2));
+
+  assert (p1.user_type() == p2.user_type());
+  assert (p1.get_detdescr_tags() == p2.get_detdescr_tags());
+
+  assert (p2.n_mc_event_weights() == 1);
+  assert (p1.mc_event_weight(0) == p2.mc_event_weight(0));
+  assert (p1.mc_channel_number() == p2.mc_channel_number());
+  assert (p1.mc_event_number() == p2.mc_event_number());
+}
+
+
+void compare (const TriggerInfo::StreamTag& p1,
+              const TriggerInfo::StreamTag& p2)
+{
+  assert (p1.name() == p2.name());
+  assert (p1.type() == p2.type());
+  assert (p1.obeysLumiblock() == p2.obeysLumiblock());
+  //assert (p1.robs() == p2.robs());
+  //assert (p1.dets() == p2.dets());
+}
+
+
+void compare (const TriggerInfo& p1,
+              const TriggerInfo& p2)
+{
+  assert (p1.statusElement() == p2.statusElement());
+  assert (p1.extendedLevel1ID() == p2.extendedLevel1ID());
+  assert (p1.level1TriggerType() == p2.level1TriggerType());
+  assert (p1.level1TriggerInfo() == p2.level1TriggerInfo());
+  assert (p1.level2TriggerInfo() == p2.level2TriggerInfo());
+  assert (p1.eventFilterInfo() == p2.eventFilterInfo());
+
+  assert (p1.streamTags().size() == p2.streamTags().size());
+  for (size_t i = 0; i < p1.streamTags().size(); i++)
+    compare (p1.streamTags()[i], p2.streamTags()[i]);
+}
+
+
+void compare (const EventInfo& p1,
+              const EventInfo& p2)
+{
+  compare (*p1.event_ID(), *p2.event_ID());
+  compare (*p1.event_type(), *p2.event_type());
+  compare (*p1.trigger_info(), *p2.trigger_info());
+  compare (*p1.trigger_info(), *p2.trigger_info());
+
+  for (unsigned int i = 0; i < EventInfo::nDets; i++) {
+    EventInfo::EventFlagSubDet ii = static_cast<EventInfo::EventFlagSubDet>(i);
+    assert (p1.eventFlags(ii) == p2.eventFlags(ii));
+    assert (p1.errorState(ii) == p2.errorState(ii));
+  }
+
+  assert (p1.actualInteractionsPerCrossing() == p2.actualInteractionsPerCrossing());
+  assert (p1.averageInteractionsPerCrossing() == p2.averageInteractionsPerCrossing());
+}
+
+
+void testit (const EventInfo& trans1)
+{
+  MsgStream log (0, "test");
+  EventInfoCnv_p3 cnv;
+  EventInfo_p3 pers;
+  cnv.transToPers (&trans1, &pers, log);
+  EventInfo trans2;
+  cnv.persToTrans (&pers, &trans2, log);
+  compare (trans1, trans2);
+}
+
+
+void test1()
+{
+  std::cout << "test1\n";
+  Athena_test::Leakcheck check;
+  
+
+  auto id = CxxUtils::make_unique<EventID> (1234, 2345, 3456, 4567, 5678, 6789,
+                                            4321, 5432, 6543, 7654);
+
+  auto etype = CxxUtils::make_unique<EventType>();
+  etype->add_type (3);
+  etype->add_type (13);
+  etype->add_type (25);
+  etype->add_type (101);
+  etype->set_user_type ("utype");
+  etype->set_mc_event_weight (1.5, 0);
+  etype->set_mc_event_weight (2.5, 1);
+  etype->set_mc_event_weight (3.5, 2);
+  etype->set_mc_channel_number (123);
+  etype->set_mc_event_number (345);
+
+  std::vector<TriggerInfo::StreamTag> streamTags;
+  streamTags.emplace_back ("asd", "zzz", true,
+                           std::set<TriggerInfo::number_type> {3, 4},
+                           std::set<TriggerInfo::number_type> {5, 10, 12});
+  streamTags.emplace_back ("fds", "qwe", false,
+                           std::set<TriggerInfo::number_type> {13, 14},
+                           std::set<TriggerInfo::number_type> {15, 110, 112});
+  auto tinfo = CxxUtils::make_unique<TriggerInfo>
+    (123,
+     234,
+     345,
+     std::vector<TriggerInfo::number_type> {6, 7, 8},
+     std::vector<TriggerInfo::number_type> {9, 10},
+     std::vector<TriggerInfo::number_type> {11, 12, 13, 14},
+     streamTags);
+                                                   
+  
+  EventInfo trans1 (id.release(), etype.release(), tinfo.release());
+  for (unsigned int i = 0; i < EventInfo::nDets; i++) {
+    EventInfo::EventFlagSubDet ii = static_cast<EventInfo::EventFlagSubDet>(i);
+    trans1.setEventFlags (ii, i*100+3);
+    trans1.setErrorState (ii, static_cast<EventInfo::EventFlagErrorState>(i%3));
+  }
+  trans1.setActualInteractionsPerCrossing (123.5);
+  trans1.setAverageInteractionsPerCrossing (321.5);
+
+  testit (trans1);
+}
+
+
+int main()
+{
+  test1();
+  return 0;
+}
diff --git a/Event/EventTPCnv/test/EventInfoCnv_p4_test.cxx b/Event/EventTPCnv/test/EventInfoCnv_p4_test.cxx
new file mode 100644
index 0000000000000000000000000000000000000000..de086bec8e2e2dad0f66089755cd4bf9afec65ab
--- /dev/null
+++ b/Event/EventTPCnv/test/EventInfoCnv_p4_test.cxx
@@ -0,0 +1,176 @@
+/*
+  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+*/
+
+// $Id$
+/**
+ * @file EventTPCnv/test/EventInfoCnv_p4_test.cxx
+ * @author scott snyder <snyder@bnl.gov>
+ * @date Jul, 2016
+ * @brief Regression tests.
+ */
+
+#undef NDEBUG
+#include "EventTPCnv/EventInfoCnv_p4.h"
+#include "TestTools/leakcheck.h"
+#include "EventInfo/EventInfo.h"
+#include "EventInfo/EventID.h"
+#include "EventInfo/EventType.h"
+#include "EventInfo/TriggerInfo.h"
+#include "CxxUtils/make_unique.h"
+#include "GaudiKernel/MsgStream.h"
+#include <cassert>
+#include <iostream>
+
+
+void compare (const EventID& p1,
+              const EventID& p2)
+{
+  assert (p1.run_number() == p2.run_number());
+  assert (p1.event_number() == p2.event_number());
+  assert (p1.time_stamp() == p2.time_stamp());
+  assert (p1.time_stamp_ns_offset() == p2.time_stamp_ns_offset());
+  assert (p1.lumi_block() == p2.lumi_block());
+  assert (p1.bunch_crossing_id() == p2.bunch_crossing_id());
+  assert (p1.detector_mask0() == p2.detector_mask0());
+  assert (p1.detector_mask1() == p2.detector_mask1());
+  assert (p1.detector_mask2() == p2.detector_mask2());
+  assert (p1.detector_mask3() == p2.detector_mask3());
+}
+
+
+void compare (const EventType& p1,
+              const EventType& p2)
+{
+  EventType::BitMaskIterator beg1 = p1.bit_mask_begin();
+  EventType::BitMaskIterator end1 = p1.bit_mask_end();
+  EventType::BitMaskIterator beg2 = p2.bit_mask_begin();
+  EventType::BitMaskIterator end2 = p2.bit_mask_end();
+  assert (end1-beg1 == end2-beg2);
+  assert (std::equal (beg1, end1, beg2));
+
+  assert (p1.user_type() == p2.user_type());
+  assert (p1.get_detdescr_tags() == p2.get_detdescr_tags());
+
+  assert (p1.n_mc_event_weights() == p2.n_mc_event_weights());
+  for (unsigned int i = 0; i < p1.n_mc_event_weights(); i++)
+    assert (p1.mc_event_weight(i) == p2.mc_event_weight(i));
+  assert (p1.mc_channel_number() == p2.mc_channel_number());
+  assert (p1.mc_event_number() == p2.mc_event_number());
+}
+
+
+void compare (const TriggerInfo::StreamTag& p1,
+              const TriggerInfo::StreamTag& p2)
+{
+  assert (p1.name() == p2.name());
+  assert (p1.type() == p2.type());
+  assert (p1.obeysLumiblock() == p2.obeysLumiblock());
+  //assert (p1.robs() == p2.robs());
+  //assert (p1.dets() == p2.dets());
+}
+
+
+void compare (const TriggerInfo& p1,
+              const TriggerInfo& p2)
+{
+  assert (p1.statusElement() == p2.statusElement());
+  assert (p1.extendedLevel1ID() == p2.extendedLevel1ID());
+  assert (p1.level1TriggerType() == p2.level1TriggerType());
+  assert (p1.level1TriggerInfo() == p2.level1TriggerInfo());
+  assert (p1.level2TriggerInfo() == p2.level2TriggerInfo());
+  assert (p1.eventFilterInfo() == p2.eventFilterInfo());
+
+  assert (p1.streamTags().size() == p2.streamTags().size());
+  for (size_t i = 0; i < p1.streamTags().size(); i++)
+    compare (p1.streamTags()[i], p2.streamTags()[i]);
+}
+
+
+void compare (const EventInfo& p1,
+              const EventInfo& p2)
+{
+  compare (*p1.event_ID(), *p2.event_ID());
+  compare (*p1.event_type(), *p2.event_type());
+  compare (*p1.trigger_info(), *p2.trigger_info());
+  compare (*p1.trigger_info(), *p2.trigger_info());
+
+  for (unsigned int i = 0; i < EventInfo::nDets; i++) {
+    EventInfo::EventFlagSubDet ii = static_cast<EventInfo::EventFlagSubDet>(i);
+    assert (p1.eventFlags(ii) == p2.eventFlags(ii));
+    assert (p1.errorState(ii) == p2.errorState(ii));
+  }
+
+  assert (p1.actualInteractionsPerCrossing() == p2.actualInteractionsPerCrossing());
+  assert (p1.averageInteractionsPerCrossing() == p2.averageInteractionsPerCrossing());
+}
+
+
+void testit (const EventInfo& trans1)
+{
+  MsgStream log (0, "test");
+  EventInfoCnv_p4 cnv;
+  EventInfo_p4 pers;
+  cnv.transToPers (&trans1, &pers, log);
+  EventInfo trans2;
+  cnv.persToTrans (&pers, &trans2, log);
+  compare (trans1, trans2);
+}
+
+
+void test1()
+{
+  std::cout << "test1\n";
+  Athena_test::Leakcheck check;
+  
+
+  auto id = CxxUtils::make_unique<EventID> (1234, 2345, 3456, 4567, 5678, 6789,
+                                            4321, 5432, 6543, 7654);
+
+  auto etype = CxxUtils::make_unique<EventType>();
+  etype->add_type (3);
+  etype->add_type (13);
+  etype->add_type (25);
+  etype->add_type (101);
+  etype->set_user_type ("utype");
+  etype->set_mc_event_weight (1.5, 0);
+  etype->set_mc_event_weight (2.5, 1);
+  etype->set_mc_event_weight (3.5, 2);
+  etype->set_mc_channel_number (123);
+  etype->set_mc_event_number (345);
+
+  std::vector<TriggerInfo::StreamTag> streamTags;
+  streamTags.emplace_back ("asd", "zzz", true,
+                           std::set<TriggerInfo::number_type> {3, 4},
+                           std::set<TriggerInfo::number_type> {5, 10, 12});
+  streamTags.emplace_back ("fds", "qwe", false,
+                           std::set<TriggerInfo::number_type> {13, 14},
+                           std::set<TriggerInfo::number_type> {15, 110, 112});
+  auto tinfo = CxxUtils::make_unique<TriggerInfo>
+    (123,
+     234,
+     345,
+     std::vector<TriggerInfo::number_type> {6, 7, 8},
+     std::vector<TriggerInfo::number_type> {9, 10},
+     std::vector<TriggerInfo::number_type> {11, 12, 13, 14},
+     streamTags);
+                                                   
+  
+  EventInfo trans1 (id.release(), etype.release(), tinfo.release());
+  for (unsigned int i = 0; i < EventInfo::nDets; i++) {
+    EventInfo::EventFlagSubDet ii = static_cast<EventInfo::EventFlagSubDet>(i);
+    trans1.setEventFlags (ii, i*100+3);
+    trans1.setErrorState (ii, static_cast<EventInfo::EventFlagErrorState>(i%3));
+  }
+  trans1.setActualInteractionsPerCrossing (123.5);
+  trans1.setAverageInteractionsPerCrossing (321.5);
+
+  testit (trans1);
+}
+
+
+int main()
+{
+  test1();
+  return 0;
+}
diff --git a/Event/EventTPCnv/test/EventStreamInfoCnv_p1_test.cxx b/Event/EventTPCnv/test/EventStreamInfoCnv_p1_test.cxx
new file mode 100644
index 0000000000000000000000000000000000000000..37a3bd2025c150ba8e589e4844322a4f7b96fac1
--- /dev/null
+++ b/Event/EventTPCnv/test/EventStreamInfoCnv_p1_test.cxx
@@ -0,0 +1,125 @@
+/*
+  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+*/
+
+// $Id$
+/**
+ * @file EventTPCnv/test/EventStreamInfoCnv_p1_test.cxx
+ * @author scott snyder <snyder@bnl.gov>
+ * @date Jul, 2016
+ * @brief Regression tests.
+ */
+
+#undef NDEBUG
+#include "EventTPCnv/EventStreamInfoCnv_p1.h"
+#include "TestTools/leakcheck.h"
+#include "EventInfo/EventStreamInfo.h"
+#include "GaudiKernel/MsgStream.h"
+#include <cassert>
+#include <iostream>
+
+
+void compare (const EventType& p1,
+              const EventType& p2)
+{
+  EventType::BitMaskIterator beg1 = p1.bit_mask_begin();
+  EventType::BitMaskIterator end1 = p1.bit_mask_end();
+  EventType::BitMaskIterator beg2 = p2.bit_mask_begin();
+  EventType::BitMaskIterator end2 = p2.bit_mask_end();
+  assert (end1-beg1 == end2-beg2);
+  assert (std::equal (beg1, end1, beg2));
+
+  assert (p1.user_type() == p2.user_type());
+  assert (p1.get_detdescr_tags() == p2.get_detdescr_tags());
+
+  assert (p2.n_mc_event_weights() == 1);
+  assert (static_cast<unsigned int>(p1.mc_event_weight(0)) == p2.mc_event_weight(0));
+  //assert (p1.mc_channel_number() == p2.mc_channel_number());
+  //assert (p1.mc_event_number() == p2.mc_event_number());
+}
+
+
+void compare (const EventStreamInfo& p1,
+              const EventStreamInfo& p2)
+{
+  assert (p1.getNumberOfEvents() == p2.getNumberOfEvents());
+  assert (p1.getRunNumbers() == p2.getRunNumbers());
+  assert (p1.getLumiBlockNumbers() == p2.getLumiBlockNumbers());
+  assert (p1.getProcessingTags() == p2.getProcessingTags());
+  assert (p1.getItemList() == p2.getItemList());
+  const std::set<EventType>& s1 = p1.getEventTypes();
+  const std::set<EventType>& s2 = p2.getEventTypes();
+  assert (s1.size() == s2.size());
+  std::set<EventType>::const_iterator it1 = s1.begin();
+  std::set<EventType>::const_iterator it2 = s2.begin();
+  for (; it1 != s1.end(); ++it1, ++it2)
+    compare (*it1, *it2);
+}
+
+
+void testit (const EventStreamInfo& trans1)
+{
+  MsgStream log (0, "test");
+  EventStreamInfoCnv_p1 cnv;
+  EventStreamInfo_p1 pers;
+  cnv.transToPers (&trans1, &pers, log);
+  EventStreamInfo trans2;
+  cnv.persToTrans (&pers, &trans2, log);
+  compare (trans1, trans2);
+}
+
+
+void test1()
+{
+  std::cout << "test1\n";
+  Athena_test::Leakcheck check;
+  
+
+  EventStreamInfo trans1;
+  trans1.addEvent (1234);
+  trans1.insertRunNumber(234);
+  trans1.insertRunNumber(345);
+  trans1.insertLumiBlockNumber(456);
+  trans1.insertLumiBlockNumber(567);
+  trans1.insertLumiBlockNumber(678);
+  trans1.insertProcessingTag("asd");
+  trans1.insertProcessingTag("sdf");
+  trans1.insertItemList(321, "gfd");
+  trans1.insertItemList(432, "lkj");
+                                                   
+  EventType etype1;
+  etype1.add_type (3);
+  etype1.add_type (13);
+  etype1.add_type (25);
+  etype1.add_type (101);
+  etype1.set_user_type ("utype");
+  etype1.set_mc_event_weight (1.5, 0);
+  etype1.set_mc_event_weight (2.5, 1);
+  etype1.set_mc_event_weight (3.5, 2);
+  etype1.set_mc_channel_number (123);
+  etype1.set_mc_event_number (345);
+
+  EventType etype2;
+  etype2.add_type (13);
+  etype2.add_type (113);
+  etype2.add_type (125);
+  etype2.add_type (1101);
+  etype2.set_user_type ("xtype");
+  etype2.set_mc_event_weight (11.5, 0);
+  etype2.set_mc_event_weight (12.5, 1);
+  etype2.set_mc_event_weight (13.5, 2);
+  etype2.set_mc_channel_number (1123);
+  etype2.set_mc_event_number (1345);
+
+  trans1.insertEventType (etype1);
+  trans1.insertEventType (etype2);
+
+  testit (trans1);
+}
+
+
+int main()
+{
+  test1();
+  return 0;
+}
diff --git a/Event/EventTPCnv/test/EventStreamInfoCnv_p2_test.cxx b/Event/EventTPCnv/test/EventStreamInfoCnv_p2_test.cxx
new file mode 100644
index 0000000000000000000000000000000000000000..784ff5c40ee1a4d40e46050ccb537a8e3e08ec4a
--- /dev/null
+++ b/Event/EventTPCnv/test/EventStreamInfoCnv_p2_test.cxx
@@ -0,0 +1,125 @@
+/*
+  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+*/
+
+// $Id$
+/**
+ * @file EventTPCnv/test/EventStreamInfoCnv_p2_test.cxx
+ * @author scott snyder <snyder@bnl.gov>
+ * @date Jul, 2016
+ * @brief Regression tests.
+ */
+
+#undef NDEBUG
+#include "EventTPCnv/EventStreamInfoCnv_p2.h"
+#include "TestTools/leakcheck.h"
+#include "EventInfo/EventStreamInfo.h"
+#include "GaudiKernel/MsgStream.h"
+#include <cassert>
+#include <iostream>
+
+
+void compare (const EventType& p1,
+              const EventType& p2)
+{
+  EventType::BitMaskIterator beg1 = p1.bit_mask_begin();
+  EventType::BitMaskIterator end1 = p1.bit_mask_end();
+  EventType::BitMaskIterator beg2 = p2.bit_mask_begin();
+  EventType::BitMaskIterator end2 = p2.bit_mask_end();
+  assert (end1-beg1 == end2-beg2);
+  assert (std::equal (beg1, end1, beg2));
+
+  assert (p1.user_type() == p2.user_type());
+  assert (p1.get_detdescr_tags() == p2.get_detdescr_tags());
+
+  assert (p2.n_mc_event_weights() == 1);
+  assert (static_cast<unsigned int>(p1.mc_event_weight(0)) == p2.mc_event_weight(0));
+  //assert (p1.mc_channel_number() == p2.mc_channel_number());
+  //assert (p1.mc_event_number() == p2.mc_event_number());
+}
+
+
+void compare (const EventStreamInfo& p1,
+              const EventStreamInfo& p2)
+{
+  assert (p1.getNumberOfEvents() == p2.getNumberOfEvents());
+  assert (p1.getRunNumbers() == p2.getRunNumbers());
+  assert (p1.getLumiBlockNumbers() == p2.getLumiBlockNumbers());
+  assert (p1.getProcessingTags() == p2.getProcessingTags());
+  assert (p1.getItemList() == p2.getItemList());
+  const std::set<EventType>& s1 = p1.getEventTypes();
+  const std::set<EventType>& s2 = p2.getEventTypes();
+  assert (s1.size() == s2.size());
+  std::set<EventType>::const_iterator it1 = s1.begin();
+  std::set<EventType>::const_iterator it2 = s2.begin();
+  for (; it1 != s1.end(); ++it1, ++it2)
+    compare (*it1, *it2);
+}
+
+
+void testit (const EventStreamInfo& trans1)
+{
+  MsgStream log (0, "test");
+  EventStreamInfoCnv_p2 cnv;
+  EventStreamInfo_p2 pers;
+  cnv.transToPers (&trans1, &pers, log);
+  EventStreamInfo trans2;
+  cnv.persToTrans (&pers, &trans2, log);
+  compare (trans1, trans2);
+}
+
+
+void test1()
+{
+  std::cout << "test1\n";
+  Athena_test::Leakcheck check;
+  
+
+  EventStreamInfo trans1;
+  trans1.addEvent (1234);
+  trans1.insertRunNumber(234);
+  trans1.insertRunNumber(345);
+  trans1.insertLumiBlockNumber(456);
+  trans1.insertLumiBlockNumber(567);
+  trans1.insertLumiBlockNumber(678);
+  trans1.insertProcessingTag("asd");
+  trans1.insertProcessingTag("sdf");
+  trans1.insertItemList(321, "gfd");
+  trans1.insertItemList(432, "lkj");
+                                                   
+  EventType etype1;
+  etype1.add_type (3);
+  etype1.add_type (13);
+  etype1.add_type (25);
+  etype1.add_type (101);
+  etype1.set_user_type ("utype");
+  etype1.set_mc_event_weight (1.5, 0);
+  etype1.set_mc_event_weight (2.5, 1);
+  etype1.set_mc_event_weight (3.5, 2);
+  etype1.set_mc_channel_number (123);
+  etype1.set_mc_event_number (345);
+
+  EventType etype2;
+  etype2.add_type (13);
+  etype2.add_type (113);
+  etype2.add_type (125);
+  etype2.add_type (1101);
+  etype2.set_user_type ("xtype");
+  etype2.set_mc_event_weight (11.5, 0);
+  etype2.set_mc_event_weight (12.5, 1);
+  etype2.set_mc_event_weight (13.5, 2);
+  etype2.set_mc_channel_number (1123);
+  etype2.set_mc_event_number (1345);
+
+  trans1.insertEventType (etype1);
+  trans1.insertEventType (etype2);
+
+  testit (trans1);
+}
+
+
+int main()
+{
+  test1();
+  return 0;
+}
diff --git a/Event/EventTPCnv/test/EventStreamInfoCnv_p3_test.cxx b/Event/EventTPCnv/test/EventStreamInfoCnv_p3_test.cxx
new file mode 100644
index 0000000000000000000000000000000000000000..032e17bdcddd953da66f1c8abb455c41311d3d2c
--- /dev/null
+++ b/Event/EventTPCnv/test/EventStreamInfoCnv_p3_test.cxx
@@ -0,0 +1,126 @@
+/*
+  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+*/
+
+// $Id$
+/**
+ * @file EventTPCnv/test/EventStreamInfoCnv_p3_test.cxx
+ * @author scott snyder <snyder@bnl.gov>
+ * @date Jul, 2016
+ * @brief Regression tests.
+ */
+
+#undef NDEBUG
+#include "EventTPCnv/EventStreamInfoCnv_p3.h"
+#include "TestTools/leakcheck.h"
+#include "EventInfo/EventStreamInfo.h"
+#include "GaudiKernel/MsgStream.h"
+#include <cassert>
+#include <iostream>
+
+
+void compare (const EventType& p1,
+              const EventType& p2)
+{
+  EventType::BitMaskIterator beg1 = p1.bit_mask_begin();
+  EventType::BitMaskIterator end1 = p1.bit_mask_end();
+  EventType::BitMaskIterator beg2 = p2.bit_mask_begin();
+  EventType::BitMaskIterator end2 = p2.bit_mask_end();
+  assert (end1-beg1 == end2-beg2);
+  assert (std::equal (beg1, end1, beg2));
+
+  assert (p1.user_type() == p2.user_type());
+  assert (p1.get_detdescr_tags() == p2.get_detdescr_tags());
+
+  assert (p1.n_mc_event_weights() == p2.n_mc_event_weights());
+  for (unsigned int i = 0; i < p1.n_mc_event_weights(); i++)
+    assert (p1.mc_event_weight(i) == p2.mc_event_weight(i));
+  assert (p1.mc_channel_number() == p2.mc_channel_number());
+  assert (p1.mc_event_number() == p2.mc_event_number());
+}
+
+
+void compare (const EventStreamInfo& p1,
+              const EventStreamInfo& p2)
+{
+  assert (p1.getNumberOfEvents() == p2.getNumberOfEvents());
+  assert (p1.getRunNumbers() == p2.getRunNumbers());
+  assert (p1.getLumiBlockNumbers() == p2.getLumiBlockNumbers());
+  assert (p1.getProcessingTags() == p2.getProcessingTags());
+  assert (p1.getItemList() == p2.getItemList());
+  const std::set<EventType>& s1 = p1.getEventTypes();
+  const std::set<EventType>& s2 = p2.getEventTypes();
+  assert (s1.size() == s2.size());
+  std::set<EventType>::const_iterator it1 = s1.begin();
+  std::set<EventType>::const_iterator it2 = s2.begin();
+  for (; it1 != s1.end(); ++it1, ++it2)
+    compare (*it1, *it2);
+}
+
+
+void testit (const EventStreamInfo& trans1)
+{
+  MsgStream log (0, "test");
+  EventStreamInfoCnv_p3 cnv;
+  EventStreamInfo_p3 pers;
+  cnv.transToPers (&trans1, &pers, log);
+  EventStreamInfo trans2;
+  cnv.persToTrans (&pers, &trans2, log);
+  compare (trans1, trans2);
+}
+
+
+void test1()
+{
+  std::cout << "test1\n";
+  Athena_test::Leakcheck check;
+  
+
+  EventStreamInfo trans1;
+  trans1.addEvent (1234);
+  trans1.insertRunNumber(234);
+  trans1.insertRunNumber(345);
+  trans1.insertLumiBlockNumber(456);
+  trans1.insertLumiBlockNumber(567);
+  trans1.insertLumiBlockNumber(678);
+  trans1.insertProcessingTag("asd");
+  trans1.insertProcessingTag("sdf");
+  trans1.insertItemList(321, "gfd");
+  trans1.insertItemList(432, "lkj");
+                                                   
+  EventType etype1;
+  etype1.add_type (3);
+  etype1.add_type (13);
+  etype1.add_type (25);
+  etype1.add_type (101);
+  etype1.set_user_type ("utype");
+  etype1.set_mc_event_weight (1.5, 0);
+  etype1.set_mc_event_weight (2.5, 1);
+  etype1.set_mc_event_weight (3.5, 2);
+  etype1.set_mc_channel_number (123);
+  etype1.set_mc_event_number (345);
+
+  EventType etype2;
+  etype2.add_type (13);
+  etype2.add_type (113);
+  etype2.add_type (125);
+  etype2.add_type (1101);
+  etype2.set_user_type ("xtype");
+  etype2.set_mc_event_weight (11.5, 0);
+  etype2.set_mc_event_weight (12.5, 1);
+  etype2.set_mc_event_weight (13.5, 2);
+  etype2.set_mc_channel_number (1123);
+  etype2.set_mc_event_number (1345);
+
+  trans1.insertEventType (etype1);
+  trans1.insertEventType (etype2);
+
+  testit (trans1);
+}
+
+
+int main()
+{
+  test1();
+  return 0;
+}
diff --git a/Event/EventTPCnv/test/EventTypeCnv_p1_test.cxx b/Event/EventTPCnv/test/EventTypeCnv_p1_test.cxx
new file mode 100644
index 0000000000000000000000000000000000000000..00b238653e6650e26dedfca26d12b2a664ea1c61
--- /dev/null
+++ b/Event/EventTPCnv/test/EventTypeCnv_p1_test.cxx
@@ -0,0 +1,80 @@
+/*
+  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+*/
+
+// $Id$
+/**
+ * @file EventTPCnv/test/EventTypeCnv_p1_test.cxx
+ * @author scott snyder <snyder@bnl.gov>
+ * @date Jul, 2016
+ * @brief Regression tests.
+ */
+
+#undef NDEBUG
+#include "EventTPCnv/EventTypeCnv_p1.h"
+#include "TestTools/leakcheck.h"
+#include "EventInfo/EventType.h"
+#include "GaudiKernel/MsgStream.h"
+#include <cassert>
+#include <iostream>
+
+
+void compare (const EventType& p1,
+              const EventType& p2)
+{
+  EventType::BitMaskIterator beg1 = p1.bit_mask_begin();
+  EventType::BitMaskIterator end1 = p1.bit_mask_end();
+  EventType::BitMaskIterator beg2 = p2.bit_mask_begin();
+  EventType::BitMaskIterator end2 = p2.bit_mask_end();
+  assert (end1-beg1 == end2-beg2);
+  assert (std::equal (beg1, end1, beg2));
+
+  assert (p1.user_type() == p2.user_type());
+  assert (p1.get_detdescr_tags() == p2.get_detdescr_tags());
+
+  assert (p2.n_mc_event_weights() == 1);
+  assert (static_cast<unsigned int>(p1.mc_event_weight(0)) == p2.mc_event_weight(0));
+  //assert (p1.mc_channel_number() == p2.mc_channel_number());
+  //assert (p1.mc_event_number() == p2.mc_event_number());
+}
+
+
+void testit (const EventType& trans1)
+{
+  MsgStream log (0, "test");
+  EventTypeCnv_p1 cnv;
+  EventType_p1 pers;
+  cnv.transToPers (&trans1, &pers, log);
+  EventType trans2;
+  cnv.persToTrans (&pers, &trans2, log);
+  compare (trans1, trans2);
+}
+
+
+void test1()
+{
+  std::cout << "test1\n";
+  Athena_test::Leakcheck check;
+  
+
+  EventType trans1;
+  trans1.add_type (3);
+  trans1.add_type (13);
+  trans1.add_type (25);
+  trans1.add_type (101);
+  trans1.set_user_type ("utype");
+  trans1.set_mc_event_weight (1.5, 0);
+  trans1.set_mc_event_weight (2.5, 1);
+  trans1.set_mc_event_weight (3.5, 2);
+  trans1.set_mc_channel_number (123);
+  trans1.set_mc_event_number (345);
+
+  testit (trans1);
+}
+
+
+int main()
+{
+  test1();
+  return 0;
+}
diff --git a/Event/EventTPCnv/test/EventTypeCnv_p2_test.cxx b/Event/EventTPCnv/test/EventTypeCnv_p2_test.cxx
new file mode 100644
index 0000000000000000000000000000000000000000..8b45738a1c89998e2fc906f2879d222118f81fb1
--- /dev/null
+++ b/Event/EventTPCnv/test/EventTypeCnv_p2_test.cxx
@@ -0,0 +1,81 @@
+/*
+  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+*/
+
+// $Id$
+/**
+ * @file EventTPCnv/test/EventTypeCnv_p2_test.cxx
+ * @author scott snyder <snyder@bnl.gov>
+ * @date Jul, 2016
+ * @brief Regression tests.
+ */
+
+#undef NDEBUG
+#include "EventTPCnv/EventTypeCnv_p2.h"
+#include "TestTools/leakcheck.h"
+#include "EventInfo/EventType.h"
+#include <cassert>
+#include <iostream>
+
+
+void compare (const EventType& p1,
+              const EventType& p2)
+{
+  EventType::BitMaskIterator beg1 = p1.bit_mask_begin();
+  EventType::BitMaskIterator end1 = p1.bit_mask_end();
+  EventType::BitMaskIterator beg2 = p2.bit_mask_begin();
+  EventType::BitMaskIterator end2 = p2.bit_mask_end();
+  assert (end1-beg1 == end2-beg2);
+  assert (std::equal (beg1, end1, beg2));
+
+  assert (p1.user_type() == p2.user_type());
+  assert (p1.get_detdescr_tags() == p2.get_detdescr_tags());
+
+  assert (p2.n_mc_event_weights() == 1);
+  assert (p1.mc_event_weight(0) == p2.mc_event_weight(0));
+  assert (p1.mc_channel_number() == p2.mc_channel_number());
+  assert (p1.mc_event_number() == p2.mc_event_number());
+}
+
+
+void testit (const EventType& trans1)
+{
+  EventTypeCnv_p2 cnv;
+  std::vector<unsigned int> pers;
+  cnv.transToPers (&trans1, pers);
+  EventType trans2;
+  std::vector<unsigned int>::const_iterator it = pers.begin();
+  int versionToWrite = 2 | (3<<6) | (3<<12) | (1<<18) | (1<<24);
+  cnv.persToTrans (it, &trans2, versionToWrite, false);
+  assert (it == pers.end());
+  compare (trans1, trans2);
+}
+
+
+void test1()
+{
+  std::cout << "test1\n";
+  Athena_test::Leakcheck check;
+  
+
+  EventType trans1;
+  trans1.add_type (3);
+  trans1.add_type (13);
+  trans1.add_type (25);
+  trans1.add_type (101);
+  trans1.set_user_type ("utype");
+  trans1.set_mc_event_weight (1.5, 0);
+  trans1.set_mc_event_weight (2.5, 1);
+  trans1.set_mc_event_weight (3.5, 2);
+  trans1.set_mc_channel_number (123);
+  trans1.set_mc_event_number (345);
+
+  testit (trans1);
+}
+
+
+int main()
+{
+  test1();
+  return 0;
+}
diff --git a/Event/EventTPCnv/test/EventTypeCnv_p3_test.cxx b/Event/EventTPCnv/test/EventTypeCnv_p3_test.cxx
new file mode 100644
index 0000000000000000000000000000000000000000..7fea5c94293b5266f0ef7743eae88c98801e2df8
--- /dev/null
+++ b/Event/EventTPCnv/test/EventTypeCnv_p3_test.cxx
@@ -0,0 +1,81 @@
+/*
+  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+*/
+
+// $Id$
+/**
+ * @file EventTPCnv/test/EventTypeCnv_p3_test.cxx
+ * @author scott snyder <snyder@bnl.gov>
+ * @date Jul, 2016
+ * @brief Regression tests.
+ */
+
+#undef NDEBUG
+#include "EventTPCnv/EventTypeCnv_p3.h"
+#include "TestTools/leakcheck.h"
+#include "EventInfo/EventType.h"
+#include "GaudiKernel/MsgStream.h"
+#include <cassert>
+#include <iostream>
+
+
+void compare (const EventType& p1,
+              const EventType& p2)
+{
+  EventType::BitMaskIterator beg1 = p1.bit_mask_begin();
+  EventType::BitMaskIterator end1 = p1.bit_mask_end();
+  EventType::BitMaskIterator beg2 = p2.bit_mask_begin();
+  EventType::BitMaskIterator end2 = p2.bit_mask_end();
+  assert (end1-beg1 == end2-beg2);
+  assert (std::equal (beg1, end1, beg2));
+
+  assert (p1.user_type() == p2.user_type());
+  assert (p1.get_detdescr_tags() == p2.get_detdescr_tags());
+
+  assert (p1.n_mc_event_weights() == p2.n_mc_event_weights());
+  for (unsigned int i = 0; i < p1.n_mc_event_weights(); i++)
+    assert (p1.mc_event_weight(i) == p2.mc_event_weight(i));
+  assert (p1.mc_channel_number() == p2.mc_channel_number());
+  assert (p1.mc_event_number() == p2.mc_event_number());
+}
+
+
+void testit (const EventType& trans1)
+{
+  MsgStream log (0, "test");
+  EventTypeCnv_p3 cnv;
+  EventType_p3 pers;
+  cnv.transToPers (&trans1, &pers, log);
+  EventType trans2;
+  cnv.persToTrans (&pers, &trans2, log);
+  compare (trans1, trans2);
+}
+
+
+void test1()
+{
+  std::cout << "test1\n";
+  Athena_test::Leakcheck check;
+  
+
+  EventType trans1;
+  trans1.add_type (3);
+  trans1.add_type (13);
+  trans1.add_type (25);
+  trans1.add_type (101);
+  trans1.set_user_type ("utype");
+  trans1.set_mc_event_weight (1.5, 0);
+  trans1.set_mc_event_weight (2.5, 1);
+  trans1.set_mc_event_weight (3.5, 2);
+  trans1.set_mc_channel_number (123);
+  trans1.set_mc_event_number (345);
+
+  testit (trans1);
+}
+
+
+int main()
+{
+  test1();
+  return 0;
+}
diff --git a/Event/EventTPCnv/test/MergedEventInfoCnv_p1_test.cxx b/Event/EventTPCnv/test/MergedEventInfoCnv_p1_test.cxx
new file mode 100644
index 0000000000000000000000000000000000000000..a6f47ec7751846a7b96d468465ec57abcf793dda
--- /dev/null
+++ b/Event/EventTPCnv/test/MergedEventInfoCnv_p1_test.cxx
@@ -0,0 +1,178 @@
+/*
+  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+*/
+
+// $Id$
+/**
+ * @file EventTPCnv/test/MergedEventInfoCnv_p1_test.cxx
+ * @author scott snyder <snyder@bnl.gov>
+ * @date Jul, 2016
+ * @brief Regression tests.
+ */
+
+#undef NDEBUG
+#include "EventTPCnv/MergedEventInfoCnv_p1.h"
+#include "TestTools/leakcheck.h"
+#include "EventInfo/MergedEventInfo.h"
+#include "EventInfo/TriggerInfo.h"
+#include "EventInfo/EventType.h"
+#include "EventInfo/EventID.h"
+#include "CxxUtils/make_unique.h"
+#include "GaudiKernel/MsgStream.h"
+#include <cassert>
+#include <iostream>
+
+
+void compare (const EventID& p1,
+              const EventID& p2)
+{
+  assert (p1.run_number() == p2.run_number());
+  assert (p1.event_number() == p2.event_number());
+  assert (p1.time_stamp() == p2.time_stamp());
+  assert (p1.time_stamp_ns_offset() == p2.time_stamp_ns_offset());
+  assert (p1.lumi_block() == p2.lumi_block());
+  assert (p1.bunch_crossing_id() == p2.bunch_crossing_id());
+  assert (p1.detector_mask0() == p2.detector_mask0());
+  assert (p1.detector_mask1() == p2.detector_mask1());
+  //assert (p1.detector_mask2() == p2.detector_mask2());
+  //assert (p1.detector_mask3() == p2.detector_mask3());
+}
+
+
+void compare (const EventType& p1,
+              const EventType& p2)
+{
+  EventType::BitMaskIterator beg1 = p1.bit_mask_begin();
+  EventType::BitMaskIterator end1 = p1.bit_mask_end();
+  EventType::BitMaskIterator beg2 = p2.bit_mask_begin();
+  EventType::BitMaskIterator end2 = p2.bit_mask_end();
+  assert (end1-beg1 == end2-beg2);
+  assert (std::equal (beg1, end1, beg2));
+
+  assert (p1.user_type() == p2.user_type());
+  assert (p1.get_detdescr_tags() == p2.get_detdescr_tags());
+
+  assert (p2.n_mc_event_weights() == 1);
+  assert (static_cast<unsigned int>(p1.mc_event_weight(0)) == p2.mc_event_weight(0));
+  //assert (p1.mc_channel_number() == p2.mc_channel_number());
+  //assert (p1.mc_event_number() == p2.mc_event_number());
+}
+
+
+void compare (const TriggerInfo& p1,
+              const TriggerInfo& p2)
+{
+  //assert (p1.statusElement() == p2.statusElement());
+  assert (p1.extendedLevel1ID() == p2.extendedLevel1ID());
+  assert (p1.level1TriggerType() == p2.level1TriggerType());
+  //assert (p1.level1TriggerInfo() == p2.level1TriggerInfo());
+  assert (p2.level2TriggerInfo().size() == 1);
+  assert (p1.level2TriggerInfo()[0] == p2.level2TriggerInfo()[0]);
+  assert (p1.eventFilterInfo() == p2.eventFilterInfo());
+
+  //assert (p1.streamTags().size() == p2.streamTags().size());
+  //for (size_t i = 0; i < p1.streamTags().size(); i++)
+  //  compare (p1.streamTags()[i], p2.streamTags()[i]);
+}
+
+
+void compare (const EventInfo& p1,
+              const EventInfo& p2)
+{
+  compare (*p1.event_ID(), *p2.event_ID());
+  compare (*p1.event_type(), *p2.event_type());
+  compare (*p1.trigger_info(), *p2.trigger_info());
+  compare (*p1.trigger_info(), *p2.trigger_info());
+
+#if 0
+  for (unsigned int i = 0; i < EventInfo::nDets; i++) {
+    EventInfo::EventFlagSubDet ii = static_cast<EventInfo::EventFlagSubDet>(i);
+    assert (p1.eventFlags(ii) == p2.eventFlags(ii));
+    assert (p1.errorState(ii) == p2.errorState(ii));
+  }
+
+  assert (p1.actualInteractionsPerCrossing() == p2.actualInteractionsPerCrossing());
+  assert (p1.averageInteractionsPerCrossing() == p2.averageInteractionsPerCrossing());
+#endif
+}
+
+
+void compare (const MergedEventInfo& p1,
+              const MergedEventInfo& p2)
+{
+  compare (static_cast<const EventInfo&>(p1),
+           static_cast<const EventInfo&>(p2));
+  compare (*p1.event_ID(), *p2.event_ID());
+}
+
+
+void testit (const MergedEventInfo& trans1)
+{
+  MsgStream log (0, "test");
+  MergedEventInfoCnv_p1 cnv;
+  MergedEventInfo_p1 pers;
+  cnv.transToPers (&trans1, &pers, log);
+  MergedEventInfo trans2;
+  cnv.persToTrans (&pers, &trans2, log);
+  compare (trans1, trans2);
+}
+
+
+void test1()
+{
+  std::cout << "test1\n";
+  Athena_test::Leakcheck check;
+  
+
+  auto id = CxxUtils::make_unique<EventID> (1234, 2345, 3456, 4567, 5678, 6789,
+                                            4321, 5432, 6543, 7654);
+
+  auto etype = CxxUtils::make_unique<EventType>();
+  etype->add_type (3);
+  etype->add_type (13);
+  etype->add_type (25);
+  etype->add_type (101);
+  etype->set_user_type ("utype");
+  etype->set_mc_event_weight (1.5, 0);
+  etype->set_mc_event_weight (2.5, 1);
+  etype->set_mc_event_weight (3.5, 2);
+  etype->set_mc_channel_number (123);
+  etype->set_mc_event_number (345);
+
+  std::vector<TriggerInfo::StreamTag> streamTags;
+  streamTags.emplace_back ("asd", "zzz", true,
+                           std::set<TriggerInfo::number_type> {3, 4},
+                           std::set<TriggerInfo::number_type> {5, 10, 12});
+  streamTags.emplace_back ("fds", "qwe", false,
+                           std::set<TriggerInfo::number_type> {13, 14},
+                           std::set<TriggerInfo::number_type> {15, 110, 112});
+  auto tinfo = CxxUtils::make_unique<TriggerInfo>
+    (123,
+     234,
+     345,
+     std::vector<TriggerInfo::number_type> {6, 7, 8},
+     std::vector<TriggerInfo::number_type> {9, 10},
+     std::vector<TriggerInfo::number_type> {11, 12, 13, 14},
+     streamTags);
+                                                   
+  
+  EventInfo info1 (id.release(), etype.release(), tinfo.release());
+  for (unsigned int i = 0; i < EventInfo::nDets; i++) {
+    EventInfo::EventFlagSubDet ii = static_cast<EventInfo::EventFlagSubDet>(i);
+    info1.setEventFlags (ii, i*100+3);
+    info1.setErrorState (ii, static_cast<EventInfo::EventFlagErrorState>(i%3));
+  }
+  info1.setActualInteractionsPerCrossing (123.5);
+  info1.setAverageInteractionsPerCrossing (321.5);
+
+  MergedEventInfo trans1 (info1, 333, 444, 555);
+
+  testit (trans1);
+}
+
+
+int main()
+{
+  test1();
+  return 0;
+}
diff --git a/Event/EventTPCnv/test/MergedEventInfoCnv_p2_test.cxx b/Event/EventTPCnv/test/MergedEventInfoCnv_p2_test.cxx
new file mode 100644
index 0000000000000000000000000000000000000000..c6d215a7f6012e7adfce1ba93c6b07b04e4058a0
--- /dev/null
+++ b/Event/EventTPCnv/test/MergedEventInfoCnv_p2_test.cxx
@@ -0,0 +1,186 @@
+/*
+  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+*/
+
+// $Id$
+/**
+ * @file EventTPCnv/test/MergedEventInfoCnv_p2_test.cxx
+ * @author scott snyder <snyder@bnl.gov>
+ * @date Jul, 2016
+ * @brief Regression tests.
+ */
+
+#undef NDEBUG
+#include "EventTPCnv/MergedEventInfoCnv_p2.h"
+#include "TestTools/leakcheck.h"
+#include "EventInfo/MergedEventInfo.h"
+#include "EventInfo/TriggerInfo.h"
+#include "EventInfo/EventType.h"
+#include "EventInfo/EventID.h"
+#include "CxxUtils/make_unique.h"
+#include "GaudiKernel/MsgStream.h"
+#include <cassert>
+#include <iostream>
+
+
+void compare (const EventID& p1,
+              const EventID& p2)
+{
+  assert (p1.run_number() == p2.run_number());
+  assert (p1.event_number() == p2.event_number());
+  assert (p1.time_stamp() == p2.time_stamp());
+  assert (p1.time_stamp_ns_offset() == p2.time_stamp_ns_offset());
+  assert (p1.lumi_block() == p2.lumi_block());
+  assert (p1.bunch_crossing_id() == p2.bunch_crossing_id());
+  assert (p1.detector_mask0() == p2.detector_mask0());
+  assert (p1.detector_mask1() == p2.detector_mask1());
+  //assert (p1.detector_mask2() == p2.detector_mask2());
+  //assert (p1.detector_mask3() == p2.detector_mask3());
+}
+
+
+void compare (const EventType& p1,
+              const EventType& p2)
+{
+  EventType::BitMaskIterator beg1 = p1.bit_mask_begin();
+  EventType::BitMaskIterator end1 = p1.bit_mask_end();
+  EventType::BitMaskIterator beg2 = p2.bit_mask_begin();
+  EventType::BitMaskIterator end2 = p2.bit_mask_end();
+  assert (end1-beg1 == end2-beg2);
+  assert (std::equal (beg1, end1, beg2));
+
+  assert (p1.user_type() == p2.user_type());
+  assert (p1.get_detdescr_tags() == p2.get_detdescr_tags());
+
+  assert (p2.n_mc_event_weights() == 1);
+  assert (p1.mc_event_weight(0) == p2.mc_event_weight(0));
+  assert (p1.mc_channel_number() == p2.mc_channel_number());
+  assert (p1.mc_event_number() == p2.mc_event_number());
+}
+
+
+void compare (const TriggerInfo::StreamTag& p1,
+              const TriggerInfo::StreamTag& p2)
+{
+  assert (p1.name() == p2.name());
+  assert (p1.type() == p2.type());
+  assert (p1.obeysLumiblock() == p2.obeysLumiblock());
+  //assert (p1.robs() == p2.robs());
+  //assert (p1.dets() == p2.dets());
+}
+
+
+void compare (const TriggerInfo& p1,
+              const TriggerInfo& p2)
+{
+  assert (p1.statusElement() == p2.statusElement());
+  assert (p1.extendedLevel1ID() == p2.extendedLevel1ID());
+  assert (p1.level1TriggerType() == p2.level1TriggerType());
+  assert (p1.level1TriggerInfo() == p2.level1TriggerInfo());
+  assert (p1.level2TriggerInfo() == p2.level2TriggerInfo());
+  assert (p1.eventFilterInfo() == p2.eventFilterInfo());
+
+  assert (p1.streamTags().size() == p2.streamTags().size());
+  for (size_t i = 0; i < p1.streamTags().size(); i++)
+    compare (p1.streamTags()[i], p2.streamTags()[i]);
+}
+
+
+void compare (const EventInfo& p1,
+              const EventInfo& p2)
+{
+  compare (*p1.event_ID(), *p2.event_ID());
+  compare (*p1.event_type(), *p2.event_type());
+  compare (*p1.trigger_info(), *p2.trigger_info());
+  compare (*p1.trigger_info(), *p2.trigger_info());
+
+  for (unsigned int i = 0; i < EventInfo::nDets; i++) {
+    EventInfo::EventFlagSubDet ii = static_cast<EventInfo::EventFlagSubDet>(i);
+    assert (p1.eventFlags(ii) == p2.eventFlags(ii));
+    assert (p1.errorState(ii) == p2.errorState(ii));
+  }
+
+  assert (p1.actualInteractionsPerCrossing() == p2.actualInteractionsPerCrossing());
+  assert (p1.averageInteractionsPerCrossing() == p2.averageInteractionsPerCrossing());
+}
+
+
+void compare (const MergedEventInfo& p1,
+              const MergedEventInfo& p2)
+{
+  compare (static_cast<const EventInfo&>(p1),
+           static_cast<const EventInfo&>(p2));
+  compare (*p1.event_ID(), *p2.event_ID());
+}
+
+
+void testit (const MergedEventInfo& trans1)
+{
+  MsgStream log (0, "test");
+  MergedEventInfoCnv_p2 cnv;
+  MergedEventInfo_p2 pers;
+  cnv.transToPers (&trans1, &pers, log);
+  MergedEventInfo trans2;
+  cnv.persToTrans (&pers, &trans2, log);
+  compare (trans1, trans2);
+}
+
+
+void test1()
+{
+  std::cout << "test1\n";
+  Athena_test::Leakcheck check;
+  
+
+  auto id = CxxUtils::make_unique<EventID> (1234, 2345, 3456, 4567, 5678, 6789,
+                                            4321, 5432, 6543, 7654);
+
+  auto etype = CxxUtils::make_unique<EventType>();
+  etype->add_type (3);
+  etype->add_type (13);
+  etype->add_type (25);
+  etype->add_type (101);
+  etype->set_user_type ("utype");
+  etype->set_mc_event_weight (1.5, 0);
+  etype->set_mc_event_weight (2.5, 1);
+  etype->set_mc_event_weight (3.5, 2);
+  etype->set_mc_channel_number (123);
+  etype->set_mc_event_number (345);
+
+  std::vector<TriggerInfo::StreamTag> streamTags;
+  streamTags.emplace_back ("asd", "zzz", true,
+                           std::set<TriggerInfo::number_type> {3, 4},
+                           std::set<TriggerInfo::number_type> {5, 10, 12});
+  streamTags.emplace_back ("fds", "qwe", false,
+                           std::set<TriggerInfo::number_type> {13, 14},
+                           std::set<TriggerInfo::number_type> {15, 110, 112});
+  auto tinfo = CxxUtils::make_unique<TriggerInfo>
+    (123,
+     234,
+     345,
+     std::vector<TriggerInfo::number_type> {6, 7, 8},
+     std::vector<TriggerInfo::number_type> {9, 10},
+     std::vector<TriggerInfo::number_type> {11, 12, 13, 14},
+     streamTags);
+                                                   
+  
+  EventInfo info1 (id.release(), etype.release(), tinfo.release());
+  for (unsigned int i = 0; i < EventInfo::nDets; i++) {
+    EventInfo::EventFlagSubDet ii = static_cast<EventInfo::EventFlagSubDet>(i);
+    info1.setEventFlags (ii, i*100+3);
+    info1.setErrorState (ii, static_cast<EventInfo::EventFlagErrorState>(i%3));
+  }
+  info1.setActualInteractionsPerCrossing (123.5);
+  info1.setAverageInteractionsPerCrossing (321.5);
+
+  MergedEventInfo trans1 (info1, 333, 444, 555);
+
+  testit (trans1);
+}
+
+
+int main()
+{
+  test1();
+  return 0;
+}
diff --git a/Event/EventTPCnv/test/PileUpEventInfoCnv_p1_test.cxx b/Event/EventTPCnv/test/PileUpEventInfoCnv_p1_test.cxx
new file mode 100644
index 0000000000000000000000000000000000000000..d0a77ac90a9ec1256a4220f7d034712616ad375f
--- /dev/null
+++ b/Event/EventTPCnv/test/PileUpEventInfoCnv_p1_test.cxx
@@ -0,0 +1,252 @@
+/*
+  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+*/
+
+// $Id$
+/**
+ * @file EventTPCnv/test/PileUpEventInfoCnv_p1_test.cxx
+ * @author scott snyder <snyder@bnl.gov>
+ * @date Jul, 2016
+ * @brief Regression tests.
+ */
+
+#undef NDEBUG
+#include "EventTPCnv/PileUpEventInfoCnv_p1.h"
+#include "TestTools/leakcheck.h"
+#include "EventInfo/PileUpEventInfo.h"
+#include "EventInfo/TriggerInfo.h"
+#include "EventInfo/EventType.h"
+#include "EventInfo/EventID.h"
+#include "CxxUtils/make_unique.h"
+#include "GaudiKernel/MsgStream.h"
+#include <cassert>
+#include <iostream>
+#include <sstream>
+
+
+void compare (const EventID& p1,
+              const EventID& p2)
+{
+  assert (p1.run_number() == p2.run_number());
+  assert (p1.event_number() == p2.event_number());
+  assert (p1.time_stamp() == p2.time_stamp());
+  assert (p1.time_stamp_ns_offset() == p2.time_stamp_ns_offset());
+  assert (p1.lumi_block() == p2.lumi_block());
+  assert (p1.bunch_crossing_id() == p2.bunch_crossing_id());
+  assert (p1.detector_mask0() == p2.detector_mask0());
+  assert (p1.detector_mask1() == p2.detector_mask1());
+  //assert (p1.detector_mask2() == p2.detector_mask2());
+  //assert (p1.detector_mask3() == p2.detector_mask3());
+}
+
+
+void compare (const EventType& p1,
+              const EventType& p2)
+{
+  EventType::BitMaskIterator beg1 = p1.bit_mask_begin();
+  EventType::BitMaskIterator end1 = p1.bit_mask_end();
+  EventType::BitMaskIterator beg2 = p2.bit_mask_begin();
+  EventType::BitMaskIterator end2 = p2.bit_mask_end();
+  assert (end1-beg1 == end2-beg2);
+  assert (std::equal (beg1, end1, beg2));
+
+  assert (p1.user_type() == p2.user_type());
+  assert (p1.get_detdescr_tags() == p2.get_detdescr_tags());
+
+  assert (p2.n_mc_event_weights() == 1);
+  assert (static_cast<unsigned int>(p1.mc_event_weight(0)) == p2.mc_event_weight(0));
+  //assert (p1.mc_channel_number() == p2.mc_channel_number());
+  //assert (p1.mc_event_number() == p2.mc_event_number());
+}
+
+
+void compare (const TriggerInfo::StreamTag& p1,
+              const TriggerInfo::StreamTag& p2)
+{
+  assert (p1.name() == p2.name());
+  assert (p1.type() == p2.type());
+  assert (p1.obeysLumiblock() == p2.obeysLumiblock());
+  //assert (p1.robs() == p2.robs());
+  //assert (p1.dets() == p2.dets());
+}
+
+
+void compare (const TriggerInfo& p1,
+              const TriggerInfo& p2)
+{
+  //assert (p1.statusElement() == p2.statusElement());
+  assert (p1.extendedLevel1ID() == p2.extendedLevel1ID());
+  assert (p1.level1TriggerType() == p2.level1TriggerType());
+  //assert (p1.level1TriggerInfo() == p2.level1TriggerInfo());
+  assert (p2.level2TriggerInfo().size() == 1);
+  assert (p1.level2TriggerInfo()[0] == p2.level2TriggerInfo()[0]);
+  assert (p1.eventFilterInfo() == p2.eventFilterInfo());
+
+  //assert (p1.streamTags().size() == p2.streamTags().size());
+  //for (size_t i = 0; i < p1.streamTags().size(); i++)
+  //  compare (p1.streamTags()[i], p2.streamTags()[i]);
+}
+
+
+void compare (const EventInfo& p1,
+              const EventInfo& p2)
+{
+  compare (*p1.event_ID(), *p2.event_ID());
+  compare (*p1.event_type(), *p2.event_type());
+  compare (*p1.trigger_info(), *p2.trigger_info());
+  compare (*p1.trigger_info(), *p2.trigger_info());
+
+#if 0
+  for (unsigned int i = 0; i < EventInfo::nDets; i++) {
+    EventInfo::EventFlagSubDet ii = static_cast<EventInfo::EventFlagSubDet>(i);
+    assert (p1.eventFlags(ii) == p2.eventFlags(ii));
+    assert (p1.errorState(ii) == p2.errorState(ii));
+  }
+
+  assert (p1.actualInteractionsPerCrossing() == p2.actualInteractionsPerCrossing());
+  assert (p1.averageInteractionsPerCrossing() == p2.averageInteractionsPerCrossing());
+#endif
+}
+
+
+void compare (const PileUpEventInfo::SubEvent& p1,
+              const PileUpEventInfo::SubEvent& p2)
+{
+  assert (p1.time() == p2.time());
+  assert (p1.index() == p2.index());
+  assert (p2.type() == PileUpTimeEventIndex::Unknown);
+  assert (p1.BCID() == p2.BCID());
+  compare (*p1.pSubEvt, *p2.pSubEvt);
+}
+
+
+void compare (const PileUpEventInfo& p1,
+              const PileUpEventInfo& p2)
+{
+  compare (static_cast<const EventInfo&>(p1),
+           static_cast<const EventInfo&>(p2));
+
+  PileUpEventInfo::SubEvent::const_iterator beg1 = p1.beginSubEvt();
+  PileUpEventInfo::SubEvent::const_iterator end1 = p1.endSubEvt();
+  PileUpEventInfo::SubEvent::const_iterator beg2 = p2.beginSubEvt();
+  PileUpEventInfo::SubEvent::const_iterator end2 = p2.endSubEvt();
+  assert (std::distance (beg1, end1) ==
+          std::distance (beg2, end2));
+  for (; beg1 != end1; ++beg1, ++beg2)
+    compare (*beg1, *beg2);
+
+  compare (*p1.event_ID(), *p2.event_ID());
+}
+
+
+void testit (const PileUpEventInfo& trans1)
+{
+  MsgStream log (0, "test");
+  PileUpEventInfoCnv_p1 cnv;
+  PileUpEventInfo_p1 pers;
+  cnv.transToPers (&trans1, &pers, log);
+  PileUpEventInfo trans2;
+  cnv.persToTrans (&pers, &trans2, log);
+  compare (trans1, trans2);
+}
+
+
+std::string stroffs (const char* s, int offs)
+{
+  std::ostringstream os;
+  os << s << offs;
+  return os.str();
+}
+
+
+std::unique_ptr<EventID> make_id (int offs)
+{
+  return CxxUtils::make_unique<EventID> (1234+offs, 2345+offs, 3456+offs,
+                                         4567+offs, 5678+offs, 6789+offs,
+                                         4321+offs, 5432+offs,
+                                         6543+offs, 7654+offs);
+}
+
+
+std::unique_ptr<EventType> make_type (int offs)
+{
+  auto etype = CxxUtils::make_unique<EventType>();
+  etype->add_type (3+offs);
+  etype->add_type (13+offs);
+  etype->add_type (25+offs);
+  etype->add_type (101+offs);
+  etype->set_user_type (stroffs ("utype", offs));
+  etype->set_mc_event_weight (1.5+offs, 0);
+  etype->set_mc_event_weight (2.5+offs, 1);
+  etype->set_mc_event_weight (3.5+offs, 2);
+  etype->set_mc_channel_number (123+offs);
+  etype->set_mc_event_number (345+offs);
+
+  return etype;
+}
+
+
+std::unique_ptr<TriggerInfo> make_tinfo (TriggerInfo::number_type offs)
+{
+  std::vector<TriggerInfo::StreamTag> streamTags;
+  streamTags.emplace_back (stroffs("asd", offs),
+                           stroffs("zzz", offs), true,
+                           std::set<TriggerInfo::number_type> {3+offs, 4+offs},
+                           std::set<TriggerInfo::number_type> {5+offs, 10+offs, 12+offs});
+  streamTags.emplace_back (stroffs("fds", offs),
+                           stroffs("qwe", offs), false,
+                           std::set<TriggerInfo::number_type> {13+offs, 14+offs},
+                           std::set<TriggerInfo::number_type> {15+offs, 110+offs, 112+offs});
+  auto tinfo = CxxUtils::make_unique<TriggerInfo>
+    (123+offs,
+     234+offs,
+     345+offs,
+     std::vector<TriggerInfo::number_type> {6+offs, 7+offs, 8+offs},
+     std::vector<TriggerInfo::number_type> {9+offs, 10+offs},
+     std::vector<TriggerInfo::number_type> {11+offs, 12+offs, 13+offs, 14+offs},
+     streamTags);
+
+  return tinfo;
+}
+
+
+std::unique_ptr<EventInfo> make_ei (int offs)
+{
+  std::unique_ptr<EventID> id = make_id (offs);
+  std::unique_ptr<EventType> etype = make_type (offs);
+  std::unique_ptr<TriggerInfo> tinfo = make_tinfo (offs);
+  
+  auto ei = CxxUtils::make_unique<EventInfo> (id.release(), etype.release(), tinfo.release());
+  for (unsigned int i = 0; i < EventInfo::nDets; i++) {
+    EventInfo::EventFlagSubDet ii = static_cast<EventInfo::EventFlagSubDet>(i);
+    ei->setEventFlags (ii, i*100+3);
+    ei->setErrorState (ii, static_cast<EventInfo::EventFlagErrorState>(i%3));
+  }
+  ei->setActualInteractionsPerCrossing (123.5);
+  ei->setAverageInteractionsPerCrossing (321.5);
+
+  return ei;
+}
+
+
+void test1()
+{
+  std::cout << "test1\n";
+  Athena_test::Leakcheck check;
+  
+
+  PileUpEventInfo trans1 (make_id(0).release(),
+                          make_type(0).release(),
+                          make_tinfo(0).release());
+  trans1.addSubEvt (123, 432, PileUpTimeEventIndex::Signal, *make_ei(100), nullptr);
+  trans1.addSubEvt (223, 632, PileUpTimeEventIndex::Cavern, *make_ei(200), nullptr);
+
+  testit (trans1);
+}
+
+
+int main()
+{
+  test1();
+  return 0;
+}
diff --git a/Event/EventTPCnv/test/PileUpEventInfoCnv_p2_test.cxx b/Event/EventTPCnv/test/PileUpEventInfoCnv_p2_test.cxx
new file mode 100644
index 0000000000000000000000000000000000000000..bc31546d4ba584ca3023d60d9efde535c8e1f36c
--- /dev/null
+++ b/Event/EventTPCnv/test/PileUpEventInfoCnv_p2_test.cxx
@@ -0,0 +1,249 @@
+/*
+  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+*/
+
+// $Id$
+/**
+ * @file EventTPCnv/test/PileUpEventInfoCnv_p2_test.cxx
+ * @author scott snyder <snyder@bnl.gov>
+ * @date Jul, 2016
+ * @brief Regression tests.
+ */
+
+#undef NDEBUG
+#include "EventTPCnv/PileUpEventInfoCnv_p2.h"
+#include "TestTools/leakcheck.h"
+#include "EventInfo/PileUpEventInfo.h"
+#include "EventInfo/TriggerInfo.h"
+#include "EventInfo/EventType.h"
+#include "EventInfo/EventID.h"
+#include "CxxUtils/make_unique.h"
+#include "GaudiKernel/MsgStream.h"
+#include <cassert>
+#include <iostream>
+#include <sstream>
+
+
+void compare (const EventID& p1,
+              const EventID& p2)
+{
+  assert (p1.run_number() == p2.run_number());
+  assert (p1.event_number() == p2.event_number());
+  assert (p1.time_stamp() == p2.time_stamp());
+  assert (p1.time_stamp_ns_offset() == p2.time_stamp_ns_offset());
+  assert (p1.lumi_block() == p2.lumi_block());
+  assert (p1.bunch_crossing_id() == p2.bunch_crossing_id());
+  assert (p1.detector_mask0() == p2.detector_mask0());
+  assert (p1.detector_mask1() == p2.detector_mask1());
+  //assert (p1.detector_mask2() == p2.detector_mask2());
+  //assert (p1.detector_mask3() == p2.detector_mask3());
+}
+
+
+void compare (const EventType& p1,
+              const EventType& p2)
+{
+  EventType::BitMaskIterator beg1 = p1.bit_mask_begin();
+  EventType::BitMaskIterator end1 = p1.bit_mask_end();
+  EventType::BitMaskIterator beg2 = p2.bit_mask_begin();
+  EventType::BitMaskIterator end2 = p2.bit_mask_end();
+  assert (end1-beg1 == end2-beg2);
+  assert (std::equal (beg1, end1, beg2));
+
+  assert (p1.user_type() == p2.user_type());
+  assert (p1.get_detdescr_tags() == p2.get_detdescr_tags());
+
+  assert (p2.n_mc_event_weights() == 1);
+  assert (static_cast<unsigned int>(p1.mc_event_weight(0)) == p2.mc_event_weight(0));
+  //assert (p1.mc_channel_number() == p2.mc_channel_number());
+  //assert (p1.mc_event_number() == p2.mc_event_number());
+}
+
+
+void compare (const TriggerInfo::StreamTag& p1,
+              const TriggerInfo::StreamTag& p2)
+{
+  assert (p1.name() == p2.name());
+  assert (p1.type() == p2.type());
+  assert (p1.obeysLumiblock() == p2.obeysLumiblock());
+  //assert (p1.robs() == p2.robs());
+  //assert (p1.dets() == p2.dets());
+}
+
+
+void compare (const TriggerInfo& p1,
+              const TriggerInfo& p2)
+{
+  assert (p1.statusElement() == p2.statusElement());
+  assert (p1.extendedLevel1ID() == p2.extendedLevel1ID());
+  assert (p1.level1TriggerType() == p2.level1TriggerType());
+  assert (p1.level1TriggerInfo() == p2.level1TriggerInfo());
+  assert (p1.level2TriggerInfo() == p2.level2TriggerInfo());
+  assert (p1.eventFilterInfo() == p2.eventFilterInfo());
+
+  assert (p1.streamTags().size() == p2.streamTags().size());
+  for (size_t i = 0; i < p1.streamTags().size(); i++)
+    compare (p1.streamTags()[i], p2.streamTags()[i]);
+}
+
+
+void compare (const EventInfo& p1,
+              const EventInfo& p2)
+{
+  compare (*p1.event_ID(), *p2.event_ID());
+  compare (*p1.event_type(), *p2.event_type());
+  compare (*p1.trigger_info(), *p2.trigger_info());
+  compare (*p1.trigger_info(), *p2.trigger_info());
+
+  for (unsigned int i = 0; i < EventInfo::nDets; i++) {
+    EventInfo::EventFlagSubDet ii = static_cast<EventInfo::EventFlagSubDet>(i);
+    assert (p1.eventFlags(ii) == p2.eventFlags(ii));
+    assert (p1.errorState(ii) == p2.errorState(ii));
+  }
+
+  assert (p1.actualInteractionsPerCrossing() == p2.actualInteractionsPerCrossing());
+  assert (p1.averageInteractionsPerCrossing() == p2.averageInteractionsPerCrossing());
+}
+
+
+void compare (const PileUpEventInfo::SubEvent& p1,
+              const PileUpEventInfo::SubEvent& p2)
+{
+  assert (p1.time() == p2.time());
+  assert (p1.index() == p2.index());
+  assert (p2.type() == PileUpTimeEventIndex::Unknown);
+  assert (p1.BCID() == p2.BCID());
+  compare (*p1.pSubEvt, *p2.pSubEvt);
+}
+
+
+void compare (const PileUpEventInfo& p1,
+              const PileUpEventInfo& p2)
+{
+  compare (static_cast<const EventInfo&>(p1),
+           static_cast<const EventInfo&>(p2));
+
+  PileUpEventInfo::SubEvent::const_iterator beg1 = p1.beginSubEvt();
+  PileUpEventInfo::SubEvent::const_iterator end1 = p1.endSubEvt();
+  PileUpEventInfo::SubEvent::const_iterator beg2 = p2.beginSubEvt();
+  PileUpEventInfo::SubEvent::const_iterator end2 = p2.endSubEvt();
+  assert (std::distance (beg1, end1) ==
+          std::distance (beg2, end2));
+  for (; beg1 != end1; ++beg1, ++beg2)
+    compare (*beg1, *beg2);
+
+  compare (*p1.event_ID(), *p2.event_ID());
+}
+
+
+void testit (const PileUpEventInfo& trans1)
+{
+  MsgStream log (0, "test");
+  PileUpEventInfoCnv_p2 cnv;
+  PileUpEventInfo_p2 pers;
+  cnv.transToPers (&trans1, &pers, log);
+  PileUpEventInfo trans2;
+  cnv.persToTrans (&pers, &trans2, log);
+  compare (trans1, trans2);
+}
+
+
+std::string stroffs (const char* s, int offs)
+{
+  std::ostringstream os;
+  os << s << offs;
+  return os.str();
+}
+
+
+std::unique_ptr<EventID> make_id (int offs)
+{
+  return CxxUtils::make_unique<EventID> (1234+offs, 2345+offs, 3456+offs,
+                                         4567+offs, 5678+offs, 6789+offs,
+                                         4321+offs, 5432+offs,
+                                         6543+offs, 7654+offs);
+}
+
+
+std::unique_ptr<EventType> make_type (int offs)
+{
+  auto etype = CxxUtils::make_unique<EventType>();
+  etype->add_type (3+offs);
+  etype->add_type (13+offs);
+  etype->add_type (25+offs);
+  etype->add_type (101+offs);
+  etype->set_user_type (stroffs ("utype", offs));
+  etype->set_mc_event_weight (1.5+offs, 0);
+  etype->set_mc_event_weight (2.5+offs, 1);
+  etype->set_mc_event_weight (3.5+offs, 2);
+  etype->set_mc_channel_number (123+offs);
+  etype->set_mc_event_number (345+offs);
+
+  return etype;
+}
+
+
+std::unique_ptr<TriggerInfo> make_tinfo (TriggerInfo::number_type offs)
+{
+  std::vector<TriggerInfo::StreamTag> streamTags;
+  streamTags.emplace_back (stroffs("asd", offs),
+                           stroffs("zzz", offs), true,
+                           std::set<TriggerInfo::number_type> {3+offs, 4+offs},
+                           std::set<TriggerInfo::number_type> {5+offs, 10+offs, 12+offs});
+  streamTags.emplace_back (stroffs("fds", offs),
+                           stroffs("qwe", offs), false,
+                           std::set<TriggerInfo::number_type> {13+offs, 14+offs},
+                           std::set<TriggerInfo::number_type> {15+offs, 110+offs, 112+offs});
+  auto tinfo = CxxUtils::make_unique<TriggerInfo>
+    (123+offs,
+     234+offs,
+     345+offs,
+     std::vector<TriggerInfo::number_type> {6+offs, 7+offs, 8+offs},
+     std::vector<TriggerInfo::number_type> {9+offs, 10+offs},
+     std::vector<TriggerInfo::number_type> {11+offs, 12+offs, 13+offs, 14+offs},
+     streamTags);
+
+  return tinfo;
+}
+
+
+std::unique_ptr<EventInfo> make_ei (int offs)
+{
+  std::unique_ptr<EventID> id = make_id (offs);
+  std::unique_ptr<EventType> etype = make_type (offs);
+  std::unique_ptr<TriggerInfo> tinfo = make_tinfo (offs);
+  
+  auto ei = CxxUtils::make_unique<EventInfo> (id.release(), etype.release(), tinfo.release());
+  for (unsigned int i = 0; i < EventInfo::nDets; i++) {
+    EventInfo::EventFlagSubDet ii = static_cast<EventInfo::EventFlagSubDet>(i);
+    ei->setEventFlags (ii, i*100+3);
+    ei->setErrorState (ii, static_cast<EventInfo::EventFlagErrorState>(i%3));
+  }
+  ei->setActualInteractionsPerCrossing (123.5);
+  ei->setAverageInteractionsPerCrossing (321.5);
+
+  return ei;
+}
+
+
+void test1()
+{
+  std::cout << "test1\n";
+  Athena_test::Leakcheck check;
+  
+
+  PileUpEventInfo trans1 (make_id(0).release(),
+                          make_type(0).release(),
+                          make_tinfo(0).release());
+  trans1.addSubEvt (123, 432, PileUpTimeEventIndex::Signal, *make_ei(100), nullptr);
+  trans1.addSubEvt (223, 632, PileUpTimeEventIndex::Cavern, *make_ei(200), nullptr);
+
+  testit (trans1);
+}
+
+
+int main()
+{
+  test1();
+  return 0;
+}
diff --git a/Event/EventTPCnv/test/PileUpEventInfoCnv_p3_test.cxx b/Event/EventTPCnv/test/PileUpEventInfoCnv_p3_test.cxx
new file mode 100644
index 0000000000000000000000000000000000000000..8350e5d970f8f31052f5b204fffb9a61e3f36142
--- /dev/null
+++ b/Event/EventTPCnv/test/PileUpEventInfoCnv_p3_test.cxx
@@ -0,0 +1,249 @@
+/*
+  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+*/
+
+// $Id$
+/**
+ * @file EventTPCnv/test/PileUpEventInfoCnv_p3_test.cxx
+ * @author scott snyder <snyder@bnl.gov>
+ * @date Jul, 2016
+ * @brief Regression tests.
+ */
+
+#undef NDEBUG
+#include "EventTPCnv/PileUpEventInfoCnv_p3.h"
+#include "TestTools/leakcheck.h"
+#include "EventInfo/PileUpEventInfo.h"
+#include "EventInfo/TriggerInfo.h"
+#include "EventInfo/EventType.h"
+#include "EventInfo/EventID.h"
+#include "CxxUtils/make_unique.h"
+#include "GaudiKernel/MsgStream.h"
+#include <cassert>
+#include <iostream>
+#include <sstream>
+
+
+void compare (const EventID& p1,
+              const EventID& p2)
+{
+  assert (p1.run_number() == p2.run_number());
+  assert (p1.event_number() == p2.event_number());
+  assert (p1.time_stamp() == p2.time_stamp());
+  assert (p1.time_stamp_ns_offset() == p2.time_stamp_ns_offset());
+  assert (p1.lumi_block() == p2.lumi_block());
+  assert (p1.bunch_crossing_id() == p2.bunch_crossing_id());
+  assert (p1.detector_mask0() == p2.detector_mask0());
+  assert (p1.detector_mask1() == p2.detector_mask1());
+  //assert (p1.detector_mask2() == p2.detector_mask2());
+  //assert (p1.detector_mask3() == p2.detector_mask3());
+}
+
+
+void compare (const EventType& p1,
+              const EventType& p2)
+{
+  EventType::BitMaskIterator beg1 = p1.bit_mask_begin();
+  EventType::BitMaskIterator end1 = p1.bit_mask_end();
+  EventType::BitMaskIterator beg2 = p2.bit_mask_begin();
+  EventType::BitMaskIterator end2 = p2.bit_mask_end();
+  assert (end1-beg1 == end2-beg2);
+  assert (std::equal (beg1, end1, beg2));
+
+  assert (p1.user_type() == p2.user_type());
+  assert (p1.get_detdescr_tags() == p2.get_detdescr_tags());
+
+  assert (p2.n_mc_event_weights() == 1);
+  assert (static_cast<unsigned int>(p1.mc_event_weight(0)) == p2.mc_event_weight(0));
+  //assert (p1.mc_channel_number() == p2.mc_channel_number());
+  //assert (p1.mc_event_number() == p2.mc_event_number());
+}
+
+
+void compare (const TriggerInfo::StreamTag& p1,
+              const TriggerInfo::StreamTag& p2)
+{
+  assert (p1.name() == p2.name());
+  assert (p1.type() == p2.type());
+  assert (p1.obeysLumiblock() == p2.obeysLumiblock());
+  //assert (p1.robs() == p2.robs());
+  //assert (p1.dets() == p2.dets());
+}
+
+
+void compare (const TriggerInfo& p1,
+              const TriggerInfo& p2)
+{
+  assert (p1.statusElement() == p2.statusElement());
+  assert (p1.extendedLevel1ID() == p2.extendedLevel1ID());
+  assert (p1.level1TriggerType() == p2.level1TriggerType());
+  assert (p1.level1TriggerInfo() == p2.level1TriggerInfo());
+  assert (p1.level2TriggerInfo() == p2.level2TriggerInfo());
+  assert (p1.eventFilterInfo() == p2.eventFilterInfo());
+
+  assert (p1.streamTags().size() == p2.streamTags().size());
+  for (size_t i = 0; i < p1.streamTags().size(); i++)
+    compare (p1.streamTags()[i], p2.streamTags()[i]);
+}
+
+
+void compare (const EventInfo& p1,
+              const EventInfo& p2)
+{
+  compare (*p1.event_ID(), *p2.event_ID());
+  compare (*p1.event_type(), *p2.event_type());
+  compare (*p1.trigger_info(), *p2.trigger_info());
+  compare (*p1.trigger_info(), *p2.trigger_info());
+
+  for (unsigned int i = 0; i < EventInfo::nDets; i++) {
+    EventInfo::EventFlagSubDet ii = static_cast<EventInfo::EventFlagSubDet>(i);
+    assert (p1.eventFlags(ii) == p2.eventFlags(ii));
+    assert (p1.errorState(ii) == p2.errorState(ii));
+  }
+
+  assert (p1.actualInteractionsPerCrossing() == p2.actualInteractionsPerCrossing());
+  assert (p1.averageInteractionsPerCrossing() == p2.averageInteractionsPerCrossing());
+}
+
+
+void compare (const PileUpEventInfo::SubEvent& p1,
+              const PileUpEventInfo::SubEvent& p2)
+{
+  assert (p1.time() == p2.time());
+  assert (p1.index() == p2.index());
+  assert (p1.type() == p2.type());
+  assert (p1.BCID() == p2.BCID());
+  compare (*p1.pSubEvt, *p2.pSubEvt);
+}
+
+
+void compare (const PileUpEventInfo& p1,
+              const PileUpEventInfo& p2)
+{
+  compare (static_cast<const EventInfo&>(p1),
+           static_cast<const EventInfo&>(p2));
+
+  PileUpEventInfo::SubEvent::const_iterator beg1 = p1.beginSubEvt();
+  PileUpEventInfo::SubEvent::const_iterator end1 = p1.endSubEvt();
+  PileUpEventInfo::SubEvent::const_iterator beg2 = p2.beginSubEvt();
+  PileUpEventInfo::SubEvent::const_iterator end2 = p2.endSubEvt();
+  assert (std::distance (beg1, end1) ==
+          std::distance (beg2, end2));
+  for (; beg1 != end1; ++beg1, ++beg2)
+    compare (*beg1, *beg2);
+
+  compare (*p1.event_ID(), *p2.event_ID());
+}
+
+
+void testit (const PileUpEventInfo& trans1)
+{
+  MsgStream log (0, "test");
+  PileUpEventInfoCnv_p3 cnv;
+  PileUpEventInfo_p3 pers;
+  cnv.transToPers (&trans1, &pers, log);
+  PileUpEventInfo trans2;
+  cnv.persToTrans (&pers, &trans2, log);
+  compare (trans1, trans2);
+}
+
+
+std::string stroffs (const char* s, int offs)
+{
+  std::ostringstream os;
+  os << s << offs;
+  return os.str();
+}
+
+
+std::unique_ptr<EventID> make_id (int offs)
+{
+  return CxxUtils::make_unique<EventID> (1234+offs, 2345+offs, 3456+offs,
+                                         4567+offs, 5678+offs, 6789+offs,
+                                         4321+offs, 5432+offs,
+                                         6543+offs, 7654+offs);
+}
+
+
+std::unique_ptr<EventType> make_type (int offs)
+{
+  auto etype = CxxUtils::make_unique<EventType>();
+  etype->add_type (3+offs);
+  etype->add_type (13+offs);
+  etype->add_type (25+offs);
+  etype->add_type (101+offs);
+  etype->set_user_type (stroffs ("utype", offs));
+  etype->set_mc_event_weight (1.5+offs, 0);
+  etype->set_mc_event_weight (2.5+offs, 1);
+  etype->set_mc_event_weight (3.5+offs, 2);
+  etype->set_mc_channel_number (123+offs);
+  etype->set_mc_event_number (345+offs);
+
+  return etype;
+}
+
+
+std::unique_ptr<TriggerInfo> make_tinfo (TriggerInfo::number_type offs)
+{
+  std::vector<TriggerInfo::StreamTag> streamTags;
+  streamTags.emplace_back (stroffs("asd", offs),
+                           stroffs("zzz", offs), true,
+                           std::set<TriggerInfo::number_type> {3+offs, 4+offs},
+                           std::set<TriggerInfo::number_type> {5+offs, 10+offs, 12+offs});
+  streamTags.emplace_back (stroffs("fds", offs),
+                           stroffs("qwe", offs), false,
+                           std::set<TriggerInfo::number_type> {13+offs, 14+offs},
+                           std::set<TriggerInfo::number_type> {15+offs, 110+offs, 112+offs});
+  auto tinfo = CxxUtils::make_unique<TriggerInfo>
+    (123+offs,
+     234+offs,
+     345+offs,
+     std::vector<TriggerInfo::number_type> {6+offs, 7+offs, 8+offs},
+     std::vector<TriggerInfo::number_type> {9+offs, 10+offs},
+     std::vector<TriggerInfo::number_type> {11+offs, 12+offs, 13+offs, 14+offs},
+     streamTags);
+
+  return tinfo;
+}
+
+
+std::unique_ptr<EventInfo> make_ei (int offs)
+{
+  std::unique_ptr<EventID> id = make_id (offs);
+  std::unique_ptr<EventType> etype = make_type (offs);
+  std::unique_ptr<TriggerInfo> tinfo = make_tinfo (offs);
+  
+  auto ei = CxxUtils::make_unique<EventInfo> (id.release(), etype.release(), tinfo.release());
+  for (unsigned int i = 0; i < EventInfo::nDets; i++) {
+    EventInfo::EventFlagSubDet ii = static_cast<EventInfo::EventFlagSubDet>(i);
+    ei->setEventFlags (ii, i*100+3);
+    ei->setErrorState (ii, static_cast<EventInfo::EventFlagErrorState>(i%3));
+  }
+  ei->setActualInteractionsPerCrossing (123.5);
+  ei->setAverageInteractionsPerCrossing (321.5);
+
+  return ei;
+}
+
+
+void test1()
+{
+  std::cout << "test1\n";
+  Athena_test::Leakcheck check;
+  
+
+  PileUpEventInfo trans1 (make_id(0).release(),
+                          make_type(0).release(),
+                          make_tinfo(0).release());
+  trans1.addSubEvt (123, 432, PileUpTimeEventIndex::Signal, *make_ei(100), nullptr);
+  trans1.addSubEvt (223, 632, PileUpTimeEventIndex::Cavern, *make_ei(200), nullptr);
+
+  testit (trans1);
+}
+
+
+int main()
+{
+  test1();
+  return 0;
+}
diff --git a/Event/EventTPCnv/test/PileUpEventInfoCnv_p4_test.cxx b/Event/EventTPCnv/test/PileUpEventInfoCnv_p4_test.cxx
new file mode 100644
index 0000000000000000000000000000000000000000..4b91aeb77cabf705e9d6622d6f85345222793e21
--- /dev/null
+++ b/Event/EventTPCnv/test/PileUpEventInfoCnv_p4_test.cxx
@@ -0,0 +1,249 @@
+/*
+  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+*/
+
+// $Id$
+/**
+ * @file EventTPCnv/test/PileUpEventInfoCnv_p4_test.cxx
+ * @author scott snyder <snyder@bnl.gov>
+ * @date Jul, 2016
+ * @brief Regression tests.
+ */
+
+#undef NDEBUG
+#include "EventTPCnv/PileUpEventInfoCnv_p4.h"
+#include "TestTools/leakcheck.h"
+#include "EventInfo/PileUpEventInfo.h"
+#include "EventInfo/TriggerInfo.h"
+#include "EventInfo/EventType.h"
+#include "EventInfo/EventID.h"
+#include "CxxUtils/make_unique.h"
+#include "GaudiKernel/MsgStream.h"
+#include <cassert>
+#include <iostream>
+#include <sstream>
+
+
+void compare (const EventID& p1,
+              const EventID& p2)
+{
+  assert (p1.run_number() == p2.run_number());
+  assert (p1.event_number() == p2.event_number());
+  assert (p1.time_stamp() == p2.time_stamp());
+  assert (p1.time_stamp_ns_offset() == p2.time_stamp_ns_offset());
+  assert (p1.lumi_block() == p2.lumi_block());
+  assert (p1.bunch_crossing_id() == p2.bunch_crossing_id());
+  assert (p1.detector_mask0() == p2.detector_mask0());
+  assert (p1.detector_mask1() == p2.detector_mask1());
+  //assert (p1.detector_mask2() == p2.detector_mask2());
+  //assert (p1.detector_mask3() == p2.detector_mask3());
+}
+
+
+void compare (const EventType& p1,
+              const EventType& p2)
+{
+  EventType::BitMaskIterator beg1 = p1.bit_mask_begin();
+  EventType::BitMaskIterator end1 = p1.bit_mask_end();
+  EventType::BitMaskIterator beg2 = p2.bit_mask_begin();
+  EventType::BitMaskIterator end2 = p2.bit_mask_end();
+  assert (end1-beg1 == end2-beg2);
+  assert (std::equal (beg1, end1, beg2));
+
+  assert (p1.user_type() == p2.user_type());
+  assert (p1.get_detdescr_tags() == p2.get_detdescr_tags());
+
+  assert (p2.n_mc_event_weights() == 1);
+  assert (p1.mc_event_weight(0) == p2.mc_event_weight(0));
+  assert (p1.mc_channel_number() == p2.mc_channel_number());
+  assert (p1.mc_event_number() == p2.mc_event_number());
+}
+
+
+void compare (const TriggerInfo::StreamTag& p1,
+              const TriggerInfo::StreamTag& p2)
+{
+  assert (p1.name() == p2.name());
+  assert (p1.type() == p2.type());
+  assert (p1.obeysLumiblock() == p2.obeysLumiblock());
+  //assert (p1.robs() == p2.robs());
+  //assert (p1.dets() == p2.dets());
+}
+
+
+void compare (const TriggerInfo& p1,
+              const TriggerInfo& p2)
+{
+  assert (p1.statusElement() == p2.statusElement());
+  assert (p1.extendedLevel1ID() == p2.extendedLevel1ID());
+  assert (p1.level1TriggerType() == p2.level1TriggerType());
+  assert (p1.level1TriggerInfo() == p2.level1TriggerInfo());
+  assert (p1.level2TriggerInfo() == p2.level2TriggerInfo());
+  assert (p1.eventFilterInfo() == p2.eventFilterInfo());
+
+  assert (p1.streamTags().size() == p2.streamTags().size());
+  for (size_t i = 0; i < p1.streamTags().size(); i++)
+    compare (p1.streamTags()[i], p2.streamTags()[i]);
+}
+
+
+void compare (const EventInfo& p1,
+              const EventInfo& p2)
+{
+  compare (*p1.event_ID(), *p2.event_ID());
+  compare (*p1.event_type(), *p2.event_type());
+  compare (*p1.trigger_info(), *p2.trigger_info());
+  compare (*p1.trigger_info(), *p2.trigger_info());
+
+  for (unsigned int i = 0; i < EventInfo::nDets; i++) {
+    EventInfo::EventFlagSubDet ii = static_cast<EventInfo::EventFlagSubDet>(i);
+    assert (p1.eventFlags(ii) == p2.eventFlags(ii));
+    assert (p1.errorState(ii) == p2.errorState(ii));
+  }
+
+  assert (p1.actualInteractionsPerCrossing() == p2.actualInteractionsPerCrossing());
+  assert (p1.averageInteractionsPerCrossing() == p2.averageInteractionsPerCrossing());
+}
+
+
+void compare (const PileUpEventInfo::SubEvent& p1,
+              const PileUpEventInfo::SubEvent& p2)
+{
+  assert (p1.time() == p2.time());
+  assert (p1.index() == p2.index());
+  assert (p1.type() == p2.type());
+  assert (p1.BCID() == p2.BCID());
+  compare (*p1.pSubEvt, *p2.pSubEvt);
+}
+
+
+void compare (const PileUpEventInfo& p1,
+              const PileUpEventInfo& p2)
+{
+  compare (static_cast<const EventInfo&>(p1),
+           static_cast<const EventInfo&>(p2));
+
+  PileUpEventInfo::SubEvent::const_iterator beg1 = p1.beginSubEvt();
+  PileUpEventInfo::SubEvent::const_iterator end1 = p1.endSubEvt();
+  PileUpEventInfo::SubEvent::const_iterator beg2 = p2.beginSubEvt();
+  PileUpEventInfo::SubEvent::const_iterator end2 = p2.endSubEvt();
+  assert (std::distance (beg1, end1) ==
+          std::distance (beg2, end2));
+  for (; beg1 != end1; ++beg1, ++beg2)
+    compare (*beg1, *beg2);
+
+  compare (*p1.event_ID(), *p2.event_ID());
+}
+
+
+void testit (const PileUpEventInfo& trans1)
+{
+  MsgStream log (0, "test");
+  PileUpEventInfoCnv_p4 cnv;
+  PileUpEventInfo_p4 pers;
+  cnv.transToPers (&trans1, &pers, log);
+  PileUpEventInfo trans2;
+  cnv.persToTrans (&pers, &trans2, log);
+  compare (trans1, trans2);
+}
+
+
+std::string stroffs (const char* s, int offs)
+{
+  std::ostringstream os;
+  os << s << offs;
+  return os.str();
+}
+
+
+std::unique_ptr<EventID> make_id (int offs)
+{
+  return CxxUtils::make_unique<EventID> (1234+offs, 2345+offs, 3456+offs,
+                                         4567+offs, 5678+offs, 6789+offs,
+                                         4321+offs, 5432+offs,
+                                         6543+offs, 7654+offs);
+}
+
+
+std::unique_ptr<EventType> make_type (int offs)
+{
+  auto etype = CxxUtils::make_unique<EventType>();
+  etype->add_type (3+offs);
+  etype->add_type (13+offs);
+  etype->add_type (25+offs);
+  etype->add_type (101+offs);
+  etype->set_user_type (stroffs ("utype", offs));
+  etype->set_mc_event_weight (1.5+offs, 0);
+  etype->set_mc_event_weight (2.5+offs, 1);
+  etype->set_mc_event_weight (3.5+offs, 2);
+  etype->set_mc_channel_number (123+offs);
+  etype->set_mc_event_number (345+offs);
+
+  return etype;
+}
+
+
+std::unique_ptr<TriggerInfo> make_tinfo (TriggerInfo::number_type offs)
+{
+  std::vector<TriggerInfo::StreamTag> streamTags;
+  streamTags.emplace_back (stroffs("asd", offs),
+                           stroffs("zzz", offs), true,
+                           std::set<TriggerInfo::number_type> {3+offs, 4+offs},
+                           std::set<TriggerInfo::number_type> {5+offs, 10+offs, 12+offs});
+  streamTags.emplace_back (stroffs("fds", offs),
+                           stroffs("qwe", offs), false,
+                           std::set<TriggerInfo::number_type> {13+offs, 14+offs},
+                           std::set<TriggerInfo::number_type> {15+offs, 110+offs, 112+offs});
+  auto tinfo = CxxUtils::make_unique<TriggerInfo>
+    (123+offs,
+     234+offs,
+     345+offs,
+     std::vector<TriggerInfo::number_type> {6+offs, 7+offs, 8+offs},
+     std::vector<TriggerInfo::number_type> {9+offs, 10+offs},
+     std::vector<TriggerInfo::number_type> {11+offs, 12+offs, 13+offs, 14+offs},
+     streamTags);
+
+  return tinfo;
+}
+
+
+std::unique_ptr<EventInfo> make_ei (int offs)
+{
+  std::unique_ptr<EventID> id = make_id (offs);
+  std::unique_ptr<EventType> etype = make_type (offs);
+  std::unique_ptr<TriggerInfo> tinfo = make_tinfo (offs);
+  
+  auto ei = CxxUtils::make_unique<EventInfo> (id.release(), etype.release(), tinfo.release());
+  for (unsigned int i = 0; i < EventInfo::nDets; i++) {
+    EventInfo::EventFlagSubDet ii = static_cast<EventInfo::EventFlagSubDet>(i);
+    ei->setEventFlags (ii, i*100+3);
+    ei->setErrorState (ii, static_cast<EventInfo::EventFlagErrorState>(i%3));
+  }
+  ei->setActualInteractionsPerCrossing (123.5);
+  ei->setAverageInteractionsPerCrossing (321.5);
+
+  return ei;
+}
+
+
+void test1()
+{
+  std::cout << "test1\n";
+  Athena_test::Leakcheck check;
+  
+
+  PileUpEventInfo trans1 (make_id(0).release(),
+                          make_type(0).release(),
+                          make_tinfo(0).release());
+  trans1.addSubEvt (123, 432, PileUpTimeEventIndex::Signal, *make_ei(100), nullptr);
+  trans1.addSubEvt (223, 632, PileUpTimeEventIndex::Cavern, *make_ei(200), nullptr);
+
+  testit (trans1);
+}
+
+
+int main()
+{
+  test1();
+  return 0;
+}
diff --git a/Event/EventTPCnv/test/PileUpEventInfoCnv_p5_test.cxx b/Event/EventTPCnv/test/PileUpEventInfoCnv_p5_test.cxx
new file mode 100644
index 0000000000000000000000000000000000000000..3b7d80e3cb8c3ee22d952b2809b5537223c05e24
--- /dev/null
+++ b/Event/EventTPCnv/test/PileUpEventInfoCnv_p5_test.cxx
@@ -0,0 +1,251 @@
+/*
+  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+*/
+
+// $Id$
+/**
+ * @file EventTPCnv/test/PileUpEventInfoCnv_p5_test.cxx
+ * @author scott snyder <snyder@bnl.gov>
+ * @date Jul, 2016
+ * @brief Regression tests.
+ */
+
+#undef NDEBUG
+#include "EventTPCnv/PileUpEventInfoCnv_p5.h"
+#include "TestTools/leakcheck.h"
+#include "EventInfo/PileUpEventInfo.h"
+#include "EventInfo/TriggerInfo.h"
+#include "EventInfo/EventType.h"
+#include "EventInfo/EventID.h"
+#include "CxxUtils/make_unique.h"
+#include "GaudiKernel/MsgStream.h"
+#include <cassert>
+#include <iostream>
+#include <sstream>
+
+
+void compare (const EventID& p1,
+              const EventID& p2)
+{
+  assert (p1.run_number() == p2.run_number());
+  assert (p1.event_number() == p2.event_number());
+  assert (p1.time_stamp() == p2.time_stamp());
+  assert (p1.time_stamp_ns_offset() == p2.time_stamp_ns_offset());
+  assert (p1.lumi_block() == p2.lumi_block());
+  assert (p1.bunch_crossing_id() == p2.bunch_crossing_id());
+  assert (p1.detector_mask0() == p2.detector_mask0());
+  assert (p1.detector_mask1() == p2.detector_mask1());
+  assert (p1.detector_mask2() == p2.detector_mask2());
+  assert (p1.detector_mask3() == p2.detector_mask3());
+}
+
+
+void compare (const EventType& p1,
+              const EventType& p2)
+{
+  EventType::BitMaskIterator beg1 = p1.bit_mask_begin();
+  EventType::BitMaskIterator end1 = p1.bit_mask_end();
+  EventType::BitMaskIterator beg2 = p2.bit_mask_begin();
+  EventType::BitMaskIterator end2 = p2.bit_mask_end();
+  assert (end1-beg1 == end2-beg2);
+  assert (std::equal (beg1, end1, beg2));
+
+  assert (p1.user_type() == p2.user_type());
+  assert (p1.get_detdescr_tags() == p2.get_detdescr_tags());
+
+  assert (p1.n_mc_event_weights() == p2.n_mc_event_weights());
+  for (unsigned int i = 0; i < p1.n_mc_event_weights(); i++)
+    assert (p1.mc_event_weight(i) == p2.mc_event_weight(i));
+  assert (p1.mc_channel_number() == p2.mc_channel_number());
+  assert (p1.mc_event_number() == p2.mc_event_number());
+}
+
+
+void compare (const TriggerInfo::StreamTag& p1,
+              const TriggerInfo::StreamTag& p2)
+{
+  assert (p1.name() == p2.name());
+  assert (p1.type() == p2.type());
+  assert (p1.obeysLumiblock() == p2.obeysLumiblock());
+  //assert (p1.robs() == p2.robs());
+  //assert (p1.dets() == p2.dets());
+}
+
+
+void compare (const TriggerInfo& p1,
+              const TriggerInfo& p2)
+{
+  assert (p1.statusElement() == p2.statusElement());
+  assert (p1.extendedLevel1ID() == p2.extendedLevel1ID());
+  assert (p1.level1TriggerType() == p2.level1TriggerType());
+  assert (p1.level1TriggerInfo() == p2.level1TriggerInfo());
+  assert (p1.level2TriggerInfo() == p2.level2TriggerInfo());
+  assert (p1.eventFilterInfo() == p2.eventFilterInfo());
+
+  assert (p1.streamTags().size() == p2.streamTags().size());
+  for (size_t i = 0; i < p1.streamTags().size(); i++)
+    compare (p1.streamTags()[i], p2.streamTags()[i]);
+}
+
+
+void compare (const EventInfo& p1,
+              const EventInfo& p2)
+{
+  compare (*p1.event_ID(), *p2.event_ID());
+  compare (*p1.event_type(), *p2.event_type());
+  compare (*p1.trigger_info(), *p2.trigger_info());
+  compare (*p1.trigger_info(), *p2.trigger_info());
+
+  for (unsigned int i = 0; i < EventInfo::nDets; i++) {
+    EventInfo::EventFlagSubDet ii = static_cast<EventInfo::EventFlagSubDet>(i);
+    assert (p1.eventFlags(ii) == p2.eventFlags(ii));
+    assert (p1.errorState(ii) == p2.errorState(ii));
+  }
+
+  assert (p1.actualInteractionsPerCrossing() == p2.actualInteractionsPerCrossing());
+  assert (p1.averageInteractionsPerCrossing() == p2.averageInteractionsPerCrossing());
+}
+
+
+void compare (const PileUpEventInfo::SubEvent& p1,
+              const PileUpEventInfo::SubEvent& p2)
+{
+  assert (p1.time() == p2.time());
+  assert (p1.index() == p2.index());
+  assert (p1.type() == p2.type());
+  assert (p1.BCID() == p2.BCID());
+  compare (*p1.pSubEvt, *p2.pSubEvt);
+}
+
+
+void compare (const PileUpEventInfo& p1,
+              const PileUpEventInfo& p2)
+{
+  compare (static_cast<const EventInfo&>(p1),
+           static_cast<const EventInfo&>(p2));
+
+  //PileUpEventInfo::SubEvent::const_iterator beg1 = p1.beginSubEvt();
+  //PileUpEventInfo::SubEvent::const_iterator end1 = p1.endSubEvt();
+  PileUpEventInfo::SubEvent::const_iterator beg2 = p2.beginSubEvt();
+  PileUpEventInfo::SubEvent::const_iterator end2 = p2.endSubEvt();
+  assert (beg2 == end2);
+  //assert (std::distance (beg1, end1) ==
+  //        std::distance (beg2, end2));
+  //for (; beg1 != end1; ++beg1, ++beg2)
+  //  compare (*beg1, *beg2);
+
+  compare (*p1.event_ID(), *p2.event_ID());
+}
+
+
+void testit (const PileUpEventInfo& trans1)
+{
+  MsgStream log (0, "test");
+  PileUpEventInfoCnv_p5 cnv;
+  PileUpEventInfo_p5 pers;
+  cnv.transToPers (&trans1, &pers, log);
+  PileUpEventInfo trans2;
+  cnv.persToTrans (&pers, &trans2, log);
+  compare (trans1, trans2);
+}
+
+
+std::string stroffs (const char* s, int offs)
+{
+  std::ostringstream os;
+  os << s << offs;
+  return os.str();
+}
+
+
+std::unique_ptr<EventID> make_id (int offs)
+{
+  return CxxUtils::make_unique<EventID> (1234+offs, 2345+offs, 3456+offs,
+                                         4567+offs, 5678+offs, 6789+offs,
+                                         4321+offs, 5432+offs,
+                                         6543+offs, 7654+offs);
+}
+
+
+std::unique_ptr<EventType> make_type (int offs)
+{
+  auto etype = CxxUtils::make_unique<EventType>();
+  etype->add_type (3+offs);
+  etype->add_type (13+offs);
+  etype->add_type (25+offs);
+  etype->add_type (101+offs);
+  etype->set_user_type (stroffs ("utype", offs));
+  etype->set_mc_event_weight (1.5+offs, 0);
+  etype->set_mc_event_weight (2.5+offs, 1);
+  etype->set_mc_event_weight (3.5+offs, 2);
+  etype->set_mc_channel_number (123+offs);
+  etype->set_mc_event_number (345+offs);
+
+  return etype;
+}
+
+
+std::unique_ptr<TriggerInfo> make_tinfo (TriggerInfo::number_type offs)
+{
+  std::vector<TriggerInfo::StreamTag> streamTags;
+  streamTags.emplace_back (stroffs("asd", offs),
+                           stroffs("zzz", offs), true,
+                           std::set<TriggerInfo::number_type> {3+offs, 4+offs},
+                           std::set<TriggerInfo::number_type> {5+offs, 10+offs, 12+offs});
+  streamTags.emplace_back (stroffs("fds", offs),
+                           stroffs("qwe", offs), false,
+                           std::set<TriggerInfo::number_type> {13+offs, 14+offs},
+                           std::set<TriggerInfo::number_type> {15+offs, 110+offs, 112+offs});
+  auto tinfo = CxxUtils::make_unique<TriggerInfo>
+    (123+offs,
+     234+offs,
+     345+offs,
+     std::vector<TriggerInfo::number_type> {6+offs, 7+offs, 8+offs},
+     std::vector<TriggerInfo::number_type> {9+offs, 10+offs},
+     std::vector<TriggerInfo::number_type> {11+offs, 12+offs, 13+offs, 14+offs},
+     streamTags);
+
+  return tinfo;
+}
+
+
+std::unique_ptr<EventInfo> make_ei (int offs)
+{
+  std::unique_ptr<EventID> id = make_id (offs);
+  std::unique_ptr<EventType> etype = make_type (offs);
+  std::unique_ptr<TriggerInfo> tinfo = make_tinfo (offs);
+  
+  auto ei = CxxUtils::make_unique<EventInfo> (id.release(), etype.release(), tinfo.release());
+  for (unsigned int i = 0; i < EventInfo::nDets; i++) {
+    EventInfo::EventFlagSubDet ii = static_cast<EventInfo::EventFlagSubDet>(i);
+    ei->setEventFlags (ii, i*100+3);
+    ei->setErrorState (ii, static_cast<EventInfo::EventFlagErrorState>(i%3));
+  }
+  ei->setActualInteractionsPerCrossing (123.5);
+  ei->setAverageInteractionsPerCrossing (321.5);
+
+  return ei;
+}
+
+
+void test1()
+{
+  std::cout << "test1\n";
+  Athena_test::Leakcheck check;
+  
+
+  PileUpEventInfo trans1 (make_id(0).release(),
+                          make_type(0).release(),
+                          make_tinfo(0).release());
+  trans1.addSubEvt (123, 432, PileUpTimeEventIndex::Signal, *make_ei(100), nullptr);
+  trans1.addSubEvt (223, 632, PileUpTimeEventIndex::Cavern, *make_ei(200), nullptr);
+
+  testit (trans1);
+}
+
+
+int main()
+{
+  test1();
+  return 0;
+}
diff --git a/Event/EventTPCnv/test/TriggerInfoCnv_p1_test.cxx b/Event/EventTPCnv/test/TriggerInfoCnv_p1_test.cxx
new file mode 100644
index 0000000000000000000000000000000000000000..55f4f367342b7d1b8bc9292e27b7afc1d4ec950d
--- /dev/null
+++ b/Event/EventTPCnv/test/TriggerInfoCnv_p1_test.cxx
@@ -0,0 +1,81 @@
+/*
+  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+*/
+
+// $Id$
+/**
+ * @file EventTPCnv/test/TriggerInfoCnv_p1_test.cxx
+ * @author scott snyder <snyder@bnl.gov>
+ * @date Jul, 2016
+ * @brief Regression tests.
+ */
+
+#undef NDEBUG
+#include "EventTPCnv/TriggerInfoCnv_p1.h"
+#include "TestTools/leakcheck.h"
+#include "EventInfo/TriggerInfo.h"
+#include "GaudiKernel/MsgStream.h"
+#include <cassert>
+#include <iostream>
+
+
+void compare (const TriggerInfo& p1,
+              const TriggerInfo& p2)
+{
+  //assert (p1.statusElement() == p2.statusElement());
+  assert (p1.extendedLevel1ID() == p2.extendedLevel1ID());
+  assert (p1.level1TriggerType() == p2.level1TriggerType());
+  //assert (p1.level1TriggerInfo() == p2.level1TriggerInfo());
+  assert (p2.level2TriggerInfo().size() == 1);
+  assert (p1.level2TriggerInfo()[0] == p2.level2TriggerInfo()[0]);
+  assert (p1.eventFilterInfo() == p2.eventFilterInfo());
+
+  //assert (p1.streamTags().size() == p2.streamTags().size());
+  //for (size_t i = 0; i < p1.streamTags().size(); i++)
+  //  compare (p1.streamTags()[i], p2.streamTags()[i]);
+}
+
+
+void testit (const TriggerInfo& trans1)
+{
+  MsgStream log (0, "test");
+  TriggerInfoCnv_p1 cnv;
+  TriggerInfo_p1 pers;
+  cnv.transToPers (&trans1, &pers, log);
+  TriggerInfo trans2;
+  cnv.persToTrans (&pers, &trans2, log);
+  compare (trans1, trans2);
+}
+
+
+void test1()
+{
+  std::cout << "test1\n";
+  Athena_test::Leakcheck check;
+  
+
+  std::vector<TriggerInfo::StreamTag> streamTags;
+  streamTags.emplace_back ("asd", "zzz", true,
+                           std::set<TriggerInfo::number_type> {3, 4},
+                           std::set<TriggerInfo::number_type> {5, 10, 12});
+  streamTags.emplace_back ("fds", "qwe", false,
+                           std::set<TriggerInfo::number_type> {13, 14},
+                           std::set<TriggerInfo::number_type> {15, 110, 112});
+  TriggerInfo trans1
+    (123,
+     234,
+     345,
+     std::vector<TriggerInfo::number_type> {6, 7, 8},
+     std::vector<TriggerInfo::number_type> {9, 10},
+     std::vector<TriggerInfo::number_type> {11, 12, 13, 14},
+     streamTags);
+                                                   
+  testit (trans1);
+}
+
+
+int main()
+{
+  test1();
+  return 0;
+}
diff --git a/Event/EventTPCnv/test/TriggerInfoCnv_p2_test.cxx b/Event/EventTPCnv/test/TriggerInfoCnv_p2_test.cxx
new file mode 100644
index 0000000000000000000000000000000000000000..24e56af4d3a654c91db48facd616fd0ffe3d8fe5
--- /dev/null
+++ b/Event/EventTPCnv/test/TriggerInfoCnv_p2_test.cxx
@@ -0,0 +1,91 @@
+/*
+  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+*/
+
+// $Id$
+/**
+ * @file EventTPCnv/test/TriggerInfoCnv_p2_test.cxx
+ * @author scott snyder <snyder@bnl.gov>
+ * @date Jul, 2016
+ * @brief Regression tests.
+ */
+
+#undef NDEBUG
+#include "EventTPCnv/TriggerInfoCnv_p2.h"
+#include "TestTools/leakcheck.h"
+#include "EventInfo/TriggerInfo.h"
+#include "GaudiKernel/MsgStream.h"
+#include <cassert>
+#include <iostream>
+
+
+void compare (const TriggerInfo::StreamTag& p1,
+              const TriggerInfo::StreamTag& p2)
+{
+  assert (p1.name() == p2.name());
+  assert (p1.type() == p2.type());
+  assert (p1.obeysLumiblock() == p2.obeysLumiblock());
+  //assert (p1.robs() == p2.robs());
+  //assert (p1.dets() == p2.dets());
+}
+
+
+void compare (const TriggerInfo& p1,
+              const TriggerInfo& p2)
+{
+  assert (p1.statusElement() == p2.statusElement());
+  assert (p1.extendedLevel1ID() == p2.extendedLevel1ID());
+  assert (p1.level1TriggerType() == p2.level1TriggerType());
+  assert (p1.level1TriggerInfo() == p2.level1TriggerInfo());
+  assert (p1.level2TriggerInfo() == p2.level2TriggerInfo());
+  assert (p1.eventFilterInfo() == p2.eventFilterInfo());
+
+  assert (p1.streamTags().size() == p2.streamTags().size());
+  for (size_t i = 0; i < p1.streamTags().size(); i++)
+    compare (p1.streamTags()[i], p2.streamTags()[i]);
+}
+
+
+void testit (const TriggerInfo& trans1)
+{
+  MsgStream log (0, "test");
+  TriggerInfoCnv_p2 cnv;
+  TriggerInfo_p2 pers;
+  cnv.transToPers (&trans1, &pers, log);
+  TriggerInfo trans2;
+  cnv.persToTrans (&pers, &trans2, log);
+  compare (trans1, trans2);
+}
+
+
+void test1()
+{
+  std::cout << "test1\n";
+  Athena_test::Leakcheck check;
+  
+
+  std::vector<TriggerInfo::StreamTag> streamTags;
+  streamTags.emplace_back ("asd", "zzz", true,
+                           std::set<TriggerInfo::number_type> {3, 4},
+                           std::set<TriggerInfo::number_type> {5, 10, 12});
+  streamTags.emplace_back ("fds", "qwe", false,
+                           std::set<TriggerInfo::number_type> {13, 14},
+                           std::set<TriggerInfo::number_type> {15, 110, 112});
+  TriggerInfo trans1
+    (123,
+     234,
+     345,
+     std::vector<TriggerInfo::number_type> {6, 7, 8},
+     std::vector<TriggerInfo::number_type> {9, 10},
+     std::vector<TriggerInfo::number_type> {11, 12, 13, 14},
+     streamTags);
+                                                   
+  testit (trans1);
+}
+
+
+int main()
+{
+  test1();
+  return 0;
+}
diff --git a/Event/EventTPCnv/test/TriggerInfoCnv_p3_test.cxx b/Event/EventTPCnv/test/TriggerInfoCnv_p3_test.cxx
new file mode 100644
index 0000000000000000000000000000000000000000..8f0ea4a03431e3c8bfbcaba602dbb97b9e788fb5
--- /dev/null
+++ b/Event/EventTPCnv/test/TriggerInfoCnv_p3_test.cxx
@@ -0,0 +1,91 @@
+/*
+  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+*/
+
+// $Id$
+/**
+ * @file EventTPCnv/test/TriggerInfoCnv_p3_test.cxx
+ * @author scott snyder <snyder@bnl.gov>
+ * @date Jul, 2016
+ * @brief Regression tests.
+ */
+
+#undef NDEBUG
+#include "EventTPCnv/TriggerInfoCnv_p3.h"
+#include "TestTools/leakcheck.h"
+#include "EventInfo/TriggerInfo.h"
+#include <cassert>
+#include <iostream>
+
+
+void compare (const TriggerInfo::StreamTag& p1,
+              const TriggerInfo::StreamTag& p2)
+{
+  assert (p1.name() == p2.name());
+  assert (p1.type() == p2.type());
+  assert (p1.obeysLumiblock() == p2.obeysLumiblock());
+  //assert (p1.robs() == p2.robs());
+  //assert (p1.dets() == p2.dets());
+}
+
+
+void compare (const TriggerInfo& p1,
+              const TriggerInfo& p2)
+{
+  assert (p1.statusElement() == p2.statusElement());
+  assert (p1.extendedLevel1ID() == p2.extendedLevel1ID());
+  assert (p1.level1TriggerType() == p2.level1TriggerType());
+  assert (p1.level1TriggerInfo() == p2.level1TriggerInfo());
+  assert (p1.level2TriggerInfo() == p2.level2TriggerInfo());
+  assert (p1.eventFilterInfo() == p2.eventFilterInfo());
+
+  assert (p1.streamTags().size() == p2.streamTags().size());
+  for (size_t i = 0; i < p1.streamTags().size(); i++)
+    compare (p1.streamTags()[i], p2.streamTags()[i]);
+}
+
+
+void testit (const TriggerInfo& trans1)
+{
+  TriggerInfoCnv_p3 cnv;
+  std::vector<unsigned int> pers;
+  cnv.transToPers (&trans1, pers);
+  std::vector<unsigned int>::const_iterator it = pers.begin();
+  TriggerInfo trans2;
+  cnv.persToTrans (it, &trans2, false);
+  assert (it == pers.end());
+  compare (trans1, trans2);
+}
+
+
+void test1()
+{
+  std::cout << "test1\n";
+  Athena_test::Leakcheck check;
+  
+
+  std::vector<TriggerInfo::StreamTag> streamTags;
+  streamTags.emplace_back ("asd", "zzz", true,
+                           std::set<TriggerInfo::number_type> {3, 4},
+                           std::set<TriggerInfo::number_type> {5, 10, 12});
+  streamTags.emplace_back ("fds", "qwe", false,
+                           std::set<TriggerInfo::number_type> {13, 14},
+                           std::set<TriggerInfo::number_type> {15, 110, 112});
+  TriggerInfo trans1
+    (123,
+     234,
+     345,
+     std::vector<TriggerInfo::number_type> {6, 7, 8},
+     std::vector<TriggerInfo::number_type> {9, 10},
+     std::vector<TriggerInfo::number_type> {11, 12, 13, 14},
+     streamTags);
+                                                   
+  testit (trans1);
+}
+
+
+int main()
+{
+  test1();
+  return 0;
+}