diff --git a/Generators/PowhegControl/examples/MC15_examples/MC15.101010.PowhegPythia8EvtGen_A14NNPDF23_Wj_example.py b/Generators/PowhegControl/examples/MC15_examples/MC15.101010.PowhegPythia8EvtGen_A14NNPDF23_Wj_example.py
index 3e2f1a14752e7fb9c106b7c125ea56c2f182cc36..d5538b71f75101214fd245ae74acba05ab9d9545 100644
--- a/Generators/PowhegControl/examples/MC15_examples/MC15.101010.PowhegPythia8EvtGen_A14NNPDF23_Wj_example.py
+++ b/Generators/PowhegControl/examples/MC15_examples/MC15.101010.PowhegPythia8EvtGen_A14NNPDF23_Wj_example.py
@@ -4,6 +4,7 @@
 # Powheg Wj setup starting from ATLAS defaults
 #--------------------------------------------------------------
 include('PowhegControl/PowhegControl_Wj_Common.py')
+# PowhegConfig.NNLO_reweighting_inputs = { 'DYNNLO':'Wp_CM8_MMHT14NNLO_11.top' }
 PowhegConfig.generate()
 
 #--------------------------------------------------------------
diff --git a/Generators/PowhegControl/python/ATLASCommonParameters.py b/Generators/PowhegControl/python/ATLASCommonParameters.py
index 646061f5f790ebdd1017f2f0681f66b52f2a957e..1a44b3567599c075a1fcac833ad80451c2ecbb3a 100644
--- a/Generators/PowhegControl/python/ATLASCommonParameters.py
+++ b/Generators/PowhegControl/python/ATLASCommonParameters.py
@@ -1,14 +1,11 @@
 # Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
 
-#########################################################################################################################
+## @PowhegControl ATLASCommonParameters
+#  Standard Model parameters for Powheg
 #
-#   Standard Model parameters for Powheg
-#
-#   Authors: James Robinson  <james.robinson@cern.ch>
-#            Daniel Hayden   <danhayden0@googlemail.com>
-#            Stephen Bieniek <stephen.paul.bieniek@cern.ch>
-#
-#########################################################################################################################
+#  Authors: James Robinson  <james.robinson@cern.ch>
+#           Daniel Hayden   <danhayden0@googlemail.com>
+#           Stephen Bieniek <stephen.paul.bieniek@cern.ch>
 
 #! /usr/bin/env python
 
@@ -50,6 +47,6 @@ CKM_Vtb     = 0.999152
 
 # Others
 sin2thW_eff = 0.23113
-alphaem     = 1.0/127.934 #0.00781653
+alphaem     = 1.0/127.934
 sin2cabibbo = 0.051
 G_F         = 0.00001166397
diff --git a/Generators/PowhegControl/python/PowhegConfig_base.py b/Generators/PowhegControl/python/PowhegConfig_base.py
index d3fe855d30b623c91cbf16dd3824b7494b9e8ced..d571e955797d878696d76b42d35f3ccdcdc2d4b1 100644
--- a/Generators/PowhegControl/python/PowhegConfig_base.py
+++ b/Generators/PowhegControl/python/PowhegConfig_base.py
@@ -35,28 +35,32 @@ class PowhegConfig_base(object) :
   _powheg_version_type = 1
 
 
+  ## Constructor
+  #  @param runArgs Generate_tf run arguments
+  #  @param opts athena run options
+  #  @param indicator that this is a leading-order process
   def __init__( self, runArgs=None, opts=None, LO_process=False ) :
-    ## Allow processes to indicate that they are leading order
+    # Allow processes to indicate that they are leading order
     self.__is_leading_order = LO_process
 
-    # ## Allow automatic configuration of multiple weights if specified
+    ## Dictionary of named groups of event weights
     self.reweight_groups = {}
     self.__enable_reweighting = False
 
-    ## This needs to be set so that Generate_trf finds an appropriate file format for showering
+    # This needs to be set so that Generate_trf finds an appropriate file format for showering
     self.__output_events_file_name = 'PowhegOTF._1.events'
     self.__output_tarball_name = None
 
-    ## Set up lists of parameters and decorators
+    # Set up lists of parameters and decorators
     self.__fixed_parameters = []
     self.__configurable_parameters = {}
     self.__phantom_parameters = {}
     self.__run_card_decorators = []
 
-    ## Add universal functionality
+    # Add universal functionality
     self.add_parameter_set( 'base' )
 
-    ## Initialise values from runArgs
+    # Initialise values from runArgs
     if runArgs == None :
       self.logger.warning( 'No run arguments found! Using defaults.' )
     else :
@@ -71,10 +75,10 @@ class PowhegConfig_base(object) :
         for tarball_suffix in [ x for x in ['.tar.gz', '.tgz'] if x in runArgs.outputTXTFile ] :
           self.__output_tarball_name = runArgs.outputTXTFile
           self.__output_events_file_name = self.output_tarball_name.split(tarball_suffix)[0]+'.events'
-      ## Set inputGeneratorFile to match output events file; otherwise Generate_tf check will fail
+      # Set inputGeneratorFile to match output events file; otherwise Generate_tf check will fail
       runArgs.inputGeneratorFile = self.output_events_file_name
 
-    ## Enable parallel mode if AthenaMP mode is enabled
+    # Enable parallel mode if AthenaMP mode is enabled
     self.__n_cores = int( os.environ.pop('ATHENA_PROC_NUMBER',1) )
     if self.cores > 1 :
       self.logger.info( 'This job is running with an athenaMP-like whole-node setup.' )
@@ -88,43 +92,46 @@ class PowhegConfig_base(object) :
 
 
   ## Run normal event generation
-  def generate( self, external_run_card=False ) :
+  #  @param external_run_card Use a user-provided run card
+  #  @param run_card_only Only generate the run card
+  def generate( self, external_run_card=False, run_card_only=False ) :
     if not external_run_card :
       self.__generate_run_card()
-    self.__generate_events()
+    if not run_card_only :
+      self.__generate_events()
     return
 
 
   ## Initialise runcard with generic options
   def __generate_run_card(self) :
-    ## Check that event generation is correctly set up
+    # Check that event generation is correctly set up
     if (self.bornsuppfact > 0.0) and (self.bornktmin <= 0.0) :
       self.logger.warning( 'These settings: bornsuppfact = {0} and bornktmin = {1} cannot be used to generate events!'.format(self.bornsuppfact,self.bornktmin) )
       self.logger.warning( 'Only fixed-order distributions can be produced with these settings!' )
 
-    ## Scale-down number of events produced in each run if running in multicore mode
+    # Scale-down number of events produced in each run if running in multicore mode
     if self.cores > 1 :
       self.nEvents_unscaled = self.nEvents
-      self.nEvents = 0.5 + self.nEvents / self.cores
-      self.ncall1 = 0.5 + self.ncall1 / self.cores
-      self.ncall2 = 0.5 + self.ncall2 / self.cores
-      self.nubound = 0.5 + self.nubound / self.cores
+      self.nEvents = int( 0.5 + self.nEvents / self.cores )
+      self.ncall1 = int( 0.5 + self.ncall1 / self.cores )
+      self.ncall2 = int( 0.5 + self.ncall2 / self.cores )
+      self.nubound = int( 0.5 + self.nubound / self.cores )
       self.logger.info( 'Scaling number of events per job from {0} down to {1}'.format(self.nEvents_unscaled, self.nEvents) )
 
-    ## Finalise registered decorators
+    # Finalise registered decorators
     for run_card_decorator in self.run_card_decorators :
       if hasattr( run_card_decorator, 'finalise' ) : run_card_decorator.finalise()
 
-    ## Print list of configurable parameters for users
+    # Print list of configurable parameters for users
     self.logger.info( '** User configurable parameters for this process **' )
     self.logger.info( ': Configurable parameter :   Current value   : Description' )
     for value_tuple in sorted( self.configurable_parameters.values()+self.phantom_parameters.values(), key=lambda x: x[0].lower() ) :
       self.logger.info( ': {0:<22} : {1:>17} : {2}'.format( value_tuple[0], getattr(self, value_tuple[0]), value_tuple[1] ) )
 
