diff --git a/MagneticField/MagFieldElements/MagFieldElements/BFieldMesh.h b/MagneticField/MagFieldElements/MagFieldElements/BFieldMesh.h
index b6dc1f34ffce2e01150893a173971af2c1929dbc..8be3f4ddb765bd6e2bf8e8e78996f31b3aebb530 100644
--- a/MagneticField/MagFieldElements/MagFieldElements/BFieldMesh.h
+++ b/MagneticField/MagFieldElements/MagFieldElements/BFieldMesh.h
@@ -39,37 +39,24 @@ public:
              double rmax,
              double phimin,
              double phimax,
-             double bscale)
-    : m_scale(bscale)
-    , m_nomScale(bscale)
-  {
-    m_min = { zmin, rmin, phimin };
-    m_max = { zmax, rmax, phimax };
-  }
+             double bscale);
   // set ranges
   void setRange(double zmin,
                 double zmax,
                 double rmin,
                 double rmax,
                 double phimin,
-                double phimax)
-  {
-    m_min = { zmin, rmin, phimin };
-    m_max = { zmax, rmax, phimax };
-  }
+                double phimax);
   // set bscale
-  void setBscale(double bscale) { m_scale = m_nomScale = bscale; }
+  void setBscale(double bscale);
   // scale bscale by a factor
-  void scaleBscale(double factor) { m_scale = factor * m_nomScale; }
+  void scaleBscale(double factor);
   // allocate space to vectors
   void reserve(int nz, int nr, int nphi, int nfield);
-  void reserve(int nz, int nr, int nphi)
-  {
-    reserve(nz, nr, nphi, nz * nr * nphi);
-  }
+  void reserve(int nz, int nr, int nphi);
   // add elements to vectors
-  void appendMesh(int i, double mesh) { m_mesh[i].push_back(mesh); }
-  void appendField(const BFieldVector<T>& field) { m_field.push_back(field); }
+  void appendMesh(int i, double mesh);
+  void appendField(const BFieldVector<T>& field);
   // build Look Up Table
   void buildLUT();
   // test if a point is inside this zone
@@ -85,25 +72,25 @@ public:
             double* ATH_RESTRICT B,
             double* ATH_RESTRICT deriv = nullptr) const;
   // accessors
-  double min(size_t i) const { return m_min[i]; }
-  double max(size_t i) const { return m_max[i]; }
-  double zmin() const { return m_min[0]; }
-  double zmax() const { return m_max[0]; }
-  double rmin() const { return m_min[1]; }
-  double rmax() const { return m_max[1]; }
-  double phimin() const { return m_min[2]; }
-  double phimax() const { return m_max[2]; }
-  unsigned nmesh(size_t i) const { return m_mesh[i].size(); }
-  double mesh(size_t i, size_t j) const { return m_mesh[i][j]; }
-  unsigned nfield() const { return m_field.size(); }
-  const BFieldVector<T>& field(size_t i) const { return m_field[i]; }
-  double bscale() const { return m_scale; }
+  double min(size_t i) const;
+  double max(size_t i) const;
+  double zmin() const;
+  double zmax() const;
+  double rmin() const;
+  double rmax() const;
+  double phimin() const;
+  double phimax() const;
+  unsigned nmesh(size_t i) const;
+  double mesh(size_t i, size_t j) const;
+  unsigned nfield() const;
+  const BFieldVector<T>& field(size_t i) const;
+  double bscale() const;
   int memSize() const;
 
 protected:
   std::array<double, 3> m_min;
   std::array<double, 3> m_max;
-  std::array<std::vector<double>,3> m_mesh;
+  std::array<std::vector<double>, 3> m_mesh;
 
 private:
   std::vector<BFieldVector<T>> m_field;
@@ -111,10 +98,9 @@ private:
   double m_nomScale; // nominal m_scale from the map
 
   // look-up table and related variables
-  std::array<std::vector<int>,3> m_LUT;
-  std::array<double,3> m_invUnit; // inverse unit size in the LUT
+  std::array<std::vector<int>, 3> m_LUT;
+  std::array<double, 3> m_invUnit; // inverse unit size in the LUT
   int m_roff, m_zoff;
