diff --git a/package-lock.json b/package-lock.json
index 7325a17319942dc6a86e2fd01de0740a393c55cd..b33e22352472bcd4abcb488c386ffd92af540934 100644
Binary files a/package-lock.json and b/package-lock.json differ
diff --git a/src/mol-geo/geometry/mesh/builder/triangle.ts b/src/mol-geo/geometry/mesh/builder/triangle.ts
new file mode 100644
index 0000000000000000000000000000000000000000..fe0ba35d3b18d7e4bcaffae6646a0b88a33101da
--- /dev/null
+++ b/src/mol-geo/geometry/mesh/builder/triangle.ts
@@ -0,0 +1,19 @@
+/**
+ * Copyright (c) 2018 mol* contributors, licensed under MIT, See LICENSE file for more info.
+ *
+ * @author Alexander Rose <alexander.rose@weirdbyte.de>
+ */
+
+import {  Mat4 } from 'mol-math/linear-algebra';
+import { MeshBuilder } from '../mesh-builder';
+
+const tmpSphereMat = Mat4.identity()
+
+function getTriangle(vertices: number[], normals: number[], indices: number[]) {
+
+    return {vertices, normals, indices};
+}
+
+export function addTriangle(state: MeshBuilder.State, triangle_vertices: number[], triangle_normals: number[], triangle_indices: number[]) {
+    MeshBuilder.addPrimitive(state, tmpSphereMat, getTriangle( triangle_vertices, triangle_normals, triangle_indices))
+}
\ No newline at end of file
diff --git a/src/mol-io/reader/ply/parse_data/ply_parser.ts b/src/mol-io/reader/ply/parse_data/ply_parser.ts
index 9f126bc0328162e9cf8abcda76ac2addc6fdc117..30ceb2d64b943cb75f6b5e9c23e0de8e88c8663f 100644
--- a/src/mol-io/reader/ply/parse_data/ply_parser.ts
+++ b/src/mol-io/reader/ply/parse_data/ply_parser.ts
@@ -196,11 +196,11 @@ function moveNextInternal(state: State) {
                     if(state.currentProperty < 3){
                         state.vertices[state.currentVertex * 3 + state.currentProperty] = Number(Tokenizer.getTokenString(state.tokenizer));
                     }
-                    if(state.currentProperty >= 3 && state.currentProperty <6){
+                    if(state.currentProperty >= 3 && state.currentProperty <7){
                         state.colors[state.currentVertex * 3 + state.currentProperty-3] = Number(Tokenizer.getTokenString(state.tokenizer));
                     }
-                    if(state.currentProperty >= 6 && state.currentProperty <9){
-                        state.normals[state.currentVertex * 3 + state.currentProperty-6] = Number(Tokenizer.getTokenString(state.tokenizer));
+                    if(state.currentProperty >= 7 && state.currentProperty <10){
+                        state.normals[state.currentVertex * 3 + state.currentProperty-7] = Number(Tokenizer.getTokenString(state.tokenizer));
                     }
                     state.currentProperty++;
                     if(state.currentProperty === state.propertyCount){
diff --git a/src/mol-model/shape/formarts/ply/plyData_to_shape.ts b/src/mol-model/shape/formarts/ply/plyData_to_shape.ts
index bcc3e37a66d9cde09e9a22ae5e1a8b171a75f4b4..4a3ec2e2860e34adca9a4029e33a00dfb28fe2ab 100644
--- a/src/mol-model/shape/formarts/ply/plyData_to_shape.ts
+++ b/src/mol-model/shape/formarts/ply/plyData_to_shape.ts
@@ -2,14 +2,15 @@ import {ply_form, PlyFile} from '../../../../mol-io/reader/ply/parse_data/data-m
 import {RuntimeContext, Task} from 'mol-task';
 import {Mesh} from '../../../../mol-geo/geometry/mesh/mesh';
 import {MeshBuilder} from '../../../../mol-geo/geometry/mesh/mesh-builder';
-import { addSphere } from 'mol-geo/geometry/mesh/builder/sphere';
-import {Vec3} from '../../../../mol-math/linear-algebra/3d';
+import { addTriangle } from 'mol-geo/geometry/mesh/builder/triangle';
 import {Shape} from '../../shape';
 import {Color} from '../../../../mol-util/color';
 import { ShapeProvider } from 'mol-model/shape/provider';
 
 export interface MyData {
     centers: number[],
+    normals: number[],
+    faces: number[],
     colors: Color[],
     labels: string[],
     transforms: number[]
@@ -18,43 +19,58 @@ export interface MyData {
 function collectData_for_Shape(parsedData: ply_form): MyData {
     // parsedData.data.PLY_File. to access So.format.Ply
     console.log('parsedData', parsedData)
-    const { vertices, colors } = parsedData
+    const { vertices, colors, faces, normals } = parsedData
     const data: MyData = {
         centers: vertices,
+        normals: normals,
+        faces: faces,
         colors: [],
         labels: [],
         transforms: []
     }
 
-    for (let i = 0; i<parsedData.vertexCount; i++) {
-        data.colors[i] = Color.fromRgb(colors[i*3+0], colors[i*3+1], colors[i*3+2]);
-        data.labels[i] = '';
+    for (let i = 0; i<parsedData.faceCount; i++) {
+        data.colors[i] = Color.fromRgb(colors[faces[4*i+1]*3+0], colors[faces[4*i+1]*3+1], colors[faces[4*i+1]*3+2]);
+        data.labels[i] = parsedData.properties[parsedData.propertyCount * faces[4*i+1] + 10].toString();
+            //i.toString();
         data.transforms[i] = 0;
     }
     console.log('data', data);
     return data;
 }
 
-async function getSphereMesh(ctx: RuntimeContext, centers: number[], mesh?: Mesh) {
-    const builderState = MeshBuilder.createState(centers.length * 128, centers.length * 128 / 2, mesh)
-    const v = Vec3.zero()
+async function getSphereMesh(ctx: RuntimeContext, centers: number[], normals: number[], faces: number[], mesh?: Mesh) {
+    const builderState = MeshBuilder.createState(faces.length, faces.length, mesh)
     builderState.currentGroup = 0
-    for (let i = 0, il = centers.length / 3; i < il; ++i) {
-        if (i % 10000 === 0 && ctx.shouldUpdate) await ctx.update({ current: i, max: il, message: `adding sphere ${i}` })
+    for (let i = 0, il = faces.length/4; i < il; ++i) {
+        if (i % 10000 === 0 && ctx.shouldUpdate) await ctx.update({ current: i, max: il, message: `adding triangle ${i}` })
         builderState.currentGroup = i
-        addSphere(builderState, Vec3.fromArray(v, centers, i * 3), 0.2, 1)
+
+        let triangle_vertices: number[];
+        let triangle_normals: number[];
+        let triangle_indices: number[];
+        triangle_vertices = [centers[faces[4*i+1]*3], centers[faces[4*i+1]*3+1], centers[faces[4*i+1]*3+2],
+                             centers[faces[4*i+2]*3], centers[faces[4*i+2]*3+1], centers[faces[4*i+2]*3+2],
+                             centers[faces[4*i+3]*3], centers[faces[4*i+3]*3+1], centers[faces[4*i+3]*3+2]];
+        triangle_normals = [ normals[faces[4*i+1]*3], normals[faces[4*i+1]*3+1], normals[faces[4*i+1]*3+2],
+                             normals[faces[4*i+2]*3], normals[faces[4*i+2]*3+1], normals[faces[4*i+2]*3+2],
+                             normals[faces[4*i+3]*3], normals[faces[4*i+3]*3+1], normals[faces[4*i+3]*3+2]];
+        triangle_indices = [0,1,2];
+        //console.log(triangle_vertices)
+        addTriangle(builderState, triangle_vertices, triangle_normals, triangle_indices)
     }
     let a = MeshBuilder.getMesh(builderState);
-    // console.log(a);
+    console.log(a);
     return a
 }
 
 
+
 export async function getShape(ctx: RuntimeContext, parsedData: ply_form, props: {}, shape?: Shape<Mesh>) {
     const data = collectData_for_Shape(parsedData)
     await ctx.update('async creation of shape from  myData')
-    const { centers , colors, labels } = data
-    const mesh = await getSphereMesh(ctx, centers, shape && shape.geometry)
+    const { centers, normals, faces, colors, labels } = data
+    const mesh = await getSphereMesh(ctx, centers, normals, faces, shape && shape.geometry)
     const groupCount = centers.length / 3
     return shape || Shape.create(
         'test', mesh,