diff --git a/splinterpolator.h b/splinterpolator.h
index cc242516f2b0968fe50ef86ecd04681def747b9e..a0fedc5fe09f56655b4c5d80038531a39e23728b 100644
--- a/splinterpolator.h
+++ b/splinterpolator.h
@@ -56,12 +56,14 @@ public:
     std::vector<ExtrapolationType>   ett(dim.size(),et);
     common_construction(data,dim,order,prec,ett,copy_low_order);
   }
+  // Copy construction. May be removed in future
+  Splinterpolator(const Splinterpolator<T>& src) : _valid(false), _own_coef(false), _coef(0), _cptr(0), _ndim(0) { assign(src); }
 
   // Destructor
-  virtual ~Splinterpolator() { if(_own_coef) delete [] _coef; }
+  ~Splinterpolator() { if(_own_coef) delete [] _coef; }
 
   // Assignment. May be removed in future
-  Splinterpolator& operator=(const Splinterpolator& s);
+  Splinterpolator& operator=(const Splinterpolator& src) { if(_own_coef) delete [] _coef; assign(src); return(*this); }
 
   // Set new data in Splinterpolator.
   void Set(const T *data, const std::vector<unsigned int>& dim, const std::vector<ExtrapolationType>& et, unsigned int order=3, bool copy_low_order=true, double prec=1e-8)
@@ -69,7 +71,7 @@ public:
     if (_own_coef) delete [] _coef;
     common_construction(data,dim,order,prec,et,copy_low_order);
   }
-  virtual void Set(const T *data, const std::vector<unsigned int>& dim, ExtrapolationType et, unsigned int order=3, bool copy_low_order=true, double prec=1e-8)
+  void Set(const T *data, const std::vector<unsigned int>& dim, ExtrapolationType et, unsigned int order=3, bool copy_low_order=true, double prec=1e-8)
   {
     std::vector<ExtrapolationType>  vet(dim.size(),Zeros);
     Set(data,dim,vet,order,copy_low_order,prec);
@@ -105,6 +107,7 @@ public:
   // Remaining functions are mainly for debugging/diagnostics.
   //
   unsigned int NDim() const { return(_ndim); }
+  unsigned int Order() const { return(_order); }
   const std::vector<unsigned int>& Size() const { return(_dim); }
   unsigned int Size(unsigned int dim) const { if (dim > 4) return(0); else return(_dim[dim]);}
   T Coef(unsigned int x, unsigned int y=0, unsigned int z=0) const
@@ -177,6 +180,7 @@ private:
   // Private helper-functions
   //
   void common_construction(const T *data, const std::vector<unsigned int>& dim, unsigned int order, double prec, const std::vector<ExtrapolationType>& et, bool copy);
+  void assign(const Splinterpolator<T>& src);
   bool calc_coef(const T *data, bool copy);
   void deconv_along(unsigned int dim);
   T coef(int *indx) const;
@@ -203,7 +207,7 @@ private:
   //
   // Disallowed member functions
   //
-  Splinterpolator(const Splinterpolator& s);             // Don't allow copy-construction
+  // Splinterpolator(const Splinterpolator& s);             // Don't allow copy-construction
   // Splinterpolator& operator=(const Splinterpolator& s);  // Don't allow assignment
 };
 
@@ -213,29 +217,6 @@ private:
 //
 /////////////////////////////////////////////////////////////////////
 
-template<class T>
-Splinterpolator<T>& Splinterpolator<T>::operator=(const Splinterpolator<T>& src)
-{
-  if (_own_coef) delete [] _coef; 
-
-  _valid = src._valid;
-  _own_coef = src._own_coef;
-  _cptr = src._cptr;
-  _order = src._order;
-  _ndim = src._ndim;
-  _prec = src._prec;
-  _dim = src._dim;
-  _et = src._et;
-  
-  if (_own_coef) { // If we need to do a deep copy
-    unsigned int ts = 1;
-    for (unsigned int i=0; i<_ndim; i++) ts *= _dim[i];
-    _coef = new T[ts];
-    memcpy(_coef,src._coef,ts*sizeof(T));
-  }
-  return(*this); 
-}
-
 /////////////////////////////////////////////////////////////////////
 //
 // Returns interpolated value at location coord.
@@ -1000,6 +981,33 @@ void Splinterpolator<T>::common_construction(const T *data, const std::vector<un
   _valid = true;
 }
 
+/////////////////////////////////////////////////////////////////////
+//
+// Takes care of the "common" tasks when copy-constructing
+// and when assigning.
+//
+/////////////////////////////////////////////////////////////////////
+
+template<class T>
+void Splinterpolator<T>::assign(const Splinterpolator<T>& src)
+{
+  _valid = src._valid;
+  _own_coef = src._own_coef;
+  _cptr = src._cptr;
+  _order = src._order;
+  _ndim = src._ndim;
+  _prec = src._prec;
+  _dim = src._dim;
+  _et = src._et;
+  
+  if (_own_coef) { // If we need to do a deep copy
+    unsigned int ts = 1;
+    for (unsigned int i=0; i<_ndim; i++) ts *= _dim[i];
+    _coef = new T[ts];
+    memcpy(_coef,src._coef,ts*sizeof(T));
+  }
+}
+
 /////////////////////////////////////////////////////////////////////
 //
 // Performs deconvolution, converting signal to spline coefficients.