diff --git a/FixedOrderGen/t/CMakeLists.txt b/FixedOrderGen/t/CMakeLists.txt
index 8307199..aea83cd 100644
--- a/FixedOrderGen/t/CMakeLists.txt
+++ b/FixedOrderGen/t/CMakeLists.txt
@@ -1,72 +1,93 @@
 set(tst_dir "${CMAKE_CURRENT_SOURCE_DIR}")
 foreach(tst W_reconstruct_enu W_2j_classify W_nj_classify)
   add_executable(test_${tst} ${tst_dir}/${tst}.cc)
   target_link_libraries(test_${tst} hejfog_lib)
   add_test(NAME ${tst} COMMAND test_${tst} WORKING_DIRECTORY ${tst_dir})
 endforeach()
 # this only tests if the runcard actually works, not if the result is correct
 add_test(
   NAME main_2j
   COMMAND HEJFOG ${tst_dir}/config_2j.yml
   )
 add_test(
   NAME main_h2j
   COMMAND HEJFOG ${tst_dir}/config_h2j.yml
   )
 add_test(
   NAME main_h2j_decay
   COMMAND HEJFOG ${tst_dir}/config_h2j_decay.yml
   )
 add_test(
   NAME peakpt
   COMMAND HEJFOG ${tst_dir}/config_2j_peak.yml
   )
 
 # check that uno emission doesn't change FKL xs
 add_executable(FKL_uno FKL_uno.cc)
 target_link_libraries(FKL_uno hejfog_lib)
 add_test(
   NAME FKL_uno
   # calculated with HEJ revision 9570e3809613272ac4b8bf3236279ba23cf64d20
   COMMAND FKL_uno ${tst_dir}/config_h3j_uno.yml 0.0243548 0.000119862
 )
 # xs tests
 add_executable(xs_gen xs_gen.cc)
 target_link_libraries(xs_gen hejfog_lib)
 ## Higgs
 add_test(
   NAME xs_h2j
   # calculated with HEJ revision 9570e3809613272ac4b8bf3236279ba23cf64d20
   COMMAND xs_gen ${tst_dir}/config_h2j.yml 2.04928 0.00956022
 )
 add_test(
   NAME xs_h3j
   # calculated with HEJ revision bd4388fe55cbc3f5a7b6139096456c551294aa31
   COMMAND xs_gen ${tst_dir}/config_h3j.yml 1.07807 0.0132409
 )
 add_test(
   NAME xs_h5j
   # calculated with HEJ revision dbde2ffbb3b383ae6709b2424d8f0f9d5658270b
   COMMAND xs_gen ${tst_dir}/config_h5j.yml 0.0112504 0.000199633
 )
 add_test(
   NAME xs_h3j_uno
   # calculated with HEJ revision 9570e3809613272ac4b8bf3236279ba23cf64d20
   COMMAND xs_gen ${tst_dir}/config_h3j_uno.yml 0.00347538 3.85875e-05
 )
 add_test(
   NAME xs_h2j_decay
   # calculated with HEJ revision 9570e3809613272ac4b8bf3236279ba23cf64d20
   COMMAND xs_gen ${tst_dir}/config_h2j_decay.yml 0.00466994 2.20995e-05
 )
 ## pure jets
 add_test(
   NAME xs_2j
   # calculated with "combined" HEJ svn r3480
   COMMAND xs_gen ${tst_dir}/config_2j.yml 86.42031848e06 590570
 )
 add_test(
   NAME xs_4j
   # calculated with HEJ revision 13207b5f67a5f40a2141aa7ee515b022bd4efb65
   COMMAND xs_gen ${tst_dir}/config_4j.yml 915072 15402.4
 )
