diff --git a/ForwardDetectors/ForwardSimulation/ForwardRegionMgField/src/ForwardRegionFieldSvc.cxx b/ForwardDetectors/ForwardSimulation/ForwardRegionMgField/src/ForwardRegionFieldSvc.cxx
index b281adcb6909bf70bc164024b81eb21cac09e7e3..2a213beae3d09183e207a1ed851073d66b1d9f12 100644
--- a/ForwardDetectors/ForwardSimulation/ForwardRegionMgField/src/ForwardRegionFieldSvc.cxx
+++ b/ForwardDetectors/ForwardSimulation/ForwardRegionMgField/src/ForwardRegionFieldSvc.cxx
@@ -34,8 +34,7 @@
 // static ForwardRegionMgField q6vkick("Q6VKick",ForwardRegionField::Q6VKick);
 
 MagField::ForwardRegionFieldSvc::ForwardRegionFieldSvc(const std::string& name,ISvcLocator* svc) :
-  AthService(name,svc),
-  IMagFieldSvc(),
+  base_class(name,svc),
   m_magnet(-1),
   m_magDataType(0),
   m_MQXA_DataFile(""), //"MQXA_NOMINAL.dat" if name = Q1 or Q3
@@ -104,26 +103,6 @@ StatusCode MagField::ForwardRegionFieldSvc::initialize()
   return StatusCode::SUCCESS;
 }
 
