diff --git a/MeshModel/src/main/java/cz/fidentis/analyst/mesh/io/MeshObjLoader.java b/MeshModel/src/main/java/cz/fidentis/analyst/mesh/io/MeshObjLoader.java
index 0da440cb0f3a6c9a24cca74afe793dc2cd0fc52e..06c7d3eef36030e13b43e3135688e49d977d389a 100644
--- a/MeshModel/src/main/java/cz/fidentis/analyst/mesh/io/MeshObjLoader.java
+++ b/MeshModel/src/main/java/cz/fidentis/analyst/mesh/io/MeshObjLoader.java
@@ -11,13 +11,20 @@ import com.mokiat.data.front.parser.OBJObject;
 import com.mokiat.data.front.parser.OBJParser;
 import com.mokiat.data.front.parser.OBJTexCoord;
 import com.mokiat.data.front.parser.OBJVertex;
+import cz.fidentis.analyst.mesh.core.MeshEdge;
+import cz.fidentis.analyst.mesh.core.MeshFace;
+import cz.fidentis.analyst.mesh.core.MeshFacet;
+import cz.fidentis.analyst.mesh.core.MeshModel;
+import cz.fidentis.analyst.mesh.core.MeshPoint;
 import java.io.File;
 import java.io.FileInputStream;
 import java.io.FileNotFoundException;
 import java.io.IOException;
 import java.io.InputStream;
 import java.util.ArrayList;
+import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
 import java.util.logging.Level;
 import java.util.logging.Logger;
 import javax.vecmath.Vector3d;
@@ -41,18 +48,25 @@ public class MeshObjLoader {
                 return null;
             }
             
-            OBJObject object = model.getObjects().get(0); // Předpokládá se celý obličej jako jeden prvek
-            
-            List<MeshFacet> listFacet = new ArrayList();
+            // Expecting only one face in file as one object
+            OBJObject object = model.getObjects().get(0); 
 
-            for (OBJMesh mesh : object.getMeshes()) { // Sjednotit s facet
+            // Our facet = loader mesh, create and fill all facets
+            for (OBJMesh mesh : object.getMeshes()) {
                 
                 MeshFacet meshFacet = new MeshFacet();
                 
+                // Map for all edges with one face. Can't use Set because missing get();
+                Map<MeshEdge, MeshEdge> oneFaceEdges = new HashMap();
+                
+                // Create and fill all faces
                 for (OBJFace face : mesh.getFaces()) {
                     List<OBJDataReference> references = face.getReferences();
-                    List<MeshPoint> points = new ArrayList();
+                    List<MeshPoint> facePoints = new ArrayList();
 
+                    MeshFace meshFace = new MeshFace();
+                    
+                    // Load all point from one mesh
                     for (OBJDataReference reference : references) {
                         final OBJVertex vertex = model.getVertex(reference);
                         Vector3d coords = new Vector3d(vertex.x, vertex.y, vertex.z);
@@ -67,18 +81,33 @@ public class MeshObjLoader {
                             texCoords = new Vector3d(texCoord.u, texCoord.v, texCoord.w);
                         }
 
-                        MeshPoint meshPoint = new MeshPoint(coords, norm, texCoords);
-                        points.add(meshPoint);                            
+                        MeshPoint meshPoint = meshFacet.getPoint(new MeshPoint(coords, norm, texCoords));
+                        facePoints.add(meshPoint);                            
                     }
-
-                    List<MeshEdge> edges = new ArrayList();
-                    for (int i = 1; i < points.size(); i++) {
-                        edges.add(new MeshEdge(points.get(i-1), points.get(i)));
+                    // Create edges
+                    for (int i = 1; i <= facePoints.size(); i++) {
+                        MeshEdge meshEdge = new MeshEdge(facePoints.get((i-1)%facePoints.size()), facePoints.get((i)%facePoints.size()));
+                        if (oneFaceEdges.containsKey(meshEdge)) {
+                            meshEdge = oneFaceEdges.get(meshEdge);
+                            meshFacet.getEdge(meshEdge);
+                            //meshEdge.add this face as second face
+                            oneFaceEdges.remove(meshEdge);
+                        } else {
+                            oneFaceEdges.put(meshEdge, meshEdge);
+                        }
+                        meshFace.addChild(meshEdge);
                     }
+                    
+                    meshFacet.addChild(meshFace);
                 }
-                listFacet.add(meshFacet);
+                
+                // Add remaining edges with only one asociated face, i. e. edge of facet
+                for (MeshEdge edge : oneFaceEdges.values()) {
+                    meshFacet.getEdge(edge);
+                }
+                
+                meshModel.addChild(meshFacet);
             }
-            meshModel.addFacets(listFacet);
             
         } catch (IOException ex) {
             Logger.getLogger(MeshObjLoader.class.getName()).log(Level.SEVERE, null, ex);
@@ -95,6 +124,5 @@ public class MeshObjLoader {
             Logger.getLogger(MeshObjLoader.class.getName()).log(Level.SEVERE, null, ex);
         }
         return null;
-    }
-    
+    }    
 }