diff --git a/Comparison/src/main/java/cz/fidentis/analyst/comparison/HausdorffDistance.java b/Comparison/src/main/java/cz/fidentis/analyst/comparison/HausdorffDistance.java
index d3226f5d0d9e2108bbc0e2f7158eb4ff7f84f9af..8939c6009c4f910269d65092fc3be38edf253dfe 100644
--- a/Comparison/src/main/java/cz/fidentis/analyst/comparison/HausdorffDistance.java
+++ b/Comparison/src/main/java/cz/fidentis/analyst/comparison/HausdorffDistance.java
@@ -4,6 +4,7 @@ import cz.fidentis.analyst.mesh.core.MeshFacet;
 import cz.fidentis.analyst.mesh.core.MeshPoint;
 import cz.fidentis.analyst.mesh.core.MeshPointImpl;
 import cz.fidentis.analyst.mesh.core.MeshTriangle;
+import cz.fidentis.analyst.mesh.visitors.TriangleListVisitor;
 
 import javax.vecmath.Vector3d;
 import java.util.ArrayList;
@@ -205,7 +206,9 @@ public class HausdorffDistance {
         List<Pair<Vector3d, Double>> projections = new ArrayList<>(indicesOfTrianglesOfVertex.size());
         Vector3d helperVector = new Vector3d();
 
-        List<MeshTriangle> trList = comparedFacet.asTriangles();
+        TriangleListVisitor visitor = new TriangleListVisitor();
+        comparedFacet.accept(visitor);
+        List<MeshTriangle> trList = visitor.getTriangles();
         for (int index : indicesOfTrianglesOfVertex) {
             List<Vector3d> triangle = new ArrayList<>();
             triangle.add(trList.get(index).vertex1.getPosition());
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 2eb6eb4ecbcbb63424915ec6c7ad5fda50284b8c..b0e19f0e95d5440e5064d3a36d0526c33b6b631c 100644
--- a/Comparison/src/main/java/cz/fidentis/analyst/symmetry/SymmetryEstimator.java
+++ b/Comparison/src/main/java/cz/fidentis/analyst/symmetry/SymmetryEstimator.java
@@ -8,6 +8,7 @@ import cz.fidentis.analyst.mesh.core.MeshFacetImpl;
 import cz.fidentis.analyst.mesh.core.MeshPointImpl;
 import cz.fidentis.analyst.mesh.core.MeshTriangle;
 import cz.fidentis.analyst.mesh.visitors.BoundingBoxVisitor;
+import cz.fidentis.analyst.mesh.visitors.TriangleListVisitor;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
@@ -48,7 +49,9 @@ public class SymmetryEstimator {
         this.facet = f;
         this.config = config;
         
-        this.triangles = f.asTriangles();
+        TriangleListVisitor visitor = new TriangleListVisitor();
+        f.accept(visitor);
+        this.triangles = visitor.getTriangles();
         
         this.areas = new TriangleVertexAreas[triangles.size()];
         for (int i = 0; i < areas.length; i++) {
diff --git a/MeshModel/src/main/java/cz/fidentis/analyst/mesh/core/MeshFacet.java b/MeshModel/src/main/java/cz/fidentis/analyst/mesh/core/MeshFacet.java
index 942f4a023385ce89ad98309159a01d3c24f6f5e1..8d70d62228faca7854ffc8b4055da9f26571dea8 100644
--- a/MeshModel/src/main/java/cz/fidentis/analyst/mesh/core/MeshFacet.java
+++ b/MeshModel/src/main/java/cz/fidentis/analyst/mesh/core/MeshFacet.java
@@ -1,6 +1,5 @@
 package cz.fidentis.analyst.mesh.core;
 
-import cz.fidentis.analyst.mesh.visitors.BoundingBox;
 import cz.fidentis.analyst.mesh.visitors.Visitor;
 import java.util.List;
 
@@ -47,12 +46,6 @@ public interface MeshFacet {
      */
     CornerTable getCornerTable();
     
-    /**
-     * Returns the mesh as a list of individial triangles.
-     * @return the list of individial triangles.
-     */
-    List<MeshTriangle> asTriangles();
-    
     /**
      * Returns true if normals of vertices are calculated.
      * @return true if normals of vertices are calculated.
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 72873fc99e633629754b640b7343ac9b9e6348d8..32ab10eaee8a1c4d829d830db3925f6090723687 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
@@ -1,6 +1,7 @@
 package cz.fidentis.analyst.mesh.core;
 
 import cz.fidentis.analyst.mesh.visitors.BoundingBox;
+import cz.fidentis.analyst.mesh.visitors.TriangleListVisitor;
 import cz.fidentis.analyst.mesh.visitors.Visitor;
 import java.util.ArrayList;
 import java.util.Collections;
@@ -66,18 +67,6 @@ public class MeshFacetImpl implements MeshFacet {
         return cornerTable;
     }
     
-    @Override
-    public List<MeshTriangle> asTriangles() {
-        List<MeshTriangle> ret = new ArrayList<>();
-        for (int i = 0; i < cornerTable.getSize(); i += 3) {
-            ret.add(new MeshTriangle(
-                    vertices.get(cornerTable.getRow(i + 0).getVertexIndex()),
-                    vertices.get(cornerTable.getRow(i + 1).getVertexIndex()),
-                    vertices.get(cornerTable.getRow(i + 2).getVertexIndex())));
-        }
-        return ret;
-    }
-    
     @Override
     public boolean hasVertexNormals() {
         return !this.vertices.isEmpty() && this.vertices.get(0).getNormal() != null;
@@ -99,7 +88,9 @@ public class MeshFacetImpl implements MeshFacet {
         }
         
         // calculate normals from corresponding triangles
-        for (MeshTriangle t : asTriangles()) { 
+        TriangleListVisitor visitor = new TriangleListVisitor();
+        this.accept(visitor);
+        for (MeshTriangle t : visitor.getTriangles()) { 
             Vector3d triangleNormal = 
                     (t.vertex3.subtractPosition(t.vertex1)).crossProduct(t.vertex2.subtractPosition(t.vertex1)).getPosition();
             normalMap.get(t.vertex1).add(triangleNormal);
diff --git a/MeshModel/src/main/java/cz/fidentis/analyst/mesh/visitors/BoundingBoxVisitor.java b/MeshModel/src/main/java/cz/fidentis/analyst/mesh/visitors/BoundingBoxVisitor.java
index 848848151917c1db524c0b10d16b2e8cef6d014a..7805d36f39679a207cb778364ed1498cb2b117c2 100644
--- a/MeshModel/src/main/java/cz/fidentis/analyst/mesh/visitors/BoundingBoxVisitor.java
+++ b/MeshModel/src/main/java/cz/fidentis/analyst/mesh/visitors/BoundingBoxVisitor.java
@@ -4,7 +4,7 @@ import cz.fidentis.analyst.mesh.core.MeshFacet;
 import cz.fidentis.analyst.mesh.core.MeshModel;
 
 /**
- * Computes a 3D bounding box (cube).
+ * Visitor that computes a 3D bounding box (cube).
  * 
  * @author oslejsek
  */
diff --git a/MeshModel/src/main/java/cz/fidentis/analyst/mesh/visitors/TriangleListVisitor.java b/MeshModel/src/main/java/cz/fidentis/analyst/mesh/visitors/TriangleListVisitor.java
new file mode 100644
index 0000000000000000000000000000000000000000..42cb05c05d92ebe289051c0428010b06a00f31b3
--- /dev/null
+++ b/MeshModel/src/main/java/cz/fidentis/analyst/mesh/visitors/TriangleListVisitor.java
@@ -0,0 +1,33 @@
+package cz.fidentis.analyst.mesh.visitors;
+
+import cz.fidentis.analyst.mesh.core.CornerTable;
+import cz.fidentis.analyst.mesh.core.MeshFacet;
+import cz.fidentis.analyst.mesh.core.MeshModel;
+import cz.fidentis.analyst.mesh.core.MeshTriangle;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Visitor that collects and returs list of triangles.
+ * 
+ * @author oslejsek
+ */
+public class TriangleListVisitor implements Visitor {
+    
+    private List<MeshTriangle> triangles = new ArrayList<>();
+
+    @Override
+    public void visitMeshFacet(MeshFacet facet) {
+        CornerTable ct = facet.getCornerTable();
+        for (int i = 0; i < ct.getSize(); i += 3) {
+            triangles.add(new MeshTriangle(
+                    facet.getVertex(ct.getRow(i + 0).getVertexIndex()),
+                    facet.getVertex(ct.getRow(i + 1).getVertexIndex()),
+                    facet.getVertex(ct.getRow(i + 2).getVertexIndex())));
+        }
+    }
+    
+    public List<MeshTriangle> getTriangles() {
+        return triangles;
+    }
+}
diff --git a/MeshModel/src/test/java/cz/fidentis/analyst/mesh/visitors/BoundingBoxVisitorTest.java b/MeshModel/src/test/java/cz/fidentis/analyst/mesh/visitors/BoundingBoxVisitorTest.java
index 4d693d11fc7e494e90c4e75dd40b57acc474e74f..74a58e63c6bfa825e4102a9aef6f24ecf461557b 100644
--- a/MeshModel/src/test/java/cz/fidentis/analyst/mesh/visitors/BoundingBoxVisitorTest.java
+++ b/MeshModel/src/test/java/cz/fidentis/analyst/mesh/visitors/BoundingBoxVisitorTest.java
@@ -17,12 +17,6 @@ public class BoundingBoxVisitorTest {
     
     Path testFileDirectory = Paths.get("src", "test", "resources", "cz", "fidentis", "analyst", "mesh", "io");
     
-    @Test
-    void moreObjectFileTest() { //TODO: Not testing in loader
-        File moreObjects = new File(testFileDirectory.toFile(), "MoreObjects.obj");
-        Exception ex = assertThrows(IOException.class, () -> MeshObjLoader.read(moreObjects));
-    }
-    
     @Test
     void icoSphereTest() throws IOException {
         MeshModel m = MeshObjLoader.read(new File(testFileDirectory.toFile(), "IcoSphere-20.obj"));
diff --git a/MeshModel/src/test/java/cz/fidentis/analyst/mesh/visitors/TriangleListVisitorTest.java b/MeshModel/src/test/java/cz/fidentis/analyst/mesh/visitors/TriangleListVisitorTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..9221bd871ff70ce22d8ecd6fd4edd652a1a51090
--- /dev/null
+++ b/MeshModel/src/test/java/cz/fidentis/analyst/mesh/visitors/TriangleListVisitorTest.java
@@ -0,0 +1,44 @@
+package cz.fidentis.analyst.mesh.visitors;
+
+import cz.fidentis.analyst.mesh.visitors.*;
+import cz.fidentis.analyst.mesh.core.MeshModel;
+import cz.fidentis.analyst.mesh.io.MeshObjLoader;
+import cz.fidentis.analyst.mesh.io.MeshObjLoader;
+import java.io.File;
+import java.io.IOException;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import javax.vecmath.Vector3d;
+import org.junit.jupiter.api.Test;
+import static org.junit.jupiter.api.Assertions.*;
+
+/**
+ * @author Radek Oslejsek
+ */
+public class TriangleListVisitorTest {
+    
+    Path testFileDirectory = Paths.get("src", "test", "resources", "cz", "fidentis", "analyst", "mesh", "io");
+    
+    @Test
+    void icoSphereTest() throws IOException {
+        MeshModel m = MeshObjLoader.read(new File(testFileDirectory.toFile(), "IcoSphere-20.obj"));
+        assertNotNull(m);
+        TriangleListVisitor visitor = new TriangleListVisitor();
+        m.accept(visitor);
+        assertEquals(20, visitor.getTriangles().size());
+    }
+    
+    @Test
+    void combinedTest() throws IOException {
+        MeshModel m = MeshObjLoader.read(new File(testFileDirectory.toFile(), "IcoSphere-20.obj"));
+        assertNotNull(m);
+        TriangleListVisitor visitor = new TriangleListVisitor();
+        m.accept(visitor);
+        
+        m = MeshObjLoader.read(new File(testFileDirectory.toFile(), "Tetrahedron.obj"));
+        assertNotNull(m);
+        m.accept(visitor);
+        
+        assertEquals(24, visitor.getTriangles().size());
+    }
+}