diff --git a/InnerDetector/InDetConditions/BeamSpotConditions/src/BeamSpotCondAlg.cxx b/InnerDetector/InDetConditions/BeamSpotConditions/src/BeamSpotCondAlg.cxx
index 753a0aa8bdec2b81b3aace8f2a0fb593866096eb..5cdefb441dd2a855523dfcfc55d2f1dd37a1db61 100644
--- a/InnerDetector/InDetConditions/BeamSpotConditions/src/BeamSpotCondAlg.cxx
+++ b/InnerDetector/InDetConditions/BeamSpotConditions/src/BeamSpotCondAlg.cxx
@@ -2,6 +2,18 @@
 #include "BeamSpotCondAlg.h"
 #include "CoralBase/AttributeListException.h"
 
+const EventIDRange BeamSpotCondAlg::alwaysValid { EventIDBase { 1,
+                                                                EventIDBase::UNDEFEVT,
+                                                                EventIDBase::UNDEFNUM,
+                                                                EventIDBase::UNDEFNUM,
+                                                                0 },
+                                                  EventIDBase { EventIDBase::UNDEFNUM - 1,
+	                                                        EventIDBase::UNDEFEVT,
+	                                                        EventIDBase::UNDEFNUM,
+	                                                        EventIDBase::UNDEFNUM,
+	                                                        EventIDBase::UNDEFNUM - 1 }
+                                                };
+
 BeamSpotCondAlg::BeamSpotCondAlg( const std::string& name, ISvcLocator* pSvcLocator ) 
   : AthAlgorithm( name, pSvcLocator )
 { }
@@ -48,37 +60,38 @@ StatusCode BeamSpotCondAlg::execute()
     return StatusCode::SUCCESS;
   }
 
-  SG::ReadCondHandle<AthenaAttributeList> readHandle { m_readKey };
-  
-  const AthenaAttributeList* raw { *readHandle };
-  if ( raw == nullptr )
+  EventIDRange rangeW;
+  InDet::BeamSpotData* writeCdo = nullptr;
+
+  if ( !m_useDB )
   {
-    ATH_MSG_ERROR("Beam Spot data for key " << m_readKey.fullKey() << " not found");
-    return StatusCode::FAILURE;
+    rangeW = alwaysValid;
+    writeCdo = new InDet::BeamSpotData( m_status, m_posX, m_posY, m_posZ,
+				        m_sigmaX, m_sigmaY, m_sigmaZ,
+				        m_tiltX, m_tiltY, m_sigmaXY );
   }
-  
-  int   status  { m_status };
-  float posX    { m_posX };
-  float posY    { m_posY };
-  float posZ    { m_posZ };
-  float sigmaX  { m_sigmaX };
-  float sigmaY  { m_sigmaY };
-  float sigmaZ  { m_sigmaZ };
-  float tiltX   { m_tiltX };
-  float tiltY   { m_tiltY };
-  float sigmaXY { m_sigmaXY };
-
-  if (m_useDB)
+  else
   {
-    status = (*raw)["status"].data<int>();
-    posX = (*raw)["posX"].data<float>();
-    posY = (*raw)["posY"].data<float>();
-    posZ = (*raw)["posZ"].data<float>();
-    sigmaX = (*raw)["sigmaX"].data<float>();
-    sigmaY = (*raw)["sigmaY"].data<float>();
-    sigmaZ = (*raw)["sigmaZ"].data<float>();
-    tiltX = (*raw)["tiltX"].data<float>();
-    tiltY = (*raw)["tiltY"].data<float>();
+
+    SG::ReadCondHandle<AthenaAttributeList> readHandle { m_readKey };
+  
+    const AthenaAttributeList* raw { *readHandle };
+    if ( raw == nullptr )
+    {
+      ATH_MSG_ERROR("Beam Spot data for key " << m_readKey.fullKey() << " not found");
+      return StatusCode::FAILURE;
+    }
+  
+    int status { (*raw)["status"].data<int>() };
+    float posX { (*raw)["posX"].data<float>() };
+    float posY { (*raw)["posY"].data<float>() };
+    float posZ { (*raw)["posZ"].data<float>() };
+    float sigmaX { (*raw)["sigmaX"].data<float>() };
+    float sigmaY { (*raw)["sigmaY"].data<float>() };
+    float sigmaZ { (*raw)["sigmaZ"].data<float>() };
+    float tiltX  { (*raw)["tiltX"].data<float>() };
+    float tiltY  { (*raw)["tiltY"].data<float>() };
+    float sigmaXY { m_sigmaXY };
     try
     {
       sigmaXY = (*raw)["sigmaXY"].data<float>();
@@ -89,31 +102,30 @@ StatusCode BeamSpotCondAlg::execute()
     }
 
     ATH_MSG_INFO( "Read from condDB"
-	       << " status " << status
+               << " status " << status
 	       << " pos (" << posX << "," << posY << "," << posZ << ")"
 	       << " sigma (" << sigmaX << "," << sigmaY << "," << sigmaZ << ")"
 	       << " tilt (" << tiltX << "," << tiltY << ")"
 	       << " sigmaXY " << sigmaXY );
-  }
 
