diff --git a/Decay/Perturbative/SMWFermionsPOWHEGDecayer.cc b/Decay/Perturbative/SMWFermionsPOWHEGDecayer.cc
--- a/Decay/Perturbative/SMWFermionsPOWHEGDecayer.cc
+++ b/Decay/Perturbative/SMWFermionsPOWHEGDecayer.cc
@@ -1,636 +1,637 @@
 
 //-*-
 //
 // This is the implementation of the non-inlined, non-templated member
 // functions of the SMWFermionsPOWHEGDecayer class.
 //
 
 #include "SMWFermionsPOWHEGDecayer.h"
 #include "ThePEG/Utilities/DescribeClass.h"
 #include <numeric>
 #include "Herwig/Models/StandardModel/StandardModel.h"
 #include "ThePEG/PDF/PolarizedBeamParticleData.h"
 #include "ThePEG/Helicity/WaveFunction/VectorWaveFunction.h"
 #include "ThePEG/Interface/ClassDocumentation.h"
 #include "ThePEG/Interface/Parameter.h"
 #include "ThePEG/Interface/Reference.h"
 #include "ThePEG/Persistency/PersistentOStream.h"
 #include "ThePEG/Persistency/PersistentIStream.h"
 #include "Herwig/Shower/RealEmissionProcess.h"
 #include "Herwig/Shower/Core/Couplings/ShowerAlpha.h"
 
 using namespace Herwig;
 
 SMWFermionsPOWHEGDecayer::SMWFermionsPOWHEGDecayer() 
   : CF_(4./3.), pTmin_(1.*GeV)
 {  }
 
 IBPtr SMWFermionsPOWHEGDecayer::clone() const {
   return new_ptr(*this);
 }
 
 IBPtr SMWFermionsPOWHEGDecayer::fullclone() const {
   return new_ptr(*this);
 }
 
 void SMWFermionsPOWHEGDecayer::persistentOutput(PersistentOStream & os) const {
   os << FFGVertex_ << FFWVertex_ << gluon_ << ounit( pTmin_, GeV );
 }
 
 void SMWFermionsPOWHEGDecayer::persistentInput(PersistentIStream & is, int) {
   is >> FFGVertex_ >> FFWVertex_ >> gluon_ >> iunit( pTmin_, GeV );
 }
 
 // The following static variable is needed for the type
 // description system in ThePEG.
 DescribeClass<SMWFermionsPOWHEGDecayer,SMWDecayer>
 describeHerwigSMWFermionsPOWHEGDecayer("Herwig::SMWFermionsPOWHEGDecayer", "HwPerturbativeDecay.so");
 
 void SMWFermionsPOWHEGDecayer::Init() {
 
   static ClassDocumentation<SMWFermionsPOWHEGDecayer> documentation
     ("There is no documentation for the SMWFermionsPOWHEGDecayer class");
 
   static Parameter<SMWFermionsPOWHEGDecayer, Energy> interfacePtMin
     ("minpT",
      "The pt cut on hardest emision generation",
      &SMWFermionsPOWHEGDecayer::pTmin_, GeV, 1.*GeV, 0*GeV, 100000.0*GeV,
      false, false, Interface::limited);
 }
 
 RealEmissionProcessPtr SMWFermionsPOWHEGDecayer::
 generateHardest(RealEmissionProcessPtr born) {
   assert(born->bornOutgoing().size()==2);
   // check coloured
   if(!born->bornOutgoing()[0]->dataPtr()->coloured()) return RealEmissionProcessPtr();
   // extract required info
   partons_.resize(2);
   quark_.resize(2);
   vector<PPtr> hardProcess;
   wboson_ = born->bornIncoming()[0];
   hardProcess.push_back(wboson_);
   for(unsigned int ix=0;ix<born->bornOutgoing().size();++ix) {
     partons_[ix] = born->bornOutgoing()[ix]->dataPtr();
     quark_[ix]   = born->bornOutgoing()[ix]->momentum();
     quark_[ix].setMass(partons_[ix]->mass());
     hardProcess.push_back(born->bornOutgoing()[ix]);
   }
   bool order = partons_[0]->id()<0;
   if(order) {
     swap(partons_[0]   ,partons_[1]   );
     swap(quark_[0]     ,quark_[1]     );
     swap(hardProcess[1],hardProcess[2]);
   }
   gauge_.setMass(0.*MeV);
   // Get the W boson mass.
   mw2_ = (quark_[0] + quark_[1]).m2();
   // Generate emission and set _quark[0,1] and _gauge to be the 
   // momenta of q, qbar and g after the hardest emission:
   if(!getEvent(hardProcess)) {
     born->pT()[ShowerInteraction::QCD] = pTmin_;
     return born;
   }
   // Ensure the energies are greater than the constituent masses:
-  for (int i=0; i<2; i++) {
-    if (quark_[i].e() < partons_[i]->constituentMass()) return RealEmissionProcessPtr();
-  }
-  if (gauge_.e()    < gluon_     ->constituentMass()) return RealEmissionProcessPtr();
+  // for (int i=0; i<2; i++) {
+  //   if (quark_[i].e() < partons_[i]->constituentMass()) return RealEmissionProcessPtr();
+  // }
+  // if (gauge_.e()    < gluon_     ->constituentMass()) return RealEmissionProcessPtr();
   // set masses
   quark_[0].setMass( partons_[0]->mass() );
   quark_[1].setMass( partons_[1]->mass() );
   gauge_   .setMass( ZERO );
   // // assign the emitter based on evolution scales
   unsigned int iemitter   = quark_[0]*gauge_ > quark_[1]*gauge_ ? 2 : 1;
   unsigned int ispectator = iemitter==1                         ? 1 : 2;
   // create new partices and insert
   PPtr wboson = wboson_->dataPtr()->produceParticle(wboson_->momentum());
   born->incoming().push_back(wboson);
   PPtr newq = partons_[0]->produceParticle(quark_[0]);
   PPtr newa = partons_[1]->produceParticle(quark_[1]);
   PPtr newg = gluon_->produceParticle(gauge_);
   // make colour connections
   newg->colourNeighbour(newq);
   newa->colourNeighbour(newg);
   // insert in output structure
   if(!order) {
     born->outgoing().push_back(newq);
     born->outgoing().push_back(newa);
   }
   else {
     born->outgoing().push_back(newa);
     born->outgoing().push_back(newq);
     swap(iemitter,ispectator);
   }
   born->outgoing().push_back(newg);
   born->emitter  (iemitter  );
   born->spectator(ispectator);
   born->emitted  (3);
   born->pT()[ShowerInteraction::QCD] = pT_;
   // return process
   born->interaction(ShowerInteraction::QCD);
   return born;
 }
 
 double SMWFermionsPOWHEGDecayer::
 me2(const int ichan, const Particle & part,
     const ParticleVector & decay, MEOption meopt) const {
   // leading-order result
   double output = SMWDecayer::me2(ichan,part,decay,meopt);
   // check decay products coloured, otherwise return
   if(!decay[0]->dataPtr()->coloured()) return output;
   // inital masses, couplings  etc
   // W mass
   mW_ = part.mass();
   // strong coupling
   aS_ = SM().alphaS(sqr(mW_));
   // reduced mass
   double mu1_  = (decay[0]->dataPtr()->mass())/mW_;
   double mu2_  = (decay[1]->dataPtr()->mass())/mW_;
   // scale
   scale_ = sqr(mW_);
   // now for the nlo loop correction
   double virt = CF_*aS_/Constants::pi;
   // now for the real correction
   double realFact=0.;
   for(int iemit=0;iemit<2;++iemit) {
     double phi  = UseRandom::rnd()*Constants::twopi;
     // set the emitter and the spectator
     double muj  = iemit==0 ? mu1_ : mu2_;
     double muk  = iemit==0 ? mu2_ : mu1_;
     double muj2 = sqr(muj);
     double muk2 = sqr(muk);
     // calculate y
     double yminus = 0.; 
     double yplus  = 1.-2.*muk*(1.-muk)/(1.-muj2-muk2);
     double y = yminus + UseRandom::rnd()*(yplus-yminus);
     double v = sqrt(sqr(2.*muk2 + (1.-muj2-muk2)*(1.-y))-4.*muk2)
       /(1.-muj2-muk2)/(1.-y);
     double zplus  = (1.+v)*(1.-muj2-muk2)*y/2./(muj2+(1.-muj2-muk2)*y);
     double zminus = (1.-v)*(1.-muj2-muk2)*y/2./(muj2+(1.-muj2-muk2)*y);
     double z = zminus + UseRandom::rnd()*(zplus-zminus);
     double jac = (1.-y)*(yplus-yminus)*(zplus-zminus);
     // calculate x1,x2,x3,xT
     double x2 = 1.-y*(1.-muj2-muk2)-muj2+muk2;
     double x1 = 1.+muj2-muk2-z*(x2-2.*muk2);
     // copy the particle objects over for calculateRealEmission
     vector<PPtr> hardProcess(3);
     hardProcess[0] = const_ptr_cast<PPtr>(&part);
     hardProcess[1] = decay[0];
     hardProcess[2] = decay[1];
     realFact = 0.25*jac*sqr(1.-muj2-muk2)/
       sqrt((1.-sqr(muj-muk))*(1.-sqr(muj+muk)))/Constants::twopi
       *2.*CF_*aS_*calculateRealEmission(x1, x2, hardProcess, phi, 
 					muj, muk, iemit, true);
   }
   // the born + virtual + real
   output = output*(1. + virt + realFact);
   return output;
 }
 
 double SMWFermionsPOWHEGDecayer::meRatio(vector<cPDPtr> partons, 
 					 vector<Lorentz5Momentum> momenta,
 				 	 unsigned int iemitter, bool subtract) const {
   Lorentz5Momentum q = momenta[1]+momenta[2]+momenta[3];
   Energy2 Q2=q.m2();
   Energy2 lambda = sqrt((Q2-sqr(momenta[1].mass()+momenta[2].mass()))*
 			(Q2-sqr(momenta[1].mass()-momenta[2].mass())));
   InvEnergy2 D[2];
   double lome[2];
   for(unsigned int iemit=0;iemit<2;++iemit) {
     unsigned int ispect = iemit==0 ? 1 : 0;    
     Energy2 pipj = momenta[3      ] * momenta[1+iemit ];
     Energy2 pipk = momenta[3      ] * momenta[1+ispect];
     Energy2 pjpk = momenta[1+iemit] * momenta[1+ispect];
     double y = pipj/(pipj+pipk+pjpk); 
     double z = pipk/(     pipk+pjpk);
     Energy mij = sqrt(2.*pipj+sqr(momenta[1+iemit].mass()));
     Energy2 lamB = sqrt((Q2-sqr(mij+momenta[1+ispect].mass()))*
 			(Q2-sqr(mij-momenta[1+ispect].mass())));
     Energy2 Qpk = q*momenta[1+ispect];
     Lorentz5Momentum pkt = 
       lambda/lamB*(momenta[1+ispect]-Qpk/Q2*q)
       +0.5/Q2*(Q2+sqr(momenta[1+ispect].mass())-sqr(momenta[1+ispect].mass()))*q;
     Lorentz5Momentum pijt = 
       q-pkt;
     double muj = momenta[1+iemit ].mass()/sqrt(Q2);
     double muk = momenta[1+ispect].mass()/sqrt(Q2);
     double vt = sqrt((1.-sqr(muj+muk))*(1.-sqr(muj-muk)))/(1.-sqr(muj)-sqr(muk));
     double v  = sqrt(sqr(2.*sqr(muk)+(1.-sqr(muj)-sqr(muk))*(1.-y))-4.*sqr(muk))
       /(1.-y)/(1.-sqr(muj)-sqr(muk));
     // dipole term
     D[iemit] = 0.5/pipj*(2./(1.-(1.-z)*(1.-y))
-			 -vt/v*(2.-z+sqr(momenta[1+iemit].mass())/pipj));
+    			 -vt/v*(2.-z+sqr(momenta[1+iemit].mass())/pipj));
     // matrix element
     vector<Lorentz5Momentum> lomom(3);
     lomom[0] = momenta[0];
     if(iemit==0) {
       lomom[1] = pijt;
       lomom[2] = pkt ;
     }
     else {
       lomom[2] = pijt;
       lomom[1] = pkt ;
     }
     lome[iemit]  = loME(partons,lomom);
   }
   InvEnergy2 ratio = realME(partons,momenta)*abs(D[iemitter])
     /(abs(D[0]*lome[0])+abs(D[1]*lome[1]));
   if(subtract)
     return Q2*(ratio-2.*D[iemitter]);
   else
     return Q2*ratio;
 }
 
 double SMWFermionsPOWHEGDecayer::loME(const vector<cPDPtr> & partons, 
 			const vector<Lorentz5Momentum> & momenta) const {
   // compute the spinors
   vector<VectorWaveFunction>    vin;
   vector<SpinorWaveFunction>    aout;
   vector<SpinorBarWaveFunction> fout;
   VectorWaveFunction    win  (momenta[0],partons[0],incoming);
   SpinorBarWaveFunction qkout(momenta[1],partons[1],outgoing);
   SpinorWaveFunction    qbout(momenta[2],partons[2],outgoing);
   for(unsigned int ix=0;ix<2;++ix){
     qkout.reset(ix);
     fout.push_back(qkout);
     qbout.reset(ix);
     aout.push_back(qbout);
   }
   for(unsigned int ix=0;ix<3;++ix){
     win.reset(ix);
     vin.push_back(win);
   }
   // temporary storage of the different diagrams
   // sum over helicities to get the matrix element
   double total(0.);
   for(unsigned int inhel=0;inhel<3;++inhel) {
     for(unsigned int outhel1=0;outhel1<2;++outhel1) {
       for(unsigned int outhel2=0;outhel2<2;++outhel2) {
 	Complex diag1 = FFWVertex()->evaluate(scale_,aout[outhel2],fout[outhel1],vin[inhel]);
 	total += norm(diag1);
       }
     }
   }
   // return the answer
   return total;
 }
  
 InvEnergy2 SMWFermionsPOWHEGDecayer::realME(const vector<cPDPtr> & partons, 
 			      const vector<Lorentz5Momentum> & momenta) const {
   // compute the spinors
   vector<VectorWaveFunction>     vin;
   vector<SpinorWaveFunction>     aout;
   vector<SpinorBarWaveFunction>  fout;
   vector<VectorWaveFunction>     gout;
   VectorWaveFunction    win  (momenta[0],partons[0],incoming);
   SpinorBarWaveFunction qkout(momenta[1],partons[1],outgoing);
   SpinorWaveFunction    qbout(momenta[2],partons[2],outgoing);
   VectorWaveFunction    gluon(momenta[3],partons[3],outgoing);
   for(unsigned int ix=0;ix<2;++ix){
     qkout.reset(ix);
     fout.push_back(qkout);
     qbout.reset(ix);
     aout.push_back(qbout);
     gluon.reset(2*ix);
     gout.push_back(gluon);
   }
   for(unsigned int ix=0;ix<3;++ix){
     win.reset(ix);
     vin.push_back(win);
   }
   vector<Complex> diag(2,0.);
 
   double total(0.);
   for(unsigned int inhel1=0;inhel1<3;++inhel1) {
     for(unsigned int outhel1=0;outhel1<2;++outhel1) {
       for(unsigned int outhel2=0;outhel2<2;++outhel2) {
 	for(unsigned int outhel3=0;outhel3<2;++outhel3) {
 	  SpinorBarWaveFunction off1 =
 	    FFGVertex()->evaluate(scale_,3,partons[1],fout[outhel1],gout[outhel3]);
 	  diag[0] = FFWVertex()->evaluate(scale_,aout[outhel2],off1,vin[inhel1]);
 
 	  SpinorWaveFunction off2 = 
 	    FFGVertex()->evaluate(scale_,3,partons[2],aout[outhel2],gout[outhel3]);
 	  diag[1] = FFWVertex()->evaluate(scale_,off2,fout[outhel1],vin[inhel1]);
 
 	  // sum of diagrams
 	  Complex sum = std::accumulate(diag.begin(),diag.end(),Complex(0.));
 	  // me2
 	  total += norm(sum);
 	}
       }
     }
   }
 
   // divide out the coupling
   total /= norm(FFGVertex()->norm());
   // return the total
   return total*UnitRemoval::InvE2;
 }
 
 void SMWFermionsPOWHEGDecayer::doinit() {
   // cast the SM pointer to the Herwig SM pointer
   tcHwSMPtr hwsm= dynamic_ptr_cast<tcHwSMPtr>(standardModel());
   // do the initialisation
   if(!hwsm) throw InitException() 
 	      << "Wrong type of StandardModel object in "
 	      << "SMWFermionsPOWHEGDecayer::doinit() "
 	      << "the Herwig version must be used." 
 	      << Exception::runerror;
   // cast the vertices
   FFWVertex_ = hwsm->vertexFFW();
   FFWVertex_->init();
   FFGVertex_ = hwsm->vertexFFG();
   FFGVertex_->init();
   SMWDecayer::doinit();
   gluon_ = getParticleData(ParticleID::g);
 }
 
 bool SMWFermionsPOWHEGDecayer::getEvent(vector<PPtr> hardProcess) {
   vector<Energy> particleMass;
   for(unsigned int ix=0;ix<hardProcess.size();++ix) {
     if(abs(hardProcess[ix]->id())==ParticleID::Wplus) {
       mW_ = hardProcess[ix]->mass();
     }
     else {
       particleMass.push_back(hardProcess[ix]->mass());
     }
   }
   if (particleMass.size()!=2)  {
     throw Exception()
       << "Number of outgoing particles is not equal to 2 in "
       << "SMWFermionPOWHEGDecayer::getEvent()" 
       << Exception::runerror;
   }
   // reduced mass
   mu1_ = particleMass[0]/mW_;
   mu2_ = particleMass[1]/mW_;
   // scale
   scale_ = sqr(mW_);
   // max pT
   Energy pTmax = 0.5*sqrt(mw2_);
   if(pTmax<pTmin_) return false;
   // Define over valued y_max & y_min according to the associated pt_min cut.
-  double ymax  =  acosh(pTmax/pTmin_);
+  //double ymax  =  acosh(pTmax/pTmin_);
+  double ymax  = 10.;
   double ymin  = -ymax;
   // pt of the emmission
   pT_ = pTmax;
   // prefactor
   double overEst = 4.;
   double prefactor = overEst*alphaS()->overestimateValue()*CF_*
     (ymax-ymin)/Constants::twopi;
   // loop to generate the pt and rapidity
   bool reject;  
   //arrays to hold the temporary  probabilities whilst the for loop progresses
   double probTemp[2][2]={{0.,0.},{0.,0.}};
   probTemp[0][0]=probTemp[0][1]=probTemp[1][0]=probTemp[1][1]=0.;
   double x1Solution[2][2] = {{0.,0.},{0.,0.}};
   double x2Solution[2][2] = {{0.,0.},{0.,0.}};
   double x3Solution[2]    = {0.,0.};
   Energy pT[2]            = {pTmax,pTmax};
   double yTemp[2]         = {0.,0.};
   double phi              = 0.;
   // do the competition
   for(int i=0; i<2; i++) {
     // set the emitter and the spectator
     double muj  = i==0 ? mu1_ : mu2_;
     double muk  = i==0 ? mu2_ : mu1_;
     double muj2 = sqr(muj);
     double muk2 = sqr(muk);
     do {
       // generation of phi
       phi = UseRandom::rnd() * Constants::twopi;
       // reject the emission
       reject = true; 
       // generate pt
       pT[i] *= pow(UseRandom::rnd(),1./prefactor);
       if(pT[i]<pTmin_) {
         pT[i] = -GeV;
         break;
       }
       // generate xT
       double xT2 = sqr(2./mW_*pT[i]);
       // generate y
       yTemp[i] = ymin + UseRandom::rnd()*(ymax-ymin);
       // generate x3 & x1 from pT & y
       double x1Plus  = 1-muk2+muj2;
       double x1Minus = 2.*muj;
       x3Solution[i]  = 2.*pT[i]*cosh(yTemp[i])/mW_;
       // prefactor
       double weightPrefactor = 0.5/sqrt((1.-sqr(muj-muk))*(1.-sqr(muj+muk)))/overEst;
       // calculate x1 & x2 solutions
       double discrim2 = (-sqr(x3Solution[i])+xT2)*
 	(xT2*muk2+2.*x3Solution[i]-sqr(muj2)+2.*muk2+2.*muj2-sqr(x3Solution[i])-1.
 	 +2.*muj2*muk2-sqr(muk2)-2.*muk2*x3Solution[i]-2.*muj2*x3Solution[i]);
       // check discrim2 is > 0
       if( discrim2 < ZERO) continue;
       double fact1 =2.*sqr(x3Solution[i])-4.*muk2-6.*x3Solution[i]+4.*muj2-xT2*x3Solution[i]
 	+2.*xT2-2.*muj2*x3Solution[i]+2.*muk2*x3Solution[i]+4.;
       double fact2 = (4.-4.*x3Solution[i]+xT2);
       double discriminant = sqrt(discrim2);
       // two solns for x1
       x1Solution[i][0] = (fact1 + 2.*discriminant)/fact2;
       x1Solution[i][1] = (fact1 - 2.*discriminant)/fact2;
       bool found = false;
       for(unsigned int j=0;j<2;++j) {
 	// calculate x2
 	x2Solution[i][j] = 2.-x3Solution[i]-x1Solution[i][j];
 	// set limits on x2
 	double root = max(0.,sqr(x1Solution[i][j])-4.*muj2);
 	root = sqrt(root);
 	double x2Plus  = 1.+muk2-muj2
 	  -0.5*(1.-x1Solution[i][j]+muj2-muk2)/(1.-x1Solution[i][j]+muj2)
 	  *(x1Solution[i][j]-2.*muj2-root);
 	double x2Minus = 1.+muk2-muj2
 	  -0.5*(1.-x1Solution[i][j]+muj2-muk2)/(1.-x1Solution[i][j]+muj2)
 	  *(x1Solution[i][j]-2.*muj2+root);
-
+	
         if(x1Solution[i][j]>=x1Minus && x1Solution[i][j]<=x1Plus &&
 	   x2Solution[i][j]>=x2Minus && x2Solution[i][j]<=x2Plus &&
            checkZMomenta(x1Solution[i][j], x2Solution[i][j], x3Solution[i], yTemp[i], pT[i], 
 			 muj, muk)) {
-          probTemp[i][j] = weightPrefactor*pT[i]*
-            calculateJacobian(x1Solution[i][j], x2Solution[i][j], pT[i], muj, muk)*
-	    calculateRealEmission(x1Solution[i][j], x2Solution[i][j], 
+	  probTemp[i][j] = weightPrefactor*pT[i]*
+	    abs(calculateJacobian(x1Solution[i][j], x2Solution[i][j], pT[i], muj, muk))*
+	    calculateRealEmission(x1Solution[i][j], x2Solution[i][j],
 				  hardProcess, phi, muj, muk, i, false);
           found = true;
         }
         else {
           probTemp[i][j] = 0.;
         }
       }
       if(!found) continue;
       // alpha S piece
       double wgt = (probTemp[i][0]+probTemp[i][1])*alphaS()->ratio(sqr(pT[i]));
       // matrix element weight
       reject = UseRandom::rnd()>wgt;
     }
     while(reject);
   } // end of emitter for loop
   // no emission
   if(pT[0]<ZERO&&pT[1]<ZERO) return false;
   //pick the spectator and x1 x2 values
   double x1,x2,y;
   // particle 1 emits, particle 2 spectates
   unsigned int iemit=0;
   if(pT[0]>pT[1]){ 
     pT_ = pT[0];
     y=yTemp[0];
     if(probTemp[0][0]>UseRandom::rnd()*(probTemp[0][0]+probTemp[0][1])) {
       x1 = x1Solution[0][0];
       x2 = x2Solution[0][0];
     }
     else {
       x1 = x1Solution[0][1];
       x2 = x2Solution[0][1];
     }
   }
   // particle 2 emits, particle 1 spectates
   else {
     iemit=1;
     pT_ = pT[1];
     y=yTemp[1];
     if(probTemp[1][0]>UseRandom::rnd()*(probTemp[1][0]+probTemp[1][1])) {
       x1 = x1Solution[1][0];
       x2 = x2Solution[1][0];
     }
     else {
       x1 = x1Solution[1][1];
       x2 = x2Solution[1][1];
     }
   }
   // find spectator
   unsigned int ispect = iemit == 0 ? 1 : 0;
   double muk = iemit == 0 ? mu2_ : mu1_;
   double muk2 = sqr(muk);
   double muj = iemit == 0 ? mu1_ : mu2_;
   double muj2 = sqr(muj);
   double xT2 = sqr(2./mW_*pT_);
   // Find the boost from the lab to the c.o.m with the spectator 
   // along the -z axis, and then invert it.
   LorentzRotation eventFrame( ( quark_[0] + quark_[1] ).findBoostToCM() );
   Lorentz5Momentum spectator = eventFrame*quark_[ispect];
   eventFrame.rotateZ( -spectator.phi() );
   eventFrame.rotateY( -spectator.theta() - Constants::pi );
   eventFrame.invert();
   // spectator
   quark_[ispect].setT( 0.5*x2*mW_ );
   quark_[ispect].setX( ZERO );
   quark_[ispect].setY( ZERO );
   quark_[ispect].setZ( -sqrt(0.25*mw2_*x2*x2-mw2_*muk2) );
   // gluon
   gauge_.setT( pT_*cosh(y)  );
   gauge_.setX( pT_*cos(phi) );
   gauge_.setY( pT_*sin(phi) );
   gauge_.setZ( pT_*sinh(y)  );
   gauge_.setMass(ZERO);
   // emitter
   quark_[iemit].setX( -pT_*cos(phi) );
   quark_[iemit].setY( -pT_*sin(phi) );
   quark_[iemit].setZ(  0.5*mW_*sqrt(sqr(x1)-xT2-4.*muj2) );
   if(sqrt(0.25*mw2_*x2*x2-mw2_*muk2)-pT_*sinh(y)<ZERO)
     quark_[iemit].setZ(-quark_[iemit].z());
   quark_[iemit].setT( 0.5*mW_*x1 );
   // boost constructed vectors into the event frame
   quark_[0] = eventFrame * quark_[0];
   quark_[1] = eventFrame * quark_[1];
   gauge_    = eventFrame * gauge_;
   // need to reset masses because for whatever reason the boost  
   // touches the mass component of the five-vector and can make  
   // zero mass objects acquire a floating point negative mass(!).
   gauge_.setMass( ZERO );
   quark_[iemit] .setMass(partons_[iemit ]->mass());
   quark_[ispect].setMass(partons_[ispect]->mass());
 
   return true;
 }
 
 InvEnergy SMWFermionsPOWHEGDecayer::calculateJacobian(double x1, double x2, Energy pT, 
 						      double muj, double muk) const{
   double xPerp = abs(2.*pT/mW_);
   Energy jac = mW_/xPerp*fabs((x2*sqr(muj)+2.*sqr(muk)*x1
 			       +sqr(muk)*x2-x1*x2-sqr(x2)+x2)/pow((sqr(x2)-4.*sqr(muk)),1.5));
   
   return 1./jac; //jacobian as defined is dptdy=jac*dx1dx2, therefore we have to divide by it
 }
 
 bool SMWFermionsPOWHEGDecayer::checkZMomenta(double x1, double x2, double x3, 
 					     double y, Energy pT, double muj,
 					     double muk) const {
   double xPerp2 = 4.*pT*pT/mW_/mW_;
   double root1 = sqrt(max(0.,sqr(x2)-4.*sqr(muk)));
   double root2 = sqrt(max(0.,sqr(x1)-xPerp2 - 4.*sqr(muj)));
   static double tolerance = 1e-6; 
   bool isMomentaReconstructed = false;  
 
   if(pT*sinh(y) > ZERO) {
     if(abs(-root1 + sqrt(sqr(x3)-xPerp2)  + root2) <= tolerance ||
        abs(-root1 + sqrt(sqr(x3)-xPerp2)  - root2)  <= tolerance)
       isMomentaReconstructed=true;
   }
   else if(pT*sinh(y) < ZERO){
     if(abs(-root1 - sqrt(sqr(x3)-xPerp2)  + root2) <= tolerance ||
        abs(-root1 - sqrt(sqr(x3)-xPerp2)  - root2)  <= tolerance)
 	isMomentaReconstructed=true;
   }
   else 
     if(abs(-root1+ sqrt(sqr(x1)-xPerp2 - 4.*(muj))) <= tolerance)
       isMomentaReconstructed=true;
       
   return isMomentaReconstructed;
 }
 
 double SMWFermionsPOWHEGDecayer::calculateRealEmission(double x1, double x2, 
 						       vector<PPtr> hardProcess,
 						       double phi, double muj,
 						       double muk, int iemit, 
 						       bool subtract) const {
   // make partons data object for meRatio
   vector<cPDPtr> partons (3);
   for(int ix=0; ix<3; ++ix)
     partons[ix] = hardProcess[ix]->dataPtr();
   partons.push_back(gluon_);
   // calculate x3
   double x3 = 2.-x1-x2;
   double xT = sqrt(max(0.,sqr(x3)-0.25*sqr(sqr(x2)+sqr(x3)-sqr(x1)-4.*sqr(muk)+4.*sqr(muj))
 		       /(sqr(x2)-4.*sqr(muk))));
   // calculate the momenta
   Energy M = mW_;
   Lorentz5Momentum pspect(ZERO,ZERO,-0.5*M*sqrt(max(sqr(x2)-4.*sqr(muk),0.)),
 			  0.5*M*x2,M*muk); 
   Lorentz5Momentum pemit (-0.5*M*xT*cos(phi),-0.5*M*xT*sin(phi),
 			  0.5*M*sqrt(max(sqr(x1)-sqr(xT)-4.*sqr(muj),0.)),
 			  0.5*M*x1,M*muj);
   Lorentz5Momentum pgluon(0.5*M*xT*cos(phi), 0.5*M*xT*sin(phi),
 			  0.5*M*sqrt(max(sqr(x3)-sqr(xT),0.)),0.5*M*x3,ZERO);
   if(abs(pspect.z()+pemit.z()-pgluon.z())/M<1e-6) 
     pgluon.setZ(-pgluon.z());
   else if(abs(pspect.z()-pemit.z()+pgluon.z())/M<1e-6) 
     pemit .setZ(- pemit.z());
   // loop over the possible emitting partons
   double realwgt(0.);
 
   // boost and rotate momenta
   LorentzRotation eventFrame( ( hardProcess[1]->momentum() +
 				hardProcess[2]->momentum() ).findBoostToCM() );
   Lorentz5Momentum spectator = eventFrame*hardProcess[iemit+1]->momentum();
   eventFrame.rotateZ( -spectator.phi()    );
   eventFrame.rotateY( -spectator.theta()  );
   eventFrame.invert();
   vector<Lorentz5Momentum> momenta(3);
   momenta[0]   = hardProcess[0]->momentum();
   if(iemit==0) {
     momenta[2] = eventFrame*pspect;
     momenta[1] = eventFrame*pemit ;
   }
   else {
     momenta[1] = eventFrame*pspect;
     momenta[2] = eventFrame*pemit ;
   }
   momenta.push_back(eventFrame*pgluon);
   // calculate the weight
   if(1.-x1>1e-5 && 1.-x2>1e-5) 
     realwgt += meRatio(partons,momenta,iemit,subtract);
   
   return realwgt;
 }
diff --git a/Decay/Perturbative/SMZFermionsPOWHEGDecayer.cc b/Decay/Perturbative/SMZFermionsPOWHEGDecayer.cc
--- a/Decay/Perturbative/SMZFermionsPOWHEGDecayer.cc
+++ b/Decay/Perturbative/SMZFermionsPOWHEGDecayer.cc
@@ -1,742 +1,743 @@
 //-*-
 //
 // This is the implementation of the non-inlined, non-templated member
 // functions of the SMZFermionsPOWHEGDecayer class.
 //
 
 #include "SMZFermionsPOWHEGDecayer.h"
 #include "ThePEG/Utilities/DescribeClass.h"
 #include <numeric>
 #include "Herwig/Models/StandardModel/StandardModel.h"
 #include "ThePEG/PDF/PolarizedBeamParticleData.h"
 #include "ThePEG/Helicity/WaveFunction/VectorWaveFunction.h"
 #include "ThePEG/Interface/ClassDocumentation.h"
 #include "ThePEG/Interface/Parameter.h"
 #include "ThePEG/Interface/Reference.h"
 #include "ThePEG/Persistency/PersistentOStream.h"
 #include "ThePEG/Persistency/PersistentIStream.h"
 #include "Herwig/Shower/RealEmissionProcess.h"
 #include "Herwig/Shower/Core/Couplings/ShowerAlpha.h"
 
 using namespace Herwig;
 
 SMZFermionsPOWHEGDecayer::SMZFermionsPOWHEGDecayer() 
   : CF_(4./3.), pTmin_(1.*GeV)
 {  }
 
 IBPtr SMZFermionsPOWHEGDecayer::clone() const {
   return new_ptr(*this);
 }
 
 IBPtr SMZFermionsPOWHEGDecayer::fullclone() const {
   return new_ptr(*this);
 }
 
 void SMZFermionsPOWHEGDecayer::persistentOutput(PersistentOStream & os) const {
   os << FFGVertex_ << FFZVertex_ << gluon_ << ounit( pTmin_, GeV );
 }
 
 void SMZFermionsPOWHEGDecayer::persistentInput(PersistentIStream & is, int) {
   is >> FFGVertex_ >> FFZVertex_ >> gluon_ >> iunit( pTmin_, GeV );
 }
 
 // The following static variable is needed for the type
 // description system in ThePEG.
 DescribeClass<SMZFermionsPOWHEGDecayer,SMZDecayer>
 describeHerwigSMZFermionsPOWHEGDecayer("Herwig::SMZFermionsPOWHEGDecayer", "HwPerturbativeDecay.so");
 
 void SMZFermionsPOWHEGDecayer::Init() {
 
   static ClassDocumentation<SMZFermionsPOWHEGDecayer> documentation
     ("There is no documentation for the SMZFermionsPOWHEGDecayer class");
 
   static Parameter<SMZFermionsPOWHEGDecayer, Energy> interfacePtMin
     ("minpT",
      "The pt cut on hardest emision generation",
      &SMZFermionsPOWHEGDecayer::pTmin_, GeV, 1.*GeV, 0*GeV, 100000.0*GeV,
      false, false, Interface::limited);
 }
 
 RealEmissionProcessPtr SMZFermionsPOWHEGDecayer::
 generateHardest(RealEmissionProcessPtr born) {
   assert(born->bornOutgoing().size()==2);
   // check coloured
   if(!born->bornOutgoing()[0]->dataPtr()->coloured()) return RealEmissionProcessPtr();
   // extract required info
   partons_.resize(2);
   quark_.resize(2);
   vector<PPtr> hardProcess;
   zboson_ = born->bornIncoming()[0];
   hardProcess.push_back(zboson_);
   for(unsigned int ix=0;ix<born->bornOutgoing().size();++ix) {
     partons_[ix] = born->bornOutgoing()[ix]->dataPtr();
     quark_[ix]   = born->bornOutgoing()[ix]->momentum();
     quark_[ix].setMass(partons_[ix]->mass());
     hardProcess.push_back(born->bornOutgoing()[ix]);
   }
   bool order = partons_[0]->id()<0;
   if(order) {
     swap(partons_[0]   ,partons_[1]   );
     swap(quark_[0]     ,quark_[1]     );
     swap(hardProcess[1],hardProcess[2]);
   }
   gauge_.setMass(0.*MeV);
   // Get the Z boson mass.
   mz2_ = (quark_[0] + quark_[1]).m2();
   // Generate emission and set _quark[0,1] and _gauge to be the 
   // momenta of q, qbar and g after the hardest emission:
   if(!getEvent(hardProcess)) {
     born->pT()[ShowerInteraction::QCD] = pTmin_;
     return born;
   }
   // Ensure the energies are greater than the constituent masses:
-  for (int i=0; i<2; i++) {
-    if (quark_[i].e() < partons_[i]->constituentMass()) return RealEmissionProcessPtr();
-  }
-  if (gauge_.e()    < gluon_     ->constituentMass()) return RealEmissionProcessPtr();
+  // for (int i=0; i<2; i++) {
+  //   if (quark_[i].e() < partons_[i]->constituentMass()) return RealEmissionProcessPtr();
+  // }
+  // if (gauge_.e()    < gluon_     ->constituentMass()) return RealEmissionProcessPtr();
   // set masses
   quark_[0].setMass( partons_[0]->mass() );
   quark_[1].setMass( partons_[1]->mass() );
   gauge_   .setMass( ZERO );
   // assign the emitter based on evolution scales
   unsigned int iemitter   = quark_[0]*gauge_ > quark_[1]*gauge_ ? 2 : 1;
   unsigned int ispectator = iemitter==1                         ? 1 : 2;
   // create new partices and insert
   PPtr zboson = zboson_->dataPtr()->produceParticle(zboson_->momentum());
   born->incoming().push_back(zboson);
   PPtr newq = partons_[0]->produceParticle(quark_[0]);
   PPtr newa = partons_[1]->produceParticle(quark_[1]);
   PPtr newg = gluon_->produceParticle(gauge_);
   // make colour connections
   newg->colourNeighbour(newq);
   newa->colourNeighbour(newg);
   // insert in output structure
   if(!order) {
     born->outgoing().push_back(newq);
     born->outgoing().push_back(newa);
   }
   else {
     born->outgoing().push_back(newa);
     born->outgoing().push_back(newq);
     swap(iemitter,ispectator);
   }
   born->outgoing().push_back(newg);
   born->emitter  (iemitter  );
   born->spectator(ispectator);
   born->emitted  (3);
   born->pT()[ShowerInteraction::QCD] = pT_;
   // return process
   born->interaction(ShowerInteraction::QCD);
   return born;
 }
 
 double SMZFermionsPOWHEGDecayer::
 me2(const int ichan, const Particle & part,
     const ParticleVector & decay, MEOption meopt) const {
   // leading-order result
   double output = SMZDecayer::me2(ichan,part,decay,meopt);
   // check decay products coloured, otherwise return
   if(!decay[0]->dataPtr()->coloured()) return output;
   // inital masses, couplings  etc
   // fermion mass
   Energy particleMass = decay[0]->dataPtr()->mass();
   // Z mass
   mZ_ = part.mass();
   // strong coupling
   aS_ = SM().alphaS(sqr(mZ_));
   // reduced mass
   mu_  = particleMass/mZ_;
   mu2_ = sqr(mu_);
   // scale
   scale_ = sqr(mZ_);
   // cast the vertices
   tcFFVVertexPtr Zvertex = dynamic_ptr_cast<tcFFVVertexPtr>(FFZVertex());
   // compute the spinors
   vector<SpinorWaveFunction>    aout;
   vector<SpinorBarWaveFunction> fout;
   vector<VectorWaveFunction>    vin;
   SpinorBarWaveFunction qkout(decay[0]->momentum(),decay[0]->dataPtr(),outgoing);
   SpinorWaveFunction    qbout(decay[1]->momentum(),decay[1]->dataPtr(),outgoing);
   VectorWaveFunction    zin  (part.momentum()     ,part.dataPtr()     ,incoming);
   for(unsigned int ix=0;ix<2;++ix){
     qkout.reset(ix);
     fout.push_back(qkout);
     qbout.reset(ix);
     aout.push_back(qbout);
   }
   for(unsigned int ix=0;ix<3;++ix){
     zin.reset(ix);
     vin.push_back(zin);
   }
   // temporary storage of the different diagrams
   // sum over helicities to get the matrix element
   double total=0.;
   if(mu_!=0.) {
     LorentzPolarizationVector momDiff = 
       (decay[0]->momentum()-decay[1]->momentum())/2./
       (decay[0]->momentum().mass()+decay[1]->momentum().mass());
     // scalars
     Complex scalar1 = zin.wave().dot(momDiff);
     for(unsigned int outhel1=0;outhel1<2;++outhel1) {
       for(unsigned int outhel2=0;outhel2<2;++outhel2) {		
 	for(unsigned int inhel=0;inhel<3;++inhel) {
 	  // first the LO bit
 	  Complex diag1 = FFZVertex()->evaluate(scale_,aout[outhel2],fout[outhel1],vin[inhel]);
 	  // extra stuff for NLO 
 	  LorentzPolarizationVector left  = 
 	    aout[outhel2].wave().leftCurrent(fout[outhel1].wave());
 	  LorentzPolarizationVector right = 
 	    aout[outhel2].wave().rightCurrent(fout[outhel1].wave());
 	  Complex scalar = 
 	    aout[outhel2].wave().scalar(fout[outhel1].wave());
 	  // nlo specific pieces
 	  Complex diag3 =
 	    Complex(0.,1.)*Zvertex->norm()*
 	    (Zvertex->right()*( left.dot(zin.wave())) +
 	     Zvertex-> left()*(right.dot(zin.wave())) -
 	     ( Zvertex-> left()+Zvertex->right())*scalar1*scalar);
 	  // nlo piece
 	  total += real(diag1*conj(diag3) + diag3*conj(diag1));
 	}
       }
     }
     // rescale
     total *= UnitRemoval::E2/scale_;
   }
   else {
     total = ZERO;
   }
   // now for the NLO bit
   double mu4 = sqr(mu2_);
   double lmu = mu_!=0. ? log(mu_) : 0.;
   double v = sqrt(1.-4.*mu2_),v2(sqr(v));
   double omv = 4.*mu2_/(1.+v);
   double f1,f2,fNS,VNS;
   double r = omv/(1.+v);
   double lr = mu_!=0. ? log(r) : 0.;
   // normal form
   if(mu_>1e-4) {
     f1 = CF_*aS_/Constants::pi*
       ( +1. + 3.*log(0.5*(1.+v)) - 1.5*log(0.5*(1.+v2)) + sqr(Constants::pi)/6.
 	- 0.5*sqr(lr) - (1.+v2)/v*(lr*log(1.+v2) + sqr(Constants::pi)/12. 
 				       -0.5*log(4.*mu2_)*lr + 0.25*sqr(lr)));
     fNS = -0.5*(1.+2.*v2)*lr/v + 1.5*lr - 2./3.*sqr(Constants::pi) + 0.5*sqr(lr)
       + (1.+v2)/v*(Herwig::Math::ReLi2(r) + sqr(Constants::pi)/3. - 0.25*sqr(lr) 
 		   + lr*log((2.*v/ (1.+v))));
     VNS = 1.5*log(0.5*(1.+v2)) 
       + 0.5*(1.+v2)/v*( 2.*lr*log(2.*(1.+v2)/sqr(1.+v))  
 			+ 2.*Herwig::Math::ReLi2(sqr(r)) 
 			- 2.*Herwig::Math::ReLi2(2.*v/(1.+v)) - sqr(Constants::pi)/6.)
       + log(1.-mu_) - 2.*log(1.-2.*mu_) - 4.*mu2_/(1.+v2)*log(mu_/(1.-mu_)) 
       - mu_/(1.-mu_)
       + 4.*(2.*mu2_-mu_)/(1.+v2) + 0.5*sqr(Constants::pi); 
     f2 = CF_*aS_/Constants::pi*mu2_*lr/v;
   }
   // small mass limit
   else {
     f1 = -CF_*aS_/Constants::pi/6.*
       ( - 6. - 24.*lmu*mu2_ - 15.*mu4 - 12.*mu4*lmu - 24.*mu4*sqr(lmu) 
 	+ 2.*mu4*sqr(Constants::pi) - 12.*mu2_*mu4 - 96.*mu2_*mu4*sqr(lmu) 
 	+ 8.*mu2_*mu4*sqr(Constants::pi) - 80.*mu2_*mu4*lmu);
     fNS = - mu2_/18.*( + 36.*lmu - 36. - 45.*mu2_ + 216.*lmu*mu2_ - 24.*mu2_*sqr(Constants::pi) 
 		      + 72.*mu2_*sqr(lmu) - 22.*mu4 + 1032.*mu4 * lmu
 		      - 96.*mu4*sqr(Constants::pi) + 288.*mu4*sqr(lmu));
     VNS = - mu2_/1260.*(-6930. + 7560.*lmu + 2520.*mu_ - 16695.*mu2_ 
 		       + 1260.*mu2_*sqr(Constants::pi) 
 		       + 12600.*lmu*mu2_ + 1344.*mu_*mu2_ - 52780.*mu4 + 36960.*mu4*lmu 
 		       + 5040.*mu4*sqr(Constants::pi) - 12216.*mu_*mu4);
     f2 = CF_*aS_*mu2_/Constants::pi*( 2.*lmu + 4.*mu2_*lmu + 2.*mu2_ + 12.*mu4*lmu + 7.*mu4);
   }
   // add up bits for f1
   f1 += CF_*aS_/Constants::pi*(fNS+VNS);
   // now for the real correction
   double phi  = UseRandom::rnd()*Constants::twopi;
   // calculate y
   double yminus = 0.; 
   double yplus  = 1.-2.*mu_*(1.-mu_)/(1.-2*mu2_);
   double y = yminus + UseRandom::rnd()*(yplus-yminus);
   // calculate z
   double v1  = sqrt(sqr(2.*mu2_+(1.-2.*mu2_)*(1.-y))-4.*mu2_)/(1.-2.*mu2_)/(1.-y);
   double zplus  = (1.+v1)*(1.-2.*mu2_)*y/2./(mu2_ +(1.-2.*mu2_)*y);
   double zminus = (1.-v1)*(1.-2.*mu2_)*y/2./(mu2_ +(1.-2.*mu2_)*y);
   double z = zminus + UseRandom::rnd()*(zplus-zminus);
   double jac = (1.-y)*(yplus-yminus)*(zplus-zminus);
   // calculate x1,x2
   double x2 = 1. - y*(1.-2.*mu2_);
   double x1 = 1. - z*(x2-2.*mu2_);
   // copy the particle objects over for calculateRealEmission
   vector<PPtr> hardProcess(3);
   hardProcess[0] = const_ptr_cast<PPtr>(&part);
   hardProcess[1] = decay[0];
   hardProcess[2] = decay[1];
   // total real emission contribution
   double realFact = 0.25*jac*sqr(1.-2.*mu2_)/
     sqrt(1.-4.*mu2_)/Constants::twopi
     *2.*CF_*aS_*calculateRealEmission(x1, x2, hardProcess, phi, true);
   // the born + virtual + real
   output = output*(1. + f1 + realFact) + f2*total;
   return output;
 }
 
 double SMZFermionsPOWHEGDecayer::meRatio(vector<cPDPtr> partons, 
 					 vector<Lorentz5Momentum> momenta,
 					 unsigned int iemitter, bool subtract) const {
   Lorentz5Momentum q = momenta[1]+momenta[2]+momenta[3];
   Energy2 Q2=q.m2();
   Energy2 lambda = sqrt((Q2-sqr(momenta[1].mass()+momenta[2].mass()))*
 			(Q2-sqr(momenta[1].mass()-momenta[2].mass())));
   InvEnergy2 D[2];
   double lome[2];
   for(unsigned int iemit=0;iemit<2;++iemit) {
     unsigned int ispect = iemit==0 ? 1 : 0;    
     Energy2 pipj = momenta[3      ] * momenta[1+iemit ];
     Energy2 pipk = momenta[3      ] * momenta[1+ispect];
     Energy2 pjpk = momenta[1+iemit] * momenta[1+ispect];
     double y = pipj/(pipj+pipk+pjpk); 
     double z = pipk/(     pipk+pjpk);
     Energy mij = sqrt(2.*pipj+sqr(momenta[1+iemit].mass()));
     Energy2 lamB = sqrt((Q2-sqr(mij+momenta[1+ispect].mass()))*
 			(Q2-sqr(mij-momenta[1+ispect].mass())));
     Energy2 Qpk = q*momenta[1+ispect];
     Lorentz5Momentum pkt = 
       lambda/lamB*(momenta[1+ispect]-Qpk/Q2*q)
       +0.5/Q2*(Q2+sqr(momenta[1+ispect].mass())-sqr(momenta[1+ispect].mass()))*q;
     Lorentz5Momentum pijt = 
       q-pkt;
     double muj = momenta[1+iemit ].mass()/sqrt(Q2);
     double muk = momenta[1+ispect].mass()/sqrt(Q2);
     double vt = sqrt((1.-sqr(muj+muk))*(1.-sqr(muj-muk)))/(1.-sqr(muj)-sqr(muk));
     double v  = sqrt(sqr(2.*sqr(muk)+(1.-sqr(muj)-sqr(muk))*(1.-y))-4.*sqr(muk))
       /(1.-y)/(1.-sqr(muj)-sqr(muk));
     // dipole term
     D[iemit] = 0.5/pipj*(2./(1.-(1.-z)*(1.-y))
 			 -vt/v*(2.-z+sqr(momenta[1+iemit].mass())/pipj));
     // matrix element
     vector<Lorentz5Momentum> lomom(3);
     lomom[0] = momenta[0];
     if(iemit==0) {
       lomom[1] = pijt;
       lomom[2] = pkt ;
     }
     else {
       lomom[2] = pijt;
       lomom[1] = pkt ;
     }
     lome[iemit]  = loME(partons,lomom);
   }
   InvEnergy2 ratio = realME(partons,momenta)*abs(D[iemitter])
     /(abs(D[0]*lome[0])+abs(D[1]*lome[1]));
   if(subtract)
     return Q2*(ratio-2.*D[iemitter]);
   else
     return Q2*ratio;
 }
 
 double SMZFermionsPOWHEGDecayer::loME(const vector<cPDPtr> & partons, 
 			const vector<Lorentz5Momentum> & momenta) const {
   // compute the spinors
   vector<VectorWaveFunction>    vin;
   vector<SpinorWaveFunction>    aout;
   vector<SpinorBarWaveFunction> fout;
   VectorWaveFunction    zin  (momenta[0],partons[0],incoming);
   SpinorBarWaveFunction qkout(momenta[1],partons[1],outgoing);
   SpinorWaveFunction    qbout(momenta[2],partons[2],outgoing);
   for(unsigned int ix=0;ix<2;++ix){
     qkout.reset(ix);
     fout.push_back(qkout);
     qbout.reset(ix);
     aout.push_back(qbout);
   }
   for(unsigned int ix=0;ix<3;++ix){
     zin.reset(ix);
     vin.push_back(zin);
   }
   // temporary storage of the different diagrams
   // sum over helicities to get the matrix element
   double total(0.);
   for(unsigned int inhel=0;inhel<3;++inhel) {
     for(unsigned int outhel1=0;outhel1<2;++outhel1) {
       for(unsigned int outhel2=0;outhel2<2;++outhel2) {
 	Complex diag1 = FFZVertex()->evaluate(scale_,aout[outhel2],fout[outhel1],vin[inhel]);
 	total += norm(diag1);
       }
     }
   }
   // return the answer
   return total;
 }
  
 InvEnergy2 SMZFermionsPOWHEGDecayer::realME(const vector<cPDPtr> & partons, 
 			      const vector<Lorentz5Momentum> & momenta) const {
   // compute the spinors
   vector<VectorWaveFunction>     vin;
   vector<SpinorWaveFunction>     aout;
   vector<SpinorBarWaveFunction>  fout;
   vector<VectorWaveFunction>     gout;
   VectorWaveFunction    zin  (momenta[0],partons[0],incoming);
   SpinorBarWaveFunction qkout(momenta[1],partons[1],outgoing);
   SpinorWaveFunction    qbout(momenta[2],partons[2],outgoing);
   VectorWaveFunction    gluon(momenta[3],partons[3],outgoing);
   for(unsigned int ix=0;ix<2;++ix){
     qkout.reset(ix);
     fout.push_back(qkout);
     qbout.reset(ix);
     aout.push_back(qbout);
     gluon.reset(2*ix);
     gout.push_back(gluon);
   }
   for(unsigned int ix=0;ix<3;++ix){
     zin.reset(ix);
     vin.push_back(zin);
   }
   vector<Complex> diag(2,0.);
 
   double total(0.);
   for(unsigned int inhel1=0;inhel1<3;++inhel1) {
     for(unsigned int outhel1=0;outhel1<2;++outhel1) {
       for(unsigned int outhel2=0;outhel2<2;++outhel2) {
 	for(unsigned int outhel3=0;outhel3<2;++outhel3) {
 	  SpinorBarWaveFunction off1 =
 	    FFGVertex()->evaluate(scale_,3,partons[1],fout[outhel1],gout[outhel3]);
 	  diag[0] = FFZVertex()->evaluate(scale_,aout[outhel2],off1,vin[inhel1]);
 
 	  SpinorWaveFunction off2 = 
 	    FFGVertex()->evaluate(scale_,3,partons[2],aout[outhel2],gout[outhel3]);
 	  diag[1] = FFZVertex()->evaluate(scale_,off2,fout[outhel1],vin[inhel1]);
 
 	  // sum of diagrams
 	  Complex sum = std::accumulate(diag.begin(),diag.end(),Complex(0.));
 	  // me2
 	  total += norm(sum);
 	}
       }
     }
   }
 
   // divide out the coupling
   total /= norm(FFGVertex()->norm());
   // return the total
   return total*UnitRemoval::InvE2;
 }
 
 void SMZFermionsPOWHEGDecayer::doinit() {
   // cast the SM pointer to the Herwig SM pointer
   tcHwSMPtr hwsm= dynamic_ptr_cast<tcHwSMPtr>(standardModel());
   // do the initialisation
   if(!hwsm) throw InitException() 
 	      << "Wrong type of StandardModel object in "
 	      << "SMZFermionsPOWHEGDecayer::doinit() "
 	      << "the Herwig version must be used." 
 	      << Exception::runerror;
   // cast the vertices
   FFZVertex_ = hwsm->vertexFFZ();
   FFZVertex_->init();
   FFGVertex_ = hwsm->vertexFFG();
   FFGVertex_->init();
   SMZDecayer::doinit();
   gluon_ = getParticleData(ParticleID::g);
 }
 
 bool SMZFermionsPOWHEGDecayer::getEvent(vector<PPtr> hardProcess) {
   Energy particleMass = ZERO;
   for(unsigned int ix=0;ix<hardProcess.size();++ix) {
     if(hardProcess[ix]->id()==ParticleID::Z0) {
       mZ_ = hardProcess[ix]->mass();
     }
     else {
       particleMass =  hardProcess[ix]->mass();
     }
   }
   // reduced mass
   mu_  = particleMass/mZ_;
   mu2_ = sqr(mu_);
   // scale
   scale_ = sqr(mZ_);
   // max pT
   Energy pTmax = 0.5*sqrt(mz2_);
   if(pTmax<pTmin_) return false;
   // Define over valued y_max & y_min according to the associated pt_min cut.
-  double ymax  =  acosh(pTmax/pTmin_);
+  //double ymax  =  acosh(pTmax/pTmin_);
+  double ymax=10.;
   double ymin  = -ymax;
   // pt of the emmission
   pT_ = pTmax;
   // prefactor
   double overEst = 4.;
   double prefactor = overEst*alphaS()->overestimateValue()*CF_*
     (ymax-ymin)/Constants::twopi;
   // loop to generate the pt and rapidity
   bool reject;  
   //arrays to hold the temporary  probabilities whilst the for loop progresses
   double probTemp[2][2]={{0.,0.},{0.,0.}};
   probTemp[0][0]=probTemp[0][1]=probTemp[1][0]=probTemp[1][1]=0.;
   double x1Solution[2][2] = {{0.,0.},{0.,0.}};
   double x2Solution[2][2] = {{0.,0.},{0.,0.}};
   double x3Solution[2]    = {0.,0.};
   Energy pT[2]            = {pTmax,pTmax};
   double yTemp[2]         = {0.,0.};
   double phi              = 0.;
   // do the competition
   for(int i=0; i<2; i++) {
     do {
       //generation of phi
       phi = UseRandom::rnd() * Constants::twopi;
       // reject the emission
       reject = true; 
       // generate pt
       pT[i] *= pow(UseRandom::rnd(),1./prefactor);
       Energy2 pT2 = sqr(pT[i]);
       if(pT[i]<pTmin_) {
         pT[i] = -GeV;
         break;
       }
       // generate y
       yTemp[i] = ymin + UseRandom::rnd()*(ymax-ymin);
       //generate x3 & x1 from pT & y
       double x1Plus  = 1.;
       double x1Minus = 2.*mu_;
       x3Solution[i] = 2.*pT[i]*cosh(yTemp[i])/mZ_;
       // prefactor
       double weightPrefactor = 0.5/sqrt(1.-4.*mu2_)/overEst;
       // calculate x1 & x2 solutions
       Energy4 discrim2 = (sqr(x3Solution[i]*mZ_) - 4.*pT2)*
         (mz2_*(x3Solution[i]-1.)*(4.*mu2_+x3Solution[i]-1.)-4.*mu2_*pT2);
       //check discriminant2 is > 0
       if( discrim2 < ZERO) continue;
       Energy2 discriminant = sqrt(discrim2);
       Energy2 fact1 = 3.*mz2_*x3Solution[i]-2.*mz2_+2.*pT2*x3Solution[i]
 	-4.*pT2-mz2_*sqr(x3Solution[i]);
       Energy2 fact2 = 2.*mz2_*(x3Solution[i]-1.)-2.*pT2;
       // two solns for x1
       x1Solution[i][0] = (fact1 + discriminant)/fact2;
       x1Solution[i][1] = (fact1  - discriminant)/fact2;
 
       bool found = false;
       for(unsigned int j=0;j<2;++j) {
 	x2Solution[i][0] = 2.-x3Solution[i]-x1Solution[i][0];
 	x2Solution[i][1] = 2.-x3Solution[i]-x1Solution[i][1];
 	// set limits on x2
 	double root = max(0.,sqr(x1Solution[i][j])-4.*mu2_);
 	root = sqrt(root);
 	double x2Plus  = 1.-0.5*(1.-x1Solution[i][j])/(1.-x1Solution[i][j]+mu2_)
 	  *(x1Solution[i][j]-2.*mu2_-root);
 	double x2Minus = 1.-0.5*(1.-x1Solution[i][j])/(1.-x1Solution[i][j]+mu2_)
 	  *(x1Solution[i][j]-2.*mu2_+root);
 	if(x1Solution[i][j]>=x1Minus && x1Solution[i][j]<=x1Plus &&
 	   x2Solution[i][j]>=x2Minus && x2Solution[i][j]<=x2Plus &&
            checkZMomenta(x1Solution[i][j], x2Solution[i][j], x3Solution[i], yTemp[i], pT[i])) {
           probTemp[i][j] = weightPrefactor*pT[i]*
-            calculateJacobian(x1Solution[i][j], x2Solution[i][j], pT[i])*
+            abs(calculateJacobian(x1Solution[i][j], x2Solution[i][j], pT[i]))*
 	    calculateRealEmission(x1Solution[i][j], x2Solution[i][j], 
 				  hardProcess, phi, false, i);
           found = true;
         }
         else {
           probTemp[i][j] = 0.;
         }
       }
       if(!found) continue;
       // alpha S piece
       double wgt = (probTemp[i][0]+probTemp[i][1])*alphaS()->ratio(sqr(pT[i]));
       // matrix element weight
       reject = UseRandom::rnd()>wgt;
     }
     while(reject);
   } //end of emitter for loop
   // no emission
   if(pT[0]<ZERO&&pT[1]<ZERO) return false;
   //pick the spectator and x1 x2 values
   double x1,x2,y;
   //particle 1 emits, particle 2 spectates
   unsigned int iemit=0;
   if(pT[0]>pT[1]){ 
     pT_ = pT[0];
     y=yTemp[0];
     if(probTemp[0][0]>UseRandom::rnd()*(probTemp[0][0]+probTemp[0][1])) {
       x1 = x1Solution[0][0];
       x2 = x2Solution[0][0];
     }
     else {
       x1 = x1Solution[0][1];
       x2 = x2Solution[0][1];
     }
   }
   // particle 2 emits, particle 1 spectates
   else {
     iemit=1;
     pT_ = pT[1];
     y=yTemp[1];
     if(probTemp[1][0]>UseRandom::rnd()*(probTemp[1][0]+probTemp[1][1])) {
       x1 = x1Solution[1][0];
       x2 = x2Solution[1][0];
     }
     else {
       x1 = x1Solution[1][1];
       x2 = x2Solution[1][1];
     }
   }
   // find spectator
   unsigned int ispect = iemit == 0 ? 1 : 0;
   // Find the boost from the lab to the c.o.m with the spectator 
   // along the -z axis, and then invert it.
   LorentzRotation eventFrame( ( quark_[0] + quark_[1] ).findBoostToCM() );
   Lorentz5Momentum spectator = eventFrame*quark_[ispect];
   eventFrame.rotateZ( -spectator.phi() );
   eventFrame.rotateY( -spectator.theta() - Constants::pi );
   eventFrame.invert();
   // spectator
   quark_[ispect].setT( 0.5*x2*mZ_ );
   quark_[ispect].setX( ZERO );
   quark_[ispect].setY( ZERO );
   quark_[ispect].setZ( -sqrt(0.25*mz2_*x2*x2-mz2_*mu2_) );
   // gluon
   gauge_.setT( pT_*cosh(y)  );
   gauge_.setX( pT_*cos(phi) );
   gauge_.setY( pT_*sin(phi) );
   gauge_.setZ( pT_*sinh(y)  );
   gauge_.setMass(ZERO);
   // emitter reconstructed from gluon & spectator
   quark_[iemit] = - gauge_ - quark_[ispect];
   quark_[iemit].setT( 0.5*mZ_*x1 );
   // boost constructed vectors into the event frame
   quark_[0] = eventFrame * quark_[0];
   quark_[1] = eventFrame * quark_[1];
   gauge_    = eventFrame * gauge_;
   // need to reset masses because for whatever reason the boost  
   // touches the mass component of the five-vector and can make  
   // zero mass objects acquire a floating point negative mass(!).
   gauge_.setMass( ZERO );
   quark_[iemit] .setMass(partons_[iemit ]->mass());
   quark_[ispect].setMass(partons_[ispect]->mass());
 
   return true;
 }
 
 InvEnergy SMZFermionsPOWHEGDecayer::calculateJacobian(double x1, double x2, Energy pT) const{
   double xPerp = abs(2.*pT/mZ_);
   Energy jac = mZ_*fabs((x1*x2-2.*mu2_*(x1+x2)+sqr(x2)-x2)/xPerp/pow(sqr(x2)-4.*mu2_,1.5));   
   return 1./jac; //jacobian as defined is dptdy=jac*dx1dx2, therefore we have to divide by it
 }
 
 bool SMZFermionsPOWHEGDecayer::checkZMomenta(double x1, double x2, double x3, double y, Energy pT) const {
   double xPerp2 = 4.*pT*pT/mZ_/mZ_;
   static double tolerance = 1e-6; 
   bool isMomentaReconstructed = false;  
 
   if(pT*sinh(y)>ZERO) {
     if(abs(-sqrt(sqr(x2)-4.*mu2_)+sqrt(sqr(x3)-xPerp2) + sqrt(sqr(x1)-xPerp2 - 4.*mu2_)) <= tolerance ||
        abs(-sqrt(sqr(x2)-4.*mu2_)+sqrt(sqr(x3)-xPerp2)  - sqrt(sqr(x1)-xPerp2 - 4.*mu2_))  <= tolerance) isMomentaReconstructed=true;
   }
   else if(pT*sinh(y) < ZERO){
       if(abs(-sqrt(sqr(x2)-4.*mu2_)-sqrt(sqr(x3)-xPerp2) + sqrt(sqr(x1)-xPerp2 - 4.*mu2_)) <= tolerance ||
          abs(-sqrt(sqr(x2)-4.*mu2_)-sqrt(sqr(x3)-xPerp2)  - sqrt(sqr(x1)-xPerp2 - 4.*mu2_))  <= tolerance) isMomentaReconstructed=true;
   }
   else 
     if(abs(-sqrt(sqr(x2)-4.*mu2_)+ sqrt(sqr(x1)-xPerp2 - 4.*mu2_)) <= tolerance) isMomentaReconstructed=true;
       
   return isMomentaReconstructed;
 }
 
 double SMZFermionsPOWHEGDecayer::calculateRealEmission(double x1, double x2, 
 						       vector<PPtr> hardProcess,
 						       double phi,
 						       bool subtract) const {
   // make partons data object for meRatio
   vector<cPDPtr> partons (3);
   for(int ix=0; ix<3; ++ix)
     partons[ix] = hardProcess[ix]->dataPtr();
   partons.push_back(gluon_);
   // calculate x3
   double x3 = 2.-x1-x2;
   double xT = sqrt(max(0.,sqr(x3) -0.25*sqr(sqr(x2)+sqr(x3)-sqr(x1))/(sqr(x2)-4.*mu2_)));
   // calculate the momenta
   Energy M = mZ_;
   Lorentz5Momentum pspect(ZERO,ZERO,-0.5*M*sqrt(max(sqr(x2)-4.*mu2_,0.)),0.5*M*x2,M*mu_); 
   Lorentz5Momentum pemit (-0.5*M*xT*cos(phi),-0.5*M*xT*sin(phi),
   			  0.5*M*sqrt(max(sqr(x1)-sqr(xT)-4.*mu2_,0.)),0.5*M*x1,M*mu_);
   Lorentz5Momentum pgluon(0.5*M*xT*cos(phi), 0.5*M*xT*sin(phi),
 			  0.5*M*sqrt(max(sqr(x3)-sqr(xT),0.)),0.5*M*x3,ZERO);
   if(abs(pspect.z()+pemit.z()-pgluon.z())/M<1e-6) 
     pgluon.setZ(-pgluon.z());
   else if(abs(pspect.z()-pemit.z()+pgluon.z())/M<1e-6) 
     pemit .setZ(- pemit.z());
   // loop over the possible emitting partons
   double realwgt(0.);
   for(unsigned int iemit=0;iemit<2;++iemit) {
     // boost and rotate momenta
     LorentzRotation eventFrame( ( hardProcess[1]->momentum() +
 				  hardProcess[2]->momentum() ).findBoostToCM() );
     Lorentz5Momentum spectator = eventFrame*hardProcess[iemit+1]->momentum();
     eventFrame.rotateZ( -spectator.phi()    );
     eventFrame.rotateY( -spectator.theta()  );
     eventFrame.invert();
     vector<Lorentz5Momentum> momenta(3);
     momenta[0]   = hardProcess[0]->momentum();
     if(iemit==0) {
       momenta[2] = eventFrame*pspect;
       momenta[1] = eventFrame*pemit ;
     }
     else {
       momenta[1] = eventFrame*pspect;
       momenta[2] = eventFrame*pemit ;
     }
     momenta.push_back(eventFrame*pgluon);
     // calculate the weight
     if(1.-x1>1e-5 && 1.-x2>1e-5) 
       realwgt += meRatio(partons,momenta,iemit,subtract);
   }
   
   // total real emission contribution
   return realwgt;
 }
 
 double SMZFermionsPOWHEGDecayer::calculateRealEmission(double x1, double x2, 
 						       vector<PPtr> hardProcess,
 						       double phi,
 						       bool subtract,
 						       int emitter) const {
   // make partons data object for meRatio
   vector<cPDPtr> partons (3);
   for(int ix=0; ix<3; ++ix)
     partons[ix] = hardProcess[ix]->dataPtr();
   partons.push_back(gluon_);
   // calculate x3
   double x3 = 2.-x1-x2;
   double xT = sqrt(max(0.,sqr(x3) -0.25*sqr(sqr(x2)+sqr(x3)-sqr(x1))/(sqr(x2)-4.*mu2_)));
   // calculate the momenta
   Energy M = mZ_;
   Lorentz5Momentum pspect(ZERO,ZERO,-0.5*M*sqrt(max(sqr(x2)-4.*mu2_,0.)),0.5*M*x2,M*mu_); 
   Lorentz5Momentum pemit (-0.5*M*xT*cos(phi),-0.5*M*xT*sin(phi),
   			  0.5*M*sqrt(max(sqr(x1)-sqr(xT)-4.*mu2_,0.)),0.5*M*x1,M*mu_);
   Lorentz5Momentum pgluon( 0.5*M*xT*cos(phi), 0.5*M*xT*sin(phi),
   			   0.5*M*sqrt(max(sqr(x3)-sqr(xT),0.)),0.5*M*x3,ZERO);
   if(abs(pspect.z()+pemit.z()-pgluon.z())/M<1e-6) 
     pgluon.setZ(-pgluon.z());
   else if(abs(pspect.z()-pemit.z()+pgluon.z())/M<1e-6) 
     pemit .setZ(- pemit.z());
   // loop over the possible emitting partons
   double realwgt(0.);
 
   // boost and rotate momenta
   LorentzRotation eventFrame( ( hardProcess[1]->momentum() +
 				hardProcess[2]->momentum() ).findBoostToCM() );
   Lorentz5Momentum spectator = eventFrame*hardProcess[emitter+1]->momentum();
   eventFrame.rotateZ( -spectator.phi()    );
   eventFrame.rotateY( -spectator.theta()  );
   eventFrame.invert();
   vector<Lorentz5Momentum> momenta(3);
   momenta[0]   = hardProcess[0]->momentum();
   if(emitter==0) {
     momenta[2] = eventFrame*pspect;
     momenta[1] = eventFrame*pemit ;
   }
   else {
     momenta[1] = eventFrame*pspect;
     momenta[2] = eventFrame*pemit ;
   }
   momenta.push_back(eventFrame*pgluon);
   // calculate the weight
   if(1.-x1>1e-5 && 1.-x2>1e-5) 
     realwgt += meRatio(partons,momenta,emitter,subtract);  
   // total real emission contribution
   return realwgt;
 }
diff --git a/Tests/Inputs/GammaP.common b/Tests/Inputs/GammaP.common
--- a/Tests/Inputs/GammaP.common
+++ b/Tests/Inputs/GammaP.common
@@ -1,39 +1,39 @@
 ##################################################
 # Example generator based for gamma hadron collisions
 ##################################################
 cd /Herwig
 create Herwig::AlphaEM AlphaEM2 
 set Model:EW/RunningAlphaEM AlphaEM2
 create Herwig::O2AlphaS AlphaS2 
 set Model:QCD/RunningAlphaS AlphaS2
 
 # Create GammaHadronHandler
 cd /Herwig/EventHandlers
 set Luminosity:Energy 1000.
 set EventHandler:BeamA /Herwig/Particles/gamma
 set EventHandler:BeamB /Herwig/Particles/p+
 set EventHandler:Sampler /Herwig/ACDCSampler
-set /Herwig/Partons/Extractor:FlatSHatY 1
+set /Herwig/Partons/PPExtractor:FlatSHatY 1
 # the cuts
 cd /Herwig/Cuts
 set Cuts:X1Min 1.0e-5
 set Cuts:X2Min 1.0e-5
 set Cuts:MHatMin 0.*GeV
 insert Cuts:OneCuts[0] JetKtCut
 set JetKtCut:MinKT 20.
 ##################################################
 # Technical parameters for this run
 ##################################################
 cd /Herwig/Generators
 set EventGenerator:NumberOfEvents 100000000
 set EventGenerator:RandomNumberGenerator:Seed 31122001
 set EventGenerator:DebugLevel 1
 set EventGenerator:PrintEvent 0
 set EventGenerator:MaxErrors 10000
 set EventGenerator:EventHandler:StatLevel Full
 set EventGenerator:EventHandler:CascadeHandler:MPIHandler NULL
 
 ##################################################
 # LEP physics parameters (override defaults) 
 ##################################################
 set EventGenerator:EventHandler:LuminosityFunction:Energy 1000.
diff --git a/Tests/Inputs/LEP-BB.in b/Tests/Inputs/LEP-BB.in
deleted file mode 100644
--- a/Tests/Inputs/LEP-BB.in
+++ /dev/null
@@ -1,21 +0,0 @@
-# -*- ThePEG-repository -*-
-read snippets/EECollider.in
-cd /Herwig/MatrixElements
-set MEee2gZ2qq:MinimumFlavour 4
-set MEee2gZ2qq:MaximumFlavour 4
-insert SubProcess:MatrixElements 0 MEee2gZ2qq
-
-read LEP.common
-
-cd /Herwig/Generators
-
-set EventGenerator:EventHandler:LuminosityFunction:Energy 10.53
-set EventGenerator:EventHandler:CascadeHandler:MPIHandler NULL
-
-cd /Herwig/Generators
-insert EventGenerator:AnalysisHandlers 0 /Herwig/Analysis/BELLECharm
-insert EventGenerator:AnalysisHandlers 0 /Herwig/Analysis/CLEOCharm
-
-set /Herwig/Cuts/Cuts:MHatMin 10.5299
-
-saverun LEP-BB EventGenerator
diff --git a/Tests/Inputs/LEP-Leptons.in b/Tests/Inputs/LEP-Leptons.in
--- a/Tests/Inputs/LEP-Leptons.in
+++ b/Tests/Inputs/LEP-Leptons.in
@@ -1,39 +1,41 @@
+# -*- ThePEG-repository -*-
+read snippets/EECollider.in
 cd /Herwig/MatrixElements
 insert SubProcess:MatrixElements[0] MEee2gZ2ll
 
 set /Herwig/Particles/tau+:Stable 1
 set /Herwig/Particles/tau-:Stable 1
 
 read LEP.common
 
 cd /Herwig/Generators
 
 set EventGenerator:EventHandler:CascadeHandler NULL
 set EventGenerator:EventHandler:HadronizationHandler NULL
 set EventGenerator:EventHandler:DecayHandler NULL
 
 set EventGenerator:EventHandler:LuminosityFunction:Energy 500.0*GeV
 
 set /Herwig/Particles/e+:PDF /Herwig/Partons/NoPDF
 set /Herwig/Particles/e-:PDF /Herwig/Partons/NoPDF
 
 create Herwig::FermionTest LeptonsTest LeptonTest.so
 insert EventGenerator:AnalysisHandlers 0 LeptonsTest
 set /Herwig/Analysis/Basics:CheckQuark No
 
 # parameters to make the same as fortran
 cd /Herwig
 create Herwig::O2AlphaS AlphaS2 
 set Model:QCD/RunningAlphaS AlphaS2
 set Model:EW/CKM:theta_12 0.22274457
 set Model:EW/CKM:theta_13 0.
 set Model:EW/CKM:theta_23 0.
 set Model:EW/CKM:delta 0.
 set Model:EW/Sin2ThetaW 0.22254916
 create Herwig::AlphaEM AlphaEM2 
 set Model:EW/RunningAlphaEM AlphaEM2
 
 set /Herwig/ACDCSampler:Ntry 100000
 
 cd /Herwig/Generators
 saverun LEP-Leptons EventGenerator
diff --git a/Tests/Inputs/LEP-Powheg.in b/Tests/Inputs/LEP-Powheg.in
deleted file mode 100644
--- a/Tests/Inputs/LEP-Powheg.in
+++ /dev/null
@@ -1,26 +0,0 @@
-# -*- ThePEG-repository -*-
-read snippets/EECollider.in
-cd /Herwig/MatrixElements
-create Herwig::O2AlphaS O2AlphaS 
-set /Herwig/Generators/EventGenerator:StandardModelParameters:QCD/RunningAlphaS O2AlphaS
-set /Herwig/Shower/ShowerHandler:HardEmission POWHEG
-set /Herwig/Shower/AlphaQCD:AlphaMZ 0.118
-insert SubProcess:MatrixElements 0 PowhegMEee2gZ2qq
-
-read LEP.common
-
-cd /Herwig/Generators
-
-set EventGenerator:EventHandler:CascadeHandler:MPIHandler NULL
-
-set EventGenerator:EventHandler:LuminosityFunction:Energy 91.2
-
-insert EventGenerator:AnalysisHandlers 0 /Herwig/Analysis/LEPMultiplicity
-insert EventGenerator:AnalysisHandlers 0 /Herwig/Analysis/BMultiplicity
-insert EventGenerator:AnalysisHandlers 0 /Herwig/Analysis/BFrag
-insert EventGenerator:AnalysisHandlers 0 /Herwig/Analysis/Shapes
-insert EventGenerator:AnalysisHandlers 0 /Herwig/Analysis/LEPIdent
-insert EventGenerator:AnalysisHandlers 0 /Herwig/Analysis/LEPFourJet
-insert EventGenerator:AnalysisHandlers 0 /Herwig/Analysis/LEPJet
-
-saverun LEP-Powheg EventGenerator
diff --git a/Tests/Inputs/LEP-default.in b/Tests/Inputs/LEP-default.in
deleted file mode 100644
--- a/Tests/Inputs/LEP-default.in
+++ /dev/null
@@ -1,22 +0,0 @@
-# -*- ThePEG-repository -*-
-read snippets/EECollider.in
-cd /Herwig/MatrixElements
-insert SubProcess:MatrixElements 0 MEee2gZ2qq
-
-read LEP.common
-
-cd /Herwig/Generators
-
-set EventGenerator:EventHandler:CascadeHandler:MPIHandler NULL
-
-set EventGenerator:EventHandler:LuminosityFunction:Energy 91.2
-
-insert EventGenerator:AnalysisHandlers 0 /Herwig/Analysis/LEPMultiplicity
-insert EventGenerator:AnalysisHandlers 0 /Herwig/Analysis/BMultiplicity
-insert EventGenerator:AnalysisHandlers 0 /Herwig/Analysis/BFrag
-insert EventGenerator:AnalysisHandlers 0 /Herwig/Analysis/Shapes
-insert EventGenerator:AnalysisHandlers 0 /Herwig/Analysis/LEPIdent
-insert EventGenerator:AnalysisHandlers 0 /Herwig/Analysis/LEPFourJet
-insert EventGenerator:AnalysisHandlers 0 /Herwig/Analysis/LEPJet
-
-saverun LEP-default EventGenerator
diff --git a/Tests/Makefile.am b/Tests/Makefile.am
--- a/Tests/Makefile.am
+++ b/Tests/Makefile.am
@@ -1,365 +1,365 @@
 AM_LDFLAGS += -module -avoid-version -rpath /dummy/path/not/used
 
 EXTRA_DIST = Inputs python Rivet 
 
 EXTRA_LTLIBRARIES = LeptonTest.la GammaTest.la HadronTest.la DISTest.la
 
 if WANT_LIBFASTJET
 EXTRA_LTLIBRARIES += HadronJetTest.la LeptonJetTest.la
 HadronJetTest_la_SOURCES = \
 Hadron/VHTest.h Hadron/VHTest.cc\
 Hadron/VTest.h Hadron/VTest.cc\
 Hadron/HTest.h Hadron/HTest.cc
 HadronJetTest_la_CPPFLAGS = $(AM_CPPFLAGS) $(FASTJETINCLUDE) \
 -I$(FASTJETPATH)
 HadronJetTest_la_LIBADD = $(FASTJETLIBS) 
 LeptonJetTest_la_SOURCES = \
 Lepton/TopDecay.h Lepton/TopDecay.cc
 LeptonJetTest_la_CPPFLAGS = $(AM_CPPFLAGS) $(FASTJETINCLUDE) \
 -I$(FASTJETPATH)
 LeptonJetTest_la_LIBADD = $(FASTJETLIBS) 
 endif
 
 LeptonTest_la_SOURCES = \
 Lepton/VVTest.h Lepton/VVTest.cc \
 Lepton/VBFTest.h Lepton/VBFTest.cc \
 Lepton/VHTest.h Lepton/VHTest.cc \
 Lepton/FermionTest.h Lepton/FermionTest.cc
 
 GammaTest_la_SOURCES = \
 Gamma/GammaMETest.h  Gamma/GammaMETest.cc \
 Gamma/GammaPMETest.h Gamma/GammaPMETest.cc
 
 DISTest_la_SOURCES = \
 DIS/DISTest.h  DIS/DISTest.cc
 
 HadronTest_la_SOURCES = \
 Hadron/HadronVVTest.h  Hadron/HadronVVTest.cc\
 Hadron/HadronVBFTest.h  Hadron/HadronVBFTest.cc\
 Hadron/WHTest.h  Hadron/WHTest.cc\
 Hadron/ZHTest.h  Hadron/ZHTest.cc\
 Hadron/VGammaTest.h  Hadron/VGammaTest.cc\
 Hadron/ZJetTest.h  Hadron/ZJetTest.cc\
 Hadron/WJetTest.h  Hadron/WJetTest.cc\
 Hadron/QQHTest.h  Hadron/QQHTest.cc
 
 
 REPO = $(top_builddir)/src/HerwigDefaults.rpo
 HERWIG = $(top_builddir)/src/Herwig
 HWREAD = $(HERWIG) read --repo $(REPO) -L $(builddir)/.libs -i $(top_builddir)/src
 HWRUN = $(HERWIG) run
 
 tests : tests-LEP tests-DIS tests-LHC tests-Gamma
 
 if WANT_LIBFASTJET
-tests-LEP : test-LEP-VV test-LEP-VH test-LEP-VBF test-LEP-BB test-LEP-Quarks test-LEP-Leptons \
-            test-LEP-default test-LEP-Powheg test-LEP-TopDecay
+tests-LEP : test-LEP-VV test-LEP-VH test-LEP-VBF test-LEP-Quarks test-LEP-Leptons \
+            test-LEP-TopDecay
 else
 tests-LEP : test-LEP-VV test-LEP-VH test-LEP-VBF test-LEP-BB test-LEP-Quarks test-LEP-Leptons
 endif
 
 tests-DIS : test-DIS-Charged test-DIS-Neutral
 
 if WANT_LIBFASTJET
 tests-LHC : test-LHC-WW test-LHC-WZ test-LHC-ZZ test-LHC-ZGamma test-LHC-WGamma \
 	    test-LHC-ZH test-LHC-WH test-LHC-ZJet test-LHC-WJet test-LHC-Z test-LHC-W test-LHC-ZZVBF test-LHC-VBF \
 	    test-LHC-WWVBF test-LHC-bbH test-LHC-ttH test-LHC-GammaGamma test-LHC-GammaJet test-LHC-Higgs \
 	    test-LHC-HiggsJet test-LHC-QCDFast test-LHC-QCD test-LHC-Top test-LHC-Bottom \
             test-LHC-WHJet test-LHC-ZHJet test-LHC-HJet test-LHC-ZShower test-LHC-WShower\
             test-LHC-WHJet-Powheg test-LHC-ZHJet-Powheg test-LHC-HJet-Powheg \
             test-LHC-ZShower-Powheg test-LHC-WShower-Powheg
 else
 tests-LHC : test-LHC-WW test-LHC-WZ test-LHC-ZZ test-LHC-ZGamma test-LHC-WGamma \
 	    test-LHC-ZH test-LHC-WH test-LHC-ZJet test-LHC-WJet test-LHC-Z test-LHC-W test-LHC-ZZVBF test-LHC-VBF \
 	    test-LHC-WWVBF test-LHC-bbH test-LHC-ttH test-LHC-GammaGamma test-LHC-GammaJet test-LHC-Higgs \
 	    test-LHC-HiggsJet test-LHC-QCDFast test-LHC-QCD test-LHC-Top
 endif
 
 tests-Gamma : test-Gamma-FF test-Gamma-WW test-Gamma-P
 
 if WANT_LIBFASTJET 
 test-LEP-% : Inputs/LEP-%.in LeptonTest.la LeptonJetTest.la
 	$(HWREAD) $<
 	$(HWRUN) $(notdir $(subst .in,.run,$<)) -N $${NUMEVENTS:-10000}
 else
 test-LEP-% : Inputs/LEP-%.in LeptonTest.la
 	$(HWREAD) $<
 	$(HWRUN) $(notdir $(subst .in,.run,$<)) -N $${NUMEVENTS:-10000}
 endif
 
 Rivet-LHC-Matchbox-% : Rivet/LHC-Matchbox-%.in
 	if [ ! -d Rivet-$(notdir $(subst .in,,$<))  ]; then mkdir Rivet-$(notdir $(subst .in,,$<)); fi;
 	cd Rivet-$(notdir $(subst .in,,$<)); echo `pwd`; \
 	../$(HERWIG) read --repo ../$(REPO) -L ../$(top_builddir)/lib -i ../$(top_builddir)/src ../$<; \
 	../$(HERWIG) run $(notdir $(subst .in,.run,$<)) -N $${NUMEVENTS:-10000}; \
 	mv $(notdir $(subst .in,.yoda,$<)) ..; \
 	cd ..
 
 Rivet-TVT-Matchbox-% : Rivet/TVT-Matchbox-%.in
 	if [ ! -d Rivet-$(notdir $(subst .in,,$<))  ]; then mkdir Rivet-$(notdir $(subst .in,,$<)); fi;
 	cd Rivet-$(notdir $(subst .in,,$<)); echo `pwd`; \
 	../$(HERWIG) read --repo ../$(REPO) -L ../$(top_builddir)/lib -i ../$(top_builddir)/src ../$<; \
 	../$(HERWIG) run $(notdir $(subst .in,.run,$<)) -N $${NUMEVENTS:-10000}; \
 	mv $(notdir $(subst .in,.yoda,$<)) ..; \
 	cd ..
 
 Rivet-TVT-Dipole-% : Rivet/TVT-Dipole-%.in
 	if [ ! -d Rivet-$(notdir $(subst .in,,$<))  ]; then mkdir Rivet-$(notdir $(subst .in,,$<)); fi;
 	cd Rivet-$(notdir $(subst .in,,$<)); echo `pwd`; \
 	../$(HERWIG) read --repo ../$(REPO) -L ../$(top_builddir)/lib -i ../$(top_builddir)/src ../$<; \
 	../$(HERWIG) run $(notdir $(subst .in,.run,$<)) -N $${NUMEVENTS:-10000}; \
 	mv $(notdir $(subst .in,.yoda,$<)) ..; \
 	cd ..
 
 Rivet-LHC-Dipole-% : Rivet/LHC-Dipole-%.in
 	if [ ! -d Rivet-$(notdir $(subst .in,,$<))  ]; then mkdir Rivet-$(notdir $(subst .in,,$<)); fi;
 	cd Rivet-$(notdir $(subst .in,,$<)); echo `pwd`; \
 	../$(HERWIG) read --repo ../$(REPO) -L ../$(top_builddir)/lib -i ../$(top_builddir)/src ../$<; \
 	../$(HERWIG) run $(notdir $(subst .in,.run,$<)) -N $${NUMEVENTS:-10000}; \
 	mv $(notdir $(subst .in,.yoda,$<)) ..; \
 	cd ..
 
 Rivet/LEP-%.in :
 	python/make_input_files.py $(notdir $(subst .in,,$@))
 
 Rivet/DIS-%.in : 
 	python/make_input_files.py $(notdir $(subst .in,,$@))
 
 Rivet/BFactory-%.in:
 	python/make_input_files.py $(notdir $(subst .in,,$@))
 
 Rivet/TVT-%.in:
 	python/make_input_files.py $(notdir $(subst .in,,$@))
 
 Rivet/LHC-%.in:
 	python/make_input_files.py $(notdir $(subst .in,,$@))
 
 Rivet/Star-%.in:
 	python/make_input_files.py $(notdir $(subst .in,,$@))
 
 Rivet/SppS-%.in:
 	python/make_input_files.py $(notdir $(subst .in,,$@))
 
 Rivet/ISR-%.in:
 	python/make_input_files.py $(notdir $(subst .in,,$@))
 
 Rivet-LEP-Matchbox-% : Rivet/LEP-Matchbox-%.in
 	if [ ! -d Rivet-$(notdir $(subst .in,,$<))  ]; then mkdir Rivet-$(notdir $(subst .in,,$<)); fi;
 	cd Rivet-$(notdir $(subst .in,,$<)); echo `pwd`; \
 	../$(HERWIG) read --repo ../$(REPO) -L ../$(top_builddir)/lib -i ../$(top_builddir)/src ../$<; \
 	../$(HERWIG) run $(notdir $(subst .in,.run,$<)) -N $${NUMEVENTS:-10000}; \
 	mv $(notdir $(subst .in,.yoda,$<)) ..; \
 	cd ..
 
 Rivet-LEP-Dipole-% : Rivet/LEP-Dipole-%.in
 	if [ ! -d Rivet-$(notdir $(subst .in,,$<))  ]; then mkdir Rivet-$(notdir $(subst .in,,$<)); fi;
 	cd Rivet-$(notdir $(subst .in,,$<)); echo `pwd`; \
 	../$(HERWIG) read --repo ../$(REPO) -L ../$(top_builddir)/lib -i ../$(top_builddir)/src ../$<; \
 	../$(HERWIG) run $(notdir $(subst .in,.run,$<)) -N $${NUMEVENTS:-10000}; \
 	mv $(notdir $(subst .in,.yoda,$<)) ..; \
 	cd ..
 
 Rivet-BFactory-Matchbox-% : Rivet/BFactory-Matchbox-%.in
 	if [ ! -d Rivet-$(notdir $(subst .in,,$<))  ]; then mkdir Rivet-$(notdir $(subst .in,,$<)); fi;
 	cd Rivet-$(notdir $(subst .in,,$<)); echo `pwd`; \
 	../$(HERWIG) read --repo ../$(REPO) -L ../$(top_builddir)/lib -i ../$(top_builddir)/src ../$<; \
 	../$(HERWIG) run $(notdir $(subst .in,.run,$<)) -N $${NUMEVENTS:-10000}; \
 	mv $(notdir $(subst .in,.yoda,$<)) ..; \
 	cd ..
 
 Rivet-LEP-% : Rivet/LEP-%.in
 	$(HWREAD) $<
 	$(HWRUN) $(notdir $(subst .in,.run,$<)) -N $${NUMEVENTS:-10000}
 
 Rivet-BFactory-% : Rivet/BFactory-%.in
 	$(HWREAD) $<
 	$(HWRUN) $(notdir $(subst .in,.run,$<)) -N $${NUMEVENTS:-10000}
 
 Rivet-TVT-% : Rivet/TVT-%.in
 	$(HWREAD) $<
 	$(HWRUN) $(notdir $(subst .in,.run,$<)) -N $${NUMEVENTS:-10000}
 
 Rivet-DIS-% : Rivet/DIS-%.in
 	$(HWREAD) $<
 	$(HWRUN) $(notdir $(subst .in,.run,$<)) -N $${NUMEVENTS:-10000}
 
 Rivet-LHC-% : Rivet/LHC-%.in
 	$(HWREAD) $<
 	$(HWRUN) $(notdir $(subst .in,.run,$<)) -N $${NUMEVENTS:-10000}
 
 Rivet-Star-% : Rivet/Star-%.in
 	$(HWREAD) $<
 	$(HWRUN) $(notdir $(subst .in,.run,$<)) -N $${NUMEVENTS:-10000}
 
 Rivet-SppS-% : Rivet/SppS-%.in
 	$(HWREAD) $<
 	$(HWRUN) $(notdir $(subst .in,.run,$<)) -N $${NUMEVENTS:-10000}
 
 Rivet-ISR-% : Rivet/ISR-%.in
 	$(HWREAD) $<
 	$(HWRUN) $(notdir $(subst .in,.run,$<)) -N $${NUMEVENTS:-10000}
 
 Rivet-inputfiles: $(shell echo Rivet/LEP{,-Powheg,-Matchbox,-Dipole,-Dipole-MCatNLO,-Dipole-Matchbox-Powheg,-Matchbox-Powheg,-Merging}-{9.4,12,13,17,27.6,29,30.2,30.7,30.75,30,31.3,34.8,43.6,50,52,55,56,57,60.8,60,61.4,10,12.8,22,26.8,35,44,48.0,91,93.0,130,133,136,161,172,177,183,189,192,196,197,200,202,206,91-nopi}.in) \
                   $(shell echo Rivet/LEP{,-Dipole,-Dipole-MCatNLO,-Dipole-Matchbox-Powheg,-Powheg,-Matchbox-Powheg}-14.in) \
 	          $(shell echo Rivet/LEP{,-Dipole}-{10.5,11.96,12.8,13.96,16.86,21.84,26.8,28.48,35.44,48.0,97.0}-gg.in) \
                   $(shell echo Rivet/BFactory{,-Powheg,-Matchbox,-Dipole,-Dipole-MCatNLO,-Dipole-Matchbox-Powheg,-Matchbox-Powheg}-{10.52,10.52-sym,10.54,10.45}.in) \
                   $(shell echo Rivet/BFactory{,-Dipole}-{Upsilon,Upsilon2,Upsilon4,Tau,10.58-res}.in) \
                   $(shell echo Rivet/DIS{,-NoME,-Powheg,-Matchbox,-Dipole,-Dipole-MCatNLO,-Dipole-Matchbox-Powheg,-Matchbox-Powheg,-Merging}-{e--LowQ2,e+-LowQ2,e+-HighQ2}.in) \
                   $(shell echo Rivet/TVT{,-Powheg,-Matchbox,-Dipole,-Dipole-MCatNLO,-Dipole-Matchbox-Powheg,-Matchbox-Powheg,-Merging}-{Run-I-Z,Run-I-W,Run-I-WZ,Run-II-Z-e,Run-II-Z-{,LowMass-,HighMass-}mu,Run-II-W}.in) \
 	          $(shell echo Rivet/TVT{,-Dipole}-Run-II-{DiPhoton-GammaGamma,DiPhoton-GammaJet,PromptPhoton}.in) \
 	          $(shell echo Rivet/TVT-Powheg-Run-II-{DiPhoton-GammaGamma,DiPhoton-GammaJet}.in) \
                   $(shell echo Rivet/TVT{,-Dipole,-Dipole-MCatNLO,-Dipole-Matchbox-Powheg,-Matchbox,-Matchbox-Powheg,-Merging}-{Run-II-Jets-{0..11},Run-I-Jets-{1..8}}.in ) \
 	          $(shell echo Rivet/TVT{,-Dipole,-Dipole-MCatNLO,-Dipole-Matchbox-Powheg,-Matchbox,-Matchbox-Powheg,-Merging}-{630-Jets-{1..3},300-Jets-1,900-Jets-1}.in ) \
                   $(shell echo Rivet/TVT{,-Dipole}-{Run-I,Run-II,300,630,900}-UE.in) \
                   $(shell echo Rivet/LHC{,-Dipole,-Dipole-MCatNLO,-Dipole-Matchbox-Powheg,-Matchbox,-Matchbox-Powheg,-Merging}-7-DiJets-{1..7}-{A,B,C}.in ) \
                   $(shell echo Rivet/LHC{,-Dipole,-Dipole-MCatNLO,-Dipole-Matchbox-Powheg,-Matchbox,-Matchbox-Powheg,-Merging}-{7,8,13}-Jets-{0..10}.in ) \
 	          $(shell echo Rivet/LHC{,-Dipole}-{900,2360,2760,7,8,13}-UE.in ) \
 	          $(shell echo Rivet/LHC{,-Dipole}-{900,7,13}-UE-Long.in ) \
 		  $(shell echo Rivet/LHC{,-Dipole,-Dipole-MCatNLO,-Dipole-Matchbox-Powheg,-Matchbox,-Matchbox-Powheg,-Merging}-7-Charm-{1..5}.in) \
 		  $(shell echo Rivet/LHC{,-Dipole,-Dipole-MCatNLO,-Dipole-Matchbox-Powheg,-Matchbox,-Matchbox-Powheg,-Merging}-7-Bottom-{0..8}.in) \
 		  $(shell echo Rivet/LHC{,-Dipole,-Dipole-MCatNLO,-Dipole-Matchbox-Powheg,-Matchbox,-Matchbox-Powheg,-Merging}-7-Top-{L,SL}.in) \
 		  $(shell echo Rivet/LHC{,-Dipole,-Dipole-MCatNLO,-Dipole-Matchbox-Powheg,-Matchbox,-Matchbox-Powheg,-Merging}-{7,8,13}-Top-All.in) \
                   $(shell echo Rivet/Star{,-Dipole}-{UE,Jets-{1..4}}.in ) \
 	          $(shell echo Rivet/SppS{,-Dipole}-{200,500,900,546}-UE.in ) \
                   $(shell echo Rivet/LHC{,-Matchbox,-Matchbox-Powheg,-Powheg,-Dipole,-Dipole-MCatNLO,-Dipole-Matchbox-Powheg,-Merging}-{W-{e,mu},13-Z-{e,mu},8-Z-Mass{1..4}-{e,mu},Z-{e,mu,mu-SOPHTY},Z-LowMass-{e,mu},Z-MedMass-e,WZ,WW-{emu,ll},ZZ-{ll,lv},8-ZZ-lv,8-WW-ll,W-Z-{e,mu}}.in) \
                   $(shell echo Rivet/LHC{,-Dipole}-7-{W,Z}Gamma-{e,mu}.in) \
 	          $(shell echo Rivet/LHC{,-Matchbox,-Matchbox-Powheg,-Dipole,-Dipole-MCatNLO,-Dipole-Matchbox-Powheg,-Merging}-{7-W-Jet-{1..3}-e,7-Z-Jet-{0..3}-e,7-Z-Jet-0-mu}.in) \
 	          $(shell echo Rivet/LHC{-Matchbox,-Matchbox-Powheg,-Dipole-MCatNLO,-Dipole-Matchbox-Powheg,-Merging}-{Z-b,Z-bb,W-b,8-Z-jj}.in) \
 		  $(shell echo Rivet/LHC{,-Dipole}-{7,8}-PromptPhoton-{1..4}.in) Rivet/LHC-GammaGamma-7.in \
 	          $(shell echo Rivet/LHC{,-Powheg}-{7,8}-{DiPhoton-GammaGamma,DiPhoton-GammaJet}.in) \
 	          $(shell echo Rivet/LHC{,-Powheg,-Matchbox,-Matchbox-Powheg,-Dipole,-Dipole-MCatNLO,-Dipole-Matchbox-Powheg,-Merging}-{ggH,VBF,WH,ZH}.in) \
                   $(shell echo Rivet/LHC{,-Powheg,-Matchbox,-Matchbox-Powheg,-Dipole,-Dipole-MCatNLO,-Dipole-Matchbox-Powheg,-Merging}-8-{{ggH,VBF,WH,ZH}{,-GammaGamma},ggH-WW}.in) \
                   $(shell echo Rivet/LHC{,-Matchbox,-Matchbox-Powheg,-Dipole,-Dipole-MCatNLO,-Dipole-Matchbox-Powheg,-Merging}-ggHJet.in)
 #                  $(shell echo Rivet/ISR-{30,44,53,62}-UE.in ) $(shell echo Rivet/SppS-{53,63}-UE.in )
 
 Rivet-LEP: $(shell echo Rivet-LEP{,-Powheg,-Matchbox,-Dipole}-{9.4,12,13,17,27.6,29,30.2,30.7,30.75,30,31.3,34.8,43.6,50,52,55,56,57,60.8,60,61.4,10,12.8,22,26.8,35,44,48.0,91,93.0,130,133,136,161,172,177,183,189,192,196,197,200,202,206,91-nopi}) \
 	   $(shell echo Rivet-LEP-{10.5,11.96,12.8,13.96,16.86,21.84,26.8,28.48,35.44,48.0,97.0}-gg) \
            $(shell echo Rivet-LEP{,-Powheg,-Matchbox-Powheg}-14.in)	
 	rm -rf Rivet-LEP
 	python/merge-LEP --with-gg LEP
 	python/merge-LEP LEP-Powheg
 	python/merge-LEP LEP-Matchbox
 	python/merge-LEP LEP-Dipole
 	rivet-mkhtml -o Rivet-LEP LEP.yoda:Hw LEP-Powheg.yoda:Hw-Powheg LEP-Matchbox.yoda:Hw-Matchbox LEP-Dipole.yoda:Hw-Dipole
 
 Rivet-BFactory: $(shell echo Rivet-BFactory{,-Powheg,-Matchbox,-Dipole}-{10.52,10.52-sym,10.54,10.45}) \
                 $(shell echo Rivet-BFactory-{Upsilon,Upsilon2,Upsilon4,Tau,10.58-res,10.58})
 	rm -rf Rivet-BFactory
 	python/merge-BFactory BFactory
 	python/merge-BFactory BFactory-Powheg
 	python/merge-BFactory BFactory-Matchbox
 	python/merge-BFactory BFactory-Dipole
 	rivet-mkhtml -o Rivet-BFactory BFactory.yoda:Hw BFactory-Powheg.yoda:Hw-Powheg BFactory-Matchbox.yoda:Hw-Matchbox BFactory-Dipole.yoda:Hw-Dipole
 
 Rivet-DIS: $(shell echo Rivet-DIS{,-NoME,-Powheg,-Matchbox,-Dipole}-{e--LowQ2,e+-LowQ2,e+-HighQ2})
 	rm -rf Rivet-DIS
 	python/merge-DIS DIS 
 	python/merge-DIS DIS-Powheg
 	python/merge-DIS DIS-NoME
 	python/merge-DIS DIS-Matchbox
 	python/merge-DIS DIS-Dipole
 	rivet-mkhtml -o Rivet-DIS DIS.yoda:Hw DIS-Powheg.yoda:Hw-Powheg DIS-NoME.yoda:Hw-NoME DIS-Matchbox.yoda:Hw-Matchbox DIS-Dipole.yoda:Hw-Dipole
 
 Rivet-TVT-WZ:  $(shell echo Rivet-TVT{,-Powheg,-Matchbox,-Dipole}-{Run-I-Z,Run-I-W,Run-I-WZ,Run-II-Z-{e,{,LowMass-,HighMass-}mu},Run-II-W})
 	rm -rf Rivet-TVT-WZ
 	python/merge-TVT-EW TVT-Run-II-W.yoda TVT-Run-II-Z-{e,{,LowMass-,HighMass-}mu}.yoda\
                             TVT-Run-I-{W,Z,WZ}.yoda -o TVT-WZ.yoda
 	python/merge-TVT-EW TVT-Powheg-Run-II-W.yoda   TVT-Powheg-Run-II-Z-{e,{,LowMass-,HighMass-}mu}.yoda\
                             TVT-Powheg-Run-I-{W,Z,WZ}.yoda -o TVT-Powheg-WZ.yoda
 	python/merge-TVT-EW TVT-Matchbox-Run-II-W.yoda   TVT-Matchbox-Run-II-Z-{e,{,LowMass-,HighMass-}mu}.yoda\
                             TVT-Matchbox-Run-I-{W,Z,WZ}.yoda -o TVT-Matchbox-WZ.yoda
 	python/merge-TVT-EW TVT-Dipole-Run-II-W.yoda   TVT-Dipole-Run-II-Z-{e,{,LowMass-,HighMass-}mu}.yoda\
                             TVT-Dipole-Run-I-{W,Z,WZ}.yoda -o TVT-Dipole-WZ.yoda
 	rivet-mkhtml -o Rivet-TVT-WZ TVT-WZ.yoda:Hw TVT-Powheg-WZ.yoda:Hw-Powheg TVT-Matchbox-WZ.yoda:Hw-Matchbox TVT-Dipole-WZ.yoda:Hw-Dipole
 
 Rivet-TVT-Photon: $(shell echo Rivet-TVT-Run-II-{DiPhoton-GammaGamma,DiPhoton-GammaJet,PromptPhoton}) \
                   $(shell echo Rivet-TVT-Powheg-Run-II-{DiPhoton-GammaGamma,DiPhoton-GammaJet})
 	rm -rf Rivet-TVT-Photon
 	python/merge-TVT-Photon TVT -o TVT-Photon.yoda
 	python/merge-TVT-Photon TVT-Powheg -o TVT-Powheg-Photon.yoda
 	rivet-mkhtml -o Rivet-TVT-Photon TVT-Photon.yoda:Hw TVT-Powheg-Photon.yoda:Hw-Powheg
 
 Rivet-TVT-Jets:  $(shell echo Rivet-TVT-{Run-II-Jets-{0..11},Run-I-Jets-{1..8}} ) \
 	         $(shell echo Rivet-TVT-{630-Jets-{1..3},300-Jets-1,900-Jets-1} ) \
                  $(shell echo Rivet-TVT-{Run-I,Run-II,300,630,900}-UE)
 	rm -rf Rivet-TVT-Jets
 	python/merge-TVT-Jets TVT
 	rivet-mkhtml -o Rivet-TVT-Jets TVT-Jets.yoda:Hw
 
 #python/merge-TVT-Energy TVT
 #rivet-merge-CDF_2012_NOTE10874 TVT-300-Energy.yoda TVT-900-Energy.yoda TVT-1960-Energy.yoda
 #flat2yoda RatioPlots.dat -o TVT-RatioPlots.yoda
 
 Rivet-LHC-Jets: $(shell echo Rivet-LHC-7-DiJets-{1..7}-{A,B,C} ) \
 	        $(shell echo Rivet-LHC-{7,8,13}-Jets-{0..10} ) \
 	        $(shell echo Rivet-LHC-{900,2360,2760,7,8,13}-UE ) \
 	        $(shell echo Rivet-LHC-{900,7,13}-UE-Long ) \
 		$(shell echo Rivet-LHC-7-Charm-{1..5}) \
 		$(shell echo Rivet-LHC-7-Bottom-{0..8}) \
 		$(shell echo Rivet-LHC-7-Top-{L,SL})\
 		$(shell echo Rivet-LHC-{7,8,13}-Top-All)
 	rm -rf Rivet-LHC-Jets
 	python/merge-LHC-Jets LHC
 	rivet-mkhtml -o Rivet-LHC-Jets LHC-Jets.yoda:Hw
 
 Rivet-Star: $(shell echo Rivet-Star-{UE,Jets-{1..4}} ) 
 	rm -rf Rivet-Star
 	python/merge-Star Star
 	rivet-mkhtml -o Rivet-Star Star.yoda
 
 Rivet-SppS: $(shell echo Rivet-ISR-{30,44,53,62}-UE ) \
 	    $(shell echo Rivet-SppS-{53,63,200,500,900,546}-UE )
 	rm -rf Rivet-SppS
 	python/merge-SppS SppS
 	rivet-mkhtml -o Rivet-SppS SppS.yoda
 
 Rivet-LHC-EW: $(shell echo Rivet-LHC{,-Matchbox,-Powheg,-Dipole}-{13-Z-{e,mu},8-Z-Mass{1..4}-{e,mu},W-{e,mu},Z-{e,mu,mu-SOPHTY},Z-LowMass-{e,mu},Z-MedMass-e,WZ,WW-{emu,ll},ZZ-{ll,lv},8-ZZ-lv,,8-WW-llW-Z-{e,mu}}) \
 	      $(shell echo Rivet-LHC{,-Matchbox,-Dipole}-{7-W-Jet-{1..3}-e,7-Z-Jet-{0..3}-e,7-Z-Jet-0-mu}) \
 	      $(shell echo Rivet-LHC{-Matchbox,-Dipole}-{Z-b,Z-bb,W-b,8-Z-jj}) \
               $(shell echo Rivet-LHC-7-{W,Z}Gamma-{e,mu}) \
 	rm -rf Rivet-LHC-EW;
 	python/merge-LHC-EW LHC-{13-Z-{e,mu},8-Z-Mass{1..4}-{e,mu},W-{e,mu},Z-{e,mu,mu-Short},Z-LowMass-{e,mu},Z-MedMass-e,W-Z-{e,mu},WW-{emu,ll},WZ,ZZ-{ll,lv},8-ZZ-lv,8-WW-ll}.yoda LHC-7-{W,Z}-Jet-{1,2,3}-e.yoda LHC-7-{W,Z}Gamma-{e,mu}.yoda -o LHC-EW.yoda;
 	python/merge-LHC-EW LHC-Matchbox-{13-Z-{e,mu},8-Z-Mass{1..4}-{e,mu},W-{e,mu},Z-{e,mu,mu-Short},Z-LowMass-{e,mu},Z-MedMass-e,W-Z-{e,mu},WW-{emu,ll},WZ,ZZ-{ll,lv},8-ZZ-lv,8-WW-ll}.yoda LHC-Matchbox-7-{W,Z}-Jet-{1,2,3}-e.yoda -o LHC-Matchbox-EW.yoda;
 	python/merge-LHC-EW LHC-Dipole-{13-Z-{e,mu},8-Z-Mass{1..4}-{e,mu},W-{e,mu},Z-{e,mu,mu-Short},Z-LowMass-{e,mu},Z-MedMass-e,W-Z-{e,mu},WW-{emu,ll},WZ,ZZ-{ll,lv},8-ZZ-lv,8-WW-ll}.yoda LHC-Dipole-7-{W,Z}-Jet-{1,2,3}-e.yoda -o LHC-Dipole-EW.yoda;
 	python/merge-LHC-EW LHC-Powheg-{W-{e,mu},Z-{e,mu},Z-LowMass-{e,mu},Z-MedMass-e,W-Z-{e,mu},WW-{emu,ll},WZ,ZZ-{ll,lv},8-ZZ-lv,8-WW-ll}.yoda -o LHC-Powheg-EW.yoda;
 	rivet-mkhtml -o Rivet-LHC-EW LHC-EW.yoda:Hw LHC-Powheg-EW.yoda:Hw-Powheg LHC-Matchbox-EW.yoda:Hw-Matchbox LHC-Matchbox-Z-b.yoda:Hw-Matchbox-Zb \
                                      LHC-Matchbox-Z-bb.yoda:Hw-Matchbox-Zbb LHC-Matchbox-W-b.yoda:Hw-Matchbox-W-bb LHC-Dipole-EW.yoda:Hw-Dipole \
                                      LHC-Dipole-Z-b.yoda:Hw-Dipole-Zb LHC-Dipole-Z-bb.yoda:Hw-Dipole-Zbb LHC-Dipole-W-b.yoda:Hw-Dipole-W-bb \
                                      LHC-Z-mu-SOPHTY.yoda:Hw LHC-Powheg-Z-mu-SOPHTY.yoda:Hw-Powheg LHC-Matchbox-Z-mu-SOPHTY.yoda:Hw-Matchbox
 Rivet-LHC-Photon: $(shell echo Rivet-LHC-{7,8}-PromptPhoton-{1..4}) Rivet-LHC-GammaGamma-7 \
 	          $(shell echo Rivet-LHC{,-Powheg}-{7,8}-{DiPhoton-GammaGamma,DiPhoton-GammaJet})
 	rm -rf Rivet-LHC-Photon
 	python/merge-LHC-Photon LHC -o LHC-Photon.yoda
 	python/merge-LHC-Photon LHC-Powheg -o LHC-Powheg-Photon.yoda
 	rivet-mkhtml -o Rivet-LHC-Photon LHC-Photon.yoda:Hw LHC-Powheg-Photon.yoda:Hw-Powheg
 
 Rivet-LHC-Higgs:  $(shell echo Rivet-LHC{,-Powheg}-{ggH,VBF,WH,ZH})\
                   $(shell echo Rivet-LHC{,-Powheg}-8-{{ggH,VBF,WH,ZH}{,-GammaGamma},ggH-WW}) Rivet-LHC-ggHJet
 	rm -rf Rivet-LHC-Higgs
 	rivet-mkhtml -o Rivet-LHC-Higgs LHC-Powheg-ggH.yoda:gg-Powheg LHC-ggH.yoda:gg LHC-ggHJet.yoda:HJet \
                         LHC-Powheg-VBF.yoda:VBF-Powheg LHC-VBF.yoda:VBF LHC-WH.yoda:WH LHC-ZH.yoda:ZH \
                         LHC-Powheg-WH.yoda:WH-Powheg LHC-Powheg-ZH.yoda:ZH-Powheg
 
 tests-Rivet : Rivet-LEP Rivet-BFactory Rivet-DIS Rivet-TVT-WZ Rivet-TVT-Photon Rivet-TVT-Jets Rivet-LHC-Jets Rivet-Star Rivet-SppS Rivet-LHC-EW Rivet-LHC-Photon Rivet-LHC-Higgs
 
 
 test-Gamma-% : Inputs/Gamma-%.in GammaTest.la
 	$(HWREAD) $<
 	$(HWRUN) $(notdir $(subst .in,.run,$<)) -N $${NUMEVENTS:-10000}
 
 test-DIS-% : Inputs/DIS-%.in DISTest.la
 	$(HWREAD) $<
 	$(HWRUN) $(notdir $(subst .in,.run,$<)) -N $${NUMEVENTS:-10000}
 
 if WANT_LIBFASTJET 
 test-LHC-% : Inputs/LHC-%.in HadronTest.la GammaTest.la HadronJetTest.la
 	$(HWREAD) $<
 	$(HWRUN) $(notdir $(subst .in,.run,$<)) -N $${NUMEVENTS:-10000}
 else
 test-LHC-% : Inputs/LHC-%.in HadronTest.la GammaTest.la
 	$(HWREAD) $<
 	$(HWRUN) $(notdir $(subst .in,.run,$<)) -N $${NUMEVENTS:-10000}
 endif
 
 clean-local:
 	rm -f *.out *.log *.tex *.top *.run *.dump *.mult *.Bmult *.yoda