diff --git a/Event/xAOD/xAODTrigger/Root/TrigCompositeAuxContainer_v2.cxx b/Event/xAOD/xAODTrigger/Root/TrigCompositeAuxContainer_v2.cxx
new file mode 100644
index 0000000000000000000000000000000000000000..d6fdf943c3c83cf817a3029d6c74f86162652e55
--- /dev/null
+++ b/Event/xAOD/xAODTrigger/Root/TrigCompositeAuxContainer_v2.cxx
@@ -0,0 +1,23 @@
+/*
+  Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration
+*/
+
+// $Id: TrigCompositeAuxContainer_v2.cxx $
+
+// Local include(s):
+#include "xAODTrigger/versions/TrigCompositeAuxContainer_v2.h"
+
+namespace xAOD {
+
+   TrigCompositeAuxContainer_v2::TrigCompositeAuxContainer_v2()
+      : AuxContainerBase(){
+
+      AUX_VARIABLE( name );
+
+      AUX_VARIABLE( linkColNames );
+      AUX_VARIABLE( linkColKeys );
+      AUX_VARIABLE( linkColIndices );
+      AUX_VARIABLE( linkColClids );
+   }
+
+} // namespace xAOD
diff --git a/Event/xAOD/xAODTrigger/Root/TrigComposite_v1.cxx b/Event/xAOD/xAODTrigger/Root/TrigComposite_v1.cxx
index 77f4b31c3d9aa04ef16ac6711a162078d2457caf..6c741ccc3ea51e3e72217ec069def2a765a0a7ea 100644
--- a/Event/xAOD/xAODTrigger/Root/TrigComposite_v1.cxx
+++ b/Event/xAOD/xAODTrigger/Root/TrigComposite_v1.cxx
@@ -1,5 +1,5 @@
 /*
-  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+  Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration
 */
 
 // $Id: TrigComposite_v1.cxx 784384 2016-11-15 16:37:49Z tamartin $
@@ -39,279 +39,13 @@ namespace xAOD {
     return *this;
   }
 
-   AUXSTORE_OBJECT_SETTER_AND_GETTER( TrigComposite_v1, std::string,
-                                      name, setName )
-
-   template<>
-   bool TrigComposite_v1::hasDetail<uint32_t>( const std::string& name ) const {
-     return hasDetail<int32_t>(name);
-   }
-
-   template<>
-   bool TrigComposite_v1::hasDetail<std::vector<uint32_t>>( const std::string& name ) const {
-     return hasDetail<std::vector<int32_t>>(name);
-   }
-
-   template<>
-   bool TrigComposite_v1::hasDetail<std::vector<uint16_t>>( const std::string& name ) const {
-     return hasDetail<std::vector<int32_t>>(name);
-   }
-
-   template<>
-   bool TrigComposite_v1::hasDetail<std::string>( const std::string& name ) const {
-     return hasDetail<std::vector<int32_t>>(name);
-   }
-
-   template<>
-   bool TrigComposite_v1::hasDetail<std::vector<std::string>>( const std::string& name ) const {
-     return hasDetail<std::vector<int32_t>>(name);
-   }
-
    /////////////////////////////////////////////////////////////////////////////
    //
-   //                   Simple detail accessor functions
+   //                   Built in accessor functions
    //
 