-    ## Add configurable parameters to fixed list
+    # Add configurable parameters to fixed list
     [ self.fix_parameter( parameter=value_tuple[0], desc=value_tuple[1] ) for value_tuple in self.configurable_parameters.values() ]
 
-    ## Write out final runcard
+    # Write out final runcard
     self.logger.info( 'Writing Powheg runcard to {0}'.format( self.run_card_path ) )
     with open( self.run_card_path, 'w' ) as f :
       for parameter_tuple in sorted( self.fixed_parameters, key=lambda x: x[0].lower() ) :
@@ -140,18 +147,18 @@ class PowhegConfig_base(object) :
         if name == 'bornsuppfact' and value > 0 :
           self.logger.warning( 'Born-level suppression is enabled: using this in conjunction with J-slicing may give problems.' )
 
-    ## Print final preparation message
+    # Print final preparation message
     self.logger.info( 'Using executable: {0}'.format( self._powheg_executable ) )
     return
 
 
   ## Run normal event generation
   def __generate_events(self) :
-    ## Initialise timer
+    # Initialise timer
     time_start = time.time()
     self.logger.info( 'Starting Powheg LHEF event generation at {0}'.format( time.ctime( time_start ) ) )
 
-    ## Setup heartbeat thread
+    # Setup heartbeat thread
     heartbeat = RepeatingTimer( 600., lambda: self.__emit_heartbeat( time.time() - time_start ) )
     heartbeat.daemon = True # Allow program to exit if this is the only live thread
     heartbeat.start()
@@ -160,64 +167,64 @@ class PowhegConfig_base(object) :
     self.logger.info( 'Removing old LHE files' )
     [ os.remove( LHE_file ) for LHE_file in glob.glob('*.lhe')+glob.glob('*.ev*ts') ]
 
-    ## Run appropriate Powheg process and display generation output until finished
+    # Run appropriate Powheg process and display generation output until finished
     self.__run_generation_strategy()
 
-    ## Print timing information
+    # Print timing information
     generation_end = time.time()
     elapsed_time = generation_end - time_start
     self.logger.info( 'Running nominal Powheg took {0} for {1} events => {2:6.3f} Hz'.format( RepeatingTimer.human_readable_time_interval(elapsed_time), self.nEvents, self.nEvents / elapsed_time ) )
 
-    ## Concatenate output events if running in multicore mode
+    # Concatenate output events if running in multicore mode
     if self.cores > 1 :
       self.logger.info( 'Concatenating {0} output LHE files'.format( self.cores ) )
       LHEHandler(self.logger).merge( 'pwgevents.lhe', sorted( glob.glob('pwgevents*.lhe') ) )
       subprocess.call( 'rm pwgevents-*.lhe 2> /dev/null', shell=True )
-      ## Unscale nEvents in case this is needed by afterburners
+      # Unscale nEvents in case this is needed by afterburners
       subprocess.call( 'sed -i "s/numevts.*/numevts {0}/g" powheg*.input'.format(self.nEvents_unscaled), shell=True )
 
-    ## Run Powheg afterburners
+    # Run Powheg afterburners
     self.__run_afterburners()
     elapsed_time = time.time() - generation_end
     self.logger.info( 'Running Powheg afterburners took {0}'.format( RepeatingTimer.human_readable_time_interval(elapsed_time) ) )
 
-    ## Move output to correctly named file
+    # Move output to correctly named file
     try :
       os.rename( 'pwgevents.lhe', self.output_events_file_name )
       self.logger.info( 'Moved pwgevents.lhe to {0}'.format(self.output_events_file_name) )
     except OSError :
       self.logger.warning( 'No output LHEF file found! Probably because the Powheg process was killed before finishing.' )
 
-    ## Tar events if LHE output is requested
+    # Tar events if LHE output is requested
     if self.output_tarball_name is not None :
       self.logger.info( 'Tar-ing output events into {0}'.format(self.output_tarball_name) )
       [ self.logger.info(line) for line in subprocess.check_output( [ 'tar', 'cvzf', self.output_tarball_name, self.output_events_file_name ], stderr=subprocess.STDOUT ).splitlines() ]
 
-    ## Print finalisation message
+    # Print finalisation message
     IntegrationGridTester.output_results( self.logger )
     self.logger.info( 'Finished at {0}'.format( time.asctime() ) )
 
-    ## Kill heartbeat thread
+    # Kill heartbeat thread
     heartbeat.cancel()
     return
 
 
   ## Run external Powheg process
   def __run_generation_strategy(self) :
-    ## Initialise reweighting
+    # Initialise reweighting
     if self.__enable_reweighting :
       strategies.initialise_reweighting( self )
 
-    ## Run single core
+    # Run single core
     if self.cores == 1 :
       strategies.generate_single_core( self )
 
-    ## Run multicore
+    # Run multicore
     else :
-      ## Run v1-style multiprocess (only needs one step)
+      # Run v1-style multicore (only needs one step)
       if self._powheg_version_type == 1 :
         strategies.generate_v1_multi_core( self )
-      ## Run v2-style multiprocess (needs four steps)
+      # Run v2-style multicore (needs four steps)
       else :
         strategies.generate_v2_multi_core( self )
     return
@@ -225,16 +232,20 @@ class PowhegConfig_base(object) :
 
   ## Run external Powheg process
   def __run_afterburners(self) :
-    ## Run scale/PDF/arbitrary reweighting if requested
+    # Run scale/PDF/arbitrary reweighting if requested
     if self.__enable_reweighting :
       strategies.afterburner_reweighting( self )
-    ## Run NNLOPS if requested
+    # Run NNLOPS if requested
     if hasattr( self, 'NNLO_reweighting_inputs' ) and len(self.NNLO_reweighting_inputs) > 0 :
       strategies.afterburner_NNLO_reweighting( self )
     return
 
 
-  ## Register configurable parameter
+  ## Register configurable parameter: exposed to the user and written to the run card
+  #  @param configurable_name Configurable parameter name exposed to the user
+  #  @param value Value of the parameter
+  #  @param desc Description for the run card
+  #  @param parameter Name used in the run card if different
   def add_parameter( self, configurable_name, value, desc='', parameter=None ) :
     setattr( self, configurable_name, value ) # add new attribute
     powheg_parameter = parameter if parameter is not None else configurable_name
@@ -242,7 +253,10 @@ class PowhegConfig_base(object) :
     return
 
 
-  ## Register configurable parameter
+  ## Register configurable parameter: exposed to the user but not written to the run card
+  #  @param name Configurable parameter name exposed to the user
+  #  @param value Value of the parameter
+  #  @param desc Description for the run card
   def add_phantom( self, name, value, desc='' ) :
     setattr( self, name, value ) # add new attribute
     self.phantom_parameters[name] = ( name, desc )
@@ -250,10 +264,14 @@ class PowhegConfig_base(object) :
 
 
   ## Alias to PowhegDecorators.decorate
+  #  @param parameter_set Name of a set of parameter to add to this configurable
   def add_parameter_set( self, parameter_set, **kwargs ) :
     return decorate( self, parameter_set, **kwargs )
 
 
+  ## Add a new named group of event weights
+  #  @param group_name Name of the group of weights
+  #  @param parameter_set Names of the individual weights
   def define_weight_group( self, group_name, weight_names ) :
     self.logger.info( 'Defining new weight group {0} with {1} variations'.format( group_name, len(weight_names) ) )
     self.reweight_groups[group_name] = {}
@@ -270,6 +288,7 @@ class PowhegConfig_base(object) :
 
 
   ## Output a heartbeat message
+  #  @param duration Time interval in seconds between output messages
   def __emit_heartbeat(self, duration) :
     message = 'Heartbeat: Powheg generation has been running for {0} in total'.format( RepeatingTimer.human_readable_time_interval(duration) )
     self.logger.info( message )
@@ -277,7 +296,10 @@ class PowhegConfig_base(object) :
     return
 
 