+## W
+add_test(
+  NAME xs_W2j
+  # calculated with HEJ revision 987bb30a7985a24a7961f98cfbbc74d3a7992970
+  COMMAND xs_gen ${tst_dir}/config_Wm2j.yml 231.404 3.43798
+)
+add_test(
+  NAME xs_W3j_uno
+  # calculated with HEJ revision 987bb30a7985a24a7961f98cfbbc74d3a7992970
+  COMMAND xs_gen ${tst_dir}/config_Wp3j_uno.yml 0.139372 0.00248345
+)
+add_test(
+  NAME xs_W3j_eqqx
+  # calculated with HEJ revision 987bb30a7985a24a7961f98cfbbc74d3a7992970
+  COMMAND xs_gen ${tst_dir}/config_Wp3j_qqx.yml 8.45323 0.103449
+)
+add_test(
+  NAME xs_W5j_qqx
+  # calculated with HEJ revision 987bb30a7985a24a7961f98cfbbc74d3a7992970
+  COMMAND xs_gen ${tst_dir}/config_Wp4j_qqx.yml 0.0851908 0.00300447
+)
diff --git a/FixedOrderGen/t/config_Wm2j.yml b/FixedOrderGen/t/config_Wm2j.yml
new file mode 100644
index 0000000..b31fe82
--- /dev/null
+++ b/FixedOrderGen/t/config_Wm2j.yml
@@ -0,0 +1,40 @@
+events: 200000
+
+jets:
+  min pt: 30
+  R: 0.4
+  algorithm: antikt
+  max rapidity: 5
+
+beam:
+  energy: 10000
+  particles: [p, p]
+
+pdf: 11000
+
+process: p p => 2j e- electron_antineutrino
+
+subleading fraction: 0
+subleading channels: none
+
+scales: 91
+
+random generator:
+  name: mixmax
+
+particle properties:
+  Higgs:
+    mass: 125
+    width: 0
+  W:
+    mass: 80.385
+    width: 2.085
+  Z:
+    mass: 91.187
+    width: 2.495
+
+vev: 246.2196508
+
+unweight:
+  sample size: 100
+  max deviation: -10
diff --git a/FixedOrderGen/t/config_Wp3j_qqx.yml b/FixedOrderGen/t/config_Wp3j_qqx.yml
new file mode 100644
index 0000000..8b7dfe1
--- /dev/null
+++ b/FixedOrderGen/t/config_Wp3j_qqx.yml
@@ -0,0 +1,40 @@
+events: 1000000
+
+jets:
+  min pt: 20
+  R: 0.4
+  algorithm: antikt
+  max rapidity: 5
+
+beam:
+  energy: 5000
+  particles: [p, p]
+
+pdf: 11000
+
+process: u u => W+ 3j
+
+subleading fraction: 1.
+subleading channels:
+  - qqx
+
+scales: 125
+
+particle properties:
+  Higgs:
+    mass: 125
+    width: 0
+  W:
+    mass: 80.385
+    width: 2.085
+  Z:
+    mass: 91.187
+    width: 2.495
+
+decays:
+  Wp: {into: [e+, nu_e], branching ratio: 1}
+
+random generator:
+  name: mixmax
+
+vev: 246.2196508
diff --git a/FixedOrderGen/t/config_Wp3j_uno.yml b/FixedOrderGen/t/config_Wp3j_uno.yml
new file mode 100644
index 0000000..9b39135
--- /dev/null
+++ b/FixedOrderGen/t/config_Wp3j_uno.yml
@@ -0,0 +1,40 @@
+events: 2000000
+
+jets:
+  min pt: 100
+  R: 0.5
+  algorithm: antikt
+  max rapidity: 5
+
+beam:
+  energy: 8000
+  particles: [p, p]
+
+pdf: 11000
+
+process: u u => W+ 3j
+
+subleading fraction: 1.
+subleading channels:
+  - unordered
+
+scales: 125
+
+particle properties:
+  Higgs:
+    mass: 125
+    width: 0
+  W:
+    mass: 80.385
+    width: 2.085
+  Z:
+    mass: 91.187
+    width: 2.495
+
+decays:
+  Wp: {into: [e+, nu_e], branching ratio: 1}
+
+random generator:
+  name: mixmax
+
+vev: 246.2196508
diff --git a/FixedOrderGen/t/config_Wp4j_qqx.yml b/FixedOrderGen/t/config_Wp4j_qqx.yml
new file mode 100644
index 0000000..66a842d
--- /dev/null
+++ b/FixedOrderGen/t/config_Wp4j_qqx.yml
@@ -0,0 +1,40 @@
+events: 1000000
+
+jets:
+  min pt: 40
+  R: 0.4
+  algorithm: antikt
+  max rapidity: 6
+
+beam:
+  energy: 6000
+  particles: [p, p]
+
+pdf: 11000
+
+process: u u => W+ 4j
+
+subleading fraction: 1.
+subleading channels:
+  - qqx
+
+scales: 125
+
+particle properties:
+  Higgs:
+    mass: 125
+    width: 0
+  W:
+    mass: 80.385
+    width: 2.085
+  Z:
+    mass: 91.187
+    width: 2.495
+
+decays:
+  Wp: {into: [e+, nu_e], branching ratio: 1}
+
+random generator:
+  name: mixmax
+
+vev: 246.2196508
diff --git a/FixedOrderGen/t/xs_gen.cc b/FixedOrderGen/t/xs_gen.cc
index 9a04a0a..31f0661 100644
--- a/FixedOrderGen/t/xs_gen.cc
+++ b/FixedOrderGen/t/xs_gen.cc
@@ -1,107 +1,114 @@
 /**
  *  \authors   The HEJ collaboration (see AUTHORS for details)
  *  \date      2020
  *  \copyright GPLv2 or later
  */
 #include <algorithm>
 #include <cmath>
 #include <cstdlib>
 #include <iostream>
 #include <memory>
 
 #include "HEJ/Event.hh"
 #include "HEJ/Mixmax.hh"
 #include "HEJ/PDG_codes.hh"
 #include "HEJ/ScaleFunction.hh"
 #include "HEJ/utility.hh"
 
 #include "config.hh"
 #include "EventGenerator.hh"
 #include "Status.hh"
 
 //! throw error if condition not fulfilled
 #define ASSERT(x) if(!(x)) { \
     throw std::logic_error("Assertion '" #x "' failed."); \
   }
 
 namespace {
   constexpr double invGeV2_to_pb = 389379292.;
 }
 
 int main(int argn, char const *argv[]){
   using namespace HEJFOG;
   if(argn != 4){
     std::cerr << "Usage: " << argv[0] << " config.yml xs xs_err";
     return EXIT_FAILURE;
   }
 
   const double xs_ref = std::stod(argv[2]);
   const double err_ref = std::stod(argv[3]);
 
   const auto config = load_config(argv[1]);
 
   std::shared_ptr<HEJ::RNG> ran{std::make_shared<HEJ::Mixmax>()};
   HEJFOG::EventGenerator generator{
     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
   };
 
   double xs = 0., xs_err = 0.;
   for (std::size_t trials = 0; trials < config.events; ++trials){
     auto ev = generator.gen_event();
     if(generator.status() != good) continue;
     ASSERT(ev);
 
     if(config.process.boson){
       const auto boson = std::find_if(
           begin(ev->outgoing()), end(ev->outgoing()),
           [&](HEJ::Particle const & p){ return p.type == *config.process.boson; }
       );
       ASSERT(boson != end(ev->outgoing()));
 
       if(!config.process.boson_decay.empty()){
         ASSERT(ev->decays().size() == 1);
         const auto decay = ev->decays().begin();
         ASSERT(ev->outgoing().size() > decay->first);
         ASSERT(decay->first == static_cast<std::size_t>(
                 std::distance(ev->outgoing().begin(), boson)));
         ASSERT(decay->second.size() == 2);
         auto const & decay_part = decay->second;
         ASSERT(decay_part[0].type == config.process.boson_decay[0]);
         ASSERT(decay_part[1].type == config.process.boson_decay[1]);
         ASSERT(HEJ::nearby_ep(decay_part[0].p + decay_part[1].p, boson->p, 1e-6));
       }
     }
 
     xs += ev->central().weight;
     xs_err += ev->central().weight*ev->central().weight;
   }
   xs_err = std::sqrt(xs_err);
   xs *= invGeV2_to_pb/config.events;
   xs_err *= invGeV2_to_pb/config.events;
   std::cout << xs_ref << " +- " << err_ref  << " (" << err_ref/xs_ref*100. << "%)"
     << " ~ " << xs << " +- " << xs_err
     << " (" << xs_err/xs*100. << "%)" << std::endl;
   std::cout << "=> "
             << std::abs(xs - xs_ref)/sqrt(xs_err*xs_err+err_ref*err_ref)
             << " sigma" << std::endl;
 
   ASSERT(std::abs(xs - xs_ref) < 2.*sqrt(xs_err*xs_err+err_ref*err_ref));
   ASSERT(std::abs(err_ref - xs_err) < 0.1*xs_err);
-  ASSERT(xs_err < 0.02*xs);
+  // TODO performance of W+jets is really bad, trying to get under 5% is too
+  // slow
+  if(config.process.boson
+      && std::abs(*config.process.boson) == HEJ::ParticleID::Wp){
+    ASSERT(xs_err < 0.04*xs);
+  } else {
+    ASSERT(xs_err < 0.02*xs);
+  }
 
   return EXIT_SUCCESS;
 }