-// Query the interfaces
-StatusCode MagField::ForwardRegionFieldSvc::queryInterface(const InterfaceID& riid, void** ppvInterface)
-{
-  if(IIncidentListener::interfaceID().versionMatch(riid))
-    {
-      *ppvInterface = dynamic_cast<IIncidentListener*>(this);
-    }
-  else if(IMagFieldSvc::interfaceID().versionMatch(riid))
-    {
-      *ppvInterface = dynamic_cast<IMagFieldSvc*>(this);
-    }
-  else
-    {
-     // Interface is not directly available: try out a base class
-      return AthService::queryInterface(riid, ppvInterface);
-    }
-  addRef();
-  return StatusCode::SUCCESS;
-}
-
 // Handle incident function - if BeginRun happens, initialize mag. fields
 void MagField::ForwardRegionFieldSvc::handle(const Incident& runIncident)
 {
diff --git a/ForwardDetectors/ForwardSimulation/ForwardRegionMgField/src/ForwardRegionFieldSvc.h b/ForwardDetectors/ForwardSimulation/ForwardRegionMgField/src/ForwardRegionFieldSvc.h
index 5ebd1551076f03108080d7df818518c0f61e67bb..90e6ee08f43265eb45777229b8d88820aa51ce2f 100644
--- a/ForwardDetectors/ForwardSimulation/ForwardRegionMgField/src/ForwardRegionFieldSvc.h
+++ b/ForwardDetectors/ForwardSimulation/ForwardRegionMgField/src/ForwardRegionFieldSvc.h
@@ -26,7 +26,7 @@
 
 namespace MagField {
 
-  class ForwardRegionFieldSvc : public IMagFieldSvc, virtual public IIncidentListener, virtual public AthService {
+  class ForwardRegionFieldSvc : public extends<AthService, IMagFieldSvc, IIncidentListener>  {
     ///////////////////////////////////////////////////////////////////
     // Public methods:
     ///////////////////////////////////////////////////////////////////
@@ -36,7 +36,6 @@ namespace MagField {
 
     /** AthService interface methods */
     StatusCode initialize() override final;
-    StatusCode queryInterface( const InterfaceID& riid, void** ppvInterface ) override final;
 
     /** IIncidentListener interface methods **/
     void handle(const Incident& runIncident) override final;
diff --git a/MagneticField/MagFieldInterfaces/MagFieldInterfaces/IMagFieldSvc.h b/MagneticField/MagFieldInterfaces/MagFieldInterfaces/IMagFieldSvc.h
index 376bb026e073a5e617a4cc2ca5c2acef0eeb1ad4..a287d7da212fdbab55e4491a38c09afff8426138 100644
--- a/MagneticField/MagFieldInterfaces/MagFieldInterfaces/IMagFieldSvc.h
+++ b/MagneticField/MagFieldInterfaces/MagFieldInterfaces/IMagFieldSvc.h
@@ -17,9 +17,6 @@
 // Amg classes
 #include "GeoPrimitives/GeoPrimitives.h"
 
-/** Declaration of the interface ID ( interface id, major version, minor version) */
-static const InterfaceID IID_IMagFieldSvc("IMagFieldSvc", 1, 0);
-
 namespace MagField {
 
 /** @ class IMagFieldSvc
@@ -32,14 +29,13 @@ namespace MagField {
     // Public methods:
     ///////////////////////////////////////////////////////////////////
     public:
+
+        /** Creates the InterfaceID and interfaceID() method */
+        DeclareInterfaceID(IMagFieldSvc, 1, 0);
+
         /** constructor */
         IMagFieldSvc() : m_solenoidCurrent(0.0), m_toroidCurrent(0.0) {;}
 
-        /** Retrieve interface ID */
-        static const InterfaceID& interfaceID() {
-            return IID_IMagFieldSvc;
-        }
-
         /** get B field value at given position */
         /** xyz[3] is in mm, bxyz[3] is in kT */
         /** if deriv[9] is given, field derivatives are returned in kT/mm */
diff --git a/MagneticField/MagFieldServices/MagFieldServices/AtlasFieldSvc.h b/MagneticField/MagFieldServices/MagFieldServices/AtlasFieldSvc.h
index c1d4cd025e023c5eba56a12d8cc01ad1849607d2..8d57bf92d7631bb21b11e582f6ed72e7b7680e1f 100644
--- a/MagneticField/MagFieldServices/MagFieldServices/AtlasFieldSvc.h
+++ b/MagneticField/MagFieldServices/MagFieldServices/AtlasFieldSvc.h
@@ -40,7 +40,7 @@ namespace MagField {
       @author Elmar.Ritsch -at- cern.ch
     */
 
-  class AtlasFieldSvc : public IMagFieldSvc, virtual public IIncidentListener, virtual public AthService {
+  class AtlasFieldSvc : public extends<AthService, IMagFieldSvc, IIncidentListener> {
     public:
 
       //** Constructor with parameters */
@@ -56,9 +56,6 @@ namespace MagField {
       /** Read **/
       virtual void handle(const Incident& runIncident) override;
 
-      /** Query the interfaces **/
-      virtual StatusCode queryInterface( const InterfaceID& riid, void** ppvInterface ) override;
-     
       /** Call back for possible magnet current update **/
       StatusCode updateCurrent(IOVSVC_CALLBACK_ARGS);
 
diff --git a/MagneticField/MagFieldServices/MagFieldServices/H8FieldSvc.h b/MagneticField/MagFieldServices/MagFieldServices/H8FieldSvc.h
index cbd86810941a7e032da9a36dd3e45ea8806e68c0..dd525f5fee94c7e42bf37eec5e976223ddfc75cd 100644
--- a/MagneticField/MagFieldServices/MagFieldServices/H8FieldSvc.h
+++ b/MagneticField/MagFieldServices/MagFieldServices/H8FieldSvc.h
@@ -28,7 +28,7 @@ class CondAttrListCollection;
 
 namespace MagField {
 
-  class H8FieldSvc : public IMagFieldSvc, virtual public AthService {
+  class H8FieldSvc : public extends<AthService, IMagFieldSvc> {
     public:
 
       //** Constructor with parameters */
@@ -42,9 +42,6 @@ namespace MagField {
       StatusCode  start();
       StatusCode  finalize();
 
-      /** Query the interfaces **/
-      StatusCode queryInterface( const InterfaceID& riid, void** ppvInterface );
-
       /** get B field value at given position */
       /** xyz[3] is in mm, bxyz[3] is in kT */
       /** if deriv[9] is given, field derivatives are returned in kT/mm */
diff --git a/MagneticField/MagFieldServices/src/AtlasFieldSvc.cxx b/MagneticField/MagFieldServices/src/AtlasFieldSvc.cxx
index 37c2e3046213628ca3736e5f5ff0a02a27f42a24..12ac78bc9248482ec2646b2a9ef790ecb25096d1 100644
--- a/MagneticField/MagFieldServices/src/AtlasFieldSvc.cxx
+++ b/MagneticField/MagFieldServices/src/AtlasFieldSvc.cxx
@@ -33,8 +33,7 @@
 
 /** Constructor **/
 MagField::AtlasFieldSvc::AtlasFieldSvc(const std::string& name,ISvcLocator* svc) :
-    AthService(name,svc),
-    IMagFieldSvc(),
+    base_class(name,svc),
     m_fullMapFilename("MagneticFieldMaps/bfieldmap_7730_20400_14m.root"),
     m_soleMapFilename("MagneticFieldMaps/bfieldmap_7730_0_14m.root"),
     m_toroMapFilename("MagneticFieldMaps/bfieldmap_0_20400_14m.root"),
@@ -553,21 +552,6 @@ void MagField::AtlasFieldSvc::getFieldZR(const double *xyz, double *bxyz, double
   cacheZR.getB(xyz, r, bxyz, deriv);
 }
 
-/** Query the interfaces. */
-StatusCode MagField::AtlasFieldSvc::queryInterface(const InterfaceID& riid, void** ppvInterface)
-{
-    if ( IIncidentListener::interfaceID().versionMatch(riid) ) {
-        *ppvInterface = dynamic_cast<IIncidentListener*>(this);
-    } else if ( MagField::IMagFieldSvc::interfaceID().versionMatch(riid) ) {
-        *ppvInterface = dynamic_cast<MagField::IMagFieldSvc*>(this);
-    } else {
-        // Interface is not directly available: try out a base class
-        return Service::queryInterface(riid, ppvInterface);
-    }
-    addRef();
-    return StatusCode::SUCCESS;
-}
-
 //
 // Clear the map.
 // Subsequent call should return zero magnetic field.
diff --git a/MagneticField/MagFieldServices/src/H8FieldSvc.cxx b/MagneticField/MagFieldServices/src/H8FieldSvc.cxx
index 6c69bf0b84cbb6a4f8db6c57e635e980277c3f8f..cb8700a180bf8e08ef9c96678f49d16a154a8992 100644
--- a/MagneticField/MagFieldServices/src/H8FieldSvc.cxx
+++ b/MagneticField/MagFieldServices/src/H8FieldSvc.cxx
@@ -28,8 +28,7 @@
 
 /** Constructor **/
 MagField::H8FieldSvc::H8FieldSvc( const std::string& name,ISvcLocator* svc ) :
-    AthService(name,svc),
-    IMagFieldSvc(),
+    base_class(name,svc),
     m_H8MapFilename("MagneticFieldMaps/mbps1-all-id-800-mbps2-muons-800x4.data"),
     m_dx1(0),
     m_dy1(0),
@@ -157,17 +156,3 @@ void MagField::H8FieldSvc::getFieldZR( const double *xyz, double *B, double *der
     getField( xyz, B, deriv );
     return;
 }
-
-/** Query the interfaces. */
-StatusCode MagField::H8FieldSvc::queryInterface( const InterfaceID& riid, void** ppvInterface )
-{
-    if ( IID_IMagFieldSvc == riid ) {
-        *ppvInterface = (MagField::IMagFieldSvc*)this;
-    } else {
-        // Interface is not directly available: try out a base class
-        return Service::queryInterface(riid, ppvInterface);
-    }
-    addRef();
-    return StatusCode::SUCCESS;
-}
-