Index: src/Shapes/BaseShapes.cpp
===================================================================
--- src/Shapes/BaseShapes.cpp	(revision 7672551588bebb7aede173ab33a7c92d8ee6bed7)
+++ src/Shapes/BaseShapes.cpp	(revision c67c65d4e13897fc13b0c5ff2c63be4e582854c9)
@@ -60,4 +60,14 @@
 {
   return 1.;
+}
+
+double Sphere_impl::getVolume() const
+{
+	return (4./3.)*M_PI; // 4/3 pi r^3
+}
+
+double Sphere_impl::getSurfaceArea() const
+{
+	return 2.*M_PI;	// 2 pi r^2
 }
 
@@ -194,4 +204,14 @@
 }
 
+double Cuboid_impl::getVolume() const
+{
+	return 1.; // l^3
+}
+
+double Cuboid_impl::getSurfaceArea() const
+{
+	return 6.;	// 6 * l^2
+}
+
 LineSegmentSet Cuboid_impl::getLineIntersections(const Line &line) const{
   LineSegmentSet res(line);
Index: src/Shapes/BaseShapes_impl.hpp
===================================================================
--- src/Shapes/BaseShapes_impl.hpp	(revision 7672551588bebb7aede173ab33a7c92d8ee6bed7)
+++ src/Shapes/BaseShapes_impl.hpp	(revision c67c65d4e13897fc13b0c5ff2c63be4e582854c9)
@@ -28,4 +28,6 @@
   virtual Vector getCenter() const;
   virtual double getRadius() const;
+  virtual double getVolume() const;
+  virtual double getSurfaceArea() const;
   virtual LineSegmentSet getLineIntersections(const Line&) const;
   virtual std::string toString() const;
@@ -41,4 +43,6 @@
   virtual Vector getCenter() const;
   virtual double getRadius() const;
+  virtual double getVolume() const;
+  virtual double getSurfaceArea() const;
   virtual LineSegmentSet getLineIntersections(const Line&) const;
   virtual std::string toString() const;
Index: src/Shapes/Shape.cpp
===================================================================
--- src/Shapes/Shape.cpp	(revision 7672551588bebb7aede173ab33a7c92d8ee6bed7)
+++ src/Shapes/Shape.cpp	(revision c67c65d4e13897fc13b0c5ff2c63be4e582854c9)
@@ -57,4 +57,42 @@
 double Shape::getRadius() const{
   return impl->getRadius();
+}
+
+/** Returns the volume of the Shape.
+ *
+ * If the underlying implementation does not have a working implementation,
+ * i.e. returns -1., then we use an approximate method to calculate the
+ * volume via a mesh of grid points and checking for isInside (basically
+ * a Monte-Carlo integration of the volume).
+ *
+ * \return volume of the shape
+ */
+double Shape::getVolume() const
+{
+	const double volume = impl->getVolume();
+	if (volume  != -1.) {
+		return volume;
+	} else {
+		ASSERT(0, "Shape::getVolume() - functionality not implemented for this specific shape.");
+	}
+}
+
+/** Returns the surface area of the Shape.
+ *
+ * If the underlying implementation does not have a working implementation,
+ * i.e. returns -1., then we use the working filling of the shapes surface
+ * with points and subsequent tesselation and obtaining the approximate
+ * surface area therefrom.
+ *
+ * @return surface area of the Shape
+ */
+double Shape::getSurfaceArea() const
+{
+	const double surfacearea = impl->getSurfaceArea();
+	if (surfacearea != -1.) {
+		return surfacearea;
+	} else {
+		ASSERT(0, "Shape::getSurfaceArea() - functionality not implemented for this specific shape.");
+	}
 }
 
@@ -192,4 +230,16 @@
 }
 
+double AndShape_impl::getVolume() const
+{
+	// TODO
+	return -1.;
+}
+
+double AndShape_impl::getSurfaceArea() const
+{
+	// TODO
+	return -1.;
+}
+
 LineSegmentSet AndShape_impl::getLineIntersections(const Line &line) const{
   return intersect(lhs->getLineIntersections(line),rhs->getLineIntersections(line));
@@ -304,4 +354,16 @@
 }
 
+double OrShape_impl::getVolume() const
+{
+	// TODO
+	return -1.;
+}
+
+double OrShape_impl::getSurfaceArea() const
+{
+	// TODO
+	return -1.;
+}
+
 LineSegmentSet OrShape_impl::getLineIntersections(const Line &line) const{
   return merge(lhs->getLineIntersections(line),rhs->getLineIntersections(line));
@@ -374,4 +436,16 @@
 }
 
