diff --git a/FixedOrderGen/t/PSP_channel.cc b/FixedOrderGen/t/PSP_channel.cc
index 29ae1ca..adb7491 100644
--- a/FixedOrderGen/t/PSP_channel.cc
+++ b/FixedOrderGen/t/PSP_channel.cc
@@ -1,226 +1,226 @@
 /**
  *  check that the sum of all possible quarks is the same as a proton
  *
  *  \authors   The HEJ collaboration (see AUTHORS for details)
  *  \date      2020
  *  \copyright GPLv2 or later
  */
 #include <array>
 #include <cmath>
 #include <iostream>
 #include <memory>
 
 #include "HEJ/Mixmax.hh"
 #include "HEJ/Event.hh"
 
 #include "config.hh"
 #include "EventGenerator.hh"
 
 //! throw error if condition not fulfilled
 #define ASSERT(x) if(!(x)) { \
     throw std::logic_error("Assertion '" #x "' failed."); \
   }
 
 //! throw error if condition not fulfilled
 #define ASSERT_THROW(x, exception) try { \
       x; \
       std::cerr << "'" #x "' did not throw an exception.\n"; \
       throw; \
     } catch(exception const & ex){ \
       std::cout << "throw triggered: " << ex.what() << std::endl; \
     } \
     catch (...) { \
       std::cerr << "Unexpected exception thrown for '" #x "'.\n"; \
       throw; \
     }
 
 namespace {
 
   HEJFOG::EventGenerator make_generator(
     HEJFOG::Config const & config,
     std::shared_ptr<HEJ::RNG> ran
   ){
     return HEJFOG::EventGenerator{
       config.process,
       config.beam,
       HEJ::ScaleGenerator{
         config.scales.base,
         config.scales.factors,
         config.scales.max_ratio
       },
       config.jets,
       config.pdf_id,
       config.subleading_fraction,
       config.subleading_channels,
       config.particle_decays,
       config.Higgs_coupling,
       config.ew_parameters,
       ran
     };
   }
 
   const static std::array<HEJ::ParticleID, 11> PARTONS{
     HEJ::ParticleID::g,
     HEJ::ParticleID::d, HEJ::ParticleID::u,
     HEJ::ParticleID::s, HEJ::ParticleID::c,
     HEJ::ParticleID::b,
     HEJ::ParticleID::d_bar, HEJ::ParticleID::u_bar,
     HEJ::ParticleID::s_bar, HEJ::ParticleID::c_bar,
     HEJ::ParticleID::b_bar
   };
 
   bool only_channel(
     HEJFOG::Subleading channels,
     HEJFOG::subleading::Channels selected
   ){
     return channels[selected] && channels.reset(selected).none();
   }
 
   void generate_till_throw(HEJFOG::EventGenerator & gen ){
     for(std::size_t i=0; i<100; ++i){
         auto ev = gen.gen_event();
         if(gen.status()==HEJFOG::Status::good){
           std::cerr << "Wrongfully generated valid event!" << *ev <<"\n";
           throw;
         }
     }
     std::cerr << "Unable to generate a proper throw!\n";
     throw;
   }
 
   bool can_couple_to_W(HEJ::ParticleID const id, HEJ::ParticleID const boson){
     using namespace HEJ;
     if(!is_anyquark(id)){
       return false;
     }
     if(std::abs(id)==HEJ::ParticleID::b || std::abs(id)==HEJ::ParticleID::top)
       return false;
     // Wp:
     if(boson>0){
       // anti-down
       if(id%2==0){
         return is_quark(id);
       }
       // or up-type quark
       return is_antiquark(id);
     }
     // Wm:
     // down
     if(id%2==0){
       return is_antiquark(id);
     }
     // or anti-up-type quark
     return is_quark(id);
   }
 }
 
 int main(int argc, char const *argv[])
 {
   if(argc != 2 && argc != 3){
     std::cerr << "Usage: " << argv[0] << " config.yaml\n";
     return EXIT_FAILURE;
   }
   const bool short_only = argc==3;
   std::cout <<std::scientific;
 
   auto config = HEJFOG::load_config(argv[1]);
   config.events/=2.;
   auto ran = std::make_shared<HEJ::Mixmax>();
 
   if(short_only)
-    config.events/=10.;
+    config.events/=20.;
 
   double tot_weight = 0.;
   double tot_err = 0.;
   config.process.incoming[0] = config.process.incoming[1] = HEJ::ParticleID::proton;
   {
     HEJFOG::EventGenerator gen = make_generator(config, ran);
     for(std::size_t i=0; i<config.events; ++i){
       auto const ev = gen.gen_event();
       if(ev){
         double const wgt = ev->central().weight/config.events;
         tot_weight += wgt;
         tot_err += wgt*wgt;
       }
     }
     ASSERT(tot_weight!=0.);
   }
   tot_err = std::sqrt(tot_err);
 
 
   config.events /= PARTONS.size();
   double tot_channels = 0.;
   double err_channels = 0.;
   for(auto b1: PARTONS){
     for(auto b2: PARTONS){
       double wgt_channel = 0.;
       double err_channel = 0.;
       config.process.incoming[0] = b1;
       config.process.incoming[1] = b2;
       HEJFOG::EventGenerator gen = make_generator(config, ran);
       std::cout << name(b1) << "+" << name(b2) << " " <<std::flush;
       // for pure subleading configurations some setups states should throw
       if(config.subleading_fraction == 1.){
         if( only_channel(config.subleading_channels, HEJFOG::subleading::uno) ){
           if(HEJ::is_gluon(b1) && HEJ::is_gluon(b2)){
             std::cout << "uno" << std::endl;
             ASSERT_THROW(generate_till_throw(gen), std::invalid_argument);
             continue;
           }
         }
         if( only_channel(config.subleading_channels, HEJFOG::subleading::eqqx) ){
           if(HEJ::is_anyquark(b1) && HEJ::is_anyquark(b2)){
             std::cout << "eqqx" << std::endl;
             ASSERT_THROW(generate_till_throw(gen), std::invalid_argument);
             continue;
           }
         }
       }
       // for W+jets we need the correct quarks
       if(config.process.boson
           && std::abs(*config.process.boson) == HEJ::ParticleID::Wp
       ){
         if(config.process.njets>3
             && config.subleading_fraction>0.
             && config.subleading_channels[HEJFOG::subleading::cqqx]){
           // this will force central qqx
         } else if(config.process.njets>2
             && config.subleading_fraction>0.
             && config.subleading_channels[HEJFOG::subleading::eqqx]){
           // this will force extremal qqx
         } else {
           auto const boson = *config.process.boson;
           if(!can_couple_to_W(b1, boson)
               && !can_couple_to_W(b2, boson)
           ){
             std::cout << "bad " << name(boson) << std::endl;
             ASSERT_THROW(generate_till_throw(gen), std::invalid_argument);
             continue;
           }
         }
       }
       for(std::size_t i=0; i<config.events; ++i){
         // everything else should work
         auto const ev = gen.gen_event();
         if(ev){
           double const wgt = ev->central().weight/config.events;
           wgt_channel += wgt;
           err_channel += wgt*wgt;
         }
       }
       ASSERT(wgt_channel!=0.);
       tot_channels += wgt_channel;
       err_channels += err_channel;
       err_channel = std::sqrt(err_channel);
       std::cout << "=> " << wgt_channel << " +/- " << err_channel << std::endl;
     }
   }
   err_channels = std::sqrt(err_channels);
   std::cout << tot_weight << " +/- " << tot_err
     << " vs. " << tot_channels << " +/- " << err_channels << std::endl;
 
   ASSERT(std::abs(tot_weight - tot_channels)
     < 2.*sqrt(err_channels*err_channels+tot_err*tot_err));
 
   return EXIT_SUCCESS;
 }