-   bool TrigComposite_v1::setDetail( const std::string& name, int32_t value ) {
-
-      // It should be pretty strange if this should fail:
-      try {
-         auxdata< int32_t >( name ) = value;
-      } catch(const std::exception& exc) {
-         std::cerr << "xAOD::TrigComposite_v1::setDetail ERROR Internal logic error found in int32_t: [" << exc.what() << "]" << std::endl;
-         return false;
-      }
-
-      // Return gracefully:
-      return true;
-   }
-
-   bool TrigComposite_v1::setDetail( const std::string& name, uint32_t value ) {
-     return setDetail(name, (int32_t)value); // place for conversion if needed
-   }
-
-   bool TrigComposite_v1::setDetail( const std::string& name, float value ) {
-
-      // It should be pretty strange if this should fail:
-      try {
-         auxdata< float >( name ) = value;
-      } catch(const std::exception& exc) {
-         std::cerr << "xAOD::TrigComposite_v1::setDetail ERROR Internal logic error found in float: [" << exc.what() << "]" << std::endl;
-         return false;
-      }
-
-      // Return gracefully:
-      return true;
-   }
-
-   bool TrigComposite_v1::setDetail( const std::string& name,
-                                     const std::vector< int32_t >& value ) {
-
-      // It should be pretty strange if this should fail:
-      try {
-         auxdata< std::vector< int32_t > >( name ) = value;
-      } catch(const std::exception& exc) {
-         std::cerr << "xAOD::TrigComposite_v1::setDetail ERROR Internal logic error found in vector<int32_t>: [" << exc.what() << "]" << std::endl;
-         return false;
-      }
-
-      // Return gracefully:
-      return true;
-   }
-
-
-   bool TrigComposite_v1::setDetail( const std::string& name,
-                                     const std::vector< uint32_t >& value ) {
-
-      // It should be pretty strange if this should fail:
-     std::vector<int32_t> temp(value.begin(), value.end()); //
-      try {
-         auxdata< std::vector< int32_t > >( name ) = temp;
-      } catch(const std::exception& exc) {
-         std::cerr << "xAOD::TrigComposite_v1::setDetail ERROR Internal logic error found in vector<uint32_t>: [" << exc.what() << "]" << std::endl;
-         return false;
-      }
-
-      // Return gracefully:
-      return true;
-   }
-
-   bool TrigComposite_v1::setDetail( const std::string& name,
-                                     const std::vector< uint16_t >& value ) {
-
-      std::vector<uint32_t> temp;
-      temp.reserve( value.size() / 2 );
-
-      // Pack shorts for space efficiency
-      for (size_t i = 0; i < value.size(); i += 2) {
-        const uint16_t a = value.at(i);
-        const uint16_t b = (i + 1 < value.size() ? value.at(i + 1) : std::numeric_limits<uint16_t>::max() );
-        const uint32_t combine = ( (b << 16) | (a & 0xffff) );
-        temp.push_back( combine );
-      }
-
-      return setDetail(name, temp);
-   }
-
-   bool TrigComposite_v1::setDetail( const std::string& name,
-                                     const std::vector< float >& value ) {
-
-      // It should be pretty strange if this should fail:
-      try {
-         auxdata< std::vector< float > >( name ) = value;
-      } catch(const std::exception& exc) {
-         std::cerr << "xAOD::TrigComposite_v1::setDetail ERROR Internal logic error found in vector<float>: [" << exc.what() << "]" << std::endl;
-         return false;
-      }
-
-      // Return gracefully:
-      return true;
-   }
-
-   bool TrigComposite_v1::setDetail( const std::string& name, const std::string& value ) {
-
-      std::vector<uint32_t> serialForm;
-      HLT::StringSerializer::serialize(value, serialForm);
-      return setDetail(name, serialForm);
-   }
-
-   bool TrigComposite_v1::setDetail( const std::string& name, const std::vector< std::string >& value ) {
-
-      std::vector<uint32_t> serialForm;
-      HLT::StringSerializer::serialize(value, serialForm);
-      return setDetail(name, serialForm);
-   }
-
-   bool TrigComposite_v1::getDetail( const std::string& name,
-                                     int32_t& value ) const {
-
-      // Object used to access the auxiliary data:
-      Accessor< int32_t > acc( name );
-
-      // Enable the check once it will work correctly:
-      if( ! acc.isAvailable( *this ) ) {
-         return false;
-      }
-
-      // Retrieve this detail:
-      value = acc( *this );
-      return true;
-   }
-
-
-   bool TrigComposite_v1::getDetail( const std::string& name,
-                                     uint32_t& value ) const {
-     int32_t v = 0;
-     const bool status = getDetail(name, v); 
-     value = v; // place for cast
-     return status;
-     
-   }
-
-   bool TrigComposite_v1::getDetail( const std::string& name,
-                                     float& value ) const {
-
-      // Object used to access the auxiliary data:
-      Accessor< float > acc( name );
-
-      // Enable the check once it will work correctly:
-      if( ! acc.isAvailable( *this ) ) {
-         return false;
-      }
-
-      // Retrieve this detail:
-      value = acc( *this );
-      return true;
-   }
-
-
-   bool TrigComposite_v1::getDetail( const std::string& name,
-                                     std::vector< int32_t >& value ) const {
-
-      // Object used to access the auxiliary data:
-      Accessor< std::vector< int32_t > > acc( name );
-
-      // Enable the check once it will work correctly:
-      if( ! acc.isAvailable( *this ) ) {
-         return false;
-      }
-
-      // Retrieve this detail:
-      value = acc( *this );
-      return true;
-   }
-
-   bool TrigComposite_v1::getDetail( const std::string& name,
-                                     std::vector< uint32_t >& value ) const {
-
-     std::vector<int32_t> temp;
-     const bool status = getDetail(name, temp);
-     
-     value.reserve(temp.size());
-     for ( int32_t i: temp )
-       value.push_back(i);
-     return status;
-   }
-
-   bool TrigComposite_v1::getDetail( const std::string& name,
-                                     std::vector< uint16_t >& value ) const {
-
-     std::vector<uint32_t> temp;
-     const bool status = getDetail(name, temp);
-     value.reserve(temp.size() * 2);
-
-     // Unpack shorts
-     static const uint32_t mask = std::numeric_limits<uint16_t>::max();
-     for (size_t i = 0; i < temp.size(); ++i) {
-       const uint32_t packed = temp.at(i);
-       const uint16_t a = packed & mask;
-       const uint16_t b = packed >> 16;
-       value.push_back(a);
-       // Use this to tell if the second half of the int was used or not
-       if (b != std::numeric_limits<uint16_t>::max()) {
-         value.push_back(b);
-       }
-     }
-
-     return status;
-   }
-
-
-   bool TrigComposite_v1::getDetail( const std::string& name,
-                                     std::vector< float >& value ) const {
-
-      // Object used to access the auxiliary data:
-      Accessor< std::vector< float > > acc( name );
-
-      // Enable the check once it will work correctly:
-      if( ! acc.isAvailable( *this ) ) {
-         return false;
-      }
-
-      // Retrieve this detail:
-      value = acc( *this );
-      return true;
-   }
-
-   bool TrigComposite_v1::getDetail( const std::string& name,
-                                     std::string& value ) const {
-
-      std::vector<uint32_t> temp;
-      const bool status = getDetail(name, temp);
-
-      HLT::StringSerializer::deserialize(temp.begin(), temp.end(), value);
-      return status;
-   }
-
-   bool TrigComposite_v1::getDetail( const std::string& name,
-                                     std::vector< std::string >& value ) const {
-
-      std::vector<uint32_t> temp;
-      const bool status = getDetail(name, temp);
-
-      HLT::StringSerializer::deserialize(temp.begin(), temp.end(), value);
-      return status;
-   }
+  AUXSTORE_OBJECT_SETTER_AND_GETTER( TrigComposite_v1, std::string,
+                                      name, setName )
 
    //
    /////////////////////////////////////////////////////////////////////////////
diff --git a/Event/xAOD/xAODTrigger/share/ut_xaodtrigger_trigcomposite_test.ref b/Event/xAOD/xAODTrigger/share/ut_xaodtrigger_trigcomposite_test.ref
index 332fac4a699a78f39db54123f5b784acf545ed45..d46641d05b5a2a7a897185148194766da87fd07c 100644
--- a/Event/xAOD/xAODTrigger/share/ut_xaodtrigger_trigcomposite_test.ref
+++ b/Event/xAOD/xAODTrigger/share/ut_xaodtrigger_trigcomposite_test.ref
@@ -1,9 +1,8 @@
 Populating initial TC object
 Set detail ok.
+Set detail ok.
 Testing initial TC object
 Has detail ok.
-UnsignedShortVecValueEven = 5 10 50 100 
-UnsignedShortVecValueOdd = 1 1 3 4 7 
 FloatVecValue = [1.23, 2.34]
 Simple getDetail API ok.
 Missing details handled ok.
@@ -11,8 +10,6 @@ Basic link functionality OK
 Link recovery OK
 Testing copy constructor
 Has detail ok.
-UnsignedShortVecValueEven = 5 10 50 100 
-UnsignedShortVecValueOdd = 1 1 3 4 7 
 FloatVecValue = [1.23, 2.34]
 Simple getDetail API ok.
 Missing details handled ok.
@@ -20,8 +17,6 @@ Basic link functionality OK
 Link recovery OK
 Testing assignment operator (standalone object)
 Has detail ok.
-UnsignedShortVecValueEven = 5 10 50 100 
-UnsignedShortVecValueOdd = 1 1 3 4 7 
 FloatVecValue = [1.23, 2.34]
 Simple getDetail API ok.
 Missing details handled ok.
@@ -29,8 +24,13 @@ Basic link functionality OK
 Link recovery OK
 Testing assignment operator (object with store)
 Has detail ok.
-UnsignedShortVecValueEven = 5 10 50 100 
-UnsignedShortVecValueOdd = 1 1 3 4 7 
+FloatVecValue = [1.23, 2.34]
+Simple getDetail API ok.
+Missing details handled ok.
+Basic link functionality OK
+Link recovery OK
+Testing assignment operator (EDM migration - new aux)
+Has detail ok.
 FloatVecValue = [1.23, 2.34]
 Simple getDetail API ok.
 Missing details handled ok.
