diff --git a/Control/AthOnnx/AthOnnxComps/AthOnnxComps/OnnxRuntimeSvc.h b/Control/AthOnnx/AthOnnxComps/AthOnnxComps/OnnxRuntimeSvc.h
index d99b3aa91e38d1143958d36db2b0dfa69a51eedd..1f2165467186b23503dd9a047dc8ebf7a27442d4 100644
--- a/Control/AthOnnx/AthOnnxComps/AthOnnxComps/OnnxRuntimeSvc.h
+++ b/Control/AthOnnx/AthOnnxComps/AthOnnxComps/OnnxRuntimeSvc.h
@@ -24,7 +24,7 @@ namespace AthOnnx {
    ///
    /// @author Attila Krasznahorkay <Attila.Krasznahorkay@cern.ch>
    ///
-   class OnnxRuntimeSvc : public asg::AsgService, virtual public IOnnxRuntimeSvc {
+   class OnnxRuntimeSvc : public extends<asg::AsgService, IOnnxRuntimeSvc> {
 
    public:
 
diff --git a/Control/AthOnnx/AthOnnxComps/src/OnnxRuntimeSvc.cxx b/Control/AthOnnx/AthOnnxComps/src/OnnxRuntimeSvc.cxx
index 602c69647271f217c0e45fed2731dee7f61f6348..6c0fcb2dea609de44bc2e3fb24f0b428a1e6767a 100644
--- a/Control/AthOnnx/AthOnnxComps/src/OnnxRuntimeSvc.cxx
+++ b/Control/AthOnnx/AthOnnxComps/src/OnnxRuntimeSvc.cxx
@@ -6,10 +6,10 @@
 
 namespace AthOnnx {
   OnnxRuntimeSvc::OnnxRuntimeSvc(const std::string& name, ISvcLocator* svc) :
-      asg::AsgService(name, svc)
+      base_class(name, svc)
    {
-     declareServiceInterface<AthOnnx::IOnnxRuntimeSvc>();
    }
+
    StatusCode OnnxRuntimeSvc::initialize() {
 
       // Create the environment object.
diff --git a/Control/AthToolSupport/AsgExampleTools/AsgExampleTools/UnitTestService1.h b/Control/AthToolSupport/AsgExampleTools/AsgExampleTools/UnitTestService1.h
index f02c1b80b1db0c7b1370b5cfeae5961c58591bb3..54987f72a871179dffe9accff65b6dfb93808d05 100644
--- a/Control/AthToolSupport/AsgExampleTools/AsgExampleTools/UnitTestService1.h
+++ b/Control/AthToolSupport/AsgExampleTools/AsgExampleTools/UnitTestService1.h
@@ -1,5 +1,5 @@
 /*
-  Copyright (C) 2002-2022 CERN for the benefit of the ATLAS collaboration
+  Copyright (C) 2002-2024 CERN for the benefit of the ATLAS collaboration
 */
 
 /// @author Nils Krumnack
@@ -22,8 +22,7 @@ namespace asg
   /// This allows to unit test the various capabilities of
   /// AnaToolHandle in a controlled fashion.
 
-  struct UnitTestService1 : virtual public IUnitTestService1,
-                            public AsgService
+  struct UnitTestService1 : extends<AsgService, IUnitTestService1>
   {
     /// \brief standard constructor
   public:
diff --git a/Control/AthToolSupport/AsgExampleTools/Root/UnitTestService1.cxx b/Control/AthToolSupport/AsgExampleTools/Root/UnitTestService1.cxx
index d54453caca35eb0a5cc047b1dce9702075f2a201..ee5b2d18a2a30f84023761666da85ecbeae3bf28 100644
--- a/Control/AthToolSupport/AsgExampleTools/Root/UnitTestService1.cxx
+++ b/Control/AthToolSupport/AsgExampleTools/Root/UnitTestService1.cxx
@@ -1,5 +1,5 @@
 /*
-  Copyright (C) 2002-2023 CERN for the benefit of the ATLAS collaboration
+  Copyright (C) 2002-2024 CERN for the benefit of the ATLAS collaboration
 */
 
 /// @author Nils Krumnack
@@ -27,10 +27,8 @@ namespace asg
 {
   UnitTestService1 ::
   UnitTestService1 (const std::string& name, ISvcLocator* pSvcLocator)
-    : AsgService (name, pSvcLocator)
+    : base_class (name, pSvcLocator)
   {
-    declareServiceInterface<IUnitTestService1>();
-
     declareProperty ("propertyInt", m_propertyInt, "the integer property");
     declareProperty ("propertyString", m_propertyString, "the string property");
     declareProperty ("initializeFail", m_initializeFail, "whether initialize should fail");
diff --git a/Control/AthToolSupport/AsgServices/AsgServices/AsgService.h b/Control/AthToolSupport/AsgServices/AsgServices/AsgService.h
index 66e2a07363acf2c07f590a044d7875e9171abf8d..9612ba095723836dd5a6fdb0a9810991af1834a3 100644
--- a/Control/AthToolSupport/AsgServices/AsgServices/AsgService.h
+++ b/Control/AthToolSupport/AsgServices/AsgServices/AsgService.h
@@ -1,5 +1,5 @@
 /*
-  Copyright (C) 2002-2021 CERN for the benefit of the ATLAS collaboration
+  Copyright (C) 2002-2024 CERN for the benefit of the ATLAS collaboration
 */
 
 /// @author Nils Krumnack
@@ -38,14 +38,13 @@ namespace asg
   ///
   /// Loosely based on the \ref AsgTool implementation.
 
-  class AsgService : public virtual IAsgService,
-                     public AsgServiceBase
+  class AsgService :
+    public extends<AsgServiceBase, IAsgService>
   {
   public:
     AsgService (const std::string& name,
                 ISvcLocator* pSvcLocator);
 
-
     /// set up/tear down functions
     /// \{
     virtual StatusCode initialize ();
@@ -55,31 +54,8 @@ namespace asg
     /// Print the state of the service
     virtual void print() const;
 
-    /// add the given interface to the list of interfaces
-    template<typename T> void declareServiceInterface ();
-
-
-#ifndef XAOD_STANDALONE
-    /// query interface for gaudi
-    virtual StatusCode queryInterface (const InterfaceID& riid, void **ppvi);
-
-    /// list of interfaces we have
-  private:
-    std::vector<std::pair<const InterfaceID& (*)(),void *(*)(AsgService*)>> m_interfaces;
-#endif
-
   }; // class AsgService
 
-
-
-  template<typename T>
-  void AsgService :: declareServiceInterface ()
-  {
-#ifndef XAOD_STANDALONE
-    m_interfaces.emplace_back (T::interfaceID, [] (AsgService *self) -> void* {return dynamic_cast<T*>(self);});
-#endif
-  }
-
 } // namespace asg
 
 #endif // ASGSERVICES_ASGSERVICE_H
diff --git a/Control/AthToolSupport/AsgServices/AsgServices/IAsgService.h b/Control/AthToolSupport/AsgServices/AsgServices/IAsgService.h
index ec2fbde00fbca233460c330e24f485bc7ecad432..d40ef2035494a0a46c050532209a67e88914af53 100644
--- a/Control/AthToolSupport/AsgServices/AsgServices/IAsgService.h
+++ b/Control/AthToolSupport/AsgServices/AsgServices/IAsgService.h
@@ -1,5 +1,5 @@
 /*
-  Copyright (C) 2002-2021 CERN for the benefit of the ATLAS collaboration
+  Copyright (C) 2002-2024 CERN for the benefit of the ATLAS collaboration
 */
 
 /// @author Nils Krumnack
@@ -13,16 +13,7 @@
 
 // Local include(s):
 #include "AsgMessaging/INamedInterface.h"
-
-#ifdef XAOD_STANDALONE
-/// \brief standalone version of the Gaudi interface declaration
-///
-/// This can't be a no-op, because the Gaudi version needs to be
-/// followed by a semicolon, so we need a statement that requires to
-/// be followed by a semi-colon.
-#define DeclareInterfaceID(iface, major, minor) \
-  static constexpr std::nullptr_t interfaceID = nullptr
-#endif
+#include "AsgTools/Interfaces.h"
 
 namespace asg
 {
diff --git a/Control/AthToolSupport/AsgServices/Root/AsgService.cxx b/Control/AthToolSupport/AsgServices/Root/AsgService.cxx
index 7fc83db9cb34a9e34a7e4dc9d4aa6ddbbea6d8b1..178f1720c67b8b7e28991abad64dbf819c4d0ad0 100644
--- a/Control/AthToolSupport/AsgServices/Root/AsgService.cxx
+++ b/Control/AthToolSupport/AsgServices/Root/AsgService.cxx
@@ -1,5 +1,5 @@
 /*
-  Copyright (C) 2002-2021 CERN for the benefit of the ATLAS collaboration
+  Copyright (C) 2002-2024 CERN for the benefit of the ATLAS collaboration
 */
 
 /// @author Nils Krumnack
@@ -18,15 +18,13 @@ namespace asg
   AsgService ::
   AsgService( const std::string& name,
               ISvcLocator* pSvcLocator )
-      : AsgServiceBase(
 #ifndef XAOD_STANDALONE
-                       name, pSvcLocator
-#else // not XAOD_STANDALONE
-                       name
-#endif // not XAOD_STANDALONE
-                    )
+    : base_class(name, pSvcLocator)
+#else
+    : base_class(name)
+#endif
    {
-     (void) pSvcLocator;
+     (void) pSvcLocator;  // suppress compiler warning in XAOD_STANDALONE
    }
 
   StatusCode AsgService ::
@@ -51,23 +49,4 @@ namespace asg
     return;
   }
 
-
-
-#ifndef XAOD_STANDALONE
-  StatusCode AsgService ::
-  queryInterface (const InterfaceID& riid, void **ppvi)
-  {
-    for (const auto& interface : m_interfaces)
-    {
-      if (riid == interface.first())
-      {
-        *ppvi = interface.second (this);
-        addRef();
-        return StatusCode::SUCCESS;
-      }
-    }
-    return AsgServiceBase::queryInterface (riid, ppvi);
-  }
-#endif
-
 } // namespace asg
diff --git a/Control/AthToolSupport/AsgTools/AsgTools/AsgComponent.h b/Control/AthToolSupport/AsgTools/AsgTools/AsgComponent.h
index dc7cdcdf4e579db0dc397e30453a166f76354317..58cbfbaf08869f7ea1c343f6fb9f24fefd81ba9d 100644
--- a/Control/AthToolSupport/AsgTools/AsgTools/AsgComponent.h
+++ b/Control/AthToolSupport/AsgTools/AsgTools/AsgComponent.h
@@ -1,5 +1,5 @@
 /*
-  Copyright (C) 2002-2021 CERN for the benefit of the ATLAS collaboration
+  Copyright (C) 2002-2024 CERN for the benefit of the ATLAS collaboration
 */
 
 /// \author Nils Krumnack
@@ -15,6 +15,7 @@
 #include <AsgMessaging/INamedInterface.h>
 #include <AsgMessaging/MessageCheck.h>
 #include <AsgMessaging/MsgLevel.h>
+#include <AsgTools/Interfaces.h>
 #include <memory>
 #include <vector>
 
diff --git a/Control/AthToolSupport/AsgTools/AsgTools/Interfaces.h b/Control/AthToolSupport/AsgTools/AsgTools/Interfaces.h
new file mode 100644
index 0000000000000000000000000000000000000000..82a3f170c75cfa3d510d29b0d97791ca7ca04e38
--- /dev/null
+++ b/Control/AthToolSupport/AsgTools/AsgTools/Interfaces.h
@@ -0,0 +1,40 @@
+/*
+  Copyright (C) 2002-2024 CERN for the benefit of the ATLAS collaboration
+*/
+#ifndef ASGTOOLS_INTERFACES_H
+#define ASGTOOLS_INTERFACES_H
+
+///
+/// Standalone versions of Gaudi interface declarations.
+//
+#if defined(XAOD_STANDALONE)
+
+/// This can't be a no-op, because the Gaudi version needs to be
+/// followed by a semicolon, so we need a statement that requires to
+/// be followed by a semi-colon.
+#define DeclareInterfaceID(iface, major, minor) \
+  static_assert(true)
+
+
+/// See GaudiKernel/extend_interfaces.h
+template <typename... Interfaces>
+struct extend_interfaces : virtual public Interfaces... {
+};
+
+
+/// See GaudiKernel/extends.h
+template <typename BASE, typename... Interfaces>
+struct extends : public BASE, virtual public extend_interfaces<Interfaces...> {
+  using base_class = extends;
+  using BASE::BASE;
+};
+
+
+/// See GaudiKernel/implements.h
+template <typename... Interfaces>
+struct implements : virtual public extend_interfaces<Interfaces...> {
+  using base_class = implements<Interfaces...>;
+};
+
+#endif
+#endif
diff --git a/InnerDetector/InDetValidation/InDetTrackPerfMon/src/PlotsDefinitionSvc.cxx b/InnerDetector/InDetValidation/InDetTrackPerfMon/src/PlotsDefinitionSvc.cxx
index d7b4929dff3c6f63b8bfabce931edac0e0ae332a..e4b5bb91cd7dd10c6712ece0e3c3f817565a4731 100644
--- a/InnerDetector/InDetValidation/InDetTrackPerfMon/src/PlotsDefinitionSvc.cxx
+++ b/InnerDetector/InDetValidation/InDetTrackPerfMon/src/PlotsDefinitionSvc.cxx
@@ -17,10 +17,9 @@
 /// -------------------
 PlotsDefinitionSvc::PlotsDefinitionSvc(
     const std::string& name, ISvcLocator* pSvcLocator ) :
-        AsgService( name, pSvcLocator ),
+        base_class( name, pSvcLocator ),
         m_plotsDefMap{}, m_nullDef()
 {
-  declareServiceInterface< IPlotsDefinitionSvc >();
 }
 
 
diff --git a/InnerDetector/InDetValidation/InDetTrackPerfMon/src/PlotsDefinitionSvc.h b/InnerDetector/InDetValidation/InDetTrackPerfMon/src/PlotsDefinitionSvc.h
index df71e4f07b3c958333c467e827024bbff68c53c5..b28e3884aaa1ce06f8a6fce39a449a3fd81a9a59 100644
--- a/InnerDetector/InDetValidation/InDetTrackPerfMon/src/PlotsDefinitionSvc.h
+++ b/InnerDetector/InDetValidation/InDetTrackPerfMon/src/PlotsDefinitionSvc.h
@@ -27,8 +27,7 @@
 
 
 class PlotsDefinitionSvc :
-    public asg::AsgService,
-    virtual public IPlotsDefinitionSvc {
+    public extends<asg::AsgService, IPlotsDefinitionSvc> {
 
 public:
 
diff --git a/InnerDetector/InDetValidation/InDetTrackPerfMon/src/TrackAnalysisDefinitionSvc.cxx b/InnerDetector/InDetValidation/InDetTrackPerfMon/src/TrackAnalysisDefinitionSvc.cxx
index ff39fb4dd5820410934f9cd13306747fb60d2951..ba9e67d98e263effa95b034b4f7163de991f5a01 100644
--- a/InnerDetector/InDetValidation/InDetTrackPerfMon/src/TrackAnalysisDefinitionSvc.cxx
+++ b/InnerDetector/InDetValidation/InDetTrackPerfMon/src/TrackAnalysisDefinitionSvc.cxx
@@ -19,19 +19,6 @@
 /// Athena includes
 #include "InDetPhysValMonitoring/ResolutionHelper.h"
 
-/// -------------------
-/// --- Constructor ---
-/// -------------------
-TrackAnalysisDefinitionSvc::TrackAnalysisDefinitionSvc( const std::string& name, ISvcLocator* pSvcLocator ) :
-    AsgService( name, pSvcLocator )
-{
-  declareServiceInterface< ITrackAnalysisDefinitionSvc >();
-}
-
-/// ------------------
-/// --- Destructor ---
-/// ------------------
-TrackAnalysisDefinitionSvc::~TrackAnalysisDefinitionSvc() = default;
 
 /// ------------------
 /// --- initialize ---
diff --git a/InnerDetector/InDetValidation/InDetTrackPerfMon/src/TrackAnalysisDefinitionSvc.h b/InnerDetector/InDetValidation/InDetTrackPerfMon/src/TrackAnalysisDefinitionSvc.h
index 6c53c25f853b3de47b2ab54ce3fa124efdc40969..8bf7920bc80c40ffedbfa65a062a0b7aa1b79318 100644
--- a/InnerDetector/InDetValidation/InDetTrackPerfMon/src/TrackAnalysisDefinitionSvc.h
+++ b/InnerDetector/InDetValidation/InDetTrackPerfMon/src/TrackAnalysisDefinitionSvc.h
@@ -24,14 +24,11 @@
 #include <vector>
 
 class TrackAnalysisDefinitionSvc final :
-    public asg::AsgService,
-    virtual public ITrackAnalysisDefinitionSvc {
+    public extends<asg::AsgService, ITrackAnalysisDefinitionSvc> {
 
 public:
-
-  TrackAnalysisDefinitionSvc( const std::string& name, ISvcLocator* pSvcLocator );
-
-  virtual ~TrackAnalysisDefinitionSvc();
+  using extends::extends;  // base class constructor
+  virtual ~TrackAnalysisDefinitionSvc() = default;
 
   virtual StatusCode initialize() override final;
 
diff --git a/PhysicsAnalysis/Algorithms/SelectionHelpers/Root/SelectionNameSvc.cxx b/PhysicsAnalysis/Algorithms/SelectionHelpers/Root/SelectionNameSvc.cxx
index 580a8828e3befe4ff50b1862b9ba75c9bebbe875..c5410efede88ac1b5de9fc437cceaa6a903a63ea 100644
--- a/PhysicsAnalysis/Algorithms/SelectionHelpers/Root/SelectionNameSvc.cxx
+++ b/PhysicsAnalysis/Algorithms/SelectionHelpers/Root/SelectionNameSvc.cxx
@@ -1,5 +1,5 @@
 /*
-  Copyright (C) 2002-2023 CERN for the benefit of the ATLAS collaboration
+  Copyright (C) 2002-2024 CERN for the benefit of the ATLAS collaboration
 */
 
 /// @author Nils Krumnack
@@ -24,16 +24,6 @@
 
 namespace CP
 {
-  SelectionNameSvc ::
-  SelectionNameSvc (const std::string& name,
-                    ISvcLocator* pSvcLocator)
-    : AsgService (name, pSvcLocator)
-  {
-
-    declareServiceInterface<ISelectionNameSvc>();
-  }
-
-
 
   StatusCode SelectionNameSvc ::
   initialize ()
diff --git a/PhysicsAnalysis/Algorithms/SelectionHelpers/SelectionHelpers/SelectionNameSvc.h b/PhysicsAnalysis/Algorithms/SelectionHelpers/SelectionHelpers/SelectionNameSvc.h
index 7d6bd2573d0fa524902b00d10d8af6ba4a5d38aa..640066226e10f8ee4057de391ec16509300c6292 100644
--- a/PhysicsAnalysis/Algorithms/SelectionHelpers/SelectionHelpers/SelectionNameSvc.h
+++ b/PhysicsAnalysis/Algorithms/SelectionHelpers/SelectionHelpers/SelectionNameSvc.h
@@ -1,5 +1,5 @@
 /*
-  Copyright (C) 2002-2023 CERN for the benefit of the ATLAS collaboration
+  Copyright (C) 2002-2024 CERN for the benefit of the ATLAS collaboration
 */
 
 /// @author Nils Krumnack
@@ -22,29 +22,15 @@ namespace CP
 {
   /// \brief the canonical implementation of \ref ISelectionNameSvc
 
-  class SelectionNameSvc final : public asg::AsgService,
-                                 virtual public ISelectionNameSvc
+  class SelectionNameSvc final : public extends<asg::AsgService, ISelectionNameSvc>
   {
-    //
-    // public interface
-    //
-
-    /// \brief standard constructor
-    /// \par Guarantee
-    ///   strong
-    /// \par Failures
-    ///   out of memory II
-  public:
-    SelectionNameSvc (const std::string& name,
-                      ISvcLocator* pSvcLocator);
-
-
 
     //
-    // inherited interface
+    // public interface
     //
 
   public:
+    using extends::extends;  // base class constructor
 
     virtual StatusCode initialize () override;
     virtual StatusCode addAcceptInfo (const std::string& objectName, const std::string& decorName,
diff --git a/PhysicsAnalysis/Algorithms/SystematicsHandles/Root/SystematicsSvc.cxx b/PhysicsAnalysis/Algorithms/SystematicsHandles/Root/SystematicsSvc.cxx
index 33fd0150972b97685b30c809e8326874833d8135..8f53be838613ec308107643130e3547631f708d0 100644
--- a/PhysicsAnalysis/Algorithms/SystematicsHandles/Root/SystematicsSvc.cxx
+++ b/PhysicsAnalysis/Algorithms/SystematicsHandles/Root/SystematicsSvc.cxx
@@ -25,15 +25,6 @@
 
 namespace CP
 {
-  SystematicsSvc ::
-  SystematicsSvc (const std::string& name,
-                    ISvcLocator* pSvcLocator)
-    : AsgService (name, pSvcLocator)
-  {
-    declareServiceInterface<ISystematicsSvc>();
-  }
-
-
 
   StatusCode SystematicsSvc ::
   initialize ()
diff --git a/PhysicsAnalysis/Algorithms/SystematicsHandles/SystematicsHandles/SystematicsSvc.h b/PhysicsAnalysis/Algorithms/SystematicsHandles/SystematicsHandles/SystematicsSvc.h
index 5ee3dc7f45dd2e531f9ef872758835625b96096c..7674be9934df9f4b3f0aacf4aa2e2acf113c8257 100644
--- a/PhysicsAnalysis/Algorithms/SystematicsHandles/SystematicsHandles/SystematicsSvc.h
+++ b/PhysicsAnalysis/Algorithms/SystematicsHandles/SystematicsHandles/SystematicsSvc.h
@@ -20,29 +20,16 @@ namespace CP
 {
   /// \brief the canonical implementation of \ref ISystematicsSvc
 
-  class SystematicsSvc final : public asg::AsgService,
-                                 virtual public ISystematicsSvc
+  class SystematicsSvc final : public extends<asg::AsgService, ISystematicsSvc>
   {
+
     //
     // public interface
     //
 
-    /// \brief standard constructor
-    /// \par Guarantee
-    ///   strong
-    /// \par Failures
-    ///   out of memory II
   public:
-    SystematicsSvc (const std::string& name,
-                      ISvcLocator* pSvcLocator);
-
+    using extends::extends;  // base class constructor
 
-
-    //
-    // inherited interface
-    //
-
-  public:
     virtual StatusCode initialize () override;
     virtual StatusCode finalize () override;
     virtual std::vector<CP::SystematicSet>
diff --git a/PhysicsAnalysis/JetTagging/FlavorTagDiscriminants/FlavorTagDiscriminants/NNSharingSvc.h b/PhysicsAnalysis/JetTagging/FlavorTagDiscriminants/FlavorTagDiscriminants/NNSharingSvc.h
index 53abfcfb7fa2c992deaa9074ba238ff3f21dbcec..4674a526c388cb6fec925670ab08c8388ca1fd73 100644
--- a/PhysicsAnalysis/JetTagging/FlavorTagDiscriminants/FlavorTagDiscriminants/NNSharingSvc.h
+++ b/PhysicsAnalysis/JetTagging/FlavorTagDiscriminants/FlavorTagDiscriminants/NNSharingSvc.h
@@ -28,10 +28,11 @@ namespace FlavorTagDiscriminants
     };
   }
 
-  class NNSharingSvc: public asg::AsgService, public INNSharingSvc
+  class NNSharingSvc: public extends<asg::AsgService, INNSharingSvc>
   {
   public:
-    NNSharingSvc(const std::string& name, ISvcLocator* svc);
+    using extends::extends;  // base class constructor
+
     virtual std::shared_ptr<const GNN> get(
       const std::string& nn_name,
       const GNNOptions& opts) override;
diff --git a/PhysicsAnalysis/JetTagging/FlavorTagDiscriminants/Root/NNSharingSvc.cxx b/PhysicsAnalysis/JetTagging/FlavorTagDiscriminants/Root/NNSharingSvc.cxx
index 729df76306c5014799bf559e049bbdfde85e616e..20901aade8576837a0e023c74372542c424979f5 100644
--- a/PhysicsAnalysis/JetTagging/FlavorTagDiscriminants/Root/NNSharingSvc.cxx
+++ b/PhysicsAnalysis/JetTagging/FlavorTagDiscriminants/Root/NNSharingSvc.cxx
@@ -19,11 +19,6 @@ namespace FlavorTagDiscriminants {
     }
   }
 
-  NNSharingSvc::NNSharingSvc(const std::string& name, ISvcLocator* svc):
-    AsgService(name, svc)
-  {
-    declareServiceInterface<INNSharingSvc>();
-  }
   std::shared_ptr<const GNN> NNSharingSvc::get(
     const std::string& nn_name,
     const GNNOptions& opts) {
diff --git a/Reconstruction/egamma/egammaMVACalib/Root/egammaMVASvc.cxx b/Reconstruction/egamma/egammaMVACalib/Root/egammaMVASvc.cxx
index 8759af553e9f044532deac0d0c8740b2589ac0b4..88c9c35c6461d1d285e5e17ebc1f26a8015fbab1 100644
--- a/Reconstruction/egamma/egammaMVACalib/Root/egammaMVASvc.cxx
+++ b/Reconstruction/egamma/egammaMVACalib/Root/egammaMVASvc.cxx
@@ -1,5 +1,5 @@
 /*
-  Copyright (C) 2002-2021 CERN for the benefit of the ATLAS collaboration
+  Copyright (C) 2002-2024 CERN for the benefit of the ATLAS collaboration
 */
 
 #include "egammaMVACalib/egammaMVASvc.h"
@@ -11,12 +11,6 @@
 #include "xAODEgamma/EgammaxAODHelpers.h"
 
 
-egammaMVASvc::egammaMVASvc(const std::string& name, ISvcLocator* svc) :
-  asg::AsgService( name, svc )
-{
-  declareServiceInterface<IegammaMVASvc>();
-}
-
 StatusCode egammaMVASvc::initialize()
 {
   ATH_MSG_DEBUG("In initialize of " << name() << "..." );
diff --git a/Reconstruction/egamma/egammaMVACalib/egammaMVACalib/egammaMVASvc.h b/Reconstruction/egamma/egammaMVACalib/egammaMVACalib/egammaMVASvc.h
index 323fd516bd670e357c828c21bfdb4aef48b118f1..cfd4ec6cb58d12d11fddde55f365fefc96196a5a 100644
--- a/Reconstruction/egamma/egammaMVACalib/egammaMVACalib/egammaMVASvc.h
+++ b/Reconstruction/egamma/egammaMVACalib/egammaMVACalib/egammaMVASvc.h
@@ -1,7 +1,7 @@
 // Dear Emacs, this is -*- C++ -*-
 
 /*
-  Copyright (C) 2002-2021 CERN for the benefit of the ATLAS collaboration
+  Copyright (C) 2002-2024 CERN for the benefit of the ATLAS collaboration
 */
 
 #ifndef EGAMMAMVACALIB_EGAMMAMVASVC_H
@@ -16,10 +16,11 @@
 
 #include <string>
 
-class egammaMVASvc : public asg::AsgService, virtual public IegammaMVASvc
+class egammaMVASvc : public extends<asg::AsgService, IegammaMVASvc>
 {
 public:
-  egammaMVASvc( const std::string& name, ISvcLocator* svc );
+  using extends::extends;  // base class constructor
+
   virtual ~egammaMVASvc() override {};
   virtual StatusCode initialize() override;