diff --git a/modules/img/alg/src/convolute.cc b/modules/img/alg/src/convolute.cc
index f34cf7285866cc2a20e9a95628c0da53fcf53e17..70543151bce9f741588e9253a7af00e7a60cc8b2 100644
--- a/modules/img/alg/src/convolute.cc
+++ b/modules/img/alg/src/convolute.cc
@@ -37,7 +37,7 @@ struct fnc_expl_convolute_wrap_op {
     for(ExtentIterator it1(ex1);!it1.AtEnd(); ++it1) {
       T1 val(0);
       for(ExtentIterator it2(rhs->GetExtent());!it2.AtEnd();++it2) {
-	val+=lhs->Value(ex1.WrapAround(it1-it2)) * Val2Val<T2,T1>(rhs->Value(it2));
+	val+=lhs->Value(ex1.WrapAround(Point(it1)-Point(it2))) * Val2Val<T2,T1>(rhs->Value(it2));
       }
       res->Value(it1) = val;
     }
@@ -56,7 +56,7 @@ struct fnc_expl_convolute_op {
     for(ExtentIterator it1(ex1);!it1.AtEnd(); ++it1) {
       T1 val(0);
       for(ExtentIterator it2(rhs->GetExtent());!it2.AtEnd();++it2) {
-	val+=lhs->GetCheckedValue(it1-it2) * Val2Val<T2,T1>(rhs->Value(it2));
+	val+=lhs->GetCheckedValue(Point(it1)-Point(it2)) * Val2Val<T2,T1>(rhs->Value(it2));
       }
       res->Value(it1) = val;
     }
diff --git a/modules/img/alg/src/correlate.cc b/modules/img/alg/src/correlate.cc
index 04f1b75f678f6cca629746727a7c59ce6c261b48..f9ba508480516818a296ca88d4666d9ef2f163d7 100644
--- a/modules/img/alg/src/correlate.cc
+++ b/modules/img/alg/src/correlate.cc
@@ -46,7 +46,7 @@ struct fnc_expl_correlate_wrap_op {
     for(ExtentIterator it1(ex1);!it1.AtEnd(); ++it1) {
       T1 val(0); // default ctor sets value to zero
       for(ExtentIterator it2(rhs->GetExtent());!it2.AtEnd();++it2) {
-	val+=lhs->Value(ex1.WrapAround(it1+it2)) * Val2Val<T2,T1>(Conj(rhs->Value(it2)));
+	val+=lhs->Value(ex1.WrapAround(Point(it1)+Point(it2))) * Val2Val<T2,T1>(Conj(rhs->Value(it2)));
       }
       res->Value(it1) = val;
     }
diff --git a/modules/img/base/pymod/export_point.cc b/modules/img/base/pymod/export_point.cc
index 27179b3e47d095b4571976fd61f3af63d2997d31..53047e6e8c53041591e334806f48169a3b26ab76 100644
--- a/modules/img/base/pymod/export_point.cc
+++ b/modules/img/base/pymod/export_point.cc
@@ -33,8 +33,8 @@ namespace ost { namespace img {
 
 
 int point_len(const Point& p) {return 3;}
-int point_getitem(const Point& p, int i) {return p[i];}
-void point_setitem(Point& p, int i, int v) {p[i]=v;}
+int point_getitem(const Point& p, int i) {return p.At(i);}
+void point_setitem(Point& p, int i, int v) {p.At(i)=v;}
 
 }}
 
@@ -48,6 +48,9 @@ void export_Point()
     .def(init<const Vec3&>(args("vec")))
     .def(init<const Vec4&>(args("vec")))
     .def(init<const Point&>(args("point")))
+    .def_readwrite("x", &Point::x)
+    .def_readwrite("y", &Point::y)
+    .def_readwrite("z", &Point::z)
     .def("Mirror",&Point::Mirror)
     .def("ToVec2",&Point::ToVec2)
     .def("ToVec3",&Point::ToVec3)
diff --git a/modules/img/base/src/point.cc b/modules/img/base/src/point.cc
index 3cadd17b077843974d54af42a7bce5610ccbaf52..94d1d2914b90dfff950525a5be4cae5070b69c52 100644
--- a/modules/img/base/src/point.cc
+++ b/modules/img/base/src/point.cc
@@ -21,255 +21,118 @@
 /*
   point
 
-  Author: Ansgar Philippsen
+  Authors: Ansgar Philippsen, Andreas Schenk
 */
 
 #include <ost/message.hh>
 #include <iostream>
 #include <sstream>
 
-#include <ost/img/peak.hh>
 #include "point.hh"
 #include "size.hh"
 #include "vecmat.hh"
 
 namespace ost { namespace img {
 
-Point::Point():
-  data_()
+Point::Point(const Size& size):
+  x(size[0]),
+  y(size[1]),
+  z(size[2])
 {
-  data_[0]=0;
-  data_[1]=0;
-  data_[2]=0;
-} 
-
-Point::Point(int a):
-  data_()
-{
-  data_[0]=a;
-  data_[1]=0;
-  data_[2]=0;
-} 
-
-Point::Point(int a, int b):
-  data_()
-{
-  data_[0]=a;
-  data_[1]=b;
-  data_[2]=0;
-} 
-
-Point::Point(int a, int b, int c):
-  data_()
-{
-  data_[0]=a;
-  data_[1]=b;
-  data_[2]=c;
-} 
-
-Point::Point(const Vec2& v):
-  data_()
-{
-  data_[0]=static_cast<int>(round(v[0]));
-  data_[1]=static_cast<int>(round(v[1]));
-  data_[2]=0;
-} 
-
-Point::Point(const Vec3& v):
-  data_()
-{
-  data_[0]=static_cast<int>(round(v[0]));
-  data_[1]=static_cast<int>(round(v[1]));
-  data_[2]=static_cast<int>(round(v[2]));
-} 
-
-Point::Point(const Vec4& v):
-  data_()
-{
-  if(std::abs(v[3])<1e-100) {
-    throw geom::OutOfRangeException("4th element of Vec4 is too close to zero for normalization");
-  } else {
-    Real sf = 1.0/v[3];
-    data_[0]=static_cast<int>(round(v[0]*sf));
-    data_[1]=static_cast<int>(round(v[1]*sf));
-    data_[2]=static_cast<int>(round(v[2]*sf));
-  }
-}
-
-Point::Point(const Size& s):
-  data_()
-{
-  data_[0]=s[0];
-  data_[1]=s[1];
-  data_[2]=s[2];
 }
 
-Point::Point(const Point &p):
-  data_()
-{
-  data_[0]=p.data_[0];
-  data_[1]=p.data_[1];
-  data_[2]=p.data_[2];
-} 
-
 Point Point::Mirror(int planes)
 {
-  return Point(planes & Plane::YZ ? -data_[0] : data_[0],
-               planes & Plane::XZ ? -data_[1] : data_[1],
-               planes & Plane::XY ? -data_[2] : data_[2]);
-}
-
-
-bool Point::equal(const Point &p) const 
-{
-  return  (data_[0]==p.data_[0] && 
-           data_[1]==p.data_[1] && 
-           data_[2]==p.data_[2]);
-};
-
-bool Point::less(const Point &p) const 
-{
-  return ( data_[2]!=p.data_[2] ? data_[2]<p.data_[2] : (data_[1]!=p.data_[1] ?  data_[1]<p.data_[1] : data_[0]<p.data_[0]) ); 
-}
-
-Point Point::absolute() const 
-{
-  return Point(std::abs(data_[0]),std::abs(data_[1]),std::abs(data_[2]));
+  return Point(planes & Plane::YZ ? -x : x,
+               planes & Plane::XZ ? -y : y,
+               planes & Plane::XY ? -z : z);
 }
 
 Point& Point::operator+=(const Point& p) 
 {
-  data_[0]+=p.data_[0];   
-  data_[1]+=p.data_[1];
-  data_[2]+=p.data_[2];
+  x+=p.x;   
+  y+=p.y;
+  z+=p.z;
   return *this;
 }
 
 Point& Point::operator-=(const Point& p) 
 {
-  data_[0]-=p.data_[0];   
-  data_[1]-=p.data_[1];
-  data_[2]-=p.data_[2];
+  x-=p.x;   
+  y-=p.y;
+  z-=p.z;
   return *this;
 }
 
 Point Point::operator-() const 
 {
-  return Point(-data_[0],-data_[1],-data_[2]);
+  return Point(-x,-y,-z);
 }
 
 Point& Point::operator=(const Point& p) 
 {
-  data_[0]=p.data_[0];
-  data_[1]=p.data_[1];
-  data_[2]=p.data_[2];
+  x=p.x;
+  y=p.y;
+  z=p.z;
   return *this;
 }
 
 
 bool Point::operator==(const Point &p) const 
 {
-  return equal(p);
-}
-
-bool Point::operator!=(const Point &p) const
-{
-  return !equal(p);
+  return  (x==p.x && 
+           y==p.y && 
+           z==p.z);
 }
 
 bool Point::operator<(const Point &p) const 
 {
-  return less(p);
+  return ( z!=p.z ? z<p.z : (y!=p.y ?  y<p.y : x<p.x) ); 
 }
 
-bool Point::operator<=(const Point &p) const 
-{
-  return (equal(p) || less(p));
-}
-
-bool Point::operator>(const Point &p) const
-{
-  return p.less((*this));
-}
-
-bool Point::operator>=(const Point &p) const 
-{
-  return (equal(p) || p.less((*this)));
-}
 
 Point& Point::operator+=(const Size& s) 
 {
-  data_[0]+=s[0];   
-  data_[1]+=s[1];
-  data_[2]+=s[2];
+  x+=s[0];   
+  y+=s[1];
+  z+=s[2];
   return *this;
 }
 
 Point& Point::operator-=(const Size& s) 
 {
-  data_[0]-=s[0];   
-  data_[1]-=s[1];
-  data_[2]-=s[2];
+  x-=s[0];   
+  y-=s[1];
+  z-=s[2];
   return *this;
 }
 
 Vec2 Point::ToVec2() const 
 {
-  Vec2 nrvo(static_cast<Real>(data_[0]),
-            static_cast<Real>(data_[1]));
+  Vec2 nrvo(static_cast<Real>(x),
+            static_cast<Real>(y));
   return nrvo;
 }
 
 Vec3 Point::ToVec3() const 
 {
-  Vec3 nrvo(static_cast<Real>(data_[0]),
-      static_cast<Real>(data_[1]),
-      static_cast<Real>(data_[2]));
+  Vec3 nrvo(static_cast<Real>(x),
+      static_cast<Real>(y),
+      static_cast<Real>(z));
   return nrvo;
 }
 
 Vec4 Point::ToVec4() const 
 {
-  Vec4 nrvo(static_cast<Real>(data_[0]),
-      static_cast<Real>(data_[1]),
-      static_cast<Real>(data_[2]),
+  Vec4 nrvo(static_cast<Real>(x),
+      static_cast<Real>(y),
+      static_cast<Real>(z),
       1.0);
   return nrvo;
 }
 
-int& Point::operator[](unsigned int index) 
-{
-  if(index>2) throw std::range_error("Point index out of range");
-  return data_[index];
-}
-
-int Point::operator[](unsigned int index) const 
-{
-  if(index>2) throw geom::OutOfRangeException("Point index out of range");
-  return data_[index];
-}
-
 // global funcs
 
-Point operator+(const Point& p1, const Point& p2) 
-{
-  Point r(p1);
-  r+=(p2);
-  return r;
-}
-
-Point operator-(const Point& p1, const Point& p2) {
-  Point r(p1);
-  r-=(p2);
-  return r;
-}
-
-
-
-Point absolute(const Point& p) {
-  return p.absolute();
-}
-
 std::ostream& operator<<(std::ostream& os, const Point &p) 
 {
   os << "(" << p[0] << "," << p[1] << "," << p[2] << ")";
diff --git a/modules/img/base/src/point.hh b/modules/img/base/src/point.hh
index bc2a161e89461c473067fd821d4dae70b090bafb..4e96786308e0875f4157a0a580d88787afc9485c 100644
--- a/modules/img/base/src/point.hh
+++ b/modules/img/base/src/point.hh
@@ -21,11 +21,7 @@
 /*
   integer triplet based point
 
-  Author: Ansgar Philippsen
-*/
-
-/*
-  TODO: use boost operator
+  Authors: Ansgar Philippsen, Andreas Schenk
 */
 
 #ifndef IMG_POINT_H
@@ -33,6 +29,7 @@
 
 #include <vector>
 #include <iosfwd>
+#include <boost/operators.hpp>
 
 #include <ost/img/module_config.hh>
 #include "vecmat.hh"
@@ -43,36 +40,117 @@ namespace ost { namespace img {
 class Size;
 
 //! class encapsulating 1D to 3D point
-class DLLEXPORT_OST_IMG_BASE Point {
+class DLLEXPORT_OST_IMG_BASE Point: boost::additive<Point,
+                                    boost::additive2<Point, Size,
+                                    boost::multipliable2<Point,int,
+                                    boost::less_than_comparable<Point,
+                                    boost::equality_comparable<Point> > > > >{
 public:
-  Point();
-  Point(const Point &p);
+  Point():
+    x(),
+    y(),
+    z()
+  {
+  }
+  
+  Point(const Point &p):
+    x(p.x),
+    y(p.y),
+    z(p.z)
+  {
+  } 
+
 
   //! 1D int constructor
-  explicit Point(int a);
+  Point(int a):
+    x(a),
+    y(),
+    z()
+  {
+  } 
+
   //! 2D int constructor
-  Point(int a, int b);
+  Point(int a, int b):
+    x(a),
+    y(b),
+    z()
+  {
+  } 
+
   //! 3D int constructor
-  Point(int a, int b, int c);
+  Point(int a, int b, int c):
+    x(a),
+    y(b),
+    z(c)
+  {
+  }
+  
   //! conversion from Vec2
-  explicit Point(const Vec2& v);
+  Point(const Vec2& v):
+    x(static_cast<int>(round(v[0]))),
+    y(static_cast<int>(round(v[1]))),
+    z()
+  {
+  } 
+
 
   //! conversion from Vec3
-  explicit Point(const Vec3& v);
+  Point(const Vec3& v):
+    x(static_cast<int>(round(v[0]))),
+    y(static_cast<int>(round(v[1]))),
+    z(static_cast<int>(round(v[2])))
+  {
+  } 
+
 
   //! conversion from Vec4 (normalization)
-  explicit Point(const Vec4& v);
+  explicit Point(const Vec4& v):
+    x(static_cast<int>(round(v[0]))),
+    y(static_cast<int>(round(v[1]))),
+    z(static_cast<int>(round(v[2])))
+  {
+    if(std::abs(v[3])<1e-100) {
+      throw geom::OutOfRangeException("4th element of Vec4 is too close to zero for normalization");
+    } else {
+      Real sf = 1.0/v[3];
+      x*=sf;
+      y*=sf;
+      z*=sf;
+    }
+  }
 
   //! (implicit) conversion of size to point
-  Point(const Size& s);
+  Point(const Size& size);
 
   //! return mirror point according to planes
   Point Mirror(int planes);
 
   // operators
-  int operator[](unsigned int index) const;
+  int& operator[](unsigned int index) 
+  {
+    assert(index<=2);
+    return (&x)[index];
+  }
+  
+  int operator[](unsigned int index) const 
+  {
+    assert(index<=2);
+    return (&x)[index];
+  }
+  // operators
+
+  int& At(unsigned int index) 
+  {
+    if(index>2) throw std::range_error("Point index out of range");
+    return (&x)[index];
+  }
+  
+  int At(unsigned int index) const 
+  {
+    if(index>2) throw geom::OutOfRangeException("Point index out of range");
+    return (&x)[index];
+  }
 
-  int& operator[](unsigned int index);
 
   Point& operator=(const Point& p);
 
@@ -82,49 +160,24 @@ public:
 
   Point operator-() const;
 
-  bool operator==(const Point &p) const;
-
-  bool operator!=(const Point &p) const;
-
-  bool operator<(const Point &p) const;
-
-  bool operator<=(const Point &p) const;
-
-  bool operator>(const Point &p) const;
-
-  bool operator>=(const Point &p) const;
-
   Point& operator+=(const Size& p);
 
   Point& operator-=(const Size& p);
 
+  bool operator==(const Point &p) const;
+
+  bool operator<(const Point &p) const;
+
   // conversion to vectors
   Vec2 ToVec2() const;
   Vec3 ToVec3() const;
   Vec4 ToVec4() const;
 
-private:
-  int data_[3];
-
-  bool equal(const Point &p) const;
-  bool less(const Point &p) const;
-  Point neg() const;
-
-  friend Point absolute(const Point&);
-
-  Point absolute() const;
+  int x;
+  int y;
+  int z;
 };
 
-DLLEXPORT_OST_IMG_BASE Point operator+(const Point& p1, const Point& p2);
-DLLEXPORT_OST_IMG_BASE Point operator-(const Point& p1, const Point& p2);
-
-  /*
-Point operator+(const Point& p, const Size& s);
-Point operator+(const Size& s, const Point& p);
-
-Point operator-(const Point& p, const Size& s);
-Point operator-(const Size& s, const Point& p);
-  */
 
 DLLEXPORT_OST_IMG_BASE std::ostream& operator<<(std::ostream& os, const Point &p);