diff --git a/Generators/Epos_i/CMakeLists.txt b/Generators/Epos_i/CMakeLists.txt
index f64e338c2b2a1db974f7390631627d4ae66071b6..df94dbba212d7a7abdb082cfcd9251cea62e1a16 100644
--- a/Generators/Epos_i/CMakeLists.txt
+++ b/Generators/Epos_i/CMakeLists.txt
@@ -43,3 +43,6 @@ atlas_add_component( Epos_i
 atlas_install_joboptions( share/*.py )
 atlas_install_runtime( share/epos_crmc.param )
 
+set( EposEnvironment_DIR ${CMAKE_CURRENT_SOURCE_DIR}
+   CACHE PATH "Location of EposEnvironment.cmake" )
+find_package( EposEnvironment )
diff --git a/Generators/Epos_i/EposEnvironmentConfig.cmake b/Generators/Epos_i/EposEnvironmentConfig.cmake
new file mode 100644
index 0000000000000000000000000000000000000000..a44dffcdb5fe380bbb70439445d060a7175a98ed
--- /dev/null
+++ b/Generators/Epos_i/EposEnvironmentConfig.cmake
@@ -0,0 +1,18 @@
+# Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration
+#
+# This module is used to set up the environment for Epos
+# 
+#
+
+# Set the environment variable(s):
+find_package( CRMC )
+
+if( CRMC_FOUND  )
+  set( EPOSENVIRONMENT_ENVIRONMENT 
+        FORCESET EPOSVER ${CRMC_VERSION} )
+endif()
+
+# Silently declare the module found:
+set( EPOSENVIRONMENT_FOUND TRUE )
+
+
diff --git a/Generators/EvgenJobTransforms/python/EvgenConfig.py b/Generators/EvgenJobTransforms/python/EvgenConfig.py
index c2dbfc83d9db798889d95b499ae511677037831c..c67958c809a927d10dd1dbec959ca0e688d4f09f 100644
--- a/Generators/EvgenJobTransforms/python/EvgenConfig.py
+++ b/Generators/EvgenJobTransforms/python/EvgenConfig.py
@@ -1,12 +1,13 @@
-#  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
-
+#  Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration
+#
 ## Generators providing input events via the LHEF format (MC@NLO produces LHEF
 ## when used in connection with Herwig++, which is fine since this variable is
 ## just used to determine the input file dummy-naming strategy for C++ generators)
 lhefGenerators = ["Lhef", # generic name: prefer to use the names below
-                  "aMcAtNlo", "McAtNlo", "Powheg", "PowHel", "MadGraph", "CompHep", "CalcHep",
-                  "Whizard", "MCFM", "JHU", "MEtop", "Charybdis", "Charybdis2","BCVEGPY", "Dire4Pythia8",
-                  "BlackMax", "QBH", "gg2ww", "gg2zz", "gg2vv", "HvyN", "VBFNLO", "FPMC", "ProtosLHEF"]
+                  "aMcAtNlo", "McAtNlo", "Powheg", "PowHel", "MadGraph", "CompHep", "CalcHep","Geneva",
+                  "Whizard", "MCFM", "JHU", "MEtop", "Charybdis", "Charybdis2", "BCVEGPY", "Dire4Pythia8", 
+                  "BlackMax", "QBH", "gg2ww", "gg2zz", "gg2vv", "HvyN", "VBFNLO", "FPMC", "ProtosLHEF",
+                  "BCVEGPY"]
 
 ## A more general list of generators which provide partonic input, including non-LHEF ones
 inputGenerators = lhefGenerators + ["Alpgen", "Protos"]
@@ -111,6 +112,7 @@ class EvgenConfig(TransformConfig):
     notes = String("Extra information about this process e.g. known current problems")
     contact = ListOfStrings("Contact person for this dataset. Leave empty for 'MC group'")
     keywords = ListOfStrings("Search keywords for this dataset, e.g. 'QCD', 'EW', 'minbias', ...")
+    categories = ListOfStrings("Category keywords for this dataset, e.g. 'L1:Top', 'L2:RareTop'")
     inputfilecheck = String("A regex to check that the input file needed for some generators has a valid name")
     inputconfcheck = String("A regex to check that the config file needed for some generators has a valid name")
     specialConfig = String("Special configuration for subsequent prod steps")
@@ -119,6 +121,7 @@ class EvgenConfig(TransformConfig):
     findJets = Boolean("Schedule jet finding algorithms for each defined jet container", False)
     doNotSaveItems = ListOfStrings("List of StreamEVGEN items to NOT save in output file - note occurs BEFORE extraSaveItems are added")
     extraSaveItems = ListOfStrings("List of extra StreamEVGEN items to save in output file - note occurs AFTER doNotSaveItems are removed")
+    inputFilesPerJob = Integer("number of input files per job",0, AllowedExpression("value >= 0"))
 
     def __init__(self, name="evgenConfig"):
         TransformConfig.__init__(self, name)
diff --git a/Generators/EvgenJobTransforms/scripts/AfterBurner_tf.py b/Generators/EvgenJobTransforms/scripts/AfterBurner_tf.py
index 232d15d400552a8deb98af2631a9740b45d0d6cc..502107d577da801e7f294c2b8d706d5383c69058 100755
--- a/Generators/EvgenJobTransforms/scripts/AfterBurner_tf.py
+++ b/Generators/EvgenJobTransforms/scripts/AfterBurner_tf.py
@@ -1,5 +1,5 @@
-#  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
-
+#  Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration
+#
 #! /usr/bin/env python
 
 """
@@ -14,7 +14,6 @@ from PyJobTransforms.trfArgs import addAthenaArguments
 from PyJobTransforms.trfDecorators import stdTrfExceptionHandler, sigUsrStackTrace
 from EvgenJobTransforms.evgenTrfArgs import addStdEvgenArgs
 import PyJobTransforms.trfArgClasses as trfArgClasses
-from EvgenJobTransforms.jo_proxy import mk_jo_proxy
 
 
 ## Prodsys1 hack...
@@ -47,6 +46,36 @@ class EvgenExecutor(athenaExecutor):
                 zf.extractall()
                 zf.close()
 
+        def get_immediate_subdirectories(a_dir):
+            return [name for name in os.listdir(a_dir)
+                    if os.path.isdir(os.path.join(a_dir, name))]                
+
+        def mk_jo_proxy(targetbasepath, pkgname, proxypath, addtosearch=True):
+            "Make a JO proxy dir such that the MCxxJobOptions/dddd dirs contents are found via include(MCxxJobOptions/yyyy)"
+            if proxypath:
+                if os.path.exists(proxypath):
+                    shutil.rmtree(proxypath)
+                os.mkdir(proxypath)
+            os.environ['LOCAL_INSTALL_DIR'] = (os.environ['JOBOPTSEARCHPATH']).split(":")[0]
+            comdir = os.path.join(targetbasepath, "common")
+            subdirlist = get_immediate_subdirectories(comdir)
+            subdirlist1 = ['common/%s' % item for item in subdirlist]
+            dirlist = ['common','share','gencontrol','susycontrol']
+            for d in (dirlist+subdirlist1):
+                # TODO: we could _maybe_ add the appropriate share/DSIDxxxx/ dir to the path based on the jobConfig arg... too much magic?
+                if (d != 'common/.svn'):
+                  dpath = os.path.join(proxypath, d)
+
+                  if proxypath:
+                    os.mkdir(dpath)
+                    os.symlink(os.path.join(targetbasepath, d), os.path.join(dpath, pkgname))
+                  if addtosearch:
+                    os.environ["JOBOPTSEARCHPATH"] = dpath+":"+os.environ["JOBOPTSEARCHPATH"]
+                    os.environ["DATAPATH"] =os.path.join(targetbasepath, d)+":"+os.environ["DATAPATH"]
+
+            os.environ["JOBOPTSEARCHPATH"] = os.environ['LOCAL_INSTALL_DIR']+":"+os.environ["JOBOPTSEARCHPATH"]
+        
+
         ## Handle locating of evgen job options / fragments, either from a tarball or CVMFS
         if "evgenJobOpts" in self._trf.argdict: ## Use a specified JO tarball
             tarball = self._trf.argdict["evgenJobOpts"].value
diff --git a/Generators/EvgenJobTransforms/scripts/Generate_tf.py b/Generators/EvgenJobTransforms/scripts/Generate_tf.py
index 3b2645e5aeea29d04bec48aabd8ea294587d65dd..d06132bc750fdd5981ed5b058d8e51328ac3f4a4 100755
--- a/Generators/EvgenJobTransforms/scripts/Generate_tf.py
+++ b/Generators/EvgenJobTransforms/scripts/Generate_tf.py
@@ -1,8 +1,9 @@
 #! /usr/bin/env python
 
+#  Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration
+#
 """
-#  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
-Run event simulation and produce an EVNT file.
+# Run event simulation and produce an EVNT file.
 """
 
 import os, sys, time, shutil
@@ -13,7 +14,7 @@ from PyJobTransforms.trfArgs import addAthenaArguments
 from PyJobTransforms.trfDecorators import stdTrfExceptionHandler, sigUsrStackTrace
 from EvgenJobTransforms.evgenTrfArgs import addStdEvgenArgs
 import PyJobTransforms.trfArgClasses as trfArgClasses
-from EvgenJobTransforms.jo_proxy import mk_jo_proxy
+
 
 ## Prodsys1 hack...
 # TODO: Remove!
@@ -44,6 +45,49 @@ class EvgenExecutor(athenaExecutor):
                 zf.extractall()
                 zf.close()
 
+        def get_immediate_subdirectories(a_dir):
+            return [name for name in os.listdir(a_dir)
+                    if os.path.isdir(os.path.join(a_dir, name))]                
+
+        def mk_jo_proxy(targetbasepath, pkgname, proxypath, addtosearch=True):
+            "Make a JO proxy dir such that the MCxxJobOptions/dddd dirs contents are found via include(MCxxJobOptions/yyyy)"
+            if proxypath:
+                if os.path.exists(proxypath):
+                    shutil.rmtree(proxypath)
+                os.mkdir(proxypath)
+            os.environ['LOCAL_INSTALL_DIR'] = (os.environ['JOBOPTSEARCHPATH']).split(":")[0]
+            os.environ['LOCAL_DATA_DIR'] = (os.environ['DATAPATH']).split(":")[0]
+
+            dirlist =  get_immediate_subdirectories(targetbasepath)
+            subdirlist=dirlist;
+            for dd in (dirlist):
+              if (('.svn' not in dd) and ('cmt' not in dd) and ('_joproxy' not in dd)):
+                deepdir = os.path.join(targetbasepath, dd)
+                subdirlist1 = get_immediate_subdirectories(deepdir)
+                subdirlist = subdirlist+["%s" % dd+"/%s" % item for item in subdirlist1]
+            for d in (subdirlist):
+                # TODO: we could _maybe_ add the appropriate share/DSIDxxxx/ dir to the path based on the jobConfig arg... too much magic?
+                if (('.svn' not in d) and ('cmt' not in d) and ('_joproxy' not in d) and ('share/' not in d)):
+                  dpath = os.path.join(proxypath, d)
+                  if proxypath:
+                           os.mkdir(dpath)
+
+                  if ('nonStandard' in dpath):
+                        dpath_ex = os.path.join(dpath,pkgname)
+                        if proxypath:
+                           os.mkdir(dpath_ex)
+                            
+                        os.symlink(os.path.join(targetbasepath, d), os.path.join(dpath_ex, "nonStandard"))
+                  else :      
+                        os.symlink(os.path.join(targetbasepath, d), os.path.join(dpath, pkgname))
+                  if addtosearch:
+                    os.environ["JOBOPTSEARCHPATH"] = dpath+":"+os.environ["JOBOPTSEARCHPATH"]
+                    os.environ["DATAPATH"] =os.path.join(targetbasepath, d)+":"+os.environ["DATAPATH"]
+
+            os.environ["JOBOPTSEARCHPATH"] = os.environ['LOCAL_INSTALL_DIR']+":"+os.environ["JOBOPTSEARCHPATH"]
+            os.environ["DATAPATH"] = os.environ['LOCAL_DATA_DIR']+":"+os.environ["DATAPATH"]
+        
+
         ## Handle locating of evgen job options / fragments, either from a tarball or CVMFS
         # read the JO used
         joparam = self._trf.argdict["jobConfig"].value
@@ -180,16 +224,13 @@ def main():
     msg.info("%s stopped at %s, trf exit code %d" % (sys.argv[0], time.asctime(), trf.exitCode))
 
 
-#    if "outputTXTFile" in trf.argdict:
-#      whitelist_out.append('TXT')
-
 # read files/dirs that should be saved and if present in cwd - remove
 
     if (("cleanOut" in trf.argdict) and (trf.argdict["cleanOut"].value!=0)):
 #       print("mamy cleanOut !!!",trf.argdict["cleanOut"].value) 
        whitelist_out = ['log.generate','.root']
        if "outputTXTFile" in trf.argdict:
-          whitelist_out.append('TXT')
+         whitelist_out.append('TXT')
        if "saveList" in trf.argdict:
          saveList_dic= trf.argdict["saveList"].value
          saveList_str= str(saveList_dic)
@@ -213,8 +254,16 @@ def main():
          shutil.rmtree(tmp_dir, ignore_errors=True)
 #    elif firstSaveList!=1:
        elif not saveList[0].isdigit():
-         shutil.rmtree(tmp_dir, ignore_errors=True)  
-
+         shutil.rmtree(tmp_dir, ignore_errors=True)
+# if cleanOut is not defined and multipleinput preset, remove the merged file
+    elif ("inputGeneratorFile" in trf.argdict):
+        myinputfiles = trf.argdict["inputGeneratorFile"].value
+        genInputFiles = myinputfiles.split(',')
+        numberOfFiles = len(genInputFiles)
+        merge_file = 'merged_lhef._0.events'
+        if((numberOfFiles>1) and (os.path.exists(merge_file))):
+           os.remove(merge_file)
+#           
     if (("lheOnly" in trf.argdict ) and (trf.argdict["lheOnly"].value == 1)):
           outputName = ''.join(trf.argdict["outputEVNTFile"].value)
           os.remove(outputName)
diff --git a/Generators/EvgenJobTransforms/share/skeleton.GENtoEVGEN.py b/Generators/EvgenJobTransforms/share/skeleton.GENtoEVGEN.py
index ac90513e3feca7730be3047ebcc4229000f36fc3..5a16b4638818a817b7959692e12bad80b27b07cb 100644
--- a/Generators/EvgenJobTransforms/share/skeleton.GENtoEVGEN.py
+++ b/Generators/EvgenJobTransforms/share/skeleton.GENtoEVGEN.py
@@ -1,4 +1,5 @@
-#  Copyright (C) 2002-2018 CERN for the benefit of the ATLAS collaboration
+#  Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration
+#
 """Functionality core of the Generate_tf transform"""
 
 ##==============================================================
@@ -7,6 +8,7 @@
 
 ## Create sequences for generators, clean-up algs, filters and analyses
 ## and import standard framework objects with standard local scope names
+import ast
 import os, re, string, subprocess
 import AthenaCommon.AlgSequence as acas
 import AthenaCommon.AppMgr as acam
@@ -52,6 +54,10 @@ svcMgr += AtRanluxGenSvc()
 ## Jobs should stop if an include fails.
 jobproperties.AthenaCommonFlags.AllowIgnoreConfigError = False
 
+## Compatibility with jets
+from RecExConfig.RecConfFlags import jobproperties
+jobproperties.RecConfFlags.AllowBackNavigation = True
+
 ## Set up a standard logger
 from AthenaCommon.Logging import logging
 evgenLog = logging.getLogger('Generate')
@@ -259,10 +265,10 @@ if joparts[0].startswith("MC"): #< if this is an "official" JO
         # TODO: add EvtGen to this normalization for MC14?
         return s.replace("Photospp", "").replace("Photos", "").replace("TauolaPP", "").replace("Tauolapp", "").replace("Tauola", "")
     def _norm2(s):
-        return s.replace("Py", "Pythia").replace("MG","MadGraph").replace("Ph","Powheg").replace("Hpp","Herwigpp").replace("H7","Herwig7").replace("Sh","Sherpa").replace("Ag","Alpgen").replace("EG","EvtGen").replace("PG","ParticleGun")
+        return s.replace("Py", "Pythia").replace("MG","MadGraph").replace("Ph","Powheg").replace("Hpp","Herwigpp").replace("H7","Herwig7").replace("Sh","Sherpa").replace("Ag","Alpgen").replace("EG","EvtGen").replace("PG","ParticleGun").replace("Gva","Geneva")
         
     def _short2(s):
-         return s.replace("Pythia","Py").replace("MadGraph","MG").replace("Powheg","Ph").replace("Herwigpp","Hpp").replace("Herwig7","H7").replace("Sherpa","Sh").replace("Alpgen","Ag").replace("EvtGen","EG").replace("PG","ParticleGun")
+         return s.replace("Pythia","Py").replace("MadGraph","MG").replace("Powheg","Ph").replace("Herwigpp","Hpp").replace("Herwig7","H7").replace("Sherpa","Sh").replace("Alpgen","Ag").replace("EvtGen","EG").replace("PG","ParticleGun").replace("Geneva","Gva")
      
 #    if genpart != expectedgenpart and _norm(genpart) != _norm(expectedgenpart) and _norm2(genpart) != expectedgenpart and _norm2(genpart) != _norm(expectedgenpart):
 #        evgenLog.error("Expected first part of JO name to be '%s' or '%s' or '%s', but found '%s'" % (_norm(expectedgenpart), expectedgenpart, _short2(expectedgenpart), genpart))
@@ -290,7 +296,7 @@ if gen_require_steering(gennames):
 
 
 ## Check that the evgenConfig.minevents setting is acceptable
-## minevents defines the production event sizes and must be sufficiently "round"
+## minevents defines the production event sizes and must be sufficiently "round"    
 rounding = 0
 if hasattr(runArgs,'inputGeneratorFile') and ',' in runArgs.inputGeneratorFile:   multiInput = runArgs.inputGeneratorFile.count(',')+1
 else:
@@ -301,39 +307,39 @@ if evgenConfig.minevents < 1:
 else:
     allowed_minevents_lt1000 = [1, 2, 5, 10, 20, 25, 50, 100, 200, 500, 1000]
     msg = "evgenConfig.minevents = %d: " % evgenConfig.minevents
-    if multiInput !=0 :
-        dummy_minevents = evgenConfig.minevents*(multiInput)
-        evgenLog.info('Replacing input minevents '+str(evgenConfig.minevents)+' with calculated '+str(dummy_minevents))
-        evgenConfig.minevents = dummy_minevents
+# introduced due to PRODSYS-788, commented out on 06.07.18 obo Dominic
+#    if multiInput !=0 :
+#        dummy_minevents = evgenConfig.minevents*(multiInput)
+#        evgenLog.info('Replacing input minevents '+str(evgenConfig.minevents)+' with calculated '+str(dummy_minevents))
+#        evgenConfig.minevents = dummy_minevents
 
     if evgenConfig.minevents >= 1000 and evgenConfig.minevents % 1000 != 0:
-        rest1000 = evgenConfig.minevents % 1000
-        if multiInput !=0 :
-            rounding=1
-            if rest1000 < 1000-rest1000:
-                evgenLog.info('Replacing minevents '+str(evgenConfig.minevents)+' with roundeded '+str(evgenConfig.minevents-rest1000))
-                evgenConfig.minevents = evgenConfig.minevents-rest1000
-            else:
-                evgenLog.info('Replacing input minevents '+str(evgenConfig.minevents)+' with calculated '+str(evgenConfig.minevents-rest1000+1000))
-                evgenConfig.minevents = evgenConfig.minevents-rest1000+1000
-        else:    
+# introduced due to PRODSYS-788, commented out on 06.07.18 obo Dominic
+#        rest1000 = evgenConfig.minevents % 1000
+#        if multiInput !=0 :
+#            rounding=1
+#            if rest1000 < 1000-rest1000:
+#                evgenLog.info('Replacing minevents '+str(evgenConfig.minevents)+' with roundeded '+str(evgenConfig.minevents-rest1000))
+#                evgenConfig.minevents = evgenConfig.minevents-rest1000
+#            else:
+#                evgenLog.info('Replacing input minevents '+str(evgenConfig.minevents)+' with calculated '+str(evgenConfig.minevents-rest1000+1000))
+#                evgenConfig.minevents = evgenConfig.minevents-rest1000+1000
+#        else:    
            msg += "minevents in range >= 1000 must be a multiple of 1000"
            raise RuntimeError(msg)
     elif evgenConfig.minevents < 1000 and evgenConfig.minevents not in allowed_minevents_lt1000:
-        if multiInput !=0:
-           rounding=1
-#           minimum_list = [abs(variable - evgenConfig.minevents) for variable in allowed_minevents_lt1000]
-#           from operator import itemgetter
-#           evgenLog.info("Minimum list: %s" % minimum_list)
-#           evgenLog.info("index of the min. value: " + str(min(enumerate(minimum_list), key=itemgetter(1))[0]) + " and the value is: " + str(allowed_minevents_lt1000[min(enumerate(minimum_list), key=itemgetter(1))[0]]))
-           round_minevents=min(allowed_minevents_lt1000,key=lambda x:abs(x-evgenConfig.minevents))
-           evgenLog.info('Replacing minevents lt 1000 '+str(evgenConfig.minevents)+' with rounded '+str(round_minevents))
-           evgenConfig.minevents=round_minevents
-        else:
+# introduced due to PRODSYS-788, commented out on 06.07.18 obo Dominic
+#        if multiInput !=0:
+#           rounding=1
+#           round_minevents=min(allowed_minevents_lt1000,key=lambda x:abs(x-evgenConfig.minevents))
+#           evgenLog.info('Replacing minevents lt 1000 '+str(evgenConfig.minevents)+' with rounded '+str(round_minevents))
+#           evgenConfig.minevents=round_minevents
+#        else:
            msg += "minevents in range <= 1000 must be one of %s" % allowed_minevents_lt1000
            raise RuntimeError(msg)
 #    else:
-    postSeq.CountHepMC.RequestedOutput = evgenConfig.minevents if runArgs.maxEvents == -1 or rounding==1 else runArgs.maxEvents
+#    postSeq.CountHepMC.RequestedOutput = evgenConfig.minevents if runArgs.maxEvents == -1 or rounding==1 else runArgs.maxEvents
+    postSeq.CountHepMC.RequestedOutput = evgenConfig.minevents if runArgs.maxEvents == -1  else runArgs.maxEvents
     evgenLog.info('Requested output events '+str(postSeq.CountHepMC.RequestedOutput))
 
 ## Check that the keywords are in the list of allowed words (and exit if processing an official JO)
@@ -368,6 +374,51 @@ if evgenConfig.keywords:
     else:
         evgenLog.warning("Could not find evgenkeywords.txt file %s in $JOBOPTSEARCHPATH" % kwfile)
 
+## Check that the L1 and L2 keywords pairs are in the list of allowed words pairs (and exit if processing an official JO)
+if evgenConfig.categories:
+    ## Get the allowed categories file from the JO package if possibe
+    # TODO: Make the package name configurable
+    lkwfile = "MC15JobOptions/CategoryList.txt"
+    lkwpath = None
+    for p in os.environ["JOBOPTSEARCHPATH"].split(":"):
+        lkwpath = os.path.join(p, lkwfile)
+        if os.path.exists(lkwpath):
+            break
+        lkwpath = None
+## Load the allowed categories names from the file
+    allowed_cat = []
+    if lkwpath:
+        with open(lkwpath, 'r') as catlist:
+            for line in catlist:
+               allowed_list = ast.literal_eval(line)
+               allowed_cat.append(allowed_list)
+# Print allowed categories and categories read from the JOs
+#            print "allowed categories", allowed_list
+#            print "evgenConfig.categories", evgenConfig.categories
+
+        ## Check the JO categories against the allowed ones
+        bad_cat =[]
+        it = iter(evgenConfig.categories)
+        for x in it:
+           l1 = x
+           l2 = next(it)
+           if "L1:" in l2 and "L2:" in l1:
+               l1, l2 = l2, l1
+           print "first",l1,"second",l2
+           bad_cat.extend([l1, l2])
+           for a1,a2 in allowed_cat:
+#               print "a1 ",a1,"l1 ",l1, "a2 ",a2,"l2 ",l2
+               if l1.strip().lower()==a1.strip().lower() and l2.strip().lower()==a2.strip().lower():
+                 bad_cat=[]
+           if bad_cat:
+               msg = "evgenConfig.categories contains non-standard category: %s. " % ", ".join(bad_cat)
+               msg += "Please check the allowed categories list and fix."
+               evgenLog.error(msg)
+               if officialJO:
+                   sys.exit(1)
+    else:
+        evgenLog.warning("Could not find CategoryList.txt file %s in $JOBOPTSEARCHPATH" % lkwfile)
+
 ## Configure and schedule jet finding algorithms
 ## NOTE: This generates algorithms for jet containers defined in the user's JO fragment
 if evgenConfig.findJets:
@@ -662,12 +713,14 @@ if _checkattr("description", required=True):
         msg += " " + evgenConfig.notes
     print "MetaData: %s = %s" % ("physicsComment", msg)
 if _checkattr("generators", required=True):
+#    print "MetaData: %s = %s" % ("generatorName", "+".join(gennames))
     gennamesvers=[]
     for item in gennames:
        genera = item.upper()
        generat = genera+"VER"
        if (generat in os.environ):
            gennamesvers.append(item+"(v."+os.environ[generat]+")")
+#           gennamesvers.append(item+"."+os.environ[generat])
        else:
            gennamesvers.append(item)
     print "MetaData: %s = %s" % ("generatorName", "+".join(gennamesvers))    
@@ -681,6 +734,8 @@ if _checkattr("softPDF"):
     print "MetaData: %s = %s" % ("softPDF", evgenConfig.softPDF)
 if _checkattr("keywords"):
     print "MetaData: %s = %s" % ("keywords", ", ".join(evgenConfig.keywords).lower())      
+if _checkattr("categories"):
+    print "MetaData: %s = %s" % ("categories", ", ".join(evgenConfig.categories))
 if _checkattr("specialConfig"):
    print "MetaData: %s = %s" % ("specialConfig", evgenConfig.specialConfig)
 # TODO: Require that a contact / JO author is always set
diff --git a/Generators/EvgenJobTransforms/test/test_epos.sh b/Generators/EvgenJobTransforms/test/test_epos.sh
index a3a6bffd1fb58cc86edd552cca45d973c5500138..c5ee969f32e43aa1f80c49ae266f8a90aeb04c2a 100755
--- a/Generators/EvgenJobTransforms/test/test_epos.sh
+++ b/Generators/EvgenJobTransforms/test/test_epos.sh
@@ -10,7 +10,7 @@ Generate_tf.py --ecmEnergy=8000 --runNumber=129080 --maxEvents=10 \
     --jobConfig=/cvmfs/atlas.cern.ch/repo/sw/Generators/MC14JobOptions/latest/share/tests/MC14.129080.Epos_minbias_inelastic.py  \
     --outputEVNTFile=test_epos_minbias_inelastic.EVNT.pool.root \
 
-rm -fr _joproxy14
 echo "art-result: $? generate"
+rm -fr _joproxy14
 
 
diff --git a/Generators/EvgenJobTransforms/test/test_herwig7_minbias.sh b/Generators/EvgenJobTransforms/test/test_herwig7_minbias.sh
index 3479c3ec21a4c9b58d982df5887c7811e2ad13f6..c259cd21096442d8c3edc500bb5dc831a14cb3f0 100755
--- a/Generators/EvgenJobTransforms/test/test_herwig7_minbias.sh
+++ b/Generators/EvgenJobTransforms/test/test_herwig7_minbias.sh
@@ -10,8 +10,10 @@ Generate_tf.py --ecmEnergy=13000 --runNumber=429700 --maxEvents=10 \
     --jobConfig=/cvmfs/atlas.cern.ch/repo/sw/Generators/MC15JobOptions/latest/share/DSID429xxx/MC15.429700.Herwig7_MinBias.py  \
     --outputEVNTFile=test_herwig7_minbias_inelastic.EVNT.pool.root \
 
+echo "art-result: $? generate"
+
 rm -rf _joproxy15
    
-echo "art-result: $? generate"
+
 
 
diff --git a/Generators/EvgenJobTransforms/test/test_herwig7_zjets.sh b/Generators/EvgenJobTransforms/test/test_herwig7_zjets.sh
index 42bfeb4c989b00ebeefbd2cfe51908941f72e638..654b4d7d94433df26123d396de7d4c876a6acdb2 100755
--- a/Generators/EvgenJobTransforms/test/test_herwig7_zjets.sh
+++ b/Generators/EvgenJobTransforms/test/test_herwig7_zjets.sh
@@ -10,7 +10,8 @@ Generate_tf.py --ecmEnergy=13000 --runNumber=429721 --maxEvents=10 \
     --jobConfig=/cvmfs/atlas.cern.ch/repo/sw/Generators/MC15JobOptions/latest/share/DSID429xxx/MC15.429721.Herwig7_H7UE_MMHT2014lo68cl_Zjets.py  \
     --outputEVNTFile=test_herwig7_zjets_inelastic.EVNT.pool.root \
 
+echo "art-result: $? generate"
 rm -fr _joproxy15
 
-echo "art-result: $? generate"
+
 
diff --git a/Generators/EvgenJobTransforms/test/test_herwig7dijet.sh b/Generators/EvgenJobTransforms/test/test_herwig7dijet.sh
index b775582946b3d9103e2caa0275a5eed1f2e0e6f0..7e2a77756b3c45a1aeee108660dfd3a06af6ce26 100755
--- a/Generators/EvgenJobTransforms/test/test_herwig7dijet.sh
+++ b/Generators/EvgenJobTransforms/test/test_herwig7dijet.sh
@@ -10,6 +10,7 @@ Generate_tf.py --ecmEnergy=13000 --runNumber=429699 --maxEvents=10 \
     --jobConfig=/cvmfs/atlas.cern.ch/repo/sw/Generators/MC15JobOptions/latest/share/DSID429xxx/MC15.429699.Herwig7_Dijet.py  \
     --outputEVNTFile=test_herwig7_dijet.EVNT.pool.root \
 
+echo "art-result: $? generate"
 rm -fr _joproxy15
 
-echo "art-result: $? generate"
+
diff --git a/Generators/EvgenJobTransforms/test/test_mgpythia8_Zmumu.sh b/Generators/EvgenJobTransforms/test/test_mgpythia8_Zmumu.sh
index 49127b78300bd79f3545460ff4067a32ca2ad12e..d5519127aaa217d8558625e3f04dd3fffef5bf5b 100755
--- a/Generators/EvgenJobTransforms/test/test_mgpythia8_Zmumu.sh
+++ b/Generators/EvgenJobTransforms/test/test_mgpythia8_Zmumu.sh
@@ -12,6 +12,7 @@ Generate_tf.py --ecmEnergy=13000 --runNumber=361505 --maxEvents=10 \
     --jobConfig=/cvmfs/atlas.cern.ch/repo/sw/Generators/MC15JobOptions/latest/share/DSID361xxx/MC15.361505.MadGraphPythia8EvtGen_A14NNPDF23LO_Zmumu_Np0.py \
     --outputEVNTFile=test_mgpythia8_Zmumu.EVNT.pool.root \
 
+echo "art-result: $? generate"
 rm -fr _joproxy15
 
-echo "art-result: $? generate"
+
diff --git a/Generators/EvgenJobTransforms/test/test_mgpythia8_ttW.sh b/Generators/EvgenJobTransforms/test/test_mgpythia8_ttW.sh
index 462325c94fd3178e05f60505b456a37053ed45ca..6e8d90c6576feef7e487abff897ff4d3d154f73d 100755
--- a/Generators/EvgenJobTransforms/test/test_mgpythia8_ttW.sh
+++ b/Generators/EvgenJobTransforms/test/test_mgpythia8_ttW.sh
@@ -12,6 +12,7 @@ Generate_tf.py --ecmEnergy=13000 --runNumber=410066 --maxEvents=10 \
     --jobConfig=/cvmfs/atlas.cern.ch/repo/sw/Generators/MC15JobOptions/latest/share/DSID410xxx/MC15.410066.MadGraphPythia8EvtGen_A14NNPDF23LO_ttW_Np0.py \
     --outputEVNTFile=test_mgpythia8_ttW.EVNT.pool.root \
 
+echo "art-result: $? generate"
 rm -fr _joproxy15
 
-echo "art-result: $? generate"
+
diff --git a/Generators/EvgenJobTransforms/test/test_ph8TauolappEG_ztautau.sh b/Generators/EvgenJobTransforms/test/test_ph8TauolappEG_ztautau.sh
index e0e3926adfeb20afd32704fca4bb19ec6ab399b7..ea89e0a0e8c2216e5641882cdd2f946a231d7dd2 100755
--- a/Generators/EvgenJobTransforms/test/test_ph8TauolappEG_ztautau.sh
+++ b/Generators/EvgenJobTransforms/test/test_ph8TauolappEG_ztautau.sh
@@ -11,9 +11,10 @@ Generate_tf.py --ecmEnergy=13000 --runNumber=429697 --maxEvents=10 \
     --jobConfig=/cvmfs/atlas.cern.ch/repo/sw/Generators/MC15JobOptions/latest/share/DSID429xxx/MC15.429697.Pythia8EvtGen_A14NNPDF23LO_DYtautau_120M180.py  \
     --outputEVNTFile=test_DYZtautau.EVNT.pool.root \
 
+echo "art-result: $? generate"
 rm -fr _joproxy15
     
-echo "art-result: $? generate"
+
 
 
 
diff --git a/Generators/EvgenJobTransforms/test/test_powheg_pythia_evtgen_wt.sh b/Generators/EvgenJobTransforms/test/test_powheg_pythia_evtgen_wt.sh
index de48d7830d97081f088d05c0b2aba963a4fb94b7..a0e2bde15a5331b7a667d1e8281a237b52cefb04 100755
--- a/Generators/EvgenJobTransforms/test/test_powheg_pythia_evtgen_wt.sh
+++ b/Generators/EvgenJobTransforms/test/test_powheg_pythia_evtgen_wt.sh
@@ -11,8 +11,9 @@ Generate_tf.py --ecmEnergy=13000 --runNumber=410013 --maxEvents=10 \
     --jobConfig=/cvmfs/atlas.cern.ch/repo/sw/Generators/MC15JobOptions/latest/share/DSID410xxx/MC15.410013.PowhegPythiaEvtGen_P2012_Wt_inclusive_top.py  --steering=afterburn \
     --outputEVNTFile=test_powheg_wt_inelastic.EVNT.pool.root \
 
+echo "art-result: $? generate"
 rm -fr _joproxy15
 
-echo "art-result: $? generate"
+
 
 
diff --git a/Generators/EvgenJobTransforms/test/test_powheg_ttbar.sh b/Generators/EvgenJobTransforms/test/test_powheg_ttbar.sh
index 984a7ef414e3204071825adc61fed297a90abb51..b198c13b2640f6e83c7bf048a6465db85de27d56 100755
--- a/Generators/EvgenJobTransforms/test/test_powheg_ttbar.sh
+++ b/Generators/EvgenJobTransforms/test/test_powheg_ttbar.sh
@@ -10,7 +10,8 @@ Generate_tf.py --ecmEnergy=13000 --runNumber=410006 --maxEvents=10 \
     --jobConfig=/cvmfs/atlas.cern.ch/repo/sw/Generators/MC15JobOptions/latest/share/DSID410xxx/MC15.410006.PowhegPythia8EvtGen_A14_ttbar_hdamp172p5_nonallhad.py  \
     --outputEVNTFile=test_powheg_ttbar.EVNT.pool.root \
 
+echo "art-result: $? generate"
 rm -fr _joproxy15
     
-echo "art-result: $? generate"
+
 
diff --git a/Generators/EvgenJobTransforms/test/test_powheg_wenu.sh b/Generators/EvgenJobTransforms/test/test_powheg_wenu.sh
index 63b45185daed0a38196c86a1b0a638828f27a146..7e882608d1ce2a7ca099274c4bf7eea0479d4eb6 100755
--- a/Generators/EvgenJobTransforms/test/test_powheg_wenu.sh
+++ b/Generators/EvgenJobTransforms/test/test_powheg_wenu.sh
@@ -11,8 +11,9 @@ Generate_tf.py --ecmEnergy=13000 --runNumber=361100 --maxEvents=10 \
     --jobConfig=/cvmfs/atlas.cern.ch/repo/sw/Generators/MC15JobOptions/latest/share/DSID361xxx/MC15.361100.PowhegPythia8EvtGen_AZNLOCTEQ6L1_Wplusenu.py  \
     --outputEVNTFile=test_powheg_wenu_inelastic.EVNT.pool.root \
 
+echo "art-result: $? generate"
 rm -fr _joproxy15
 
-echo "art-result: $? generate"
+
 
 
diff --git a/Generators/EvgenJobTransforms/test/test_powhegpy8TauolaPPEG.sh b/Generators/EvgenJobTransforms/test/test_powhegpy8TauolaPPEG.sh
index 716fbc5e7a68a9e5913655f54a717aff95cee981..853754d3b010899146650035ae2c59e2622176d9 100755
--- a/Generators/EvgenJobTransforms/test/test_powhegpy8TauolaPPEG.sh
+++ b/Generators/EvgenJobTransforms/test/test_powhegpy8TauolaPPEG.sh
@@ -10,8 +10,9 @@ Generate_tf.py --ecmEnergy=13000 --runNumber=429696 --maxEvents=10 \
     --jobConfig=/cvmfs/atlas.cern.ch/repo/sw/Generators/MC15JobOptions/latest/share/DSID429xxx/MC15.429696.PowhegPythia8EvtGen_AZNLOCTEQ6L1_Ztautau.py \
     --outputEVNTFile=test_JZ0_evtgen.EVNT.pool.root \
 
+echo "art-result: $? generate"
 rm -fr _joproxy15
 
-echo "art-result: $? generate"
+
 
 
diff --git a/Generators/EvgenJobTransforms/test/test_pythia8_minbias.sh b/Generators/EvgenJobTransforms/test/test_pythia8_minbias.sh
index 97cb2f038729d5a43ea5d4b89576d1eb73d36883..fbb307c70cc6846405444a2c3214ae390597c2fc 100755
--- a/Generators/EvgenJobTransforms/test/test_pythia8_minbias.sh
+++ b/Generators/EvgenJobTransforms/test/test_pythia8_minbias.sh
@@ -13,7 +13,7 @@ Generate_tf.py --ecmEnergy=13000 --runNumber=361033 --maxEvents=10 \
     --jobConfig=/cvmfs/atlas.cern.ch/repo/sw/Generators/MC15JobOptions/latest/share/DSID361xxx/MC15.361033.Pythia8EvtGen_A2MSTW2008LO_minbias_inelastic.py \
     --outputEVNTFile=test_minbias_inelastic.EVNT.pool.root \
 
+echo "art-result: $? generate"
 rm -fr _joproxy15
    
-echo "art-result: $? generate"
 #rm -fr MC15.361033.Pythia8EvtGen_A2MSTW2008LO_minbias_inelastic.py
diff --git a/Generators/EvgenJobTransforms/test/test_pythia8_minbias_high.sh b/Generators/EvgenJobTransforms/test/test_pythia8_minbias_high.sh
index e9803e5a0e32887b3b0b09dcf5dd8cbe9d8d1e42..11775b422bff5879b1d5faeccbd50699b228d029 100755
--- a/Generators/EvgenJobTransforms/test/test_pythia8_minbias_high.sh
+++ b/Generators/EvgenJobTransforms/test/test_pythia8_minbias_high.sh
@@ -11,8 +11,8 @@ Generate_tf.py --ecmEnergy=13000 --runNumber=361035 --maxEvents=10 \
     --jobConfig=/cvmfs/atlas.cern.ch/repo/sw/Generators/MC15JobOptions/latest/share/DSID361xxx/MC15.361035.Pythia8EvtGen_A2MSTW2008LO_minbias_inelastic_high.py \
     --outputEVNTFile=test_minbias_high.EVNT.pool.root \
 
+echo "art-result: $? generate"
 rm -fr _joproxy15
 
-echo "art-result: $? generate"
 
 
diff --git a/Generators/EvgenJobTransforms/test/test_pythia8_powheg.sh b/Generators/EvgenJobTransforms/test/test_pythia8_powheg.sh
index 454392130913db0ec19619977194dc9b03eedc46..f779c3fbd9937f243718e8c8b80857fb488075fa 100755
--- a/Generators/EvgenJobTransforms/test/test_pythia8_powheg.sh
+++ b/Generators/EvgenJobTransforms/test/test_pythia8_powheg.sh
@@ -12,6 +12,7 @@ Generate_tf.py --ecmEnergy=8000 --runNumber=429695 --maxEvents=10 \
     --inputGeneratorFile=/afs/cern.ch/atlas/offline/ProdData/17.2.X/group.phys-gener.Powheg_CT10.147800.Wplusenu_8TeV.TXT.mc12_v2._00001.tar.gz \
     --outputEVNTFile=test_powhegpythia8_Wpluswnu.EVNT.pool.root \
 
+echo "art-result: $? generate"
 rm -fr _joproxy15
 
-echo "art-result: $? generate"    
+    
diff --git a/Generators/EvgenJobTransforms/test/test_pythia8_ztautau.sh b/Generators/EvgenJobTransforms/test/test_pythia8_ztautau.sh
index 8d3df7798e766c3da2c9a0c28aeb5fdd569d4354..f92b789b71886be9edc5ead8f8fe986aacab51ce 100755
--- a/Generators/EvgenJobTransforms/test/test_pythia8_ztautau.sh
+++ b/Generators/EvgenJobTransforms/test/test_pythia8_ztautau.sh
@@ -11,6 +11,7 @@ Generate_tf.py --ecmEnergy=13000 --runNumber=429708 --maxEvents=10 \
     --jobConfig=/afs/cern.ch/atlas/groups/Generators/MC15JobOptions/latest/share/DSID429xxx/MC15.429708.Pythia8EvtGen_A14NNPDF23LO_Ztautau.py  \
     --outputEVNTFile=test_Ztautau.EVNT.pool.root \
 
+echo "art-result: $? generate"
 rm -fr _joproxy15
 
-echo "art-result: $? generate"
+
diff --git a/Generators/EvgenJobTransforms/test/test_qgsjet.sh b/Generators/EvgenJobTransforms/test/test_qgsjet.sh
index ba3a92119617062e6bc59357c1752baa9cb5cc7e..1d5351637504954a8d9984ba121f8c8ab47fc20a 100755
--- a/Generators/EvgenJobTransforms/test/test_qgsjet.sh
+++ b/Generators/EvgenJobTransforms/test/test_qgsjet.sh
@@ -11,8 +11,9 @@ Generate_tf.py --ecmEnergy=13000 --runNumber=361235 --maxEvents=10 \
     --jobConfig=/cvmfs/atlas.cern.ch/repo/sw/Generators/MC15JobOptions/latest/share/DSID361xxx/MC15.361235.QGSJet_minbias_inelastic.py  \
     --outputEVNTFile=test_qgsjet_minbias_inelastic.EVNT.pool.root \
 
+echo "art-result: $? generate"
 rm -fr _joproxy15
 
-echo "art-result: $? generate"
+
 
 
diff --git a/Generators/EvgenJobTransforms/test/test_sherpa_dy.sh b/Generators/EvgenJobTransforms/test/test_sherpa_dy.sh
index 3b810e17c3cbf03b1592da24ca38b1c4cb2760a9..bca75324e4826081ddfeadee0dfa9ee404d58843 100755
--- a/Generators/EvgenJobTransforms/test/test_sherpa_dy.sh
+++ b/Generators/EvgenJobTransforms/test/test_sherpa_dy.sh
@@ -11,7 +11,8 @@ Generate_tf.py --ecmEnergy=13000 --runNumber=191919 --maxEvents=10 \
     --jobConfig=/afs/cern.ch/atlas/groups/Generators/MC14JobOptions/latest/share/tests/MC14.191919.Sherpa_NNPDF30NNLO_DrellYan.py  \
     --outputEVNTFile=test_sherpa_dy_inelastic.EVNT.pool.root \
 
+echo "art-result: $? generate"
 rm -fr _joproxy14
 
-echo "art-result: $? generate"
+
 
diff --git a/Generators/EvgenJobTransforms/test/test_single.sh b/Generators/EvgenJobTransforms/test/test_single.sh
index ee298704f4441defe128453172c04153289b37e2..b5f4eb07153e061622deb253af47de4bb596404d 100755
--- a/Generators/EvgenJobTransforms/test/test_single.sh
+++ b/Generators/EvgenJobTransforms/test/test_single.sh
@@ -11,9 +11,10 @@ Generate_tf.py --ecmEnergy=8000 --runNumber=999999 --maxEvents=10 \
     --jobConfig=/afs/cern.ch/atlas/groups/Generators/MC14JobOptions/latest/share/tests/MC14.999999.ParticleGun_single_nu.py \
     --outputEVNTFile=test_single_nu.EVNT.pool.root \
 
+echo "art-result: $? generate"
 rm -fr _joproxy14
 
-echo "art-result: $? generate"
+
 
 
 
diff --git a/Generators/EvtGen_i/CMakeLists.txt b/Generators/EvtGen_i/CMakeLists.txt
index cbe2d6dd5114effed937920b7ec412ec1a2a2aff..21e1f4b07ed6cd50fa868cd80af9ad78eba799e6 100644
--- a/Generators/EvtGen_i/CMakeLists.txt
+++ b/Generators/EvtGen_i/CMakeLists.txt
@@ -67,3 +67,8 @@ atlas_add_component( EvtGen_i
 atlas_install_joboptions( share/*.py )
 atlas_install_runtime( share/*.DEC share/*.table share/*.dec share/*.pdt share/*.dat )
 
+set( EvtGenEnvironment_DIR ${CMAKE_CURRENT_SOURCE_DIR}
+   CACHE PATH "Location of EvtGenEnvironment.cmake" )
+find_package( EvtGenEnvironment )
+
+
diff --git a/Generators/EvtGen_i/EvtGenEnvironmentConfig.cmake b/Generators/EvtGen_i/EvtGenEnvironmentConfig.cmake
new file mode 100644
index 0000000000000000000000000000000000000000..1459ce76c9163ca2101f9f3dcdae1ef44634faf7
--- /dev/null
+++ b/Generators/EvtGen_i/EvtGenEnvironmentConfig.cmake
@@ -0,0 +1,18 @@
+# Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration
+#
+# This module is used to set up the environment for EvtGen
+# 
+#
+
+# Set the environment variable(s):
+find_package( EvtGen )
+
+if( EVTGEN_FOUND )
+  set( EVTGENENVIRONMENT_ENVIRONMENT 
+        FORCESET EVTGENVER ${EVTGEN_VERSION} )
+endif()
+
+# Silently declare the module found:
+set( EVTGENENVIRONMENT_FOUND TRUE )
+
+
diff --git a/Generators/Herwig7_i/Herwig7EnvironmentConfig.cmake b/Generators/Herwig7_i/Herwig7EnvironmentConfig.cmake
index 0752df9a193f19330af1ea57dd5645254ae3c7bb..8cc592826481d8242f7dad132827f81f4088e7b7 100644
--- a/Generators/Herwig7_i/Herwig7EnvironmentConfig.cmake
+++ b/Generators/Herwig7_i/Herwig7EnvironmentConfig.cmake
@@ -1,4 +1,4 @@
-# Copyright (C) 2002-2018 CERN for the benefit of the ATLAS collaboration
+# Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration
 #
 # This module is used to set up the environment for Herwig7
 # 
@@ -6,11 +6,14 @@
 
 # Set the environment variable(s):
 find_package( Herwig3 )
+find_package ( ThePEG )
 
-if( HERWIG3_FOUND )
+if( HERWIG3_FOUND AND THEPEG_FOUND )
   get_filename_component( _herwig3Path "${HERWIG3_ROOT}" DIRECTORY )
   set( HERWIG7ENVIRONMENT_ENVIRONMENT 
-        FORCESET HERWIG7_PATH ${_herwig3Path}/${LCG_PLATFORM} )
+        FORCESET HERWIG7_PATH ${_herwig3Path}/${LCG_PLATFORM}
+        FORCESET HERWIG7VER ${HERWIG3_VERSION} 
+        FORCESET THEPEGVER ${THEPEG_VERSION})
   unset( _herwig3Path )
 endif()
 
diff --git a/Generators/MadGraphControl/MadGraphControlEnvironmentConfig.cmake b/Generators/MadGraphControl/MadGraphControlEnvironmentConfig.cmake
index 82479e593d3c68b0cb18c595a4c6a0329bdd9a44..fb5c7a7f8658d1fe99f864181fa1bc0e4bb7cbba 100644
--- a/Generators/MadGraphControl/MadGraphControlEnvironmentConfig.cmake
+++ b/Generators/MadGraphControl/MadGraphControlEnvironmentConfig.cmake
@@ -7,10 +7,11 @@
 # Set the environment variable(s):
 find_package( FastJet )
 
-if( FASTJET_FOUND )
+if( FASTJET_FOUND AND MADGRAPH_FOUND )
   get_filename_component( _fastjetPath "${FASTJET_INCLUDE_DIR}" DIRECTORY )
   set( MADGRAPHCONTROLENVIRONMENT_ENVIRONMENT 
-     FORCESET FASTJETPATH ${_fastjetPath} )
+     FORCESET FASTJETPATH ${_fastjetPath} 
+     FORCESET MADGRAPHVER ${MADGRAPH5AMC_VERSION})
   unset( _fastjetPath )
 endif()
 
diff --git a/Generators/Photospp_i/CMakeLists.txt b/Generators/Photospp_i/CMakeLists.txt
index 4544311cea3bbaa2ed079b5722c3efa7848ae674..9cfc34b30ed4fdc0b0c208313187e739428aa8c4 100644
--- a/Generators/Photospp_i/CMakeLists.txt
+++ b/Generators/Photospp_i/CMakeLists.txt
@@ -44,3 +44,7 @@ atlas_add_component( Photospp_i
 # Install files from the package:
 atlas_install_joboptions( share/*.py )
 
+set( PhotosppEnvironment_DIR ${CMAKE_CURRENT_SOURCE_DIR}
+   CACHE PATH "Location of PhotosppEnvironment.cmake" )
+find_package( PhotosppEnvironment )
+
diff --git a/Generators/Photospp_i/PhotosppEnvironmentConfig.cmake b/Generators/Photospp_i/PhotosppEnvironmentConfig.cmake
new file mode 100644
index 0000000000000000000000000000000000000000..f561d30d1efe43d860999050c05d62c3374b0cf2
--- /dev/null
+++ b/Generators/Photospp_i/PhotosppEnvironmentConfig.cmake
@@ -0,0 +1,17 @@
+# Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration
+#
+# This module is used to set up the environment for Photospp
+# 
+#
+
+# Set the environment variable(s):
+find_package( Photospp )
+
+if( PHOTOSPP_FOUND )
+  set( PHOTOSPPENVIRONMENT_ENVIRONMENT 
+        FORCESET PHOTOSPPVER ${PHOTOSPP_VERSION})
+endif()
+
+# Silently declare the module found:
+set( PHOTOSPPENVIRONMENT_FOUND TRUE )
+
diff --git a/Generators/Pythia8_i/CMakeLists.txt b/Generators/Pythia8_i/CMakeLists.txt
index f5699dc3b16a61c3d02c050bbdba38330269165a..3ba9a3724b04db54c20845622497b94f55a67da2 100644
--- a/Generators/Pythia8_i/CMakeLists.txt
+++ b/Generators/Pythia8_i/CMakeLists.txt
@@ -75,3 +75,6 @@ atlas_add_component( Pythia8_i
 # Install files from the package:
 atlas_install_joboptions( share/*.py )
 
+set( Pythia8Environment_DIR ${CMAKE_CURRENT_SOURCE_DIR}
+   CACHE PATH "Location of Pythia8Environment.cmake" )
+find_package( Pythia8Environment )
diff --git a/Generators/Pythia8_i/Pythia8EnvironmentConfig.cmake b/Generators/Pythia8_i/Pythia8EnvironmentConfig.cmake
new file mode 100644
index 0000000000000000000000000000000000000000..3cd161210343ce00eb8f69418bc39ad9d3d7d58d
--- /dev/null
+++ b/Generators/Pythia8_i/Pythia8EnvironmentConfig.cmake
@@ -0,0 +1,19 @@
+# Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration
+#
+# This module is used to set up the environment for Pythia8
+# 
+#
+
+# Set the environment variable(s):
+find_package( Pythia8 )
+find_package( Lhapdf )
+
+if( PYTHIA8_FOUND AND LHAPDF_FOUND )
+  set( PYTHIA8ENVIRONMENT_ENVIRONMENT 
+        FORCESET PYTHIA8VER ${PYTHIA8_VERSION}
+        FORCESET LHAPDFVER ${LHAPDF_VERSION} )
+endif()
+
+# Silently declare the module found:
+set( PYTHIA8ENVIRONMENT_FOUND TRUE )
+
diff --git a/Generators/QGSJet_i/CMakeLists.txt b/Generators/QGSJet_i/CMakeLists.txt
index 26c660914d307ba56b28104961172b2904453601..4f52c3a7b0498b05a21c5aac519eb6b5ba66333b 100644
--- a/Generators/QGSJet_i/CMakeLists.txt
+++ b/Generators/QGSJet_i/CMakeLists.txt
@@ -42,3 +42,6 @@ atlas_add_component( QGSJet_i
 # Install files from the package:
 atlas_install_runtime( share/qgsjet_crmc.param )
 
+set( QGSJetEnvironment_DIR ${CMAKE_CURRENT_SOURCE_DIR}
+   CACHE PATH "Location of QGSJetEnvironment.cmake" )
+find_package( QGSJetEnvironment )
diff --git a/Generators/QGSJet_i/QGSJetEnvironmentConfig.cmake b/Generators/QGSJet_i/QGSJetEnvironmentConfig.cmake
new file mode 100644
index 0000000000000000000000000000000000000000..6aea6aaa23f19bfce20391fcff2a69906d9670a4
--- /dev/null
+++ b/Generators/QGSJet_i/QGSJetEnvironmentConfig.cmake
@@ -0,0 +1,18 @@
+# Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration
+#
+# This module is used to set up the environment for QGSJet
+# 
+#
+
+# Set the environment variable(s):
+find_package( CRMC )
+
+if( CRMC_FOUND  )
+  set( QGSJETENVIRONMENT_ENVIRONMENT 
+        FORCESET QGSJETVER ${CRMC_VERSION} )
+endif()
+
+# Silently declare the module found:
+set( QGSJETENVIRONMENT_FOUND TRUE )
+
+
diff --git a/Generators/Rivet_i/CMakeLists.txt b/Generators/Rivet_i/CMakeLists.txt
index c018ff34c60f1fe4c889e9b8048e03cc51428d23..892ad2bc958113261bb121679f80631970167890 100644
--- a/Generators/Rivet_i/CMakeLists.txt
+++ b/Generators/Rivet_i/CMakeLists.txt
@@ -40,3 +40,6 @@ atlas_add_component( Rivet_i
                      INCLUDE_DIRS ${Boost_INCLUDE_DIRS} ${ROOT_INCLUDE_DIRS} ${HEPMC_INCLUDE_DIRS} ${YODA_INCLUDE_DIRS} ${FASTJET_INCLUDE_DIRS} ${RIVET_INCLUDE_DIRS} ${GSL_INCLUDE_DIRS}
                      LINK_LIBRARIES ${Boost_LIBRARIES} ${GSL_LIBRARIES} ${ROOT_LIBRARIES} ${HEPMC_LIBRARIES} ${YODA_LIBRARIES} ${FASTJET_LIBRARIES} ${RIVET_LIBRARIES} AthenaBaseComps GaudiKernel AthenaKernel GeneratorObjects PathResolver Rivet_iLib )
 
+set( RivetEnvironment_DIR ${CMAKE_CURRENT_SOURCE_DIR}
+   CACHE PATH "Location of RivetEnvironment.cmake" )
+find_package( RivetEnvironment )
diff --git a/Generators/Rivet_i/RivetEnvironmentConfig.cmake b/Generators/Rivet_i/RivetEnvironmentConfig.cmake
new file mode 100644
index 0000000000000000000000000000000000000000..044de29ec62e41b70af3dfae2b0fa6cf11052311
--- /dev/null
+++ b/Generators/Rivet_i/RivetEnvironmentConfig.cmake
@@ -0,0 +1,20 @@
+# Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration
+#
+# This module is used to set up the environment for Rivet
+# 
+#
+
+# Set the environment variable(s):
+find_package( Rivet )
+find_package( Yoda )
+
+if( RIVET_FOUND AND YODA_FOUND )
+  set( RIVETENVIRONMENT_ENVIRONMENT 
+        FORCESET RIVETVER ${RIVET_VERSION} 
+        FORCESET YODAVER ${YODA_VERSION})
+endif()
+
+# Silently declare the module found:
+set( RIVETENVIRONMENT_FOUND TRUE )
+
+
diff --git a/Generators/Sherpa_i/CMakeLists.txt b/Generators/Sherpa_i/CMakeLists.txt
index d90d8d3dfdbcee489ddb60ecde222c1fc55270f5..3daccaa57a25f3d9d3c343622cd2c088d208b9c3 100644
--- a/Generators/Sherpa_i/CMakeLists.txt
+++ b/Generators/Sherpa_i/CMakeLists.txt
@@ -39,3 +39,7 @@ atlas_add_component( Sherpa_i
 add_definitions(-DSHERPA_ROOT="${SHERPA_ROOT}")
 
 atlas_install_joboptions( share/common/*.py )
+
+set( SherpaEnvironment_DIR ${CMAKE_CURRENT_SOURCE_DIR}
+   CACHE PATH "Location of SherpaEnvironment.cmake" )
+find_package( SherpaEnvironment )
diff --git a/Generators/Sherpa_i/SherpaEnvironmentConfig.cmake b/Generators/Sherpa_i/SherpaEnvironmentConfig.cmake
new file mode 100644
index 0000000000000000000000000000000000000000..e493adf490a29fe3e5d78d404a5ce0c2a63adeab
--- /dev/null
+++ b/Generators/Sherpa_i/SherpaEnvironmentConfig.cmake
@@ -0,0 +1,18 @@
+# Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration
+#
+# This module is used to set up the environment for Sherpa
+# 
+#
+
+# Set the environment variable(s):
+find_package( Sherpa )
+
+if( SHERPA_FOUND )
+  set( SHERPAENVIRONMENT_ENVIRONMENT 
+        FORCESET SHERPAVER ${SHERPA_VERSION} )
+endif()
+
+# Silently declare the module found:
+set( SHERPAENVIRONMENT_FOUND TRUE )
+
+
diff --git a/Generators/Starlight_i/CMakeLists.txt b/Generators/Starlight_i/CMakeLists.txt
index 77e71a2504d67e65f272294b2814ce9410fdc2e8..7048762e1ca92d90cceb9a3d703c97611d7f0a98 100644
--- a/Generators/Starlight_i/CMakeLists.txt
+++ b/Generators/Starlight_i/CMakeLists.txt
@@ -42,3 +42,8 @@ atlas_add_component( Starlight_i
 
 # Install files from the package:
 atlas_install_joboptions( share/*.py )
+
+set( StarlightEnvironment_DIR ${CMAKE_CURRENT_SOURCE_DIR}
+   CACHE PATH "Location of StarlightEnvironment.cmake" )
+find_package( StarlightEnvironment )
+
diff --git a/Generators/Starlight_i/StarlightEnvironmentConfig.cmake b/Generators/Starlight_i/StarlightEnvironmentConfig.cmake
new file mode 100644
index 0000000000000000000000000000000000000000..6d138e4a3ed77c60199eca426365727c005df889
--- /dev/null
+++ b/Generators/Starlight_i/StarlightEnvironmentConfig.cmake
@@ -0,0 +1,18 @@
+# Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration
+#
+# This module is used to set up the environment for Starlight
+# 
+#
+
+# Set the environment variable(s):
+find_package( Starlight )
+
+if( STARLIGHT_FOUND )
+  set( STARLIGHTENVIRONMENT_ENVIRONMENT 
+        FORCESET STARLIGHTVER ${HERWIG3_VERSION} ) 
+endif()
+
+# Silently declare the module found:
+set( STARLIGHTENVIRONMENT_FOUND TRUE )
+
+
diff --git a/Generators/Tauolapp_i/CMakeLists.txt b/Generators/Tauolapp_i/CMakeLists.txt
index b0d43aed2d20ca296241a44a12f0c6040f22533d..9b975928ab985b872f45ee1e3edc2b5cd52ffabb 100644
--- a/Generators/Tauolapp_i/CMakeLists.txt
+++ b/Generators/Tauolapp_i/CMakeLists.txt
@@ -35,3 +35,8 @@ atlas_add_component( Tauolapp_i
 atlas_install_headers( Tauolapp_i )
 atlas_install_joboptions( share/*.py )
 
+set( TauolappEnvironment_DIR ${CMAKE_CURRENT_SOURCE_DIR}
+   CACHE PATH "Location of TauolappEnvironment.cmake" )
+find_package( TauolappEnvironment )
+
+
diff --git a/Generators/Tauolapp_i/TauolaEnvironmentConfig.cmake b/Generators/Tauolapp_i/TauolaEnvironmentConfig.cmake
new file mode 100644
index 0000000000000000000000000000000000000000..79dd410ff61bc916659e3af855b7a64002d3b6bb
--- /dev/null
+++ b/Generators/Tauolapp_i/TauolaEnvironmentConfig.cmake
@@ -0,0 +1,18 @@
+# Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration
+#
+# This module is used to set up the environment for Tauolapp
+# 
+#
+
+# Set the environment variable(s):
+find_package( Tauolapp )
+
+if( TAUOLAPP_FOUND )
+  set( TAUOLAPPENVIRONMENT_ENVIRONMENT 
+        FORCESET TAUOLAPPVER ${THEPEG_VERSION})
+endif()
+
+# Silently declare the module found:
+set( TAUOLAPPENVIRONMENT_FOUND TRUE )
+
+