diff --git a/Control/AthenaExamples/AthExJobOptions/AthExJobOptions/AnotherConcreteSvc.h b/Control/AthenaExamples/AthExJobOptions/AthExJobOptions/AnotherConcreteSvc.h
new file mode 100644
index 0000000000000000000000000000000000000000..46fa75bc3d7ae45e223825f6fb9dd4b1f9dcff7c
--- /dev/null
+++ b/Control/AthenaExamples/AthExJobOptions/AthExJobOptions/AnotherConcreteSvc.h
@@ -0,0 +1,99 @@
+///////////////////////// -*- C++ -*- /////////////////////////////
+
+/*
+  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+*/
+
+// AnotherConcreteSvc.h 
+// Header file for class AnotherConcreteSvc
+// Author: S.Binet<binet@cern.ch>
+/////////////////////////////////////////////////////////////////// 
+#ifndef ATHEXJOBOPTIONS_ANOTHERCONCRETESVC_H 
+#define ATHEXJOBOPTIONS_ANOTHERCONCRETESVC_H  1
+
+// STL includes
+#include <string>
+
+// FrameWork includes
+#include "AthenaBaseComps/AthService.h"
+
+// AthExJobOptions includes
+#include "AthExJobOptions/IVirtualSvc.h"
+
+// Forward declaration
+template <class TYPE> class SvcFactory;
+
+class AnotherConcreteSvc : virtual public IVirtualSvc,
+                            public AthService
+{ 
+
+protected:
+    
+  friend class SvcFactory<AnotherConcreteSvc>;
+
+  /////////////////////////////////////////////////////////////////// 
+  // Public methods: 
+  /////////////////////////////////////////////////////////////////// 
+ public: 
+
+  // Copy constructor: 
+
+  /// Constructor with parameters: 
+  AnotherConcreteSvc( const std::string& name, ISvcLocator* pSvcLocator );
+
+  /// Destructor: 
+  virtual ~AnotherConcreteSvc(); 
+
+  /// Gaudi Service Implementation
+  //@{
+  StatusCode initialize();
+  StatusCode finalize();
+  virtual StatusCode queryInterface( const InterfaceID& riid, 
+                                     void** ppvInterface );
+  //@}
+
+  /////////////////////////////////////////////////////////////////// 
+  // Const methods: 
+  ///////////////////////////////////////////////////////////////////
+
+  /////////////////////////////////////////////////////////////////// 
+  // Non-const methods: 
+  /////////////////////////////////////////////////////////////////// 
+
+  static const InterfaceID& interfaceID();
+
+  /** The very important message of the day
+   */
+  StatusCode qotd( std::string& quote );
+
+  /////////////////////////////////////////////////////////////////// 
+  // Private methods: 
+  /////////////////////////////////////////////////////////////////// 
+ private: 
+
+  /// Default constructor: 
+  AnotherConcreteSvc();
+
+  /////////////////////////////////////////////////////////////////// 
+  // Private data: 
+  /////////////////////////////////////////////////////////////////// 
+ private: 
+
+  /// The quote of the day
+  StringProperty m_qotd;
+
+}; 
+
+/// I/O operators
+//////////////////////
+
+/////////////////////////////////////////////////////////////////// 
+/// Inline methods: 
+/////////////////////////////////////////////////////////////////// 
+
+inline const InterfaceID& AnotherConcreteSvc::interfaceID() 
+{ 
+  return IVirtualSvc::interfaceID(); 
+}
+
+#endif //> ATHEXJOBOPTIONS_ANOTHERCONCRETESVC_H
diff --git a/Control/AthenaExamples/AthExJobOptions/AthExJobOptions/ConcreteSvc.h b/Control/AthenaExamples/AthExJobOptions/AthExJobOptions/ConcreteSvc.h
new file mode 100755
index 0000000000000000000000000000000000000000..511d5163395b09d6c8ab274def6e7c5b96f0190f
--- /dev/null
+++ b/Control/AthenaExamples/AthExJobOptions/AthExJobOptions/ConcreteSvc.h
@@ -0,0 +1,99 @@
+///////////////////////// -*- C++ -*- /////////////////////////////
+
+/*
+  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+*/
+
+// ConcreteSvc.h 
+// Header file for class ConcreteSvc
+// Author: S.Binet<binet@cern.ch>
+/////////////////////////////////////////////////////////////////// 
+#ifndef ATHEXJOBOPTIONS_CONCRETESVC_H 
+#define ATHEXJOBOPTIONS_CONCRETESVC_H 1
+
+// STL includes
+#include <string>
+
+// FrameWork includes
+#include "AthenaBaseComps/AthService.h"
+
+// AthExJobOptions includes
+#include "AthExJobOptions/IVirtualSvc.h"
+
+// Forward declaration
+template <class TYPE> class SvcFactory;
+
+class ConcreteSvc : virtual public IVirtualSvc,
+                            public AthService
+{ 
+
+protected:
+    
+  friend class SvcFactory<ConcreteSvc>;
+
+  /////////////////////////////////////////////////////////////////// 
+  // Public methods: 
+  /////////////////////////////////////////////////////////////////// 
+ public: 
+
+  // Copy constructor: 
+
+  /// Constructor with parameters: 
+  ConcreteSvc( const std::string& name, ISvcLocator* pSvcLocator );
+
+  /// Destructor: 
+  virtual ~ConcreteSvc(); 
+
+  /// Gaudi Service Implementation
+  //@{
+  StatusCode initialize();
+  StatusCode finalize();
+  virtual StatusCode queryInterface( const InterfaceID& riid, 
+                                     void** ppvInterface );
+  //@}
+
+  /////////////////////////////////////////////////////////////////// 
+  // Const methods: 
+  ///////////////////////////////////////////////////////////////////
+
+  /////////////////////////////////////////////////////////////////// 
+  // Non-const methods: 
+  /////////////////////////////////////////////////////////////////// 
+
+  static const InterfaceID& interfaceID();
+
+  /** The very important message of the day
+   */
+  StatusCode qotd( std::string& quote );
+
+  /////////////////////////////////////////////////////////////////// 
+  // Private methods: 
+  /////////////////////////////////////////////////////////////////// 
+ private: 
+
+  /// Default constructor: 
+  ConcreteSvc();
+
+  /////////////////////////////////////////////////////////////////// 
+  // Private data: 
+  /////////////////////////////////////////////////////////////////// 
+ private: 
+
+  /// The quote of the day
+  StringProperty m_qotd;
+
+}; 
+
+/// I/O operators
+//////////////////////
+
+/////////////////////////////////////////////////////////////////// 
+/// Inline methods: 
+/////////////////////////////////////////////////////////////////// 
+
+inline const InterfaceID& ConcreteSvc::interfaceID() 
+{ 
+  return IVirtualSvc::interfaceID(); 
+}
+
+#endif //> ATHEXJOBOPTIONS_CONCRETESVC_H
diff --git a/Control/AthenaExamples/AthExJobOptions/AthExJobOptions/ConcreteTool.h b/Control/AthenaExamples/AthExJobOptions/AthExJobOptions/ConcreteTool.h
new file mode 100755
index 0000000000000000000000000000000000000000..718fd139b2e49a838bc244f27c99400e00bc238e
--- /dev/null
+++ b/Control/AthenaExamples/AthExJobOptions/AthExJobOptions/ConcreteTool.h
@@ -0,0 +1,41 @@
+// -*- C++ -*-
+
+/*
+  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+*/
+
+#ifndef ATHEXJOBOPTIONS_CONCRETETOOL_H
+#define ATHEXJOBOPTIONS_CONCRETETOOL_H 1
+
+#include "AthExJobOptions/IVirtualTool.h"
+
+#include "AthenaBaseComps/AthAlgTool.h"
+
+#include <string>
+
+
+/////////////////////////////////////////////////////////////////////////////
+
+class ConcreteTool : virtual public IVirtualTool, virtual public AthAlgTool {
+public:
+   ConcreteTool( const std::string&, const std::string&, const IInterface* );
+
+// to allow access to the IVirtualTool interface
+   StatusCode queryInterface( const InterfaceID& riid, void** ppvIf );
+
+// setup/teardown functions, similar like those for Algorithm/Service
+   StatusCode initialize();
+   StatusCode finalize();
+
+// the magic method this tool provides
+   StatusCode performTask( double& result );
+
+public:
+// to resolve possible conflicts with IProperty::interfaceID()
+   static const InterfaceID& interfaceID() { return IVirtualTool::interfaceID(); }
+
+private:
+   double m_factor;
+};
+
+#endif // !ATHEXJOBOPTIONS_CONCRETETOOL_H
diff --git a/Control/AthenaExamples/AthExJobOptions/AthExJobOptions/ExampleEvtLoopPreSelectTool.h b/Control/AthenaExamples/AthExJobOptions/AthExJobOptions/ExampleEvtLoopPreSelectTool.h
new file mode 100755
index 0000000000000000000000000000000000000000..5eb8d278441016b31f683d7d00e68063044dd6b6
--- /dev/null
+++ b/Control/AthenaExamples/AthExJobOptions/AthExJobOptions/ExampleEvtLoopPreSelectTool.h
@@ -0,0 +1,37 @@
+/*
+  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+*/
+
+#ifndef ATHEXJOBOPTIONS_EVTLOOPPRESELECTTOOL_H
+#define ATHEXJOBOPTIONS_EVTLOOPPRESELECTTOOL_H 1
+
+#include "AthenaKernel/IAthenaEvtLoopPreSelectTool.h"
+#include "AthenaBaseComps/AthAlgTool.h"
+#include <string>
+
+
+/////////////////////////////////////////////////////////////////////////////
+
+class ExampleEvtLoopPreSelectTool : public AthAlgTool, virtual public IAthenaEvtLoopPreSelectTool {
+public:
+   ExampleEvtLoopPreSelectTool( const std::string&, const std::string&, const IInterface* );
+
+// to allow access to the IAthenaEvtLoopPreSelectTool interface
+   StatusCode queryInterface( const InterfaceID& riid, void** ppvIf );
+
+// setup/teardown functions
+   StatusCode initialize();
+   StatusCode finalize();
+
+// the method that decides if an event should be passed to the EventSelector
+   bool passEvent(const EventInfo* pEvent);
+
+public:
+// to resolve possible conflicts with IProperty::interfaceID()
+   static const InterfaceID& interfaceID() { return IAthenaEvtLoopPreSelectTool::interfaceID(); }
+
+private:
+   int m_prescale;
+};
+
+#endif // !ATHEXJOBOPTIONS_CONCRETETOOL_H
diff --git a/Control/AthenaExamples/AthExJobOptions/AthExJobOptions/IVirtualSvc.h b/Control/AthenaExamples/AthExJobOptions/AthExJobOptions/IVirtualSvc.h
new file mode 100755
index 0000000000000000000000000000000000000000..3aba468fc2924eba7dca408c9ba3b7c13cb1a834
--- /dev/null
+++ b/Control/AthenaExamples/AthExJobOptions/AthExJobOptions/IVirtualSvc.h
@@ -0,0 +1,64 @@
+///////////////////////// -*- C++ -*- /////////////////////////////
+
+/*
+  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+*/
+
+// IVirtualSvc.h 
+// Header file for class IVirtualSvc
+// Author: S.Binet<binet@cern.ch>
+/////////////////////////////////////////////////////////////////// 
+#ifndef ATHEXJOBOPTIONS_IVIRTUALSVC_H
+#define ATHEXJOBOPTIONS_IVIRTUALSVC_H
+
+/** @class IVirtualSvc
+ *  This is the interface to a test service
+ */
+
+// STL includes
+
+// FrameWork includes
+#include "GaudiKernel/IService.h"
+
+// forward declaration
+
+class IVirtualSvc : virtual public IService
+{ 
+  /////////////////////////////////////////////////////////////////// 
+  // Public methods: 
+  /////////////////////////////////////////////////////////////////// 
+ public: 
+
+  /** Destructor: 
+   */
+  virtual ~IVirtualSvc();
+
+  /////////////////////////////////////////////////////////////////// 
+  // Const methods: 
+  ///////////////////////////////////////////////////////////////////
+
+  /////////////////////////////////////////////////////////////////// 
+  // Non-const methods: 
+  /////////////////////////////////////////////////////////////////// 
+
+  /// Delivers important informations
+  virtual StatusCode qotd( std::string& quote ) = 0;
+
+  /// identifier for the framework
+  static const InterfaceID& interfaceID();
+
+}; 
+
+// I/O operators
+//////////////////////
+
+/////////////////////////////////////////////////////////////////// 
+// Inline methods: 
+/////////////////////////////////////////////////////////////////// 
+inline const InterfaceID& IVirtualSvc::interfaceID() 
+{ 
+  static const InterfaceID IID_IVirtualSvc("IVirtualSvc", 1, 0);
+  return IID_IVirtualSvc; 
+}
+
+#endif //> ATHEXJOBOPTIONS_IVIRTUALSVC_H
diff --git a/Control/AthenaExamples/AthExJobOptions/AthExJobOptions/IVirtualTool.h b/Control/AthenaExamples/AthExJobOptions/AthExJobOptions/IVirtualTool.h
new file mode 100755
index 0000000000000000000000000000000000000000..e03aefcbfd2534dbf0c4d74e49501acab7de3f4f
--- /dev/null
+++ b/Control/AthenaExamples/AthExJobOptions/AthExJobOptions/IVirtualTool.h
@@ -0,0 +1,21 @@
+/*
+  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+*/
+
+#ifndef ATHEXJOBOPTIONS_IVIRTUALTOOL_H
+#define ATHEXJOBOPTIONS_IVIRTUALTOOL_H
+
+#include "GaudiKernel/IAlgTool.h"
+
+
+/////////////////////////////////////////////////////////////////////////////
+
+class IVirtualTool : virtual public IAlgTool {
+public:
+   static const InterfaceID& interfaceID();
+
+public:
+   virtual StatusCode performTask( double& result ) = 0;
+};
+
+#endif // !ATHEXJOBOPTIONS_IVIRTUALTOOL_H
diff --git a/Control/AthenaExamples/AthExJobOptions/AthExJobOptions/KeyMixin.h b/Control/AthenaExamples/AthExJobOptions/AthExJobOptions/KeyMixin.h
new file mode 100755
index 0000000000000000000000000000000000000000..c92a78b835a1931549a529da28512bf7b1e9ac65
--- /dev/null
+++ b/Control/AthenaExamples/AthExJobOptions/AthExJobOptions/KeyMixin.h
@@ -0,0 +1,28 @@
+/*
+  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+*/
+
+#ifndef ATHEXJOBOPTIONS_KEYMIXIN_H
+#define ATHEXJOBOPTIONS_KEYMIXIN_H 1
+
+class AthAlgorithm;
+
+#include <string>
+
+
+/////////////////////////////////////////////////////////////////////////////
+
+class KeyMixin {
+public:
+   KeyMixin( AthAlgorithm* );
+
+protected:
+   std::string getInputKey() const { return m_inputKey; }
+   std::string getOutputKey() const { return m_outputKey; }
+
+private:
+   std::string m_inputKey;
+   std::string m_outputKey;
+};
+
+#endif // !ATHEXJOBOPTIONS_KEYMIXIN_H
diff --git a/Control/AthenaExamples/AthExJobOptions/AthExJobOptions/NoopAlgorithm.h b/Control/AthenaExamples/AthExJobOptions/AthExJobOptions/NoopAlgorithm.h
new file mode 100755
index 0000000000000000000000000000000000000000..1f01214d5d75bbee1911d87917f188efeb149962
--- /dev/null
+++ b/Control/AthenaExamples/AthExJobOptions/AthExJobOptions/NoopAlgorithm.h
@@ -0,0 +1,28 @@
+// -*- C++ -*-
+
+/*
+  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+*/
+
+#ifndef ATHEXJOBOPTIONS_NOOPALGORITHM_H
+#define ATHEXJOBOPTIONS_NOOPALGORITHM_H 1
+
+#include "AthenaBaseComps/AthAlgorithm.h"
+
+
+/////////////////////////////////////////////////////////////////////////////
+
+class NoopAlgorithm : public AthAlgorithm {
+public:
+   NoopAlgorithm( const std::string& name, ISvcLocator* svcloc );
+
+   StatusCode initialize();        // called once, at start of job
+   StatusCode reinitialize();      // can be called anytime after init
+   StatusCode execute();           // called every event
+   StatusCode finalize();          // called once, at end of job
+
+private:
+// services to hold on to
+};
+
+#endif // !ATHEXJOBOPTIONS_NOOPALGORITHM_H
diff --git a/Control/AthenaExamples/AthExJobOptions/AthExJobOptions/SomeData.h b/Control/AthenaExamples/AthExJobOptions/AthExJobOptions/SomeData.h
new file mode 100755
index 0000000000000000000000000000000000000000..466b2a37ad0b45d49663f8f2adcbda74db4f4e3c
--- /dev/null
+++ b/Control/AthenaExamples/AthExJobOptions/AthExJobOptions/SomeData.h
@@ -0,0 +1,34 @@
+// -*- C++ -*-
+
+/*
+  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+*/
+
+#ifndef ATHEXJOBOPTIONS_SOMEDATA_H
+#define ATHEXJOBOPTIONS_SOMEDATA_H 1
+
+#include "CLIDSvc/CLASS_DEF.h"
+
+
+/////////////////////////////////////////////////////////////////////////////
+
+class SomeData {
+public:
+   SomeData( double value ) : m_value( value ) {}
+
+   double getValue() { return m_value; }
+   void setValue( double value ) { m_value = value; }
+
+private:
+   double m_value;
+};
+
+
+// CLASS_DEF macro's can be obtained for your class by running the clid script
+// with your class name, like so (in an ATLAS environment):
+//
+//  $ clid -m SomeData
+//
+CLASS_DEF( SomeData, 86850056, 1 )
+
+#endif // !ATHEXJOBOPTIONS_SOMEDATA_H
diff --git a/Control/AthenaExamples/AthExJobOptions/AthExJobOptions/SubAlgorithm.h b/Control/AthenaExamples/AthExJobOptions/AthExJobOptions/SubAlgorithm.h
new file mode 100755
index 0000000000000000000000000000000000000000..484610366c10175c1133190d40dd530b290b0c14
--- /dev/null
+++ b/Control/AthenaExamples/AthExJobOptions/AthExJobOptions/SubAlgorithm.h
@@ -0,0 +1,34 @@
+// -*- C++ -*-
+
+/*
+  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+*/
+
+#ifndef ATHEXJOBOPTIONS_SUBALGORITHM_H
+#define ATHEXJOBOPTIONS_SUBALGORITHM_H 1
+
+#include "AthenaBaseComps/AthAlgorithm.h"
+
+#include <string>
+#include <vector>
+
+
+/////////////////////////////////////////////////////////////////////////////
+
+class SubAlgorithm : public AthAlgorithm {
+public:
+   SubAlgorithm( const std::string& name, ISvcLocator* svcloc );
+
+   StatusCode initialize();        // called once, at start of job
+   StatusCode reinitialize();      // can be called anytime after init
+   StatusCode beginRun();          // called at begin of every run
+   StatusCode execute();           // called every event
+   StatusCode endRun();            // called at end of every run
+   StatusCode finalize();          // called once, at end of job
+
+private:
+// add toolhandle ...
+   std::vector< std::string > m_selections;
+};
+
+#endif // !ATHEXJOBOPTIONS_SUBALGORITHM_H
diff --git a/Control/AthenaExamples/AthExJobOptions/AthExJobOptions/TemplatedTool.h b/Control/AthenaExamples/AthExJobOptions/AthExJobOptions/TemplatedTool.h
new file mode 100755
index 0000000000000000000000000000000000000000..9dbc009ea94af93056fa66e98deca5ab514b94c8
--- /dev/null
+++ b/Control/AthenaExamples/AthExJobOptions/AthExJobOptions/TemplatedTool.h
@@ -0,0 +1,46 @@
+// -*- C++ -*-
+
+/*
+  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+*/
+
+#ifndef ATHEXJOBOPTIONS_TEMPLATEDTOOL_H
+#define ATHEXJOBOPTIONS_TEMPLATEDTOOL_H 1
+
+#include "AthExJobOptions/IVirtualTool.h"
+
+#include "AthenaBaseComps/AthAlgTool.h"
+
+#include <string>
+
+
+/////////////////////////////////////////////////////////////////////////////
+
+namespace ToolSpace {
+
+template< class T >
+class TemplatedTool : virtual public IVirtualTool, virtual public AthAlgTool {
+public:
+   TemplatedTool( const std::string&, const std::string&, const IInterface* );
+
+// to allow access to the IVirtualTool interface
+   StatusCode queryInterface( const InterfaceID& riid, void** ppvIf );
+
+// setup/teardown functions, similar like those for Algorithm/Service
+   StatusCode initialize();
+   StatusCode finalize();
+
+// the magic method this tool provides
+   virtual StatusCode performTask( double& result );
+
+public:
+// to resolve possible conflicts with IProperty::interfaceID()
+   static const InterfaceID& interfaceID() { return IVirtualTool::interfaceID(); }
+
+private:
+   double m_factor;
+};
+
+}
+
+#endif // !ATHEXJOBOPTIONS_TOOLUSINGTOOL_H
diff --git a/Control/AthenaExamples/AthExJobOptions/AthExJobOptions/TestSvcHandleArrayAlg.h b/Control/AthenaExamples/AthExJobOptions/AthExJobOptions/TestSvcHandleArrayAlg.h
new file mode 100644
index 0000000000000000000000000000000000000000..8b91760955e0fe4a00f119f56c98fa056c2ce65c
--- /dev/null
+++ b/Control/AthenaExamples/AthExJobOptions/AthExJobOptions/TestSvcHandleArrayAlg.h
@@ -0,0 +1,38 @@
+// dear emacs, this is -*- C++ -*-
+
+/*
+  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+*/
+
+#ifndef ATHEXJOBOPTIONS_TESTSVCHANDLEARRAYALG_H
+#define ATHEXJOBOPTIONS_TESTSVCHANDLEARRAYALG_H 1
+
+#include "AthenaBaseComps/AthAlgorithm.h"
+#include "GaudiKernel/ServiceHandle.h"
+
+class IVirtualSvc;
+
+#include <string>
+#include <vector>
+
+
+/////////////////////////////////////////////////////////////////////////////
+
+class TestSvcHandleArrayAlg : public AthAlgorithm {
+public:
+   TestSvcHandleArrayAlg( const std::string& name, ISvcLocator* svcloc );
+
+   StatusCode initialize();        // called once, at start of job
+   StatusCode reinitialize();      // can be called anytime after init
+   StatusCode beginRun();          // called at begin of every run
+   StatusCode execute();           // called every event
+   StatusCode endRun();            // called at end of every run
+   StatusCode finalize();          // called once, at end of job
+
+private:
+   typedef ServiceHandleArray<IVirtualSvc> IVirtualSvcs_t;
+   IVirtualSvcs_t m_listOfSvcs;
+
+};
+
+#endif // !ATHEXJOBOPTIONS_TESTSVCHANDLEARRAYALG_H
diff --git a/Control/AthenaExamples/AthExJobOptions/AthExJobOptions/ToolUsingTool.h b/Control/AthenaExamples/AthExJobOptions/AthExJobOptions/ToolUsingTool.h
new file mode 100755
index 0000000000000000000000000000000000000000..50164eb35c2d41f681c0b4b11da4c9c7580d9557
--- /dev/null
+++ b/Control/AthenaExamples/AthExJobOptions/AthExJobOptions/ToolUsingTool.h
@@ -0,0 +1,47 @@
+// -*- C++ -*-
+
+/*
+  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+*/
+
+#ifndef ATHEXJOBOPTIONS_TOOLUSINGTOOL_H
+#define ATHEXJOBOPTIONS_TOOLUSINGTOOL_H 1
+
+#include "AthExJobOptions/IVirtualTool.h"
+
+#include "AthenaBaseComps/AthAlgTool.h"
+#include "GaudiKernel/MsgStream.h"
+#include "GaudiKernel/ToolHandle.h"
+
+#include <string>
+
+
+/////////////////////////////////////////////////////////////////////////////
+
+class ToolUsingTool : virtual public IVirtualTool, virtual public AthAlgTool {
+public:
+   ToolUsingTool( const std::string&, const std::string&, const IInterface* );
+
+// to allow access to the IVirtualTool interface
+   StatusCode queryInterface( const InterfaceID& riid, void** ppvIf );
+
+// setup/teardown functions, similar like those for Algorithm/Service
+   StatusCode initialize();
+   StatusCode finalize();
+
+// the magic method this tool provides
+   virtual StatusCode performTask( double& result );
+
+public:
+// to resolve possible conflicts with IProperty::interfaceID()
+   static const InterfaceID& interfaceID() { return IVirtualTool::interfaceID(); }
+
+private:
+   double m_factor;
+
+   ToolHandle< IVirtualTool > m_pubTool;
+   ToolHandle< IVirtualTool > m_privTool;
+   ToolHandleArray< IVirtualTool > m_toolArray;
+};
+
+#endif // !ATHEXJOBOPTIONS_TOOLUSINGTOOL_H
diff --git a/Control/AthenaExamples/AthExJobOptions/AthExJobOptions/TopAlgorithm.h b/Control/AthenaExamples/AthExJobOptions/AthExJobOptions/TopAlgorithm.h
new file mode 100755
index 0000000000000000000000000000000000000000..2de5bd0cea1bf87db7962a7022ff2f9a4dad1a8d
--- /dev/null
+++ b/Control/AthenaExamples/AthExJobOptions/AthExJobOptions/TopAlgorithm.h
@@ -0,0 +1,57 @@
+// dear emacs, this is -*- C++ -*-
+
+/*
+  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+*/
+
+#ifndef ATHEXJOBOPTIONS_TOPALGORITHM_H
+#define ATHEXJOBOPTIONS_TOPALGORITHM_H 1
+
+#include "AthenaBaseComps/AthAlgorithm.h"
+#include "GaudiKernel/ToolHandle.h"
+#include "GaudiKernel/ServiceHandle.h"
+
+#include "AthExJobOptions/KeyMixin.h"
+
+class StoreGateSvc;
+class IVirtualTool;
+class IVirtualSvc;
+
+#include <string>
+#include <vector>
+
+
+/////////////////////////////////////////////////////////////////////////////
+
+class TopAlgorithm : public AthAlgorithm, private KeyMixin {
+public:
+   TopAlgorithm( const std::string& name, ISvcLocator* svcloc );
+
+   StatusCode initialize();        // called once, at start of job
+   StatusCode reinitialize();      // can be called anytime after init
+   StatusCode beginRun();          // called at begin of every run
+   StatusCode execute();           // called every event
+   StatusCode endRun();            // called at end of every run
+   StatusCode finalize();          // called once, at end of job
+
+private:
+   double m_rndmFactor;
+
+   typedef ToolHandle<IVirtualTool> IVirtualTool_t;
+   typedef ToolHandleArray<IVirtualTool> IVirtualTools_t;
+
+   IVirtualTool_t m_tool;
+   IVirtualTool_t m_publicTool;
+   IVirtualTools_t m_listOfPrivateTools;
+   IVirtualTools_t m_listOfPublicTools;
+
+   typedef ServiceHandle<IVirtualSvc> IVirtualSvc_t;
+   IVirtualSvc_t m_svc;
+
+   // testing bug #31571
+   // https://savannah.cern.ch/bugs/?31571
+   IVirtualTool_t m_emptyPrivateTool;
+   IVirtualTool_t m_emptyPublicTool;
+};
+
+#endif // !ATHEXJOBOPTIONS_TOPALGORITHM_H
diff --git a/Control/AthenaExamples/AthExJobOptions/cmt/requirements b/Control/AthenaExamples/AthExJobOptions/cmt/requirements
new file mode 100755
index 0000000000000000000000000000000000000000..39da2a542d60d063ef1bdb2fd3a2f9df5833d8fa
--- /dev/null
+++ b/Control/AthenaExamples/AthExJobOptions/cmt/requirements
@@ -0,0 +1,37 @@
+package AthExJobOptions
+author Wim Lavrijsen <WLavrijsen@lbl.gov>
+
+use AtlasPolicy          AtlasPolicy-* 
+use GaudiInterface       GaudiInterface-*    External
+
+use AthenaKernel         AthenaKernel-*      Control
+use AthenaBaseComps	 AthenaBaseComps-*   Control
+use CLIDSvc              CLIDSvc-*           Control
+
+library AthExJobOptions *.cxx -s=components *.cxx
+apply_pattern component_library
+
+apply_pattern declare_joboptions \
+   files="*.py"
+
+apply_pattern declare_python_modules \
+   files="*.py"
+
+private
+use EventInfo            EventInfo-*         Event
+use StoreGate            StoreGate-*         Control
+apply_pattern install_runtime
+
+use TestTools      TestTools-*        AtlasTest -no_auto_imports 
+apply_pattern athenarun_test name="JobOptionsBasic" \
+	      pre_script="../cmt/setup.sh"	\	      
+	      options="AthExJobOptions/AthExJobOptions_BasicJobOptions.py" \
+	      post_script="${TESTTOOLSROOT}/share/post.sh JobOptionsBasic"
+apply_pattern athenarun_test name="JobOptionsCustomTool" \
+	      pre_script="../cmt/setup.sh"	\	      
+	      options="AthExJobOptions/AthExJobOptions_CustomToolJobOptions.py" \
+	      post_script="${TESTTOOLSROOT}/share/post.sh JobOptionsCustomTool"
+apply_pattern athenarun_test name="JobOptionsCustomTopAlg" \
+	      pre_script="../cmt/setup.sh"	\	      
+	      options="AthExJobOptions/AthExJobOptions_CustomTopAlgorithmJobOptions.py" \
+	      post_script="${TESTTOOLSROOT}/share/post.sh JobOptionsCustomTopAlg"
diff --git a/Control/AthenaExamples/AthExJobOptions/doc/mainpage.h b/Control/AthenaExamples/AthExJobOptions/doc/mainpage.h
new file mode 100755
index 0000000000000000000000000000000000000000..09ac6e39ed560931065dc03a828dd6ca0364616a
--- /dev/null
+++ b/Control/AthenaExamples/AthExJobOptions/doc/mainpage.h
@@ -0,0 +1,62 @@
+/*
+  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+*/
+
+/**
+@mainpage AthExJobOptions Package
+@author Wim Lavrijsen <WLavrijsen@lbl.gov>
+@author Martin Woudstra <Martin.Woudstra@cern.ch>
+
+@section AthExJobOptionsIntro Introduction
+
+This package contains examples of configurable-style job options, and shows
+how to write self-contained Gaudi component configurations by deriving your
+own python classes from the generated configurables.
+For this purpose, it uses a few "Hello World!"-style Algorithms and AlgTools;
+the real meat, however, is in the custom python files.
+
+@section AthExJobOptionsOverview Class Overview
+
+Of main interest are the python classes; the other classes are merely there in
+order to have something to play with.
+The python classes are:
+
+  - CustomTopAlgorithm : shows how to implement a customization of a top algorithm by using a class derived from the generated configurable. The result is a well-contained representation of the corresponding Gaudi component.
+
+The following Algorithm classes are available:
+
+  - NoopAlgorithm : a do-nothing Algorithm, which only has the base-class Algorithm properties.
+
+  - TopAlgorithm : an algorithm that makes use of a tool, set by configuration, to perform a task.
+
+  - SubAlgorithm : an algorithm that presumes to be controlled by another algorithm.
+
+The following AlgTool classes, all implementing the @c IVirtualTool interface, are available:
+
+  - ConcreteTool : a tool that performs a task.
+
+  - TemplatedTool : a tool that is templated in C++ and performs a task.
+
+  - ToolUsingTool : a tool that makes use of a tool, set by configuration, to perform a task.
+
+As well as the following helpers:
+
+  - KeyMixin : a mixin class providing in/out key properties for use with @c StoreGate
+
+  - SomeData : a custom data class, instances of which can be put in, and read from, @c StoreGate
+
+@ref used_AthExJobOptions
+
+@ref requirements_AthExJobOptions
+
+*/
+
+/**
+@page used_AthExJobOptions Used Packages
+@htmlinclude used_packages.html
+*/
+
+/**
+@page requirements_AthExJobOptions Requirements
+@include requirements
+*/
diff --git a/Control/AthenaExamples/AthExJobOptions/python/CustomToolUsingTool.py b/Control/AthenaExamples/AthExJobOptions/python/CustomToolUsingTool.py
new file mode 100755
index 0000000000000000000000000000000000000000..4efd723bf46f507920faeb7518f38facb2d16895
--- /dev/null
+++ b/Control/AthenaExamples/AthExJobOptions/python/CustomToolUsingTool.py
@@ -0,0 +1,34 @@
+# Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+
+# File: AthExJobOptions/CustomToolUsingTool.py
+# Author: Wim Lavrijsen (WLavrijsen@lbl.gov)
+
+__version__ = '1.0.0'
+__author__  = 'Wim Lavrijsen (WLavrijsen@lbl.gov)'
+
+__all__ = [ 'CustomToolUsingTool' ]
+
+
+# Get our base class (was generated by genConf; note that the package name is
+# not necessary if both classes reside in the same directory)
+from AthExJobOptionsConf import ToolUsingTool
+
+
+# Customized class, enable through derivation
+class CustomToolUsingTool( ToolUsingTool ):
+   __slots__ = []                  # enforce no new properties
+
+   def __init__( self, name = 'CustomToolUsingTool' ):      # sets default name
+      super( CustomToolUsingTool, self ).__init__( name )   # have to call base init
+
+ # setDefaults is enforced to be a class method; because it is a class method,
+ # the defaults can be savely queried by other tools, without touching any part
+ # of the configuration as would happen otherwise
+   def setDefaults( cls, handle ):
+    # these values will override the C++ (i.e. developer) default values, not
+    # any python (i.e. user) values
+      handle.Factor = 42.          # best, is considered default
+
+      if not hasattr( handle, 'TheToolTool' ):
+         from AthExJobOptionsConf import ConcreteTool
+         handle.TheToolTool = ConcreteTool( 'ToolTool' )
diff --git a/Control/AthenaExamples/AthExJobOptions/python/CustomToolUsingTool2.py b/Control/AthenaExamples/AthExJobOptions/python/CustomToolUsingTool2.py
new file mode 100755
index 0000000000000000000000000000000000000000..ec6130ccba3d30c1cc505ceff457eac342b5b854
--- /dev/null
+++ b/Control/AthenaExamples/AthExJobOptions/python/CustomToolUsingTool2.py
@@ -0,0 +1,30 @@
+# Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+
+# File: AthExJobOptions/CustomToolUsingTool2.py
+# Author: Wim Lavrijsen (WLavrijsen@lbl.gov)
+
+__version__ = '1.0.0'
+__author__  = 'Wim Lavrijsen (WLavrijsen@lbl.gov)'
+
+__all__ = [ 'CustomToolUsingTool2' ]
+
+
+# Customized class, enable through pseudo-metaclass
+class CustomToolUsingTool2( object ):
+   def __new__( cls, name = 'CustomToolUsingTool2' ):
+    # first, look for already fully customized instance
+      from AthExJobOptionsConf import ToolUsingTool
+      try:
+         return ToolUsingTool.configurables[ name ]
+      except KeyError:
+         pass
+
+    # else, request a new instance, and add customization
+      from AthExJobOptionsConf import ConcreteTool
+      tool = ToolUsingTool( name )
+      tool.Factor = 42.
+
+      tool.TheToolTool = ConcreteTool( 'ToolTool' )
+
+    # all done
+      return tool
diff --git a/Control/AthenaExamples/AthExJobOptions/python/CustomTopAlgorithm.py b/Control/AthenaExamples/AthExJobOptions/python/CustomTopAlgorithm.py
new file mode 100755
index 0000000000000000000000000000000000000000..6b10b29f36a06fb68e0fd272d89a32ca692ab495
--- /dev/null
+++ b/Control/AthenaExamples/AthExJobOptions/python/CustomTopAlgorithm.py
@@ -0,0 +1,40 @@
+# Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+
+## @file CustomTopAlgorithm.py
+
+# File: AthExJobOptions/CustomTopAlgorithm.py
+# Author: Wim Lavrijsen (WLavrijsen@lbl.gov)
+
+__version__ = '1.0.0'
+__author__  = 'Wim Lavrijsen (WLavrijsen@lbl.gov)'
+
+__all__ = [ 'CustomTopAlgorithm' ]
+
+
+# Get our base class (was generated by genConf; note that the package name is
+# not necessary if both classes reside in the same directory)
+from AthExJobOptionsConf import TopAlgorithm
+
+## @class CustomTopAlgorithm
+#  @brief Customizer class for TopAlgorithm, enabled through derivation
+# bla bla bla
+class CustomTopAlgorithm( TopAlgorithm ):
+   __slots__ = []                  # enforce no new properties
+
+   def __init__( self, name = 'CustomTopAlgorithm' ):       # sets default name
+      super( CustomTopAlgorithm, self ).__init__( name )    # have to call base init
+
+      self.RndmFactor = 101.       # allowed, NOT considered default
+
+ # setDefaults is enforced to be a class method; because it is a class method,
+ # the defaults can be savely queried by other tools, without touching any part
+ # of the configuration as would happen otherwise
+   def setDefaults( cls, handle ):
+    # these values will override the C++ (i.e. developer) default values, not
+    # any python (i.e. user) values
+      handle.RndmFactor = 42.      # best, is considered default
+
+    # make sure one tool is always selected
+      if not hasattr( handle, 'TheTool' ):
+         from AthExJobOptionsConf import ConcreteTool
+         handle.TheTool = ConcreteTool()
diff --git a/Control/AthenaExamples/AthExJobOptions/python/__init__.py b/Control/AthenaExamples/AthExJobOptions/python/__init__.py
new file mode 100755
index 0000000000000000000000000000000000000000..423ac99185109909c98b7b974144b894fe7afa14
--- /dev/null
+++ b/Control/AthenaExamples/AthExJobOptions/python/__init__.py
@@ -0,0 +1,9 @@
+# Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+
+# File: AthExJobOptions/__init__.py
+# Author: Wim Lavrijsen (WLavrijsen@lbl.gov)
+
+__version__ = '1.0.0'
+__author__  = 'Wim Lavrijsen (WLavrijsen@lbl.gov)'
+
+__all__ = [ 'CustomTopAlgorithm' ]
diff --git a/Control/AthenaExamples/AthExJobOptions/share/AthExJobOptions_BasicJobOptions.py b/Control/AthenaExamples/AthExJobOptions/share/AthExJobOptions_BasicJobOptions.py
new file mode 100755
index 0000000000000000000000000000000000000000..5d4feaa4aab7e6ecb2efea6cd395b985503ddbb1
--- /dev/null
+++ b/Control/AthenaExamples/AthExJobOptions/share/AthExJobOptions_BasicJobOptions.py
@@ -0,0 +1,116 @@
+# File: AthExJobOptions/AthExJobOptions_BasicJobOptions.py
+# Author: Wim Lavrijsen <WLavrijsen@lbl.gov>
+
+# This Athena job consists of algorithms that loop over events;
+# here, the (default) top sequence is used:
+
+MessageSvc.Format = "% F%32W%S%7W%R%T %0W%M"
+
+from AthenaCommon.AlgSequence import AlgSequence
+job = AlgSequence()
+assert( job == AlgSequence() )     # this is a singleton
+
+# Get hold of the algorithms that we want to run
+from AthExJobOptions.AthExJobOptionsConf import TopAlgorithm
+#    ^^package name  ^^generated file           ^^Gaudi component
+
+# Some Tool algorithm classes that will/may be used
+from AthExJobOptions.AthExJobOptionsConf import ConcreteTool, ToolSpace__TemplatedTool_double_, ToolUsingTool
+
+# Next, algorithms need adding to the job. The following will
+# add an algorithm named "TopAlgorithm" of type "TopAlgorithm":
+job += TopAlgorithm()
+
+# Alternatively, a specific name for an instance of the type
+# "TopAlgorithm" can be chosen (here, 'MyAlg'):
+job += TopAlgorithm( 'MyAlg' )
+
+# There are now 2 algorithms in this job:
+assert( len(job) == 2 )
+
+# And another
+job += TopAlgorithm( 'YourAlg' )
+
+# Modify some job options parameters, by accessing the algorithms
+# through their instance name:
+job.TopAlgorithm.InputKey   = ''
+job.TopAlgorithm.OutputKey  = 'AAA'
+job.TopAlgorithm.TheTool = ToolSpace__TemplatedTool_double_( 'TSTT' )
+
+job.MyAlg.InputKey   = job.TopAlgorithm.OutputKey
+job.MyAlg.OutputKey  = 'BBB'
+
+# register a service with the service manager
+from AthenaCommon.AppMgr import ServiceMgr as svcMgr
+svcMgr += CfgMgr.ConcreteSvc(
+   "QotdSvc",
+   Qotd = "These are not the droids you are looking for"
+   )
+# and bind it to 'MyAlg'
+job.MyAlg.TheSvc = svcMgr.QotdSvc
+
+# overriding default list
+job.MyAlg.PrivateToolList = [ ConcreteTool( "PyCT1" ),
+                              ConcreteTool( "PyCT2" ),
+                              ToolSpace__TemplatedTool_double_( 'PyTSTT3', Factor=30 ),
+                              ToolSpace__TemplatedTool_double_( 'PyTSTT4', Factor=40 ) ]
+
+# add my special tool
+job.MyAlg.PrivateToolList += [ ToolUsingTool( 'Special',
+                                              TheToolTool = ToolSpace__TemplatedTool_double_('PyTSTTSp1', Factor = 6.2830 ),
+                                              TheToolToolArray = [ ConcreteTool('PySpSubTool', Factor = 3.1415 ) ] ) ]
+# override some properties
+job.MyAlg.PrivateToolList[ 'Special' ].Factor = 37
+
+# try to add None as an empty private tool
+job.MyAlg.EmptyPrivateTool = None
+# try to add None as an empty public tool
+job.MyAlg.EmptyPublicTool = None
+
+from AthenaCommon.AppMgr import ToolSvc
+ToolSvc += ConcreteTool('PyCT5')
+ToolSvc += ToolSpace__TemplatedTool_double_( 'PyTSTT7' )
+# adding to default list
+job.MyAlg.PublicToolList += [ ToolSvc.PyCT5, ToolSvc.PyTSTT7 ]
+# Note that the parameters are type checked, this fails:
+try:
+   job.TopAlgorithm.InputKey = 42
+except ValueError:
+   log.info( "Can't set int to string property (this is correct)" )
+else:
+   log.fatal( "Managed to assign an int to a string property ... stop!" )
+   raise RuntimeError( "Managed to assign an int to a string property" )
+
+# Only actual properties can be set, this fails as well:
+try:
+   job.MyAlg.ThisDoesNotExist = None
+except AttributeError:
+   log.info( "Can't set non-existing property (this is correct)" )
+else:
+   log.fatal( "Managed to set a non-existing property ... stop!" )
+   raise RuntimeError( "Managed to set a non-existing property" )
+
+# For all TopAlgorithm instances, that do not yet have their tool defined,
+# fill in a default:
+for alg in job:
+   if isinstance( alg, TopAlgorithm ) and not hasattr( alg, 'TheTool' ):
+      alg.TheTool = ConcreteTool()
+
+# Some global settings (typically, you *only* want to
+# do this in the final options file, never in a fragment):
+theApp.EvtMax = 2
+
+# Hmm, you know what? Let's not run YourAlg after all
+del job.YourAlg
+assert( len(job) == 2 )
+
+# Also, to see the DEBUG messages from TopAlgorithm instances, switch
+# it on for all such algorithms (and only those):
+for alg in job:
+   if isinstance( alg, TopAlgorithm ):
+      alg.OutputLevel = DEBUG
+
+# Print the final job for reference purposes
+print job
+
+# End of AthExJobOptions_BasicJobOptions.py
diff --git a/Control/AthenaExamples/AthExJobOptions/share/AthExJobOptions_CustomToolJobOptions.py b/Control/AthenaExamples/AthExJobOptions/share/AthExJobOptions_CustomToolJobOptions.py
new file mode 100755
index 0000000000000000000000000000000000000000..bc55ed09d8c438814424c45e9849022ada72f6dd
--- /dev/null
+++ b/Control/AthenaExamples/AthExJobOptions/share/AthExJobOptions_CustomToolJobOptions.py
@@ -0,0 +1,41 @@
+# File: AthExJobOptions/AthExJobOptions_CustomToolJopOptions.py
+# Author: Wim Lavrijsen <WLavrijsen@lbl.gov>
+
+# This Athena job consists of algorithms that loop over events;
+# here, the (default) top sequence is used:
+from AthenaCommon.AlgSequence import AlgSequence
+job = AlgSequence()
+
+# Get hold of the algorithms that we want to run
+from AthExJobOptions.AthExJobOptionsConf import TopAlgorithm
+#    ^^package name  ^^generated file           ^^Gaudi component
+
+# Custom configured tool to use
+from AthExJobOptions.CustomToolUsingTool import CustomToolUsingTool
+#    ^^package name  ^^user-authored file       ^^custom class
+
+# Add the algorithm, and set its tool
+job += TopAlgorithm( 'MyTopAlg' )
+job.MyTopAlg.TheTool = CustomToolUsingTool( 'CustomTool' )
+job.MyTopAlg.TheTool.Factor = 14.
+
+# Another custom configured tool to use
+from AthExJobOptions.CustomToolUsingTool2 import CustomToolUsingTool2
+job += TopAlgorithm( 'YourTopAlg' )
+print job.YourTopAlg.properties()
+job.YourTopAlg.OutputKey = 'YourKey'
+job.YourTopAlg.TheTool = CustomToolUsingTool2( 'CustomTool2' )
+job.YourTopAlg.TheTool.Factor = 18.
+
+#job.MyTopAlg.OutputLevel = DEBUG
+#job.MyTopAlg.TheTool.OutputLevel = DEBUG
+
+
+# Some global settings (typically, you *only* want to
+# do this in the final options file, never in a fragment):
+theApp.EvtMax = 2
+
+# Print the final job for reference purposes
+print job
+
+# End of AthExJobOptions_CustomTopAlgorithmJobOptions.py
diff --git a/Control/AthenaExamples/AthExJobOptions/share/AthExJobOptions_CustomTopAlgorithmJobOptions.py b/Control/AthenaExamples/AthExJobOptions/share/AthExJobOptions_CustomTopAlgorithmJobOptions.py
new file mode 100755
index 0000000000000000000000000000000000000000..c8bc6a8e96e347ccf6379d4a8eb7fb6a10cc6343
--- /dev/null
+++ b/Control/AthenaExamples/AthExJobOptions/share/AthExJobOptions_CustomTopAlgorithmJobOptions.py
@@ -0,0 +1,31 @@
+# File: AthExJobOptions/AthExJobOptions_CustomTopAlgorithmJopOptions.py
+# Author: Wim Lavrijsen <WLavrijsen@lbl.gov>
+
+# This Athena job consists of algorithms that loop over events;
+# here, the (default) top sequence is used:
+from AthenaCommon.AlgSequence import AlgSequence
+job = AlgSequence()
+
+# Get hold of the algorithms that we want to run
+from AthExJobOptions.CustomTopAlgorithm import CustomTopAlgorithm
+#    ^^package name  ^^user-authored file      ^^custom class
+
+# Add the algorithm
+job += CustomTopAlgorithm( 'MyCustomAlg' )
+
+# Verify the set value, not this is from the ctor, not setDefaults()
+assert( job.MyCustomAlg.RndmFactor == 101. )
+
+# But it can be overwritten without problem:
+job.MyCustomAlg.RndmFactor = 33
+assert( job.MyCustomAlg.RndmFactor == 33. )
+
+
+# Some global settings (typically, you *only* want to
+# do this in the final options file, never in a fragment):
+theApp.EvtMax = 2
+
+# Print the final job for reference purposes
+print job
+
+# End of AthExJobOptions_CustomTopAlgorithmJobOptions.py
diff --git a/Control/AthenaExamples/AthExJobOptions/share/AthExJobOptions_ExampleEvtLoopPreSelectTool.py b/Control/AthenaExamples/AthExJobOptions/share/AthExJobOptions_ExampleEvtLoopPreSelectTool.py
new file mode 100755
index 0000000000000000000000000000000000000000..436bde0e92a81b50a030174af611b5308cf6ad8e
--- /dev/null
+++ b/Control/AthenaExamples/AthExJobOptions/share/AthExJobOptions_ExampleEvtLoopPreSelectTool.py
@@ -0,0 +1,41 @@
+# File: AthExJobOptions/AthExJobOptions_ExampleEvtLoopPreSelectTool.py
+# Author: Marjorie Shapiro <mdshapiro@lbl.gov> based on work by
+# Author: Wim Lavrijsen <WLavrijsen@lbl.gov>
+
+# This Athena job consists of algorithms that loop over events;
+# here, the (default) top sequence is used:
+from AthenaCommon.AlgSequence import AlgSequence
+job = AlgSequence()
+
+# Get hold of the algorithms that we want to run
+from AthExJobOptions.CustomTopAlgorithm import CustomTopAlgorithm
+#    ^^package name  ^^user-authored file      ^^custom class
+
+# Add the algorithm
+job += CustomTopAlgorithm( 'MyCustomAlg' )
+
+# Now, we are instantiating two instances of the example preselect tool
+# This example tool passes the event is Mod(event number,PassIfMod)==0
+from AthExJobOptions.AthExJobOptionsConf import ExampleEvtLoopPreSelectTool
+myTool = ExampleEvtLoopPreSelectTool( "myTool" )
+myTool.OutputLevel = DEBUG
+myTool2 = ExampleEvtLoopPreSelectTool( "myTool2" )
+myTool2.OutputLevel = DEBUG
+myTool2.PassIfMod = 3
+
+# And attaching these tools to the EventLoopManager
+# The tools are run in order and stop processing if either
+# one returns a false
+AthenaEventLoopMgr = Service( "AthenaEventLoopMgr" )
+#AthenaEventLoopMgr.PreSelectTools += [ "ExampleEvtLoopPreSelectTool/myTool" ]
+AthenaEventLoopMgr.PreSelectTools += [ myTool ]
+AthenaEventLoopMgr.PreSelectTools += [ myTool2 ]
+
+# Some global settings (typically, you *only* want to
+# do this in the final options file, never in a fragment):
+theApp.EvtMax = 50
+
+# Print the final job for reference purposes
+print job
+
+# End of AthExJobOptions_ExampleEvtLoopPreSelectTool.py
diff --git a/Control/AthenaExamples/AthExJobOptions/share/AthExJobOptions_ServiceHandleArrayTest.py b/Control/AthenaExamples/AthExJobOptions/share/AthExJobOptions_ServiceHandleArrayTest.py
new file mode 100644
index 0000000000000000000000000000000000000000..faeac82da0aa66e4a1699e54ed8fcb2615eb420e
--- /dev/null
+++ b/Control/AthenaExamples/AthExJobOptions/share/AthExJobOptions_ServiceHandleArrayTest.py
@@ -0,0 +1,41 @@
+# File: AthExJobOptions/AthExJobOptions_BasicJobOptions.py
+# Author: Wim Lavrijsen <WLavrijsen@lbl.gov>
+
+# This Athena job consists of algorithms that loop over events;
+# here, the (default) top sequence is used:
+
+MessageSvc.Format = "% F%32W%S%7W%R%T %0W%M"
+
+from AthenaCommon.AlgSequence import AlgSequence
+job = AlgSequence()
+assert( job == AlgSequence() )     # this is a singleton
+
+# Get hold of the algorithms that we want to run
+from AthExJobOptions.AthExJobOptionsConf import TestSvcHandleArrayAlg
+#    ^^package name  ^^generated file           ^^Gaudi component
+
+job += TestSvcHandleArrayAlg("MyAlg")
+
+# register a service with the service manager
+from AthenaCommon.AppMgr import ServiceMgr as svcMgr
+svcMgr += CfgMgr.ConcreteSvc(
+   "QotdSvc",
+   Qotd = "These are not the droids you are looking for."
+   )
+svcMgr += CfgMgr.AnotherConcreteSvc(
+   "AnotherQotdSvc",
+   Qotd = "Again, These are not the droids you are looking for."
+   )
+# and bind it to 'MyAlg'
+job.MyAlg.SvcList = [svcMgr.QotdSvc,
+                     svcMgr.AnotherQotdSvc]
+
+
+# Some global settings (typically, you *only* want to
+# do this in the final options file, never in a fragment):
+theApp.EvtMax = 1
+
+# Print the final job for reference purposes
+print job
+
+
diff --git a/Control/AthenaExamples/AthExJobOptions/share/JobOptionsBasic.ref b/Control/AthenaExamples/AthExJobOptions/share/JobOptionsBasic.ref
new file mode 100755
index 0000000000000000000000000000000000000000..2ce4a1e3959802ce233696410d6220c01cdc9413
--- /dev/null
+++ b/Control/AthenaExamples/AthExJobOptions/share/JobOptionsBasic.ref
@@ -0,0 +1,429 @@
+Py:ConfigurableDb    INFO Read module info for 3384 configurables from 10 genConfDb files
+Py:ConfigurableDb    INFO No duplicates have been found: that's good !
+Py:Athena            INFO including file "AthenaCommon/Bootstrap.py"
+Py:Athena            INFO including file "AthenaCommon/Atlas.UnixStandardJob.py"
+Py:Athena            INFO including file "AthExJobOptions/AthExJobOptions_BasicJobOptions.py"
+Py:Athena            INFO Can't set int to string property (this is correct)
+Py:Athena            INFO Can't set non-existing property (this is correct)
+/***** AlgSequence /TopAlg *************************************************************************
+|-<no properties>
+|=/***** Algorithm TopAlgorithm/TopAlgorithm *********************************************************
+| |-AuditAlgorithms   = False
+| |-AuditBeginRun     = False
+| |-AuditEndRun       = False
+| |-AuditExecute      = False
+| |-AuditFinalize     = False
+| |-AuditInitialize   = False
+| |-AuditReinitialize = False
+| |-EmptyPrivateTool  = PrivateToolHandle('')
+| |-EmptyPublicTool   = PublicToolHandle('')
+| |-Enable            = True
+| |-ErrorCount        = 0
+| |-ErrorMax          = 1
+| |-InputKey          = ''  (default: '')
+| |-MonitorService    = 'MonitorSvc'
+| |-OutputKey         = 'AAA'  (default: 'outkey')
+| |-OutputLevel       = 2  (default: 0)
+| |-PrivateToolList   = PrivateToolHandleArray(['ConcreteTool/Tool1','ToolUsingTool/Tool2','ToolSpace::TemplatedTool<double>/Tool3'])
+| |-PublicToolList    = PublicToolHandleArray(['ConcreteTool/Tool4','ToolUsingTool/Tool5','ToolSpace::TemplatedTool<double>/Tool6'])
+| |-RndmFactor        = 1.0
+| |-ThePublicTool     = PublicToolHandle('ConcreteTool')
+| |-TheSvc            = ServiceHandle('ConcreteSvc')
+| |-TheTool           = PrivateToolHandle('ToolSpace::TemplatedTool<double>/TSTT')  (default: 'ToolUsingTool')
+| |=/***** Private AlgTool ToolSpace::TemplatedTool<double>/TSTT ***************************************
+| | |-AuditFinalize   = False
+| | |-AuditInitialize = False
+| | |-AuditTools      = False
+| | |-Factor          = 1.0
+| | |-MonitorService  = 'MonitorSvc'
+| | |-OutputLevel     = 7
+| | \----- (End of Private AlgTool ToolSpace::TemplatedTool<double>/TSTT) ------------------------------
+| |=/***** Private AlgTool ConcreteTool/Tool1 **********************************************************
+| | |-AuditFinalize   = False
+| | |-AuditInitialize = False
+| | |-AuditTools      = False
+| | |-Factor          = 1.0
+| | |-MonitorService  = 'MonitorSvc'
+| | |-OutputLevel     = 7
+| | \----- (End of Private AlgTool ConcreteTool/Tool1) -------------------------------------------------
+| |=/***** Private AlgTool ToolUsingTool/Tool2 *********************************************************
+| | |-AuditFinalize    = False
+| | |-AuditInitialize  = False
+| | |-AuditTools       = False
+| | |-Factor           = 1.0
+| | |-MonitorService   = 'MonitorSvc'
+| | |-OutputLevel      = 7
+| | |-TheToolPubTool   = PublicToolHandle('ConcreteTool/PublicConcreteTool')
+| | |-TheToolTool      = PrivateToolHandle('ConcreteTool/ConcreteTool')  (default: 'ConcreteTool')
+| | |-TheToolToolArray = PrivateToolHandleArray(['ConcreteTool/CxxDefaultTool'])
+| | |=/***** Private AlgTool ConcreteTool/ConcreteTool ***************************************************
+| | | |-AuditFinalize   = False
+| | | |-AuditInitialize = False
+| | | |-AuditTools      = False
+| | | |-Factor          = 1.0
+| | | |-MonitorService  = 'MonitorSvc'
+| | | |-OutputLevel     = 7
+| | | \----- (End of Private AlgTool ConcreteTool/ConcreteTool) ------------------------------------------
+| | |=/***** Private AlgTool ConcreteTool/CxxDefaultTool *************************************************
+| | | |-AuditFinalize   = False
+| | | |-AuditInitialize = False
+| | | |-AuditTools      = False
+| | | |-Factor          = 1.0
+| | | |-MonitorService  = 'MonitorSvc'
+| | | |-OutputLevel     = 7
+| | | \----- (End of Private AlgTool ConcreteTool/CxxDefaultTool) ----------------------------------------
+| | \----- (End of Private AlgTool ToolUsingTool/Tool2) ------------------------------------------------
+| |=/***** Private AlgTool ToolSpace::TemplatedTool<double>/Tool3 **************************************
+| | |-AuditFinalize   = False
+| | |-AuditInitialize = False
+| | |-AuditTools      = False
+| | |-Factor          = 1.0
+| | |-MonitorService  = 'MonitorSvc'
+| | |-OutputLevel     = 7
+| | \----- (End of Private AlgTool ToolSpace::TemplatedTool<double>/Tool3) -----------------------------
+| \----- (End of Algorithm TopAlgorithm/TopAlgorithm) ------------------------------------------------
+|=/***** Algorithm TopAlgorithm/MyAlg ****************************************************************
+| |-AuditAlgorithms   = False
+| |-AuditBeginRun     = False
+| |-AuditEndRun       = False
+| |-AuditExecute      = False
+| |-AuditFinalize     = False
+| |-AuditInitialize   = False
+| |-AuditReinitialize = False
+| |-EmptyPrivateTool  = PrivateToolHandle('')
+| |-EmptyPublicTool   = PublicToolHandle('')
+| |-Enable            = True
+| |-ErrorCount        = 0
+| |-ErrorMax          = 1
+| |-InputKey          = 'AAA'  (default: '')
+| |-MonitorService    = 'MonitorSvc'
+| |-OutputKey         = 'BBB'  (default: 'outkey')
+| |-OutputLevel       = 2  (default: 0)
+| |-PrivateToolList   = PrivateToolHandleArray(['ConcreteTool/PyCT1','ConcreteTool/PyCT2','ToolSpace::TemplatedTool<double>/PyTSTT3','ToolSpace::TemplatedTool<double>/PyTSTT4','ToolUsingTool/Special'])
+| |                   (default: "['ConcreteTool/Tool1','ToolUsingTool/Tool2','ToolSpace::TemplatedTool<double>/Tool3']")
+| |-PublicToolList    = PublicToolHandleArray(['ConcreteTool/Tool4','ToolUsingTool/Tool5','ToolSpace::TemplatedTool<double>/Tool6','ConcreteTool/PyCT5','ToolSpace::TemplatedTool<double>/PyTSTT7'])
+| |                   (default: "['ConcreteTool/Tool4','ToolUsingTool/Tool5','ToolSpace::TemplatedTool<double>/Tool6']")
+| |-RndmFactor        = 1.0
+| |-ThePublicTool     = PublicToolHandle('ConcreteTool')
+| |-TheSvc            = ServiceHandle('QotdSvc')  (default: 'ConcreteSvc')
+| |-TheTool           = PrivateToolHandle('ToolUsingTool/ToolUsingTool')  (default: 'ToolUsingTool')
+| |=/***** Private AlgTool ConcreteTool/PyCT1 **********************************************************
+| | |-AuditFinalize   = False
+| | |-AuditInitialize = False
+| | |-AuditTools      = False
+| | |-Factor          = 1.0
+| | |-MonitorService  = 'MonitorSvc'
+| | |-OutputLevel     = 7
+| | \----- (End of Private AlgTool ConcreteTool/PyCT1) -------------------------------------------------
+| |=/***** Private AlgTool ConcreteTool/PyCT2 **********************************************************
+| | |-AuditFinalize   = False
+| | |-AuditInitialize = False
+| | |-AuditTools      = False
+| | |-Factor          = 1.0
+| | |-MonitorService  = 'MonitorSvc'
+| | |-OutputLevel     = 7
+| | \----- (End of Private AlgTool ConcreteTool/PyCT2) -------------------------------------------------
+| |=/***** Private AlgTool ToolSpace::TemplatedTool<double>/PyTSTT3 ************************************
+| | |-AuditFinalize   = False
+| | |-AuditInitialize = False
+| | |-AuditTools      = False
+| | |-Factor          = 30  (default: 1.0)
+| | |-MonitorService  = 'MonitorSvc'
+| | |-OutputLevel     = 7
+| | \----- (End of Private AlgTool ToolSpace::TemplatedTool<double>/PyTSTT3) ---------------------------
+| |=/***** Private AlgTool ToolSpace::TemplatedTool<double>/PyTSTT4 ************************************
+| | |-AuditFinalize   = False
+| | |-AuditInitialize = False
+| | |-AuditTools      = False
+| | |-Factor          = 40  (default: 1.0)
+| | |-MonitorService  = 'MonitorSvc'
+| | |-OutputLevel     = 7
+| | \----- (End of Private AlgTool ToolSpace::TemplatedTool<double>/PyTSTT4) ---------------------------
+| |=/***** Private AlgTool ToolUsingTool/Special *******************************************************
+| | |-AuditFinalize    = False
+| | |-AuditInitialize  = False
+| | |-AuditTools       = False
+| | |-Factor           = 37  (default: 1.0)
+| | |-MonitorService   = 'MonitorSvc'
+| | |-OutputLevel      = 7
+| | |-TheToolPubTool   = PublicToolHandle('ConcreteTool/PublicConcreteTool')
+| | |-TheToolTool      = PrivateToolHandle('ToolSpace::TemplatedTool<double>/PyTSTTSp1')
+| | |                  (default: 'ConcreteTool')
+| | |-TheToolToolArray = PrivateToolHandleArray(['ConcreteTool/PySpSubTool'])
+| | |                  (default: "['ConcreteTool/CxxDefaultTool']")
+| | |=/***** Private AlgTool ConcreteTool/PySpSubTool ****************************************************
+| | | |-AuditFinalize   = False
+| | | |-AuditInitialize = False
+| | | |-AuditTools      = False
+| | | |-Factor          = 3.1415000000000002  (default: 1.0)
+| | | |-MonitorService  = 'MonitorSvc'
+| | | |-OutputLevel     = 7
+| | | \----- (End of Private AlgTool ConcreteTool/PySpSubTool) -------------------------------------------
+| | |=/***** Private AlgTool ToolSpace::TemplatedTool<double>/PyTSTTSp1 **********************************
+| | | |-AuditFinalize   = False
+| | | |-AuditInitialize = False
+| | | |-AuditTools      = False
+| | | |-Factor          = 6.2830000000000004  (default: 1.0)
+| | | |-MonitorService  = 'MonitorSvc'
+| | | |-OutputLevel     = 7
+| | | \----- (End of Private AlgTool ToolSpace::TemplatedTool<double>/PyTSTTSp1) -------------------------
+| | \----- (End of Private AlgTool ToolUsingTool/Special) ----------------------------------------------
+| |=/***** Private AlgTool ToolUsingTool/ToolUsingTool *************************************************
+| | |-AuditFinalize    = False
+| | |-AuditInitialize  = False
+| | |-AuditTools       = False
+| | |-Factor           = 1.0
+| | |-MonitorService   = 'MonitorSvc'
+| | |-OutputLevel      = 7
+| | |-TheToolPubTool   = PublicToolHandle('ConcreteTool/PublicConcreteTool')
+| | |-TheToolTool      = PrivateToolHandle('ConcreteTool/ConcreteTool')  (default: 'ConcreteTool')
+| | |-TheToolToolArray = PrivateToolHandleArray(['ConcreteTool/CxxDefaultTool'])
+| | |=/***** Private AlgTool ConcreteTool/ConcreteTool ***************************************************
+| | | |-AuditFinalize   = False
+| | | |-AuditInitialize = False
+| | | |-AuditTools      = False
+| | | |-Factor          = 1.0
+| | | |-MonitorService  = 'MonitorSvc'
+| | | |-OutputLevel     = 7
+| | | \----- (End of Private AlgTool ConcreteTool/ConcreteTool) ------------------------------------------
+| | |=/***** Private AlgTool ConcreteTool/CxxDefaultTool *************************************************
+| | | |-AuditFinalize   = False
+| | | |-AuditInitialize = False
+| | | |-AuditTools      = False
+| | | |-Factor          = 1.0
+| | | |-MonitorService  = 'MonitorSvc'
+| | | |-OutputLevel     = 7
+| | | \----- (End of Private AlgTool ConcreteTool/CxxDefaultTool) ----------------------------------------
+| | \----- (End of Private AlgTool ToolUsingTool/ToolUsingTool) ----------------------------------------
+| \----- (End of Algorithm TopAlgorithm/MyAlg) -------------------------------------------------------
+\----- (End of AlgSequence /TopAlg) ----------------------------------------------------------------
+Py:Athena            INFO including file "AthenaCommon/runbatch.py"
+ApplicationMgr       INFO Updating ROOT::Reflex::PluginService::SetDebug(level) to level=0
+ApplicationMgr       INFO Successfully loaded modules : AthenaServices
+ApplicationMgr       INFO Application Manager Configured successfully
+ApplicationMgr       INFO Updating ROOT::Reflex::PluginService::SetDebug(level) to level=0
+StatusCodeSvc                      INFO initialize
+TopAlgorithm                       INFO Retrieved TheTool = PrivateToolHandle('ToolSpace::TemplatedTool<double>/TSTT')
+TopAlgorithm.Tool2                 INFO Retrieved TheToolPubTool = PublicToolHandle('ConcreteTool/PublicConcreteTool')
+TopAlgorithm.Tool2                 INFO Retrieved TheToolTool = PrivateToolHandle('ConcreteTool/ConcreteTool')
+TopAlgorithm.Tool2                 INFO Retrieved TheToolToolArray = PrivateToolHandleArray(['ConcreteTool/CxxDefaultTool'])
+TopAlgorithm                       INFO Retrieved PrivateToolList = PrivateToolHandleArray(['ConcreteTool/Tool1','ToolUsingTool/Tool2','ToolSpace::TemplatedTool<double>/Tool3'])
+ToolSvc.Tool5                      INFO Retrieved TheToolPubTool = PublicToolHandle('ConcreteTool/PublicConcreteTool')
+ToolSvc.Tool5                      INFO Retrieved TheToolTool = PrivateToolHandle('ConcreteTool')
+ToolSvc.Tool5                      INFO Retrieved TheToolToolArray = PrivateToolHandleArray(['ConcreteTool/CxxDefaultTool'])
+TopAlgorithm                       INFO Retrieved PublicToolList = PublicToolHandleArray(['ConcreteTool/Tool4','ToolUsingTool/Tool5','ToolSpace::TemplatedTool<double>/Tool6'])
+EventPersistencySvc                INFO  'CnvServices':[  ]
+ClassIDSvc                         INFO  getRegistryEntries: read 23 CLIDRegistry entries for module ALL
+ClassIDSvc                         INFO  getRegistryEntries: read 23 CLIDRegistry entries for module ALL
+ConcreteSvc                        INFO Initializing ConcreteSvc...
+ConcreteSvc                        INFO Quote of the day: [Your day will be somewhat dictated by authority]
+TopAlgorithm                       INFO Retrieved TheSvc = ServiceHandle('ConcreteSvc')
+TopAlgorithm                       INFO Empty private tool is empty (OK)
+TopAlgorithm                       INFO Empty public tool is empty (OK)
+MyAlg.ToolUsingTool                INFO Retrieved TheToolPubTool = PublicToolHandle('ConcreteTool/PublicConcreteTool')
+MyAlg.ToolUsingTool                INFO Retrieved TheToolTool = PrivateToolHandle('ConcreteTool/ConcreteTool')
+MyAlg.ToolUsingTool                INFO Retrieved TheToolToolArray = PrivateToolHandleArray(['ConcreteTool/CxxDefaultTool'])
+MyAlg                              INFO Retrieved TheTool = PrivateToolHandle('ToolUsingTool/ToolUsingTool')
+MyAlg.Special                      INFO Retrieved TheToolPubTool = PublicToolHandle('ConcreteTool/PublicConcreteTool')
+MyAlg.Special                      INFO Retrieved TheToolTool = PrivateToolHandle('ToolSpace::TemplatedTool<double>/PyTSTTSp1')
+MyAlg.Special                      INFO Retrieved TheToolToolArray = PrivateToolHandleArray(['ConcreteTool/PySpSubTool'])
+MyAlg                              INFO Retrieved PrivateToolList = PrivateToolHandleArray(['ConcreteTool/PyCT1','ConcreteTool/PyCT2','ToolSpace::TemplatedTool<double>/PyTSTT3','ToolSpace::TemplatedTool<double>/PyTSTT4','ToolUsingTool/Special'])
+MyAlg                              INFO Retrieved PublicToolList = PublicToolHandleArray(['ConcreteTool/Tool4','ToolUsingTool/Tool5','ToolSpace::TemplatedTool<double>/Tool6','ConcreteTool/PyCT5','ToolSpace::TemplatedTool<double>/PyTSTT7'])
+QotdSvc                            INFO Initializing QotdSvc...
+QotdSvc                            INFO Quote of the day: [These are not the droids you are looking for]
+MyAlg                              INFO Retrieved TheSvc = ServiceHandle('QotdSvc')
+MyAlg                              INFO Empty private tool is empty (OK)
+MyAlg                              INFO Empty public tool is empty (OK)
+HistogramPersistencySvc            INFO  'CnvServices':[ 'HbookHistSvc' , 'RootHistSvc' ]
+HistogramPersistencySvc         WARNING Histograms saving not required.
+AthenaEventLoopMgr              WARNING Histograms saving not required.
+ApplicationMgr                     INFO Application Manager Initialized successfully
+AthenaEventLoopMgr                 INFO   ===>>>  start of run 0    <<<===
+AthenaEventLoopMgr                 INFO   ===>>>  start processing event #1, run #0 0 events processed so far  <<<===
+HistorySvc                         INFO Registered 2 Algorithms
+HistorySvc                         INFO Registered 12 AlgTools
+HistorySvc                         INFO Registered 17 Services
+TopAlgorithm                       INFO got this quote [Your day will be somewhat dictated by authority].
+TopAlgorithm                      DEBUG no reading requested
+TopAlgorithm                       INFO doing my work ...
+RndmGenSvc.Engine                  INFO Generator engine type:CLHEP::RanluxEngine
+RndmGenSvc.Engine                  INFO Current Seed:1234567 Luxury:3
+RndmGenSvc                         INFO Using Random engine:HepRndm::Engine<CLHEP::RanluxEngine>
+TopAlgorithm.TSTT                  INFO performing templated task factor ( 1) ...
+TopAlgorithm.TSTT                  INFO ... templated task is done, result: 314.345
+TopAlgorithm.Tool1                 INFO performing concrete task (factor: 1) ...
+TopAlgorithm.Tool1                 INFO ... concrete task is done, result: 38664.5
+TopAlgorithm.Tool2                 INFO performing task using tool (factor: 1) ...
+ToolSvc.PublicConcreteTool         INFO performing concrete task (factor: 1) ...
+ToolSvc.PublicConcreteTool         INFO ... concrete task is done
+TopAlgorithm.Tool2.ConcreteTool    INFO performing concrete task (factor: 1) ...
+TopAlgorithm.Tool2.ConcreteTool    INFO ... concrete task is done, result: 5.84954e+08
+TopAlgorithm.Tool2                 INFO ... task using tool is done, result: 5.84954e+08
+TopAlgorithm.Tool2.CxxDefault...   INFO performing concrete task (factor: 1) ...
+TopAlgorithm.Tool2.CxxDefault...   INFO ... concrete task is done, result: 1.51844e+06
+TopAlgorithm.Tool3                 INFO performing templated task factor ( 1) ...
+TopAlgorithm.Tool3                 INFO ... templated task is done, result: 4.61529e+11
+ToolSvc.Tool4                      INFO performing concrete task (factor: 1) ...
+ToolSvc.Tool4                      INFO ... concrete task is done
+ToolSvc.Tool5                      INFO performing task using tool (factor: 1) ...
+ToolSvc.PublicConcreteTool         INFO performing concrete task (factor: 1) ...
+ToolSvc.PublicConcreteTool         INFO ... concrete task is done
+ToolSvc.Tool5.ConcreteTool         INFO performing concrete task (factor: 1) ...
+ToolSvc.Tool5.ConcreteTool         INFO ... concrete task is done
+ToolSvc.Tool5                      INFO ... task using tool is done
+ToolSvc.Tool5.CxxDefaultTool       INFO performing concrete task (factor: 1) ...
+ToolSvc.Tool5.CxxDefaultTool       INFO ... concrete task is done
+ToolSvc.Tool6                      INFO performing templated task factor ( 1) ...
+ToolSvc.Tool6                      INFO ... templated task is done
+TopAlgorithm                       INFO ... my work is done! 
+TopAlgorithm                      DEBUG wrote data: 6.77628e+20 for key: AAA
+MyAlg                              INFO got this quote [These are not the droids you are looking for].
+MyAlg                             DEBUG read: 6.77628e+20 from key: AAA
+MyAlg                              INFO doing my work ...
+MyAlg.ToolUsingTool                INFO performing task using tool (factor: 1) ...
+ToolSvc.PublicConcreteTool         INFO performing concrete task (factor: 1) ...
+ToolSvc.PublicConcreteTool         INFO ... concrete task is done
+MyAlg.ToolUsingTool.ConcreteTool   INFO performing concrete task (factor: 1) ...
+MyAlg.ToolUsingTool.ConcreteTool   INFO ... concrete task is done, result: 1.02518e+25
+MyAlg.ToolUsingTool                INFO ... task using tool is done, result: 1.02518e+25
+MyAlg.ToolUsingTool.CxxDefaul...   INFO performing concrete task (factor: 1) ...
+MyAlg.ToolUsingTool.CxxDefaul...   INFO ... concrete task is done, result: 1.51844e+06
+MyAlg.PyCT1                        INFO performing concrete task (factor: 1) ...
+MyAlg.PyCT1                        INFO ... concrete task is done, result: 1.26098e+27
+MyAlg.PyCT2                        INFO performing concrete task (factor: 1) ...
+MyAlg.PyCT2                        INFO ... concrete task is done, result: 1.551e+29
+MyAlg.PyTSTT3                      INFO performing templated task factor ( 30) ...
+MyAlg.PyTSTT3                      INFO ... templated task is done, result: 1.22374e+32
+MyAlg.PyTSTT4                      INFO performing templated task factor ( 40) ...
+MyAlg.PyTSTT4                      INFO ... templated task is done, result: 9.6553e+34
+MyAlg.Special                      INFO performing task using tool (factor: 37) ...
+ToolSvc.PublicConcreteTool         INFO performing concrete task (factor: 1) ...
+ToolSvc.PublicConcreteTool         INFO ... concrete task is done
+MyAlg.Special.PyTSTTSp1            INFO performing templated task factor ( 6.283) ...
+MyAlg.Special.PyTSTTSp1            INFO ... templated task is done, result: 9.37018e+39
+MyAlg.Special                      INFO ... task using tool is done, result: 9.37018e+39
+MyAlg.Special.PySpSubTool          INFO performing concrete task (factor: 3.1415) ...
+MyAlg.Special.PySpSubTool          INFO ... concrete task is done, result: 1.51844e+06
+MyAlg                              INFO Putting my special tool at work: PrivateToolHandle('ToolUsingTool/Special')
+MyAlg.Special                      INFO performing task using tool (factor: 37) ...
+ToolSvc.PublicConcreteTool         INFO performing concrete task (factor: 1) ...
+ToolSvc.PublicConcreteTool         INFO ... concrete task is done
+MyAlg.Special.PyTSTTSp1            INFO performing templated task factor ( 6.283) ...
+MyAlg.Special.PyTSTTSp1            INFO ... templated task is done, result: 9.09348e+44
+MyAlg.Special                      INFO ... task using tool is done, result: 9.09348e+44
+MyAlg.Special.PySpSubTool          INFO performing concrete task (factor: 3.1415) ...
+MyAlg.Special.PySpSubTool          INFO ... concrete task is done, result: 1.51844e+06
+ToolSvc.Tool4                      INFO performing concrete task (factor: 1) ...
+ToolSvc.Tool4                      INFO ... concrete task is done
+ToolSvc.Tool5                      INFO performing task using tool (factor: 1) ...
+ToolSvc.PublicConcreteTool         INFO performing concrete task (factor: 1) ...
+ToolSvc.PublicConcreteTool         INFO ... concrete task is done
+ToolSvc.Tool5.ConcreteTool         INFO performing concrete task (factor: 1) ...
+ToolSvc.Tool5.ConcreteTool         INFO ... concrete task is done
+ToolSvc.Tool5                      INFO ... task using tool is done
+ToolSvc.Tool5.CxxDefaultTool       INFO performing concrete task (factor: 1) ...
+ToolSvc.Tool5.CxxDefaultTool       INFO ... concrete task is done
+ToolSvc.Tool6                      INFO performing templated task factor ( 1) ...
+ToolSvc.Tool6                      INFO ... templated task is done
+ToolSvc.PyCT5                      INFO performing concrete task (factor: 1) ...
+ToolSvc.PyCT5                      INFO ... concrete task is done
+ToolSvc.PyTSTT7                    INFO performing templated task factor ( 1) ...
+ToolSvc.PyTSTT7                    INFO ... templated task is done
+MyAlg                              INFO ... my work is done! 
+MyAlg                             DEBUG wrote data: 1.2957e+59 for key: BBB
+AthenaEventLoopMgr                 INFO   ===>>>  done processing event #1, run #0 1 events processed so far  <<<===
+AthenaEventLoopMgr                 INFO   ===>>>  start processing event #2, run #0 1 events processed so far  <<<===
+TopAlgorithm                       INFO got this quote [Your day will be somewhat dictated by authority].
+TopAlgorithm                      DEBUG no reading requested
+TopAlgorithm                       INFO doing my work ...
+TopAlgorithm.TSTT                  INFO performing templated task factor ( 1) ...
+TopAlgorithm.TSTT                  INFO ... templated task is done, result: 244.823
+TopAlgorithm.Tool1                 INFO performing concrete task (factor: 1) ...
+TopAlgorithm.Tool1                 INFO ... concrete task is done, result: 30113.2
+TopAlgorithm.Tool2                 INFO performing task using tool (factor: 1) ...
+ToolSvc.PublicConcreteTool         INFO performing concrete task (factor: 1) ...
+ToolSvc.PublicConcreteTool         INFO ... concrete task is done
+TopAlgorithm.Tool2.ConcreteTool    INFO performing concrete task (factor: 1) ...
+TopAlgorithm.Tool2.ConcreteTool    INFO ... concrete task is done, result: 4.55582e+08
+TopAlgorithm.Tool2                 INFO ... task using tool is done, result: 4.55582e+08
+TopAlgorithm.Tool2.CxxDefault...   INFO performing concrete task (factor: 1) ...
+TopAlgorithm.Tool2.CxxDefault...   INFO ... concrete task is done, result: 1.51844e+06
+TopAlgorithm.Tool3                 INFO performing templated task factor ( 1) ...
+TopAlgorithm.Tool3                 INFO ... templated task is done, result: 3.59454e+11
+ToolSvc.Tool4                      INFO performing concrete task (factor: 1) ...
+ToolSvc.Tool4                      INFO ... concrete task is done
+ToolSvc.Tool5                      INFO performing task using tool (factor: 1) ...
+ToolSvc.PublicConcreteTool         INFO performing concrete task (factor: 1) ...
+ToolSvc.PublicConcreteTool         INFO ... concrete task is done
+ToolSvc.Tool5.ConcreteTool         INFO performing concrete task (factor: 1) ...
+ToolSvc.Tool5.ConcreteTool         INFO ... concrete task is done
+ToolSvc.Tool5                      INFO ... task using tool is done
+ToolSvc.Tool5.CxxDefaultTool       INFO performing concrete task (factor: 1) ...
+ToolSvc.Tool5.CxxDefaultTool       INFO ... concrete task is done
+ToolSvc.Tool6                      INFO performing templated task factor ( 1) ...
+ToolSvc.Tool6                      INFO ... templated task is done
+TopAlgorithm                       INFO ... my work is done! 
+TopAlgorithm                      DEBUG wrote data: 5.2776e+20 for key: AAA
+MyAlg                              INFO got this quote [These are not the droids you are looking for].
+MyAlg                             DEBUG read: 5.2776e+20 from key: AAA
+MyAlg                              INFO doing my work ...
+MyAlg.ToolUsingTool                INFO performing task using tool (factor: 1) ...
+ToolSvc.PublicConcreteTool         INFO performing concrete task (factor: 1) ...
+ToolSvc.PublicConcreteTool         INFO ... concrete task is done
+MyAlg.ToolUsingTool.ConcreteTool   INFO performing concrete task (factor: 1) ...
+MyAlg.ToolUsingTool.ConcreteTool   INFO ... concrete task is done, result: 7.98447e+24
+MyAlg.ToolUsingTool                INFO ... task using tool is done, result: 7.98447e+24
+MyAlg.ToolUsingTool.CxxDefaul...   INFO performing concrete task (factor: 1) ...
+MyAlg.ToolUsingTool.CxxDefaul...   INFO ... concrete task is done, result: 1.51844e+06
+MyAlg.PyCT1                        INFO performing concrete task (factor: 1) ...
+MyAlg.PyCT1                        INFO ... concrete task is done, result: 9.8209e+26
+MyAlg.PyCT2                        INFO performing concrete task (factor: 1) ...
+MyAlg.PyCT2                        INFO ... concrete task is done, result: 1.20797e+29
+MyAlg.PyTSTT3                      INFO performing templated task factor ( 30) ...
+MyAlg.PyTSTT3                      INFO ... templated task is done, result: 9.53089e+31
+MyAlg.PyTSTT4                      INFO performing templated task factor ( 40) ...
+MyAlg.PyTSTT4                      INFO ... templated task is done, result: 7.51987e+34
+MyAlg.Special                      INFO performing task using tool (factor: 37) ...
+ToolSvc.PublicConcreteTool         INFO performing concrete task (factor: 1) ...
+ToolSvc.PublicConcreteTool         INFO ... concrete task is done
+MyAlg.Special.PyTSTTSp1            INFO performing templated task factor ( 6.283) ...
+MyAlg.Special.PyTSTTSp1            INFO ... templated task is done, result: 7.29781e+39
+MyAlg.Special                      INFO ... task using tool is done, result: 7.29781e+39
+MyAlg.Special.PySpSubTool          INFO performing concrete task (factor: 3.1415) ...
+MyAlg.Special.PySpSubTool          INFO ... concrete task is done, result: 1.51844e+06
+MyAlg                              INFO Putting my special tool at work: PrivateToolHandle('ToolUsingTool/Special')
+MyAlg.Special                      INFO performing task using tool (factor: 37) ...
+ToolSvc.PublicConcreteTool         INFO performing concrete task (factor: 1) ...
+ToolSvc.PublicConcreteTool         INFO ... concrete task is done
+MyAlg.Special.PyTSTTSp1            INFO performing templated task factor ( 6.283) ...
+MyAlg.Special.PyTSTTSp1            INFO ... templated task is done, result: 7.08231e+44
+MyAlg.Special                      INFO ... task using tool is done, result: 7.08231e+44
+MyAlg.Special.PySpSubTool          INFO performing concrete task (factor: 3.1415) ...
+MyAlg.Special.PySpSubTool          INFO ... concrete task is done, result: 1.51844e+06
+ToolSvc.Tool4                      INFO performing concrete task (factor: 1) ...
+ToolSvc.Tool4                      INFO ... concrete task is done
+ToolSvc.Tool5                      INFO performing task using tool (factor: 1) ...
+ToolSvc.PublicConcreteTool         INFO performing concrete task (factor: 1) ...
+ToolSvc.PublicConcreteTool         INFO ... concrete task is done
+ToolSvc.Tool5.ConcreteTool         INFO performing concrete task (factor: 1) ...
+ToolSvc.Tool5.ConcreteTool         INFO ... concrete task is done
+ToolSvc.Tool5                      INFO ... task using tool is done
+ToolSvc.Tool5.CxxDefaultTool       INFO performing concrete task (factor: 1) ...
+ToolSvc.Tool5.CxxDefaultTool       INFO ... concrete task is done
+ToolSvc.Tool6                      INFO performing templated task factor ( 1) ...
+ToolSvc.Tool6                      INFO ... templated task is done
+ToolSvc.PyCT5                      INFO performing concrete task (factor: 1) ...
+ToolSvc.PyCT5                      INFO ... concrete task is done
+ToolSvc.PyTSTT7                    INFO performing templated task factor ( 1) ...
+ToolSvc.PyTSTT7                    INFO ... templated task is done
+MyAlg                              INFO ... my work is done! 
+MyAlg                             DEBUG wrote data: 1.00913e+59 for key: BBB
+AthenaEventLoopMgr                 INFO   ===>>>  done processing event #2, run #0 2 events processed so far  <<<===
+QotdSvc                            INFO Finalizing QotdSvc...
+ConcreteSvc                        INFO Finalizing ConcreteSvc...
+HistorySvc                         INFO Service finalised successfully
+ToolSvc.finalize()                 INFO Removing all tools created by ToolSvc
+StatusCodeSvc                      INFO initialize
+ApplicationMgr                     INFO Application Manager Finalized successfully
+ApplicationMgr                     INFO Application Manager Terminated successfully
+Py:Athena            INFO leaving with code 0: "successful run"
diff --git a/Control/AthenaExamples/AthExJobOptions/share/JobOptionsCustomTool.ref b/Control/AthenaExamples/AthExJobOptions/share/JobOptionsCustomTool.ref
new file mode 100755
index 0000000000000000000000000000000000000000..9162bd53df571d234e30684ea959721340b4e893
--- /dev/null
+++ b/Control/AthenaExamples/AthExJobOptions/share/JobOptionsCustomTool.ref
@@ -0,0 +1,391 @@
+Py:ConfigurableDb    INFO Read module info for 3384 configurables from 10 genConfDb files
+Py:ConfigurableDb    INFO No duplicates have been found: that's good !
+Py:Athena            INFO including file "AthenaCommon/Bootstrap.py"
+Py:Athena            INFO including file "AthenaCommon/Atlas.UnixStandardJob.py"
+Py:Athena            INFO including file "AthExJobOptions/AthExJobOptions_CustomToolJobOptions.py"
+/***** AlgSequence /TopAlg *************************************************************************
+|-<no properties>
+|=/***** Algorithm TopAlgorithm/MyTopAlg *************************************************************
+| |-AuditAlgorithms   = False
+| |-AuditBeginRun     = False
+| |-AuditEndRun       = False
+| |-AuditExecute      = False
+| |-AuditFinalize     = False
+| |-AuditInitialize   = False
+| |-AuditReinitialize = False
+| |-EmptyPrivateTool  = PrivateToolHandle('')
+| |-EmptyPublicTool   = PublicToolHandle('')
+| |-Enable            = True
+| |-ErrorCount        = 0
+| |-ErrorMax          = 1
+| |-InputKey          = ''
+| |-MonitorService    = 'MonitorSvc'
+| |-OutputKey         = 'outkey'
+| |-OutputLevel       = 0
+| |-PrivateToolList   = PrivateToolHandleArray(['ConcreteTool/Tool1','ToolUsingTool/Tool2','ToolSpace::TemplatedTool<double>/Tool3'])
+| |-PublicToolList    = PublicToolHandleArray(['ConcreteTool/Tool4','ToolUsingTool/Tool5','ToolSpace::TemplatedTool<double>/Tool6'])
+| |-RndmFactor        = 1.0
+| |-ThePublicTool     = PublicToolHandle('ConcreteTool')
+| |-TheSvc            = ServiceHandle('ConcreteSvc')
+| |-TheTool           = PrivateToolHandle('ToolUsingTool/CustomTool')  (default: 'ToolUsingTool')
+| |=/***** Private AlgTool ToolUsingTool/CustomTool ****************************************************
+| | |-AuditFinalize    = False
+| | |-AuditInitialize  = False
+| | |-AuditTools       = False
+| | |-Factor           = 14.0  (default: 42.0)
+| | |-MonitorService   = 'MonitorSvc'
+| | |-OutputLevel      = 7
+| | |-TheToolPubTool   = PublicToolHandle('ConcreteTool/PublicConcreteTool')
+| | |-TheToolTool      = PrivateToolHandle('ConcreteTool/ToolTool')
+| | |-TheToolToolArray = PrivateToolHandleArray(['ConcreteTool/CxxDefaultTool'])
+| | |=/***** Private AlgTool ConcreteTool/CxxDefaultTool *************************************************
+| | | |-AuditFinalize   = False
+| | | |-AuditInitialize = False
+| | | |-AuditTools      = False
+| | | |-Factor          = 1.0
+| | | |-MonitorService  = 'MonitorSvc'
+| | | |-OutputLevel     = 7
+| | | \----- (End of Private AlgTool ConcreteTool/CxxDefaultTool) ----------------------------------------
+| | |=/***** Private AlgTool ConcreteTool/ToolTool *******************************************************
+| | | |-AuditFinalize   = False
+| | | |-AuditInitialize = False
+| | | |-AuditTools      = False
+| | | |-Factor          = 1.0
+| | | |-MonitorService  = 'MonitorSvc'
+| | | |-OutputLevel     = 7
+| | | \----- (End of Private AlgTool ConcreteTool/ToolTool) ----------------------------------------------
+| | \----- (End of Private AlgTool ToolUsingTool/CustomTool) -------------------------------------------
+| |=/***** Private AlgTool ConcreteTool/Tool1 **********************************************************
+| | |-AuditFinalize   = False
+| | |-AuditInitialize = False
+| | |-AuditTools      = False
+| | |-Factor          = 1.0
+| | |-MonitorService  = 'MonitorSvc'
+| | |-OutputLevel     = 7
+| | \----- (End of Private AlgTool ConcreteTool/Tool1) -------------------------------------------------
+| |=/***** Private AlgTool ToolUsingTool/Tool2 *********************************************************
+| | |-AuditFinalize    = False
+| | |-AuditInitialize  = False
+| | |-AuditTools       = False
+| | |-Factor           = 1.0
+| | |-MonitorService   = 'MonitorSvc'
+| | |-OutputLevel      = 7
+| | |-TheToolPubTool   = PublicToolHandle('ConcreteTool/PublicConcreteTool')
+| | |-TheToolTool      = PrivateToolHandle('ConcreteTool/ConcreteTool')  (default: 'ConcreteTool')
+| | |-TheToolToolArray = PrivateToolHandleArray(['ConcreteTool/CxxDefaultTool'])
+| | |=/***** Private AlgTool ConcreteTool/ConcreteTool ***************************************************
+| | | |-AuditFinalize   = False
+| | | |-AuditInitialize = False
+| | | |-AuditTools      = False
+| | | |-Factor          = 1.0
+| | | |-MonitorService  = 'MonitorSvc'
+| | | |-OutputLevel     = 7
+| | | \----- (End of Private AlgTool ConcreteTool/ConcreteTool) ------------------------------------------
+| | |=/***** Private AlgTool ConcreteTool/CxxDefaultTool *************************************************
+| | | |-AuditFinalize   = False
+| | | |-AuditInitialize = False
+| | | |-AuditTools      = False
+| | | |-Factor          = 1.0
+| | | |-MonitorService  = 'MonitorSvc'
+| | | |-OutputLevel     = 7
+| | | \----- (End of Private AlgTool ConcreteTool/CxxDefaultTool) ----------------------------------------
+| | \----- (End of Private AlgTool ToolUsingTool/Tool2) ------------------------------------------------
+| |=/***** Private AlgTool ToolSpace::TemplatedTool<double>/Tool3 **************************************
+| | |-AuditFinalize   = False
+| | |-AuditInitialize = False
+| | |-AuditTools      = False
+| | |-Factor          = 1.0
+| | |-MonitorService  = 'MonitorSvc'
+| | |-OutputLevel     = 7
+| | \----- (End of Private AlgTool ToolSpace::TemplatedTool<double>/Tool3) -----------------------------
+| \----- (End of Algorithm TopAlgorithm/MyTopAlg) ----------------------------------------------------
+|=/***** Algorithm TopAlgorithm/YourTopAlg ***********************************************************
+| |-AuditAlgorithms   = False
+| |-AuditBeginRun     = False
+| |-AuditEndRun       = False
+| |-AuditExecute      = False
+| |-AuditFinalize     = False
+| |-AuditInitialize   = False
+| |-AuditReinitialize = False
+| |-EmptyPrivateTool  = PrivateToolHandle('')
+| |-EmptyPublicTool   = PublicToolHandle('')
+| |-Enable            = True
+| |-ErrorCount        = 0
+| |-ErrorMax          = 1
+| |-InputKey          = ''
+| |-MonitorService    = 'MonitorSvc'
+| |-OutputKey         = 'YourKey'  (default: 'outkey')
+| |-OutputLevel       = 0
+| |-PrivateToolList   = PrivateToolHandleArray(['ConcreteTool/Tool1','ToolUsingTool/Tool2','ToolSpace::TemplatedTool<double>/Tool3'])
+| |-PublicToolList    = PublicToolHandleArray(['ConcreteTool/Tool4','ToolUsingTool/Tool5','ToolSpace::TemplatedTool<double>/Tool6'])
+| |-RndmFactor        = 1.0
+| |-ThePublicTool     = PublicToolHandle('ConcreteTool')
+| |-TheSvc            = ServiceHandle('ConcreteSvc')
+| |-TheTool           = PrivateToolHandle('ToolUsingTool/CustomTool2')  (default: 'ToolUsingTool')
+| |=/***** Private AlgTool ToolUsingTool/CustomTool2 ***************************************************
+| | |-AuditFinalize    = False
+| | |-AuditInitialize  = False
+| | |-AuditTools       = False
+| | |-Factor           = 18.0  (default: 1.0)
+| | |-MonitorService   = 'MonitorSvc'
+| | |-OutputLevel      = 7
+| | |-TheToolPubTool   = PublicToolHandle('ConcreteTool/PublicConcreteTool')
+| | |-TheToolTool      = PrivateToolHandle('ConcreteTool/ToolTool')  (default: 'ConcreteTool')
+| | |-TheToolToolArray = PrivateToolHandleArray(['ConcreteTool/CxxDefaultTool'])
+| | |=/***** Private AlgTool ConcreteTool/CxxDefaultTool *************************************************
+| | | |-AuditFinalize   = False
+| | | |-AuditInitialize = False
+| | | |-AuditTools      = False
+| | | |-Factor          = 1.0
+| | | |-MonitorService  = 'MonitorSvc'
+| | | |-OutputLevel     = 7
+| | | \----- (End of Private AlgTool ConcreteTool/CxxDefaultTool) ----------------------------------------
+| | |=/***** Private AlgTool ConcreteTool/ToolTool *******************************************************
+| | | |-AuditFinalize   = False
+| | | |-AuditInitialize = False
+| | | |-AuditTools      = False
+| | | |-Factor          = 1.0
+| | | |-MonitorService  = 'MonitorSvc'
+| | | |-OutputLevel     = 7
+| | | \----- (End of Private AlgTool ConcreteTool/ToolTool) ----------------------------------------------
+| | \----- (End of Private AlgTool ToolUsingTool/CustomTool2) ------------------------------------------
+| |=/***** Private AlgTool ConcreteTool/Tool1 **********************************************************
+| | |-AuditFinalize   = False
+| | |-AuditInitialize = False
+| | |-AuditTools      = False
+| | |-Factor          = 1.0
+| | |-MonitorService  = 'MonitorSvc'
+| | |-OutputLevel     = 7
+| | \----- (End of Private AlgTool ConcreteTool/Tool1) -------------------------------------------------
+| |=/***** Private AlgTool ToolUsingTool/Tool2 *********************************************************
+| | |-AuditFinalize    = False
+| | |-AuditInitialize  = False
+| | |-AuditTools       = False
+| | |-Factor           = 1.0
+| | |-MonitorService   = 'MonitorSvc'
+| | |-OutputLevel      = 7
+| | |-TheToolPubTool   = PublicToolHandle('ConcreteTool/PublicConcreteTool')
+| | |-TheToolTool      = PrivateToolHandle('ConcreteTool/ConcreteTool')  (default: 'ConcreteTool')
+| | |-TheToolToolArray = PrivateToolHandleArray(['ConcreteTool/CxxDefaultTool'])
+| | |=/***** Private AlgTool ConcreteTool/ConcreteTool ***************************************************
+| | | |-AuditFinalize   = False
+| | | |-AuditInitialize = False
+| | | |-AuditTools      = False
+| | | |-Factor          = 1.0
+| | | |-MonitorService  = 'MonitorSvc'
+| | | |-OutputLevel     = 7
+| | | \----- (End of Private AlgTool ConcreteTool/ConcreteTool) ------------------------------------------
+| | |=/***** Private AlgTool ConcreteTool/CxxDefaultTool *************************************************
+| | | |-AuditFinalize   = False
+| | | |-AuditInitialize = False
+| | | |-AuditTools      = False
+| | | |-Factor          = 1.0
+| | | |-MonitorService  = 'MonitorSvc'
+| | | |-OutputLevel     = 7
+| | | \----- (End of Private AlgTool ConcreteTool/CxxDefaultTool) ----------------------------------------
+| | \----- (End of Private AlgTool ToolUsingTool/Tool2) ------------------------------------------------
+| |=/***** Private AlgTool ToolSpace::TemplatedTool<double>/Tool3 **************************************
+| | |-AuditFinalize   = False
+| | |-AuditInitialize = False
+| | |-AuditTools      = False
+| | |-Factor          = 1.0
+| | |-MonitorService  = 'MonitorSvc'
+| | |-OutputLevel     = 7
+| | \----- (End of Private AlgTool ToolSpace::TemplatedTool<double>/Tool3) -----------------------------
+| \----- (End of Algorithm TopAlgorithm/YourTopAlg) --------------------------------------------------
+\----- (End of AlgSequence /TopAlg) ----------------------------------------------------------------
+Py:Athena            INFO including file "AthenaCommon/runbatch.py"
+ApplicationMgr       INFO Updating ROOT::Reflex::PluginService::SetDebug(level) to level=0
+ApplicationMgr       INFO Successfully loaded modules : AthenaServices
+ApplicationMgr       INFO Application Manager Configured successfully
+ApplicationMgr       INFO Updating ROOT::Reflex::PluginService::SetDebug(level) to level=0
+StatusCodeSvc        INFO initialize
+MyTopAlg.Custom...   INFO Retrieved TheToolPubTool = PublicToolHandle('ConcreteTool/PublicConcreteTool')
+MyTopAlg.Custom...   INFO Retrieved TheToolTool = PrivateToolHandle('ConcreteTool/ToolTool')
+MyTopAlg.Custom...   INFO Retrieved TheToolToolArray = PrivateToolHandleArray(['ConcreteTool/CxxDefaultTool'])
+MyTopAlg             INFO Retrieved TheTool = PrivateToolHandle('ToolUsingTool/CustomTool')
+MyTopAlg.Tool2       INFO Retrieved TheToolPubTool = PublicToolHandle('ConcreteTool/PublicConcreteTool')
+MyTopAlg.Tool2       INFO Retrieved TheToolTool = PrivateToolHandle('ConcreteTool/ConcreteTool')
+MyTopAlg.Tool2       INFO Retrieved TheToolToolArray = PrivateToolHandleArray(['ConcreteTool/CxxDefaultTool'])
+MyTopAlg             INFO Retrieved PrivateToolList = PrivateToolHandleArray(['ConcreteTool/Tool1','ToolUsingTool/Tool2','ToolSpace::TemplatedTool<double>/Tool3'])
+ToolSvc.Tool5        INFO Retrieved TheToolPubTool = PublicToolHandle('ConcreteTool/PublicConcreteTool')
+ToolSvc.Tool5        INFO Retrieved TheToolTool = PrivateToolHandle('ConcreteTool')
+ToolSvc.Tool5        INFO Retrieved TheToolToolArray = PrivateToolHandleArray(['ConcreteTool/CxxDefaultTool'])
+MyTopAlg             INFO Retrieved PublicToolList = PublicToolHandleArray(['ConcreteTool/Tool4','ToolUsingTool/Tool5','ToolSpace::TemplatedTool<double>/Tool6'])
+EventPersistenc...   INFO  'CnvServices':[  ]
+ConcreteSvc          INFO Initializing ConcreteSvc...
+ConcreteSvc          INFO Quote of the day: [Your day will be somewhat dictated by authority]
+MyTopAlg             INFO Retrieved TheSvc = ServiceHandle('ConcreteSvc')
+MyTopAlg             INFO Empty private tool is empty (OK)
+MyTopAlg             INFO Empty public tool is empty (OK)
+YourTopAlg.Cust...   INFO Retrieved TheToolPubTool = PublicToolHandle('ConcreteTool/PublicConcreteTool')
+YourTopAlg.Cust...   INFO Retrieved TheToolTool = PrivateToolHandle('ConcreteTool/ToolTool')
+YourTopAlg.Cust...   INFO Retrieved TheToolToolArray = PrivateToolHandleArray(['ConcreteTool/CxxDefaultTool'])
+YourTopAlg           INFO Retrieved TheTool = PrivateToolHandle('ToolUsingTool/CustomTool2')
+YourTopAlg.Tool2     INFO Retrieved TheToolPubTool = PublicToolHandle('ConcreteTool/PublicConcreteTool')
+YourTopAlg.Tool2     INFO Retrieved TheToolTool = PrivateToolHandle('ConcreteTool/ConcreteTool')
+YourTopAlg.Tool2     INFO Retrieved TheToolToolArray = PrivateToolHandleArray(['ConcreteTool/CxxDefaultTool'])
+YourTopAlg           INFO Retrieved PrivateToolList = PrivateToolHandleArray(['ConcreteTool/Tool1','ToolUsingTool/Tool2','ToolSpace::TemplatedTool<double>/Tool3'])
+YourTopAlg           INFO Retrieved PublicToolList = PublicToolHandleArray(['ConcreteTool/Tool4','ToolUsingTool/Tool5','ToolSpace::TemplatedTool<double>/Tool6'])
+YourTopAlg           INFO Retrieved TheSvc = ServiceHandle('ConcreteSvc')
+YourTopAlg           INFO Empty private tool is empty (OK)
+YourTopAlg           INFO Empty public tool is empty (OK)
+HistogramPersis...   INFO  'CnvServices':[ 'HbookHistSvc' , 'RootHistSvc' ]
+HistogramPersis...WARNING Histograms saving not required.
+AthenaEventLoopMgrWARNING Histograms saving not required.
+ApplicationMgr       INFO Application Manager Initialized successfully
+AthenaEventLoopMgr   INFO   ===>>>  start of run 0    <<<===
+AthenaEventLoopMgr   INFO   ===>>>  start processing event #1, run #0 0 events processed so far  <<<===
+MyTopAlg             INFO got this quote [Your day will be somewhat dictated by authority].
+MyTopAlg             INFO doing my work ...
+RndmGenSvc.Engine    INFO Generator engine type:CLHEP::RanluxEngine
+RndmGenSvc.Engine    INFO Current Seed:1234567 Luxury:3
+RndmGenSvc           INFO Using Random engine:HepRndm::Engine<CLHEP::RanluxEngine>
+MyTopAlg.Custom...   INFO performing task using tool (factor: 14) ...
+ToolSvc.PublicC...   INFO performing concrete task (factor: 1) ...
+ToolSvc.PublicC...   INFO ... concrete task is done
+MyTopAlg.Custom...   INFO performing concrete task (factor: 1) ...
+MyTopAlg.Custom...   INFO ... concrete task is done
+MyTopAlg.Custom...   INFO ... task using tool is done
+MyTopAlg.Custom...   INFO performing concrete task (factor: 1) ...
+MyTopAlg.Custom...   INFO ... concrete task is done
+MyTopAlg.Tool1       INFO performing concrete task (factor: 1) ...
+MyTopAlg.Tool1       INFO ... concrete task is done
+MyTopAlg.Tool2       INFO performing task using tool (factor: 1) ...
+ToolSvc.PublicC...   INFO performing concrete task (factor: 1) ...
+ToolSvc.PublicC...   INFO ... concrete task is done
+MyTopAlg.Tool2....   INFO performing concrete task (factor: 1) ...
+MyTopAlg.Tool2....   INFO ... concrete task is done
+MyTopAlg.Tool2       INFO ... task using tool is done
+MyTopAlg.Tool2....   INFO performing concrete task (factor: 1) ...
+MyTopAlg.Tool2....   INFO ... concrete task is done
+MyTopAlg.Tool3       INFO performing templated task factor ( 1) ...
+MyTopAlg.Tool3       INFO ... templated task is done
+ToolSvc.Tool4        INFO performing concrete task (factor: 1) ...
+ToolSvc.Tool4        INFO ... concrete task is done
+ToolSvc.Tool5        INFO performing task using tool (factor: 1) ...
+ToolSvc.PublicC...   INFO performing concrete task (factor: 1) ...
+ToolSvc.PublicC...   INFO ... concrete task is done
+ToolSvc.Tool5.C...   INFO performing concrete task (factor: 1) ...
+ToolSvc.Tool5.C...   INFO ... concrete task is done
+ToolSvc.Tool5        INFO ... task using tool is done
+ToolSvc.Tool5.C...   INFO performing concrete task (factor: 1) ...
+ToolSvc.Tool5.C...   INFO ... concrete task is done
+ToolSvc.Tool6        INFO performing templated task factor ( 1) ...
+ToolSvc.Tool6        INFO ... templated task is done
+MyTopAlg             INFO ... my work is done! 
+YourTopAlg           INFO got this quote [Your day will be somewhat dictated by authority].
+YourTopAlg           INFO doing my work ...
+YourTopAlg.Cust...   INFO performing task using tool (factor: 18) ...
+ToolSvc.PublicC...   INFO performing concrete task (factor: 1) ...
+ToolSvc.PublicC...   INFO ... concrete task is done
+YourTopAlg.Cust...   INFO performing concrete task (factor: 1) ...
+YourTopAlg.Cust...   INFO ... concrete task is done
+YourTopAlg.Cust...   INFO ... task using tool is done
+YourTopAlg.Cust...   INFO performing concrete task (factor: 1) ...
+YourTopAlg.Cust...   INFO ... concrete task is done
+YourTopAlg.Tool1     INFO performing concrete task (factor: 1) ...
+YourTopAlg.Tool1     INFO ... concrete task is done
+YourTopAlg.Tool2     INFO performing task using tool (factor: 1) ...
+ToolSvc.PublicC...   INFO performing concrete task (factor: 1) ...
+ToolSvc.PublicC...   INFO ... concrete task is done
+YourTopAlg.Tool...   INFO performing concrete task (factor: 1) ...
+YourTopAlg.Tool...   INFO ... concrete task is done
+YourTopAlg.Tool2     INFO ... task using tool is done
+YourTopAlg.Tool...   INFO performing concrete task (factor: 1) ...
+YourTopAlg.Tool...   INFO ... concrete task is done
+YourTopAlg.Tool3     INFO performing templated task factor ( 1) ...
+YourTopAlg.Tool3     INFO ... templated task is done
+ToolSvc.Tool4        INFO performing concrete task (factor: 1) ...
+ToolSvc.Tool4        INFO ... concrete task is done
+ToolSvc.Tool5        INFO performing task using tool (factor: 1) ...
+ToolSvc.PublicC...   INFO performing concrete task (factor: 1) ...
+ToolSvc.PublicC...   INFO ... concrete task is done
+ToolSvc.Tool5.C...   INFO performing concrete task (factor: 1) ...
+ToolSvc.Tool5.C...   INFO ... concrete task is done
+ToolSvc.Tool5        INFO ... task using tool is done
+ToolSvc.Tool5.C...   INFO performing concrete task (factor: 1) ...
+ToolSvc.Tool5.C...   INFO ... concrete task is done
+ToolSvc.Tool6        INFO performing templated task factor ( 1) ...
+ToolSvc.Tool6        INFO ... templated task is done
+YourTopAlg           INFO ... my work is done! 
+AthenaEventLoopMgr   INFO   ===>>>  done processing event #1, run #0 1 events processed so far  <<<===
+AthenaEventLoopMgr   INFO   ===>>>  start processing event #2, run #0 1 events processed so far  <<<===
+MyTopAlg             INFO got this quote [Your day will be somewhat dictated by authority].
+MyTopAlg             INFO doing my work ...
+MyTopAlg.Custom...   INFO performing task using tool (factor: 14) ...
+ToolSvc.PublicC...   INFO performing concrete task (factor: 1) ...
+ToolSvc.PublicC...   INFO ... concrete task is done
+MyTopAlg.Custom...   INFO performing concrete task (factor: 1) ...
+MyTopAlg.Custom...   INFO ... concrete task is done
+MyTopAlg.Custom...   INFO ... task using tool is done
+MyTopAlg.Custom...   INFO performing concrete task (factor: 1) ...
+MyTopAlg.Custom...   INFO ... concrete task is done
+MyTopAlg.Tool1       INFO performing concrete task (factor: 1) ...
+MyTopAlg.Tool1       INFO ... concrete task is done
+MyTopAlg.Tool2       INFO performing task using tool (factor: 1) ...
+ToolSvc.PublicC...   INFO performing concrete task (factor: 1) ...
+ToolSvc.PublicC...   INFO ... concrete task is done
+MyTopAlg.Tool2....   INFO performing concrete task (factor: 1) ...
+MyTopAlg.Tool2....   INFO ... concrete task is done
+MyTopAlg.Tool2       INFO ... task using tool is done
+MyTopAlg.Tool2....   INFO performing concrete task (factor: 1) ...
+MyTopAlg.Tool2....   INFO ... concrete task is done
+MyTopAlg.Tool3       INFO performing templated task factor ( 1) ...
+MyTopAlg.Tool3       INFO ... templated task is done
+ToolSvc.Tool4        INFO performing concrete task (factor: 1) ...
+ToolSvc.Tool4        INFO ... concrete task is done
+ToolSvc.Tool5        INFO performing task using tool (factor: 1) ...
+ToolSvc.PublicC...   INFO performing concrete task (factor: 1) ...
+ToolSvc.PublicC...   INFO ... concrete task is done
+ToolSvc.Tool5.C...   INFO performing concrete task (factor: 1) ...
+ToolSvc.Tool5.C...   INFO ... concrete task is done
+ToolSvc.Tool5        INFO ... task using tool is done
+ToolSvc.Tool5.C...   INFO performing concrete task (factor: 1) ...
+ToolSvc.Tool5.C...   INFO ... concrete task is done
+ToolSvc.Tool6        INFO performing templated task factor ( 1) ...
+ToolSvc.Tool6        INFO ... templated task is done
+MyTopAlg             INFO ... my work is done! 
+YourTopAlg           INFO got this quote [Your day will be somewhat dictated by authority].
+YourTopAlg           INFO doing my work ...
+YourTopAlg.Cust...   INFO performing task using tool (factor: 18) ...
+ToolSvc.PublicC...   INFO performing concrete task (factor: 1) ...
+ToolSvc.PublicC...   INFO ... concrete task is done
+YourTopAlg.Cust...   INFO performing concrete task (factor: 1) ...
+YourTopAlg.Cust...   INFO ... concrete task is done
+YourTopAlg.Cust...   INFO ... task using tool is done
+YourTopAlg.Cust...   INFO performing concrete task (factor: 1) ...
+YourTopAlg.Cust...   INFO ... concrete task is done
+YourTopAlg.Tool1     INFO performing concrete task (factor: 1) ...
+YourTopAlg.Tool1     INFO ... concrete task is done
+YourTopAlg.Tool2     INFO performing task using tool (factor: 1) ...
+ToolSvc.PublicC...   INFO performing concrete task (factor: 1) ...
+ToolSvc.PublicC...   INFO ... concrete task is done
+YourTopAlg.Tool...   INFO performing concrete task (factor: 1) ...
+YourTopAlg.Tool...   INFO ... concrete task is done
+YourTopAlg.Tool2     INFO ... task using tool is done
+YourTopAlg.Tool...   INFO performing concrete task (factor: 1) ...
+YourTopAlg.Tool...   INFO ... concrete task is done
+YourTopAlg.Tool3     INFO performing templated task factor ( 1) ...
+YourTopAlg.Tool3     INFO ... templated task is done
+ToolSvc.Tool4        INFO performing concrete task (factor: 1) ...
+ToolSvc.Tool4        INFO ... concrete task is done
+ToolSvc.Tool5        INFO performing task using tool (factor: 1) ...
+ToolSvc.PublicC...   INFO performing concrete task (factor: 1) ...
+ToolSvc.PublicC...   INFO ... concrete task is done
+ToolSvc.Tool5.C...   INFO performing concrete task (factor: 1) ...
+ToolSvc.Tool5.C...   INFO ... concrete task is done
+ToolSvc.Tool5        INFO ... task using tool is done
+ToolSvc.Tool5.C...   INFO performing concrete task (factor: 1) ...
+ToolSvc.Tool5.C...   INFO ... concrete task is done
+ToolSvc.Tool6        INFO performing templated task factor ( 1) ...
+ToolSvc.Tool6        INFO ... templated task is done
+YourTopAlg           INFO ... my work is done! 
+AthenaEventLoopMgr   INFO   ===>>>  done processing event #2, run #0 2 events processed so far  <<<===
+ConcreteSvc          INFO Finalizing ConcreteSvc...
+HistorySvc           INFO Service finalised successfully
+ToolSvc.finalize()   INFO Removing all tools created by ToolSvc
+StatusCodeSvc        INFO initialize
+ApplicationMgr       INFO Application Manager Finalized successfully
+ApplicationMgr       INFO Application Manager Terminated successfully
+Py:Athena            INFO leaving with code 0: "successful run"
diff --git a/Control/AthenaExamples/AthExJobOptions/share/JobOptionsCustomTopAlg.ref b/Control/AthenaExamples/AthExJobOptions/share/JobOptionsCustomTopAlg.ref
new file mode 100755
index 0000000000000000000000000000000000000000..5bb8e6e61282fa7fed4f5c3a262ca6f264ae1445
--- /dev/null
+++ b/Control/AthenaExamples/AthExJobOptions/share/JobOptionsCustomTopAlg.ref
@@ -0,0 +1,181 @@
+Py:ConfigurableDb    INFO Read module info for 3384 configurables from 10 genConfDb files
+Py:ConfigurableDb    INFO No duplicates have been found: that's good !
+Py:Athena            INFO including file "AthenaCommon/Bootstrap.py"
+Py:Athena            INFO including file "AthenaCommon/Atlas.UnixStandardJob.py"
+Py:Athena            INFO including file "AthExJobOptions/AthExJobOptions_CustomTopAlgorithmJobOptions.py"
+/***** AlgSequence /TopAlg *************************************************************************
+|-<no properties>
+|=/***** Algorithm TopAlgorithm/MyCustomAlg **********************************************************
+| |-AuditAlgorithms   = False
+| |-AuditBeginRun     = False
+| |-AuditEndRun       = False
+| |-AuditExecute      = False
+| |-AuditFinalize     = False
+| |-AuditInitialize   = False
+| |-AuditReinitialize = False
+| |-EmptyPrivateTool  = PrivateToolHandle('')
+| |-EmptyPublicTool   = PublicToolHandle('')
+| |-Enable            = True
+| |-ErrorCount        = 0
+| |-ErrorMax          = 1
+| |-InputKey          = ''
+| |-MonitorService    = 'MonitorSvc'
+| |-OutputKey         = 'outkey'
+| |-OutputLevel       = 0
+| |-PrivateToolList   = PrivateToolHandleArray(['ConcreteTool/Tool1','ToolUsingTool/Tool2','ToolSpace::TemplatedTool<double>/Tool3'])
+| |-PublicToolList    = PublicToolHandleArray(['ConcreteTool/Tool4','ToolUsingTool/Tool5','ToolSpace::TemplatedTool<double>/Tool6'])
+| |-RndmFactor        = 33  (default: 42.0)
+| |-ThePublicTool     = PublicToolHandle('ConcreteTool')
+| |-TheSvc            = ServiceHandle('ConcreteSvc')
+| |-TheTool           = PrivateToolHandle('ConcreteTool/ConcreteTool')
+| |=/***** Private AlgTool ConcreteTool/ConcreteTool ***************************************************
+| | |-AuditFinalize   = False
+| | |-AuditInitialize = False
+| | |-AuditTools      = False
+| | |-Factor          = 1.0
+| | |-MonitorService  = 'MonitorSvc'
+| | |-OutputLevel     = 7
+| | \----- (End of Private AlgTool ConcreteTool/ConcreteTool) ------------------------------------------
+| |=/***** Private AlgTool ConcreteTool/Tool1 **********************************************************
+| | |-AuditFinalize   = False
+| | |-AuditInitialize = False
+| | |-AuditTools      = False
+| | |-Factor          = 1.0
+| | |-MonitorService  = 'MonitorSvc'
+| | |-OutputLevel     = 7
+| | \----- (End of Private AlgTool ConcreteTool/Tool1) -------------------------------------------------
+| |=/***** Private AlgTool ToolUsingTool/Tool2 *********************************************************
+| | |-AuditFinalize    = False
+| | |-AuditInitialize  = False
+| | |-AuditTools       = False
+| | |-Factor           = 1.0
+| | |-MonitorService   = 'MonitorSvc'
+| | |-OutputLevel      = 7
+| | |-TheToolPubTool   = PublicToolHandle('ConcreteTool/PublicConcreteTool')
+| | |-TheToolTool      = PrivateToolHandle('ConcreteTool/ConcreteTool')  (default: 'ConcreteTool')
+| | |-TheToolToolArray = PrivateToolHandleArray(['ConcreteTool/CxxDefaultTool'])
+| | |=/***** Private AlgTool ConcreteTool/ConcreteTool ***************************************************
+| | | |-AuditFinalize   = False
+| | | |-AuditInitialize = False
+| | | |-AuditTools      = False
+| | | |-Factor          = 1.0
+| | | |-MonitorService  = 'MonitorSvc'
+| | | |-OutputLevel     = 7
+| | | \----- (End of Private AlgTool ConcreteTool/ConcreteTool) ------------------------------------------
+| | |=/***** Private AlgTool ConcreteTool/CxxDefaultTool *************************************************
+| | | |-AuditFinalize   = False
+| | | |-AuditInitialize = False
+| | | |-AuditTools      = False
+| | | |-Factor          = 1.0
+| | | |-MonitorService  = 'MonitorSvc'
+| | | |-OutputLevel     = 7
+| | | \----- (End of Private AlgTool ConcreteTool/CxxDefaultTool) ----------------------------------------
+| | \----- (End of Private AlgTool ToolUsingTool/Tool2) ------------------------------------------------
+| |=/***** Private AlgTool ToolSpace::TemplatedTool<double>/Tool3 **************************************
+| | |-AuditFinalize   = False
+| | |-AuditInitialize = False
+| | |-AuditTools      = False
+| | |-Factor          = 1.0
+| | |-MonitorService  = 'MonitorSvc'
+| | |-OutputLevel     = 7
+| | \----- (End of Private AlgTool ToolSpace::TemplatedTool<double>/Tool3) -----------------------------
+| \----- (End of Algorithm TopAlgorithm/MyCustomAlg) -------------------------------------------------
+\----- (End of AlgSequence /TopAlg) ----------------------------------------------------------------
+Py:Athena            INFO including file "AthenaCommon/runbatch.py"
+ApplicationMgr       INFO Updating ROOT::Reflex::PluginService::SetDebug(level) to level=0
+ApplicationMgr       INFO Successfully loaded modules : AthenaServices
+ApplicationMgr       INFO Application Manager Configured successfully
+ApplicationMgr       INFO Updating ROOT::Reflex::PluginService::SetDebug(level) to level=0
+StatusCodeSvc        INFO initialize
+MyCustomAlg          INFO Retrieved TheTool = PrivateToolHandle('ConcreteTool/ConcreteTool')
+MyCustomAlg.Tool2    INFO Retrieved TheToolPubTool = PublicToolHandle('ConcreteTool/PublicConcreteTool')
+MyCustomAlg.Tool2    INFO Retrieved TheToolTool = PrivateToolHandle('ConcreteTool/ConcreteTool')
+MyCustomAlg.Tool2    INFO Retrieved TheToolToolArray = PrivateToolHandleArray(['ConcreteTool/CxxDefaultTool'])
+MyCustomAlg          INFO Retrieved PrivateToolList = PrivateToolHandleArray(['ConcreteTool/Tool1','ToolUsingTool/Tool2','ToolSpace::TemplatedTool<double>/Tool3'])
+ToolSvc.Tool5        INFO Retrieved TheToolPubTool = PublicToolHandle('ConcreteTool/PublicConcreteTool')
+ToolSvc.Tool5        INFO Retrieved TheToolTool = PrivateToolHandle('ConcreteTool')
+ToolSvc.Tool5        INFO Retrieved TheToolToolArray = PrivateToolHandleArray(['ConcreteTool/CxxDefaultTool'])
+MyCustomAlg          INFO Retrieved PublicToolList = PublicToolHandleArray(['ConcreteTool/Tool4','ToolUsingTool/Tool5','ToolSpace::TemplatedTool<double>/Tool6'])
+EventPersistenc...   INFO  'CnvServices':[  ]
+ConcreteSvc          INFO Initializing ConcreteSvc...
+ConcreteSvc          INFO Quote of the day: [Your day will be somewhat dictated by authority]
+MyCustomAlg          INFO Retrieved TheSvc = ServiceHandle('ConcreteSvc')
+MyCustomAlg          INFO Empty private tool is empty (OK)
+MyCustomAlg          INFO Empty public tool is empty (OK)
+HistogramPersis...   INFO  'CnvServices':[ 'HbookHistSvc' , 'RootHistSvc' ]
+HistogramPersis...WARNING Histograms saving not required.
+AthenaEventLoopMgrWARNING Histograms saving not required.
+ApplicationMgr       INFO Application Manager Initialized successfully
+AthenaEventLoopMgr   INFO   ===>>>  start of run 0    <<<===
+AthenaEventLoopMgr   INFO   ===>>>  start processing event #1, run #0 0 events processed so far  <<<===
+MyCustomAlg          INFO got this quote [Your day will be somewhat dictated by authority].
+MyCustomAlg          INFO doing my work ...
+RndmGenSvc.Engine    INFO Generator engine type:CLHEP::RanluxEngine
+RndmGenSvc.Engine    INFO Current Seed:1234567 Luxury:3
+RndmGenSvc           INFO Using Random engine:HepRndm::Engine<CLHEP::RanluxEngine>
+MyCustomAlg.Con...   INFO performing concrete task (factor: 1) ...
+MyCustomAlg.Con...   INFO ... concrete task is done
+MyCustomAlg.Tool1    INFO performing concrete task (factor: 1) ...
+MyCustomAlg.Tool1    INFO ... concrete task is done
+MyCustomAlg.Tool2    INFO performing task using tool (factor: 1) ...
+ToolSvc.PublicC...   INFO performing concrete task (factor: 1) ...
+ToolSvc.PublicC...   INFO ... concrete task is done
+MyCustomAlg.Too...   INFO performing concrete task (factor: 1) ...
+MyCustomAlg.Too...   INFO ... concrete task is done
+MyCustomAlg.Tool2    INFO ... task using tool is done
+MyCustomAlg.Too...   INFO performing concrete task (factor: 1) ...
+MyCustomAlg.Too...   INFO ... concrete task is done
+MyCustomAlg.Tool3    INFO performing templated task factor ( 1) ...
+MyCustomAlg.Tool3    INFO ... templated task is done
+ToolSvc.Tool4        INFO performing concrete task (factor: 1) ...
+ToolSvc.Tool4        INFO ... concrete task is done
+ToolSvc.Tool5        INFO performing task using tool (factor: 1) ...
+ToolSvc.PublicC...   INFO performing concrete task (factor: 1) ...
+ToolSvc.PublicC...   INFO ... concrete task is done
+ToolSvc.Tool5.C...   INFO performing concrete task (factor: 1) ...
+ToolSvc.Tool5.C...   INFO ... concrete task is done
+ToolSvc.Tool5        INFO ... task using tool is done
+ToolSvc.Tool5.C...   INFO performing concrete task (factor: 1) ...
+ToolSvc.Tool5.C...   INFO ... concrete task is done
+ToolSvc.Tool6        INFO performing templated task factor ( 1) ...
+ToolSvc.Tool6        INFO ... templated task is done
+MyCustomAlg          INFO ... my work is done! 
+AthenaEventLoopMgr   INFO   ===>>>  done processing event #1, run #0 1 events processed so far  <<<===
+AthenaEventLoopMgr   INFO   ===>>>  start processing event #2, run #0 1 events processed so far  <<<===
+MyCustomAlg          INFO got this quote [Your day will be somewhat dictated by authority].
+MyCustomAlg          INFO doing my work ...
+MyCustomAlg.Con...   INFO performing concrete task (factor: 1) ...
+MyCustomAlg.Con...   INFO ... concrete task is done
+MyCustomAlg.Tool1    INFO performing concrete task (factor: 1) ...
+MyCustomAlg.Tool1    INFO ... concrete task is done
+MyCustomAlg.Tool2    INFO performing task using tool (factor: 1) ...
+ToolSvc.PublicC...   INFO performing concrete task (factor: 1) ...
+ToolSvc.PublicC...   INFO ... concrete task is done
+MyCustomAlg.Too...   INFO performing concrete task (factor: 1) ...
+MyCustomAlg.Too...   INFO ... concrete task is done
+MyCustomAlg.Tool2    INFO ... task using tool is done
+MyCustomAlg.Too...   INFO performing concrete task (factor: 1) ...
+MyCustomAlg.Too...   INFO ... concrete task is done
+MyCustomAlg.Tool3    INFO performing templated task factor ( 1) ...
+MyCustomAlg.Tool3    INFO ... templated task is done
+ToolSvc.Tool4        INFO performing concrete task (factor: 1) ...
+ToolSvc.Tool4        INFO ... concrete task is done
+ToolSvc.Tool5        INFO performing task using tool (factor: 1) ...
+ToolSvc.PublicC...   INFO performing concrete task (factor: 1) ...
+ToolSvc.PublicC...   INFO ... concrete task is done
+ToolSvc.Tool5.C...   INFO performing concrete task (factor: 1) ...
+ToolSvc.Tool5.C...   INFO ... concrete task is done
+ToolSvc.Tool5        INFO ... task using tool is done
+ToolSvc.Tool5.C...   INFO performing concrete task (factor: 1) ...
+ToolSvc.Tool5.C...   INFO ... concrete task is done
+ToolSvc.Tool6        INFO performing templated task factor ( 1) ...
+ToolSvc.Tool6        INFO ... templated task is done
+MyCustomAlg          INFO ... my work is done! 
+AthenaEventLoopMgr   INFO   ===>>>  done processing event #2, run #0 2 events processed so far  <<<===
+ConcreteSvc          INFO Finalizing ConcreteSvc...
+HistorySvc           INFO Service finalised successfully
+ToolSvc.finalize()   INFO Removing all tools created by ToolSvc
+StatusCodeSvc        INFO initialize
+ApplicationMgr       INFO Application Manager Finalized successfully
+ApplicationMgr       INFO Application Manager Terminated successfully
+Py:Athena            INFO leaving with code 0: "successful run"
diff --git a/Control/AthenaExamples/AthExJobOptions/src/AnotherConcreteSvc.cxx b/Control/AthenaExamples/AthExJobOptions/src/AnotherConcreteSvc.cxx
new file mode 100644
index 0000000000000000000000000000000000000000..b886ef35ec75fe799b8e1297767b0c0407497cff
--- /dev/null
+++ b/Control/AthenaExamples/AthExJobOptions/src/AnotherConcreteSvc.cxx
@@ -0,0 +1,92 @@
+///////////////////////// -*- C++ -*- /////////////////////////////
+
+/*
+  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+*/
+
+// AnotherConcreteSvc.cxx 
+// Implementation file for class AnotherConcreteSvc
+// Author: S.Binet<binet@cern.ch>
+/////////////////////////////////////////////////////////////////// 
+
+// STL includes
+
+// FrameWork includes
+#include "GaudiKernel/Property.h"
+#include "GaudiKernel/SvcFactory.h"
+
+// AthExJobOptions includes
+#include "AthExJobOptions/AnotherConcreteSvc.h"
+
+/////////////////////////////////////////////////////////////////// 
+// Public methods: 
+/////////////////////////////////////////////////////////////////// 
+
+// Constructors
+////////////////
+AnotherConcreteSvc::AnotherConcreteSvc( const std::string& name, ISvcLocator* pSvcLocator ) : 
+  AthService ( name, pSvcLocator )
+{
+  //
+  // Property declaration
+  // 
+  //declareProperty( "Property", m_nProperty, "descr" );
+
+  declareProperty( "Qotd",
+		   m_qotd = "Quote is not available for today!",
+		   "Very important message the service has to advertise" );
+}
+
+// Destructor
+///////////////
+AnotherConcreteSvc::~AnotherConcreteSvc()
+{}
+
+// Athena service's Hooks
+////////////////////////////
+StatusCode
+AnotherConcreteSvc::initialize()
+{
+  ATH_MSG_INFO ("Initializing " << name() << "...");
+
+  ATH_MSG_INFO ("Quote of the day: [" << m_qotd.value() << "]");
+  return StatusCode::SUCCESS;
+}
+
+StatusCode AnotherConcreteSvc::finalize()
+{
+  ATH_MSG_INFO ("Finalizing " << name() << "...");
+  return StatusCode::SUCCESS;
+}
+
+// Query the interfaces.
+//   Input: riid, Requested interface ID
+//          ppvInterface, Pointer to requested interface
+//   Return: StatusCode indicating SUCCESS or FAILURE.
+// N.B. Don't forget to release the interface after use!!!
+StatusCode 
+AnotherConcreteSvc::queryInterface(const InterfaceID& riid, void** ppvInterface) 
+{
+  if ( IVirtualSvc::interfaceID().versionMatch(riid) ) {
+    *ppvInterface = dynamic_cast<IVirtualSvc*>(this);
+  } else {
+    // Interface is not directly available : try out a base class
+    return AthService::queryInterface(riid, ppvInterface);
+  }
+  addRef();
+  return StatusCode::SUCCESS;
+}
+
+/////////////////////////////////////////////////////////////////// 
+// Const methods: 
+///////////////////////////////////////////////////////////////////
+
+/////////////////////////////////////////////////////////////////// 
+// Non-const methods: 
+/////////////////////////////////////////////////////////////////// 
+
+StatusCode AnotherConcreteSvc::qotd( std::string& quote )
+{
+  quote = m_qotd.value();
+  return StatusCode::SUCCESS;
+}
diff --git a/Control/AthenaExamples/AthExJobOptions/src/ConcreteSvc.cxx b/Control/AthenaExamples/AthExJobOptions/src/ConcreteSvc.cxx
new file mode 100755
index 0000000000000000000000000000000000000000..28d61cbd5a82fb8897bd2cef34e8f0b10b814b96
--- /dev/null
+++ b/Control/AthenaExamples/AthExJobOptions/src/ConcreteSvc.cxx
@@ -0,0 +1,90 @@
+///////////////////////// -*- C++ -*- /////////////////////////////
+
+/*
+  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+*/
+
+// ConcreteSvc.cxx 
+// Implementation file for class ConcreteSvc
+// Author: S.Binet<binet@cern.ch>
+/////////////////////////////////////////////////////////////////// 
+
+// STL includes
+
+// FrameWork includes
+#include "GaudiKernel/Property.h"
+#include "GaudiKernel/SvcFactory.h"
+
+// AthExJobOptions includes
+#include "AthExJobOptions/ConcreteSvc.h"
+
+/////////////////////////////////////////////////////////////////// 
+// Public methods: 
+/////////////////////////////////////////////////////////////////// 
+
+// Constructors
+////////////////
+ConcreteSvc::ConcreteSvc( const std::string& name, ISvcLocator* pSvcLocator ) : 
+  AthService ( name, pSvcLocator )
+{
+  //
+  // Property declaration
+  // 
+  //declareProperty( "Property", m_nProperty, "descr" );
+
+  declareProperty( "Qotd",
+		   m_qotd = "Your day will be somewhat dictated by authority",
+		   "Very important message the service has to advertise" );
+}
+
+// Destructor
+///////////////
+ConcreteSvc::~ConcreteSvc()
+{}
+
+// Athena Algorithm's Hooks
+////////////////////////////
+StatusCode ConcreteSvc::initialize()
+{
+  ATH_MSG_INFO ("Initializing " << name() << "...");
+  ATH_MSG_INFO ("Quote of the day: [" << m_qotd.value() << "]");
+  return StatusCode::SUCCESS;
+}
+
+StatusCode ConcreteSvc::finalize()
+{
+  ATH_MSG_INFO ("Finalizing " << name() << "...");
+  return StatusCode::SUCCESS;
+}
+
+// Query the interfaces.
+//   Input: riid, Requested interface ID
+//          ppvInterface, Pointer to requested interface
+//   Return: StatusCode indicating SUCCESS or FAILURE.
+// N.B. Don't forget to release the interface after use!!!
+StatusCode 
+ConcreteSvc::queryInterface(const InterfaceID& riid, void** ppvInterface) 
+{
+  if ( IVirtualSvc::interfaceID().versionMatch(riid) ) {
+    *ppvInterface = dynamic_cast<IVirtualSvc*>(this);
+  } else {
+    // Interface is not directly available : try out a base class
+    return AthService::queryInterface(riid, ppvInterface);
+  }
+  addRef();
+  return StatusCode::SUCCESS;
+}
+
+/////////////////////////////////////////////////////////////////// 
+// Const methods: 
+///////////////////////////////////////////////////////////////////
+
+/////////////////////////////////////////////////////////////////// 
+// Non-const methods: 
+/////////////////////////////////////////////////////////////////// 
+
+StatusCode ConcreteSvc::qotd( std::string& quote )
+{
+  quote = m_qotd.value();
+  return StatusCode::SUCCESS;
+}
diff --git a/Control/AthenaExamples/AthExJobOptions/src/ConcreteTool.cxx b/Control/AthenaExamples/AthExJobOptions/src/ConcreteTool.cxx
new file mode 100755
index 0000000000000000000000000000000000000000..a3a2c28b8aeddcfb6178eb97087e780756d0afd5
--- /dev/null
+++ b/Control/AthenaExamples/AthExJobOptions/src/ConcreteTool.cxx
@@ -0,0 +1,65 @@
+/*
+  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+*/
+
+#include "AthExJobOptions/ConcreteTool.h"
+
+
+/////////////////////////////////////////////////////////////////////////////
+
+ConcreteTool::ConcreteTool( const std::string& type, const std::string& name,
+		      const IInterface* parent ) 
+   : AthAlgTool( type, name, parent )
+{
+
+// declare any properties here
+
+   declareProperty( "Factor", m_factor = 1., "multiplicative factor to perform task" );
+
+}
+
+//___________________________________________________________________________
+StatusCode ConcreteTool::queryInterface( const InterfaceID& riid, void** ppvIf )
+{
+   if ( riid == IVirtualTool::interfaceID() )  {
+      *ppvIf = (IVirtualTool*)this;
+      addRef();
+      return StatusCode::SUCCESS;
+   }
+
+   return AthAlgTool::queryInterface( riid, ppvIf );
+}
+
+//___________________________________________________________________________
+StatusCode ConcreteTool::initialize()
+{
+
+// perform necessary one-off initialization
+
+   return StatusCode::SUCCESS;
+}
+
+//___________________________________________________________________________
+StatusCode ConcreteTool::finalize()
+{
+
+// perform work done at shutdown
+
+   return StatusCode::SUCCESS;
+}
+
+//___________________________________________________________________________
+StatusCode ConcreteTool::performTask( double& result )
+{
+
+// do what needs to be done
+   ATH_MSG_INFO ("performing concrete task (factor: " << m_factor << ") ...");
+
+   result = result * 123.;
+
+   msg(MSG::INFO) << "... concrete task is done";
+   if ( msgLvl(MSG::DEBUG) ) { msg() << ", result: " << result; }
+   msg(MSG::INFO) << endreq;
+
+   return StatusCode::SUCCESS;
+}
diff --git a/Control/AthenaExamples/AthExJobOptions/src/ExampleEvtLoopPreSelectTool.cxx b/Control/AthenaExamples/AthExJobOptions/src/ExampleEvtLoopPreSelectTool.cxx
new file mode 100755
index 0000000000000000000000000000000000000000..336daba66c7ad1629303f61d900f1173069a2a73
--- /dev/null
+++ b/Control/AthenaExamples/AthExJobOptions/src/ExampleEvtLoopPreSelectTool.cxx
@@ -0,0 +1,64 @@
+/*
+  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+*/
+
+#include "AthExJobOptions/ExampleEvtLoopPreSelectTool.h"
+#include "EventInfo/EventInfo.h"
+#include "EventInfo/EventID.h"
+#include "EventInfo/EventType.h"
+
+
+/////////////////////////////////////////////////////////////////////////////
+
+ExampleEvtLoopPreSelectTool::ExampleEvtLoopPreSelectTool( const std::string& type, const std::string& name,
+		      const IInterface* parent ) 
+   : AthAlgTool( type, name, parent )
+{
+
+// declare any properties here
+   declareInterface<IAthenaEvtLoopPreSelectTool>( this );
+   declareProperty( "PassIfMod", m_prescale = 2, "Keep 1 event in n" );
+
+}
+
+//___________________________________________________________________________
+StatusCode ExampleEvtLoopPreSelectTool::queryInterface( const InterfaceID& riid, void** ppvIf )
+{
+   if ( riid == IAthenaEvtLoopPreSelectTool::interfaceID() )  {
+      *ppvIf = (IAthenaEvtLoopPreSelectTool*)this;
+      addRef();
+      return StatusCode::SUCCESS;
+   }
+
+   return AthAlgTool::queryInterface( riid, ppvIf );
+}
+
+//___________________________________________________________________________
+StatusCode ExampleEvtLoopPreSelectTool::initialize()
+{
+
+// perform necessary one-off initialization
+
+   return StatusCode::SUCCESS;
+}
+
+//___________________________________________________________________________
+StatusCode ExampleEvtLoopPreSelectTool::finalize()
+{
+
+// perform work done at shutdown
+
+   return StatusCode::SUCCESS;
+}
+
+//__________________________________________________________________
+bool  ExampleEvtLoopPreSelectTool::passEvent(const EventInfo* pEvent)
+{
+
+// do what needs to be done
+   ATH_MSG_DEBUG ("Entering PassEvent ");
+
+
+   EventID::number_type evtNumber = pEvent->event_ID()->event_number();
+   return (0 == (evtNumber % m_prescale));
+ }
diff --git a/Control/AthenaExamples/AthExJobOptions/src/IVirtualSvc.cxx b/Control/AthenaExamples/AthExJobOptions/src/IVirtualSvc.cxx
new file mode 100755
index 0000000000000000000000000000000000000000..7ea3f0abfcdb1fc0c2c93d2995fffacf3552f671
--- /dev/null
+++ b/Control/AthenaExamples/AthExJobOptions/src/IVirtualSvc.cxx
@@ -0,0 +1,46 @@
+///////////////////////// -*- C++ -*- /////////////////////////////
+
+/*
+  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+*/
+
+// IVirtualSvc.cxx 
+// Implementation file for class IVirtualSvc
+// Author: S.Binet<binet@cern.ch>
+/////////////////////////////////////////////////////////////////// 
+
+// AthExJobOptions includes
+#include "AthExJobOptions/IVirtualSvc.h"
+
+/////////////////////////////////////////////////////////////////// 
+// Public methods: 
+/////////////////////////////////////////////////////////////////// 
+
+// Constructors
+////////////////
+
+// Destructor
+///////////////
+IVirtualSvc::~IVirtualSvc()
+{}
+
+/////////////////////////////////////////////////////////////////// 
+// Const methods: 
+///////////////////////////////////////////////////////////////////
+
+/////////////////////////////////////////////////////////////////// 
+// Non-const methods: 
+/////////////////////////////////////////////////////////////////// 
+
+/////////////////////////////////////////////////////////////////// 
+// Protected methods: 
+/////////////////////////////////////////////////////////////////// 
+
+/////////////////////////////////////////////////////////////////// 
+// Const methods: 
+///////////////////////////////////////////////////////////////////
+
+/////////////////////////////////////////////////////////////////// 
+// Non-const methods: 
+/////////////////////////////////////////////////////////////////// 
+
diff --git a/Control/AthenaExamples/AthExJobOptions/src/IVirtualTool.cxx b/Control/AthenaExamples/AthExJobOptions/src/IVirtualTool.cxx
new file mode 100755
index 0000000000000000000000000000000000000000..78bbe07fdf8a68df10ec13dacef2605250ebe633
--- /dev/null
+++ b/Control/AthenaExamples/AthExJobOptions/src/IVirtualTool.cxx
@@ -0,0 +1,14 @@
+/*
+  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+*/
+
+#include "AthExJobOptions/IVirtualTool.h"
+
+
+/////////////////////////////////////////////////////////////////////////////
+
+static const InterfaceID IVirtualToolID_( "IVirtualTool", 1, 0 );
+
+const InterfaceID& IVirtualTool::interfaceID() { 
+   return IVirtualToolID_;
+}
diff --git a/Control/AthenaExamples/AthExJobOptions/src/KeyMixin.cxx b/Control/AthenaExamples/AthExJobOptions/src/KeyMixin.cxx
new file mode 100755
index 0000000000000000000000000000000000000000..772e55c00095fc300cee295f2115ee6ceb8bfa0c
--- /dev/null
+++ b/Control/AthenaExamples/AthExJobOptions/src/KeyMixin.cxx
@@ -0,0 +1,19 @@
+/*
+  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+*/
+
+#include "AthExJobOptions/KeyMixin.h"
+
+#include "AthenaBaseComps/AthAlgorithm.h"
+
+
+/////////////////////////////////////////////////////////////////////////////
+
+KeyMixin::KeyMixin( AthAlgorithm* alg )
+{
+  
+// declare key properties for the algorithm
+
+   alg->declareProperty( "InputKey",  m_inputKey  = "",       "key to locate input data" );
+   alg->declareProperty( "OutputKey", m_outputKey = "outkey", "key for writing output data" );
+}
diff --git a/Control/AthenaExamples/AthExJobOptions/src/NoopAlgorithm.cxx b/Control/AthenaExamples/AthExJobOptions/src/NoopAlgorithm.cxx
new file mode 100755
index 0000000000000000000000000000000000000000..123f9add93c8ff425c5c59c4e46b2f49b5ed19a6
--- /dev/null
+++ b/Control/AthenaExamples/AthExJobOptions/src/NoopAlgorithm.cxx
@@ -0,0 +1,39 @@
+/*
+  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+*/
+
+#include "AthExJobOptions/NoopAlgorithm.h"
+
+
+/////////////////////////////////////////////////////////////////////////////
+
+NoopAlgorithm::NoopAlgorithm( const std::string& name, ISvcLocator* svcloc ) :
+  AthAlgorithm( name, svcloc )
+{
+   /* empty */
+}
+
+//___________________________________________________________________________
+StatusCode NoopAlgorithm::initialize()
+{
+   return StatusCode::SUCCESS;
+}
+
+//___________________________________________________________________________
+StatusCode NoopAlgorithm::reinitialize()
+{
+   return initialize();
+}
+
+//___________________________________________________________________________
+StatusCode NoopAlgorithm::execute()
+{
+   ATH_MSG_INFO ("performing no action");
+   return StatusCode::SUCCESS;
+}
+
+//___________________________________________________________________________
+StatusCode NoopAlgorithm::finalize()
+{
+   return StatusCode::SUCCESS;
+}
diff --git a/Control/AthenaExamples/AthExJobOptions/src/SubAlgorithm.cxx b/Control/AthenaExamples/AthExJobOptions/src/SubAlgorithm.cxx
new file mode 100755
index 0000000000000000000000000000000000000000..79745ef21b7ad022b22dbf0888d9d81134d11ba6
--- /dev/null
+++ b/Control/AthenaExamples/AthExJobOptions/src/SubAlgorithm.cxx
@@ -0,0 +1,70 @@
+/*
+  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+*/
+
+#include "AthExJobOptions/SubAlgorithm.h"
+
+
+/////////////////////////////////////////////////////////////////////////////
+
+SubAlgorithm::SubAlgorithm(const std::string& name, ISvcLocator* svcloc ) :
+  AthAlgorithm( name, svcloc )
+{
+  
+// declare any properties here
+
+}
+
+//___________________________________________________________________________
+StatusCode SubAlgorithm::initialize()
+{
+
+// perform necessary one-of initialization
+
+   return StatusCode::SUCCESS;
+}
+
+//___________________________________________________________________________
+StatusCode SubAlgorithm::reinitialize()
+{
+
+// perform necessary re-initialization
+
+   return StatusCode::SUCCESS;
+}
+
+//___________________________________________________________________________
+StatusCode SubAlgorithm::beginRun()
+{
+
+// perform work needed at start of every run
+
+   return StatusCode::SUCCESS;
+}
+
+//___________________________________________________________________________
+StatusCode SubAlgorithm::execute()
+{
+
+// perform work done every event
+
+   return StatusCode::SUCCESS;
+}
+
+//___________________________________________________________________________
+StatusCode SubAlgorithm::endRun()
+{
+
+// perform work done at end of every run
+
+   return StatusCode::SUCCESS;
+}
+
+//___________________________________________________________________________
+StatusCode SubAlgorithm::finalize()
+{
+
+// perform work done at shutdown
+
+   return StatusCode::SUCCESS;
+}
diff --git a/Control/AthenaExamples/AthExJobOptions/src/TemplatedTool.cxx b/Control/AthenaExamples/AthExJobOptions/src/TemplatedTool.cxx
new file mode 100755
index 0000000000000000000000000000000000000000..973401deb2a88f9f6e66c650086af18a80e7dda9
--- /dev/null
+++ b/Control/AthenaExamples/AthExJobOptions/src/TemplatedTool.cxx
@@ -0,0 +1,74 @@
+/*
+  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+*/
+
+#include "AthExJobOptions/TemplatedTool.h"
+
+
+/////////////////////////////////////////////////////////////////////////////
+
+template< class T >
+ToolSpace::TemplatedTool< T >::TemplatedTool( const std::string& type, const std::string& name,
+		      const IInterface* parent ) 
+   : AthAlgTool( type, name, parent )
+{
+
+// declare any properties here
+
+   declareProperty( "Factor", m_factor = 1., "multiplicative factor to perform task" );
+
+}
+
+//___________________________________________________________________________
+template< class T >
+StatusCode ToolSpace::TemplatedTool< T >::queryInterface( const InterfaceID& riid, void** ppvIf )
+{
+   if ( riid == IVirtualTool::interfaceID() )  {
+      *ppvIf = (IVirtualTool*)this;
+      addRef();
+      return StatusCode::SUCCESS;
+   }
+
+   return AthAlgTool::queryInterface( riid, ppvIf );
+}
+
+//___________________________________________________________________________
+template< class T>
+StatusCode ToolSpace::TemplatedTool< T >::initialize()
+{
+
+// perform necessary one-off initialization
+
+   return StatusCode::SUCCESS;
+}
+
+//___________________________________________________________________________
+template< class T >
+StatusCode ToolSpace::TemplatedTool< T >::finalize()
+{
+
+// perform work done at shutdown
+
+   return StatusCode::SUCCESS;
+}
+
+//___________________________________________________________________________
+template< class T >
+StatusCode ToolSpace::TemplatedTool< T >::performTask( double& result )
+{
+
+// do what needs to be done
+   ATH_MSG_INFO ("performing templated task factor ( " << m_factor << ") ...");
+
+   result = result * 789.;
+
+   msg(MSG::INFO) << "... templated task is done";
+   if ( msgLvl(MSG::DEBUG) ) { msg() << ", result: " << result; }
+   msg(MSG::INFO) << endreq;
+
+   return StatusCode::SUCCESS;
+}
+
+
+/////////////////////////////////////////////////////////////////////////////
+template class ToolSpace::TemplatedTool< double >;
diff --git a/Control/AthenaExamples/AthExJobOptions/src/TestSvcHandleArrayAlg.cxx b/Control/AthenaExamples/AthExJobOptions/src/TestSvcHandleArrayAlg.cxx
new file mode 100644
index 0000000000000000000000000000000000000000..875d8c42b27ac26fce1f3bc557c29dde99a64e0e
--- /dev/null
+++ b/Control/AthenaExamples/AthExJobOptions/src/TestSvcHandleArrayAlg.cxx
@@ -0,0 +1,87 @@
+/*
+  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+*/
+
+#include "AthExJobOptions/TestSvcHandleArrayAlg.h"
+#include "AthExJobOptions/IVirtualSvc.h"
+
+
+/////////////////////////////////////////////////////////////////////////////
+
+TestSvcHandleArrayAlg::TestSvcHandleArrayAlg( const std::string& name, ISvcLocator* svcloc ) :
+  AthAlgorithm( name, svcloc ),
+  m_listOfSvcs(name)
+{
+   declareProperty( "SvcList",    m_listOfSvcs,    "Get important news from a service" );
+}
+
+//___________________________________________________________________________
+StatusCode TestSvcHandleArrayAlg::initialize()
+{
+
+// perform necessary one-off initialization
+
+   // retrieve the svc
+   if ( !m_listOfSvcs.retrieve().isSuccess() ) {
+      ATH_MSG_ERROR ("could not retrieve [" << m_listOfSvcs << "] !");
+      return StatusCode::FAILURE;
+   } else {
+     ATH_MSG_INFO ("Retrieved " <<m_listOfSvcs);
+   }
+
+   return StatusCode::SUCCESS;
+}
+
+//___________________________________________________________________________
+StatusCode TestSvcHandleArrayAlg::reinitialize()
+{
+
+// perform necessary re-initialization
+
+   return initialize();
+}
+
+//___________________________________________________________________________
+StatusCode TestSvcHandleArrayAlg::beginRun()
+{
+
+// perform work needed at start of every run
+
+   return StatusCode::SUCCESS;
+}
+
+//___________________________________________________________________________
+StatusCode TestSvcHandleArrayAlg::execute()
+{
+  std::string quote = "", totalquote="";
+  StatusCode sc;
+
+  ServiceHandleArray< IVirtualSvc >::iterator itSvc = m_listOfSvcs.begin();
+  
+  for (  ; itSvc != m_listOfSvcs.end(); ++itSvc ) {
+    sc = (*itSvc)->qotd(quote);
+    if ( sc.isFailure() ) {
+      ATH_MSG_ERROR
+	("Service " << (*itSvc) << " failed to get quote ... stop!");
+      return sc;
+    }
+    totalquote+=quote+"\n";
+  } 
+  ATH_MSG_INFO ("got this quote [" << totalquote << "].");
+  
+  return StatusCode::SUCCESS;
+}
+
+//___________________________________________________________________________
+StatusCode TestSvcHandleArrayAlg::endRun()
+{
+  
+   return StatusCode::SUCCESS;
+}
+
+//___________________________________________________________________________
+StatusCode TestSvcHandleArrayAlg::finalize()
+{
+
+   return StatusCode::SUCCESS;
+}
diff --git a/Control/AthenaExamples/AthExJobOptions/src/ToolUsingTool.cxx b/Control/AthenaExamples/AthExJobOptions/src/ToolUsingTool.cxx
new file mode 100755
index 0000000000000000000000000000000000000000..e442ff45f5c45fee1a70537295ea1daa28391445
--- /dev/null
+++ b/Control/AthenaExamples/AthExJobOptions/src/ToolUsingTool.cxx
@@ -0,0 +1,119 @@
+/*
+  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+*/
+
+#include "AthExJobOptions/ToolUsingTool.h"
+
+
+/////////////////////////////////////////////////////////////////////////////
+
+ToolUsingTool::ToolUsingTool( const std::string& type, const std::string& name,
+		      const IInterface* parent ) 
+  : AthAlgTool( type, name, parent ),
+    m_pubTool( "ConcreteTool/PublicConcreteTool" ),         // no parent, making it public
+    m_privTool( "ConcreteTool", this ), m_toolArray( this ) // adding 'this' makes it private
+{
+
+// declare any properties here
+
+   declareProperty( "Factor", m_factor = 1., "multiplicative factor to perform task" );
+
+   declareProperty( "TheToolPubTool",   m_pubTool,   "global helper to offload tasks to" );
+   declareProperty( "TheToolTool",      m_privTool,  "helper to offload some tasks to" );
+   declareProperty( "TheToolToolArray", m_toolArray, "list of helpers to offload some tasks to" );
+   
+   // set default toolArray
+   m_toolArray.push_back( "ConcreteTool/CxxDefaultTool" );
+}
+
+
+//___________________________________________________________________________
+StatusCode ToolUsingTool::queryInterface( const InterfaceID& riid, void** ppvIf )
+{
+   if ( riid == IVirtualTool::interfaceID() )  {
+      *ppvIf = (IVirtualTool*)this;
+      addRef();
+      return StatusCode::SUCCESS;
+   }
+
+   return AthAlgTool::queryInterface( riid, ppvIf );
+}
+
+//___________________________________________________________________________
+StatusCode ToolUsingTool::initialize()
+{
+
+// perform necessary one-off initialization
+
+// verify that our tool handle is pointing to an accessible tool
+   if ( m_pubTool.retrieve().isFailure() ) {
+      ATH_MSG_FATAL ("Failed to retrieve " << m_pubTool);
+      return StatusCode::FAILURE;
+   } else {
+      ATH_MSG_INFO ("Retrieved " << m_pubTool);
+   }
+
+   if ( m_privTool.retrieve().isFailure() ) {
+      ATH_MSG_FATAL ("Failed to retrieve " << m_privTool);
+      return StatusCode::FAILURE;
+   } else {
+      ATH_MSG_INFO ("Retrieved " << m_privTool);
+   }
+   
+   if ( m_toolArray.retrieve().isFailure() ) {
+     ATH_MSG_ERROR ("Failed to retreive " << m_toolArray);
+     return StatusCode::FAILURE;
+   } else {
+     ATH_MSG_INFO ("Retrieved " << m_toolArray);
+   }
+
+   return StatusCode::SUCCESS;
+}
+
+//___________________________________________________________________________
+StatusCode ToolUsingTool::finalize()
+{
+
+// perform work done at shutdown
+
+   return StatusCode::SUCCESS;
+}
+
+//___________________________________________________________________________
+StatusCode ToolUsingTool::performTask( double& result )
+{
+
+// do what needs to be done
+  ATH_MSG_INFO ("performing task using tool (factor: " << m_factor << ") ...");
+
+   StatusCode sc = m_pubTool->performTask( result );
+   if ( sc.isFailure() ) {
+     ATH_MSG_ERROR ("the global, public tool failed it's task ... stop!");
+     return sc;
+   }
+
+   sc = m_privTool->performTask( result );
+   if ( sc.isFailure() ) {
+     ATH_MSG_ERROR ("my tool failed it's task ... stop!");
+     return sc;
+   }
+
+   msg(MSG::INFO) << "... task using tool is done";
+   if ( msgLvl(MSG::DEBUG) ) { msg() << ", result: " << result; }
+   msg(MSG::INFO) << endreq;
+
+// make list of tools do their work
+   double newvalue = 12345.0;
+   ToolHandleArray< IVirtualTool >::iterator itPriv = m_toolArray.begin(),
+     itPrivEnd = m_toolArray.end();
+   for (  ; itPriv != itPrivEnd; ++itPriv ) {
+     sc = (*itPriv)->performTask( newvalue );
+     if ( sc.isFailure() ) {
+       ATH_MSG_ERROR
+	 ("tool " << (*itPriv).typeAndName() << " failed it's task ... stop!");
+       return sc;
+     }
+   }
+ 
+   return StatusCode::SUCCESS;
+}
diff --git a/Control/AthenaExamples/AthExJobOptions/src/TopAlgorithm.cxx b/Control/AthenaExamples/AthExJobOptions/src/TopAlgorithm.cxx
new file mode 100755
index 0000000000000000000000000000000000000000..189066618a9265a35c878fc42e1f10d0dcc5b659
--- /dev/null
+++ b/Control/AthenaExamples/AthExJobOptions/src/TopAlgorithm.cxx
@@ -0,0 +1,251 @@
+/*
+  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+*/
+
+#include "AthExJobOptions/TopAlgorithm.h"
+#include "AthExJobOptions/IVirtualTool.h"
+#include "AthExJobOptions/IVirtualSvc.h"
+#include "AthExJobOptions/SomeData.h"
+
+#include "GaudiKernel/IRndmGenSvc.h"
+#include "GaudiKernel/IRndmEngine.h"
+
+#include "StoreGate/StoreGateSvc.h"
+
+
+/////////////////////////////////////////////////////////////////////////////
+
+TopAlgorithm::TopAlgorithm( const std::string& name, ISvcLocator* svcloc ) :
+   AthAlgorithm( name, svcloc ), KeyMixin( this ),
+   m_tool( "ToolUsingTool", this ), // 'this' makes it private tool
+   m_publicTool( "ConcreteTool" ),  // public tool
+   m_listOfPrivateTools( this ),            // 'this' makes it a list of private tools 
+   m_listOfPublicTools(),           // absense of 'this' makes it a list of public tools 
+   m_svc( "ConcreteSvc", name ),     // some default service
+   m_emptyPrivateTool( "", this ),   // empty private tool
+   m_emptyPublicTool ( "" )          // empty public tool
+{
+// declare any properties here
+   declareProperty( "RndmFactor", m_rndmFactor = 1., "multiplicative random number factor" );
+
+   declareProperty( "TheTool",       m_tool,       "helper to offload some tasks to" );
+   declareProperty( "ThePublicTool", m_publicTool, "shared helper to offload some tasks to" );
+   declareProperty( "PrivateToolList",  m_listOfPrivateTools, "list of private helper tools" );
+   declareProperty( "PublicToolList",   m_listOfPublicTools,  "list of public helper tools" );
+   declareProperty( "TheSvc",
+		    m_svc = IVirtualSvc_t( "ConcreteSvc", this->name() ),
+		    "Get important news from a service" );
+
+   declareProperty( "EmptyPrivateTool", 
+		    m_emptyPrivateTool,
+		    "Testing an empty private tool" );
+
+   declareProperty( "EmptyPublicTool", 
+		    m_emptyPublicTool,
+		    "Testing an empty public tool" );
+
+   // initialise list of tools
+   m_listOfPrivateTools.push_back( "ConcreteTool/Tool1" );
+   m_listOfPrivateTools.push_back( "ToolUsingTool/Tool2" );
+   m_listOfPrivateTools.push_back( "ToolSpace::TemplatedTool<double>/Tool3" );
+
+   m_listOfPublicTools.push_back( "ConcreteTool/Tool4" );
+   m_listOfPublicTools.push_back( "ToolUsingTool/Tool5" );
+   m_listOfPublicTools.push_back( "ToolSpace::TemplatedTool<double>/Tool6" );
+
+}
+
+//___________________________________________________________________________
+StatusCode TopAlgorithm::initialize()
+{
+
+// perform necessary one-off initialization
+
+// verify that our tool handle is pointing to an accessible tool
+   if ( m_tool.retrieve().isFailure() ) {
+     ATH_MSG_FATAL ("Failed to retrieve " << m_tool);
+     return StatusCode::FAILURE;
+   } else {
+     ATH_MSG_INFO ("Retrieved " << m_tool);
+   }
+
+   if ( m_listOfPrivateTools.retrieve().isFailure() ) {
+     ATH_MSG_ERROR ("Failed to retreive " << m_listOfPrivateTools);
+     return StatusCode::FAILURE;
+   } else {
+     ATH_MSG_INFO ("Retrieved " << m_listOfPrivateTools);
+   }
+   
+   if ( m_listOfPublicTools.retrieve().isFailure() ) {
+     ATH_MSG_ERROR ("Failed to retreive " << m_listOfPublicTools);
+      return StatusCode::FAILURE;
+   } else {
+     ATH_MSG_INFO ("Retrieved " << m_listOfPublicTools);
+   }
+   
+   StatusCode sc = evtStore().retrieve();
+   if ( sc.isFailure() ) {
+     ATH_MSG_ERROR ("could not retrieve StoreGateSvc");
+     return sc;
+   }
+
+   // retrieve the svc
+   if ( !m_svc.retrieve().isSuccess() ) {
+     ATH_MSG_ERROR ("could not retrieve [" << m_svc.typeAndName() << "] !");
+     return StatusCode::FAILURE;
+   } else {
+     ATH_MSG_INFO ("Retrieved " << m_svc);
+   }
+
+   // check the empty private tool is empty :)
+   if ( !m_emptyPrivateTool.empty() ) {
+     ATH_MSG_ERROR ("Empty private tool is NOT empty !!");
+   } else {
+     ATH_MSG_INFO ("Empty private tool is empty (OK)");
+   }
+
+   // check the empty public tool is empty :)
+   if ( !m_emptyPublicTool.empty() ) {
+     ATH_MSG_ERROR ("Empty public tool is NOT empty !!");
+   } else {
+     ATH_MSG_INFO ("Empty public tool is empty (OK)");
+   }
+   return StatusCode::SUCCESS;
+}
+
+//___________________________________________________________________________
+StatusCode TopAlgorithm::reinitialize()
+{
+
+// perform necessary re-initialization
+
+   return initialize();
+}
+
+//___________________________________________________________________________
+StatusCode TopAlgorithm::beginRun()
+{
+
+// perform work needed at start of every run
+
+   return StatusCode::SUCCESS;
+}
+
+//___________________________________________________________________________
+StatusCode TopAlgorithm::execute()
+{
+
+// perform work done every event
+
+   std::string quote = "";
+   if ( !m_svc->qotd( quote ).isSuccess() ) {
+     ATH_MSG_ERROR ("could not retrieve the quote of the day !");
+     return StatusCode::FAILURE;
+   } else {
+     ATH_MSG_INFO ("got this quote [" << quote << "].");
+   }
+
+   SomeData* data = 0;   // holder to retrieve data in, if requested
+
+   if ( ! getInputKey().empty() ) {
+
+   // retrieve data of type SomeData, as available under the input key
+     StatusCode sc = evtStore()->retrieve( data, getInputKey() );
+     if ( sc.isFailure() || ! data ) {
+       ATH_MSG_ERROR ("could not retrieve data for key: " << getInputKey());
+       return sc;
+     }
+
+     ATH_MSG_DEBUG
+       ("read: " << data->getValue() << " from key: " << getInputKey());
+     
+   } else {
+     ATH_MSG_DEBUG ("no reading requested");
+   }
+
+   ATH_MSG_INFO ("doing my work ...");
+
+// calculate a new value based on the old data and the RndmFactor property
+   double newvalue = ( data ? data->getValue() : 0. ) +
+                     m_rndmFactor * randSvc()->engine()->rndm(); // see Algorithm base class
+
+// make the tool do it's work on the data
+   StatusCode sc = m_tool->performTask( newvalue );
+   if ( sc.isFailure() ) {
+     ATH_MSG_ERROR
+       ("tool " << m_tool.typeAndName() << " failed it's task ... stop!");
+     return sc;
+   }
+
+// make list of private tools do their work
+   ToolHandleArray< IVirtualTool >::iterator itPriv = m_listOfPrivateTools.begin(),
+      itPrivEnd = m_listOfPrivateTools.end();
+   for (  ; itPriv != itPrivEnd; ++itPriv ) {
+      sc = (*itPriv)->performTask( newvalue );
+      if ( sc.isFailure() ) {
+	ATH_MSG_ERROR 
+	  ("tool " << (*itPriv).typeAndName() << " failed it's task ... stop!");
+         return sc;
+      }
+   }
+
+// make my special tool do its work, if present
+   ToolHandle<IVirtualTool>* mySpecialTool = m_listOfPrivateTools["Special"];
+   if ( mySpecialTool ) {
+     ATH_MSG_INFO ("Putting my special tool at work: " << *mySpecialTool);
+     sc = (*mySpecialTool)->performTask( newvalue );
+     if ( sc.isFailure() ) {
+       ATH_MSG_ERROR (mySpecialTool->typeAndName() << " failed it's task ... stop!");
+       return sc;
+     }
+   }
+
+// make list of tools do their work
+   ToolHandleArray< IVirtualTool >::iterator itPub = m_listOfPublicTools.begin(),
+      itPubEnd = m_listOfPublicTools.end();
+   for (  ; itPub != itPubEnd; ++itPub ) {
+      sc = (*itPub)->performTask( newvalue );
+      if ( sc.isFailure() ) {
+	ATH_MSG_ERROR ("tool " << (*itPub).typeAndName()
+		       << " failed it's task ... stop!");
+	return sc;
+      }
+   }
+
+// store result in a recordable object
+   SomeData* newdata = new SomeData( newvalue );
+
+   ATH_MSG_INFO ("... my work is done! ");
+
+// put the new data into the store
+   sc = evtStore()->record( newdata, getOutputKey() );
+   if ( sc.isFailure() ) {
+      delete newdata;    // our responsibility to delete if record fails
+      ATH_MSG_ERROR ("failed to record data under key: " << getOutputKey());
+      return sc;
+   }
+
+   ATH_MSG_DEBUG 
+     ("wrote data: " << newdata->getValue() << " for key: " << getOutputKey());
+
+// no deletion of newdata after successful record
+   return StatusCode::SUCCESS;
+}
+
+//___________________________________________________________________________
+StatusCode TopAlgorithm::endRun()
+{
+
+// perform work done at end of every run
+
+   return StatusCode::SUCCESS;
+}
+
+//___________________________________________________________________________
+StatusCode TopAlgorithm::finalize()
+{
+
+// perform work done at shutdown
+
+   return StatusCode::SUCCESS;
+}
diff --git a/Control/AthenaExamples/AthExJobOptions/src/components/AthExJobOptions_entries.cxx b/Control/AthenaExamples/AthExJobOptions/src/components/AthExJobOptions_entries.cxx
new file mode 100755
index 0000000000000000000000000000000000000000..a4ca7ad987bcaef1e6e15441f90244da1f6a3143
--- /dev/null
+++ b/Control/AthenaExamples/AthExJobOptions/src/components/AthExJobOptions_entries.cxx
@@ -0,0 +1,39 @@
+#include "AthExJobOptions/NoopAlgorithm.h"
+#include "AthExJobOptions/TopAlgorithm.h"
+#include "AthExJobOptions/SubAlgorithm.h"
+#include "AthExJobOptions/TestSvcHandleArrayAlg.h"
+#include "AthExJobOptions/ConcreteTool.h"
+#include "AthExJobOptions/ToolUsingTool.h"
+#include "AthExJobOptions/TemplatedTool.h"
+#include "AthExJobOptions/ConcreteSvc.h"
+#include "AthExJobOptions/AnotherConcreteSvc.h"
+#include "AthExJobOptions/ExampleEvtLoopPreSelectTool.h"
+
+#include "GaudiKernel/DeclareFactoryEntries.h"
+
+typedef ToolSpace::TemplatedTool< double > ToolSpaceTemplatedToolDouble;
+
+
+DECLARE_ALGORITHM_FACTORY( NoopAlgorithm )
+DECLARE_ALGORITHM_FACTORY( TopAlgorithm )
+DECLARE_ALGORITHM_FACTORY( SubAlgorithm )
+DECLARE_ALGORITHM_FACTORY( TestSvcHandleArrayAlg )
+DECLARE_TOOL_FACTORY( ConcreteTool )
+DECLARE_TOOL_FACTORY( ToolUsingTool )
+DECLARE_TOOL_FACTORY( ToolSpaceTemplatedToolDouble )
+DECLARE_TOOL_FACTORY( ExampleEvtLoopPreSelectTool )
+DECLARE_SERVICE_FACTORY( ConcreteSvc )
+DECLARE_SERVICE_FACTORY( AnotherConcreteSvc )
+
+DECLARE_FACTORY_ENTRIES( AthExJobOptions ) {
+   DECLARE_ALGORITHM( NoopAlgorithm )
+   DECLARE_ALGORITHM( TopAlgorithm )
+   DECLARE_ALGORITHM( SubAlgorithm )
+   DECLARE_ALGORITHM( TestSvcHandleArrayAlg )
+   DECLARE_ALGTOOL( ConcreteTool )
+   DECLARE_ALGTOOL( ToolUsingTool )
+   DECLARE_ALGTOOL( ToolSpaceTemplatedToolDouble )
+   DECLARE_ALGTOOL( ExampleEvtLoopPreSelectTool )
+   DECLARE_SERVICE( ConcreteSvc )
+   DECLARE_SERVICE( AnotherConcreteSvc )
+}
diff --git a/Control/AthenaExamples/AthExJobOptions/src/components/AthExJobOptions_load.cxx b/Control/AthenaExamples/AthExJobOptions/src/components/AthExJobOptions_load.cxx
new file mode 100755
index 0000000000000000000000000000000000000000..1ddcfc26d7b8dd609b7cd972d48613dabd5b737c
--- /dev/null
+++ b/Control/AthenaExamples/AthExJobOptions/src/components/AthExJobOptions_load.cxx
@@ -0,0 +1,3 @@
+#include "GaudiKernel/LoadFactoryEntries.h"
+
+LOAD_FACTORY_ENTRIES(AthExJobOptions)
diff --git a/Control/AthenaExamples/AthExJobOptions/test/AthExJobOptions.xml b/Control/AthenaExamples/AthExJobOptions/test/AthExJobOptions.xml
new file mode 100755
index 0000000000000000000000000000000000000000..8669c7d2e95d9abc1ac5adbc595bd145d1f588f1
--- /dev/null
+++ b/Control/AthenaExamples/AthExJobOptions/test/AthExJobOptions.xml
@@ -0,0 +1,15 @@
+<?xml version="1.0"?>
+<atn>
+   <TEST name="JobOptionsTest" type="makecheck" suite="Examples">
+      <package>Control/AthenaExamples/AthExJobOptions</package>
+      <timelimit>5</timelimit>
+      <author> Wim Lavrijsen </author>
+      <mailto> pcalafiura@lbl.gov, wlavrijsen@lbl.gov </mailto>
+      <expectations>
+         <errorMessage>Athena exited abnormally</errorMessage>
+         <warningMessage> # WARNING_MESSAGE : post.sh> ERROR</warningMessage>
+         <successMessage>check ok</successMessage>
+         <returnValue>0</returnValue>
+      </expectations>
+   </TEST>
+</atn>