diff --git a/src/art/webgl/art.js b/src/art/webgl/art.js
index 06af8ba98b736784486ab93a839ae0f122168b09..ec53bcdf27a79d349e686060a9090360769f10ec 100644
--- a/src/art/webgl/art.js
+++ b/src/art/webgl/art.js
@@ -77,10 +77,10 @@ App.Art.applyFigures = function(slave, scene) {
 	}
 
 	for (let i=0; i < scene.models[0].figures.length; i++) {
-		scene.models[0].figures[i]["visible"] = false;
+		scene.models[0].figures[i].visible = false;
 		for (let j =0; j < figures.length; j++) {
 			if (scene.models[0].figures[i].figId === figures[j]) {
-				scene.models[0].figures[i]["visible"] = true;
+				scene.models[0].figures[i].visible = true;
 			}
 		}
 	}
diff --git a/src/art/webgl/engine.js b/src/art/webgl/engine.js
index fe24e6d9d3aa45d8c829c6c7b315d5a67193ef37..d0056f30c15898aa4485cb27c0c79300559a1825 100644
--- a/src/art/webgl/engine.js
+++ b/src/art/webgl/engine.js
@@ -212,26 +212,43 @@ App.Art.Engine = class {
 			let modelBuffers = this.buffers.models[m];
 			let modelData = sceneData.models[m];
 
-			modelBuffers.verticesPositionBuffer = this.gl.createBuffer();
-			this.gl.bindBuffer(this.gl.ARRAY_BUFFER, modelBuffers.verticesPositionBuffer);
-			this.gl.bufferData(this.gl.ARRAY_BUFFER, this.base64ToFloat(modelData.verts), this.gl.STATIC_DRAW);
-			modelBuffers.vertexCount = this.gl.getBufferParameter(this.gl.ARRAY_BUFFER, this.gl.BUFFER_SIZE)/4;
-
-			modelBuffers.verticesNormalBuffer = this.gl.createBuffer();
-			this.gl.bindBuffer(this.gl.ARRAY_BUFFER, modelBuffers.verticesNormalBuffer);
-			this.gl.bufferData(this.gl.ARRAY_BUFFER, this.base64ToFloat(modelData.vertsn), this.gl.STATIC_DRAW);
-
-			modelBuffers.verticesTextureCoordBuffer = this.gl.createBuffer();
-			this.gl.bindBuffer(this.gl.ARRAY_BUFFER, modelBuffers.verticesTextureCoordBuffer);
-			this.gl.bufferData(this.gl.ARRAY_BUFFER, this.base64ToFloat(modelData.texts), this.gl.STATIC_DRAW);
-
-			modelBuffers.verticesTangentBuffer = this.gl.createBuffer();
-			this.gl.bindBuffer(this.gl.ARRAY_BUFFER, modelBuffers.verticesTangentBuffer);
-			this.gl.bufferData(this.gl.ARRAY_BUFFER, this.base64ToFloat(modelData.tans), this.gl.STATIC_DRAW);
+			modelBuffers.verticesPositionBuffer = [];
+			modelBuffers.verticesNormalBuffer = [];
+			modelBuffers.verticesTextureCoordBuffer = [];
+			modelBuffers.verticesTangentBuffer = [];
+			modelBuffers.vertexCount = [];
+			modelBuffers.verticesMorphBuffer = [];
+			modelBuffers.verticesNormalMorphBuffer = [];
 
 			modelBuffers.verticesIndexBuffer = [];
 			modelBuffers.indexSizes = [];
 			for (let i=0, count=0; i < modelData.figures.length; i++) {
+				modelBuffers.verticesPositionBuffer[i] = this.gl.createBuffer();
+				this.gl.bindBuffer(this.gl.ARRAY_BUFFER, modelBuffers.verticesPositionBuffer[i]);
+				this.gl.bufferData(this.gl.ARRAY_BUFFER, this.base64ToFloat(modelData.figures[i].verts), this.gl.STATIC_DRAW);
+				modelBuffers.vertexCount[i] = this.gl.getBufferParameter(this.gl.ARRAY_BUFFER, this.gl.BUFFER_SIZE)/4;
+
+				modelBuffers.verticesNormalBuffer[i] = this.gl.createBuffer();
+				this.gl.bindBuffer(this.gl.ARRAY_BUFFER, modelBuffers.verticesNormalBuffer[i]);
+				this.gl.bufferData(this.gl.ARRAY_BUFFER, this.base64ToFloat(modelData.figures[i].vertsn), this.gl.STATIC_DRAW);
+
+				modelBuffers.verticesTextureCoordBuffer[i] = this.gl.createBuffer();
+				this.gl.bindBuffer(this.gl.ARRAY_BUFFER, modelBuffers.verticesTextureCoordBuffer[i]);
+				this.gl.bufferData(this.gl.ARRAY_BUFFER, this.base64ToFloat(modelData.figures[i].texts), this.gl.STATIC_DRAW);
+
+				modelBuffers.verticesTangentBuffer[i] = this.gl.createBuffer();
+				this.gl.bindBuffer(this.gl.ARRAY_BUFFER, modelBuffers.verticesTangentBuffer[i]);
+				this.gl.bufferData(this.gl.ARRAY_BUFFER, this.base64ToFloat(modelData.figures[i].tans), this.gl.STATIC_DRAW);
+
+				// return dummy morph
+				modelBuffers.verticesMorphBuffer[i] = this.gl.createBuffer();
+				this.gl.bindBuffer(this.gl.ARRAY_BUFFER, modelBuffers.verticesMorphBuffer[i]);
+				this.gl.bufferData(this.gl.ARRAY_BUFFER, new Float32Array(0), this.gl.STATIC_DRAW);
+
+				modelBuffers.verticesNormalMorphBuffer[i] = this.gl.createBuffer();
+				this.gl.bindBuffer(this.gl.ARRAY_BUFFER, modelBuffers.verticesNormalMorphBuffer[i]);
+				this.gl.bufferData(this.gl.ARRAY_BUFFER, new Float32Array(0), this.gl.STATIC_DRAW);
+
 				for (let j=0; j < modelData.figures[i].surfaces.length; j++, count++) {
 					modelBuffers.verticesIndexBuffer[count] = this.gl.createBuffer();
 					this.gl.bindBuffer(this.gl.ELEMENT_ARRAY_BUFFER, modelBuffers.verticesIndexBuffer[count]);
@@ -246,15 +263,6 @@ App.Art.Engine = class {
 	}
 
 	initMorphs(modelBuffers, modelData) {
-		// return dummy morph
-		modelBuffers.verticesMorphBuffer = this.gl.createBuffer();
-		this.gl.bindBuffer(this.gl.ARRAY_BUFFER, modelBuffers.verticesMorphBuffer);
-		this.gl.bufferData(this.gl.ARRAY_BUFFER, new Float32Array(0), this.gl.STATIC_DRAW);
-
-		modelBuffers.verticesNormalMorphBuffer = this.gl.createBuffer();
-		this.gl.bindBuffer(this.gl.ARRAY_BUFFER, modelBuffers.verticesNormalMorphBuffer);
-		this.gl.bufferData(this.gl.ARRAY_BUFFER, new Float32Array(0), this.gl.STATIC_DRAW);
-
 		window.sceneBlocks = {}; // automatically populated during loading of morphs
 
 		let promisedMorphs = [];
@@ -536,32 +544,33 @@ App.Art.Engine = class {
 			this.gl.uniformMatrix4fv(this.gl.getUniformLocation(this.shaderProgram, "matScale"), false, new Float32Array(this.matrixFlatten(matScale)));
 			this.gl.uniformMatrix4fv(this.gl.getUniformLocation(this.shaderProgram, "matRot"), false, new Float32Array(this.matrixFlatten(matRot)));
 
-			// bind vertex buffers
-			this.gl.bindBuffer(this.gl.ARRAY_BUFFER, modelBuffers.verticesPositionBuffer);
-			this.gl.vertexAttribPointer(this.vertexPositionAttribute, 3, this.gl.FLOAT, false, 0, 0);
+			for (let i=0, count=0; i < modelParams.figures.length; i++) {
+				if(!modelParams.figures[i].visible) {
+					count += modelParams.figures[i].surfaces.length;
+					continue;
+				}
 
-			this.gl.bindBuffer(this.gl.ARRAY_BUFFER, modelBuffers.verticesTextureCoordBuffer);
-			this.gl.vertexAttribPointer(this.textureCoordAttribute, 2, this.gl.FLOAT, false, 0, 0);
+				// bind vertex buffers per figure
+				this.gl.bindBuffer(this.gl.ARRAY_BUFFER, modelBuffers.verticesPositionBuffer[i]);
+				this.gl.vertexAttribPointer(this.vertexPositionAttribute, 3, this.gl.FLOAT, false, 0, 0);
 
-			this.gl.bindBuffer(this.gl.ARRAY_BUFFER, modelBuffers.verticesNormalBuffer);
-			this.gl.vertexAttribPointer(this.vertexNormalAttribute, 3, this.gl.FLOAT, false, 0, 0);
+				this.gl.bindBuffer(this.gl.ARRAY_BUFFER, modelBuffers.verticesTextureCoordBuffer[i]);
+				this.gl.vertexAttribPointer(this.textureCoordAttribute, 2, this.gl.FLOAT, false, 0, 0);
 
-			this.gl.bindBuffer(this.gl.ARRAY_BUFFER, modelBuffers.verticesTangentBuffer);
-			this.gl.vertexAttribPointer(this.vertexTangentAttribute, 3, this.gl.FLOAT, false, 0, 0);
+				this.gl.bindBuffer(this.gl.ARRAY_BUFFER, modelBuffers.verticesNormalBuffer[i]);
+				this.gl.vertexAttribPointer(this.vertexNormalAttribute, 3, this.gl.FLOAT, false, 0, 0);
 
-			this.gl.bindBuffer(this.gl.ARRAY_BUFFER, modelBuffers.verticesMorphBuffer);
-			this.gl.vertexAttribPointer(this.vertexPositionMorphAttribute, 3, this.gl.FLOAT, false, 0, 0);
+				this.gl.bindBuffer(this.gl.ARRAY_BUFFER, modelBuffers.verticesTangentBuffer[i]);
+				this.gl.vertexAttribPointer(this.vertexTangentAttribute, 3, this.gl.FLOAT, false, 0, 0);
 
-			this.gl.bindBuffer(this.gl.ARRAY_BUFFER, modelBuffers.verticesNormalMorphBuffer);
-			this.gl.vertexAttribPointer(this.vertexNormalMorphAttribute, 3, this.gl.FLOAT, false, 0, 0);
+				this.gl.bindBuffer(this.gl.ARRAY_BUFFER, modelBuffers.verticesMorphBuffer[i]);
+				this.gl.vertexAttribPointer(this.vertexPositionMorphAttribute, 3, this.gl.FLOAT, false, 0, 0);
 
-			// bind materials per surface and set uniforms
-			for (let i=0, count=0; i < modelParams.figures.length; i++) {
-				for (let j=0; j < modelParams.figures[i].surfaces.length; j++, count++) {
-					if(!modelParams.figures[i].visible) {
-						continue;
-					}
+				this.gl.bindBuffer(this.gl.ARRAY_BUFFER, modelBuffers.verticesNormalMorphBuffer[i]);
+				this.gl.vertexAttribPointer(this.vertexNormalMorphAttribute, 3, this.gl.FLOAT, false, 0, 0);
 
+				// bind materials per surface and set uniforms
+				for (let j=0; j < modelParams.figures[i].surfaces.length; j++, count++) {
 					let visible = modelParams.figures[i].surfaces[j].visible;
 
 					for (let h=0; h < modelParams.figures[i].surfaces[j].matIds.length; h++) {
@@ -615,14 +624,14 @@ App.Art.Engine = class {
 
 	applyMorphs(modelParams, modelBuffers) {
 		if(modelBuffers.oldMorphValues !== JSON.stringify(modelParams.morphs) + JSON.stringify(modelParams.figures)) {
-			let vertexPositionMorph = new Float32Array(modelBuffers.vertexCount);
-			let vertexNormalMorph = new Float32Array(modelBuffers.vertexCount);
-
 			for (let f=0; f < modelParams.figures.length; f++) {
 				if(!modelParams.visible || !modelParams.figures[f].visible) {
 					continue;
 				}
 
+				let vertexPositionMorph = new Float32Array(modelBuffers.vertexCount[f]);
+				let vertexNormalMorph = new Float32Array(modelBuffers.vertexCount[f]);
+
 				for(let m=0; m < modelParams.morphs.length; m++) {
 					let morphValue = modelParams.morphs[m].value;
 
@@ -644,13 +653,13 @@ App.Art.Engine = class {
 						}
 					}
 				}
-			}
 
-			this.gl.bindBuffer(this.gl.ARRAY_BUFFER, modelBuffers.verticesMorphBuffer);
-			this.gl.bufferData(this.gl.ARRAY_BUFFER, vertexPositionMorph, this.gl.STATIC_DRAW);
+				this.gl.bindBuffer(this.gl.ARRAY_BUFFER, modelBuffers.verticesMorphBuffer[f]);
+				this.gl.bufferData(this.gl.ARRAY_BUFFER, vertexPositionMorph, this.gl.STATIC_DRAW);
 
-			this.gl.bindBuffer(this.gl.ARRAY_BUFFER, modelBuffers.verticesNormalMorphBuffer);
-			this.gl.bufferData(this.gl.ARRAY_BUFFER, vertexNormalMorph, this.gl.STATIC_DRAW);
+				this.gl.bindBuffer(this.gl.ARRAY_BUFFER, modelBuffers.verticesNormalMorphBuffer[f]);
+				this.gl.bufferData(this.gl.ARRAY_BUFFER, vertexNormalMorph, this.gl.STATIC_DRAW);
+			}
 
 			modelBuffers.oldMorphValues = JSON.stringify(modelParams.morphs) + JSON.stringify(modelParams.figures);
 		}