-
 };
 #include "MagFieldElements/BFieldMesh.icc"
 #endif
diff --git a/MagneticField/MagFieldElements/MagFieldElements/BFieldMesh.icc b/MagneticField/MagFieldElements/MagFieldElements/BFieldMesh.icc
index b43cfc406b0513d8e4bb90dca6ede70cced3f0de..5409a576752b344f775b7f0a23272865fe461225 100644
--- a/MagneticField/MagFieldElements/MagFieldElements/BFieldMesh.icc
+++ b/MagneticField/MagFieldElements/MagFieldElements/BFieldMesh.icc
@@ -3,6 +3,51 @@
 */
 
 #include "CxxUtils/vec.h"
+// constructor
+template<class T>
+BFieldMesh<T>::BFieldMesh(double zmin,
+                          double zmax,
+                          double rmin,
+                          double rmax,
+                          double phimin,
+                          double phimax,
+                          double bscale)
+  : m_scale(bscale)
+  , m_nomScale(bscale)
+{
+  m_min = { zmin, rmin, phimin };
+  m_max = { zmax, rmax, phimax };
+}
+// set ranges
+template<class T>
+void
+BFieldMesh<T>::setRange(double zmin,
+                        double zmax,
+                        double rmin,
+                        double rmax,
+                        double phimin,
+                        double phimax)
+{
+  m_min = { zmin, rmin, phimin };
+  m_max = { zmax, rmax, phimax };
+}
+
+// set bscale
+template<class T>
+void
+BFieldMesh<T>::setBscale(double bscale)
+{
+  m_scale = m_nomScale = bscale;
+}
+
+// scale bscale by a factor
+template<class T>
+void
+BFieldMesh<T>::scaleBscale(double factor)
+{
+  m_scale = factor * m_nomScale;
+}
+
 //
 // Reserve space in the vectors to avoid unnecessary memory re-allocations.
 //
@@ -16,6 +61,77 @@ BFieldMesh<T>::reserve(int nz, int nr, int nphi, int nfield)
   m_field.reserve(nfield);
 }
 
+template<class T>
+void
+BFieldMesh<T>::reserve(int nz, int nr, int nphi)
+{
+  reserve(nz, nr, nphi, nz * nr * nphi);
+}
+
+// add elements to vectors
+template<class T>
+void
+BFieldMesh<T>::appendMesh(int i, double mesh)
+{
+  m_mesh[i].push_back(mesh);
+}
+
+template<class T>
+void
+BFieldMesh<T>::appendField(const BFieldVector<T>& field)
+{
+  m_field.push_back(field);
+}
+
+//
+// Construct the look-up table to accelerate bin-finding.
+//
+template<class T>
+void
+BFieldMesh<T>::buildLUT()
+{
+  for (int j = 0; j < 3; ++j) { // z, r, phi
+    // align the m_mesh edges to m_min/m_max
+    m_mesh[j].front() = m_min[j];
+    m_mesh[j].back() = m_max[j];
+    // determine the unit size, q, to be used in the LUTs
+    const double width = m_mesh[j].back() - m_mesh[j].front();
+    double q(width);
+    for (unsigned i = 0; i < m_mesh[j].size() - 1; ++i) {
+      q = std::min(q, m_mesh[j][i + 1] - m_mesh[j][i]);
+    }
+    // find the number of units in the LUT
+    int n = int(width / q) + 1;
+    q = width / (n + 0.5);
+    m_invUnit[j] = 1.0 / q; // new unit size
+    ++n;
+    int m = 0;                    // mesh number
+    for (int i = 0; i < n; ++i) { // LUT index
+      if (i * q + m_mesh[j].front() > m_mesh[j][m + 1]) {
+        m++;
+      }
+      m_LUT[j].push_back(m);
+    }
+  }
+  m_roff = m_mesh[2].size();          // index offset for incrementing r by 1
+  m_zoff = m_roff * m_mesh[1].size(); // index offset for incrementing z by 1
+}
+
+template<class T>
+int
+BFieldMesh<T>::memSize() const
+{
+  int size = 0;
+  size += sizeof(double) * 10;
+  size += sizeof(int) * 2;
+  for (int i = 0; i < 3; ++i) {
+    size += sizeof(double) * m_mesh[i].capacity();
+    size += sizeof(int) * m_LUT[i].capacity();
+  }
+  size += sizeof(BFieldVector<T>) * m_field.capacity();
+  return size;
+}
+
 //
 // Test if a point (z,r,phi) is inside this mesh region.
 //