-  ## Register non-configurable parameter
+  ## Register a parameter that is not user-configurable
+  #  @param parameter Parameter name
+  #  @param value Value of the parameter
+  #  @param desc Description for the run card
   def fix_parameter( self, parameter, value=None, desc='' ) :
     # Get previously set value if not overwriting
     if value is None : value = getattr( self, parameter )
@@ -298,7 +320,7 @@ class PowhegConfig_base(object) :
     return self.__base_directory
 
 
-  ## Get dictionary of configurable parameters
+  ## Get dictionary of configurable parameters: visible to user and written to runcard
   @property
   def configurable_parameters(self) :
     return self.__configurable_parameters
@@ -310,13 +332,13 @@ class PowhegConfig_base(object) :
     return self.__n_cores
 
 
-  ## Get list of non-configurable parameters
+  ## Get dictionary of non-configurable parameters: not visible to user but written to runcard
   @property
   def fixed_parameters(self) :
     return self.__fixed_parameters
 
 
-  ## Determine whether this is a leading-order process
+  ## Get whether this is a leading-order process
   @property
   def is_LO(self) :
     return self.__is_leading_order
@@ -362,3 +384,17 @@ class PowhegConfig_base(object) :
   @property
   def run_card_path(self) :
     return '{0}/powheg.input'.format( self.base_directory )
+
+
+  ## Deprecated function - use generate() instead
+  def generateRunCard(self) :
+    self.logger.warning( 'This function is deprecated as of 2015-02-19' )
+    self.logger.warning( 'Please use generate() instead of generateRunCard() and generateEvents()' )
+    return self.__generate_run_card()
+
+
+  ## Deprecated function - use generate() instead
+  def generateEvents(self) :
+    self.logger.warning( 'This function is deprecated as of 2015-02-19' )
+    self.logger.warning( 'Please use generate() instead of generateRunCard() and generateEvents()' )
+    return self.__generate_events()
diff --git a/Generators/PowhegControl/python/decorators/BaseDecorator.py b/Generators/PowhegControl/python/decorators/BaseDecorator.py
index fc0818a3b7a06f83271479ba9ff48232480076b9..c78524707637689fa0cc09a19d0df446753914cc 100644
--- a/Generators/PowhegControl/python/decorators/BaseDecorator.py
+++ b/Generators/PowhegControl/python/decorators/BaseDecorator.py
@@ -38,9 +38,9 @@ class BaseDecorator(object) :
     ## Integration parameters:
     #   The total number of calls is ncall2*itmx2*foldcsi*foldy*foldphi, with a typical call using 1/1400 seconds
     ## These are optimised in each process to ensure:
-    #   Upper bound failures      < 1% : to reduce, increase nubound, xupbound or ncall2*itmx2
     #   Cross section uncertainty < 1% : to reduce, increase ncall1*itmx1 or ncall2*itmx2
     #   Negative weight events    < 1% : to reduce, increase fold parameters
+    #   Upper bound failures      < 1% : to reduce, increase nubound, xupbound or ncall2*itmx2
     self.decorated.add_parameter( 'itmx1', 5,      desc='(default process-dependent) number of iterations for initializing the integration grid' )
     self.decorated.add_parameter( 'itmx2', 5,      desc='(default process-dependent) number of iterations for computing the integral and finding upper bound' )
     self.decorated.add_parameter( 'ncall1', 10000, desc='(default process-dependent) number of calls for initializing the integration grid' )
@@ -54,10 +54,10 @@ class BaseDecorator(object) :
     self.decorated.add_parameter( 'bornktmin', -1,                         desc='(default -1, use Powheg default) generation cut: minimum kt in underlying Born' )
     self.decorated.fix_parameter( 'bornonly', [0,1][self.decorated.is_LO], desc='(default process-dependent) calculate Born only' )
     self.decorated.add_parameter( 'bornsuppfact', -1,                      desc='(default -1, use Powheg default) mass parameter for Born suppression factor. If > 0 suppfact = 1' )
-    self.decorated.fix_parameter( 'bornzerodamp', 1,                       desc='(default 1, enabled) use damping in regions where the Born is strongly suppressed (or 0), such as W production.' )
+    self.decorated.add_parameter( 'bornzerodamp', 1,                       desc='(default 1, enabled) use damping in regions where the Born is strongly suppressed (or 0), such as W production.' )
     self.decorated.add_parameter( 'hdamp', -1,                             desc='(default -1, use Powheg default) deprecated, apply damping factor for high-pt radiation: h**2/(pt2+h**2)' )
     self.decorated.add_parameter( 'hfact', -1,                             desc='(default -1, use Powheg default) apply dumping factor for high-pt radiation: h**2/(pt2+h**2)' )
-    self.decorated.fix_parameter( 'ptsupp', -1,                            desc='(default -1, use Powheg default) deprecated, but some processes complain if it is missing' )
+    self.decorated.add_parameter( 'ptsupp', -1,                            desc='(default -1, use Powheg default) deprecated, but some processes complain if it is missing' )
     self.decorated.add_parameter( 'withdamp', -1,                          desc='(default process-dependetn)) use Born-zero damping factor.' )
     self.decorated.add_parameter( 'withnegweights', 1,                     desc='(default 1, enabled) allow negative weights' )
     # Parton splitting settings
@@ -77,14 +77,14 @@ class BaseDecorator(object) :
     self.decorated.fix_parameter( 'testsuda', 0,   desc='(default 0, disabled) test Sudakov form factor' )
     self.decorated.fix_parameter( 'withsubtr', 1,  desc='(default 1, enabled) subtract real counterterms' )
     # Parameters of unknown use
-    self.decorated.fix_parameter( 'flg_debug', 0,       desc='(default 0, disabled) write extra information on LHEF. Breaks PYTHIA showering.' )
-    self.decorated.fix_parameter( 'colltest', -1,       desc='(default -1, use Powheg default)' )
-    self.decorated.fix_parameter( 'softtest', -1,       desc='(default -1, use Powheg default)' )
-    self.decorated.fix_parameter( 'ubsigmadetails', -1, desc='(default -1, use Powheg default)' )
+    self.decorated.add_parameter( 'flg_debug', 0,       desc='(default 0, disabled) write extra information on LHEF. Breaks PYTHIA showering.' )
+    self.decorated.add_parameter( 'colltest', -1,       desc='(default -1, use Powheg default)' )
+    self.decorated.add_parameter( 'softtest', -1,       desc='(default -1, use Powheg default)' )
+    self.decorated.add_parameter( 'ubsigmadetails', -1, desc='(default -1, use Powheg default)' )
     ## Radiation settings for NLO processes
     if not self.decorated.is_LO :
-      self.decorated.fix_parameter( 'btlscalect', -1,    desc='(default -1, use Powheg default) use the scales of the underlying-Born configuration for the subtraction terms' )
-      self.decorated.fix_parameter( 'btlscalereal', -1,  desc='(default -1, use Powheg default)' )
+      self.decorated.add_parameter( 'btlscalect', -1,    desc='(default -1, use Powheg default) use the scales of the underlying-Born configuration for the subtraction terms' )
+      self.decorated.add_parameter( 'btlscalereal', -1,  desc='(default -1, use Powheg default)' )
       self.decorated.add_parameter( 'ixmax', 1,          desc='(default process-dependent) number of intervals (<= 10) in x (csi) grid to compute upper bounds', parameter='icsimax' )
       self.decorated.add_parameter( 'iymax', 1,          desc='(default process-dependent) number of intervals (<= 10) in y grid to compute upper bounds' )
       self.decorated.add_parameter( 'nubound', 10000,    desc='(default process-dependent) number of calls to setup upper bounds for radiation' )
@@ -96,11 +96,5 @@ class BaseDecorator(object) :
     ## Force parameters to integer values
     [ setattr( self.decorated, parameter, int( getattr(self.decorated, parameter) ) ) for parameter in ('nEvents','itmx1','itmx2','ncall1','ncall2','foldx','foldy','foldphi','random_seed') ]
 