diff --git a/FixedOrderGen/t/PSP_subl.cc b/FixedOrderGen/t/PSP_subl.cc
index fc2846c..067dc39 100644
--- a/FixedOrderGen/t/PSP_subl.cc
+++ b/FixedOrderGen/t/PSP_subl.cc
@@ -1,221 +1,221 @@
 /**
  *  check that each subprocess xs is correctly generated when only selecting one
  *
  *  \authors   The HEJ collaboration (see AUTHORS for details)
  *  \date      2020
  *  \copyright GPLv2 or later
  */
 #include <array>
 #include <cmath>
 #include <iostream>
 #include <memory>
 
 #include "HEJ/Mixmax.hh"
 #include "HEJ/Event.hh"
 #include "HEJ/CrossSectionAccumulator.hh"
 
 #include "config.hh"
 #include "EventGenerator.hh"
 
 //! throw error if condition not fulfilled
 #define ASSERT(x) if(!(x)) { \
     throw std::logic_error("Assertion '" #x "' failed."); \
   }
 
 //! throw error if condition not fulfilled
 #define ASSERT_THROW(x, exception) try { \
       x; \
       std::cerr << "'" #x "' did not throw an exception.\n"; \
       throw; \
     } catch(exception const & ex){ \
       std::cout << "throw triggered: " << ex.what() << std::endl; \
     } \
     catch (...) { \
       std::cerr << "Unexpected exception thrown for '" #x "'.\n"; \
       throw; \
     }
 
 namespace {
   const static std::array<HEJ::event_type::EventType, 6> ALL_TYPES{
     HEJ::event_type::FKL,
     HEJ::event_type::unordered_backward,
     HEJ::event_type::unordered_forward,
     HEJ::event_type::extremal_qqxb,
     HEJ::event_type::extremal_qqxf,
     HEJ::event_type::central_qqx
   };
 
   HEJFOG::EventGenerator make_generator(
     HEJFOG::Config const & config,
     std::shared_ptr<HEJ::RNG> ran
   ){
     return HEJFOG::EventGenerator{
       config.process,
       config.beam,
       HEJ::ScaleGenerator{
         config.scales.base,
         config.scales.factors,
         config.scales.max_ratio
       },
       config.jets,
       config.pdf_id,
       config.subleading_fraction,
       config.subleading_channels,
       config.particle_decays,
       config.Higgs_coupling,
       config.ew_parameters,
       ran
     };
   }
 
   bool valid_type(
       HEJFOG::Subleading const channels, HEJ::event_type::EventType type
   ){
     using namespace HEJ::event_type;
     using c = HEJFOG::subleading::Channels;
     if(channels.none())
       return type == FKL;
     if(channels.count()!=1)
       return false;
     if(channels[c::uno])
       return type == unob || type == unof;
     if(channels[c::eqqx])
       return type == qqxexb || type == qqxexf;
     if(channels[c::cqqx])
       return type == qqxmid;
     throw HEJ::unknown_option{"wrong channel"};
   }
 
   void generate_till_throw(HEJFOG::EventGenerator & gen ){
     for(std::size_t i=0; i<100; ++i){
         auto ev = gen.gen_event();
         if(gen.status()==HEJFOG::Status::good){
           std::cerr << "Wrongfully generated valid event!" << *ev <<"\n";
           throw;
         }
     }
     std::cerr << "Unable to generate a proper throw!\n";
     throw;
   }
 }
 
 int main(int argc, char const *argv[])
 {
   if(argc != 2 && argc != 3){
     std::cerr << "Usage: " << argv[0] << " config.yaml\n";
     return EXIT_FAILURE;
   }
   const bool short_only = argc==3;
   std::cout <<std::scientific;
 
   auto config = HEJFOG::load_config(argv[1]);
   auto ran = std::make_shared<HEJ::Mixmax>();
 
   if(short_only)
-    config.events/=10.;
+    config.events/=40.;
 
   // mixes sample
   HEJ::CrossSectionAccumulator xs_tot;
   config.process.incoming[0] = config.process.incoming[1] = HEJ::ParticleID::proton;
   config.subleading_fraction=0.8;
   if(config.process.boson && *config.process.boson == HEJ::ParticleID::Higgs){
     config.subleading_channels.reset();
     config.subleading_channels.set(HEJFOG::subleading::uno);
   } else {
     config.subleading_channels.set();
   }
   {
     HEJFOG::EventGenerator gen = make_generator(config, ran);
     for(std::size_t i=0; i<config.events; ++i){
       auto ev = gen.gen_event();
       if(ev){
         ev->central().weight /= config.events;
         xs_tot.fill(*ev);
       }
     }
     ASSERT(xs_tot.total().value!=0.);
   }
 
   // config.events /= HEJFOG::subleading::last+1;
 
   // pure FKL
   HEJ::CrossSectionAccumulator xs_subl;
   {
     config.subleading_fraction = 0.;
     HEJFOG::EventGenerator gen = make_generator(config, ran);
     for(std::size_t i=0; i<config.events; ++i){
       auto ev = gen.gen_event();
       if(ev){
         ev->central().weight /= config.events;
         xs_subl.fill(*ev);
         ASSERT(valid_type(0,ev->type()));
       }
     }
     ASSERT(xs_subl.total().value!=0.);
     std::cout << "=>\n" << xs_subl << std::endl;
   }
 
   // pure subleading
   config.subleading_fraction = 1.;
   for(unsigned channel = HEJFOG::subleading::first;
                channel <= HEJFOG::subleading::last; ++channel
   ){
     if(config.process.njets < 4 && channel == HEJFOG::subleading::cqqx)
       continue;
     config.subleading_channels.reset();
     config.subleading_channels.set(channel);
     HEJFOG::EventGenerator gen = make_generator(config, ran);
     HEJ::CrossSectionAccumulator xs_channel;
     std::cout << config.subleading_channels << " " <<std::flush;
     // Higgs+jets can only generate uno events
     if(config.process.boson
         && *config.process.boson == HEJ::ParticleID::Higgs
         && channel != HEJFOG::subleading::uno
     ){
       ASSERT_THROW(generate_till_throw(gen), HEJ::not_implemented);
       continue;
     }
     for(std::size_t i=0; i<config.events; ++i){
       // everything else should work
       auto ev = gen.gen_event();
       if(ev){
         //! @FIXME for Higgs+jets we do actually generate FKL events ...
         if(config.process.boson
             && *config.process.boson == HEJ::ParticleID::Higgs
             && ev->type()==HEJ::event_type::FKL)
           continue;
         ev->central().weight /= config.events;
         xs_subl.fill(*ev);
         xs_channel.fill(*ev);
         ASSERT(valid_type(config.subleading_channels,ev->type()));
       }
     }
     ASSERT(xs_subl.total().value!=0.);
     std::cout << "=>\n" << xs_channel << std::endl;
   }
   std::cout << "Total:\n" << xs_tot << " vs.\n" << xs_subl << std::endl;
 
   const double max_sigma = short_only?3.:2.;
   for(auto type: ALL_TYPES){
     double diff = 0.;
     double err = 1.;
     try {
       auto const & tot = xs_tot[type];
       auto const & subl = xs_subl[type];
       diff = tot.value - subl.value;
       err = sqrt(tot.error+subl.error);
     } catch (std::out_of_range const &){
       std::cout << name(type) << " not set" << std::endl;
       ASSERT_THROW(xs_tot[type], std::out_of_range);
       ASSERT_THROW(xs_subl[type], std::out_of_range);
       continue;
     }
     if(std::abs(diff) > max_sigma*err){
       std::cerr << "Large difference in " << name(type)
         << " (" << (diff/err) << " sigma)\n";
       return EXIT_FAILURE;
     }
   }
 
   return EXIT_SUCCESS;
 }