diff --git a/lalapps/src/pulsar/Xray/SemiCoherentBinary_v2.c b/lalapps/src/pulsar/Xray/SemiCoherentBinary_v2.c
index 9e7c498b5c65a7f2487a31dce64e758b12bd3054..49fc9a218e804c0a31dfd1f1782748541c00dd59 100644
--- a/lalapps/src/pulsar/Xray/SemiCoherentBinary_v2.c
+++ b/lalapps/src/pulsar/Xray/SemiCoherentBinary_v2.c
@@ -95,6 +95,7 @@ typedef struct {
   REAL8 tsft;                       /**< the length of the input sfts */
   CHAR *comment;
   CHAR *tempdir;                    /**< a temporary directory for keeping the results */
+  BOOLEAN with_chi2_renorm;         /**< switch on chi^2 renormalisation */
   BOOLEAN with_xbins;               /**< enable fast summing of extra bins */
 } UserInput_t;
 
@@ -113,7 +114,7 @@ extern int vrbflg;              /**< defined in lalapps.c */
 /* define functions */
 int main(int argc,char *argv[]);
 int XLALReadUserVars(int argc,char *argv[],UserInput_t *uvar, CHAR **clargs);
-int XLALComputeSemiCoherentStat(FILE *fp,REAL4DemodulatedPowerVector *power,ParameterSpace *pspace,GridParametersVector *fgrid,GridParameters *bingrid,INT4 ntoplist,BOOLEAN with_xbins);
+int XLALComputeSemiCoherentStat(FILE *fp,REAL4DemodulatedPowerVector *power,ParameterSpace *pspace,GridParametersVector *fgrid,GridParameters *bingrid,INT4 ntoplist,BOOLEAN with_chi2_renorm,BOOLEAN with_xbins);
 int XLALDefineBinaryParameterSpace(REAL8Space **, LIGOTimeGPS, REAL8, UserInput_t *);
 int XLALOpenSemiCoherentResultsFile(FILE **,CHAR *,ParameterSpace *,CHAR *,UserInput_t *);
 int XLALtoplist(REAL4 x,Template *params,toplist *TL);
