diff --git a/src/art/artJS.js b/src/art/artJS.js
index 565a40030b61d6b4b56c7fb7091256200b412ee2..cb90dab068849f33128ec2294d2772a48ee0ac75 100644
--- a/src/art/artJS.js
+++ b/src/art/artJS.js
@@ -211,17 +211,17 @@ App.Art.webglInitialize = function() {
 		// load model/morphs/textures assets
 		let sceneData = App.Art.sceneGetData();
 		// load default dictionary containing camera/light/morph/material values
-		let sceneParams = App.Art.sceneGetParams();
-		sceneParams.lockView = false;
-		sceneParams.resetView = false;
-		sceneParams.faceView = true;
+		let scene = App.Art.sceneGetParams();
+		scene.lockView = false;
+		scene.resetView = false;
+		scene.faceView = true;
+		scene.camera.xr = -6;
+		scene.camera.z = -275;
+		scene.camera.y = 127;
+		scene.camera.fov = 40;
 
-		sceneParams.camera.xr = -6;
-		sceneParams.camera.z = -275;
-		sceneParams.camera.y = 127;
-		sceneParams.camera.fov = 40;
-
-		App.Art.defaultSceneParams = JSON.parse(JSON.stringify(sceneParams));
+		App.Art.scenes = {};
+		App.Art.defaultScene = JSON.parse(JSON.stringify(scene));
 
 		// start Webgl engine, textures are streamed asynchronously
 		App.Art.engine = new App.Art.Engine();
@@ -259,20 +259,21 @@ App.Art.webglArtElement = function(slave, artSize) {
 	container.innerText = "Loading...";
 
 	container.addEventListener("engineLoaded", function(e) {
-		// when engine is ready, attach default scene parameters to new slaves
-		if ((typeof slave.sceneParams == "undefined") || slave.sceneParams === "") {
-			slave.sceneParams = JSON.parse(JSON.stringify(App.Art.defaultSceneParams));
+		// when engine is ready, attach default scene to new slaves
+		if (!(slave.ID in App.Art.scenes)) {
+			App.Art.scenes[slave.ID] = JSON.parse(JSON.stringify(App.Art.defaultScene));
 		}
+		let scene = App.Art.scenes[slave.ID];
 
 		// apply the model transforms
-		App.Art.applySurfaces(slave);
-		App.Art.applyMaterials(slave);
-		App.Art.applyMorphs(slave);
+		App.Art.applySurfaces(slave, scene);
+		App.Art.applyMaterials(slave, scene);
+		App.Art.applyMorphs(slave, scene);
 
 		// draw on canvas and create UI
 		container.innerText = "";
-		let canvas = App.Art.createWebglUI(container, slave, artSize);
-		App.Art.engine.render(slave.sceneParams, canvas);
+		let canvas = App.Art.createWebglUI(container, slave, artSize, scene);
+		App.Art.engine.render(scene, canvas);
 	}, true);
 
 	container.addEventListener("engineFailed", function(e) {
diff --git a/src/art/webgl/art.js b/src/art/webgl/art.js
index 8bdc318c31891de569ec7ffac90d9feeb23749a1..f3a78a042584dc83f9dc28c560e81f41c535f08f 100644
--- a/src/art/webgl/art.js
+++ b/src/art/webgl/art.js
@@ -1,39 +1,39 @@
-App.Art.getMaterialById = function(sceneParams, id) {
-	for (let i =0; i < sceneParams.materials.length; i++) {
-		if(sceneParams.materials[i].matId === id) {
-			return sceneParams.materials[i];
+App.Art.getMaterialById = function(scene, id) {
+	for (let i =0; i < scene.materials.length; i++) {
+		if(scene.materials[i].matId === id) {
+			return scene.materials[i];
 		}
 	}
 	return null;
 };
 
-App.Art.getMorphById = function(sceneParams, id) {
-	for (let i =0; i < sceneParams.model.morphs.length; i++) {
-		if(sceneParams.model.morphs[i].morphId === id) {
-			return sceneParams.model.morphs[i];
+App.Art.getMorphById = function(scene, id) {
+	for (let i =0; i < scene.model.morphs.length; i++) {
+		if(scene.model.morphs[i].morphId === id) {
+			return scene.model.morphs[i];
 		}
 	}
 	return null;
 };
 
-App.Art.getSurfaceById = function(sceneParams, id) {
-	for (let i=0, count=0; i < sceneParams.model.figures.length; i++) {
-		for (let j=0; j < sceneParams.model.figures[i].surfaces.length; j++, count++) {
-			if(sceneParams.model.figures[i].surfaces[j].surfaceId === id) {
-				return sceneParams.model.figures[i].surfaces[j];
+App.Art.getSurfaceById = function(scene, id) {
+	for (let i=0, count=0; i < scene.model.figures.length; i++) {
+		for (let j=0; j < scene.model.figures[i].surfaces.length; j++, count++) {
+			if(scene.model.figures[i].surfaces[j].surfaceId === id) {
+				return scene.model.figures[i].surfaces[j];
 			}
 		}
 	}
 	return null;
 };
 
-App.Art.resetMorphs = function(slave) {
-	for (let i =0; i < slave.sceneParams.model.morphs.length; i++) {
-		slave.sceneParams.model.morphs[i].value = App.Art.defaultSceneParams.model.morphs[i].value;
+App.Art.resetMorphs = function(slave, scene) {
+	for (let i =0; i < scene.model.morphs.length; i++) {
+		scene.model.morphs[i].value = App.Art.defaultScene.model.morphs[i].value;
 	}
 };
 
-App.Art.applySurfaces = function(slave) {
+App.Art.applySurfaces = function(slave, scene) {
 	let surfaces = [];
 
 	if (slave.dick !== 0 || (!(slave.scrotum <= 0 || slave.balls <= 0))) {
@@ -176,19 +176,18 @@ App.Art.applySurfaces = function(slave) {
 	surfaces.push(["Genitalia",	"matId", skin + "Genitalia"]);
 	surfaces.push(["Anus", "matId", skin + "Anus"]);
 
-	let sceneParams = slave.sceneParams;
-	for (let i=0, count=0; i < sceneParams.model.figures.length; i++) {
-		for (let j=0; j < sceneParams.model.figures[i].surfaces.length; j++, count++) {
+	for (let i=0, count=0; i < scene.model.figures.length; i++) {
+		for (let j=0; j < scene.model.figures[i].surfaces.length; j++, count++) {
 			for (let h =0; h < surfaces.length; h++) {
-				if (sceneParams.model.figures[i].surfaces[j].surfaceId === surfaces[h][0]) {
-					sceneParams.model.figures[i].surfaces[j][surfaces[h][1]] = surfaces[h][2];
+				if (scene.model.figures[i].surfaces[j].surfaceId === surfaces[h][0]) {
+					scene.model.figures[i].surfaces[j][surfaces[h][1]] = surfaces[h][2];
 				}
 			}
 		}
 	}
 };
 
-App.Art.applyMaterials = function(slave) {
+App.Art.applyMaterials = function(slave, scene) {
 	let materials = [];
 
 	function hexToRgb(hex) {
@@ -431,17 +430,16 @@ App.Art.applyMaterials = function(slave) {
 			break;
 	}
 
-	let sceneParams = slave.sceneParams;
-	for (let i =0; i < sceneParams.materials.length; i++) {
+	for (let i =0; i < scene.materials.length; i++) {
 		for (let j =0; j < materials.length; j++) {
-			if (sceneParams.materials[i].matId === materials[j][0]) {
-				sceneParams.materials[i][materials[j][1]] = materials[j][2];
+			if (scene.materials[i].matId === materials[j][0]) {
+				scene.materials[i][materials[j][1]] = materials[j][2];
 			}
 		}
 	}
 };
 
-App.Art.applyMorphs = function(slave) {
+App.Art.applyMorphs = function(slave, scene) {
 	let morphs = [];
 
 	function convertRange(sourceMin, sourceMax, targetMin, targetMax, value) {
@@ -573,7 +571,7 @@ App.Art.applyMorphs = function(slave) {
 	morphs.push(["areolae", convertRange(0, 4, 0, 5, slave.areolae)]);
 	morphs.push(["shoulders", convertRange(-2, 2, -1.5, 1.5, slave.shoulders)]);
 	morphs.push(["lips", convertRange(0, 100, -1, 3, slave.lips)]);
-	slave.sceneParams.transform.scale = slave.height/175; // height by object transform
+	scene.transform.scale = slave.height/175; // height by object transform
 	if (slave.muscles > 0) {
 		morphs.push(["muscles", slave.muscles/50]);
 	}
@@ -619,13 +617,12 @@ App.Art.applyMorphs = function(slave) {
 		morphs.push(["amputeeRightLeg", 1]);
 	}
 
-	App.Art.resetMorphs(slave);
+	App.Art.resetMorphs(slave, scene);
 
-	let sceneParams = slave.sceneParams;
-	for (let i =0; i < sceneParams.model.morphs.length; i++) {
+	for (let i =0; i < scene.model.morphs.length; i++) {
 		for (let j =0; j < morphs.length; j++) {
-			if (sceneParams.model.morphs[i].morphId === morphs[j][0]) {
-				sceneParams.model.morphs[i].value = morphs[j][1];
+			if (scene.model.morphs[i].morphId === morphs[j][0]) {
+				scene.model.morphs[i].value = morphs[j][1];
 			}
 		}
 	}
diff --git a/src/art/webgl/ui.js b/src/art/webgl/ui.js
index 97842707f051e6f383f095b179785763780da80c..ee5c935d7548274931534ec39ed3c041ad57bec3 100644
--- a/src/art/webgl/ui.js
+++ b/src/art/webgl/ui.js
@@ -1,6 +1,6 @@
 App.Art.isDraggingCanvas = false;
 
-App.Art.createWebglUI = function(container, slave, artSize) {
+App.Art.createWebglUI = function(container, slave, artSize, scene) {
 	let lockViewDisabled = "resources/webgl/ui/lockViewDisabled.png";
 	let lockViewEnabled = "resources/webgl/ui/lockViewEnabled.png";
 	let faceViewDisabled = "resources/webgl/ui/faceViewDisabled.png";
@@ -19,76 +19,76 @@ App.Art.createWebglUI = function(container, slave, artSize) {
 	let btnLockView = document.createElement("input");
 	btnLockView.setAttribute("style", "display: flex; width: 100%; position: relative; border: 0px; padding: 0px; background-color: transparent;");
 	btnLockView.setAttribute("type", "image");
-	btnLockView.setAttribute("src", slave.sceneParams.lockView ? lockViewDisabled : lockViewEnabled);
+	btnLockView.setAttribute("src", scene.lockView ? lockViewDisabled : lockViewEnabled);
 
 	// btnFaceView
 	let btnFaceView = document.createElement("input");
 	btnFaceView.setAttribute("style", "display: flex; width: 100%; position: relative; border: 0px; padding: 0px; background-color: transparent;");
 	btnFaceView.setAttribute("type", "image");
-	btnFaceView.setAttribute("src", slave.sceneParams.faceView ? faceViewEnabled : faceViewDisabled);
+	btnFaceView.setAttribute("src", scene.faceView ? faceViewEnabled : faceViewDisabled);
 
 	// btnResetView
 	let btnResetView = document.createElement("input");
 	btnResetView.setAttribute("style", "display: flex; width: 100%; position: relative; border: 0px; padding: 0px; background-color: transparent;");
 	btnResetView.setAttribute("type", "image");
-	btnResetView.setAttribute("src", slave.sceneParams.resetView ? resetViewEnabled : resetViewDisabled);
+	btnResetView.setAttribute("src", scene.resetView ? resetViewEnabled : resetViewDisabled);
 
 	// events
 	btnLockView.onclick = function(e){
-		slave.sceneParams.lockView = !slave.sceneParams.lockView;
+		scene.lockView = !scene.lockView;
 
-		btnLockView.src = slave.sceneParams.lockView ? lockViewDisabled : lockViewEnabled;
+		btnLockView.src = scene.lockView ? lockViewDisabled : lockViewEnabled;
 	};
 
 	btnFaceView.onclick = function(e){
-		slave.sceneParams.resetView = true;
-		slave.sceneParams.faceView = false;
+		scene.resetView = true;
+		scene.faceView = false;
 		btnFaceView.src = faceViewDisabled;
 		btnResetView.src = resetViewEnabled;
 
-		slave.sceneParams.camera.y = slave.height-5;
-		slave.sceneParams.transform.yr = 0;
-		slave.sceneParams.camera.z = -40 - slave.height/20;
-		App.Art.engine.render(slave.sceneParams, cvs);
+		scene.camera.y = slave.height-5;
+		scene.transform.yr = 0;
+		scene.camera.z = -40 - slave.height/20;
+		App.Art.engine.render(scene, cvs);
 	};
 
 	btnResetView.onclick = function(e){
-		slave.sceneParams.resetView = false;
-		slave.sceneParams.faceView = true;
+		scene.resetView = false;
+		scene.faceView = true;
 		btnResetView.src = resetViewDisabled;
 		btnFaceView.src = faceViewEnabled;
 
-		slave.sceneParams.camera.y = App.Art.defaultSceneParams.camera.y;
-		slave.sceneParams.transform.yr = App.Art.defaultSceneParams.transform.yr;
-		slave.sceneParams.camera.z = App.Art.defaultSceneParams.camera.z;
-		App.Art.engine.render(slave.sceneParams, cvs);
+		scene.camera.y = App.Art.defaultscene.camera.y;
+		scene.transform.yr = App.Art.defaultscene.transform.yr;
+		scene.camera.z = App.Art.defaultscene.camera.z;
+		App.Art.engine.render(scene, cvs);
 	};
 
 	cvs.onmousemove = function(e){
-		if(slave.sceneParams.lockView){ return; }
+		if(scene.lockView){ return; }
 		if(!App.Art.isDraggingCanvas){ return; }
 		e.preventDefault();
 		e.stopPropagation();
 
-		slave.sceneParams.resetView = true;
-		slave.sceneParams.faceView = true;
+		scene.resetView = true;
+		scene.faceView = true;
 		btnResetView.src = resetViewEnabled;
 		btnFaceView.src = faceViewEnabled;
 
-		slave.sceneParams.camera.y = slave.sceneParams.camera.y + e.movementY/10;
-		slave.sceneParams.transform.yr = slave.sceneParams.transform.yr + e.movementX*5;
-		App.Art.engine.render(slave.sceneParams, cvs);
+		scene.camera.y = scene.camera.y + e.movementY/10;
+		scene.transform.yr = scene.transform.yr + e.movementX*5;
+		App.Art.engine.render(scene, cvs);
 	};
 
 	cvs.onmousedown = function(e){
-		if(slave.sceneParams.lockView){ return; }
+		if(scene.lockView){ return; }
 		e.preventDefault();
 		e.stopPropagation();
 		App.Art.isDraggingCanvas=true;
 	};
 
 	cvs.onmouseup = function(e){
-		if(slave.sceneParams.lockView){ return; }
+		if(scene.lockView){ return; }
 		if(!App.Art.isDraggingCanvas){ return; }
 		e.preventDefault();
 		e.stopPropagation();
@@ -96,7 +96,7 @@ App.Art.createWebglUI = function(container, slave, artSize) {
 	};
 
 	cvs.onmouseout = function(e){
-		if(slave.sceneParams.lockView){ return; }
+		if(scene.lockView){ return; }
 		if(!App.Art.isDraggingCanvas){ return; }
 		e.preventDefault();
 		e.stopPropagation();
@@ -104,23 +104,23 @@ App.Art.createWebglUI = function(container, slave, artSize) {
 	};
 
 	cvs.onwheel = function(e){
-		if(slave.sceneParams.lockView){ return; }
+		if(scene.lockView){ return; }
 
-		slave.sceneParams.resetView = true;
-		slave.sceneParams.faceView = true;
+		scene.resetView = true;
+		scene.faceView = true;
 		btnResetView.src = resetViewEnabled;
 		btnFaceView.src = faceViewEnabled;
 
-		slave.sceneParams.camera.z = slave.sceneParams.camera.z - e.deltaY/7;
+		scene.camera.z = scene.camera.z - e.deltaY/7;
 
-		if (slave.sceneParams.camera.z < -900) {
-			slave.sceneParams.camera.z = -900;
+		if (scene.camera.z < -900) {
+			scene.camera.z = -900;
 		}
-		if (slave.sceneParams.camera.z > -10) {
-			slave.sceneParams.camera.z = -10;
+		if (scene.camera.z > -10) {
+			scene.camera.z = -10;
 		}
 
-		App.Art.engine.render(slave.sceneParams, cvs);
+		App.Art.engine.render(scene, cvs);
 		return false;
 	};
 
@@ -152,8 +152,8 @@ App.Art.createWebglUI = function(container, slave, artSize) {
 		container.setAttribute("style", "position: relative; width: " + sz[0] + "px; height: " + sz[1] + "px;");
 	}
 
-	slave.sceneParams.settings.rwidth = cvs.width*2;
-	slave.sceneParams.settings.rheight = cvs.height*2;
+	scene.settings.rwidth = cvs.width*2;
+	scene.settings.rheight = cvs.height*2;
 
 	return cvs;
 };
diff --git a/src/data/backwardsCompatibility/datatypeCleanup.js b/src/data/backwardsCompatibility/datatypeCleanup.js
index b38a17398dfb7a3a6c2e27605d681b516a66bf54..605e35f3d0188d7c0b59ecee9ade0a9b77fd49b8 100644
--- a/src/data/backwardsCompatibility/datatypeCleanup.js
+++ b/src/data/backwardsCompatibility/datatypeCleanup.js
@@ -30,9 +30,6 @@ App.Entity.Utils.SlaveDataSchemeCleanup = (function() {
 		if (slave.hasOwnProperty("tired")) {
 			delete slave.tired;
 		}
-		if (typeof slave.sceneParams !== 'undefined') {
-			delete slave.sceneParams;
-		}
 	}
 
 	/**
diff --git a/src/js/SlaveState.js b/src/js/SlaveState.js
index 66d5a7825877c54ebc472b6febd406a8315db776..2f1b28b3721f0a80e6d318d0a78824fad418cf85 100644
--- a/src/js/SlaveState.js
+++ b/src/js/SlaveState.js
@@ -474,7 +474,6 @@ App.Entity.EyeState = class EyeState {
 
 App.Entity.SlaveState = class SlaveState {
 	constructor() {
-		this.sceneParams = "";
 		/** Slave's current name */
 		this.slaveName = "blank";
 		/** Slave's current surname