-    ## Fix integration parameters before printing list for user
-    [ self.decorated.fix_parameter( parameter ) for parameter in ('beam_energy', 'manyseeds', 'random_seed', 'itmx1', 'itmx2', 'ncall1', 'ncall2', 'foldx', 'foldy', 'foldphi' ) ]
-
-    ## Same for NLO processes
-    if not self.decorated.is_LO :
-      for parameter in ('ixmax', 'iymax', 'nubound', 'xupbound') :
-        setattr( self.decorated, parameter, int( getattr(self.decorated, parameter) ) )
-        self.decorated.fix_parameter( parameter )
+    ## Fix parameters read from Generate_tf before printing list for user
+    [ self.decorated.fix_parameter( parameter ) for parameter in ('beam_energy', 'manyseeds', 'random_seed' ) ]
diff --git a/Generators/PowhegControl/python/decorators/CKMDecorator.py b/Generators/PowhegControl/python/decorators/CKMDecorator.py
index c8fab67ccf82363711e34aca6d2abaa85cad677b..36494d11f17084802b31b21bfe661add1bf08c69 100644
--- a/Generators/PowhegControl/python/decorators/CKMDecorator.py
+++ b/Generators/PowhegControl/python/decorators/CKMDecorator.py
@@ -18,12 +18,12 @@ class CKMDecorator(object) :
     decorated.run_card_decorators.append( self )
     self.decorated = decorated
 
-    self.decorated.fix_parameter( 'CKM_Vud', ATLASCommonParameters.CKM_Vud, desc='(default, ATLAS) CKM element: Vud' )
-    self.decorated.fix_parameter( 'CKM_Vus', ATLASCommonParameters.CKM_Vus, desc='(default, ATLAS) CKM element: Vus' )
-    self.decorated.fix_parameter( 'CKM_Vub', ATLASCommonParameters.CKM_Vub, desc='(default, ATLAS) CKM element: Vub' )
-    self.decorated.fix_parameter( 'CKM_Vcd', ATLASCommonParameters.CKM_Vcd, desc='(default, ATLAS) CKM element: Vcd' )
-    self.decorated.fix_parameter( 'CKM_Vcs', ATLASCommonParameters.CKM_Vcs, desc='(default, ATLAS) CKM element: Vcs' )
-    self.decorated.fix_parameter( 'CKM_Vcb', ATLASCommonParameters.CKM_Vcb, desc='(default, ATLAS) CKM element: Vcb' )
-    self.decorated.fix_parameter( 'CKM_Vtd', ATLASCommonParameters.CKM_Vtd, desc='(default, ATLAS) CKM element: Vtd' )
-    self.decorated.fix_parameter( 'CKM_Vts', ATLASCommonParameters.CKM_Vts, desc='(default, ATLAS) CKM element: Vts' )
-    self.decorated.fix_parameter( 'CKM_Vtb', ATLASCommonParameters.CKM_Vtb, desc='(default, ATLAS) CKM element: Vtb' )
+    self.decorated.add_parameter( 'CKM_Vud', ATLASCommonParameters.CKM_Vud, desc='(default, ATLAS) CKM element: Vud' )
+    self.decorated.add_parameter( 'CKM_Vus', ATLASCommonParameters.CKM_Vus, desc='(default, ATLAS) CKM element: Vus' )
+    self.decorated.add_parameter( 'CKM_Vub', ATLASCommonParameters.CKM_Vub, desc='(default, ATLAS) CKM element: Vub' )
+    self.decorated.add_parameter( 'CKM_Vcd', ATLASCommonParameters.CKM_Vcd, desc='(default, ATLAS) CKM element: Vcd' )
+    self.decorated.add_parameter( 'CKM_Vcs', ATLASCommonParameters.CKM_Vcs, desc='(default, ATLAS) CKM element: Vcs' )
+    self.decorated.add_parameter( 'CKM_Vcb', ATLASCommonParameters.CKM_Vcb, desc='(default, ATLAS) CKM element: Vcb' )
+    self.decorated.add_parameter( 'CKM_Vtd', ATLASCommonParameters.CKM_Vtd, desc='(default, ATLAS) CKM element: Vtd' )
+    self.decorated.add_parameter( 'CKM_Vts', ATLASCommonParameters.CKM_Vts, desc='(default, ATLAS) CKM element: Vts' )
+    self.decorated.add_parameter( 'CKM_Vtb', ATLASCommonParameters.CKM_Vtb, desc='(default, ATLAS) CKM element: Vtb' )
diff --git a/Generators/PowhegControl/python/decorators/DarkMatterDecorator.py b/Generators/PowhegControl/python/decorators/DarkMatterDecorator.py
index ffd967b6cfbd899205a7e1bf8b01331167358671..946ad5ef4f236aabfe8e201965fe857f713d9f34 100644
--- a/Generators/PowhegControl/python/decorators/DarkMatterDecorator.py
+++ b/Generators/PowhegControl/python/decorators/DarkMatterDecorator.py
@@ -20,4 +20,4 @@ class DarkMatterDecorator(object) :
     self.decorated.add_parameter( 'DM_mass', 10,   desc='(default, 10) DM-candidate mass', parameter='DMmass' )
     self.decorated.add_parameter( 'gDM', 1.0,      desc='(default, 1.0) X-Xbar-med coupling', parameter='DMgDM' )
     self.decorated.add_parameter( 'gSM', 1.0,      desc='(default, 1.0) q-q-med coupling', parameter='DMgSM' )
-    self.decorated.fix_parameter( 'idDM', 1000022, desc='(default, 1000022) id of DM particles' )
+    self.decorated.add_parameter( 'idDM', 1000022, desc='(default, 1000022) id of DM particles' )
diff --git a/Generators/PowhegControl/python/decorators/DibosonDecorator.py b/Generators/PowhegControl/python/decorators/DibosonDecorator.py
index b7b7c00c4d3fdf811dbf18223f8c391a14c95427..90d542bd34194bb78b9bfbb4bcdbfc0fef1496bc 100644
--- a/Generators/PowhegControl/python/decorators/DibosonDecorator.py
+++ b/Generators/PowhegControl/python/decorators/DibosonDecorator.py
@@ -29,4 +29,4 @@ class DibosonDecorator(object) :
       self.decorated.logger.warning( 'Decay mode {0} not recognised!'.format( self.decorated.decay_mode) )
     ## Add entry for each decay mode
     for decay_mode in self.decorated.allowed_decay_modes :
-      self.decorated.fix_parameter( decay_mode, [-1,1][decay_mode==self.decorated.decay_mode], desc='Diboson decay mode, 1:enabled; -1:disabled' )
+      self.decorated.fix_parameter( decay_mode, [-1,1][decay_mode==self.decorated.decay_mode], desc='(default user-configured) Diboson decay mode, 1:enabled; -1:disabled' )
diff --git a/Generators/PowhegControl/python/decorators/HVJDecorator.py b/Generators/PowhegControl/python/decorators/HVJDecorator.py
index 86d2f73723b69c8b3ec919d8d1234acafb59a6b7..fc64a5bb5c901875e3aaf52680f28ebcbbc66887 100644
--- a/Generators/PowhegControl/python/decorators/HVJDecorator.py
+++ b/Generators/PowhegControl/python/decorators/HVJDecorator.py
@@ -18,7 +18,7 @@ class HVJDecorator(object) :
     decorated.run_card_decorators.append( self )
     self.decorated = decorated
 
-    self.decorated.fix_parameter( 'bmass', ATLASCommonParameters.mass_b, desc='(default ATLAS) b quark mass' )
+    self.decorated.add_parameter( 'bmass', ATLASCommonParameters.mass_b, desc='(default ATLAS) b quark mass' )
     self.decorated.add_parameter( 'kappa_ghb', 1.0,                      desc='(default 1.0) multiplicative kappa-factor of the Higgs-bottom coupling' )
     self.decorated.add_parameter( 'kappa_ght', 1.0,                      desc='(default 1.0) multiplicative kappa-factor of the Higgs-top coupling' )
     self.decorated.add_parameter( 'use_massive_b', 1,                    desc='(default 1, enabled) enable bottom quark loops', parameter='massivebottom' )
