diff --git a/Code/Mantid/Framework/CurveFitting/inc/MantidCurveFitting/ThermalNeutronBk2BkExpConvPV.h b/Code/Mantid/Framework/CurveFitting/inc/MantidCurveFitting/ThermalNeutronBk2BkExpConvPV.h
index 75c5aa88b3f2d81d533fdb293e9f24ca83e210f6..8c3c09986bd96222fee9faab834eb465e25a1521 100644
--- a/Code/Mantid/Framework/CurveFitting/inc/MantidCurveFitting/ThermalNeutronBk2BkExpConvPV.h
+++ b/Code/Mantid/Framework/CurveFitting/inc/MantidCurveFitting/ThermalNeutronBk2BkExpConvPV.h
@@ -110,6 +110,8 @@ namespace CurveFitting
 
     mutable std::map<std::string, double> mParameters;
 
+    mutable double m_fwhm;
+
     //-----------  For Parallelization -----------------------------------------
     ///
     void interruption_point() const;
diff --git a/Code/Mantid/Framework/CurveFitting/src/ThermalNeutronBk2BkExpConvPV.cpp b/Code/Mantid/Framework/CurveFitting/src/ThermalNeutronBk2BkExpConvPV.cpp
index ca26dfc5177ef59d28455803622b7e6e4409003b..37df7d883f6db9c723865576be6c8572393eb4cf 100644
--- a/Code/Mantid/Framework/CurveFitting/src/ThermalNeutronBk2BkExpConvPV.cpp
+++ b/Code/Mantid/Framework/CurveFitting/src/ThermalNeutronBk2BkExpConvPV.cpp
@@ -6,6 +6,7 @@
 #include <gsl/gsl_sf_erf.h>
 
 #define PI 3.14159265358979323846264338327950288419716939937510582
+#define PEAKRANGE 5.0
 
 using namespace std;
 using namespace Mantid;
@@ -227,13 +228,15 @@ void ThermalNeutronBk2BkExpConvPV::calculateParameters(double& dh, double& tof_h
   // 5. Debug output
   if (explicitoutput)
   {
-    std::cout << "alpha = " << alpha << ", beta = " << beta
-              << ", N = " << N << std::endl;
-    std::cout << "  n = " << n << ", alpha_e = " << alpha_e << ", alpha_t = " << alpha_t << std::endl;
-    std::cout << " dh = " << dh << ", alph0t = " << alph0t << ", alph1t = " << alph1t
-              << ", alph0 = " << alph0 << ", alph1 = " << alph1 << std::endl;
-    std::cout << "  n = " << n << ", beta_e = " << beta_e << ", beta_t = " << beta_t << std::endl;
-    std::cout << " dh = " << dh << ", beta0t = " << beta0t << ", beta1t = " << beta1t << std::endl;
+    stringstream errss;
+    errss << "alpha = " << alpha << ", beta = " << beta
+          << ", N = " << N << std::endl;
+    errss << "  n = " << n << ", alpha_e = " << alpha_e << ", alpha_t = " << alpha_t << std::endl;
+    errss << " dh = " << dh << ", alph0t = " << alph0t << ", alph1t = " << alph1t
+          << ", alph0 = " << alph0 << ", alph1 = " << alph1 << std::endl;
+    errss << "  n = " << n << ", beta_e = " << beta_e << ", beta_t = " << beta_t << std::endl;
+    errss << " dh = " << dh << ", beta0t = " << beta0t << ", beta1t = " << beta1t << std::endl;
+    g_log.error(errss.str());
   }
 
   return;
@@ -250,6 +253,7 @@ void ThermalNeutronBk2BkExpConvPV::functionLocal(double* out, const double* xVal
 
   double d_h, tof_h, alpha, beta, H, sigma2, eta, N, gamma;
   this->calculateParameters(d_h, tof_h, eta, alpha, beta, H, sigma2, gamma, N, false);
+  m_fwhm = fwhm();
 
   // cout << "DBx212:  eta = " << eta << ", gamma = " << gamma << endl;
 
@@ -266,7 +270,6 @@ void ThermalNeutronBk2BkExpConvPV::functionLocal(double* out, const double* xVal
     // a) Caclualte peak intensity
     double dT = xValues[id]-tof_h;
     double omega = calOmega(dT, eta, N, alpha, beta, H, sigma2, invert_sqrt2sigma);
-
     out[id] = height*omega;
 
     /*  Disabled for parallel checking
@@ -458,6 +461,14 @@ void ThermalNeutronBk2BkExpConvPV::calHandEta(double sigma2, double gamma, doubl
 double ThermalNeutronBk2BkExpConvPV::calOmega(double x, double eta, double N, double alpha, double beta, double H,
                                               double sigma2, double invert_sqrt2sigma, bool explicitoutput) const
 {
+  // 0. X range check
+  if (fabs(x) > m_fwhm*PEAKRANGE)
+  {
+    // Return 0 if x is too far away from 0
+    return 0.0;
+  }
+
+
   // 1. Prepare
   std::complex<double> p(alpha*x, alpha*sqrt(H)*0.5);
   std::complex<double> q(-beta*x, beta*sqrt(H)*0.5);
@@ -502,26 +513,15 @@ double ThermalNeutronBk2BkExpConvPV::calOmega(double x, double eta, double N, do
 
   if (explicitoutput && !(omega > -DBL_MAX && omega < DBL_MAX))
   {
-    std::cout << "Find omega = " << omega << " is infinity! omega1 = " << omega1 << ", omega2 = " << omega2 << std::endl;
-    std::cout << "  u = " << u << ", v = " << v << ", erfc(y) = " << gsl_sf_erfc(y)
-                  << ", erfc(z) = " << gsl_sf_erfc(z) << std::endl;
-    std::cout << "  alpha = " << alpha << ", x = " << x << " sigma2 = " << sigma2
-                  << ", N = " << N << std::endl;
+    stringstream errss;
+    errss << "Find omega = " << omega << " is infinity! omega1 = " << omega1 << ", omega2 = " << omega2 << std::endl;
+    errss << "  u = " << u << ", v = " << v << ", erfc(y) = " << gsl_sf_erfc(y)
+          << ", erfc(z) = " << gsl_sf_erfc(z) << std::endl;
+    errss << "  alpha = " << alpha << ", x = " << x << " sigma2 = " << sigma2
+          << ", N = " << N << std::endl;
+    g_log.warning(errss.str());
   }
 
-  /* Debug output to understand E1()
-  cout << setw(15) << p.real() << setw(15) << p.imag() << "\t\t" << omega2a << endl;
-  cout << setw(15) << p.real() << setw(15) << p.imag() << setw(15) << exp(p).real() << setw(15) << exp(p).imag()
-       << setw(15) << E1(p).real() << setw(15) << E1(p).imag() << endl;
-
-  cout << q.real() << "\t\t" << q.imag() << "\t\t" << omega2b << endl;
-  cout << setw(15) << q.real() << setw(15) << q.imag() << setw(15) << exp(q).real() << setw(15) << exp(q).imag()
-       << setw(15) << E1(q).real() << setw(15) << E1(q).imag() << endl;
-  cout << p.real() << "\t\t" << p.imag() << "\t\t" << E1(p).real() << "\t\t" << E1(p).imag() << endl;
-  cout << exp(p) << "\t\t" << exp(q) << endl;
-  cout << q.real() << "\t\t" << q.imag() << "\t\t" << E1(q).real() << "\t\t" << E1(q).imag() << endl;
-  */
-
   return omega;
 }