@@ -369,7 +370,7 @@ int main( int argc, char *argv[] )  {
   /**********************************************************************************/
 
   /* compute the semi-coherent detection statistic on the fine grid */
-  if (XLALComputeSemiCoherentStat(sfp,dmpower,&pspace,freqgridparams,bingridparams,uvar.ntoplist,uvar.with_xbins)) {
+  if (XLALComputeSemiCoherentStat(sfp,dmpower,&pspace,freqgridparams,bingridparams,uvar.ntoplist,uvar.with_chi2_renorm,uvar.with_xbins)) {
     LogPrintf(LOG_CRITICAL,"%s : XLALComputeSemiCoherentStat() failed with error = %d\n",__func__,xlalErrno);
     return 1;
   }
@@ -464,6 +465,7 @@ int XLALReadUserVars(int argc,            /**< [in] the command line argument co
   uvar->tsft = 256;
   uvar->seed = 1;
   uvar->tempdir = NULL;
+  uvar->with_chi2_renorm = 1;
   uvar->with_xbins = 1;
 
   /* initialise all parameter space ranges to zero */
@@ -498,6 +500,7 @@ int XLALReadUserVars(int argc,            /**< [in] the command line argument co
   XLALRegisterUvarMember(seed,                    INT4, 'X', OPTIONAL, "The random number seed (0 = clock)");
   XLALRegisterUvarMember(gpsstart,                INT4, 's', OPTIONAL, "The minimum start time (GPS sec)");
   XLALRegisterUvarMember(gpsend,                INT4, 'e', OPTIONAL, "The maximum end time (GPS sec)");
+  XLALRegisterUvarMember(with_chi2_renorm,       BOOLEAN, 0, OPTIONAL,  "Switch on chi^2 renormalisation");
   XLALRegisterUvarMember(with_xbins,             BOOLEAN, 0, DEVELOPER,  "Enable fast summing of extra bins");
 
   /* do ALL cmdline and cfgfile handling */
@@ -537,6 +540,7 @@ int XLALComputeSemiCoherentStat(FILE *fp,                                /**< [i
                                 GridParametersVector *fgrid,		/**< UNDOCUMENTED */
                                 GridParameters *bingrid,                 /**< [in] the grid parameters */
                                 INT4 ntoplist,		/**< UNDOCUMENTED */
+                                BOOLEAN with_chi2_renorm,                /**< switch on chi^2 renormalisation */
                                 BOOLEAN with_xbins                       /**< enable fast summing of extra bins */
                                 )
 {
@@ -777,8 +781,10 @@ int XLALComputeSemiCoherentStat(FILE *fp,                                /**< [i
   var = var/(REAL8)(Ntemp-1);
   var = (var - mean*mean);
 
-  /* modify toplist to have correct mean and variance */
-  for (i=0;i<(UINT4)TL.n;i++) TL.data[i] = (TL.data[i] - mean)*sqrt(4.0*power->length)/sqrt(var) + 2.0*power->length;
+  if ( with_chi2_renorm ) {
+    /* modify toplist to have correct mean and variance */
+    for (i=0;i<(UINT4)TL.n;i++) TL.data[i] = (TL.data[i] - mean)*sqrt(4.0*power->length)/sqrt(var) + 2.0*power->length;
+  }
 
   /* output toplist to file */
   for (i=0;i<(UINT4)TL.n;i++) {
diff --git a/lalapps/src/pulsar/Xray/SemiCoherentUtils.c b/lalapps/src/pulsar/Xray/SemiCoherentUtils.c
index 3882dfc2df1e2a01334e2ace50a6003b465a5e85..6ebc894f0467561a1c499cd718aa9cec8045ac38 100644
--- a/lalapps/src/pulsar/Xray/SemiCoherentUtils.c
+++ b/lalapps/src/pulsar/Xray/SemiCoherentUtils.c
@@ -250,17 +250,17 @@ int XLALGetNextRandomBinaryTemplate(Template **temp,                        /**<
   while (!flag) {
 
     REAL8 temp1 = gsl_ran_flat((gsl_rng*)r,0,1);
-    nu = n2*pow((pow(n1/n2,4.0) + (1.0 - pow(n1/n2,4.0))*temp1),1.0/4.0);
+    nu = (n1 < n2) ? n2*pow((pow(n1/n2,4.0) + (1.0 - pow(n1/n2,4.0))*temp1),1.0/4.0) : n1;
     REAL8 temp2 = gsl_ran_flat((gsl_rng*)r,0,1);
-    a = a2*pow((pow(a1/a2,3.0) + (1.0 - pow(a1/a2,3.0))*temp2),1.0/3.0);
+    a = (a1 < a2) ? a2*pow((pow(a1/a2,3.0) + (1.0 - pow(a1/a2,3.0))*temp2),1.0/3.0) : a1;
     REAL8 temp3 = gsl_ran_flat((gsl_rng*)r,0,1);
-    tasc = t1 + (t2-t1)*temp3;
+    tasc = (t1 < t2) ? t1 + (t2-t1)*temp3 : t1;
     REAL8 temp4 = gsl_ran_flat((gsl_rng*)r,0,1);
-    Om = O2*pow((pow(O1/O2,5.0) + (1.0 - pow(O1/O2,5.0))*temp4),1.0/5.0);
+    Om = (O1 < O2) ? O2*pow((pow(O1/O2,5.0) + (1.0 - pow(O1/O2,5.0))*temp4),1.0/5.0) : O1;
 
     /* LogPrintf(LOG_DEBUG,"%f (%f %f) %f (%f %f) %f (%f %f) %f (%f %f)\n",nu,n1,n2,a,a1,a2,tasc,t1,t2,Om,O1,O2); */
 
-    if ((nu>n1)&&(nu<n2)&&(a>a1)&&(a<a2)&&(tasc>t1)&&(tasc<t2)&&(Om>O1)&&(Om<O2)) flag = 1;
+    if ((nu>=n1)&&(nu<=n2)&&(a>=a1)&&(a<=a2)&&(tasc>=t1)&&(tasc<=t2)&&(Om>=O1)&&(Om<=O2)) flag = 1;
 
   }
 
@@ -1313,19 +1313,46 @@ int XLALComputeBinaryGridParams(GridParameters **binarygridparams,  /**< [out] t
   (*binarygridparams)->coverage = coverage;
   if ((*binarygridparams)->coverage>0) {
 
+    ndim = 4;
     REAL8 Vn = pow(LAL_PI,ndim/2.0)/gsl_sf_gamma(1.0+ndim/2.0);
+    REAL8 Vsr = 1;
 
     REAL8 G11 = pow(LAL_PI,2.0)*DT*DT/3;
+    REAL8 fmin = space->data[0].min;
+    REAL8 fmax = space->data[0].max;
+    REAL8 fmid = 0.5*(fmin + fmax);
+    fmin = MYMIN(fmin, fmid - sqrt(mu/G11));
+    fmax = MYMAX(fmax, fmid + sqrt(mu/G11));
+    Vsr *= sqrt(G11/mu) * (pow(fmax,4.0) - pow(fmin,4.0)) / 4.0;
+
     REAL8 G22 = pow(LAL_PI,2.0)*DT*DT/6;
+    REAL8 amin = space->data[1].min;
+    REAL8 amax = space->data[1].max;
+    REAL8 amid = 0.5*(amin + amax);
+    amin = MYMIN(amin, amid - sqrt(mu/G22));
+    amax = MYMAX(amax, amid + sqrt(mu/G22));
+    Vsr *= sqrt(G22/mu) * (pow(amax,3.0) - pow(amin,3.0)) / 3.0;
+
     REAL8 G33 = pow(LAL_PI,2.0)*DT*DT/6;
+    REAL8 tascmin = space->data[2].min;
+    REAL8 tascmax = space->data[2].max;
+    REAL8 tascmid = 0.5*(tascmin + tascmax);
+    tascmin = MYMIN(tascmin, tascmid - sqrt(mu/G33));
+    tascmax = MYMAX(tascmax, tascmid + sqrt(mu/G33));
+    Vsr *= sqrt(G33/mu) * (tascmax - tascmin);
+
     REAL8 G44 = pow(LAL_PI,2.0)*DT*DT*T*T/72;
+    REAL8 omegamin = space->data[3].min;
+    REAL8 omegamax = space->data[3].max;
+    REAL8 omegamid = 0.5*(omegamin + omegamax);
+    omegamin = MYMIN(omegamin, omegamid - sqrt(mu/G44));
+    omegamax = MYMAX(omegamax, omegamid + sqrt(mu/G44));
+    Vsr *= sqrt(G44/mu) * (pow(omegamax,5.0) - pow(omegamin,5.0)) / 5.0;
 
-    REAL8 dVr = sqrt(G11*G22*G33*G44);
-    REAL8 Vsr = dVr*space->data[2].span*(1.0/60.0)*(pow(space->data[3].max,5.0)-pow(space->data[3].min,5.0))*(pow(space->data[0].max,4.0)-pow(space->data[0].min,4.0))*(pow(space->data[1].max,3.0)-pow(space->data[1].min,3.0));
+    (*binarygridparams)->Nr = (UINT8)ceil( (1.0/Vn) * log(1.0/(1.0-coverage)) * Vsr );
 
-    (*binarygridparams)->Nr = (UINT8)ceil((1.0/Vn)*log(1.0/(1.0-coverage))*(pow(mu,-ndim/2.0))*Vsr);
-    LogPrintf(LOG_DEBUG,"%s : computed the number of random binary templates to be %"LAL_UINT8_FORMAT".\n",__func__,(*binarygridparams)->Nr);
-    LogPrintf(LOG_DEBUG,"%s : to be compared to the total number of cubic templates %"LAL_UINT8_FORMAT" (%.6f).\n", __func__, (*binarygridparams)->max, (REAL8)(*binarygridparams)->max/(REAL8)(*binarygridparams)->Nr);
+    LogPrintf(LOG_NORMAL,"%s : computed the number of random binary templates to be %"LAL_UINT8_FORMAT".\n",__func__,(*binarygridparams)->Nr);
+    LogPrintf(LOG_NORMAL,"%s : to be compared to the total number of cubic templates %"LAL_UINT8_FORMAT" (%.6f).\n", __func__, (*binarygridparams)->max, (REAL8)(*binarygridparams)->max/(REAL8)(*binarygridparams)->Nr);
 
   }
 
@@ -1525,8 +1552,22 @@ int XLALBinaryToSFTVector(SFTVector **SFTvect,     /**< [out] copied SFT (needs
 
       /**********************************************************************************/
       /* extract effective band from this, if neccessary (ie if faster-sampled output SFTs) */
-      SFTVector *tempSFTvect = XLALExtractBandFromSFTVector ( sftvect, par->freq, par->freqband-1.0/par->tsft );    /* the last bin has to be avoided */
+      REAL8 df = sftvect->data[0].deltaF;
+      long bin0 = lround( ( par->freq                 - sftvect->data[0].f0 ) / df);
+      long bin1 = lround( ( par->freq + par->freqband - sftvect->data[0].f0 ) / df);
+      SFTVector *tempSFTvect = NULL;
+      XLAL_CHECK ( (tempSFTvect = XLALCreateSFTVector ( sftvect->length, 0 )) != NULL, XLAL_EFUNC );
+      for ( UINT4 alpha = 0; alpha < sftvect->length; ++alpha ) {
+        SFTtype *dest = &(tempSFTvect->data[alpha]);
+        SFTtype *src =  &(sftvect->data[alpha]);
+        *dest = *src;
+        dest->f0 += bin0 * df;
+        XLAL_CHECK ( (dest->data = XLALCreateCOMPLEX8Vector ( bin1 - bin0 )) != NULL, XLAL_EFUNC );
+        memcpy( dest->data->data, src->data->data + bin0, ( bin1 - bin0 ) * sizeof(dest->data->data[0]) );
+      }
       XLALDestroySFTVector(sftvect);
+      LogPrintf(LOG_DEBUG, "extracted frequency band %0.16g to %0.16g, bin %li to %li\n",
+                tempSFTvect->data[0].f0, tempSFTvect->data[0].f0 + tempSFTvect->data[0].deltaF * tempSFTvect->data[0].data->length, bin0, bin1);
 
       /**********************************************************************************/
       /* append these SFTs to the full list of SFTs */