diff --git a/Generators/PowhegControl/python/decorators/LeptonMassDecorator.py b/Generators/PowhegControl/python/decorators/LeptonMassDecorator.py
index dde71c0c086c911a13aae2c3efc845cef5acad67..2c40ea921568f67f65b5d2f303e5a720de4f5cc3 100644
--- a/Generators/PowhegControl/python/decorators/LeptonMassDecorator.py
+++ b/Generators/PowhegControl/python/decorators/LeptonMassDecorator.py
@@ -18,6 +18,6 @@ class LeptonMassDecorator(object) :
     decorated.run_card_decorators.append( self )
     self.decorated = decorated
 
-    self.decorated.fix_parameter( 'lhfm/emass', ATLASCommonParameters.mass_e,     desc='(default ATLAS) electron mass' )
-    self.decorated.fix_parameter( 'lhfm/mumass', ATLASCommonParameters.mass_mu,   desc='(default ATLAS) mu mass' )
-    self.decorated.fix_parameter( 'lhfm/taumass', ATLASCommonParameters.mass_tau, desc='(default ATLAS) tau mass' )
+    self.decorated.add_parameter( 'lhfm/emass', ATLASCommonParameters.mass_e,     desc='(default ATLAS) electron mass' )
+    self.decorated.add_parameter( 'lhfm/mumass', ATLASCommonParameters.mass_mu,   desc='(default ATLAS) mu mass' )
+    self.decorated.add_parameter( 'lhfm/taumass', ATLASCommonParameters.mass_tau, desc='(default ATLAS) tau mass' )
diff --git a/Generators/PowhegControl/python/decorators/MassWindowDecorator.py b/Generators/PowhegControl/python/decorators/MassWindowDecorator.py
index f79ebd9abeadd5b5701c7698aa077508867a7637..1cff638ad28fd63cf1e3df3de42ee73b5e6df022 100644
--- a/Generators/PowhegControl/python/decorators/MassWindowDecorator.py
+++ b/Generators/PowhegControl/python/decorators/MassWindowDecorator.py
@@ -19,5 +19,5 @@ class MassWindowDecorator(object) :
 
     self.decorated.add_parameter( 'mass_low', -1,        desc='(default -1) If set then require M_object > mass_low; otherwise allow internal Powheg computation.' )
     self.decorated.add_parameter( 'mass_high', -1,       desc='(default -1) If set then require M_object < mass_high; otherwise allow internal Powheg computation.' )
-    self.decorated.fix_parameter( 'masswindow_low', -1,  desc='(default -1, disabled) use mass_low instead' )
-    self.decorated.fix_parameter( 'masswindow_high', -1, desc='(default -1, disabled) use mass_high instead' )
+    self.decorated.add_parameter( 'masswindow_low', -1,  desc='(default -1, disabled) use mass_low instead' )
+    self.decorated.add_parameter( 'masswindow_high', -1, desc='(default -1, disabled) use mass_high instead' )
diff --git a/Generators/PowhegControl/python/decorators/SecondGenerationQuarkMassDecorator.py b/Generators/PowhegControl/python/decorators/SecondGenerationQuarkMassDecorator.py
index 1edf4c83ef7a041ffe767964ca4d28ac6f5b7182..7216559b5ae78872f041b3212fc436fc667ac631 100644
--- a/Generators/PowhegControl/python/decorators/SecondGenerationQuarkMassDecorator.py
+++ b/Generators/PowhegControl/python/decorators/SecondGenerationQuarkMassDecorator.py
@@ -18,5 +18,5 @@ class SecondGenerationQuarkMassDecorator(object) :
     decorated.run_card_decorators.append( self )
     self.decorated = decorated
 
-    self.decorated.fix_parameter( 'bmass_lhe', ATLASCommonParameters.mass_b, desc='(default ATLAS) Set b-quark mass for momentum reshuffling' )
-    self.decorated.fix_parameter( 'cmass_lhe', ATLASCommonParameters.mass_c, desc='(default ATLAS) Set c-quark mass for momentum reshuffling' )
+    self.decorated.add_parameter( 'bmass_lhe', ATLASCommonParameters.mass_b, desc='(default ATLAS) Set b-quark mass for momentum reshuffling' )
+    self.decorated.add_parameter( 'cmass_lhe', ATLASCommonParameters.mass_c, desc='(default ATLAS) Set c-quark mass for momentum reshuffling' )
diff --git a/Generators/PowhegControl/python/decorators/Sin2ThetaWDecorator.py b/Generators/PowhegControl/python/decorators/Sin2ThetaWDecorator.py
index 2653c71b0eaf1ed9e70b117b3af96741e7e0e4c7..48b38ea5963b3b76ce96cc1ce0760df851fb6fcf 100644
--- a/Generators/PowhegControl/python/decorators/Sin2ThetaWDecorator.py
+++ b/Generators/PowhegControl/python/decorators/Sin2ThetaWDecorator.py
@@ -18,4 +18,4 @@ class Sin2ThetaWDecorator(object) :
     decorated.run_card_decorators.append( self )
     self.decorated = decorated
 
-    self.decorated.fix_parameter( 'sthw2', ATLASCommonParameters.sin2thW_eff, desc='(default ATLAS) sin**2 theta w' )
+    self.decorated.add_parameter( 'sthw2', ATLASCommonParameters.sin2thW_eff, desc='(default ATLAS) sin**2 theta w' )
diff --git a/Generators/PowhegControl/python/decorators/SingleTopDecorator.py b/Generators/PowhegControl/python/decorators/SingleTopDecorator.py
index 6394f91c3122fe8b39d8a8193aa5c46791a06101..27c694a90ddb5bbc83d8692110dd97515fa173b0 100644
--- a/Generators/PowhegControl/python/decorators/SingleTopDecorator.py
+++ b/Generators/PowhegControl/python/decorators/SingleTopDecorator.py
@@ -18,7 +18,7 @@ class SingleTopDecorator(object) :
     decorated.run_card_decorators.append( self )
     self.decorated = decorated
 
-    self.decorated.fix_parameter( 'alphaem_inv', 1.0/float(ATLASCommonParameters.alphaem), desc='(default ATLAS) EM coupling' )
+    self.decorated.add_parameter( 'alphaem_inv', 1.0/float(ATLASCommonParameters.alphaem), desc='(default ATLAS) EM coupling' )
     self.decorated.add_parameter( 'ttype', 1,                                              desc='(default 1) 1:t, -1:tbar' )
-    self.decorated.fix_parameter( 'wmass', ATLASCommonParameters.mass_W,                   desc='(default ATLAS) mass of W boson in GeV' )
-    self.decorated.fix_parameter( 'wwidth', ATLASCommonParameters.width_W,                 desc='(default ATLAS) W width' )
+    self.decorated.add_parameter( 'wmass', ATLASCommonParameters.mass_W,                   desc='(default ATLAS) mass of W boson in GeV' )
+    self.decorated.add_parameter( 'wwidth', ATLASCommonParameters.width_W,                 desc='(default ATLAS) W width' )
diff --git a/Generators/PowhegControl/python/decorators/SingleVectorBosonDecorator.py b/Generators/PowhegControl/python/decorators/SingleVectorBosonDecorator.py
index 44d4cfda6360cfd52c38cd15091048b59c44b11c..90b6b119581792e0beb76c23ed3d5975375d44fe 100644
--- a/Generators/PowhegControl/python/decorators/SingleVectorBosonDecorator.py
+++ b/Generators/PowhegControl/python/decorators/SingleVectorBosonDecorator.py
@@ -18,9 +18,9 @@ class SingleVectorBosonDecorator(object) :
     decorated.run_card_decorators.append( self )
     self.decorated = decorated
 
-    self.decorated.fix_parameter( 'alphaem', ATLASCommonParameters.alphaem, desc='(default ATLAS) EM coupling' )
+    self.decorated.add_parameter( 'alphaem', ATLASCommonParameters.alphaem, desc='(default ATLAS) EM coupling' )
     self.decorated.add_parameter( 'running_width', -1,                      desc='(default -1, use Powheg default)' )