@@ -244,53 +360,95 @@ BFieldMesh<T>::getB(const double* ATH_RESTRICT xyz,
     deriv[8] = dBdz[0];
   }
 }
+// accessors
+template<class T>
+double
+BFieldMesh<T>::min(size_t i) const
+{
+  return m_min[i];
+}
 
-//
-// Construct the look-up table to accelerate bin-finding.
-//
 template<class T>
-void
-BFieldMesh<T>::buildLUT()
+double
+BFieldMesh<T>::max(size_t i) const
 {
-  for (int j = 0; j < 3; ++j) { // z, r, phi
-    // align the m_mesh edges to m_min/m_max
-    m_mesh[j].front() = m_min[j];
-    m_mesh[j].back() = m_max[j];
-    // determine the unit size, q, to be used in the LUTs
-    const double width = m_mesh[j].back() - m_mesh[j].front();
-    double q(width);
-    for (unsigned i = 0; i < m_mesh[j].size() - 1; ++i) {
-      q = std::min(q, m_mesh[j][i + 1] - m_mesh[j][i]);
-    }
-    // find the number of units in the LUT
-    int n = int(width / q) + 1;
-    q = width / (n + 0.5);
-    m_invUnit[j] = 1.0 / q; // new unit size
-    ++n;
-    int m = 0;                    // mesh number
-    for (int i = 0; i < n; ++i) { // LUT index
-      if (i * q + m_mesh[j].front() > m_mesh[j][m + 1]) {
-        m++;
-      }
-      m_LUT[j].push_back(m);
-    }
-  }
-  m_roff = m_mesh[2].size();          // index offset for incrementing r by 1
-  m_zoff = m_roff * m_mesh[1].size(); // index offset for incrementing z by 1
+  return m_max[i];
 }
 
 template<class T>
-int
-BFieldMesh<T>::memSize() const
+double
+BFieldMesh<T>::zmin() const
 {
-  int size = 0;
-  size += sizeof(double) * 10;
-  size += sizeof(int) * 2;
-  for (int i = 0; i < 3; ++i) {
-    size += sizeof(double) * m_mesh[i].capacity();
-    size += sizeof(int) * m_LUT[i].capacity();
-  }
-  size += sizeof(BFieldVector<T>) * m_field.capacity();
-  return size;
+  return m_min[0];
+}
+
+template<class T>
+double
+BFieldMesh<T>::zmax() const
+{
+  return m_max[0];
+}
+
+template<class T>
+double
+BFieldMesh<T>::rmin() const
+{
+  return m_min[1];
+}
+
+template<class T>
+double
+BFieldMesh<T>::rmax() const
+{
+  return m_max[1];
+}
+
+template<class T>
+double
+BFieldMesh<T>::phimin() const
+{
+  return m_min[2];
+}
+
+template<class T>
+double
+BFieldMesh<T>::phimax() const
+{
+  return m_max[2];
+}
+
+template<class T>
+unsigned
+BFieldMesh<T>::nmesh(size_t i) const
+{
+  return m_mesh[i].size();
+}
+
+template<class T>
+double
+BFieldMesh<T>::mesh(size_t i, size_t j) const
+{
+  return m_mesh[i][j];
+}
+
+template<class T>
+unsigned
+BFieldMesh<T>::nfield() const
+{
+  return m_field.size();
+}
+
+template<class T>
+const BFieldVector<T>&
+BFieldMesh<T>::field(size_t i) const
+{
+  return m_field[i];
+}
+
+template<class T>
+double
+BFieldMesh<T>::bscale() const
+{
+  return m_scale;
 }