diff --git a/modules/img/base/src/extent.cc b/modules/img/base/src/extent.cc
index fda62d29ed675e6582e691b1bb08baab632fbc54..492c4ccb0f69bcc7281983581253f0a9d86cc0b7 100644
--- a/modules/img/base/src/extent.cc
+++ b/modules/img/base/src/extent.cc
@@ -33,26 +33,37 @@
 
 namespace ost { namespace img {
 
-Extent::Extent() {set(Point(),Point());}
+Extent::Extent():
+  start_(),
+  end_()
+{}
 
-Extent::Extent(const Extent &r) {set(r.start_,r.end_);}
+Extent::Extent(const Extent &r):
+  start_(r.start_),
+  end_(r.end_)
+{}
 
-Extent::Extent(const Point& p1, const Point& p2) {set(p1,p2);}
+Extent::Extent(const Point& p1, const Point& p2):
+  start_(std::min(p1[0],p2[0]),std::min(p1[1],p2[1]),std::min(p1[2],p2[2])),
+  end_(std::max(p1[0],p2[0]),std::max(p1[1],p2[1]),std::max(p1[2],p2[2]))
+{}
 
-Extent::Extent(const Size& size)
+Extent::Extent(const Size& size):
+  start_(),
+  end_(size - Point(1,1,1))
 {
-  set(Point(0,0,0), size - Point(1,1,1));
 }
 
-Extent::Extent(const Size& size, const Point& cen)
+Extent::Extent(const Size& size, const Point& cen):
+  start_(-size.GetHalf() + cen),
+  end_(size + start_ - Point(1,1,1))
 {
-  Point st = -size.GetHalf() + cen;
-  set(st, size + st - Point(1,1,1));
 }
 
-Extent::Extent(const Point& start, const Size& size)
+Extent::Extent(const Point& start, const Size& size):
+  start_(start),
+  end_(size + start_ - Point(1,1,1))
 {
-  set(start, size + start - Point(1,1,1));
 }
 
 const Point& Extent::GetStart() const {return start_;}
@@ -72,8 +83,8 @@ const Point& Extent::GetEnd() const {return end_;}
 bool Extent::Contains(const Point& p) const
 {
   return (p[0]>=start_[0] && p[0]<=end_[0] &&
-	  p[1]>=start_[1] && p[1]<=end_[1] &&
-	  p[2]>=start_[2] && p[2]<=end_[2]);
+          p[1]>=start_[1] && p[1]<=end_[1] &&
+          p[2]>=start_[2] && p[2]<=end_[2]);
 }
 
 bool Extent::Contains(const Extent& e) const
@@ -83,27 +94,28 @@ bool Extent::Contains(const Extent& e) const
 
 Point Extent::GetCenter() const 
 {
-  return size_.GetHalf()+start_;
+  return Size(start_,end_).GetHalf()+start_;
 }
 
-const Size& Extent::GetSize() const {return size_;}
+Size Extent::GetSize() const {return Size(start_,end_);}
 
-int Extent::GetWidth() const {return size_.GetWidth();}
+int Extent::GetWidth() const {return end_[0]-start_[0]+1;}
 
-int Extent::GetHeight() const {return size_.GetHeight();}
+int Extent::GetHeight() const {return end_[1]-start_[1]+1;}
 
-int Extent::GetDepth() const {return size_.GetDepth();}
+int Extent::GetDepth() const {return end_[2]-start_[2]+1;}
 
-int Extent::GetVolume() const {return size_.GetVolume();}
+int Extent::GetVolume() const {return Size(start_,end_).GetVolume();}
 
-int Extent::GetDim() const {return dim_;}
+int Extent::GetDim() const {return Size(start_,end_).GetDim();}
 
 
 Point Extent::WrapAround(const Point& p)
 {
   Point r(p-start_);
+  Size size=GetSize();
   for(int i=0;i<3;i++) {
-    r[i] = start_[i] + (r[i]<0 ? size_[i]+std::div(r[i],size_[i]).rem : std::div(r[i],size_[i]).rem);
+    r[i] = start_[i] + (r[i]<0 ? size[i]+std::div(r[i],size[i]).rem : std::div(r[i],size[i]).rem);
   }
   return r;
 }
@@ -112,16 +124,16 @@ Point Extent::WrapAround(const Point& p)
 Extent Extent::Mirror(int planes)
 {
   Point new_start(planes & Plane::YZ ? -end_[0] : start_[0],
-		  planes & Plane::XZ ? -end_[1] : start_[1],
-		  planes & Plane::XY ? -end_[2] : start_[2]);
-  return Extent(new_start,size_);
+                  planes & Plane::XZ ? -end_[1] : start_[1],
+                  planes & Plane::XY ? -end_[2] : start_[2]);
+  return Extent(new_start,GetSize());
 }
 
 unsigned int Extent::Point2Offset(const Point& p)
 {
   if(this->Contains(p)) {
     Point d(p-start_);
-    return d[0]+size_[0]*(d[1]+d[2]*size_[1]);
+    return d[0]+GetWidth()*(d[1]+d[2]*GetHeight());
   } else {
     return 0;
   }
@@ -146,8 +158,6 @@ void Extent::set(const Point& p1, const Point& p2)
       end_[i]=p1[i];
     }
   }