-    self.decorated.fix_parameter( 'Wmass', ATLASCommonParameters.mass_W,    desc='(default ATLAS) W mass in GeV' )
-    self.decorated.fix_parameter( 'Wwidth', ATLASCommonParameters.width_W,  desc='(default ATLAS) W width in GeV' )
-    self.decorated.fix_parameter( 'Zmass', ATLASCommonParameters.mass_Z,    desc='(default ATLAS) Z mass in GeV' )
-    self.decorated.fix_parameter( 'Zwidth', ATLASCommonParameters.width_Z,  desc='(default ATLAS) Z width in GeV' )
+    self.decorated.add_parameter( 'Wmass', ATLASCommonParameters.mass_W,    desc='(default ATLAS) W mass in GeV' )
+    self.decorated.add_parameter( 'Wwidth', ATLASCommonParameters.width_W,  desc='(default ATLAS) W width in GeV' )
+    self.decorated.add_parameter( 'Zmass', ATLASCommonParameters.mass_Z,    desc='(default ATLAS) Z mass in GeV' )
+    self.decorated.add_parameter( 'Zwidth', ATLASCommonParameters.width_Z,  desc='(default ATLAS) Z width in GeV' )
diff --git a/Generators/PowhegControl/python/decorators/TopDecayBranchingDecorator.py b/Generators/PowhegControl/python/decorators/TopDecayBranchingDecorator.py
index 791a45b88882cbca846b3ed245c2804e361d4375..d923677bb79016f0d5bbee9f95a76cd5807e0809 100644
--- a/Generators/PowhegControl/python/decorators/TopDecayBranchingDecorator.py
+++ b/Generators/PowhegControl/python/decorators/TopDecayBranchingDecorator.py
@@ -19,10 +19,10 @@ class TopDecayBranchingDecorator(object) :
     self.decorated = decorated
 
     if tdec_prefix :
-      self.decorated.fix_parameter( 'tdec/elbranching', ATLASCommonParameters.W_lepton_BR, desc='(default ATLAS) W electronic branching fraction' )
-      self.decorated.fix_parameter( 'tdec/emass', ATLASCommonParameters.mass_e,            desc='(default ATLAS) electron mass' )
-      self.decorated.fix_parameter( 'tdec/mumass', ATLASCommonParameters.mass_mu,          desc='(default ATLAS) mu mass' )
-      self.decorated.fix_parameter( 'tdec/taumass', ATLASCommonParameters.mass_tau,        desc='(default ATLAS) tau mass' )
+      self.decorated.add_parameter( 'tdec/elbranching', ATLASCommonParameters.W_lepton_BR, desc='(default ATLAS) W electronic branching fraction' )
+      self.decorated.add_parameter( 'tdec/emass', ATLASCommonParameters.mass_e,            desc='(default ATLAS) electron mass' )
+      self.decorated.add_parameter( 'tdec/mumass', ATLASCommonParameters.mass_mu,          desc='(default ATLAS) mu mass' )
+      self.decorated.add_parameter( 'tdec/taumass', ATLASCommonParameters.mass_tau,        desc='(default ATLAS) tau mass' )
     else :
-      self.decorated.fix_parameter( 'elbranching', ATLASCommonParameters.W_lepton_BR,      desc='(default ATLAS) W electronic branching fraction' )
+      self.decorated.add_parameter( 'elbranching', ATLASCommonParameters.W_lepton_BR,      desc='(default ATLAS) W electronic branching fraction' )
     self.decorated.add_parameter( 'topwidth', ATLASCommonParameters.width_t,               desc='(default ATLAS) top width' )
diff --git a/Generators/PowhegControl/python/decorators/TopDecaySecondGenerationQuarkDecorator.py b/Generators/PowhegControl/python/decorators/TopDecaySecondGenerationQuarkDecorator.py
index c2f5e7f31c8205d88d85b8c7ad0d27a285682b2f..11e347c82e255672f88bdfd47732bae6fe96721e 100644
--- a/Generators/PowhegControl/python/decorators/TopDecaySecondGenerationQuarkDecorator.py
+++ b/Generators/PowhegControl/python/decorators/TopDecaySecondGenerationQuarkDecorator.py
@@ -18,5 +18,5 @@ class TopDecaySecondGenerationQuarkDecorator(object) :
     decorated.run_card_decorators.append( self )
     self.decorated = decorated
 
-    self.decorated.fix_parameter( 'lhfm/bmass', ATLASCommonParameters.mass_b, desc='(default ATLAS) b quark mass' )
-    self.decorated.fix_parameter( 'lhfm/cmass', ATLASCommonParameters.mass_c, desc='(default ATLAS) c quark mass' )
+    self.decorated.add_parameter( 'lhfm/bmass', ATLASCommonParameters.mass_b, desc='(default ATLAS) b quark mass' )
+    self.decorated.add_parameter( 'lhfm/cmass', ATLASCommonParameters.mass_c, desc='(default ATLAS) c quark mass' )
diff --git a/Generators/PowhegControl/python/decorators/V2Decorator.py b/Generators/PowhegControl/python/decorators/V2Decorator.py
index 4641ad26ba886e85e32b09ca0563fb59d53217d7..9e77e87b25e9dbbf97b6919775b265e6f98506d4 100644
--- a/Generators/PowhegControl/python/decorators/V2Decorator.py
+++ b/Generators/PowhegControl/python/decorators/V2Decorator.py
@@ -28,10 +28,10 @@ class V2Decorator(object) :
     self.decorated.add_parameter( 'fixedgrid', -1,                              desc='(default -1, use Powheg default)' )
     self.decorated.add_parameter( 'itmx1rm', None,                              desc='(default None) number of iterations for initializing the integration grid for the remnant.' )
     self.decorated.add_parameter( 'itmx2rm', None,                              desc='(default None) number of iterations for computing the integral and finding upper bound for the remnant.' )
-    self.decorated.fix_parameter( 'lhrwgt_descr', 'nominal',                    desc='weight description.' )
-    self.decorated.fix_parameter( 'lhrwgt_id', 0,                               desc='weight ID.' )
-    self.decorated.fix_parameter( 'lhrwgt_group_combine', 'none',               desc='reweighting combination method.' )
-    self.decorated.fix_parameter( 'lhrwgt_group_name', 'none',                  desc='group description.' )
+    self.decorated.fix_parameter( 'lhrwgt_descr', 'nominal',                    desc='(default "nominal") weight description.' )
+    self.decorated.fix_parameter( 'lhrwgt_id', 0,                               desc='(default 0) weight ID.' )
+    self.decorated.fix_parameter( 'lhrwgt_group_combine', 'none',               desc='(default "none") reweighting combination method.' )
+    self.decorated.fix_parameter( 'lhrwgt_group_name', 'nominal',               desc='(default "nominal") group description.' )
     self.decorated.fix_parameter( 'LOevents', ['-1','1'][self.decorated.is_LO], desc='(default process-dependent) produce LOPS events (scalup=ptj); in this case bornonly should also be enabled.' )
     self.decorated.add_parameter( 'minlo', 1,                                   desc='(default enabled where available) use MiNLO.' ) # if minlo is set for unsupported processes, Powheg will crash with an 'st_bornorder' error
     self.decorated.add_parameter( 'ncall1rm', None,                             desc='(default None) number of calls for initializing the integration grid for the remant.' )
@@ -55,10 +55,10 @@ class V2Decorator(object) :
       self.decorated.fix_parameter( 'xgriditeration', 1,  desc='(default 1) iteration level for the calculation of the importance sampling grid (only relevant for parallelstage=1).' )
 
     ## Set remnant properties to be equal to regular properties if not set
-    if self.decorated.itmx1rm is None : self.decorated.itmx1rm = -1 #self.decorated.itmx1
-    if self.decorated.itmx2rm is None : self.decorated.itmx2rm = -1 #self.decorated.itmx2
-    if self.decorated.ncall1rm is None : self.decorated.ncall1rm = -1 #self.decorated.ncall1
-    if self.decorated.ncall2rm is None : self.decorated.ncall2rm = -1 #self.decorated.ncall2
+    if self.decorated.itmx1rm is None : self.decorated.itmx1rm = -1
+    if self.decorated.itmx2rm is None : self.decorated.itmx2rm = -1
+    if self.decorated.ncall1rm is None : self.decorated.ncall1rm = -1
+    if self.decorated.ncall2rm is None : self.decorated.ncall2rm = -1
 
     ## Fix integration parameters before printing list for user