-  EventIDRange rangeW;
-  if ( !readHandle.range(rangeW) )
-  {
-    ATH_MSG_ERROR( "Failed to retrieve validity range for " << readHandle.key() );
-    return StatusCode::FAILURE;
+    if ( !readHandle.range(rangeW) )
+    {
+      ATH_MSG_ERROR( "Failed to retrieve validity range for " << readHandle.key() );
+      return StatusCode::FAILURE;
+    }
+
+    writeCdo = new InDet::BeamSpotData( status, posX, posY, posZ,
+				        sigmaX, sigmaY, sigmaZ,
+					tiltX, tiltY, sigmaXY );
   }
 
-  InDet::BeamSpotData* writeCdo = new InDet::BeamSpotData( status, posX, posY, posZ,
-							   sigmaX, sigmaY, sigmaZ,
-							   tiltX, tiltY, sigmaXY );
-  
   if ( writeHandle.record( rangeW, writeCdo ).isFailure() )
   {
     ATH_MSG_ERROR( "Could not record InDet::BeamSpotData " << writeHandle.key() <<
-		   " with EventRange " << rangeW << " into conditions store." );
+                   " with EventRange " << rangeW << " into conditions store." );
     return StatusCode::FAILURE;
   }
-
+  
   ATH_MSG_INFO( "Recorded new InDet::BeamSpotData to " << writeHandle.key() << " with range " << rangeW <<
 		" into conditions store." );
 
diff --git a/InnerDetector/InDetConditions/BeamSpotConditions/src/BeamSpotCondAlg.h b/InnerDetector/InDetConditions/BeamSpotConditions/src/BeamSpotCondAlg.h
index 6930b8febaf67166bed5c3eb24b9bcbab536392e..f334befcd023913709bd1e70e9eb7309c90b956e 100644
--- a/InnerDetector/InDetConditions/BeamSpotConditions/src/BeamSpotCondAlg.h
+++ b/InnerDetector/InDetConditions/BeamSpotConditions/src/BeamSpotCondAlg.h
@@ -7,6 +7,8 @@
 #include "AthenaPoolUtilities/AthenaAttributeList.h"
 
 #include "GaudiKernel/ICondSvc.h"
+#include "GaudiKernel/EventIDRange.h" 
+#include <limits>
 
 #include "BeamSpotConditionsData/BeamSpotData.h"
 
@@ -21,6 +23,7 @@ class BeamSpotCondAlg : public AthAlgorithm
   virtual StatusCode  execute();        //per event
   virtual StatusCode  finalize();       //once, after all events processed
   
+  static const EventIDRange alwaysValid;
 
  private: 
 
diff --git a/InnerDetector/InDetConditions/BeamSpotConditionsData/BeamSpotConditionsData/BeamSpotData.h b/InnerDetector/InDetConditions/BeamSpotConditionsData/BeamSpotConditionsData/BeamSpotData.h
index edd2ac70067f8106df2e45196252cf8c0a2eab12..9d09abe10a4d8bdd7eecf80ceee49ab637c97ff8 100644
--- a/InnerDetector/InDetConditions/BeamSpotConditionsData/BeamSpotConditionsData/BeamSpotData.h
+++ b/InnerDetector/InDetConditions/BeamSpotConditionsData/BeamSpotConditionsData/BeamSpotData.h
@@ -6,6 +6,10 @@
 
 #include "GeoPrimitives/GeoPrimitives.h"
 
+#ifndef SIMULATIONBASE
+#include "VxVertex/RecVertex.h"
+#endif
+
 namespace InDet
 {
 
@@ -18,7 +22,20 @@ namespace InDet
 
     virtual ~BeamSpotData() { }
 
-    inline const Amg::Vector3D& beamPos() const { return m_beamPos; }
+    const Amg::Vector3D& beamPos() const;
+
+    float beamSigma(int i) const;
+
+    float beamSigmaXY() const;
+
+    float beamTilt(int i) const;
+
+    int beamStatus() const;
+
+#ifndef SIMULATIONBASE
+    const Trk::RecVertex& beamVtx() const;
+#endif
+    
 
   private:
 
@@ -33,10 +50,30 @@ namespace InDet
     float m_tiltY;
     float m_sigmaXY;
 
+    std::vector<float> m_errPar;
+
     Amg::Vector3D m_beamPos;
 
+#ifndef SIMULATIONBASE
+    Trk::RecVertex m_vertex;
+#endif
+
   };
 