diff --git a/Event/xAOD/xAODTrigger/test/ut_xaodtrigger_trigcomposite_test.cxx b/Event/xAOD/xAODTrigger/test/ut_xaodtrigger_trigcomposite_test.cxx
index 3f02ee018d778445137a9279ee6de534dc078c9a..7a5c5446a7bc724812fbe762a9a1bfc480f12bd3 100644
--- a/Event/xAOD/xAODTrigger/test/ut_xaodtrigger_trigcomposite_test.cxx
+++ b/Event/xAOD/xAODTrigger/test/ut_xaodtrigger_trigcomposite_test.cxx
@@ -11,10 +11,12 @@
 // EDM include(s):
 #include "AthLinks/ElementLink.h"
 #include "AthLinks/ElementLinkVector.h"
+#include "AthContainers/tools/copyAuxStoreThinned.h"
 
 // Local include(s):
 #include "xAODTrigger/TrigCompositeContainer.h"
 #include "xAODTrigger/TrigCompositeAuxContainer.h"
+#include "xAODTrigger/versions/TrigCompositeAuxContainer_v1.h"
 #include "xAODTrigger/MuonRoIContainer.h"
 
 /// Helper macro for testing the code
@@ -43,21 +45,12 @@ std::ostream& operator<< ( std::ostream& out, const std::vector< T >& vec ) {
    return out;
 }
 