-    [ self.decorated.fix_parameter( parameter ) for parameter in ('itmx1rm', 'itmx2rm', 'ncall1rm', 'ncall2rm', 'parallelstage') ]
+    [ self.decorated.fix_parameter( parameter ) for parameter in ['parallelstage'] ]
diff --git a/Generators/PowhegControl/python/decorators/WWDecayDecorator.py b/Generators/PowhegControl/python/decorators/WWDecayDecorator.py
index 06e4808d4acb65cb56e5d0857b4f599347b14ebd..f6dc52a6a5a6ec2963e6372decea42807fa88559 100644
--- a/Generators/PowhegControl/python/decorators/WWDecayDecorator.py
+++ b/Generators/PowhegControl/python/decorators/WWDecayDecorator.py
@@ -25,9 +25,6 @@ class WWDecayDecorator(object) :
   def finalise( self ) :
     # Calculate appropriate decay mode numbers
     __decay_code_lookup = { 'e':-11, 'mu':-13, 'tau':-15, 'emu':-113, 'l':-135 }
-    # 11 e-; 13 mu-; 15 tau-; -11 e+; -13 mu+; -15 tau+;
-    # 113 e- and mu- together; -113 e+ and mu+ together;
-    # 135 e+, mu+ and tau+ together; -135 e-, mu- and tau- together (surely the other way around?)
     if self.decorated.decay_mode not in self.decorated.allowed_decay_modes :
       self.decorated.logger.warning( 'Decay mode {0} not recognised!'.format( self.decorated.decay_mode ) )
     __W_sign = [-1,+1][ 'WpWp' in self.decorated.decay_mode ]
diff --git a/Generators/PowhegControl/python/processes/PowhegConfig_ZZ.py b/Generators/PowhegControl/python/processes/PowhegConfig_ZZ.py
index 8598122180bf154ba5ffcd6f177a95b489cc8528..ca1823c39bfd191a48686cc40bf012fc7d82aaba 100644
--- a/Generators/PowhegControl/python/processes/PowhegConfig_ZZ.py
+++ b/Generators/PowhegControl/python/processes/PowhegConfig_ZZ.py
@@ -26,7 +26,6 @@ class PowhegConfig_ZZ(PowhegConfig_base) :
     ## Decorate with generic option sets
     self.add_parameter_set( 'diboson' )
     self.add_parameter_set( 'diboson interference' )
-    self.add_parameter_set( 'extra tests' )
     self.add_parameter_set( 'fixed scale' )
     self.add_parameter_set( 'LHEv3' )
     self.add_parameter_set( 'running width' )
diff --git a/Generators/PowhegControl/python/processes/PowhegConfig_Zj.py b/Generators/PowhegControl/python/processes/PowhegConfig_Zj.py
index 8f7ac3f605e4f7f79a62ad2ec0788ff5a5097627..dd1162e5545b39af758d9c3fe955bed9d8926ae8 100644
--- a/Generators/PowhegControl/python/processes/PowhegConfig_Zj.py
+++ b/Generators/PowhegControl/python/processes/PowhegConfig_Zj.py
@@ -21,7 +21,6 @@ class PowhegConfig_Zj(PowhegConfig_base) :
     self._powheg_executable += '/Zj/pwhg_main'
 
     ## Decorate with generic option sets
-    self.add_parameter_set( 'extra tests' )
     self.add_parameter_set( 'lepton mass' )
     self.add_parameter_set( 'LHEv3' )
     self.add_parameter_set( 'MiNLO NNLL' )
diff --git a/Generators/PowhegControl/python/processes/PowhegConfig_ggF_H.py b/Generators/PowhegControl/python/processes/PowhegConfig_ggF_H.py
index 315528f3d8cc112c171de44ed13b55775f8442a6..4edf29035afe9f45eef6d80d1cf7c0fb2e67b8c5 100644
--- a/Generators/PowhegControl/python/processes/PowhegConfig_ggF_H.py
+++ b/Generators/PowhegControl/python/processes/PowhegConfig_ggF_H.py
@@ -24,7 +24,7 @@ class PowhegConfig_ggF_H(PowhegConfig_base) :
     ## Add process specific options
     self.add_parameter( 'bwshape', 1,                        desc='(default 1). Functional form of Breit-Wigner used to distribute Higgs virtuality. 1:running width; 2:hwidth' )
     self.add_parameter( 'ew', 1,                             desc='(default 1, enabled). Enable EW corrections' )
-    self.fix_parameter( 'gfermi', ATLASCommonParameters.G_F, desc='(default ATLAS). Fermi constant' )
+    self.add_parameter( 'gfermi', ATLASCommonParameters.G_F, desc='(default ATLAS). Fermi constant' )
     self.add_parameter( 'massren', 0,                        desc='(default 0). 0 = OS, 1 = MSBAR, 2 = DRBAR' )
     self.add_parameter( 'model', 0,                          desc='(default 0). 0 = SM' )
 
diff --git a/Generators/PowhegControl/python/processes/PowhegConfig_jj.py b/Generators/PowhegControl/python/processes/PowhegConfig_jj.py
index 774670ea7e322954be2a8180e0141f3f90ddad82..353876ade48794516b331b9ff7fc1853f074f62b 100644
--- a/Generators/PowhegControl/python/processes/PowhegConfig_jj.py
+++ b/Generators/PowhegControl/python/processes/PowhegConfig_jj.py
@@ -21,20 +21,21 @@ class PowhegConfig_jj(PowhegConfig_base) :
     self._powheg_executable += '/Dijet/pwhg_main'
 
     ## Decorate with generic option sets
+    self.add_parameter_set( 'extra tests' )
     self.add_parameter_set( 'fixed scale' )
     self.add_parameter_set( 'jacsing' )
     self.add_parameter_set( 'LHEv3' )
     self.add_parameter_set( 'v2' )
 
     ## Set optimised integration parameters
-    self.itmx1    = 1
-    self.itmx2    = 12
-    self.ncall1   = 8000
-    self.ncall2   = 800000
-    self.nubound  = 1200000
+    self.itmx1    = 2
+    self.itmx2    = 10
+    self.ncall1   = 10000
+    self.ncall2   = 200000
+    self.nubound  = 150000
     self.xupbound = 10
     self.foldx    = 10
-    self.foldy    = 25
+    self.foldy    = 10
     self.foldphi  = 10
 
     ## Override defaults
diff --git a/Generators/PowhegControl/python/processes/PowhegConfig_tt.py b/Generators/PowhegControl/python/processes/PowhegConfig_tt.py
index 4a8c2777363b486bde3bcab317f4a491487cd448..5ec7b61cda04d23fe4f4b2a63e69ea97e10ffaf8 100644
--- a/Generators/PowhegControl/python/processes/PowhegConfig_tt.py
+++ b/Generators/PowhegControl/python/processes/PowhegConfig_tt.py
@@ -22,15 +22,15 @@ class PowhegConfig_tt(PowhegConfig_base) :
     self._powheg_executable += '/hvq/pwhg_main'
 
     ## Add process specific options
