diff --git a/Comparison/src/main/java/cz/fidentis/analyst/symmetry/SymmetryEstimator.java b/Comparison/src/main/java/cz/fidentis/analyst/symmetry/SymmetryEstimator.java
index 9c1ad8621496fffe49c611a5054fd8533581fa77..9ade7e71c17683bfa463bd41f83df2da288ecc39 100644
--- a/Comparison/src/main/java/cz/fidentis/analyst/symmetry/SymmetryEstimator.java
+++ b/Comparison/src/main/java/cz/fidentis/analyst/symmetry/SymmetryEstimator.java
@@ -113,7 +113,7 @@ public class SymmetryEstimator extends MeshVisitor {
         BBox bbox = bbVisitor.getBoundingBox();
         
         Vector3d normal = symmetryPlane.getNormal();
-        Point3d midPoint = bbox.getMidPoint().getPosition();
+        Point3d midPoint = bbox.getMidPoint();
 
         double alpha = -((normal.x * midPoint.x) + 
                 (normal.y * midPoint.y) + (normal.z * midPoint.z) +
@@ -140,7 +140,7 @@ public class SymmetryEstimator extends MeshVisitor {
         b.cross(normal,a);
         b.normalize();
         
-        double scale = (bbox.getMaxPoint().subtractPosition(bbox.getMinPoint())).getPosition().x;
+        double scale = bbox.getMaxPoint().x - bbox.getMinPoint().x;
         
         return createMeshFacet(midPointOnPlane, a, b, symmetryPlane.getNormal(), scale);
     }
diff --git a/Comparison/src/main/java/cz/fidentis/analyst/visitors/mesh/BoundingBox.java b/Comparison/src/main/java/cz/fidentis/analyst/visitors/mesh/BoundingBox.java
index f590abc8d169f4b8c393e137acd41d76ed900966..52a56159c03091c9c7e20b01579a9d371a98712e 100644
--- a/Comparison/src/main/java/cz/fidentis/analyst/visitors/mesh/BoundingBox.java
+++ b/Comparison/src/main/java/cz/fidentis/analyst/visitors/mesh/BoundingBox.java
@@ -3,7 +3,6 @@ package cz.fidentis.analyst.visitors.mesh;
 import cz.fidentis.analyst.mesh.MeshVisitor;
 import cz.fidentis.analyst.mesh.core.MeshFacet;
 import cz.fidentis.analyst.mesh.core.MeshPoint;
-import cz.fidentis.analyst.mesh.core.MeshPointImpl;
 import java.util.List;
 import javax.vecmath.Point3d;
 import javax.vecmath.Vector3d;
@@ -45,8 +44,8 @@ public class BoundingBox extends MeshVisitor {
     */
     public class BBox {
     
-        private MeshPoint maxPoint;
-        private MeshPoint minPoint;
+        private Point3d maxPoint;
+        private Point3d minPoint;
 
         /** 
          * Creates bounding box from given mesh points.
@@ -59,8 +58,8 @@ public class BoundingBox extends MeshVisitor {
                 throw new IllegalArgumentException("points");
             }
 
-            minPoint = new MeshPointImpl(new Point3d(Double.POSITIVE_INFINITY, Double.POSITIVE_INFINITY, Double.POSITIVE_INFINITY), null, null);
-            maxPoint = new MeshPointImpl(new Point3d(Double.NEGATIVE_INFINITY,Double.NEGATIVE_INFINITY,Double.NEGATIVE_INFINITY), null, null);
+            minPoint = new Point3d(Double.POSITIVE_INFINITY, Double.POSITIVE_INFINITY, Double.POSITIVE_INFINITY);
+            maxPoint = new Point3d(Double.NEGATIVE_INFINITY,Double.NEGATIVE_INFINITY,Double.NEGATIVE_INFINITY);
 
             compute(points);
         }
@@ -78,13 +77,13 @@ public class BoundingBox extends MeshVisitor {
             for (int i = 0; i < points.size(); i++) {
                 MeshPoint point = points.get(i);
 
-                minPoint.getPosition().x = Math.min(minPoint.getPosition().x, point.getPosition().x);
-                minPoint.getPosition().y = Math.min(minPoint.getPosition().y, point.getPosition().y);
-                minPoint.getPosition().z = Math.min(minPoint.getPosition().z, point.getPosition().z);
+                minPoint.x = Math.min(minPoint.x, point.getPosition().x);
+                minPoint.y = Math.min(minPoint.y, point.getPosition().y);
+                minPoint.z = Math.min(minPoint.z, point.getPosition().z);
 
-                maxPoint.getPosition().x = Math.max(maxPoint.getPosition().x, point.getPosition().x);
-                maxPoint.getPosition().y = Math.max(maxPoint.getPosition().y, point.getPosition().y);
-                maxPoint.getPosition().z = Math.max(maxPoint.getPosition().z, point.getPosition().z);                    
+                maxPoint.x = Math.max(maxPoint.x, point.getPosition().x);
+                maxPoint.y = Math.max(maxPoint.y, point.getPosition().y);
+                maxPoint.z = Math.max(maxPoint.z, point.getPosition().z);                    
             }
         }        
 
@@ -92,7 +91,7 @@ public class BoundingBox extends MeshVisitor {
          * Return the upper-bound corner of the bounding cube
          * @return max point of the bounding box
          */
-        public MeshPoint getMaxPoint() {
+        public Point3d getMaxPoint() {
             return maxPoint;
         }
 
@@ -100,15 +99,18 @@ public class BoundingBox extends MeshVisitor {
          * Return centroid of the bounding cube.
          * @return middle point of the bounding box
          */
-        public MeshPoint getMidPoint() {
-            return (minPoint.addPosition(maxPoint)).multiplyPosition(0.5);
+        public Point3d getMidPoint() {
+            Point3d p = new Point3d(minPoint);
+            p.add(maxPoint);
+            p.scale(0.5);
+            return p;
         }
 
         /**
          * Return the lower-bound corner of the bounding cube
          * @return min point of the bounding box
          */
-        public MeshPoint getMinPoint() {
+        public Point3d getMinPoint() {
             return minPoint;
         }
 
@@ -117,7 +119,9 @@ public class BoundingBox extends MeshVisitor {
          * @return maximal diagonal of bounding box
          */
         public double getMaxDiag() {
-            return maxPoint.subtractPosition(minPoint).abs();
+            Vector3d v = new Vector3d(maxPoint);
+            v.sub(minPoint);
+            return v.length();
         }
 
         /**
diff --git a/Comparison/src/test/java/cz/fidentis/analyst/visitors/mesh/BoundingBoxVisitorTest.java b/Comparison/src/test/java/cz/fidentis/analyst/visitors/mesh/BoundingBoxVisitorTest.java
index da9d6696c4ca107af9a076ac685161405b5ee4d1..022c668414ca38fb66ba1e4b382428e1efa8b7d7 100644
--- a/Comparison/src/test/java/cz/fidentis/analyst/visitors/mesh/BoundingBoxVisitorTest.java
+++ b/Comparison/src/test/java/cz/fidentis/analyst/visitors/mesh/BoundingBoxVisitorTest.java
@@ -23,8 +23,8 @@ public class BoundingBoxVisitorTest {
         assertNotNull(m);
         BoundingBox visitor = new BoundingBox();
         m.compute(visitor);
-        assertEquals(new Vector3d(0.8944249749183655, 1.0, 0.8506399989128113), visitor.getBoundingBox().getMaxPoint().getPosition());
-        assertEquals(new Vector3d(-0.8944249749183655, -1.0, -0.8506399989128113), visitor.getBoundingBox().getMinPoint().getPosition());
+        assertEquals(new Vector3d(0.8944249749183655, 1.0, 0.8506399989128113), visitor.getBoundingBox().getMaxPoint());
+        assertEquals(new Vector3d(-0.8944249749183655, -1.0, -0.8506399989128113), visitor.getBoundingBox().getMinPoint());
     }
     
     @Test
@@ -38,7 +38,7 @@ public class BoundingBoxVisitorTest {
         assertNotNull(m);
         m.compute(visitor);
         
-        assertEquals(new Vector3d(1.0, 1.0, 1.0), visitor.getBoundingBox().getMaxPoint().getPosition());
-        assertEquals(new Vector3d(-1.0, -1.0, -1.0), visitor.getBoundingBox().getMinPoint().getPosition());
+        assertEquals(new Vector3d(1.0, 1.0, 1.0), visitor.getBoundingBox().getMaxPoint());
+        assertEquals(new Vector3d(-1.0, -1.0, -1.0), visitor.getBoundingBox().getMinPoint());
     }
 }
diff --git a/MeshModel/src/main/java/cz/fidentis/analyst/mesh/core/MeshFacetImpl.java b/MeshModel/src/main/java/cz/fidentis/analyst/mesh/core/MeshFacetImpl.java
index d6db25b5efbd5fb910760fb0259cf7b85c984742..5e83a7083cd0b19a5d0615799bc1275cfa4fbbf7 100644
--- a/MeshModel/src/main/java/cz/fidentis/analyst/mesh/core/MeshFacetImpl.java
+++ b/MeshModel/src/main/java/cz/fidentis/analyst/mesh/core/MeshFacetImpl.java
@@ -250,7 +250,11 @@ public class MeshFacetImpl implements MeshFacet {
                 mapPoints.put(v, new MeshPointImpl(v, n, t));
                 mapOrigPositions.put(v, new ArrayList<>());
             } else if (n != null) {
-                mapPoints.put(v, mapPoints.get(v).addNormal(n));
+                MeshPoint orig = mapPoints.get(v);
+                Vector3d newNormal = new Vector3d(orig.getNormal());
+                newNormal.add(n);
+                newNormal.normalize();
+                mapPoints.put(v, new MeshPointImpl(orig.getPosition(), newNormal, orig.getTexCoord()));
             }
             mapOrigPositions.get(v).add(i);
         }
diff --git a/MeshModel/src/main/java/cz/fidentis/analyst/mesh/core/MeshPoint.java b/MeshModel/src/main/java/cz/fidentis/analyst/mesh/core/MeshPoint.java
index c3e5a26978b19d03f57e7cdb6ba6024aad0fd14e..e216c5ef4bacbebc949924e83c6de6d64f44820f 100644
--- a/MeshModel/src/main/java/cz/fidentis/analyst/mesh/core/MeshPoint.java
+++ b/MeshModel/src/main/java/cz/fidentis/analyst/mesh/core/MeshPoint.java
@@ -39,116 +39,5 @@ public interface MeshPoint extends Serializable {
      * @return texture coordinates
      */
     Vector3d getTexCoord();
-    
-    /**
-     * Calculates distance between two mesh points.
-     *
-     * @param point The second mesh point
-     * @return the distance between this and another point
-     */
-    double distanceTo(MeshPoint point);
-
-    /**
-     * returns new instance of MeshPoint with subtracted position
-     *
-     * @param subtrahend position to be subtracted
-     * @return subtracted MeshPoint
-     */
-    MeshPoint subtractPosition(MeshPoint subtrahend);
-
-    /**
-     * returns new instance of MeshPoint with subtracted position
-     *
-     * @param subtrahend position to be subtracted
-     * @return subtracted MeshPoint
-     */
-    MeshPoint subtractPosition(Point3d subtrahend);
-
-    /**
-     * returns new instance of MeshPoint with added position
-     *
-     * @param addend position to be added
-     * @return added MeshPoint
-     */
-    MeshPoint addPosition(MeshPoint addend);
-
-    /**
-     * returns new instance of MeshPoint with added position
-     *
-     * @param addend position to be added
-     * @return added MeshPoint
-     */
-    MeshPoint addPosition(Point3d addend);
-
-    /**
-     * returns new instance of MeshPoint with multiplied position by number
-     * 
-     * @param number Number for multiplying
-     * @return multiplied MeshPoint
-     */
-    MeshPoint multiplyPosition(double number);
-
-    /**
-     * returns new instance of MeshPoint with divided position by number
-     * 
-     * @param number Number for division
-     * @return divided MeshPoint
-     */
-    MeshPoint dividePosition(double number);
-    
-    /**
-     * Returns the cross product of two points.
-     * 
-     * @param meshPoint Second argument of the cross product operation.
-     * @return MeshPoint representing the resulting vector.
-     */
-    MeshPoint crossProduct(MeshPoint meshPoint);
-
-    /**
-     * returns the dot product of two points
-     * 
-     * @param meshPoint Second argument of the dot product operation
-     * @return dot product of two instances of MeshPoint 
-     */
-    double dotProduct(MeshPoint meshPoint);
-    
-    /**
-     * returns absolute value of MeshPoint
-     * 
-     * @return absolute value of MeshPoint
-     */
-    double abs();
-
-    /**
-     * returns new instance of MeshPoint with subtracted normal
-     *
-     * @param subtrahend normal to be subtracted
-     * @return subtracted MeshPoint
-     */
-    MeshPoint subtractNormal(MeshPoint subtrahend);
-
-    /**
-     * returns new instance of MeshPoint with subtracted normal
-     *
-     * @param subtrahend normal to be subtracted
-     * @return subtracted MeshPoint
-     */
-    MeshPoint subtractNormal(Vector3d subtrahend);
-
-    /**
-     * returns new instance of MeshPoint with added normal
-     *
-     * @param addend normal to be added
-     * @return added MeshPoint
-     */
-    MeshPoint addNormal(MeshPoint addend);
-
-    /**
-     * returns new instance of MeshPoint with added normal
-     *
-     * @param addend normal to be added
-     * @return added MeshPoint
-     */
-    MeshPoint addNormal(Vector3d addend);
 
 }
diff --git a/MeshModel/src/main/java/cz/fidentis/analyst/mesh/core/MeshPointImpl.java b/MeshModel/src/main/java/cz/fidentis/analyst/mesh/core/MeshPointImpl.java
index e8f64eb18e4cc1aff9bbfc9861e587cce9104e86..51c54481af080545691626ed5459a10f97d911ac 100644
--- a/MeshModel/src/main/java/cz/fidentis/analyst/mesh/core/MeshPointImpl.java
+++ b/MeshModel/src/main/java/cz/fidentis/analyst/mesh/core/MeshPointImpl.java
@@ -62,106 +62,6 @@ public class MeshPointImpl implements MeshPoint {
         return texCoord;
     }
     
-    @Override
-    public double distanceTo(MeshPoint point) {
-        return this.position.distance(point.getPosition());
-    }
-
-    @Override
-    public MeshPoint subtractPosition(MeshPoint subtrahend) {
-        return subtractPosition(subtrahend.getPosition());
-    }
-
-    @Override
-    public MeshPoint subtractPosition(Point3d subtrahend) {
-        Point3d newPosition = new Point3d(position);
-        newPosition.sub(subtrahend);
-        return new MeshPointImpl(newPosition, normal, texCoord);
-    }
-
-    @Override
-    public MeshPoint addPosition(MeshPoint addend) {
-        return addPosition(addend.getPosition());
-    }
-
-    @Override
-    public MeshPoint addPosition(Point3d addend) {
-        Point3d newPosition = new Point3d(position);
-        newPosition.add(addend);
-        return new MeshPointImpl(newPosition, normal, texCoord);
-    }
-
-    @Override
-    public MeshPoint multiplyPosition(double number) {
-        Point3d newPosition = new Point3d(position);
-        newPosition.scale(number);
-        return new MeshPointImpl(newPosition, normal, texCoord);
-        /*
-        return new MeshPointImpl(new Vector3d(this.getPosition().x * number,
-                this.getPosition().y * number, this.getPosition().z * number),
-                normal, texCoord);
-        */
-    }
-
-    @Override
-    public MeshPoint dividePosition(double number) {
-        Point3d p = new Point3d(this.position);
-        p.scale(number);
-        return new MeshPointImpl(p, normal, texCoord);
-    }
-    
-    @Override
-    public MeshPoint crossProduct(MeshPoint meshPoint) {
-        Vector3d v = new Vector3d();
-        v.cross(new Vector3d(this.position), new Vector3d(meshPoint.getPosition()));
-        return new MeshPointImpl(new Point3d(v), normal, texCoord);
-        /*
-        return new MeshPointImpl(
-                new Point3d(
-                        this.position.y * meshPoint.getPosition().z - this.position.z * meshPoint.getPosition().y,
-                        this.position.z * meshPoint.getPosition().x - this.position.x * meshPoint.getPosition().z,
-                        this.position.x * meshPoint.getPosition().y - this.position.y * meshPoint.getPosition().x
-                ), normal, texCoord);
-        */
-    }
-
-    @Override
-    public double dotProduct(MeshPoint meshPoint) {
-        return (this.position.x * meshPoint.getPosition().x + this.position.y * meshPoint.getPosition().y + this.position.z * meshPoint.getPosition().z);
-    }
-    
-    @Override
-    public double abs() {
-        return Math.sqrt(this.getPosition().x * this.getPosition().x + 
-                this.getPosition().y * this.getPosition().y + this.getPosition().z * this.getPosition().z);
-    }
-
-    @Override
-    public MeshPoint subtractNormal(MeshPoint subtrahend) {
-        return subtractNormal(subtrahend.getNormal());
-    }
-
-    @Override
-    public MeshPoint subtractNormal(Vector3d subtrahend) {
-        Vector3d newNormal = new Vector3d(normal);
-        newNormal.sub(subtrahend);
-        newNormal.normalize();
-        return new MeshPointImpl(position, newNormal, texCoord);
-    }
-
-    @Override
-    public MeshPoint addNormal(MeshPoint addend) {
-        return addNormal(addend.getNormal());
-    }
-
-    @Override
-    public MeshPoint addNormal(Vector3d addend) {
-        Vector3d newNormal = new Vector3d(normal);
-        newNormal.add(addend);
-        newNormal.normalize();
-        return new MeshPointImpl(position, newNormal, texCoord);
-    }
-
     @Override
     public boolean equals(Object obj) {
         if (!(obj instanceof MeshPointImpl)) {
diff --git a/MeshModel/src/main/java/cz/fidentis/analyst/mesh/core/MeshTriangle.java b/MeshModel/src/main/java/cz/fidentis/analyst/mesh/core/MeshTriangle.java
index 6725dd1487776ce1bd943b8ef7c22726902461b3..9176377791fcd07abdc079952050863843ef8d4a 100644
--- a/MeshModel/src/main/java/cz/fidentis/analyst/mesh/core/MeshTriangle.java
+++ b/MeshModel/src/main/java/cz/fidentis/analyst/mesh/core/MeshTriangle.java
@@ -152,9 +152,9 @@ public class MeshTriangle implements Iterable<MeshPoint> {
         MeshPoint vertex2 = facet.getVertex(index2);
         MeshPoint vertex3 = facet.getVertex(index3);
         
-        double a = (vertex2.subtractPosition(vertex3)).abs();
-        double b = (vertex3.subtractPosition(vertex1)).abs();
-        double c = (vertex2.subtractPosition(vertex1)).abs();
+        double a = subtractPosition(vertex2.getPosition(), vertex3).length();
+        double b = subtractPosition(vertex3.getPosition(), vertex1).length();
+        double c = subtractPosition(vertex2.getPosition(), vertex1).length();
         
         double d1 = a * a * (b * b + c * c - a * a);
         double d2 = b * b * (c * c + a * a - b * b);
@@ -164,49 +164,101 @@ public class MeshTriangle implements Iterable<MeshPoint> {
         d1 /= dSum;
         d2 /= dSum;
         d3 /= dSum;
+        
+        Point3d v1Half = new Point3d(vertex2.getPosition());
+        v1Half.add(vertex3.getPosition());
+        v1Half.scale(0.5);
+        
+        Point3d v2Half = new Point3d(vertex1.getPosition());
+        v1Half.add(vertex3.getPosition());
+        v1Half.scale(0.5);
+        
+        Point3d v3Half = new Point3d(vertex2.getPosition());
+        v1Half.add(vertex1.getPosition());
+        v1Half.scale(0.5);
 
-        MeshPoint v1Half = (vertex2.addPosition(vertex3)).dividePosition(2);
-        MeshPoint v2Half = (vertex1.addPosition(vertex3)).dividePosition(2);
-        MeshPoint v3Half = (vertex2.addPosition(vertex1)).dividePosition(2);
+        //MeshPoint v1Half = (vertex2.addPosition(vertex3)).dividePosition(2);
+        //MeshPoint v2Half = (vertex1.addPosition(vertex3)).dividePosition(2);
+        //MeshPoint v3Half = (vertex2.addPosition(vertex1)).dividePosition(2);
 
         
         if (d1 < 0) {           
-            double v3Area = ((v2Half.subtractPosition(vertex3)).crossProduct(v1Half.subtractPosition(vertex3))).abs() / 2.0;
-            double v2Area = ((v3Half.subtractPosition(vertex2)).crossProduct(v1Half.subtractPosition(vertex2))).abs() / 2.0;
-            double v1Area = (((v1Half.subtractPosition(vertex1)).crossProduct(v3Half.subtractPosition(vertex1))).abs() / 2.0) + 
-                    (((v1Half.subtractPosition(vertex1)).crossProduct(v2Half.subtractPosition(vertex1))).abs() / 2.0);
+            Vector3d v = new Vector3d();
+            v.cross(subtractPosition(v2Half, vertex3), subtractPosition(v1Half, vertex3));
+            double v3Area = v.length() / 2.0;
+            
+            v.cross(subtractPosition(v3Half, vertex2), subtractPosition(v1Half, vertex2));
+            double v2Area = v.length() / 2.0;
+            
+            v.cross(subtractPosition(v1Half, vertex1), subtractPosition(v3Half, vertex1));
+            double v1Area = v.length() / 2.0;
+            v.cross(subtractPosition(v1Half, vertex1), subtractPosition(v3Half, vertex1));
+            v1Area += v.length() / 2.0;
+
             voronoiPoint = new Point3d(v1Area, v2Area, v3Area);
             return voronoiPoint;
         }
         if (d2 < 0) {
-            double v1Area = ((v3Half.subtractPosition(vertex1)).crossProduct(v2Half.subtractPosition(vertex1))).abs() / 2.0;
-            double v3Area = ((v1Half.subtractPosition(vertex3)).crossProduct(v2Half.subtractPosition(vertex3))).abs() / 2.0;
-            double v2Area = (((v2Half.subtractPosition(vertex2)).crossProduct(v1Half.subtractPosition(vertex2))).abs() / 2.0) + 
-                    (((v2Half.subtractPosition(vertex2)).crossProduct(v3Half.subtractPosition(vertex2))).abs() / 2.0);
+            Vector3d v = new Vector3d();
+            v.cross(subtractPosition(v3Half, vertex1), subtractPosition(v2Half, vertex1));
+            double v1Area = v.length() / 2.0;
+            
+            v.cross(subtractPosition(v1Half, vertex3), subtractPosition(v2Half, vertex3));
+            double v3Area = v.length() / 2.0;
+            
+            v.cross(subtractPosition(v2Half, vertex2), subtractPosition(v1Half, vertex2));
+            double v2Area = v.length() / 2.0;
+            v.cross(subtractPosition(v2Half, vertex2), subtractPosition(v3Half, vertex2));
+            v2Area += v.length() / 2.0;
+
             voronoiPoint = new Point3d(v1Area, v2Area, v3Area);
             return voronoiPoint;
         }
         if (d3 < 0) {
-            double v2Area = ((v1Half.subtractPosition(vertex2)).crossProduct(v3Half.subtractPosition(vertex2))).abs() / 2.0;
-            double v1Area = ((v2Half.subtractPosition(vertex1)).crossProduct(v3Half.subtractPosition(vertex1))).abs() / 2.0;
-            double v3Area = (((v3Half.subtractPosition(vertex3)).crossProduct(v2Half.subtractPosition(vertex3))).abs() / 2.0) + 
-                    (((v3Half.subtractPosition(vertex3)).crossProduct(v1Half.subtractPosition(vertex3))).abs() / 2.0);
+            Vector3d v = new Vector3d();
+            v.cross(subtractPosition(v1Half, vertex2), subtractPosition(v3Half, vertex2));
+            double v2Area = v.length() / 2.0;
+            
+            v.cross(subtractPosition(v2Half, vertex1), subtractPosition(v3Half, vertex1));
+            double v1Area = v.length() / 2.0;
+            
+            v.cross(subtractPosition(v3Half, vertex3), subtractPosition(v2Half, vertex3));
+            double v3Area = v.length() / 2.0;
+            v.cross(subtractPosition(v3Half, vertex3), subtractPosition(v1Half, vertex3));
+            v3Area += v.length() / 2.0;
+
             voronoiPoint = new Point3d(v1Area, v2Area, v3Area);
             return voronoiPoint;
         }
         
-        MeshPoint circumcenter = vertex1.multiplyPosition(d1).addPosition(vertex2.multiplyPosition(d2).addPosition(vertex3.multiplyPosition(d3)));
+        Point3d aux1 = new Point3d(vertex1.getPosition());
+        Point3d aux2 = new Point3d(vertex2.getPosition());
+        Point3d aux3 = new Point3d(vertex3.getPosition());
+        aux1.scale(d1);
+        aux2.scale(d2);
+        aux3.scale(d3);
         
-        double v1Area = (((v2Half.subtractPosition(vertex1)).crossProduct(circumcenter.subtractPosition(vertex1))).abs() / 2.0) + 
-                (((v3Half.subtractPosition(vertex1)).crossProduct(circumcenter.subtractPosition(vertex1))).abs() / 2.0);
+        Point3d circumcenter = new Point3d(aux1);
+        circumcenter.add(aux2);
+        circumcenter.add(aux3);
         
-        double v2Area = (((v3Half.subtractPosition(vertex2)).crossProduct(circumcenter.subtractPosition(vertex2))).abs() / 2.0) +
-                (((v1Half.subtractPosition(vertex2)).crossProduct(circumcenter.subtractPosition(vertex2))).abs() / 2.0);
+        Vector3d v = new Vector3d();
+        v.cross(subtractPosition(v2Half, vertex1), subtractPosition(circumcenter, vertex1));
+        double v1Area = v.length() / 2.0;
+        v.cross(subtractPosition(v3Half, vertex1), subtractPosition(circumcenter, vertex1));
+        v1Area += v.length() / 2.0;
+            
+        v.cross(subtractPosition(v3Half, vertex2), subtractPosition(circumcenter, vertex2));
+        double v2Area = v.length() / 2.0;
+        v.cross(subtractPosition(v1Half, vertex2), subtractPosition(circumcenter, vertex2));
+        v2Area += v.length() / 2.0;
+            
+        v.cross(subtractPosition(v1Half, vertex3), subtractPosition(circumcenter, vertex3));
+        double v3Area = v.length() / 2.0;
+        v.cross(subtractPosition(v2Half, vertex3), subtractPosition(circumcenter, vertex3));
+        v3Area += v.length() / 2.0;
         
-        double v3Area = (((v1Half.subtractPosition(vertex3)).crossProduct(circumcenter.subtractPosition(vertex3))).abs() / 2.0) +
-                (((v2Half.subtractPosition(vertex3)).crossProduct(circumcenter.subtractPosition(vertex3))).abs() / 2.0);
         voronoiPoint = new Point3d(v1Area, v2Area, v3Area);
-        
         return voronoiPoint;
     }
     
@@ -342,4 +394,9 @@ public class MeshTriangle implements Iterable<MeshPoint> {
         return v2;
     }
     
+    protected Vector3d subtractPosition(Point3d p1, MeshPoint p2) {
+        Vector3d e = new Vector3d(p1);
+        e.sub(p2.getPosition());
+        return e;
+    }
 }
diff --git a/MeshModel/src/test/java/cz/fidentis/analyst/mesh/kdtree/KdTreeTest.java b/MeshModel/src/test/java/cz/fidentis/analyst/mesh/kdtree/KdTreeTest.java
index e0f33ac619d90062ca68f6d6f6b01351126056f4..ac393103ca048c205118afd1e25fee9a45770c77 100644
--- a/MeshModel/src/test/java/cz/fidentis/analyst/mesh/kdtree/KdTreeTest.java
+++ b/MeshModel/src/test/java/cz/fidentis/analyst/mesh/kdtree/KdTreeTest.java
@@ -159,11 +159,11 @@ public class KdTreeTest {
         }
 
         MeshPoint closest = points.get(0);
-        double dis = closest.distanceTo(p);
+        double dis = closest.getPosition().distance(p.getPosition());
 
         for(MeshPoint cl : points){
-            if(cl.distanceTo(p) < dis){
-                dis = cl.distanceTo(p);
+            if(cl.getPosition().distance(p.getPosition()) < dis){
+                dis = cl.getPosition().distance(p.getPosition());
                 closest = cl;
             }
         }