diff --git a/testbed/common/ConcaveMesh.cpp b/testbed/common/ConcaveMesh.cpp
index a764a1e6..40c35156 100644
--- a/testbed/common/ConcaveMesh.cpp
+++ b/testbed/common/ConcaveMesh.cpp
@@ -27,13 +27,17 @@
 #include "ConcaveMesh.h"
 
 // Constructor
-ConcaveMesh::ConcaveMesh(bool createRigidBody, reactphysics3d::PhysicsCommon& physicsCommon, rp3d::PhysicsWorld* physicsWorld, const std::string& meshPath)
+ConcaveMesh::ConcaveMesh(bool createRigidBody, reactphysics3d::PhysicsCommon& physicsCommon, rp3d::PhysicsWorld* physicsWorld,
+                         const std::string& meshPath, const rp3d::Vector3& scaling)
            : PhysicsObject(physicsCommon, meshPath), mPhysicsWorld(physicsWorld), mVBOVertices(GL_ARRAY_BUFFER),
              mVBONormals(GL_ARRAY_BUFFER), mVBOTextureCoords(GL_ARRAY_BUFFER),
              mVBOIndices(GL_ELEMENT_ARRAY_BUFFER) {
 
     // Compute the scaling matrix
-    mScalingMatrix = openglframework::Matrix4::identity();
+    mScalingMatrix = openglframework::Matrix4(scaling.x, 0, 0, 0,
+                                              0, scaling.y, 0, 0,
+                                              0, 0, scaling.z, 0,
+                                              0, 0, 0, 1);
 
     mPhysicsTriangleMesh = mPhysicsCommon.createTriangleMesh();
 
@@ -53,7 +57,7 @@ ConcaveMesh::ConcaveMesh(bool createRigidBody, reactphysics3d::PhysicsCommon& ph
 
     // Create the collision shape for the rigid body (convex mesh shape) and
     // do not forget to delete it at the end
-    mConcaveShape = mPhysicsCommon.createConcaveMeshShape(mPhysicsTriangleMesh);
+    mConcaveShape = mPhysicsCommon.createConcaveMeshShape(mPhysicsTriangleMesh, scaling);
 
     mPreviousTransform = rp3d::Transform::identity();
 
diff --git a/testbed/common/ConcaveMesh.h b/testbed/common/ConcaveMesh.h
index cf3d1d57..1e455f12 100644
--- a/testbed/common/ConcaveMesh.h
+++ b/testbed/common/ConcaveMesh.h
@@ -75,7 +75,8 @@ class ConcaveMesh : public PhysicsObject {
         // -------------------- Methods -------------------- //
 
         /// Constructor
-        ConcaveMesh(bool createRigidBody, reactphysics3d::PhysicsCommon& physicsCommon, rp3d::PhysicsWorld* physicsWorld, const std::string& meshPath);
+        ConcaveMesh(bool createRigidBody, reactphysics3d::PhysicsCommon& physicsCommon, rp3d::PhysicsWorld* physicsWorld,
+                    const std::string& meshPath, const reactphysics3d::Vector3& scaling = rp3d::Vector3(1, 1, 1));
 
         /// Destructor
         virtual ~ConcaveMesh() override;
diff --git a/testbed/common/ConvexMesh.cpp b/testbed/common/ConvexMesh.cpp
index 8e17bd3d..9f093701 100755
--- a/testbed/common/ConvexMesh.cpp
+++ b/testbed/common/ConvexMesh.cpp
@@ -28,13 +28,17 @@
 #include <unordered_set>
 
 // Constructor
-ConvexMesh::ConvexMesh(bool createRigidBody, rp3d::PhysicsCommon& physicsCommon, rp3d::PhysicsWorld* physicsWorld, const std::string& meshPath)
+ConvexMesh::ConvexMesh(bool createRigidBody, rp3d::PhysicsCommon& physicsCommon, rp3d::PhysicsWorld* physicsWorld,
+                       const std::string& meshPath, const rp3d::Vector3& scaling)
            : PhysicsObject(physicsCommon, meshPath), mPhysicsWorld(physicsWorld), mVBOVertices(GL_ARRAY_BUFFER),
              mVBONormals(GL_ARRAY_BUFFER), mVBOTextureCoords(GL_ARRAY_BUFFER),
              mVBOIndices(GL_ELEMENT_ARRAY_BUFFER) {
 
     // Compute the scaling matrix
-    mScalingMatrix = openglframework::Matrix4::identity();
+    mScalingMatrix = openglframework::Matrix4(scaling.x, 0, 0, 0,
+                                              0, scaling.y, 0, 0,
+                                              0, 0, scaling.z, 0,
+                                              0, 0, 0, 1);
 
     // Polygon faces descriptions for the polyhedron
     mPolygonFaces = new rp3d::PolygonVertexArray::PolygonFace[getNbFaces(0)];
@@ -71,7 +75,7 @@ ConvexMesh::ConvexMesh(bool createRigidBody, rp3d::PhysicsCommon& physicsCommon,
 
     // Create the collision shape for the rigid body (convex mesh shape) and do
     // not forget to delete it at the end
-    mConvexShape = mPhysicsCommon.createConvexMeshShape(mPolyhedronMesh);
+    mConvexShape = mPhysicsCommon.createConvexMeshShape(mPolyhedronMesh, scaling);
 
     mPreviousTransform = rp3d::Transform::identity();
 
diff --git a/testbed/common/ConvexMesh.h b/testbed/common/ConvexMesh.h
index 1c03986c..bc8bd0c4 100644
--- a/testbed/common/ConvexMesh.h
+++ b/testbed/common/ConvexMesh.h
@@ -88,7 +88,8 @@ class ConvexMesh : public PhysicsObject {
         // -------------------- Methods -------------------- //
 
         /// Constructor
-        ConvexMesh(bool createRigidBody, rp3d::PhysicsCommon& physicsCommon, rp3d::PhysicsWorld* physicsWorld, const std::string& meshPath);
+        ConvexMesh(bool createRigidBody, rp3d::PhysicsCommon& physicsCommon, rp3d::PhysicsWorld* physicsWorld,
+                   const std::string& meshPath, const reactphysics3d::Vector3& scaling = rp3d::Vector3(1, 1, 1));
 
         /// Destructor
         virtual ~ConvexMesh() override;
diff --git a/testbed/common/HeightField.cpp b/testbed/common/HeightField.cpp
index 458d5de8..2e88dc3e 100644
--- a/testbed/common/HeightField.cpp
+++ b/testbed/common/HeightField.cpp
@@ -35,7 +35,7 @@ HeightField::HeightField(bool createRigidBody, reactphysics3d::PhysicsCommon& ph
 
     // Compute the scaling matrix
     //mScalingMatrix = openglframework::Matrix4::identity();
-    mScalingMatrix = openglframework::Matrix4(2, 0, 0, 0, 0, 2, 0, 0, 0, 0, 2, 0, 0, 0, 0, 1);
+    mScalingMatrix = openglframework::Matrix4(0.5, 0, 0, 0, 0, 0.5, 0, 0, 0, 0, 0.5, 0, 0, 0, 0, 1);
 
     // Generate the height field
     generateHeightField();
@@ -47,7 +47,7 @@ HeightField::HeightField(bool createRigidBody, reactphysics3d::PhysicsCommon& ph
     // do not forget to delete it at the end
     mHeightFieldShape = mPhysicsCommon.createHeightFieldShape(NB_POINTS_WIDTH, NB_POINTS_LENGTH, mMinHeight, mMaxHeight,
                                                    mHeightData, rp3d::HeightFieldShape::HeightDataType::HEIGHT_FLOAT_TYPE);
-    mHeightFieldShape->setScale(rp3d::Vector3(2, 2, 2));
+    mHeightFieldShape->setScale(rp3d::Vector3(0.5, 0.5, 0.5));
 
     mPreviousTransform = rp3d::Transform::identity();
 
diff --git a/testbed/meshes/pile.obj b/testbed/meshes/pile.obj
new file mode 100644
index 00000000..4459c972
--- /dev/null
+++ b/testbed/meshes/pile.obj
@@ -0,0 +1,36 @@
+# Blender v2.82 (sub 7) OBJ File: 'Pile.blend'
+# www.blender.org
+o Cube
+v 22.184696 4.733990 -22.184696
+v 22.184696 -5.811781 -22.184696
+v 22.184696 4.733990 22.184696
+v 22.184696 -5.811781 22.184696
+v -22.184696 4.733990 -22.184696
+v -22.184696 -5.811781 -22.184696
+v -22.184696 4.733990 22.184696
+v -22.184696 -5.811781 22.184696
+v 11.135588 -4.521785 11.135588
+v -11.135588 -4.521785 11.135588
+v 11.135588 -4.521785 -11.135588
+v -11.135588 -4.521785 -11.135588
+vn 0.0000 0.7666 -0.6422
+vn 0.0000 0.0000 1.0000
+vn -1.0000 0.0000 0.0000
+vn 0.0000 -1.0000 0.0000
+vn 1.0000 0.0000 0.0000
+vn 0.0000 0.0000 -1.0000
+vn 0.0000 1.0000 0.0000
+vn 0.6422 0.7666 0.0000
+vn -0.6422 0.7666 0.0000
+vn 0.0000 0.7666 0.6422
+s off
+f 7//1 3//1 9//1 10//1
+f 4//2 3//2 7//2 8//2
+f 8//3 7//3 5//3 6//3
+f 6//4 2//4 4//4 8//4
+f 2//5 1//5 3//5 4//5
+f 6//6 5//6 1//6 2//6
+f 11//7 12//7 10//7 9//7
+f 5//8 7//8 10//8 12//8
+f 3//9 1//9 11//9 9//9
+f 1//10 5//10 12//10 11//10
diff --git a/testbed/meshes/sandbox.obj b/testbed/meshes/sandbox.obj
deleted file mode 100644
index 38dbc99d..00000000
--- a/testbed/meshes/sandbox.obj
+++ /dev/null
@@ -1,116 +0,0 @@
-# Blender v2.79 (sub 0) OBJ File: ''
-# www.blender.org
-v -31.880749 -0.589469 22.622011
-v -25.786182 -0.589469 22.622011
-v -19.691614 -0.589469 22.622011
-v -13.597046 -0.589469 22.622011
-v -7.502479 -0.589469 22.622011
-v -1.407912 -0.589469 22.622011
-v 4.686658 -0.589469 22.622011
-v 10.781222 -0.589469 22.622011
-v -31.880749 -0.589469 16.527445
-v -25.786182 -0.589469 16.527445
-v -19.691614 -0.589469 16.527445
-v -13.597046 -0.589469 16.527445
-v -7.502479 -0.589469 16.527445
-v -1.407912 -0.589469 16.527445
-v 4.686658 -0.589469 16.527445
-v 10.781222 -0.589469 16.527445
-v -31.880749 -0.589469 10.432877
-v -25.786182 -0.589469 10.432877
-v -19.691614 -13.260081 10.432877
-v -13.597046 -13.260081 10.432877
-v -7.502479 -13.260081 10.432877
-v -1.407912 -13.260081 10.432877
-v 4.686658 -13.260081 10.432877
-v 10.781222 -0.589469 10.432877
-v -31.880749 -0.589469 4.338308
-v -25.786182 -0.589469 4.338308
-v -19.691614 -13.260081 4.338308
-v -13.597046 -13.260081 4.338308
-v -7.502479 -13.260081 4.338308
-v -1.407912 -13.260081 4.338308
-v 4.686658 -13.260081 4.338308
-v 10.781222 -0.589469 4.338308
-v -31.880749 -0.589469 -1.756259
-v -25.786182 -0.589469 -1.756259
-v -19.691614 -13.260081 -1.756259
-v -13.597046 -13.260081 -1.756259
-v -7.502479 -13.260081 -1.756259
-v -1.407912 -13.260081 -1.756259
-v 4.686658 -13.260081 -1.756259
-v 10.781222 -0.589469 -1.756259
-v -31.880749 -0.589469 -7.850826
-v -25.786182 -0.589469 -7.850826
-v -19.691614 -13.260081 -7.850826
-v -13.597046 -13.260081 -7.850826
-v -7.502479 -13.260081 -7.850826
-v -1.407912 -13.260081 -7.850826
-v 4.686658 -13.260081 -7.850826
-v 10.781222 -0.589469 -7.850826
-v -31.880749 -0.589469 -13.945395
-v -25.786182 -0.589469 -13.945395
-v -19.691614 -0.589469 -13.945395
-v -13.597046 -0.589469 -13.945395
-v -7.502479 -0.589469 -13.945395
-v -1.407912 -0.589469 -13.945395
-v 4.686658 -0.589469 -13.945395
-v 10.781222 -0.589469 -13.945395
-v -31.880749 -0.589469 -20.039961
-v -25.786182 -0.589469 -20.039961
-v -19.691614 -0.589469 -20.039961
-v -13.597046 -0.589469 -20.039961
-v -7.502479 -0.589469 -20.039961
-v -1.407912 -0.589469 -20.039961
-v 4.686658 -0.589469 -20.039961
-v 10.781222 -0.589469 -20.039961
-s off
-f 1 2 10 9
-f 2 3 11 10
-f 3 4 12 11
-f 4 5 13 12
-f 5 6 14 13
-f 6 7 15 14
-f 7 8 16 15
-f 9 10 18 17
-f 10 11 19 18
-f 11 12 20 19
-f 12 13 21 20
-f 13 14 22 21
-f 14 15 23 22
-f 15 16 24 23
-f 17 18 26 25
-f 18 19 27 26
-f 19 20 28 27
-f 20 21 29 28
-f 21 22 30 29
-f 22 23 31 30
-f 23 24 32 31
-f 25 26 34 33
-f 26 27 35 34
-f 27 28 36 35
-f 28 29 37 36
-f 29 30 38 37
-f 30 31 39 38
-f 31 32 40 39
-f 33 34 42 41
-f 34 35 43 42
-f 35 36 44 43
-f 36 37 45 44
-f 37 38 46 45
-f 38 39 47 46
-f 39 40 48 47
-f 41 42 50 49
-f 42 43 51 50
-f 43 44 52 51
-f 44 45 53 52
-f 45 46 54 53
-f 46 47 55 54
-f 47 48 56 55
-f 49 50 58 57
-f 50 51 59 58
-f 51 52 60 59
-f 52 53 61 60
-f 53 54 62 61
-f 54 55 63 62
-f 55 56 64 63
diff --git a/testbed/scenes/ballandsocketjoint/BallAndSocketJointScene.cpp b/testbed/scenes/ballandsocketjoint/BallAndSocketJointScene.cpp
index 19f3b5b8..681dee06 100644
--- a/testbed/scenes/ballandsocketjoint/BallAndSocketJointScene.cpp
+++ b/testbed/scenes/ballandsocketjoint/BallAndSocketJointScene.cpp
@@ -40,6 +40,8 @@ BallAndSocketJointScene::BallAndSocketJointScene(const std::string& name, Engine
 
     // Set the center of the scene
     setScenePosition(center, SCENE_RADIUS);
+    setInitZoom(1);
+    resetCameraToViewAll();
 
     mWorldSettings.worldName = name;
 }
diff --git a/testbed/scenes/ballandsocketjointschain/BallAndSocketJointsChainScene.cpp b/testbed/scenes/ballandsocketjointschain/BallAndSocketJointsChainScene.cpp
index dd09bd2c..d7541160 100644
--- a/testbed/scenes/ballandsocketjointschain/BallAndSocketJointsChainScene.cpp
+++ b/testbed/scenes/ballandsocketjointschain/BallAndSocketJointsChainScene.cpp
@@ -42,6 +42,8 @@ BallAndSocketJointsChainScene::BallAndSocketJointsChainScene(const std::string&
 
     // Set the center of the scene
     setScenePosition(center, SCENE_RADIUS);
+    setInitZoom(1.3);
+    resetCameraToViewAll();
 
     mWorldSettings.worldName = name;
 }
diff --git a/testbed/scenes/ballandsocketjointsnet/BallAndSocketJointsNetScene.cpp b/testbed/scenes/ballandsocketjointsnet/BallAndSocketJointsNetScene.cpp
index 09354545..418f6e6e 100644
--- a/testbed/scenes/ballandsocketjointsnet/BallAndSocketJointsNetScene.cpp
+++ b/testbed/scenes/ballandsocketjointsnet/BallAndSocketJointsNetScene.cpp
@@ -42,6 +42,8 @@ BallAndSocketJointsNetScene::BallAndSocketJointsNetScene(const std::string& name
 
     // Set the center of the scene
     setScenePosition(center, SCENE_RADIUS);
+    setInitZoom(1.3);
+    resetCameraToViewAll();
 
     // Gravity vector in the physics world
     rp3d::Vector3 gravity(0, rp3d::decimal(-9.81), 0);
diff --git a/testbed/scenes/boxtower/BoxTowerScene.cpp b/testbed/scenes/boxtower/BoxTowerScene.cpp
index d3d77216..0b2349ac 100644
--- a/testbed/scenes/boxtower/BoxTowerScene.cpp
+++ b/testbed/scenes/boxtower/BoxTowerScene.cpp
@@ -39,10 +39,12 @@ BoxTowerScene::BoxTowerScene(const std::string& name, EngineSettings& settings,
     std::string meshFolderPath("meshes/");
 
     // Compute the radius and the center of the scene
-    openglframework::Vector3 center(0, 5, 0);
+    openglframework::Vector3 center(0, 10, 0);
 
     // Set the center of the scene
     setScenePosition(center, SCENE_RADIUS);
+    setInitZoom(1.5);
+    resetCameraToViewAll();
 
     // Gravity vector in the physics world
     rp3d::Vector3 gravity(0, -9.81f, 0);
diff --git a/testbed/scenes/boxtower/BoxTowerScene.h b/testbed/scenes/boxtower/BoxTowerScene.h
index f52336d0..e4c2cbb0 100644
--- a/testbed/scenes/boxtower/BoxTowerScene.h
+++ b/testbed/scenes/boxtower/BoxTowerScene.h
@@ -44,7 +44,7 @@ namespace boxtowerscene {
 const float SCENE_RADIUS = 30.0f;
 const int NB_BOXES = 16;
 const openglframework::Vector3 BOX_SIZE(2, 2, 16);
-const openglframework::Vector3 FLOOR_SIZE(50, 0.5f, 50);        // Floor dimensions in meters
+const openglframework::Vector3 FLOOR_SIZE(30, 0.5f, 30);        // Floor dimensions in meters
 
 // Class BoxTowerScene
 class BoxTowerScene : public SceneDemo {
diff --git a/testbed/scenes/bridge/BridgeScene.cpp b/testbed/scenes/bridge/BridgeScene.cpp
index 7e502a2d..98721a04 100644
--- a/testbed/scenes/bridge/BridgeScene.cpp
+++ b/testbed/scenes/bridge/BridgeScene.cpp
@@ -38,10 +38,12 @@ BridgeScene::BridgeScene(const std::string& name, EngineSettings& settings, reac
     std::string meshFolderPath("meshes/");
 
     // Compute the radius and the center of the scene
-    openglframework::Vector3 center(0, 0, 0);
+    openglframework::Vector3 center(0, 5, 0);
 
     // Set the center of the scene
     setScenePosition(center, SCENE_RADIUS);
+    setInitZoom(1.1);
+    resetCameraToViewAll();
 
     mWorldSettings.worldName = name;
 }
diff --git a/testbed/scenes/collisiondetection/CollisionDetectionScene.cpp b/testbed/scenes/collisiondetection/CollisionDetectionScene.cpp
index e066f8ec..84c55312 100644
--- a/testbed/scenes/collisiondetection/CollisionDetectionScene.cpp
+++ b/testbed/scenes/collisiondetection/CollisionDetectionScene.cpp
@@ -48,6 +48,8 @@ CollisionDetectionScene::CollisionDetectionScene(const std::string& name, Engine
 
     // Set the center of the scene
     setScenePosition(center, SCENE_RADIUS);
+    setInitZoom(1.9);
+    resetCameraToViewAll();
 
     rp3d::PhysicsWorld::WorldSettings worldSettings;
     worldSettings.worldName = name;
diff --git a/testbed/scenes/collisionshapes/CollisionShapesScene.cpp b/testbed/scenes/collisionshapes/CollisionShapesScene.cpp
index 8cb457e1..05dee542 100644
--- a/testbed/scenes/collisionshapes/CollisionShapesScene.cpp
+++ b/testbed/scenes/collisionshapes/CollisionShapesScene.cpp
@@ -37,10 +37,12 @@ CollisionShapesScene::CollisionShapesScene(const std::string& name, EngineSettin
     std::string meshFolderPath("meshes/");
 
     // Compute the radius and the center of the scene
-    openglframework::Vector3 center(0, 5, 0);
+    openglframework::Vector3 center(0, 10, 0);
 
     // Set the center of the scene
     setScenePosition(center, SCENE_RADIUS);
+    setInitZoom(1.5);
+    resetCameraToViewAll();
 
     mWorldSettings.worldName = name;
 }
diff --git a/testbed/scenes/collisionshapes/CollisionShapesScene.h b/testbed/scenes/collisionshapes/CollisionShapesScene.h
index e1598ebd..04002495 100644
--- a/testbed/scenes/collisionshapes/CollisionShapesScene.h
+++ b/testbed/scenes/collisionshapes/CollisionShapesScene.h
@@ -56,7 +56,7 @@ const float CYLINDER_HEIGHT = 5.0f;
 const float CAPSULE_RADIUS = 1.0f;
 const float CAPSULE_HEIGHT = 1.0f;
 const float DUMBBELL_HEIGHT = 1.0f;
-const openglframework::Vector3 FLOOR_SIZE(50, 0.5f, 50);        // Floor dimensions in meters
+const openglframework::Vector3 FLOOR_SIZE(30, 0.5f, 30);        // Floor dimensions in meters
 
 // Class CollisionShapesScene
 class CollisionShapesScene : public SceneDemo {
diff --git a/testbed/scenes/concavemesh/ConcaveMeshScene.cpp b/testbed/scenes/concavemesh/ConcaveMeshScene.cpp
index 361f4374..8a13ac57 100644
--- a/testbed/scenes/concavemesh/ConcaveMeshScene.cpp
+++ b/testbed/scenes/concavemesh/ConcaveMeshScene.cpp
@@ -37,10 +37,12 @@ ConcaveMeshScene::ConcaveMeshScene(const std::string& name, EngineSettings& sett
     std::string meshFolderPath("meshes/");
 
     // Compute the radius and the center of the scene
-    openglframework::Vector3 center(0, 5, 0);
+    openglframework::Vector3 center(0, 20, 0);
 
     // Set the center of the scene
     setScenePosition(center, SCENE_RADIUS);
+    setInitZoom(1.5);
+    resetCameraToViewAll();
 
     mWorldSettings.worldName = name;
 }
@@ -248,7 +250,8 @@ void ConcaveMeshScene::initBodiesPositions() {
 
     // ---------- Create the triangular mesh ---------- //
 
-    mConcaveMesh->setTransform(rp3d::Transform::identity());
+
+    mConcaveMesh->setTransform(rp3d::Transform(rp3d::Vector3(15, 0, -5), rp3d::Quaternion::identity()));
 }
 
 // Destroy the physics world
diff --git a/testbed/scenes/cubes/CubesScene.cpp b/testbed/scenes/cubes/CubesScene.cpp
index be6f8a64..1061d4d7 100644
--- a/testbed/scenes/cubes/CubesScene.cpp
+++ b/testbed/scenes/cubes/CubesScene.cpp
@@ -34,13 +34,13 @@ using namespace cubesscene;
 CubesScene::CubesScene(const std::string& name, EngineSettings& settings, reactphysics3d::PhysicsCommon& physicsCommon)
       : SceneDemo(name, settings, physicsCommon, true, SCENE_RADIUS) {
 
-    iter = 0;
-
     // Compute the radius and the center of the scene
-    openglframework::Vector3 center(0, 5, 0);
+    openglframework::Vector3 center(0, 10, 0);
 
     // Set the center of the scene
     setScenePosition(center, SCENE_RADIUS);
+    setInitZoom(1.5);
+    resetCameraToViewAll();
 
     mWorldSettings.worldName = name;
 }
@@ -95,7 +95,7 @@ void CubesScene::createPhysicsWorld() {
 // Initialize the bodies positions
 void CubesScene::initBodiesPositions() {
 
-    float radius = 2.0f;
+    const float radius = 2.0f;
 
     // Create all the cubes of the scene
     std::vector<Box*>::iterator it;
diff --git a/testbed/scenes/cubes/CubesScene.h b/testbed/scenes/cubes/CubesScene.h
index 22d30f43..e4331dc1 100755
--- a/testbed/scenes/cubes/CubesScene.h
+++ b/testbed/scenes/cubes/CubesScene.h
@@ -38,7 +38,7 @@ namespace cubesscene {
 const float SCENE_RADIUS = 30.0f;                       // Radius of the scene in meters
 const int NB_CUBES = 30;                                // Number of boxes in the scene
 const openglframework::Vector3 BOX_SIZE(2, 2, 2);       // Box dimensions in meters
-const openglframework::Vector3 FLOOR_SIZE(50, 1, 50);   // Floor dimensions in meters
+const openglframework::Vector3 FLOOR_SIZE(30, 1, 30);   // Floor dimensions in meters
 
 // Class CubesScene
 class CubesScene : public SceneDemo {
@@ -53,8 +53,6 @@ class CubesScene : public SceneDemo {
         /// Box for the floor
         Box* mFloor;
 
-        unsigned int iter;
-
         /// World settings
         rp3d::PhysicsWorld::WorldSettings mWorldSettings;
 
diff --git a/testbed/scenes/cubestack/CubeStackScene.cpp b/testbed/scenes/cubestack/CubeStackScene.cpp
index 6e8f1f4e..05effb84 100644
--- a/testbed/scenes/cubestack/CubeStackScene.cpp
+++ b/testbed/scenes/cubestack/CubeStackScene.cpp
@@ -35,10 +35,12 @@ CubeStackScene::CubeStackScene(const std::string& name, EngineSettings& settings
       : SceneDemo(name, settings, physicsCommon, true, SCENE_RADIUS) {
 
     // Compute the radius and the center of the scene
-    openglframework::Vector3 center(0, 5, 0);
+    openglframework::Vector3 center(0, 16, 0);
 
     // Set the center of the scene
     setScenePosition(center, SCENE_RADIUS);
+    setInitZoom(1.9);
+    resetCameraToViewAll();
 
     mWorldSettings.worldName = name;
 }
diff --git a/testbed/scenes/cubestack/CubeStackScene.h b/testbed/scenes/cubestack/CubeStackScene.h
index e4229c86..a7e2075a 100644
--- a/testbed/scenes/cubestack/CubeStackScene.h
+++ b/testbed/scenes/cubestack/CubeStackScene.h
@@ -38,7 +38,7 @@ namespace cubestackscene {
 const float SCENE_RADIUS = 30.0f;                           // Radius of the scene in meters
 const int NB_FLOORS = 15;                                    // Number of boxes in the scene
 const openglframework::Vector3 BOX_SIZE(2, 2, 2);          // Box dimensions in meters
-const openglframework::Vector3 FLOOR_SIZE(50, 1, 50);   // Floor dimensions in meters
+const openglframework::Vector3 FLOOR_SIZE(50, 1, 20);   // Floor dimensions in meters
 
 // Class CubeStackScene
 class CubeStackScene : public SceneDemo {
diff --git a/testbed/scenes/fixedjoint/FixedJointScene.cpp b/testbed/scenes/fixedjoint/FixedJointScene.cpp
index 32f21618..5cb818c9 100644
--- a/testbed/scenes/fixedjoint/FixedJointScene.cpp
+++ b/testbed/scenes/fixedjoint/FixedJointScene.cpp
@@ -40,6 +40,8 @@ FixedJointScene::FixedJointScene(const std::string& name, EngineSettings& settin
 
     // Set the center of the scene
     setScenePosition(center, SCENE_RADIUS);
+    setInitZoom(1.1);
+    resetCameraToViewAll();
 
     mWorldSettings.worldName = name;
 }
diff --git a/testbed/scenes/heightfield/HeightFieldScene.cpp b/testbed/scenes/heightfield/HeightFieldScene.cpp
index 37fa8bce..0bb81008 100644
--- a/testbed/scenes/heightfield/HeightFieldScene.cpp
+++ b/testbed/scenes/heightfield/HeightFieldScene.cpp
@@ -39,10 +39,12 @@ HeightFieldScene::HeightFieldScene(const std::string& name, EngineSettings& sett
 	std::string meshFolderPath("meshes/");
 
     // Compute the radius and the center of the scene
-    openglframework::Vector3 center(0, 5, 0);
+    openglframework::Vector3 center(0, 17, 0);
 
     // Set the center of the scene
     setScenePosition(center, SCENE_RADIUS);
+    setInitZoom(1.5);
+    resetCameraToViewAll();
 
     mWorldSettings.worldName = name;
 }
diff --git a/testbed/scenes/hingejoint/HingeJointScene.cpp b/testbed/scenes/hingejoint/HingeJointScene.cpp
index 561e1037..1c7afcf7 100644
--- a/testbed/scenes/hingejoint/HingeJointScene.cpp
+++ b/testbed/scenes/hingejoint/HingeJointScene.cpp
@@ -40,6 +40,8 @@ HingeJointScene::HingeJointScene(const std::string& name, EngineSettings& settin
 
     // Set the center of the scene
     setScenePosition(center, SCENE_RADIUS);
+    setInitZoom(1.1);
+    resetCameraToViewAll();
 
     mWorldSettings.worldName = name;
 }
diff --git a/testbed/scenes/hingejointschain/HingeJointsChainScene.cpp b/testbed/scenes/hingejointschain/HingeJointsChainScene.cpp
index ea82c1b4..4cae6143 100644
--- a/testbed/scenes/hingejointschain/HingeJointsChainScene.cpp
+++ b/testbed/scenes/hingejointschain/HingeJointsChainScene.cpp
@@ -42,6 +42,8 @@ HingeJointsChainScene::HingeJointsChainScene(const std::string& name, EngineSett
 
     // Set the center of the scene
     setScenePosition(center, SCENE_RADIUS);
+    setInitZoom(1.3);
+    resetCameraToViewAll();
 
     // Gravity vector in the physics world
     rp3d::Vector3 gravity(0, rp3d::decimal(-9.81), 0);
diff --git a/testbed/scenes/joints/JointsScene.cpp b/testbed/scenes/joints/JointsScene.cpp
index baff2172..18c79543 100644
--- a/testbed/scenes/joints/JointsScene.cpp
+++ b/testbed/scenes/joints/JointsScene.cpp
@@ -36,10 +36,12 @@ JointsScene::JointsScene(const std::string& name, EngineSettings& settings, reac
       : SceneDemo(name, settings, physicsCommon, true, SCENE_RADIUS) {
 
     // Compute the radius and the center of the scene
-    openglframework::Vector3 center(0, 5, 0);
+    openglframework::Vector3 center(0, 8, 0);
 
     // Set the center of the scene
     setScenePosition(center, SCENE_RADIUS);
+    setInitZoom(1);
+    resetCameraToViewAll();
 
     // Gravity vector in the physics world
     rp3d::Vector3 gravity(0, rp3d::decimal(-9.81), 0);
diff --git a/testbed/scenes/joints/JointsScene.h b/testbed/scenes/joints/JointsScene.h
index 55138a66..879ec256 100644
--- a/testbed/scenes/joints/JointsScene.h
+++ b/testbed/scenes/joints/JointsScene.h
@@ -37,7 +37,7 @@ namespace jointsscene {
 // Constants
 const float SCENE_RADIUS = 30.0f;
 const openglframework::Vector3 BOX_SIZE(2, 2, 2);           // Box dimensions in meters
-const openglframework::Vector3 FLOOR_SIZE(50, 0.5f, 50);    // Floor dimensions in meters
+const openglframework::Vector3 FLOOR_SIZE(15, 0.5f, 15);    // Floor dimensions in meters
 const int NB_BALLSOCKETJOINT_BOXES = 7;                     // Number of Ball-And-Socket chain boxes
 const int NB_HINGE_BOXES = 7;                               // Number of Hinge chain boxes
 
diff --git a/testbed/scenes/pile/PileScene.cpp b/testbed/scenes/pile/PileScene.cpp
index 4cedb340..2252d8a5 100644
--- a/testbed/scenes/pile/PileScene.cpp
+++ b/testbed/scenes/pile/PileScene.cpp
@@ -37,7 +37,7 @@ PileScene::PileScene(const std::string& name, EngineSettings& settings, reactphy
     std::string meshFolderPath("meshes/");
 
     // Compute the radius and the center of the scene
-    openglframework::Vector3 center(0, 5, 0);
+    openglframework::Vector3 center(0, 15, 0);
 
     // Set the center of the scene
     setScenePosition(center, SCENE_RADIUS);
@@ -146,7 +146,7 @@ void PileScene::createPhysicsWorld() {
     for (int i=0; i<NB_MESHES; i++) {
 
         // Create a convex mesh and a corresponding rigid in the physics world
-        ConvexMesh* mesh = new ConvexMesh(true, mPhysicsCommon, mPhysicsWorld, mMeshFolderPath + "convexmesh.obj");
+        ConvexMesh* mesh = new ConvexMesh(true, mPhysicsCommon, mPhysicsWorld, mMeshFolderPath + "convexmesh.obj", rp3d::Vector3(2, 2, 2));
 
         // Set the box color
         mesh->setColor(mObjectColorDemo);
@@ -164,7 +164,7 @@ void PileScene::createPhysicsWorld() {
     // ---------- Create the triangular mesh ---------- //
 
     // Create a convex mesh and a corresponding rigid in the physics world
-    mSandbox = new ConcaveMesh(true, mPhysicsCommon, mPhysicsWorld, mMeshFolderPath + "sandbox.obj");
+    mSandbox = new ConcaveMesh(true, mPhysicsCommon, mPhysicsWorld, mMeshFolderPath + "pile.obj");
 
     // Set the mesh as beeing static
     mSandbox->getRigidBody()->setType(rp3d::BodyType::STATIC);
@@ -191,7 +191,7 @@ void PileScene::initBodiesPositions() {
         // Position
         float angle = i * 30.0f;
         rp3d::Vector3 position(radius * std::cos(angle),
-            125 + i * (DUMBBELL_HEIGHT + 0.3f),
+            90 + i * (DUMBBELL_HEIGHT + 0.3f),
             radius * std::sin(angle));
 
         mDumbbells[i]->setTransform(rp3d::Transform(position, rp3d::Quaternion::identity()));
@@ -203,7 +203,7 @@ void PileScene::initBodiesPositions() {
         // Position
         float angle = i * 30.0f;
         rp3d::Vector3 position(radius * std::cos(angle),
-            85 + i * (BOX_SIZE.y + 0.8f),
+            70 + i * (BOX_SIZE.y + 0.8f),
             radius * std::sin(angle));
 
         mBoxes[i]->setTransform(rp3d::Transform(position, rp3d::Quaternion::identity()));
@@ -215,7 +215,7 @@ void PileScene::initBodiesPositions() {
         // Position
         float angle = i * 35.0f;
         rp3d::Vector3 position(radius * std::cos(angle),
-            75 + i * (SPHERE_RADIUS + 0.8f),
+            50 + i * (SPHERE_RADIUS + 0.8f),
             radius * std::sin(angle));
 
         mSpheres[i]->setTransform(rp3d::Transform(position, rp3d::Quaternion::identity()));
@@ -227,7 +227,7 @@ void PileScene::initBodiesPositions() {
         // Position
         float angle = i * 45.0f;
         rp3d::Vector3 position(radius * std::cos(angle),
-            40 + i * (CAPSULE_HEIGHT + 0.3f),
+            30 + i * (CAPSULE_HEIGHT + 0.3f),
             radius * std::sin(angle));
 
         mCapsules[i]->setTransform(rp3d::Transform(position, rp3d::Quaternion::identity()));
@@ -239,7 +239,7 @@ void PileScene::initBodiesPositions() {
         // Position
         float angle = i * 30.0f;
         rp3d::Vector3 position(radius * std::cos(angle),
-            30 + i * (CAPSULE_HEIGHT + 0.3f),
+            10 + i * (CAPSULE_HEIGHT + 0.3f),
             radius * std::sin(angle));
 
         mConvexMeshes[i]->setTransform(rp3d::Transform(position, rp3d::Quaternion::identity()));
diff --git a/testbed/scenes/pile/PileScene.h b/testbed/scenes/pile/PileScene.h
index 429f21cf..1aab6e78 100644
--- a/testbed/scenes/pile/PileScene.h
+++ b/testbed/scenes/pile/PileScene.h
@@ -42,19 +42,15 @@ namespace pilescene {
 
 // Constants
 const float SCENE_RADIUS = 30.0f;
-const int NB_BOXES = 150;
-const int NB_SPHERES = 80;
-const int NB_CAPSULES = 5;
-const int NB_MESHES = 0;
+const int NB_BOXES = 100;
+const int NB_SPHERES = 40;
+const int NB_CAPSULES = 30;
+const int NB_MESHES = 30;
 const int NB_COMPOUND_SHAPES = 0;
-const openglframework::Vector3 BOX_SIZE(2, 2, 2);
-const float SPHERE_RADIUS = 1.5f;
-const float CONE_RADIUS = 2.0f;
-const float CONE_HEIGHT = 3.0f;
-const float CYLINDER_RADIUS = 1.0f;
-const float CYLINDER_HEIGHT = 5.0f;
-const float CAPSULE_RADIUS = 1.0f;
-const float CAPSULE_HEIGHT = 1.0f;
+const openglframework::Vector3 BOX_SIZE(3, 3, 3);
+const float SPHERE_RADIUS = 2.5f;
+const float CAPSULE_RADIUS = 1.5f;
+const float CAPSULE_HEIGHT = 3.0f;
 const float DUMBBELL_HEIGHT = 1.0f;
 const openglframework::Vector3 FLOOR_SIZE(50, 0.5f, 50);        // Floor dimensions in meters
 
diff --git a/testbed/scenes/ragdoll/RagdollScene.cpp b/testbed/scenes/ragdoll/RagdollScene.cpp
index a69020a2..ba2608f5 100644
--- a/testbed/scenes/ragdoll/RagdollScene.cpp
+++ b/testbed/scenes/ragdoll/RagdollScene.cpp
@@ -36,10 +36,12 @@ RagdollScene::RagdollScene(const std::string& name, EngineSettings& settings, re
       : SceneDemo(name, settings, physicsCommon, true, SCENE_RADIUS) {
 
     // Compute the radius and the center of the scene
-    openglframework::Vector3 center(0, 5, 0);
+    openglframework::Vector3 center(0, 10, 0);
 
     // Set the center of the scene
     setScenePosition(center, SCENE_RADIUS);
+    setInitZoom(2.1);
+    resetCameraToViewAll();
 
     mWorldSettings.worldName = name;
 }
diff --git a/testbed/scenes/raycast/RaycastScene.cpp b/testbed/scenes/raycast/RaycastScene.cpp
index e7dcde20..d89b2f40 100644
--- a/testbed/scenes/raycast/RaycastScene.cpp
+++ b/testbed/scenes/raycast/RaycastScene.cpp
@@ -41,6 +41,8 @@ RaycastScene::RaycastScene(const std::string& name, EngineSettings& settings, re
 
     // Set the center of the scene
     setScenePosition(center, SCENE_RADIUS);
+    setInitZoom(2);
+    resetCameraToViewAll();
 
     rp3d::PhysicsWorld::WorldSettings worldSettings;
     worldSettings.worldName = name;
diff --git a/testbed/scenes/rope/RopeScene.cpp b/testbed/scenes/rope/RopeScene.cpp
index e42396a5..5e8f9515 100644
--- a/testbed/scenes/rope/RopeScene.cpp
+++ b/testbed/scenes/rope/RopeScene.cpp
@@ -44,6 +44,8 @@ RopeScene::RopeScene(const std::string& name, EngineSettings& settings, reactphy
 
     // Set the center of the scene
     setScenePosition(center, SCENE_RADIUS);
+    setInitZoom(1);
+    resetCameraToViewAll();
 
     mWorldSettings.worldName = name;
 }
@@ -192,8 +194,6 @@ void RopeScene::createPhysicsWorld() {
     material1.setMassDensity(rp3d::decimal(0.02));
     mBox1->getRigidBody()->updateMassPropertiesFromColliders();
 
-    std::cout << "Mass: " << mBox1->getRigidBody()->getMass() << std::endl;
-
     mPhysicsObjects.push_back(mBox1);
 
     // ---------- Create the second box --------- //
@@ -220,9 +220,7 @@ void RopeScene::createPhysicsWorld() {
     // Create a box and a corresponding rigid in the physics world
     mPlank = new Box(true, Vector3(10, 2, 15), mPhysicsCommon, mPhysicsWorld, mMeshFolderPath);
     mPlank->getRigidBody()->setType(rp3d::BodyType::STATIC);
-
-    // Set the box color
-    mPlank->setColor(mObjectColorDemo);
+    mPlank->setColor(mFloorColorDemo);
     mPlank->setSleepingColor(mSleepingColorDemo);
 
     // Change the material properties of the rigid body
diff --git a/testbed/scenes/sliderjoint/SliderJointScene.cpp b/testbed/scenes/sliderjoint/SliderJointScene.cpp
index f171fa8a..8c568f4b 100644
--- a/testbed/scenes/sliderjoint/SliderJointScene.cpp
+++ b/testbed/scenes/sliderjoint/SliderJointScene.cpp
@@ -40,6 +40,8 @@ SliderJointScene::SliderJointScene(const std::string& name, EngineSettings& sett
 
     // Set the center of the scene
     setScenePosition(center, SCENE_RADIUS);
+    setInitZoom(1.1);
+    resetCameraToViewAll();
 
     mWorldSettings.worldName = name;
 }
diff --git a/testbed/shaders/phong.frag b/testbed/shaders/phong.frag
index 8ae8096e..ac63aba9 100644
--- a/testbed/shaders/phong.frag
+++ b/testbed/shaders/phong.frag
@@ -36,7 +36,6 @@ uniform vec3 light2DiffuseColor;            // Light 2 diffuse color
 uniform sampler2D textureSampler;           // Texture
 uniform sampler2D shadowMapSampler0;      // Shadow map texture sampler
 uniform sampler2D shadowMapSampler1;      // Shadow map texture sampler
-uniform sampler2D shadowMapSampler2;      // Shadow map texture sampler
 uniform bool isTexture;                     // True if we need to use the texture
 uniform vec4 globalVertexColor;                   // Vertex color
 uniform bool isShadowEnabled;               // True if shadow mapping is enabled
@@ -46,7 +45,7 @@ uniform vec2 shadowMapDimension;            // Shadow map dimension
 in vec3 vertexPosCameraSpace;          // Camera-space position of the vertex
 in vec3 vertexNormalCameraSpace;       // Vertex normal in camera-space
 in vec2 texCoords;                     // Texture coordinates
-in vec4 shadowMapCoords[3];            // Shadow map texture coords
+in vec4 shadowMapCoords[2];            // Shadow map texture coords
 
 // Out variable
 out vec4 color;                        // Output color
@@ -72,18 +71,22 @@ void main() {
 
 	color = vec4(ambient, 1);
 
-	vec3 lightPosCameraSpace[3];
+        vec3 lightPosCameraSpace[3];
 	lightPosCameraSpace[0] = light0PosCameraSpace;
 	lightPosCameraSpace[1] = light1PosCameraSpace;
 	lightPosCameraSpace[2] = light2PosCameraSpace;
-	vec3 lightDiffuseColor[3];
+        vec3 lightDiffuseColor[3];
 	lightDiffuseColor[0] = light0DiffuseColor;
 	lightDiffuseColor[1] = light1DiffuseColor;
 	lightDiffuseColor[2] = light2DiffuseColor;
 
+        bool isShadowEnabledForLight[3];
+        isShadowEnabledForLight[0] = true;
+        isShadowEnabledForLight[1] = true;
+        isShadowEnabledForLight[2] = false;
 
 	// For each light source
-	for (int l=0; l < 3; l++) {
+        for (int l=0; l < 3; l++) {
 
                 // Compute the diffuse term of light 0
 		vec3 L0 = normalize(lightPosCameraSpace[l] - vertexPosCameraSpace);
@@ -92,7 +95,8 @@ void main() {
 
 		// Compute shadow factor
 		float shadow = 1.0;
-		if (isShadowEnabled) {
+                if (isShadowEnabled && isShadowEnabledForLight[l]) {
+
 			shadow = 0.0;
 			float bias = 0.0003;
 			float shadowBias = -0.000;
@@ -102,15 +106,14 @@ void main() {
 
 			// PCF Shadow Mapping
 			for (float i=-1; i<=1; i++) {
-				for (float j=-1; j<=1; j++) {
-                                        float distInShadowMap0 = textureLookupPCF(shadowMapSampler0, shadowMapCoordsOverW.xy, vec2(i, j)) + bias;
-                                        float distInShadowMap1 = textureLookupPCF(shadowMapSampler1, shadowMapCoordsOverW.xy, vec2(i, j)) + bias;
-                                        float distInShadowMap2 = textureLookupPCF(shadowMapSampler2, shadowMapCoordsOverW.xy, vec2(i, j)) + bias;
-                                        float distInShadowMap = l == 0 ? distInShadowMap0 : (l == 1 ? distInShadowMap1 : distInShadowMap2);
-                                        if (shadowMapCoords[l].w > 0) {
-						shadow += distInShadowMap < shadowMapCoordsOverW.z ? 0.5 : 1.0;
-					}
-				}
+                            for (float j=-1; j<=1; j++) {
+                                float distInShadowMap0 = textureLookupPCF(shadowMapSampler0, shadowMapCoordsOverW.xy, vec2(i, j)) + bias;
+                                float distInShadowMap1 = textureLookupPCF(shadowMapSampler1, shadowMapCoordsOverW.xy, vec2(i, j)) + bias;
+                                float distInShadowMap = l == 0 ? distInShadowMap0 : distInShadowMap1;
+                                if (shadowMapCoords[l].w > 0) {
+                                    shadow += distInShadowMap < shadowMapCoordsOverW.z ? 0.5 : 1.0;
+                                }
+                            }
 			}
 			shadow /= 9.0;
 		}
diff --git a/testbed/shaders/phong.vert b/testbed/shaders/phong.vert
index 6cc72075..8211eac2 100644
--- a/testbed/shaders/phong.vert
+++ b/testbed/shaders/phong.vert
@@ -30,12 +30,10 @@ uniform mat4 localToWorldMatrix;        // Local-space to world-space matrix
 uniform mat4 worldToCameraMatrix;       // World-space to camera-space matrix
 uniform mat4 worldToLight0CameraMatrix; // World-space to light0 camera-space matrix (for shadow mapping)
 uniform mat4 worldToLight1CameraMatrix; // World-space to light1 camera-space matrix (for shadow mapping)
-uniform mat4 worldToLight2CameraMatrix; // World-space to light2 camera-space matrix (for shadow mapping)
 uniform mat4 projectionMatrix;          // Projection matrix
 uniform mat3 normalMatrix;              // Normal matrix
 uniform mat4 shadowMapLight0ProjectionMatrix; // Shadow map projection matrix for light 0
 uniform mat4 shadowMapLight1ProjectionMatrix; // Shadow map projection matrix for light 1
-uniform mat4 shadowMapLight2ProjectionMatrix; // Shadow map projection matrix for light 2
 
 // In variables
 in vec4 vertexPosition;
@@ -46,7 +44,7 @@ in vec2 textureCoords;
 out vec3 vertexPosCameraSpace;      // Camera-space position of the vertex
 out vec3 vertexNormalCameraSpace;   // Vertex normal in camera-space
 out vec2 texCoords;                 // Texture coordinates
-out vec4 shadowMapCoords[3];        // Shadow map texture coords
+out vec4 shadowMapCoords[2];        // Shadow map texture coords
 
 void main() {
 
@@ -61,17 +59,15 @@ void main() {
     texCoords = textureCoords;
 
     // Compute the texture coords of the vertex in the shadow map
-	mat4 worldToLightCameraMatrix[3];
-	worldToLightCameraMatrix[0] = worldToLight0CameraMatrix;
-	worldToLightCameraMatrix[1] = worldToLight1CameraMatrix;
-	worldToLightCameraMatrix[2] = worldToLight2CameraMatrix;
-	mat4 shadowMapProjectionMatrix[3];
-	shadowMapProjectionMatrix[0] = shadowMapLight0ProjectionMatrix;
-	shadowMapProjectionMatrix[1] = shadowMapLight1ProjectionMatrix;
-	shadowMapProjectionMatrix[2] = shadowMapLight2ProjectionMatrix;
-	for (int l=0; l < 3; l++) {
-		shadowMapCoords[l] = shadowMapProjectionMatrix[l] * worldToLightCameraMatrix[l] * localToWorldMatrix * vertexPosition;
-	}
+    mat4 worldToLightCameraMatrix[2];
+    worldToLightCameraMatrix[0] = worldToLight0CameraMatrix;
+    worldToLightCameraMatrix[1] = worldToLight1CameraMatrix;
+    mat4 shadowMapProjectionMatrix[2];
+    shadowMapProjectionMatrix[0] = shadowMapLight0ProjectionMatrix;
+    shadowMapProjectionMatrix[1] = shadowMapLight1ProjectionMatrix;
+    for (int l=0; l < 2; l++) {
+        shadowMapCoords[l] = shadowMapProjectionMatrix[l] * worldToLightCameraMatrix[l] * localToWorldMatrix * vertexPosition;
+    }
 
     // Compute the clip-space vertex coordinates
     gl_Position = projectionMatrix * positionCameraSpace;
diff --git a/testbed/src/Gui.cpp b/testbed/src/Gui.cpp
index 716c98b0..e429b946 100644
--- a/testbed/src/Gui.cpp
+++ b/testbed/src/Gui.cpp
@@ -533,7 +533,7 @@ void Gui::createSettingsPanel() {
 void Gui::createProfilingPanel() {
 
     Widget* profilingPanel = new Window(mScreen, "Profiling");
-    profilingPanel->set_position(Vector2i(15, 525));
+    profilingPanel->set_position(Vector2i(15, 505));
     profilingPanel->set_layout(new BoxLayout(Orientation::Vertical, Alignment::Fill, 10, 5));
     //profilingPanel->setId("SettingsPanel");
     profilingPanel->set_fixed_width(220);
@@ -568,7 +568,7 @@ bool Gui::onScrollEvent(double x, double y) {
 
     // If the mouse cursor is over the scenes choice scrolling menu
     const float pixelRatio = mScreen->pixel_ratio();
-    if (mComboBoxScenes->visible() && mComboBoxScenes->popup()->contains(Vector2i(xMouse, yMouse) / pixelRatio)) {
+    if (mComboBoxScenes->popup()->visible() && mComboBoxScenes->popup()->contains(Vector2i(xMouse, yMouse) / pixelRatio)) {
         mScreen->scroll_callback_event(x, y);
         return true;
     }
diff --git a/testbed/src/Scene.cpp b/testbed/src/Scene.cpp
index 09fb5894..29d29251 100644
--- a/testbed/src/Scene.cpp
+++ b/testbed/src/Scene.cpp
@@ -37,7 +37,8 @@ Scene::Scene(const std::string& name, EngineSettings& engineSettings, bool isSha
         mCurrentCameraVerticalAngle(0.0), mViewportX(0), mViewportY(0),
         mViewportWidth(0), mViewportHeight(0), mIsShadowMappingEnabled(isShadowMappingEnabled),
         mAreContactPointsDisplayed(true), mAreContactNormalsDisplayed(false), mAreBroadPhaseAABBsDisplayed(false),
-        mAreCollidersAABBsDisplayed(false), mAreCollisionShapesDisplayed(false), mIsWireframeEnabled(false) {
+        mAreCollidersAABBsDisplayed(false), mAreCollisionShapesDisplayed(false), mIsWireframeEnabled(false),
+        mInitZoom(2.0f) {
 
 }
 
@@ -63,12 +64,12 @@ void Scene::resetCameraToViewAll() {
     // Move the camera to the origin of the scene
     mCamera.translateWorld(-mCamera.getOrigin());
 
-    // Move the camera to the center of the scene
+    // Move the camera
     mCamera.translateWorld(mCenterScene);
 
     // Set the zoom of the camera so that the scene center is
     // in negative view direction of the camera
-    mCamera.setZoom(1.0);
+    mCamera.setZoom(mInitZoom);
 }
 
 // Map the mouse x,y coordinates to a point on a sphere
@@ -182,6 +183,4 @@ void Scene::rotate(int xMouse, int yMouse) {
     mCamera.rotateAroundLocalPoint(localVertAxis, deltaHorizRotationAngle, mCenterScene);
 
     mCurrentCameraVerticalAngle += deltaVertRotationAngle;
-    std::cout << "Delta angle: " << deltaVertRotationAngle << std::endl;
-    std::cout << "Horizon angle: " << mCurrentCameraVerticalAngle << std::endl;
 }
diff --git a/testbed/src/Scene.h b/testbed/src/Scene.h
index 13e8f40b..62acf390 100644
--- a/testbed/src/Scene.h
+++ b/testbed/src/Scene.h
@@ -155,6 +155,9 @@ class Scene : public rp3d::EventListener {
         /// Snapshots Contact points (computed with PhysicsWorld::testCollision() or PhysicsWorld::raycast() methods)
         std::vector<SceneContactPoint> mSnapshotsContactPoints;
 
+        /// Initial zoom factor
+        float mInitZoom;
+
         // -------------------- Methods -------------------- //
 
         /// Set the scene position (where the camera needs to look at)
@@ -221,6 +224,12 @@ class Scene : public rp3d::EventListener {
         /// Set the viewport to render the scene
         void setViewport(int x, int y, int width, int height);
 
+        /// Return the initial zoom factor
+        float getInitZoom() const;
+
+        /// Set the initial zoom factor
+        void setInitZoom(float zoom);
+
         /// Return a reference to the camera
         const openglframework::Camera& getCamera() const;
 
@@ -302,6 +311,16 @@ inline void Scene::setViewport(int x, int y, int width, int height) {
     mViewportHeight = height;
 }
 
+// Return the initial zoom factor
+inline float Scene::getInitZoom() const {
+   return mInitZoom;
+}
+
+// Set the initial zoom factor
+inline void Scene::setInitZoom(float zoom) {
+    mInitZoom = zoom;
+}
+
 // Set the interpolation factor
 inline void Scene::setInterpolationFactor(float interpolationFactor) {
     mInterpolationFactor = interpolationFactor;
diff --git a/testbed/src/SceneDemo.cpp b/testbed/src/SceneDemo.cpp
index 8d245d94..c1ba527c 100644
--- a/testbed/src/SceneDemo.cpp
+++ b/testbed/src/SceneDemo.cpp
@@ -34,51 +34,51 @@ using namespace openglframework;
 
 int SceneDemo::shadowMapTextureLevel = 0;
 //openglframework::Color SceneDemo::mObjectColorDemo = Color(0.76f, 0.67f, 0.47f, 1.0f);
-openglframework::Color SceneDemo::mObjectColorDemo = Color(0.35f, 0.65f, 0.78f, 1.0f);
+openglframework::Color SceneDemo::mObjectColorDemo = Color(0.21f, 0.65f, 1.0f, 1.0f);
 openglframework::Color SceneDemo::mFloorColorDemo = Color(0.47f, 0.48f, 0.49f, 1.0f);
 openglframework::Color SceneDemo::mSleepingColorDemo = Color(1.0f, 0.25f, 0.25f, 1.0f);
-openglframework::Color SceneDemo::mSelectedObjectColorDemo = Color(0.09f, 0.59f, 0.88f, 1.0f);
+openglframework::Color SceneDemo::mSelectedObjectColorDemo = Color(0.09f, 0.88f, 0.09f, 1.0f);
 
 // Constructor
 SceneDemo::SceneDemo(const std::string& name, EngineSettings& settings, reactphysics3d::PhysicsCommon& physicsCommon, bool isPhysicsWorldSimulated, bool isShadowMappingEnabled)
-          : Scene(name, settings, isShadowMappingEnabled), mIsShadowMappingInitialized(false),
+          : Scene(name, settings, isShadowMappingEnabled), mBackgroundColor(0.15, 0.15, 0.15, 1),
+                     mIsShadowMappingInitialized(false),
                      mDepthShader("shaders/depth.vert", "shaders/depth.frag"),
                      mPhongShader("shaders/phong.vert", "shaders/phong.frag"),
 					 mColorShader("shaders/color.vert", "shaders/color.frag"),
                      mQuadShader("shaders/quad.vert", "shaders/quad.frag"),
                      mVBOQuad(GL_ARRAY_BUFFER), mDebugVBOLinesVertices(GL_ARRAY_BUFFER), mDebugVBOTrianglesVertices(GL_ARRAY_BUFFER),
                      mMeshFolderPath("meshes/"), mPhysicsCommon(physicsCommon), mPhysicsWorld(nullptr), mIsPhysicsWorldSimulated(isPhysicsWorldSimulated),
-                    mIsMovingBody(false), mMovingBody(nullptr) {
+                     mIsMovingBody(false), mMovingBody(nullptr) {
 
     shadowMapTextureLevel++;
 
     // Move the lights
-	float lightsRadius = 30.0f;
-	float lightsHeight = 20.0f;
-    mLight0.translateWorld(Vector3(0 * lightsRadius, lightsHeight, 1 * lightsRadius));
-    mLight1.translateWorld(Vector3(0.95f * lightsRadius, lightsHeight, -0.3f * lightsRadius));
-    mLight2.translateWorld(Vector3(-0.58f * lightsRadius, lightsHeight, -0.81f * lightsRadius));
+    float lightsRadius = 40.0f;
+    float lightsHeight = 50.0f;
+    mLight0.translateWorld(Vector3(0.4f * lightsRadius, 0.6 * lightsHeight, 0.4f * lightsRadius));
+    mLight1.translateWorld(Vector3(-0.4 * lightsRadius, 0.6 * lightsHeight, 0.4 * lightsRadius));
+    mLight2.translateWorld(Vector3(-0.40f * lightsRadius, -lightsHeight, -0.4f * lightsRadius));
 
 	// Set the lights colors
-	mLight0.setDiffuseColor(Color(0.6f, 0.6f, 0.6f, 1.0f));
-	mLight1.setDiffuseColor(Color(0.6f, 0.6f, 0.6f, 1.0f));
-	mLight2.setDiffuseColor(Color(0.6f, 0.6f, 0.6f, 1.0f));
+    float lightIntensity = 0.6f;
+    Color lightColor(lightIntensity * 1.0, lightIntensity * 1.0f, lightIntensity * 1.0f, 1.0f);
+    mLight0.setDiffuseColor(lightColor);
+    mLight1.setDiffuseColor(lightColor);
+    mLight2.setDiffuseColor(lightColor);
 
-	mShadowMapLightCameras[0].translateWorld(mLight0.getOrigin());
-	mShadowMapLightCameras[0].rotateLocal(Vector3(1, 0, 0), -PI / 4.0f);
+    mShadowMapLightCameras[0].translateWorld(mLight0.getOrigin());
+    mShadowMapLightCameras[0].rotateLocal(Vector3(1, 0, 0), -PI / 4.0f);
+    mShadowMapLightCameras[0].rotateLocal(Vector3(0, 1, 0), PI / 4.0f);
 
 	mShadowMapLightCameras[1].translateWorld(mLight1.getOrigin());
-	mShadowMapLightCameras[1].rotateLocal(Vector3(0, 1, 0), -5.0f * PI/3.7f);
 	mShadowMapLightCameras[1].rotateLocal(Vector3(1, 0, 0), -PI/4.0f);
-
-	mShadowMapLightCameras[2].translateWorld(mLight2.getOrigin());
-	mShadowMapLightCameras[2].rotateLocal(Vector3(0, 1, 0), 5 * PI/4.0f);
-	mShadowMapLightCameras[2].rotateLocal(Vector3(1, 0 , 0), -PI/4.0f);
+    mShadowMapLightCameras[1].rotateLocal(Vector3(0, 1, 0), -PI / 4.0f);
 
 	for (int i = 0; i < NB_SHADOW_MAPS; i++) {
 		mShadowMapLightCameras[i].setDimensions(SHADOWMAP_WIDTH, SHADOWMAP_HEIGHT);
 		mShadowMapLightCameras[i].setFieldOfView(100.0f);
-		mShadowMapLightCameras[i].setSceneRadius(100);
+        mShadowMapLightCameras[i].setSceneRadius(100);
 	}
 
     mShadowMapBiasMatrix.setAllValues(0.5, 0.0, 0.0, 0.5,
@@ -168,6 +168,8 @@ void SceneDemo::render() {
     glEnable(GL_DEPTH_TEST);
     glEnable(GL_CULL_FACE);
 
+    glClearColor(mBackgroundColor.r, mBackgroundColor.g, mBackgroundColor.b, mBackgroundColor.a);
+
 	Matrix4 shadowMapProjMatrix[NB_SHADOW_MAPS];
 	openglframework::Matrix4 worldToLightCameraMatrix[NB_SHADOW_MAPS];
 	for (int i = 0; i < NB_SHADOW_MAPS; i++) {
@@ -241,20 +243,17 @@ void SceneDemo::render() {
     mPhongShader.setMatrix4x4Uniform("projectionMatrix", mCamera.getProjectionMatrix());
     mPhongShader.setMatrix4x4Uniform("shadowMapLight0ProjectionMatrix", mShadowMapBiasMatrix * shadowMapProjMatrix[0]);
     mPhongShader.setMatrix4x4Uniform("shadowMapLight1ProjectionMatrix", mShadowMapBiasMatrix * shadowMapProjMatrix[1]);
-    mPhongShader.setMatrix4x4Uniform("shadowMapLight2ProjectionMatrix", mShadowMapBiasMatrix * shadowMapProjMatrix[2]);
     mPhongShader.setMatrix4x4Uniform("worldToLight0CameraMatrix", worldToLightCameraMatrix[0]);
     mPhongShader.setMatrix4x4Uniform("worldToLight1CameraMatrix", worldToLightCameraMatrix[1]);
-    mPhongShader.setMatrix4x4Uniform("worldToLight2CameraMatrix", worldToLightCameraMatrix[2]);
     mPhongShader.setVector3Uniform("light0PosCameraSpace", worldToCameraMatrix * mLight0.getOrigin());
     mPhongShader.setVector3Uniform("light1PosCameraSpace", worldToCameraMatrix * mLight1.getOrigin());
     mPhongShader.setVector3Uniform("light2PosCameraSpace", worldToCameraMatrix * mLight2.getOrigin());
-    mPhongShader.setVector3Uniform("lightAmbientColor", Vector3(0.3f, 0.3f, 0.3f));
+    mPhongShader.setVector3Uniform("lightAmbientColor", Vector3(0.2f, 0.2f, 0.2f));
     mPhongShader.setVector3Uniform("light0DiffuseColor", Vector3(mLight0.getDiffuseColor().r, mLight0.getDiffuseColor().g, mLight0.getDiffuseColor().b));
     mPhongShader.setVector3Uniform("light1DiffuseColor", Vector3(mLight1.getDiffuseColor().r, mLight1.getDiffuseColor().g, mLight1.getDiffuseColor().b));
     mPhongShader.setVector3Uniform("light2DiffuseColor", Vector3(mLight2.getDiffuseColor().r, mLight2.getDiffuseColor().g, mLight2.getDiffuseColor().b));
     mPhongShader.setIntUniform("shadowMapSampler0", textureUnits[0]);
     mPhongShader.setIntUniform("shadowMapSampler1", textureUnits[1]);
-    mPhongShader.setIntUniform("shadowMapSampler2", textureUnits[2]);
     mPhongShader.setIntUniform("isShadowEnabled", mIsShadowMappingEnabled);
     mPhongShader.setVector2Uniform("shadowMapDimension", Vector2(SHADOWMAP_WIDTH, SHADOWMAP_HEIGHT));
 	mPhongShader.unbind();
diff --git a/testbed/src/SceneDemo.h b/testbed/src/SceneDemo.h
index b765cd62..4a501f2a 100644
--- a/testbed/src/SceneDemo.h
+++ b/testbed/src/SceneDemo.h
@@ -47,10 +47,13 @@ class SceneDemo : public Scene, rp3d::RaycastCallback {
 
         // -------------------- Constants -------------------- //
 
-		static constexpr int NB_SHADOW_MAPS = 3;
+        static constexpr int NB_SHADOW_MAPS = 2;
 
         // -------------------- Attributes -------------------- //
 
+        /// Background color
+        openglframework::Color mBackgroundColor;
+
         /// Light 0
         openglframework::Light mLight0;
 
diff --git a/testbed/src/TestbedApplication.cpp b/testbed/src/TestbedApplication.cpp
index 25561cc2..849e9c19 100755
--- a/testbed/src/TestbedApplication.cpp
+++ b/testbed/src/TestbedApplication.cpp
@@ -300,12 +300,6 @@ void TestbedApplication::createScenes() {
     RaycastScene* raycastScene = new RaycastScene(sceneName, mDefaultEngineSettings, mPhysicsCommon);
     mScenes.push_back(raycastScene);
 
-    // Collision Detection scene
-    sceneName = "Collision Detection";
-    mLogger.addFileDestination(sceneName, logLevel, rp3d::DefaultLogger::Format::HTML);
-    CollisionDetectionScene* collisionDetectionScene = new CollisionDetectionScene(sceneName, mDefaultEngineSettings, mPhysicsCommon);
-    mScenes.push_back(collisionDetectionScene);
-
     // Concave Mesh scene
     sceneName = "Concave Mesh";
     mLogger.addFileDestination(sceneName, logLevel, rp3d::DefaultLogger::Format::HTML);
@@ -331,13 +325,13 @@ void TestbedApplication::createScenes() {
     mScenes.push_back(boxTowerScene);
 
     // Ball and Socket joints Net scene
-    sceneName = "BallAndSocket Joints Net";
+    sceneName = "BallSocket Joints Net";
     mLogger.addFileDestination(sceneName, logLevel, rp3d::DefaultLogger::Format::HTML);
     BallAndSocketJointsNetScene* ballAndSocketJointsNetScene = new BallAndSocketJointsNetScene(sceneName, mDefaultEngineSettings, mPhysicsCommon);
     mScenes.push_back(ballAndSocketJointsNetScene);
 
     // Ball and Socket joints chain scene
-    sceneName = "BallAndSoket Joints Chain";
+    sceneName = "BallSocket Joints Chain";
     mLogger.addFileDestination(sceneName, logLevel, rp3d::DefaultLogger::Format::HTML);
     BallAndSocketJointsChainScene* ballAndSocketJointsChainScene = new BallAndSocketJointsChainScene(sceneName, mDefaultEngineSettings, mPhysicsCommon);
     mScenes.push_back(ballAndSocketJointsChainScene);
@@ -384,6 +378,12 @@ void TestbedApplication::createScenes() {
     RopeScene* ropeScene = new RopeScene(sceneName, mDefaultEngineSettings, mPhysicsCommon);
     mScenes.push_back(ropeScene);
 
+    // Collision Detection scene
+    sceneName = "Collision Detection";
+    mLogger.addFileDestination(sceneName, logLevel, rp3d::DefaultLogger::Format::HTML);
+    CollisionDetectionScene* collisionDetectionScene = new CollisionDetectionScene(sceneName, mDefaultEngineSettings, mPhysicsCommon);
+    mScenes.push_back(collisionDetectionScene);
+
     assert(mScenes.size() > 0);
 }
 
diff --git a/testbed/src/TestbedLogger.cpp b/testbed/src/TestbedLogger.cpp
index 7795da9f..c079ec74 100644
--- a/testbed/src/TestbedLogger.cpp
+++ b/testbed/src/TestbedLogger.cpp
@@ -84,7 +84,7 @@ DefaultLogger::Formatter* TestbedLogger::getFormatter(DefaultLogger::Format form
 }
 
 // Add a log file destination to the logger
-void TestbedLogger::addFileDestination(const std::string& worldName, uint logLevelFlag, reactphysics3d::DefaultLogger::Format format) {
+void TestbedLogger::addFileDestination(const std::string& worldName, reactphysics3d::uint logLevelFlag, reactphysics3d::DefaultLogger::Format format) {
 
     std::string filePath = "rp3d_log_" + worldName + ".html";
     reactphysics3d::DefaultLogger::FileDestination* destination = new reactphysics3d::DefaultLogger::FileDestination(filePath, logLevelFlag, getFormatter(format));
@@ -92,7 +92,7 @@ void TestbedLogger::addFileDestination(const std::string& worldName, uint logLev
 }
 
 // Add a stream destination to the logger
-void TestbedLogger::addStreamDestination(std::ostream& outputStream, uint logLevelFlag, reactphysics3d::DefaultLogger::Format format) {
+void TestbedLogger::addStreamDestination(std::ostream& outputStream, reactphysics3d::uint logLevelFlag, reactphysics3d::DefaultLogger::Format format) {
 
     mStandardOutputDestination = new reactphysics3d::DefaultLogger::StreamDestination(outputStream, logLevelFlag, getFormatter(format));
 }