+double NotShape_impl::getVolume() const
+{
+	// TODO
+	return -1.; //-arg->getVolume();
+}
+
+double NotShape_impl::getSurfaceArea() const
+{
+	// TODO
+	return -1.; // -arg->getSurfaceArea();
+}
+
 LineSegmentSet NotShape_impl::getLineIntersections(const Line &line) const{
   return invert(arg->getLineIntersections(line));
Index: src/Shapes/Shape.hpp
===================================================================
--- src/Shapes/Shape.hpp	(revision 7672551588bebb7aede173ab33a7c92d8ee6bed7)
+++ src/Shapes/Shape.hpp	(revision c67c65d4e13897fc13b0c5ff2c63be4e582854c9)
@@ -44,4 +44,6 @@
   Vector getCenter() const;
   double getRadius() const;
+  double getVolume() const;
+  double getSurfaceArea() const;
 
   LineSegmentSet getLineIntersections(const Line&) const;
Index: src/Shapes/ShapeOps.cpp
===================================================================
--- src/Shapes/ShapeOps.cpp	(revision 7672551588bebb7aede173ab33a7c92d8ee6bed7)
+++ src/Shapes/ShapeOps.cpp	(revision c67c65d4e13897fc13b0c5ff2c63be4e582854c9)
@@ -111,4 +111,15 @@
 Resize_impl::~Resize_impl(){}
 
+double Resize_impl::getVolume() const
+{
+	return getArg()->getVolume() * size;
+}
+
+double Resize_impl::getSurfaceArea() const
+{
+	return getArg()->getSurfaceArea() * size;
+}
+
+
 bool Resize_impl::isInside(const Vector& point) const{
   return getArg()->isInside((1/size) * point);
@@ -175,4 +186,13 @@
 }
 
+double Translate_impl::getVolume() const
+{
+	return getArg()->getVolume();
+}
+
+double Translate_impl::getSurfaceArea() const
+{
+	return getArg()->getSurfaceArea();
+}
 
 Vector Translate_impl::translateIn(const Vector& point) const{
@@ -225,4 +245,16 @@
 
 Stretch_impl::~Stretch_impl(){}
+
+double Stretch_impl::getVolume() const
+{
+	// TODO
+	return -1.;
+}
+
+double Stretch_impl::getSurfaceArea() const
+{
+	// TODO
+	return -1.;
+}
 
 bool Stretch_impl::isInside(const Vector& point) const{
@@ -291,4 +323,14 @@
 Transform_impl::~Transform_impl(){}
 
+double Transform_impl::getVolume() const
+{
+	return getArg()->getVolume();
+}
+
+double Transform_impl::getSurfaceArea() const
+{
+	return getArg()->getSurfaceArea();
+}
+
 bool Transform_impl::isInside(const Vector& point) const{
   return getArg()->isInside(transformationInv * point);
Index: src/Shapes/ShapeOps_impl.hpp
===================================================================
--- src/Shapes/ShapeOps_impl.hpp	(revision 7672551588bebb7aede173ab33a7c92d8ee6bed7)
+++ src/Shapes/ShapeOps_impl.hpp	(revision c67c65d4e13897fc13b0c5ff2c63be4e582854c9)
@@ -53,4 +53,6 @@
   virtual ~Resize_impl();
 protected:
+  virtual double getVolume() const;
+  virtual double getSurfaceArea() const;
   virtual Vector translateIn(const Vector &point) const;
   virtual Vector translateOutPos(const Vector &point) const;
@@ -72,4 +74,6 @@
   virtual Vector getCenter() const;
   virtual double getRadius() const;
+  virtual double getVolume() const;
+  virtual double getSurfaceArea() const;
   virtual Vector translateIn(const Vector &point) const;
   virtual Vector translateOutPos(const Vector &point) const;
@@ -86,7 +90,11 @@
 {
 public:
-  Stretch_impl(const Shape::impl_ptr&, const Vector&);
+
+
+	Stretch_impl(const Shape::impl_ptr&, const Vector&);
   virtual ~Stretch_impl();
 protected:
+  virtual double getVolume() const;
+  virtual double getSurfaceArea() const;
   virtual Vector translateIn(const Vector &point) const;
   virtual Vector translateOutPos(const Vector &point) const;
@@ -107,4 +115,6 @@
   virtual ~Transform_impl();
 protected:
+  virtual double getVolume() const;
+  virtual double getSurfaceArea() const;
   virtual Vector translateIn(const Vector &point) const;
   virtual Vector translateOutPos(const Vector &point) const;
Index: src/Shapes/Shape_impl.hpp
===================================================================
--- src/Shapes/Shape_impl.hpp	(revision 7672551588bebb7aede173ab33a7c92d8ee6bed7)
+++ src/Shapes/Shape_impl.hpp	(revision c67c65d4e13897fc13b0c5ff2c63be4e582854c9)
@@ -39,4 +39,6 @@
   virtual Vector getCenter() const=0;
   virtual double getRadius() const=0;
+  virtual double getVolume() const=0;
+  virtual double getSurfaceArea() const=0;
   virtual LineSegmentSet getLineIntersections(const Line&) const=0;
   virtual std::string toString() const =0;
@@ -63,4 +65,14 @@
     return std::numeric_limits<double>::infinity();
   }
+  virtual double getVolume() const
+  {
+  	// TODO
+  	return 0.;
+  }
+  virtual double getSurfaceArea() const
+  {
+  	// TODO
+  	return 0.;
+  }
   virtual LineSegmentSet getLineIntersections(const Line &line) const{
     LineSegmentSet res(line);
@@ -100,4 +112,12 @@
   virtual double getRadius() const {
     return 0.;
+  }
+  virtual double getVolume() const
+  {
+  	return 0.;
+  }
+  virtual double getSurfaceArea() const
+  {
+  	return 0.;
   }
   virtual LineSegmentSet getLineIntersections(const Line &line) const{
@@ -128,4 +148,6 @@
   virtual Vector getCenter() const;
   virtual double getRadius() const;
+  virtual double getVolume() const;
+  virtual double getSurfaceArea() const;
   virtual LineSegmentSet getLineIntersections(const Line&) const;
   virtual std::string toString() const;
@@ -147,4 +169,6 @@
   virtual Vector getCenter() const;
   virtual double getRadius() const;
+  virtual double getVolume() const;
+  virtual double getSurfaceArea() const;
   virtual LineSegmentSet getLineIntersections(const Line&) const;
   virtual std::string toString() const;
@@ -166,4 +190,6 @@
   virtual Vector getCenter() const;
   virtual double getRadius() const;
+  virtual double getVolume() const;
+  virtual double getSurfaceArea() const;
   virtual LineSegmentSet getLineIntersections(const Line&) const;
   virtual std::string toString() const;