-    self.fix_parameter( 'tdec/bmass', ATLASCommonParameters.mass_b,            desc='b quark mass in t decay' )
-    self.fix_parameter( 'tdec/cmass', ATLASCommonParameters.mass_c,            desc='c quark mass' )
-    self.fix_parameter( 'tdec/dmass', ATLASCommonParameters.mass_d,            desc='d quark mass' )
-    self.fix_parameter( 'tdec/sin2cabibbo', ATLASCommonParameters.sin2cabibbo, desc='sine of Cabibbo angle squared' )
-    self.fix_parameter( 'tdec/smass', ATLASCommonParameters.mass_s,            desc='s quark mass' )
-    self.fix_parameter( 'tdec/twidth', ATLASCommonParameters.width_t,          desc='top width' )
-    self.fix_parameter( 'tdec/umass', ATLASCommonParameters.mass_u,            desc='u quark mass' )
-    self.fix_parameter( 'tdec/wmass', ATLASCommonParameters.mass_W,            desc='W mass for top decay' )
-    self.fix_parameter( 'tdec/wwidth', ATLASCommonParameters.width_W,          desc='W width' )
+    self.add_parameter( 'tdec/bmass', ATLASCommonParameters.mass_b,            desc='b quark mass in t decay' )
+    self.add_parameter( 'tdec/cmass', ATLASCommonParameters.mass_c,            desc='c quark mass' )
+    self.add_parameter( 'tdec/dmass', ATLASCommonParameters.mass_d,            desc='d quark mass' )
+    self.add_parameter( 'tdec/sin2cabibbo', ATLASCommonParameters.sin2cabibbo, desc='sine of Cabibbo angle squared' )
+    self.add_parameter( 'tdec/smass', ATLASCommonParameters.mass_s,            desc='s quark mass' )
+    self.add_parameter( 'tdec/twidth', ATLASCommonParameters.width_t,          desc='top width' )
+    self.add_parameter( 'tdec/umass', ATLASCommonParameters.mass_u,            desc='u quark mass' )
+    self.add_parameter( 'tdec/wmass', ATLASCommonParameters.mass_W,            desc='W mass for top decay' )
+    self.add_parameter( 'tdec/wwidth', ATLASCommonParameters.width_W,          desc='W width' )
 
     ## Decorate with generic option sets
     self.add_parameter_set( 'extra tests' )
diff --git a/Generators/PowhegControl/python/strategies/AfterburnerNNLOReweighting.py b/Generators/PowhegControl/python/strategies/AfterburnerNNLOReweighting.py
index c837f1ffd86fc0496c0555bbe39188cea1b7d61f..db841ec77fc0f0db144d5df8bfd2ecd303560093 100644
--- a/Generators/PowhegControl/python/strategies/AfterburnerNNLOReweighting.py
+++ b/Generators/PowhegControl/python/strategies/AfterburnerNNLOReweighting.py
@@ -28,6 +28,7 @@ class AfterburnerNNLOReweighting :
     self._LHEF_nnlo_name = 'pwgevents.lhe.nnlo'
     self._NNLO_reweighting_inputs = configurator.NNLO_reweighting_inputs
     self._NNLO_output_weights = configurator.NNLO_output_weights
+    self._nominal_group_name = [ x[1] for x in configurator.fixed_parameters if x[0] == 'lhrwgt_group_name' ][0]
 
     ## Strip comment strings from input LHEF file - reweighter will crash otherwise
     self._logger.info( 'Removing comments from input LHE file' )
@@ -145,12 +146,12 @@ class AfterburnerNNLOReweighting :
         for input_line in f_input :
           output_line = input_line
           for idx, weight_ID, weight_description in self._NNLO_weight_descriptors :
+            # Switch weight ID/description naming
             if "id='{0}'".format(weight_ID) in output_line :
-              # Switch weight ID/description naming
               output_line = output_line.replace( weight_ID, str(idx) ).replace( weight_description, weight_ID )
+          # Convert exponential delimiter
           if "wgt id=" in output_line :
-            # Convert exponential delimiter
-            output_line = output_line.replace( 'D+', 'E+' ).replace( 'D-', 'E-' )
+            output_line = output_line.replace('D+','E+').replace('D-','E-')
           if len(output_line) > 1 : # strip empty lines
             f_output.write( output_line )
 
@@ -179,16 +180,32 @@ class AfterburnerNNLOReweighting :
     if header_elem.find('initrwgt') is None :
       header_elem.append( ElementTree.fromstring('<initrwgt></initrwgt>') )
 
-    ## Add weight names to header
-    existing_weights = sorted( [ int(weight_elem.attrib['id']) for weight_elem in header_elem.getiterator(tag='weight') ] )
-    first_unused_weight = max( [ w for w in existing_weights if 4000<=w<5000 ]+[4000] ) + 1
+    ## Add nominal and DYNNLO weightgroups to the header
+    weightgroups = [ x for x in header_elem.find('initrwgt').findall('weightgroup') ]
+    for weightgroup_name in [ self._nominal_group_name, 'dynnlo' ] :
+      if not any( [ weightgroup.attrib['name'] == weightgroup_name for weightgroup in weightgroups ] ) :
+        header_elem.find('initrwgt').append( ElementTree.fromstring('<weightgroup combine="none" name="{0}"></weightgroup>'.format(weightgroup_name)) )
+        self._logger.info( 'Adding LHEv3 weightgroup: {0}'.format(weightgroup_name) )
+
+    ## Add nominal weight name to header
+    weightgroup = [ x for x in header_elem.find('initrwgt').findall('weightgroup') if x.attrib['name'] == self._nominal_group_name ][0]
+    if not any( [ weight.attrib['id'] == '0' for weight in weightgroup.findall('weight') ] ) :
+      weightgroup.append( ElementTree.fromstring("<weight id='0'> nominal </weight>") )
+      self._logger.info( 'Adding LHEv3 weight: nominal' )
+
+    ## Add DYNNLO weight names to header
+    try :
+      weight_elems = header_elem.iter(tag='weight') # needs python >= 2.7
+    except AttributeError :
+      weight_elems = header_elem.getiterator(tag='weight')
+    existing_weights = sorted( [ int(weight_elem.attrib['id']) for weight_elem in weight_elems ] )
+    weight_number_offset = max( [ w for w in existing_weights if 4000<=w<5000 ]+[4000] ) + 1
+    weightgroup = [ x for x in header_elem.find('initrwgt').findall('weightgroup') if x.attrib['name'] == 'dynnlo' ][0]
     weight_name_to_id = {}
-    header_elem.find('initrwgt').append( ElementTree.fromstring('<weightgroup combine="none" name="dynnlo"></weightgroup>') )
-    for weightgroup_elem in header_elem.find('initrwgt').findall('weightgroup') :
-      if weightgroup_elem.attrib['name'] == 'dynnlo' :
-        for idx, weight in enumerate(weights) :
-          weight_name_to_id[weight[0]] = first_unused_weight+idx
-          weightgroup_elem.append( ElementTree.fromstring('<weight id="{0}">{1}</weight>'.format(weight_name_to_id[weight[0]],weight[0])) )
+    for idx, weight in enumerate(weights) :
+      weight_name_to_id[weight[0]] = weight_number_offset+idx
+      weightgroup.append( ElementTree.fromstring('<weight id="{0}"> {1} </weight>'.format(weight_name_to_id[weight[0]],weight[0])) )
+      self._logger.info( 'Adding LHEv3 weight: {0}'.format(weight[0]) )
     self.reindent(header_elem)
 
     ## Process input events
@@ -202,8 +219,11 @@ class AfterburnerNNLOReweighting :
           if '<event>' in line : in_event = True
           if in_event : event_lines += line
           if '</event>' in line :
+            # Construct LHEv3 weight lines
             if '#new weight,renfact,facfact,pdf1,pdf2' in event_lines :
-              if not '<rwgt>' in event_lines : event_lines = event_lines[:event_lines.find('#')] + '<rwgt>\n</rwgt>\n' + event_lines[event_lines.find('#'):]
+              if not '<rwgt>' in event_lines :
+                nominal_weight = [ x for x in event_lines.split('\n')[1].split(' ') if len(x) > 0 ][2]
+                event_lines = event_lines[:event_lines.find('#')] + "<rwgt>\n<wgt id='0'> {0} </wgt>\n</rwgt>\n".format(nominal_weight) + event_lines[event_lines.find('#'):]
               weight_lines = ''.join( [ "<wgt id='{0}'> {1} </wgt>\n".format( weight_name_to_id[weight[0]], weight[1] ) for weight in LHEHandler.weights_from_event( event_lines ) ] )
               output_lines = event_lines[:event_lines.find('</rwgt>')] + weight_lines + event_lines[event_lines.find('</rwgt>'):event_lines.find('#new weight,renfact,facfact,pdf1,pdf2')]+'</event>\n'
             else :