diff --git a/lab4/README.md b/lab4/README.md
new file mode 100644
index 0000000000000000000000000000000000000000..5e6665d48454a453bad85d6dc2418519b0d3f63a
--- /dev/null
+++ b/lab4/README.md
@@ -0,0 +1,32 @@
+# Lab3 IHM
+
+This folder contains a template for the **lab4** of IHM course. 
+
+---
+
+* Execute this command line : `git pull base master` under your local repository where you did the **lab1**, **lab2** and **lab3**.
+
+  > Before doing so, check that you have defined this repository as a second remote repo by executing this command line:
+  >
+  > ```shell
+  > git remote -v
+  > ```
+  >
+  > You should see this line in the output:
+  >
+  > ```
+  > base ssh://git@ssh.hesge.ch:10572/cours-ihm/labs_ihm_2019_preparation.git
+  > ```
+  >
+  > Otherwise, execute this command line: 
+  >
+  > ```bash
+  > git remote add base ssh://git@ssh.hesge.ch:10572/cours-ihm/labs_ihm_2019.git
+  > ```
+
+* Under `lab4/src/models` folder, you will find 3 JavaScript files `K.js`, `N.js` and `V.js`. Each file represent an alphabetic letter model (K, N and V). You should to use these files for this lab.
+
+* Put your code in the `lab4/src` folder, by modifying content of `lab4.html` and `lab4.js` files, and adding your additional files.
+
+***Your main `html` file must be `lab4.html`***
+
diff --git a/lab4/doc/enonce.pdf b/lab4/doc/enonce.pdf
new file mode 100644
index 0000000000000000000000000000000000000000..ac6720449ffa88b544fcf48f1d6fc2c9c3d4a446
Binary files /dev/null and b/lab4/doc/enonce.pdf differ
diff --git a/lab4/src/lab4.html b/lab4/src/lab4.html
new file mode 100644
index 0000000000000000000000000000000000000000..025912edd89308c152c714ec7e4bf410a8b1737e
--- /dev/null
+++ b/lab4/src/lab4.html
@@ -0,0 +1,4 @@
+<!DOCTYPE html>
+<html>
+
+</html>
diff --git a/lab4/src/lab4.js b/lab4/src/lab4.js
new file mode 100644
index 0000000000000000000000000000000000000000..ac563915ce1bd919bb27a7d35c107070caf0c146
--- /dev/null
+++ b/lab4/src/lab4.js
@@ -0,0 +1,9 @@
+// TODO: Shaders definition
+
+/**
+ * This is the main entry point of your JavaScript program
+ * called in the "onload" event of the body tag in HTML
+ */
+function main() {
+	// TODO: put your implementation here
+}
diff --git a/lab4/src/models/K.js b/lab4/src/models/K.js
new file mode 100644
index 0000000000000000000000000000000000000000..0b830af4eed61cd462feb72f2dde20386b9cd8f2
--- /dev/null
+++ b/lab4/src/models/K.js
@@ -0,0 +1,117 @@
+/**
+ * Model 3D letter K
+ * @constructor
+ * 	- Define vertices
+ * 	- Define indices
+ * 	- Define colors
+ */
+function K() {
+	// Define vertices
+	const v0 = [-1,-1,0.5], 
+		  v1 = [-0.25,-1,0.5],
+		  v2 = [-1,1,0.5],
+		  v3 = [-0.25,1,0.5],
+		  v4 = [-0.25,0,0.5],
+		  v5 = [0.5,1,0.5],
+		  v6 = [1,1,0.5],
+		  v7 = [0.5,0,0.5],
+		  v8 = [1,-1,0.5],
+		  v9 = [0.5,-1,0.5],
+
+		  v10 = [-1,-1,-0.5], 
+		  v11 = [-0.25,-1,-0.5],
+		  v12 = [-1,1,-0.5],
+		  v13 = [-0.25,1,-0.5],
+		  v14 = [-0.25,0,-0.5],
+		  v15 = [0.5,1,-0.5],
+		  v16 = [1,1,-0.5],
+		  v17 = [0.5,0,-0.5],
+		  v18 = [1,-1,-0.5],
+		  v19 = [0.5,-1,-0.5];
+
+	this.vertices = new Float32Array([
+		v0,v0,v0, v1,v1,v1, v2,v2,v2, v3,v3,v3, v4,v4,v4, v5,v5,v5, v6,v6,v6, v7,v7,v7, v8,v8,v8, v9,v9,v9,
+		v10,v10,v10, v11,v11,v11, v12,v12,v12, v13,v13,v13, v14,v14,v14, v15,v15,v15, v16,v16,v16, v17,v17,v17,
+		v18,v18,v18, v19,v19,v19
+  ].flat(2));
+
+	this.indices = new Uint8Array([
+		0,3,9, 
+		0,9,6,
+		12,27,15,
+		15,21,18,
+		21,27,24,
+
+		30,33,39, 
+		30,39,36,
+		42,57,45,
+		45,51,48,
+		51,57,54,
+
+		2,8,32,
+		8,38,32,
+
+		1,4,34,
+		1,34,31,
+
+		7,10,37,
+		10,40,37,
+
+		5,11,41,
+		5,41,35,
+
+		13,16,43,
+		16,46,43,	
+
+		17,19,47,
+		19,49,47,
+
+		20,22,50,	
+		22,52,50,	
+
+		23,26,53,
+		26,56,53,
+
+		25,28,55,	
+		28,58,55,	
+
+		14,29,44,
+		29,59,44
+  ]);
+
+  	this.normals = new Float32Array([
+		0.0,0.0,1.0,  0.0,-1.0,0.0, -1.0,0.0,0.0,
+		0.0,0.0,1.0,  0.0,-1.0,0.0,  1.0,0.0,0.0, 
+		0.0,0.0,1.0,  0.0,1.0,0.0, -1.0,0.0,0.0,	
+		0.0,0.0,1.0,  0.0,1.0,0.0, 1.0,0.0,0.0,
+		0.0,0.0,1.0, -1.0,0.75,0.0, -0.75,-1.0,0.0,
+		0.0,0.0,1.0, -1.0,0.75,0.0, 0.0,1.0,0.0,
+		0.0,0.0,1.0,  0.0,1.0,0.0,  1.0,-0.25,0.0,
+
+		0.0,0.0,1.0,  1.0,-0.25,0.0,  1.0,0.25,0.0,
+		0.0,0.0,1.0,  0.0,-1.0,0.0,  1.0,0.25,0.0,
+		0.0,0.0,1.0,  0.0,-1.0,0.0, -0.75,-1.0,0.0,
+
+
+
+		0.0,0.0,-1.0,  0.0,-1.0,0.0, -1.0,0.0,0.0,
+		0.0,0.0,-1.0,  0.0,-1.0,0.0,  1.0,0.0,0.0,
+		0.0,0.0,-1.0,  0.0,1.0,0.0, -1.0,0.0,0.0,	
+		0.0,0.0,-1.0,  0.0,1.0,0.0, 1.0,0.0,0.0,
+		0.0,0.0,-1.0,  -1.0,0.75,0.0, -0.75,-1.0,0.0,
+		0.0,0.0,-1.0, -1.0,0.75,-0.75, 0.0,1.0,0.0,
+		0.0,0.0,-1.0,  0.0,1.0,0.0,  1.0,0.5,0.0,
+
+		0.0,0.0,-1.0,  1.0,-0.25,0.0, 1.0,-0.25,0.0,
+		0.0,0.0,-1.0,  0.0,-1.0,0.0,  1.0,-0.25,0.0,
+		0.0,0.0,-1.0,  0.0,-1.0,0.0, -0.75,-1.0,0.0,
+
+	  ]);
+
+
+	const color = [1.0,1.0,1.0];
+	// Define colors
+	let values = [...Array(this.vertices.length)];
+	values = values.map(() => [...color]);
+	this.colors = new Float32Array(values.flat(2));
+}
\ No newline at end of file
diff --git a/lab4/src/models/N.js b/lab4/src/models/N.js
new file mode 100644
index 0000000000000000000000000000000000000000..22260b71e266b3aec5a475c85604d47026325b6d
--- /dev/null
+++ b/lab4/src/models/N.js
@@ -0,0 +1,62 @@
+/**
+ * Model 3D letter N
+ * @constructor
+ * 	- Define vertices
+ * 	- Define indices
+ * 	- Define colors
+ */
+function N() {
+	// Define vertices
+	const v0 = [-1, -1, .5],v1 = [-1, 1, .5], v2 = [-.5, 1, .5], v3 = [.5, -.25, .5],
+		v4 = [.5, 1, .5], v5 = [1, 1, .5], v6 = [1, -1, .5], v7 = [.5, -1, .5],
+		v8 = [-.5, .25, .5], v9 = [-.5, -1, .5], v10 = [-1, -1, -.5],v11 = [-1, 1, -.5],
+		v12 = [-.5, 1, -.5], v13 = [.5, -.25, -.5], v14 = [.5, 1, -.5], v15 = [1, 1, -.5],
+		v16 = [1, -1, -.5], v17 = [.5, -1, -.5], v18 = [-.5, .25, -.5], v19 = [-.5, -1, -.5];
+
+
+
+	const front = [0, 0, 1], back = [0, 0, -1],
+		left = [-1, 0, 0], right = [1, 0, 0],
+		up = [0, 1, 0], down = [0, -1, 0];
+	up_right = [0.6,0.8,0], down_left = [-0.94,-0.62,0]; // euh qui doivent ĂȘtre faux
+
+	this.vertices = new Float32Array([
+		v0, v0, v0, v1, v1, v1, v2, v2, v2, v3, v3, v3, v4, v4, v4, v5, v5, v5, v6, v6, v6,
+		v7, v7, v7, v8, v8, v8, v9, v9, v9 , v10, v10, v10, v11, v11, v11, v12, v12, v12,
+		v13, v13, v13, v14, v14, v14, v15, v15, v15, v16, v16, v16, v17, v17, v17, v18, v18, v18,
+		v19, v19, v19
+	].flat(2));
+
+	this.normals = new Float32Array([
+		front,left,down, front,left,up, front,up_right,up, front,left,up_right, front,left,up, front,right,up,
+		front,right,down, front,down_left,down, front,right,down_left, front,right,down,
+
+		back,left,down, back,left,up, back,up_right,up, back,left,up_right, back,left,up, back,right,up,
+		back,right,down, back,down_left,down, back,right,down_left, back,right,down,
+	].flat(2));
+
+	// Define vertices indices
+	this.indices = new Uint8Array([
+		0,24,3 , 0,27,24, 24,6,3, 24,9,6, 24,21,9, 9,21,18, 9,18,15, 9,15,12, // front
+		30,33,54, 30,54,57, 54,33,36, 54,36,39, 54,39,51, 39,48,51, 39,45,48, 39,42,45, // back 
+
+		1,4,34, 1,34,31, // left
+		19,46,16, 19,49,46, // right
+		10,13,43, 10,43,40, // inner left
+		11,37,7, 11,41,37, // inner up_right 
+		28,58,55, 28,55,25, // inner right
+		22,56,52, 22,26,56, // inner down_left // PROBLEME
+		14,17,47, 14,47,44, // up right
+		5,8,38, 5,38,35, // up left
+		20,23,53, 20,53,50, // down right
+		29,2,32, 29,32,59 // down left
+	]);
+
+	const color = [1, 0, 0];
+
+	// Define colors
+
+	let values = [...Array(this.vertices.length)];
+	values = values.map(() => [...color]);
+	this.colors = new Float32Array(values.flat(2));
+}
\ No newline at end of file
diff --git a/lab4/src/models/V.js b/lab4/src/models/V.js
new file mode 100644
index 0000000000000000000000000000000000000000..56e158357d25905336eb9c7b77b5981fbb818945
--- /dev/null
+++ b/lab4/src/models/V.js
@@ -0,0 +1,69 @@
+/**
+ * Model 3D letter V
+ * @constructor
+ * 	- Define vertices
+ * 	- Define indices
+ * 	- Define colors
+ */
+function V() {
+
+	const face = [0, 0, 1];
+	const back = [0, 0, -1];
+	const down = [0, -1, 0];
+	const up = [0, 1, 0];
+	// Calcul de la norme du triangle
+	const downRight = [0.93, -0.37, 0];
+	const upRight = [-0.94, 0.35, 0];
+	const downLeft = [-0.93, -0.37, 0];
+	const upLeft = [0.94, 0.35, 0];
+	// Define vertices
+	// Front face
+	const v0 = [-.2, -1, .5], v1 = [.2, -1, .5], v2 = [1, 1, .5], v3 = [.6, 1, .5], v4 = [0, -.6, .5],
+		v5 = [-.6, 1, .5], v6 = [-1, 1, .5];
+	// Back face
+	const v7 = [-.2, -1, -.5], v8 = [.2, -1, -.5], v9 = [1, 1, -.5], v10 = [.6, 1, -.5], v11 = [0, -.6, -.5],
+		v12 = [-.6, 1, -.5], v13 = [-1, 1, -.5];
+
+	this.vertices = new Float32Array([
+		v0, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v1, v0, v7, v8, v2, v9, v10, v3, v5, v12, v13, v6,
+		v1, v8, v9, v2, v4, v3, v10, v11, v0, v6, v13, v7, v4, v11, v12, v5
+	].flat(2));
+
+	// Define vertices indices
+	this.indices = new Uint8Array([       // Indices of the vertices
+		// Front face
+		0, 1, 4, 1, 2, 4, 2, 3, 4, 0, 4, 5, 0, 5, 6,
+		// Back face
+		7, 11, 8, 8, 11, 9, 9, 11, 10, 7, 13, 12, 12, 11, 7,
+		// Down face
+		14, 15, 16, 16, 17, 14,
+
+		// Up face
+		18, 19, 20, 20, 21, 18,
+		22, 23, 24, 24, 25, 22,
+
+		// Right face
+		26, 27, 28, 28, 29, 26,
+		30, 31, 32, 32, 33, 30,
+
+		// Left face
+		34, 35, 36, 36, 37, 34,
+		38, 39, 40, 40, 41, 38
+	]);
+
+
+	const color = [0, 1, 0];
+	// Define colors
+	let values = [...Array(this.vertices.length)];
+	values = values.map(() => [...color]);
+	this.colors = new Float32Array(values.flat(2));
+
+	this.normals = new Float32Array([
+		face, face, face, face, face, face, face,
+		back, back, back, back, back, back, back,
+		down, down, down, down,
+		up, up, up, up, up, up, up, up,
+		downRight, downRight, downRight, downRight, upRight, upRight, upRight, upRight,
+		downLeft, downLeft, downLeft, downLeft, upLeft, upLeft, upLeft, upLeft
+	].flat(2))
+}
\ No newline at end of file