-const unsigned uintTestConst = (1<<(sizeof(unsigned)*4-1)) + 41;
-
 int populateObject(xAOD::TrigComposite* obj) {
-   // Set some simple properties on it:
    obj->setName( "TestObj" );
    obj->setDetail( "IntValue", 12 );
-   obj->setDetail( "UnsignedIntValue", uintTestConst );
    obj->setDetail( "FloatValue", 3.14f );
    obj->setDetail( "IntVecValue", std::vector< int >( { 1, 2, 3 } ) );
-   obj->setDetail( "UnsignedIntVecValue", std::vector< unsigned int >( { uintTestConst, 2, 3 } ) );
-   obj->setDetail( "UnsignedShortVecValueEven", std::vector< uint16_t >( { 5, 10, 50, 100 } ) ); // Packs into two ints
-   obj->setDetail( "UnsignedShortVecValueOdd", std::vector< uint16_t >( { 1, 1, 3, 4, 7 } ) ); // Packs into three ints
    obj->setDetail( "FloatVecValue", std::vector< float >( { 1.23, 2.34 } ) );
-   obj->setDetail( "StringValue", std::string("I am a string"));
-   obj->setDetail( "StringVecValue", std::vector< std::string >( {"Hello", "I", "am", "a", "string", "vector"} ) );
 
    std::cout << "Set detail ok." << std::endl;
 
@@ -83,16 +76,9 @@ int populateObject(xAOD::TrigComposite* obj) {
 
 int testDetails(const xAOD::TrigComposite* obj) {
    SIMPLE_ASSERT( obj->hasDetail<int>("IntValue") );
-   SIMPLE_ASSERT( obj->hasDetail<unsigned int>("UnsignedIntValue") );
    SIMPLE_ASSERT( obj->hasDetail<float>("FloatValue") );
    SIMPLE_ASSERT( obj->hasDetail<std::vector<int> >("IntVecValue") );
-   SIMPLE_ASSERT( obj->hasDetail<std::vector<unsigned int> >("UnsignedIntVecValue") );
-   // These should work.... but they do not.... still being investigated
-   // SIMPLE_ASSERT( obj->hasDetail<std::vector<uint16_t> >("UnsignedShortVecValueEven") );
-   // SIMPLE_ASSERT( obj->hasDetail<std::vector<uint16_t> >("UnsignedShortVecValueOdd") );
    SIMPLE_ASSERT( obj->hasDetail<std::vector<float> >("FloatVecValue") );
-   // SIMPLE_ASSERT( obj->hasDetail<std::string>("StringValue") );
-   // SIMPLE_ASSERT( obj->hasDetail<std::vector<std::string> >("StringVecValue") );
 
    std::cout << "Has detail ok." << std::endl;
 
@@ -103,10 +89,6 @@ int testDetails(const xAOD::TrigComposite* obj) {
    SIMPLE_ASSERT( obj->getDetail( "IntValue", intValue ) );
    SIMPLE_ASSERT( intValue == 12 );
 
-   unsigned int unsignedIntValue = 0; // we want to use also the sin bit
-   SIMPLE_ASSERT( obj->getDetail( "UnsignedIntValue", unsignedIntValue ) );
-   SIMPLE_ASSERT( unsignedIntValue == uintTestConst );
-
    float floatValue = 0;
    SIMPLE_ASSERT( obj->getDetail( "FloatValue", floatValue ) );
    SIMPLE_ASSERT( std::abs( floatValue - 3.14 ) < 0.001 );
@@ -115,41 +97,13 @@ int testDetails(const xAOD::TrigComposite* obj) {
    SIMPLE_ASSERT( obj->getDetail( "IntVecValue", intVector ) );
    SIMPLE_ASSERT( intVector == std::vector< int >( { 1, 2, 3 } ) );
 
-   std::vector<unsigned int> unsignedIntVector;
-   SIMPLE_ASSERT( obj->getDetail("UnsignedIntVecValue", unsignedIntVector) );
-   SIMPLE_ASSERT( unsignedIntVector == std::vector<unsigned int>( { uintTestConst, 2, 3 } ) );
-
-   std::vector<uint16_t> unsignedShortVectorEven;
-   SIMPLE_ASSERT( obj->getDetail("UnsignedShortVecValueEven", unsignedShortVectorEven) );
-   std::cout << "UnsignedShortVecValueEven = ";
-   for (auto v : unsignedShortVectorEven) std::cout << v << " ";
-   std::cout << std::endl;
-   SIMPLE_ASSERT( unsignedShortVectorEven == std::vector<uint16_t>( { 5, 10, 50, 100 } ) );
-
-   std::vector<uint16_t> unsignedShortVectorOdd;
-   SIMPLE_ASSERT( obj->getDetail("UnsignedShortVecValueOdd", unsignedShortVectorOdd) );
-   std::cout << "UnsignedShortVecValueOdd = ";
-   for (auto v : unsignedShortVectorOdd) std::cout << v << " ";
-   std::cout << std::endl;
-   SIMPLE_ASSERT( unsignedShortVectorOdd == std::vector<uint16_t>( { 1, 1, 3, 4, 7 } ) );
-
    std::vector< float > floatVector;
    SIMPLE_ASSERT( obj->getDetail( "FloatVecValue", floatVector ) );
    // Simply just print the last one:
    std::cout << "FloatVecValue = " << floatVector << std::endl;
 
-   std::string stringValue;
-   SIMPLE_ASSERT( obj->getDetail("StringValue", stringValue) );
-   SIMPLE_ASSERT( stringValue == std::string("I am a string") );
-
-   std::vector<std::string> stringVecValue;
-   SIMPLE_ASSERT( obj->getDetail("StringVecValue", stringVecValue) );
-   SIMPLE_ASSERT( stringVecValue == std::vector< std::string >( {"Hello", "I", "am", "a", "string", "vector"} ) );
-
    int intValue2 = obj->getDetail<int>("IntValue");
    SIMPLE_ASSERT( intValue2 == 12 );
-   unsigned int unsignedIntValue2 = obj->getDetail<unsigned int>("UnsignedIntValue");
-   SIMPLE_ASSERT( unsignedIntValue2 == uintTestConst);
    float floatValue2 = obj->getDetail<float>("FloatValue");
    SIMPLE_ASSERT( std::abs( floatValue2 - 3.14 ) < 0.001 );
    std::vector<int> intVector2 =  obj->getDetail<std::vector<int>>( "IntVecValue");
@@ -157,9 +111,6 @@ int testDetails(const xAOD::TrigComposite* obj) {
    std::vector< float > floatVector2 = obj->getDetail<std::vector<float>>( "FloatVecValue");
    std::cout << "Simple getDetail API ok." << std::endl;
 
-   std::vector<unsigned int> unsignedIntVector2 = obj->getDetail<std::vector<unsigned int>>("UnsignedIntVecValue");
-   SIMPLE_ASSERT( unsignedIntVector2 == std::vector<unsigned int>( { uintTestConst, 2, 3 } ) );
-
    try {
      obj->getDetail<int>("NonExistent");
      SIMPLE_ASSERT(false);
@@ -242,6 +193,22 @@ int main() {
    c2.push_back( obj2 );
    *obj2 = *obj;
 
+   // Testing the v1 -> v2 EDM migration, change in Aux base class
+   xAOD::TrigCompositeAuxContainer_v1 aux_v1;
+   xAOD::TrigCompositeContainer c_edm_a;
+   c_edm_a.setStore( &aux_v1 );
+   xAOD::TrigComposite* obj_edm_a = new xAOD::TrigComposite();
+   c_edm_a.push_back(obj_edm_a); // Now has an old-style store
+   populateObject(obj_edm_a);
+   // Creating a new object in a new store
+   xAOD::TrigCompositeAuxContainer aux_vlatest;
+   xAOD::TrigCompositeContainer c_edm_b;
+   c_edm_b.setStore( &aux_vlatest );
+   xAOD::TrigComposite* obj_edm_b = new xAOD::TrigComposite();
+   c_edm_b.push_back(obj_edm_b);
+   // Copy
+   SG::copyAuxStoreThinned( aux_v1, aux_vlatest, 0 ); 
+
    std::cout << "Testing initial TC object" << std::endl;
    SIMPLE_ASSERT( testObject(obj) == 0 );
 
@@ -254,6 +221,9 @@ int main() {
    std::cout << "Testing assignment operator (object with store)" << std::endl;
    SIMPLE_ASSERT( testObject(obj2) == 0 );
 
+   std::cout << "Testing assignment operator (EDM migration - new aux)" << std::endl;
+   SIMPLE_ASSERT( testObject(obj_edm_b) == 0 );
+
    // Make new objects to test the link copy
    xAOD::TrigComposite* fullCopy = new xAOD::TrigComposite();
    c.push_back( fullCopy );
diff --git a/Event/xAOD/xAODTrigger/xAODTrigger/selection.xml b/Event/xAOD/xAODTrigger/xAODTrigger/selection.xml
index 279b13a8d10c048ac251ea8c0fc420d430eddc83..a336d26549c40ab88c901f80d273464d24d46d90 100644
--- a/Event/xAOD/xAODTrigger/xAODTrigger/selection.xml
+++ b/Event/xAOD/xAODTrigger/xAODTrigger/selection.xml
@@ -110,6 +110,10 @@
    <class name="xAOD::TrigCompositeAuxContainer_v1"
           id="171EB8B8-A777-47D9-94A9-33B2482E2AAF" />
 
+   <!-- TrigComposite_v2 dictionaries: -->
+   <class name="xAOD::TrigCompositeAuxContainer_v2"
+          id="3174A8A0-7EA2-436D-93FC-0D058BE99B09" />
+
    <!-- RoiDescriptorStore_v1 dictionaries: -->
    <class name="xAOD::RoiDescriptorStore_v1"
           id="882822c8-906a-11e5-87f4-02163e010d8c" />
diff --git a/Event/xAOD/xAODTrigger/xAODTrigger/versions/TrigCompositeAuxContainer_v2.h b/Event/xAOD/xAODTrigger/xAODTrigger/versions/TrigCompositeAuxContainer_v2.h
new file mode 100644
index 0000000000000000000000000000000000000000..a930c557c246d21a8ce1ae5b7aa37d3da8c18465
--- /dev/null
+++ b/Event/xAOD/xAODTrigger/xAODTrigger/versions/TrigCompositeAuxContainer_v2.h
@@ -0,0 +1,52 @@
+// Dear emacs, this is -*- c++ -*-
+
+/*
+  Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration
+*/
+
+// $Id: TrigCompositeAuxContainer_v2.h $
+#ifndef XAODTRIGGER_VERSIONS_TRIGCOMPOSITEAUXCONTAINER_V2_H
+#define XAODTRIGGER_VERSIONS_TRIGCOMPOSITEAUXCONTAINER_V2_H
+
+// System include(s):
+extern "C" {
+#   include <stdint.h>
+}
+#include <vector>
+#include <string>
+
+// xAOD include(s):
+#include "xAODCore/AuxContainerBase.h"
+
+namespace xAOD {
+
+   /// Auxiliary store for TrigComposite containers
+   ///
+   /// This v2 changes the base class from ByteStreamAuxContainer_v1 to AuxContainerBase 
+   /// for Run 3. Otherwise, it is the same.
+   ///
+   /// $Date: 2019-01-23 $
+   ///
+   class TrigCompositeAuxContainer_v2 : public AuxContainerBase {
+
+   public:
+      /// Default constuctor
+      TrigCompositeAuxContainer_v2();
+
+   private:
+      std::vector< std::string > name;
+
+      std::vector< std::vector< std::string > > linkColNames;
+      std::vector< std::vector< uint32_t > >    linkColKeys;
+      std::vector< std::vector< uint16_t > >    linkColIndices;
+      std::vector< std::vector< uint32_t > >    linkColClids;
+
+   }; // class TrigCompositeAuxContainer_v2
+
+} // namespace xAOD
+
+// Declare the inheritance of the class:
+#include "xAODCore/BaseInfo.h"
+SG_BASE( xAOD::TrigCompositeAuxContainer_v2, xAOD::AuxContainerBase );
+
+#endif // XAODTRIGGER_VERSIONS_TRIGCOMPOSITEAUXCONTAINER_V2_H
diff --git a/Event/xAOD/xAODTrigger/xAODTrigger/versions/TrigComposite_v1.h b/Event/xAOD/xAODTrigger/xAODTrigger/versions/TrigComposite_v1.h
index 0f55daf1f17205fecdcfb3572e80c55a9068b5e7..69027545a609b4ff24d31955a2edc4eac9ed0f6c 100644
--- a/Event/xAOD/xAODTrigger/xAODTrigger/versions/TrigComposite_v1.h
+++ b/Event/xAOD/xAODTrigger/xAODTrigger/versions/TrigComposite_v1.h
@@ -63,70 +63,17 @@ namespace xAOD {
       template< typename TYPE >
       bool hasDetail( const std::string& name ) const;
 
-      /// Set an integer detail on the object
-      bool setDetail( const std::string& name, int32_t value );
-      /// Set an unsigned detail on the object
-      bool setDetail( const std::string& name, uint32_t value );
-      /// Set a floating point detail on the object
-      bool setDetail( const std::string& name, float value );
-      /// Set a string detail on the object
-      bool setDetail( const std::string& name,
-                      const std::string& value );
-      /// Set a vector<int> detail on the object
-      bool setDetail( const std::string& name,
-                      const std::vector< int32_t >& value );
-      /// Set a vector<unsigned int> detail on the object 
-      bool setDetail( const std::string& name,
-                      const std::vector< uint32_t >& value );
-      /// Set a vector<unsigned short> detail on the object. Note: For an even vector, the final entry cannot be (2^16)-1=65535
-      bool setDetail( const std::string& name,
-                      const std::vector< uint16_t >& value );
-      /// Set a vector<float> detail on the object
-      bool setDetail( const std::string& name,
-                      const std::vector< float >& value );
-      /// Set a vector<string> detail on the object
-      bool setDetail( const std::string& name,
-                      const std::vector< std::string >& value );
-
-      /// Get an integer detail from the object
-      bool getDetail( const std::string& name, int32_t& value ) const;
-
-      /// Get an unsigned integer detail from the object
-      bool getDetail( const std::string& name, uint32_t& value ) const;
-
-      /// Get a floating point detail from the object
-      bool getDetail( const std::string& name, float& value ) const;
-
-      /// Get a string detail from the object
-      bool getDetail( const std::string& name, std::string& value ) const;
-
-      /// Get a vector<int> detail from the object
-      bool getDetail( const std::string& name,
-                      std::vector< int32_t >& value ) const;
-
-      /// Get a vector<insigned int> detail from the object
-      bool getDetail( const std::string& name,
-                      std::vector< uint32_t >& value ) const;
-
-      /// Get a vector<unsigned short> detail from the object
-      bool getDetail( const std::string& name,
-                      std::vector< uint16_t >& value ) const;
-
-      /// Get a vector<float> detail from the object
-      bool getDetail( const std::string& name,
-                      std::vector< float >& value ) const;
-
-      /// Get a vector<string> detail from the object
-      bool getDetail( const std::string& name,
-                      std::vector< std::string >& value ) const;
+      /// Set an TYPE detail on the object
+      template< typename TYPE >
+      bool setDetail( const std::string& name, const TYPE& value );
 
-      /// Get a detail by name, missing detail will result on std::runtime_error exception
-      template<typename T>
-      T getDetail( const std::string& name ) const;
+      /// Get an TYPE detail from the object
+      template< typename TYPE >
+      bool getDetail( const std::string& name, TYPE& value ) const;
 
-      /// Get a detail by name, will not throw. Name change to solve disambiguation
-      template<typename T>
-      std::pair<bool, T> returnDetail( const std::string& name ) const;
+      /// Get a detail by name, missing detail will result on std::runtime_error exception
+      template<typename TYPE>
+      TYPE getDetail( const std::string& name ) const;
 
       /// @}
 
@@ -162,9 +109,16 @@ namespace xAOD {
       ElementLinkVector< CONTAINER >
       objectCollectionLinks( const std::string& collectionName ) const;
 
+      /// Add a link without type
+      void typelessSetObjectLink( const std::string& name, 
+                                  const uint32_t key, 
+                                  const uint32_t clid, 
+                                  const uint16_t beginIndex, 
+                                  const uint16_t endIndex = 0 );
+
       /// @}
 
-      /// @name Functions for accessing links to component objects and object collections
+      /// @name Functions for copying links between objects
       /// @{
 
       /// Copy one named link from another object.
@@ -206,8 +160,6 @@ namespace xAOD {
       /// Raw access to the persistent link CLIDs
       const std::vector< uint32_t >& linkColClids() const;
 
-      /// Add a link without type
-      void typelessSetObjectLink( const std::string& name, const uint32_t key, const uint32_t clid, const uint16_t beginIndex, const uint16_t endIndex = 0 );
 
       /// @}
 
diff --git a/Event/xAOD/xAODTrigger/xAODTrigger/versions/TrigComposite_v1.icc b/Event/xAOD/xAODTrigger/xAODTrigger/versions/TrigComposite_v1.icc
index f3ba33b46801c5ebad0cb304ad038333e23c4310..360664965ada39b4a054b1a6beaf1e6d3a60151e 100644
--- a/Event/xAOD/xAODTrigger/xAODTrigger/versions/TrigComposite_v1.icc
+++ b/Event/xAOD/xAODTrigger/xAODTrigger/versions/TrigComposite_v1.icc
@@ -1,7 +1,7 @@
 // Dear emacs, this is -*- c++ -*-
 
 /*
-  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+  Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration
 */
 
 // $Id: TrigComposite_v1.icc 784388 2016-11-15 17:08:58Z tamartin $
@@ -19,36 +19,46 @@
 
 namespace xAOD {
 
-   template< typename TYPE >
-   bool TrigComposite_v1::hasDetail( const std::string& name ) const {
-
-      // Object used to check for the existence of an object:
-      Accessor< TYPE > acc( name );
-
-      // Use the Accessor object for the check:
-      return acc.isAvailable( *this );
-   }
+  template< typename TYPE >
+  bool TrigComposite_v1::hasDetail( const std::string& name ) const {
 
-   template<>     
-   bool TrigComposite_v1::hasDetail<unsigned int>( const std::string& name ) const;
+    // Object used to check for the existence of an object:
+    ConstAccessor< TYPE > acc( name );
 
-   template<>     
-   bool TrigComposite_v1::hasDetail<std::vector<unsigned int>>( const std::string& name ) const;
+    // Use the Accessor object for the check:
+    return acc.isAvailable( *this );
+  }
 
+  template< typename TYPE >
+  bool TrigComposite_v1::setDetail( const std::string& name, const TYPE& value ) {
+    // It should be pretty strange if this should fail:
+    try {
+       auxdata< TYPE >( name ) = value;
+    } catch(const std::exception& exc) {
+       std::cerr << "xAOD::TrigComposite_v1::setDetail ERROR Internal logic error found: [" << exc.what() << "]" << std::endl;
+       return false;
+    }
+    // Return gracefully:
+    return true;
+  }
 
   template< typename TYPE >
-  TYPE TrigComposite_v1::getDetail( const std::string& name ) const {
-   TYPE temp;
-   if ( getDetail(name, temp) == false ) 
-     throw std::runtime_error( "xAOD::TrigComposite::getDetail<TYPE>("+name+") encountered missing detail"); 
-   return temp; // RVO
+  bool TrigComposite_v1::getDetail( const std::string& name, TYPE& value) const {
+    if( ! hasDetail<TYPE>(name) ) {
+       return false;
+    }
+    // Object used to access the auxiliary data:
+    ConstAccessor< TYPE > acc( name );
+    value = acc( *this );
+    return true;
   }
 
-  template<typename TYPE>
-  std::pair<bool, TYPE> TrigComposite_v1::returnDetail( const std::string& name ) const {
+  template< typename TYPE >
+  TYPE TrigComposite_v1::getDetail( const std::string& name ) const {
     TYPE temp;
-    bool result = getDetail(name, temp);
-    return std::make_pair(result, temp);
+    if ( getDetail(name, temp) == false ) 
+      throw std::runtime_error( "xAOD::TrigComposite::getDetail<TYPE>("+name+") encountered missing detail"); 
+    return temp; // RVO
   }
   
   template< class CONTAINER >
diff --git a/Event/xAOD/xAODTrigger/xAODTrigger/xAODTriggerDict.h b/Event/xAOD/xAODTrigger/xAODTrigger/xAODTriggerDict.h
index 4945e0a29e7e4e0c41a7b1abe560ec70f5c2630e..6ce42c1839a9c1a88cfda109e3c8e1260f130a4d 100644
--- a/Event/xAOD/xAODTrigger/xAODTrigger/xAODTriggerDict.h
+++ b/Event/xAOD/xAODTrigger/xAODTrigger/xAODTriggerDict.h
@@ -66,6 +66,7 @@
 #include "xAODTrigger/versions/TrigComposite_v1.h"
 #include "xAODTrigger/versions/TrigCompositeContainer_v1.h"
 #include "xAODTrigger/versions/TrigCompositeAuxContainer_v1.h"
+#include "xAODTrigger/versions/TrigCompositeAuxContainer_v2.h"
 
 #include "xAODTrigger/versions/BunchConfKey_v1.h"
 #include "xAODTrigger/versions/BunchConfContainer_v1.h"
diff --git a/Event/xAOD/xAODTriggerAthenaPool/src/xAODTrigCompositeAuxContainerCnv.cxx b/Event/xAOD/xAODTriggerAthenaPool/src/xAODTrigCompositeAuxContainerCnv.cxx
index a8ab7fcb3cd958f887814dbf278ee9f647082786..02f0be4aa2641882b6a8272b24adedb65e5d3b86 100644
--- a/Event/xAOD/xAODTriggerAthenaPool/src/xAODTrigCompositeAuxContainerCnv.cxx
+++ b/Event/xAOD/xAODTriggerAthenaPool/src/xAODTrigCompositeAuxContainerCnv.cxx
@@ -1,9 +1,73 @@
 /*
- * Copyright (C) 2002-2018 CERN for the benefit of the ATLAS collaboration.
- */
-/**
- * @file xAODTriggerAthenaPool/xAODTrigCompositeAuxContainer.h
- * @author scott snyder <snyder@bnl.gov>
- * @date Dec, 2018
- * @brief Dummy source file so that cmake will know this is a custom converter.
- */
+  Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration
+*/
+
+// System include(s):
+#include <exception>
+#include <memory>
+#include <iostream>
+
+// EDM include(s):
+#include "xAODTrigger/versions/TrigCompositeAuxContainer_v1.h"
+
+// Local include(s):
+#include "xAODTrigCompositeAuxContainerCnv.h"
+#include "xAODTrigCompositeAuxContainerCnv_v1.h"
+#include "AthContainers/tools/copyThinned.h"
+#include "AthenaKernel/IThinningSvc.h"
+
+xAODTrigCompositeAuxContainerCnv::xAODTrigCompositeAuxContainerCnv( ISvcLocator* svcLoc )
+   : xAODTrigCompositeAuxContainerCnvBase( svcLoc ) {
+
+}
+
+xAOD::TrigCompositeAuxContainer*
+xAODTrigCompositeAuxContainerCnv::
+createPersistent( xAOD::TrigCompositeAuxContainer* trans ) {
+
+   // Create a copy of the container:
+   return SG::copyThinned (*trans, IThinningSvc::instance());
+}
+
+StatusCode xAODTrigCompositeAuxContainerCnv::
+createObj( IOpaqueAddress* pAddr, DataObject*& pObj ){
+
+   // Get the key of the container that we'll be creating:
+   m_key = *( pAddr->par() + 1 );
+   ATH_MSG_VERBOSE( "Key of xAOD::TrigCompositeAuxContainer: " << m_key );
+
+  // Let the base class do its thing now:
+  return AthenaPoolConverter::createObj( pAddr, pObj );  
+}
+
+xAOD::TrigCompositeAuxContainer* xAODTrigCompositeAuxContainerCnv::createTransient() {
+
+   // The known ID(s) for this container:
+   static const pool::Guid v1_guid( "171EB8B8-A777-47D9-94A9-33B2482E2AAF" );
+   static const pool::Guid v2_guid( "3174A8A0-7EA2-436D-93FC-0D058BE99B09" );
+
+   // Check which version of the container we're reading:
+   if( compareClassGuid( v2_guid ) ) {
+
+      // It's the latest version, read it directly:
+      return poolReadObject< xAOD::TrigCompositeAuxContainer >();
+
+   }
+   else if( compareClassGuid( v1_guid ) ) {
+  
+      // The v1 converter:
+      static xAODTrigCompositeAuxContainerCnv_v1 converter;
+
+      // Read in the v1 object:
+      std::unique_ptr< xAOD::TrigCompositeAuxContainer_v1 >
+         old( poolReadObject< xAOD::TrigCompositeAuxContainer_v1 >() );
+
+      // Return the converted object:
+      return converter.createTransient( old.get(), msg() );
+   }
+
+   // If we didn't recognise the ID:
+   throw std::runtime_error( "Unsupported version of "
+                             "xAOD::TrigCompositeAuxContainer found" );
+   return 0;
+}
diff --git a/Event/xAOD/xAODTriggerAthenaPool/src/xAODTrigCompositeAuxContainerCnv.h b/Event/xAOD/xAODTriggerAthenaPool/src/xAODTrigCompositeAuxContainerCnv.h
index 2cc3737c885bc781f6982f72fc0da3ba0d870849..b189b579ec6928895120ddd0034bf5e144253dfb 100644
--- a/Event/xAOD/xAODTriggerAthenaPool/src/xAODTrigCompositeAuxContainerCnv.h
+++ b/Event/xAOD/xAODTriggerAthenaPool/src/xAODTrigCompositeAuxContainerCnv.h
@@ -1,6 +1,6 @@
 // This file's extension implies that it's C, but it's really -*- C++ -*-.
 /*
- * Copyright (C) 2002-2018 CERN for the benefit of the ATLAS collaboration.
+ * Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration.
  */
 /**
  * @file xAODTriggerAthenaPool/xAODTrigCompositeAuxContainer.h
@@ -13,10 +13,53 @@
 #ifndef XAODTRIGGERATHENAPOOL_XAODTRIGCOMPOSITEAUXCONTAINER_H
 #define XAODTRIGGERATHENAPOOL_XAODTRIGCOMPOSITEAUXCONTAINER_H
 
+// stystem includes
+#include <string>
+
+// Gaudi/Athena include(s):
+#include "AthenaPoolCnvSvc/T_AthenaPoolCustomCnv.h"
+
+// EDM include(s):
 #include "xAODTrigger/TrigCompositeAuxContainer.h"
-#include "AthenaPoolCnvSvc/T_AthenaPoolAuxContainerCnv.h"
 
-typedef T_AthenaPoolAuxContainerCnv<xAOD::TrigCompositeAuxContainer>
-  xAODTrigCompositeAuxContainerCnv;
+
+/// Base class for the converter
+typedef T_AthenaPoolCustomCnv< xAOD::TrigCompositeAuxContainer,
+                               xAOD::TrigCompositeAuxContainer >
+   xAODTrigCompositeAuxContainerCnvBase;
+
+/**
+ *  @short POOL converter for the xAOD::TrigCompositeAuxContainer class
+ *
+ *         This is the converter doing the actual schema evolution
+ *         of the package via the Aux container
+ *
+ */
+class xAODTrigCompositeAuxContainerCnv :
+   public xAODTrigCompositeAuxContainerCnvBase {
+
+   // Declare the factory as our friend:
+   friend class CnvFactory< xAODTrigCompositeAuxContainerCnv >;
+
+protected:
+   /// Converter constructor
+public:
+   xAODTrigCompositeAuxContainerCnv( ISvcLocator* svcLoc );
+protected:
+
+   /// Function preparing the container to be written out
+   virtual xAOD::TrigCompositeAuxContainer*
+   createPersistent( xAOD::TrigCompositeAuxContainer* trans );
+   /// Function reading in the object from the input file
+   virtual xAOD::TrigCompositeAuxContainer* createTransient();
+
+   /// Re-implemented function in order to get access to the SG key
+   virtual StatusCode createObj( IOpaqueAddress* pAddr, DataObject*& pObj );
+
+private:
+  std::string m_key;
+
+
+}; // class xAODTrigCompositeAuxContainerCnv
 
 #endif // not XAODTRIGGERATHENAPOOL_XAODTRIGCOMPOSITEAUXCONTAINER_H
diff --git a/Event/xAOD/xAODTriggerAthenaPool/src/xAODTrigCompositeAuxContainerCnv_v1.cxx b/Event/xAOD/xAODTriggerAthenaPool/src/xAODTrigCompositeAuxContainerCnv_v1.cxx
new file mode 100644
index 0000000000000000000000000000000000000000..614b518ec5e0d911535db6985724fbda94692078
--- /dev/null
+++ b/Event/xAOD/xAODTriggerAthenaPool/src/xAODTrigCompositeAuxContainerCnv_v1.cxx
@@ -0,0 +1,85 @@
+/*
+  Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration
+*/
+
+// System include(s):
+#include <stdexcept>
+
+// Gaudi/Athena include(s):
+#include "GaudiKernel/MsgStream.h"
+
+// EDM include(s):
+#include "xAODTrigger/versions/TrigCompositeAuxContainer_v1.h"
+#include "xAODTrigger/TrigCompositeAuxContainer.h"
+#include "xAODTrigger/versions/TrigCompositeContainer_v1.h"
+#include "xAODTrigger/TrigCompositeContainer.h"
+
+// Core EDM include(s):
+#include "AthContainers/tools/copyAuxStoreThinned.h"
+
+// Local include(s):
+#include "xAODTrigCompositeAuxContainerCnv_v1.h"
+
+/// Convenience macro for setting the level of output messages
+#define MSGLVL MSG::DEBUG
+
+/// Another convenience macro for printing messages in the converter
+#define ATH_MSG( MSG )                          \
+   do {                                         \
+      if( log.level() <= MSGLVL ) {             \
+         log << MSGLVL << MSG << endmsg;        \
+      }                                         \
+   } while( 0 )
+
+xAODTrigCompositeAuxContainerCnv_v1::xAODTrigCompositeAuxContainerCnv_v1()
+  : T_AthenaPoolTPCnvBase< xAOD::TrigCompositeAuxContainer,
+                           xAOD::TrigCompositeAuxContainer_v1 >() {
+
+}
+
+void xAODTrigCompositeAuxContainerCnv_v1::
+persToTrans( const xAOD::TrigCompositeAuxContainer_v1* oldObj,
+             xAOD::TrigCompositeAuxContainer* newObj,
+             MsgStream& log ) {
+
+   // Greet the user:
+   ATH_MSG( "Converting xAOD::TrigCompositeAuxContainer_v1 to current version..." );
+
+   // ROOT work-around https://sft.its.cern.ch/jira/browse/ROOT-9762
+   // This resets the newly made underlying ByteStreamAuxContainer_1 such that it knows about its dynamic content
+   // This can be removed once xAODTrigger's selection.xml is correctly calling this.
+   xAOD::TrigCompositeAuxContainer_v1* mutableOld = const_cast<xAOD::TrigCompositeAuxContainer_v1*>(oldObj);
+   if (mutableOld) {
+      mutableOld->reset();
+   } else {
+      throw std::runtime_error("Unable to const_cast xAOD::TrigCompositeAuxContainer_v1. Needed due to ROOT-9762.");
+   }
+
+   // Clear the transient object:
+   newObj->resize( 0 );
+
+   // This line does the conversion.
+   SG::copyAuxStoreThinned( *oldObj, *newObj, 0 ); 
+
+   // Print what happened:
+   ATH_MSG( "Converting xAOD::TrigCompositeAuxContainer_v1 to current version "
+      "[OK]" );
+   
+   return;
+}
+
+/// This function should never be called, as we are not supposed to convert
+/// object before writing.
+///
+void xAODTrigCompositeAuxContainerCnv_v1::transToPers( const xAOD::TrigCompositeAuxContainer*,
+                                                       xAOD::TrigCompositeAuxContainer_v1*,
+                                                       MsgStream& log ) {
+
+   log << MSG::ERROR
+       << "Somebody called xAODTrigCompositeAuxContainerCnv_v1::transToPers"
+       << endmsg;
+   throw std::runtime_error( "Somebody called xAODTrigCompositeAuxContainerCnv_v1::"
+                             "transToPers" );
+
+   return;
+}
diff --git a/Event/xAOD/xAODTriggerAthenaPool/src/xAODTrigCompositeAuxContainerCnv_v1.h b/Event/xAOD/xAODTriggerAthenaPool/src/xAODTrigCompositeAuxContainerCnv_v1.h
new file mode 100644
index 0000000000000000000000000000000000000000..a3a33c5ddcb02b69d92289e690946e1714871de8
--- /dev/null
+++ b/Event/xAOD/xAODTriggerAthenaPool/src/xAODTrigCompositeAuxContainerCnv_v1.h
@@ -0,0 +1,43 @@
+/*
+  Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration
+*/
+
+#ifndef XAODTRIGGERATHENAPOOL_XAODTRIGCOMPOSITEAUXCONTAINER_V1_H
+#define XAODTRIGGERATHENAPOOL_XAODTRIGCOMPOSITEAUXCONTAINER_V1_H
+
+// Gaudi/Athena include(s):
+#include "AthenaPoolCnvSvc/T_AthenaPoolTPConverter.h"
+
+// EDM include(s):
+#include "xAODTrigger/TrigCompositeAuxContainer.h"
+#include "xAODTrigger/versions/TrigCompositeAuxContainer_v1.h"
+
+/// Converter class used for reading TrigCompositeAuxContainer_v1
+///
+/// This class implements the meat of the v1->vX conversion for xAOD::TrigCompositeAuxContainer.
+/// It translates the payload from the v1 object to the latest type.
+/// The converter is implemented in a separate class in order to make it
+/// visible to the BS reading code as well.
+///
+/// v1 used ByteStreamAuxContainer_v1 base, v2 uses the standard AuxContainerBase
+///
+class xAODTrigCompositeAuxContainerCnv_v1 :
+   public T_AthenaPoolTPCnvBase< xAOD::TrigCompositeAuxContainer,
+                                 xAOD::TrigCompositeAuxContainer_v1 > {
+
+public:
+   /// Default constructor
+   xAODTrigCompositeAuxContainerCnv_v1();
+
+   /// Function converting from the old type to the current one
+   virtual void persToTrans( const xAOD::TrigCompositeAuxContainer_v1* oldObj,
+                             xAOD::TrigCompositeAuxContainer* newObj,
+                             MsgStream& log );
+   /// Dummy function inherited from the base class
+   virtual void transToPers( const xAOD::TrigCompositeAuxContainer*,
+                             xAOD::TrigCompositeAuxContainer_v1*,
+                             MsgStream& log );
+
+}; // class TrigCompositeAuxContainer_v1
+
+#endif // XAODTRIGGERATHENAPOOL_XAODTRIGCOMPOSITEAUXCONTAINER_V1_H
diff --git a/Event/xAOD/xAODTriggerAthenaPool/src/xAODTriggerAthenaPoolTPCnv.cxx b/Event/xAOD/xAODTriggerAthenaPool/src/xAODTriggerAthenaPoolTPCnv.cxx
index 4f73a2d50139f001e9e5b28eabae7355324b0df7..772e76a5f2c0704f41955c83e3db2a9966eb4f1b 100644
--- a/Event/xAOD/xAODTriggerAthenaPool/src/xAODTriggerAthenaPoolTPCnv.cxx
+++ b/Event/xAOD/xAODTriggerAthenaPool/src/xAODTriggerAthenaPoolTPCnv.cxx
@@ -1,5 +1,5 @@
 /*
-  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+  Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration
 */
 
 // $Id$
@@ -16,6 +16,8 @@
 #include "xAODTrigger/versions/EmTauRoIAuxContainer_v1.h"
 #include "xAODTrigger/JetRoIAuxContainer.h"
 #include "xAODTrigger/versions/JetRoIAuxContainer_v1.h"
+#include "xAODTrigger/TrigCompositeAuxContainer.h"
+#include "xAODTrigger/versions/TrigCompositeAuxContainer_v1.h"
 
 // Local include(s):
 #include "xAODEmTauRoIContainerCnv_v1.h"
@@ -24,6 +26,7 @@
 #include "xAODJetRoIAuxContainerCnv_v1.h"
 #include "xAODEnergySumRoIAuxInfoCnv_v1.h"
 #include "xAODEnergySumRoICnv_v1.h"
+#include "xAODTrigCompositeAuxContainerCnv_v1.h"
 
 // Declare the T/P converter(s):
 DECLARE_TPCNV_FACTORY( xAODEmTauRoIContainerCnv_v1,
@@ -56,3 +59,7 @@ DECLARE_TPCNV_FACTORY( xAODEnergySumRoICnv_v1,
                        xAOD::EnergySumRoI_v1,
                        Athena::TPCnvVers::Old )
 
+DECLARE_TPCNV_FACTORY( xAODTrigCompositeAuxContainerCnv_v1,
+                       xAOD::TrigCompositeAuxContainer,
+                       xAOD::TrigCompositeAuxContainer_v1,
+                       Athena::TPCnvVers::Old )
diff --git a/Trigger/TrigDataAccess/TrigSerializeResult/python/dictwrite.py b/Trigger/TrigDataAccess/TrigSerializeResult/python/dictwrite.py
index d4542126c129746544dbaf73747d41ef6233221b..34d57c5efcb6cea088d016d3e854840b2b2e865a 100755
--- a/Trigger/TrigDataAccess/TrigSerializeResult/python/dictwrite.py
+++ b/Trigger/TrigDataAccess/TrigSerializeResult/python/dictwrite.py
@@ -69,6 +69,7 @@ objects = [
 'xAOD::VertexAuxContainer_v1',
 'xAOD::TrigCompositeContainer_v1',
 'xAOD::TrigCompositeAuxContainer_v1',
+'xAOD::TrigCompositeAuxContainer_v2',
 'xAOD::MuonRoIContainer_v1',
 'xAOD::MuonRoIAuxContainer_v1',
 'xAOD::EmTauRoIContainer_v2',
diff --git a/Trigger/TrigDataAccess/TrigSerializeResult/share/bs-streamerinfos.root b/Trigger/TrigDataAccess/TrigSerializeResult/share/bs-streamerinfos.root
index dbc118fb5bcf4ab7aa6ca8624826b497ced4b4e7..2caeaa071ff687ab999f3afedefccd5e95bbaafa 100644
Binary files a/Trigger/TrigDataAccess/TrigSerializeResult/share/bs-streamerinfos.root and b/Trigger/TrigDataAccess/TrigSerializeResult/share/bs-streamerinfos.root differ