diff --git a/Framework/Algorithms/src/SampleCorrections/MCInteractionVolume.cpp b/Framework/Algorithms/src/SampleCorrections/MCInteractionVolume.cpp
index e259b3447c033d42bf40f34101e64ccec81118ad..030e13b175a097a4e0277e4b76f4eb80381f7cc8 100644
--- a/Framework/Algorithms/src/SampleCorrections/MCInteractionVolume.cpp
+++ b/Framework/Algorithms/src/SampleCorrections/MCInteractionVolume.cpp
@@ -18,21 +18,6 @@ using Kernel::V3D;
 
 namespace Algorithms {
 
-namespace {
-
-/**
- * Compute the attenuation factor for the given coefficients
- * @param rho Number density of the sample in \f$\\A^{-3}\f$
- * @param sigma Cross-section in barns
- * @param length Path length in metres
- * @return The dimensionless attenuated fraction
- */
-double attenuation(double rho, double sigma, double length) {
-  using std::exp;
-  return exp(-100 * rho * sigma * length);
-}
-} // namespace
-
 /**
  * Construct the volume encompassing the sample + any environment kit. The
  * beam profile defines a bounding region for the sampling of the scattering
@@ -119,11 +104,7 @@ double MCInteractionVolume::calculateAbsorption(
     for (const auto &segment : path) {
       const double length = segment.distInsideObject;
       const auto &segObj = *(segment.object);
-      const auto &segMat = segObj.material();
-      factor *= attenuation(segMat.numberDensity(),
-                            segMat.totalScatterXSection(lambda) +
-                                segMat.absorbXSection(lambda),
-                            length);
+      factor *= segObj.material().attenuation(length, lambda);
     }
     return factor;
   };
diff --git a/Framework/Kernel/inc/MantidKernel/Material.h b/Framework/Kernel/inc/MantidKernel/Material.h
index 78f35450658963fa3bb18ee05bacf8d4d372739d..2c0ac8024688ac5b43fdd17ffbcb018b90bb815a 100644
--- a/Framework/Kernel/inc/MantidKernel/Material.h
+++ b/Framework/Kernel/inc/MantidKernel/Material.h
@@ -103,6 +103,10 @@ public:
   double
   absorbXSection(const double lambda =
                      PhysicalConstants::NeutronAtom::ReferenceLambda) const;
+  /// Compute the attenuation at a given wavelegnth over the given distance
+  double attenuation(const double distance,
+                     const double lambda =
+                         PhysicalConstants::NeutronAtom::ReferenceLambda) const;
 
   /**
    * Returns the linear coefficient of absorption for the material in units of
diff --git a/Framework/Kernel/src/Material.cpp b/Framework/Kernel/src/Material.cpp
index 4749f5e1ac30843ca847fe07b75cf317a446b250..6b2756ef2c53030be2a6680b690729a8236ab034 100644
--- a/Framework/Kernel/src/Material.cpp
+++ b/Framework/Kernel/src/Material.cpp
@@ -243,11 +243,21 @@ double Material::absorbXSection(const double lambda) const {
   }
 }
 
+/**
+ * @param distance Distance (m) travelled
+ * @param lambda Wavelength (Angstroms) to compute the attenuation (default =
+ * reference lambda)
+ * @return The dimensionless attenuation coefficient
+ */
+double Material::attenuation(const double distance, const double lambda) const {
+  return exp(-100 * numberDensity() *
+             (totalScatterXSection() + absorbXSection(lambda)) * distance);
+}
+
 // NOTE: the angstrom^-2 to barns and the angstrom^-1 to cm^-1
 // will cancel for mu to give units: cm^-1
 double Material::linearAbsorpCoef(const double lambda) const {
-  return absorbXSection(NeutronAtom::ReferenceLambda) * 100. * numberDensity() *
-         lambda / NeutronAtom::ReferenceLambda;
+  return absorbXSection(lambda) * 100. * numberDensity();
 }
 
 // This must match the values that come from the scalar version
diff --git a/Framework/Kernel/test/MaterialTest.h b/Framework/Kernel/test/MaterialTest.h
index b76e05ea01440c599d389f7de47554032951deb9..4ecb3a298bed04e893d0d1a68d81b0e2e7ad2c8b 100644
--- a/Framework/Kernel/test/MaterialTest.h
+++ b/Framework/Kernel/test/MaterialTest.h
@@ -85,6 +85,8 @@ public:
     TS_ASSERT_DELTA(material.incohScatterXSection(lambda),
                     material.incohScatterXSection(), 1e-04);
     TS_ASSERT_DELTA(material.absorbXSection(lambda), 5.93, 1e-02);
+    const double distance(0.05);
+    TS_ASSERT_DELTA(material.attenuation(distance, lambda), 0.01884, 1e-4);
   }
 
   // highly absorbing material
@@ -124,6 +126,8 @@ public:
 
     const double totXS = TiZr.totalScatterXSection();
     TS_ASSERT_DELTA(TiZr.totalScatterLengthSqrd(), 25. * totXS / M_PI, 1.e-4);
+    const double distance(0.05);
+    TS_ASSERT_DELTA(TiZr.attenuation(distance), 0., 1e-4);
   }
 
   /** Save then re-load from a NXS file */