-  size_ = Size(start_,end_);
-  dim_ = size_.GetDim();
 }
 
 bool Extent::equal(const Extent& b) const 
diff --git a/modules/img/base/src/extent.hh b/modules/img/base/src/extent.hh
index aab21e27b086a3f517ecc030fe014def5af826ae..7d6d0afad475ec3fa9729d8ec372f75de5727a32 100644
--- a/modules/img/base/src/extent.hh
+++ b/modules/img/base/src/extent.hh
@@ -110,7 +110,7 @@ class DLLEXPORT_OST_IMG_BASE Extent {
   Point GetCenter() const;
 
   //! Return size of extent
-  const Size& GetSize() const;
+  Size GetSize() const;
   int GetWidth() const;
   int GetHeight() const;
   int GetDepth() const;
@@ -140,8 +140,6 @@ class DLLEXPORT_OST_IMG_BASE Extent {
 
  private:
   Point start_,end_;
-  Size size_;
-  int dim_;
 
   void set(const Point& p1, const Point& p2);
   bool equal(const Extent& b) const;
diff --git a/modules/img/base/src/image_state/image_state_impl.cc b/modules/img/base/src/image_state/image_state_impl.cc
index 2575a1adb3ffe4493461bc68fe798127dba55449..352d710f6d35ccf4a2c1a2ae3231c8031067eea6 100644
--- a/modules/img/base/src/image_state/image_state_impl.cc
+++ b/modules/img/base/src/image_state/image_state_impl.cc
@@ -311,19 +311,6 @@ void ImageStateImpl<T,D>::AdjustPhaseOrigin(const Point& p)
 }
 
 
-template <typename T, class D>
-T& ImageStateImpl<T,D>::Value(const Point& p)
-{
-  assert(domain_.GetExtent().Contains(p));
-  return data_.Value(domain_.Point2Index(p));
-}
-
-template <typename T, class D>
-const T& ImageStateImpl<T,D>::Value(const Point& p) const
-{
-  assert(domain_.GetExtent().Contains(p));
-  return data_.Value(domain_.Point2Index(p));
-}
 
 template <typename T, class D>
 T ImageStateImpl<T,D>::GetCheckedValue(const Point& p) const
diff --git a/modules/img/base/src/image_state/image_state_impl.hh b/modules/img/base/src/image_state/image_state_impl.hh
index e3a70ae93ca6b402b4d708189b97742d51855207..0f8dad75bd378675423715c293d7dcdac4378949 100644
--- a/modules/img/base/src/image_state/image_state_impl.hh
+++ b/modules/img/base/src/image_state/image_state_impl.hh
@@ -142,10 +142,18 @@ public:
     retrieve actual value. No boundary check is performed
     here, this is the responsibility of the caller!
   */
-  T& Value(const Point& p);
+  T& Value(const Point& p)
+  {
+    assert(domain_.GetExtent().Contains(p));
+    return data_.Value(domain_.Point2Index(p));
+  }
 
   // retrieve ro value at specified point
-  const T& Value(const Point& p) const;
+  const T& Value(const Point& p) const
+  {
+    assert(domain_.GetExtent().Contains(p));
+    return data_.Value(domain_.Point2Index(p));
+  }
 
   //! retrieve boundary checked value
   T GetCheckedValue(const Point& p) const;
diff --git a/modules/img/base/src/image_state/image_state_spatial_domain.hh b/modules/img/base/src/image_state/image_state_spatial_domain.hh
index 432008e194c3e9bf045bcab2e3fcef5043ceac4a..a8b22ff5e3905faf3ddd67deff511694f9ce914b 100644
--- a/modules/img/base/src/image_state/image_state_spatial_domain.hh
+++ b/modules/img/base/src/image_state/image_state_spatial_domain.hh
@@ -108,9 +108,10 @@ public:
   }
 
   Index Point2Index(const Point& p) const {
-    return Index(p[0]-extent_.GetStart()[0],
-                 p[1]-extent_.GetStart()[1],
-                 p[2]-extent_.GetStart()[2]);
+    Point start=extent_.GetStart();
+    return Index(p[0]-start[0],
+                 p[1]-start[1],
+                 p[2]-start[2]);
   }
   
 private:
diff --git a/modules/img/base/src/image_state/index.cc b/modules/img/base/src/image_state/index.cc
index b0d27c1381bcdfa7cc531c0b036442dfcec24c3e..27974200e4671e3c5f5b0ff11b80ebd176ad26b8 100644
--- a/modules/img/base/src/image_state/index.cc
+++ b/modules/img/base/src/image_state/index.cc
@@ -31,9 +31,6 @@ namespace ost { namespace img { namespace image_state {
 
 // Index
 
-Index::Index(unsigned int uu,unsigned int vv, unsigned int ww):
-  u(uu),v(vv),w(ww)
-{}
 
 bool Index::equal(const Index& i) const {
   return u==i.u && v==i.v && w==i.w;
diff --git a/modules/img/base/src/image_state/index.hh b/modules/img/base/src/image_state/index.hh
index a3631d67e9bd88042a56e3e566cb57d39b705eee..8f7e8c6ee62acd1d219613036fd8668a8930c6d1 100644
--- a/modules/img/base/src/image_state/index.hh
+++ b/modules/img/base/src/image_state/index.hh
@@ -39,7 +39,9 @@ namespace ost { namespace img { namespace image_state {
   provides a compact mean to adress values in a ValueHolder
 */
 struct DLLEXPORT_OST_IMG_BASE Index {
-  Index(unsigned int uu,unsigned int vv, unsigned int ww);
+  Index(unsigned int uu,unsigned int vv, unsigned int ww):
+    u(uu),v(vv),w(ww)
+  {}
 
   bool equal(const Index& i) const;
 
diff --git a/modules/img/base/src/image_state/value_holder.cc b/modules/img/base/src/image_state/value_holder.cc
index b17acccbc93758dfaca5b0fda583e2f8569b0953..1eaf3c77a1b7f7eba18343eeeada4206d4537e54 100644
--- a/modules/img/base/src/image_state/value_holder.cc
+++ b/modules/img/base/src/image_state/value_holder.cc
@@ -35,7 +35,6 @@
 #include <ost/img/size.hh>
 
 #include "value_holder.hh"
-#include "index.hh"
 
 namespace ost { namespace img { namespace image_state {
 
@@ -151,29 +150,6 @@ void ValueHolder<V>::Swap(ValueHolder& vh)
 }
 
 
-template <typename V>
-V& ValueHolder<V>::Value(const Index& i)
-{
-#ifdef USE_ROW_ORDER
-  assert(i.w<depth_);
-  return data_[i.u*height_depth_ + i.v*depth_ +i.w];
-#else
-  assert(i.v<height_);
-  return data_[i.w*width_height_ + i.v*height_ +i.u];
-#endif
-}
-
-template <typename V>
-const V& ValueHolder<V>::Value(const Index& i) const
-{
-#ifdef USE_ROW_ORDER
-  assert(i.w<depth_);
-  return data_[i.u*height_depth_ + i.v*depth_ +i.w];
-#else
-  assert(i.v<height_);
-  return data_[i.w*width_height_ + i.v*height_ +i.u];
-#endif
-}
 
 
 template <typename V>
diff --git a/modules/img/base/src/image_state/value_holder.hh b/modules/img/base/src/image_state/value_holder.hh
index cb154c2e16f968b40141aa511d00e9a9b9bdf226..05f9cb384313df8ac39e765472643e1d869f5e8a 100644
--- a/modules/img/base/src/image_state/value_holder.hh
+++ b/modules/img/base/src/image_state/value_holder.hh
@@ -32,6 +32,7 @@
 #include <ost/img/data_types.hh>
 #include <ost/img/size.hh>
 
+#include "index.hh"
 #include "type_fw.hh"
 
 namespace value_holder_test {
@@ -104,14 +105,32 @@ public:
     The lookup is based on an integer triplet encapsulated within
     Index.
   */
-  V& Value(const Index& i);
+  V& Value(const Index& i)
+  {
+  #ifdef USE_ROW_ORDER
+    assert(i.w<depth_);
+    return data_[i.u*height_depth_ + i.v*depth_ +i.w];
+  #else
+    assert(i.v<height_);
+    return data_[i.w*width_height_ + i.v*height_ +i.u];
+  #endif
+  }
 
   //! return direct ro access to the value without boundary check
   /*!
     The lookup is based on an integer triplet encapsulated within
     Index.
   */
-  const V& Value(const Index& i) const;
+  const V& Value(const Index& i) const
+  {
+  #ifdef USE_ROW_ORDER
+    assert(i.w<depth_);
+    return data_[i.u*height_depth_ + i.v*depth_ +i.w];
+  #else
+    assert(i.v<height_);
+    return data_[i.w*width_height_ + i.v*height_ +i.u];
+  #endif
+  }
 
   //! return pointer to raw data
   VPtr GetData() {return &data_[0];}