diff --git a/Event/xAOD/xAODCaloEvent/CMakeLists.txt b/Event/xAOD/xAODCaloEvent/CMakeLists.txt
index 231c2f98588f4e89bb088cb705c8cfd1028d646b..6bcb2e19799bb64798d66221b2272ee2bd369b1e 100644
--- a/Event/xAOD/xAODCaloEvent/CMakeLists.txt
+++ b/Event/xAOD/xAODCaloEvent/CMakeLists.txt
@@ -1,57 +1,38 @@
-# $Id: CMakeLists.txt 774010 2016-09-20 07:09:26Z krasznaa $
-################################################################################
-# Package: xAODCaloEvent
-################################################################################
+# Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
 
-# Declare the package name:
+# Declare the package name.
 atlas_subdir( xAODCaloEvent )
 
-# Extra dependencies, based on what environment we're in:
+# Extra dependencies and sources, based on what environment we're in.
+set( extra_libs )
+set( extra_sources )
 if( NOT XAOD_ANALYSIS AND NOT SIMULATIONBASE AND NOT GENERATIONBASE )
-   set( extra_deps Calorimeter/CaloEvent )
    set( extra_libs CaloEvent )
+   set( extra_sources src/*.cxx )
 endif()
 
-if (BUILDVP1LIGHT)
-    if( BUILDVP1LIGHT_DIST STREQUAL "ubuntu")
-        set( extra_libs ${extra_libs} GenVector )
-    endif()
-endif()
-
-# Declare the package's dependencies:
-atlas_depends_on_subdirs(
-   PUBLIC
-   Calorimeter/CaloGeoHelpers
-   Control/AthContainers
-   Control/CxxUtils
-   DetectorDescription/GeoPrimitives
-   Event/xAOD/xAODBase
-   Event/xAOD/xAODCore
-   Control/AthLinks
-   ${extra_deps} )
-
-# External dependencies:
-find_package( Eigen )
+# External dependencies.
 find_package( ROOT COMPONENTS Core GenVector )
-
-# Extra source(s), based on what environment we are in:
-if( NOT XAOD_ANALYSIS AND NOT SIMULATIONBASE AND NOT GENERATIONBASE )
-   set( extra_sources src/*.cxx )
-endif()
+find_package( xAODUtilities )
 
 # Component(s) in the package:
 atlas_add_library( xAODCaloEvent
    xAODCaloEvent/*.h xAODCaloEvent/versions/*.h Root/*.cxx ${extra_sources}
    PUBLIC_HEADERS xAODCaloEvent
-   INCLUDE_DIRS ${EIGEN_INCLUDE_DIRS}
-   LINK_LIBRARIES ${EIGEN_LIBRARIES} ${ROOT_LIBRARIES} CaloGeoHelpers AthContainers
+   INCLUDE_DIRS ${ROOT_INCLUDE_DIRS}
+   LINK_LIBRARIES ${ROOT_LIBRARIES} CaloGeoHelpers AthContainers
    CxxUtils GeoPrimitives xAODBase xAODCore AthLinks ${extra_libs} )
 
+atlas_add_xaod_smart_pointer_dicts(
+   INPUT xAODCaloEvent/selection.xml
+   OUTPUT _selectionFile
+   CONTAINERS "xAOD::CaloClusterContainer_v1" "xAOD::CaloTowerContainer_v1" )
+
 atlas_add_dictionary( xAODCaloEventDict
    xAODCaloEvent/xAODCaloEventDict.h
-   xAODCaloEvent/selection.xml
-   LINK_LIBRARIES xAODCaloEvent
+   ${_selectionFile}
+   LINK_LIBRARIES xAODCore xAODCaloEvent
    EXTRA_FILES Root/dict/*.cxx )
 
-# Generate CLIDs for the library explicitly:
+# Generate CLIDs for the library explicitly.
 atlas_generate_cliddb( xAODCaloEvent )
diff --git a/Event/xAOD/xAODCaloEvent/xAODCaloEvent/selection.xml b/Event/xAOD/xAODCaloEvent/xAODCaloEvent/selection.xml
index 59d077c39fee2d25e9ec0b6dea4c06fc710bf39c..f0cabd38785e87197627149363dc5d75701cd960 100644
--- a/Event/xAOD/xAODCaloEvent/xAODCaloEvent/selection.xml
+++ b/Event/xAOD/xAODCaloEvent/xAODCaloEvent/selection.xml
@@ -1,93 +1,58 @@
-<!-- $Id: selection.xml 706724 2015-11-09 14:16:39Z wlampl $ -->
+<!-- Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration -->
 <lcgdict>
 
-  <!-- CaloCluster(Container> --> 
-
-  <class name="xAOD::CaloCluster_v1" >
-    <field name="m_signalState"  transient="true" />
-    <field name="m_cellLinks"    transient="true" />
-    <field name="m_recoStatus"    transient="true" />
-  </class>
-  <read sourceClass="xAOD::CaloCluster_v1" version="[1-]"
-        targetClass="xAOD::CaloCluster_v1" source="" target="m_signalState" >
-    <![CDATA[
-       m_signalState=xAOD::CaloCluster_v1::CALIBRATED;
-    ]]>
-  </read>
-  <read sourceClass="xAOD::CaloCluster_v1" version="[1-]"
-        targetClass="xAOD::CaloCluster_v1" source="" target="m_cellLinks" >
-    <![CDATA[
-       m_cellLinks=0;
-    ]]>
-  </read>
-  <class name="xAOD::CaloClusterContainer_v1"
-         id="24997BCA-3F6A-4530-8826-822EE9FC3C08" />
-  <typedef name="xAOD::CaloClusterContainer" />
-  <typedef name="xAOD::CaloCluster" />
-
-  <class name="xAOD::CaloClusterAuxContainer_v1"
-         id="CE498B3B-A32D-43A3-B9B3-C13D136BACFC" />
-
-  <class name="xAOD::CaloClusterAuxContainer_v2"
-         id="451393B0-69CD-11E4-A739-02163E00A64D" />
-  <typedef name="xAOD::CaloClusterAuxContainer" />
-
-  <!-- Link types pointing at clusters: -->
-  <class name="DataLink<xAOD::CaloClusterContainer_v1>" />
-  <class name="std::vector<DataLink<xAOD::CaloClusterContainer_v1> >" />
-
-  <class name="ElementLink<xAOD::CaloClusterContainer_v1>" />
-  <class name="std::vector<ElementLink<xAOD::CaloClusterContainer_v1> >" />
-  <class name="std::vector<std::vector<ElementLink<xAOD::CaloClusterContainer_v1> > >" />
-
-
-  <class name="xAOD::CaloClusterBadChannelData_v1" />
-  <class name="std::vector<xAOD::CaloClusterBadChannelData_v1>" />
-  <class name="std::vector< std::vector<xAOD::CaloClusterBadChannelData_v1> >" />
-  <typedef name="xAOD::CaloClusterBadChannelData" />
-  <typedef name="xAOD::CaloClusterBadChannelList" />
+   <!-- xAOD::CaloCluster interface type(s). -->
+   <class name="xAOD::CaloCluster_v1" >
+      <field name="m_signalState"  transient="true" />
+      <field name="m_cellLinks"    transient="true" />
+      <field name="m_recoStatus"   transient="true" />
+   </class>
+   <read sourceClass="xAOD::CaloCluster_v1" version="[1-]"
+         targetClass="xAOD::CaloCluster_v1" source="" target="m_signalState" >
+     <![CDATA[
+        m_signalState = xAOD::CaloCluster_v1::CALIBRATED;
+     ]]>
+   </read>
+   <read sourceClass="xAOD::CaloCluster_v1" version="[1-]"
+         targetClass="xAOD::CaloCluster_v1" source="" target="m_cellLinks" >
+     <![CDATA[
+        m_cellLinks = 0;
+     ]]>
+   </read>
+   <class name="xAOD::CaloClusterContainer_v1"
+          id="24997BCA-3F6A-4530-8826-822EE9FC3C08" />
+   <typedef name="xAOD::CaloCluster" />
+   <typedef name="xAOD::CaloClusterContainer" />
+
+   <!-- xAOD::CaloCluster auxiliary type(s). -->
+   <class name="xAOD::CaloClusterAuxContainer_v1"
+          id="CE498B3B-A32D-43A3-B9B3-C13D136BACFC" />
+   <class name="xAOD::CaloClusterAuxContainer_v2"
+          id="451393B0-69CD-11E4-A739-02163E00A64D" />
+   <typedef name="xAOD::CaloClusterAuxContainer" />
+
+   <!-- xAOD::CaloClusterBadChannelData type(s). -->
+   <class name="xAOD::CaloClusterBadChannelData_v1" />
+   <class name="std::vector<xAOD::CaloClusterBadChannelData_v1>" />
+   <class name="std::vector<std::vector<xAOD::CaloClusterBadChannelData_v1> >" />
+   <typedef name="xAOD::CaloClusterBadChannelData" />
+   <typedef name="xAOD::CaloClusterBadChannelList" />
   
-
-  <!-- CaloTower(Container) -->
-  <class name="xAOD::CaloTower_v1" >
-    <field name="v_fourmom" transient="true" />
-    <field name="m_eta" transient="true" />       
-    <field name="m_phi" transient="true" />
-    <field name="m_invcosheta" transient="true" />
-  </class>
-
-  <class name="xAOD::CaloTowerContainer_v1"
-	 id="EEA02A0F-98D3-464D-BAF1-1C944A700B8A" />
-  <typedef name="xAOD::CaloTowerContainer" />
-  <typedef name="xAOD::CaloTower" />
-
-  <class name="xAOD::CaloTowerAuxContainer_v1"
-	 id="CE74E4D1-D2F4-4CED-8191-EC26D8836575" />
-  <typedef name="xAOD::CaloTowerAuxContainer" />
-
-  <class name="xAOD::CaloTowerContainerBase_v1" />
-
-   <!-- Link types potentially pointing at Towers: -->
-  <class name="DataLink<xAOD::CaloTowerContainer_v1>" />
-  <class name="std::vector<DataLink<xAOD::CaloTowerContainer_v1> >" />
-
-  <class name="ElementLink<xAOD::CaloTowerContainer_v1>" />
-  <class name="std::vector<ElementLink<xAOD::CaloTowerContainer_v1> >" />
-  <class name="std::vector<std::vector<ElementLink<xAOD::CaloTowerContainer_v1> > >" />
-
-
-  <!-- Additional type(s) needed: -->
-  <class name="std::bitset<3>" />
-  <class name="xAOD::CaloVertexedClusterBase"/>
-  <class name="xAOD::CaloVertexedTopoCluster"/>
-  <class name="std::vector<std::vector<std::pair<unsigned int, double > > >"/>
-
-  <!-- Suppress the unwanted classes found by ROOT 6. -->
-  <!-- Hopefully we can remove these extra lines at one point... -->
-  <exclusion>
-    <class name="SG::IConstAuxStore" />
-    <class name="DataLink<SG::IConstAuxStore>" />
-    <class name="DataVector<xAOD::IParticle>" />
-  </exclusion>
+   <!-- xAOD::CaloTower interface type(s). -->
+   <class name="xAOD::CaloTower_v1" />
+   <class name="xAOD::CaloTowerContainerBase_v1" />
+   <class name="xAOD::CaloTowerContainer_v1"
+          id="EEA02A0F-98D3-464D-BAF1-1C944A700B8A" />
+   <typedef name="xAOD::CaloTower" />
+   <typedef name="xAOD::CaloTowerContainer" />
+
+   <!-- xAOD::CaloTower auxiliary type(s). -->
+   <class name="xAOD::CaloTowerAuxContainer_v1"
+          id="CE74E4D1-D2F4-4CED-8191-EC26D8836575" />
+   <typedef name="xAOD::CaloTowerAuxContainer" />
+
+   <!-- Additional type(s) used in reconstruction. -->
+   <class name="xAOD::CaloVertexedClusterBase" />
+   <class name="xAOD::CaloVertexedTopoCluster" />
 
 </lcgdict>
diff --git a/Event/xAOD/xAODCaloEvent/xAODCaloEvent/xAODCaloEventDict.h b/Event/xAOD/xAODCaloEvent/xAODCaloEvent/xAODCaloEventDict.h
index 7272a5c0b670e45d0623805ac34051d32c032ba5..29d9afc6223871c797a0f5e958db92f473bc0579 100644
--- a/Event/xAOD/xAODCaloEvent/xAODCaloEvent/xAODCaloEventDict.h
+++ b/Event/xAOD/xAODCaloEvent/xAODCaloEvent/xAODCaloEventDict.h
@@ -1,41 +1,19 @@
 // Dear emacs, this is -*- c++ -*-
-
 /*
-  Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration
+  Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
 */
-
-// $Id: xAODCaloEventDict.h 700669 2015-10-15 08:31:13Z wlampl $
 #ifndef XAODCALOEVENT_XAODCALOEVENTDICT_H
 #define XAODCALOEVENT_XAODCALOEVENTDICT_H
 
-// Needed to successfully generate the dictionary in standalone mode:
-#if defined(__GCCXML__) and not defined(EIGEN_DONT_VECTORIZE)
-#   define EIGEN_DONT_VECTORIZE
-#endif // __GCCXML__
-
-
-// System include(s):
-#include <vector>
-#include <bitset>
-
-// EDM include(s):
-#include "AthLinks/DataLink.h"
-#include "AthLinks/ElementLink.h"
-
 // Local include(s):
 #include "xAODCaloEvent/CaloCluster.h"
 #include "xAODCaloEvent/CaloClusterContainer.h"
+#include "xAODCaloEvent/CaloClusterAuxContainer.h"
 #include "xAODCaloEvent/versions/CaloCluster_v1.h"
 #include "xAODCaloEvent/versions/CaloClusterContainer_v1.h"
 #include "xAODCaloEvent/versions/CaloClusterAuxContainer_v1.h"
 #include "xAODCaloEvent/versions/CaloClusterAuxContainer_v2.h"
-#include "xAODCaloEvent/CaloClusterAuxContainer.h"
-#include "xAODCaloEvent/CaloVertexedClusterBase.h"
-#include "xAODCaloEvent/CaloVertexedTopoCluster.h"
-#include "xAODCaloEvent/CaloClusterBadChannelData.h"
 
-//#include "xAODCaloEvent/CaloTowerDescriptor.h"
-//#include "xAODCaloEvent/CaloTowerGrid.h"
 #include "xAODCaloEvent/CaloTower.h"
 #include "xAODCaloEvent/CaloTowerContainer.h"
 #include "xAODCaloEvent/CaloTowerAuxContainer.h"
@@ -43,38 +21,23 @@
 #include "xAODCaloEvent/versions/CaloTowerContainer_v1.h"
 #include "xAODCaloEvent/versions/CaloTowerAuxContainer_v1.h"
 
+#include "xAODCaloEvent/CaloClusterBadChannelData.h"
+#include "xAODCaloEvent/versions/CaloClusterBadChannelData_v1.h"
 
-namespace {
-   struct GCCXML_DUMMY_INSTANTIATION_XAODCALOEVENT {
-      // Container(s):
-      xAOD::CaloClusterContainer_v1 c1;
-      // Data link(s):
-      DataLink< xAOD::CaloClusterContainer_v1 > dl1;
-     std::vector< DataLink< xAOD::CaloClusterContainer_v1 > > dl2;
-      // Element link(s):
-      ElementLink< xAOD::CaloClusterContainer_v1 > el1;
-      std::vector< ElementLink< xAOD::CaloClusterContainer_v1 > > el2;
-      std::vector< std::vector< ElementLink< xAOD::CaloClusterContainer_v1 > > > el3;
-      // Additional type(s) needed:
-      std::bitset< 3 > type1; // Using 3 instead of CaloCluster::NSTATES...
-     std::vector<std::vector<std::pair<unsigned int, double > > > calHitDecoratorType;
-
-     //BadChannel lists 
-     xAOD::CaloClusterBadChannelData_v1 bcd;
-     std::vector<xAOD::CaloClusterBadChannelData_v1> vbcd;
-     std::vector<std::vector<xAOD::CaloClusterBadChannelData_v1> > vvbcd;
+#include "xAODCaloEvent/CaloVertexedClusterBase.h"
+#include "xAODCaloEvent/CaloVertexedTopoCluster.h"
 
-     // CaloTower containers
-     xAOD::CaloTowerContainer_v1 t1;
-     xAOD::CaloTowerContainerBase_v1 dvt;
-     // Data link(s)
-     DataLink< xAOD::CaloTowerContainer_v1 > tdl1;
-     std::vector< DataLink< xAOD::CaloTowerContainer_v1 > > tdl2;
-     // Element link(s)
-     ElementLink< xAOD::CaloTowerContainer_v1 > tel1;
-     std::vector< ElementLink< xAOD::CaloTowerContainer_v1 > > tel2;
-     std::vector< std::vector< ElementLink< xAOD::CaloTowerContainer_v1 > > > tel3;
+// EDM include(s).
+#include "xAODCore/tools/DictHelpers.h"
 
+// Instantiate all necessary types for the dictionary.
+namespace {
+   struct GCCXML_DUMMY_INSTANTIATION_XAODCALOEVENT {
+      // Local type(s).
+      XAOD_INSTANTIATE_NS_CONTAINER_TYPES( xAOD, CaloClusterContainer_v1 );
+      XAOD_INSTANTIATE_NS_CONTAINER_TYPES( xAOD, CaloTowerContainer_v1 );
+      std::vector< xAOD::CaloClusterBadChannelData_v1 > v1;
+      std::vector< std::vector< xAOD::CaloClusterBadChannelData_v1 > > v2;
    };
 }
 
diff --git a/Event/xAOD/xAODCore/xAODCore/xAODCoreSTLDict.h b/Event/xAOD/xAODCore/xAODCore/xAODCoreSTLDict.h
index 3e654d4acf837ed0b175f9d29f9e1208e6acadc8..a1decebaf9173f7c1599927a26274f67374c3466 100644
--- a/Event/xAOD/xAODCore/xAODCore/xAODCoreSTLDict.h
+++ b/Event/xAOD/xAODCore/xAODCore/xAODCoreSTLDict.h
@@ -64,7 +64,7 @@ namespace {
       std::map< std::string, std::vector< std::vector< float > > > stl_m4;
 
       // "Other" type(s).
-      std::bitset< 3 > stl_o1; // 3 == ? Something needed for xAODCaloEvent
+      std::bitset< 3 > stl_o1; // 3 == CaloCluster::NSTATES
       std::bitset< 11 > stl_o2; // 11 == xAOD::NumberOfTrackRecoInfo
       std::set< uint32_t > stl_o3;
    };