diff --git a/DDG4/include/DDG4/Geant4InputAction.h b/DDG4/include/DDG4/Geant4InputAction.h
index a1b37eac670f65fddc26aa4b5f29f4b3fb97679a..cd0c276243b01b5e55b145a9a2ac1c521b64ab96 100644
--- a/DDG4/include/DDG4/Geant4InputAction.h
+++ b/DDG4/include/DDG4/Geant4InputAction.h
@@ -18,6 +18,7 @@
 #include "DDG4/Geant4Vertex.h"
 #include "DDG4/Geant4Particle.h"
 #include "DDG4/Geant4GeneratorAction.h"
+#include "DD4hep/Parsers.h"
 
 // C/C++ include files
 #include <vector>
@@ -64,6 +65,24 @@ namespace DD4hep  {
       bool m_directAccess;
       /// Current event number
       int  m_currEvent;
+
+      /// transform the string parameter value into the type of parameter
+      /**
+       * removes parameter from the parameters map
+       */
+      template <typename T>
+      void _getParameterValue( std::map< std::string, std::string > & parameters,
+			       std::string const& parameterName,
+			       T& parameter, T defaultValue ) {
+
+	if( parameters.find( parameterName ) != parameters.end() ) {
+	  DD4hep::Parsers::parse( parameter, parameters.at( parameterName ) );
+	  parameters.erase( parameterName );
+	} else {
+	  parameter = defaultValue;
+	}
+      }
+
     public:
       /// Initializing constructor
       Geant4EventReader(const std::string& nam);
@@ -92,6 +111,12 @@ namespace DD4hep  {
       virtual EventReaderStatus readParticles(int event_number, 
                                               Vertices&  vertices,
                                               Particles& particles) = 0;
+
+      /// pass parameters to the event reader object
+      virtual EventReaderStatus setParameters( std::map< std::string, std::string > & ) {return EVENT_READER_OK; }
+
+      /// make sure that all parameters have been processed, otherwise throw exceptions
+      virtual void checkParameters( std::map< std::string, std::string >& );
     };
 
     /// Generic input action capable of using the Geant4EventReader class.
@@ -126,6 +151,8 @@ namespace DD4hep  {
       int m_currentEventNumber;
       /// Flag to call abortEvent in case of failure (default: true)
       bool m_abort;
+      /// Property: named parameters to configure file readers or input actions
+      std::map< std::string, std::string> m_parameters;
 
     public:
       /// Read an event and return a LCCollectionVec of MCParticles.
diff --git a/DDG4/src/Geant4InputAction.cpp b/DDG4/src/Geant4InputAction.cpp
index 216b93e518b8d9514d287142685c06cc1be5c95e..b9cbc71431c9270e6efcbbf15bf3e7ea702426db 100644
--- a/DDG4/src/Geant4InputAction.cpp
+++ b/DDG4/src/Geant4InputAction.cpp
@@ -52,6 +52,21 @@ Geant4EventReader::EventReaderStatus Geant4EventReader::skipEvent()  {
   return sc;
 }
 
+/// check if all parameters have been consumed by the reader, otherwise throws exception
+void Geant4EventReader::checkParameters(std::map< std::string, std::string > &parameters) {
+
+  if( parameters.empty() ) {
+    return;
+  }
+  for (auto const& pairNV : parameters ) {
+    printout(FATAL,"EventReader::checkParameters","Unknown parameter name: %s with value %s",
+	     pairNV.first.c_str(),
+	     pairNV.second.c_str());
+  }
+  throw std::runtime_error("Unknown parameter for event reader");
+
+}
+
 /// Move to the indicated event number.
 Geant4EventReader::EventReaderStatus
 Geant4EventReader::moveToEvent(int event_number)   {
@@ -87,6 +102,7 @@ Geant4InputAction::Geant4InputAction(Geant4Context* ctxt, const string& nam)
   declareProperty("Mask",           m_mask = 0);
   declareProperty("MomentumScale",  m_momScale = 1.0);
   declareProperty("HaveAbort",      m_abort = true);
+  declareProperty("Parameters",     m_parameters = {});
   m_needsControl = true;
 }
 
@@ -123,6 +139,8 @@ int Geant4InputAction::readParticles(int evt_number,
                  tn.first.c_str(),tn.second.c_str());
         return Geant4EventReader::EVENT_READER_NO_FACTORY;
       }
+      m_reader->setParameters( m_parameters );
+      m_reader->checkParameters( m_parameters );
     }
     catch(const exception& e)  {
       err = e.what();