+  inline const Amg::Vector3D& BeamSpotData::beamPos() const { return m_beamPos; }
+
+  inline float BeamSpotData::beamSigma(int i) const { return m_errPar[i]; }
+
+  inline float BeamSpotData::beamSigmaXY() const { return m_errPar[5]; }
+
+  inline float BeamSpotData::beamTilt(int i) const { return m_errPar[3+i]; }
+
+  inline int BeamSpotData::beamStatus() const { return m_status; }
+
+#ifndef SIMULATIONBASE
+  inline const Trk::RecVertex& BeamSpotData::beamVtx() const { return m_vertex; }
+#endif
+
 }
 
 CLASS_DEF(InDet::BeamSpotData,188569010,1)
diff --git a/InnerDetector/InDetConditions/BeamSpotConditionsData/CMakeLists.txt b/InnerDetector/InDetConditions/BeamSpotConditionsData/CMakeLists.txt
index e7c6f13652c72865296a295772b9f2f0d33eb46c..3eca623f095d9a7414cf2918617dc9c18ec00c0b 100644
--- a/InnerDetector/InDetConditions/BeamSpotConditionsData/CMakeLists.txt
+++ b/InnerDetector/InDetConditions/BeamSpotConditionsData/CMakeLists.txt
@@ -5,16 +5,25 @@
 # package name
 atlas_subdir( BeamSpotConditionsData )
 
+# possible extra dependencies
+set ( extra_dep )
+set ( extra_lib )
+if ( NOT SIMULATIONBASE )
+   set ( extra_dep VxVertex )
+   set ( extra_lib VxVertex )
+endif()
+
 # dependencies
 atlas_depends_on_subdirs( PUBLIC
 			  Control/AthenaKernel
 			  AthenaPoolUtilities
 			  GeoPrimitives
+			  ${extra_dep}
 			)
 
 # components
 atlas_add_library( BeamSpotConditionsData
 		   src/*.cxx
 		   PUBLIC_HEADERS BeamSpotConditionsData
-		   LINK_LIBRARIES AthenaPoolUtilities GeoPrimitives 
+		   LINK_LIBRARIES AthenaPoolUtilities GeoPrimitives ${extra_lib}
 		 )
diff --git a/InnerDetector/InDetConditions/BeamSpotConditionsData/src/BeamSpotData.cxx b/InnerDetector/InDetConditions/BeamSpotConditionsData/src/BeamSpotData.cxx
index befb4d3bedc39509e254bac9792f38cdc59c4235..51cac5fc9ca2bd818b27b2203d674306c88fb86c 100644
--- a/InnerDetector/InDetConditions/BeamSpotConditionsData/src/BeamSpotData.cxx
+++ b/InnerDetector/InDetConditions/BeamSpotConditionsData/src/BeamSpotData.cxx
@@ -9,7 +9,24 @@ namespace InDet
     m_status { status }, m_posX { posX }, m_posY { posY }, m_posZ { posZ },
     m_sigmaX { sigmaX }, m_sigmaY { sigmaY }, m_sigmaZ { sigmaZ },
     m_tiltX { tiltX }, m_tiltY { tiltY }, m_sigmaXY { sigmaXY },
+    m_errPar { sigmaX, sigmaY, sigmaZ, tiltX, tiltY, sigmaXY },
     m_beamPos { posX, posY, posZ }
-  {  }
+  {  
+#ifndef SIMULATIONBASE
+    float sigmaX_tilt = tan(tiltX) * sigmaZ;
+    float sigmaY_tilt = tan(tiltY) * sigmaZ;
+    float sigmaX_all = sqrt(sigmaX*sigmaX + sigmaX_tilt*sigmaX_tilt);
+    float sigmaY_all = sqrt(sigmaY*sigmaY + sigmaY_tilt*sigmaY_tilt);
+    Amg::MatrixX beamErr(3, 3);
+    beamErr.setZero();
+    beamErr.fillSymmetric(0, 0, sigmaX_all*sigmaX_all);
+    beamErr.fillSymmetric(0, 1, sigmaXY);
+    beamErr.fillSymmetric(1, 1, sigmaY_all*sigmaY_all);
+    beamErr.fillSymmetric(0, 2, tan(tiltX)*sigmaZ*sigmaZ);
+    beamErr.fillSymmetric(1, 2, tan(tiltY)*sigmaZ*sigmaZ);
+    beamErr.fillSymmetric(2, 2, sigmaZ*sigmaZ);
+    m_vertex = Trk::RecVertex(m_beamPos, beamErr);
+#endif
+  }
 
 }