diff --git a/display.c b/display.c
index 492270a5a7a8a04e9a4a70f2ec48cd36ed81734f..421b31ecf5f3e160660d96dbe03ca5b7da9e5439 100644
--- a/display.c
+++ b/display.c
@@ -13,35 +13,35 @@
 static SDL_Renderer *renderer;
 static SDL_Texture *one_arm_texture, *objects_texture, *coin_texture;
 static SDL_Rect one_arm_rect, coin_rect;
-static SDL_Rect object_rect;		
+static SDL_Rect object_rect;
 int object_height; // global for convenience
 
 
-void *display_func(void *param) 
+void *display_func(void *param)
 {
 	int one_arm_width, one_arm_height;
 	SDL_Window *window;
 
 	// -------------------------
-  	// Graphic initialization	
+  	// Graphic initialization
 	// -------------------------
 	assert(SDL_Init(SDL_INIT_VIDEO) == 0);
 	get_image_file_size("./one_armed_bandit.png", &one_arm_width, &one_arm_height);
 	assert((window = SDL_CreateWindow("one_armed_bandit", SDL_WINDOWPOS_UNDEFINED,
-	                          SDL_WINDOWPOS_UNDEFINED, one_arm_width, 
+	                          SDL_WINDOWPOS_UNDEFINED, one_arm_width,
 	                          one_arm_height, SDL_WINDOW_OPENGL))!=NULL);
-	assert((renderer = SDL_CreateRenderer(window, -1, 0))!=NULL); 
-	SDL_SetRenderDrawBlendMode(renderer, SDL_BLENDMODE_BLEND);   // allow transparent mode!                           
-	assert((one_arm_texture=create_texture_from_image_file(renderer, "one_armed_bandit.png", 
+	assert((renderer = SDL_CreateRenderer(window, -1, 0))!=NULL);
+	SDL_SetRenderDrawBlendMode(renderer, SDL_BLENDMODE_BLEND);   // allow transparent mode!
+	assert((one_arm_texture=create_texture_from_image_file(renderer, "one_armed_bandit.png",
 	                                                       &one_arm_rect))!=NULL);
-	assert((coin_texture=create_texture_from_image_file(renderer, "coin.png", 
-	                                                    &coin_rect))!=NULL);                                               
+	assert((coin_texture=create_texture_from_image_file(renderer, "coin.png",
+	                                                    &coin_rect))!=NULL);
 	// create the global texture containing all objects:
-	assert((objects_texture=create_texture_from_image_file(renderer, "objects.png", 
-			                                                   &object_rect))!=NULL);	
+	assert((objects_texture=create_texture_from_image_file(renderer, "objects.png",
+			                                                   &object_rect))!=NULL);
   	object_height=object_rect.h/9;
-	
-	
+
+
 	while(1){
 		for(double a = 0; a<8.0; a +=0.1){
 
@@ -49,47 +49,15 @@ void *display_func(void *param)
 
 		}
 	}
-	
 
-		
+
+
 
 	// -------------------------
-  	// managing events:	
+  // 		managing events:
 	// -------------------------
-	SDL_Event event;	
-	bool quit=false;
-	do  {						
-	SDL_WaitEvent(&event);				// passive waiting on an event
- 	switch (event.type) 
-	{
-		case SDL_QUIT:						// if SDL_Quit() called
-			quit=true;
- 			break;
-		case SDL_WINDOWEVENT:
-			if (event.window.event==SDL_WINDOWEVENT_CLOSE) // if windows closed by user
-				{
-					quit=true;
-				}
-			break;
-		case SDL_KEYDOWN:					// if key pressed
-			switch(event.key.keysym.sym)
-			{
-				case SDLK_ESCAPE:
- 						quit=true;
-					break;
-				case SDLK_SPACE:
-					wait_key_release();
- 					break;
-				case SDLK_s:
- 					wait_key_release();
- 					break;
- 		  }
- 	}
-} while(!quit);
-		
-		
-		
-		
+	
+
 	SDL_DestroyTexture(objects_texture);
   	SDL_DestroyTexture(one_arm_texture);
 	SDL_DestroyRenderer(renderer);
@@ -110,26 +78,26 @@ int wheel_func(double index){
 	SDL_RenderCopy(renderer, one_arm_texture, NULL, &one_arm_rect);
 
 	SDL_Rect coin_rect_pos={700, 1020, coin_rect.w, coin_rect.h};
- 	SDL_RenderCopy(renderer, coin_texture, NULL, &coin_rect_pos);	
+ 	SDL_RenderCopy(renderer, coin_texture, NULL, &coin_rect_pos);
 	for (int i=0; i<4; i++){
 		SDL_Rect coin_rect_pos={700, 400-10*i, coin_rect.w, coin_rect.h};
-		SDL_RenderCopy(renderer, coin_texture, NULL, &coin_rect_pos);	
-	}	
+		SDL_RenderCopy(renderer, coin_texture, NULL, &coin_rect_pos);
+	}
 
 	SDL_Rect src_rect, dst_rect=object_rect;
 	dst_rect.h=object_height*1.5;			// display 1.5 object on screen for a wheel
 	src_rect=dst_rect;
 	src_rect.x=0;
-	
+
 
 	for(int i=0; i<3; i++){
 		// src_rect.y is positionned here on the 2nd object of objects.png
-		src_rect.y=object_height*index;  
-		dst_rect.x=85 + i*104 + 1;  
+		src_rect.y=object_height*index;
+		dst_rect.x=85 + i*104 + 1;
 		dst_rect.y=410-object_height/2;     // setup the coord. of the icon in the global renderer
 		SDL_RenderCopy(renderer, objects_texture, &src_rect, &dst_rect);
 	}
-	
+
 	SDL_RenderPresent(renderer);
 	sleep(0.1);
 	return 0;
diff --git a/one_armed_bandit.c b/one_armed_bandit.c
index 11028d5938422dacbb238f783943a0dbca24200c..96bd75b5278f68dae0807e0e1fa4508d5bb1c62b 100644
--- a/one_armed_bandit.c
+++ b/one_armed_bandit.c
@@ -10,11 +10,53 @@
 #include "display.h"
 #include "one_armed_bandit.h"
 
+int insert_coin(){
+
+}
+
+int set_wheel_speed(int index){
+
+}
+
+int next_wheel(){
+
+}
 
 
 int main()
 {
   display_func(NULL);
 
+  SDL_Event event;
+	bool quit=false;
+	do {
+		SDL_WaitEvent(&event);				// passive waiting on an event
+	 	switch (event.type)
+		{
+			case SDL_QUIT:						// if SDL_Quit() called
+				quit=true;
+	 			break;
+			case SDL_WINDOWEVENT:
+				if (event.window.event==SDL_WINDOWEVENT_CLOSE) // if windows closed by user
+					{
+						quit=true;
+					}
+				break;
+			case SDL_KEYDOWN:					// if key pressed
+				switch(event.key.keysym.sym)
+				{
+					case SDLK_ESCAPE:
+	 						quit=true;
+						break;
+					case SDLK_SPACE:
+						wait_key_release();
+	 					break;
+					case SDLK_s:
+	 					wait_key_release();
+	 					break;
+	 		  }
+	 	}
+	} while(!quit);
+
 	return 0;
 }
diff --git a/one_armed_bandit.h b/one_armed_bandit.h
index 358fb066f1e2aa3066d93f8e925dd2b34645e4f0..13d21dbf7a4d5245a3afcf5aaef04a769e944f76 100644
--- a/one_armed_bandit.h
+++ b/one_armed_bandit.h
@@ -5,5 +5,14 @@
 #define OBJECT_NB 7
 #define WHEEL_NB 3
 
+typedef struct machine_a_sous{
+  wheel* wheels;
+  int player_wallet;
+  int machine_wallet;
+} machine;
+
+int insert_coin();
+int set_wheel_speed(int index);
+int next_wheel();
 
 #endif
diff --git a/threads.c b/threads.c
new file mode 100644
index 0000000000000000000000000000000000000000..3aa85332ed70b52d4874675d3bcdeeff6fe36842
--- /dev/null
+++ b/threads.c
@@ -0,0 +1,70 @@
+#define __GNU_SOURCE
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <pthread.h>
+#include <unistd.h>
+#include <sys/types.h>
+
+#include "threads.h"
+
+
+int run_thread(pthread_t* t, void* (*fn )(void*), void *arg){
+  int err = pthread_create(t, NULL, fn, arg);
+  if (err) perror("Thread creation error");
+  return err;
+}
+
+int wait_for_thread(pthread_t t){
+  int err = pthread_join(t, NULL);
+  if (err) perror("Thread join error");
+  // else printf("thread joined\n");
+  return err;
+}
+
+int run_thread_and_wait (void* (*fn )(void*), void *arg){
+  pthread_t t;
+  int err = pthread_create(&t, NULL, fn, arg);
+  if (err) {
+    perror("Thread creation error");
+    return err;
+  }
+  err = pthread_join(t, NULL);
+  if (err) perror("Thread join error");
+  //else printf("thread joined\n");
+  return err;
+}
+
+int run_threads_and_wait(void* (*fn )(void*), void** arg, int size_of_arg_type, int t_cnt){
+  pthread_t *t = malloc(t_cnt*sizeof(pthread_t));
+
+  for(int i = 0; i<t_cnt; i++){
+    int err = run_thread(&t[i], fn, (*arg) + size_of_arg_type*i);
+    if(err) return 1;
+  }
+
+  for(int i = 0; i<t_cnt; i++){
+    int err = wait_for_thread(t[i]);
+    if(err) return 2;
+  }
+
+  free(t);
+  return 0;
+}
+
+int run_threads_and_wait_single_param(void* (*fn )(void*), void* arg, int t_cnt){
+  pthread_t *t = malloc(t_cnt*sizeof(pthread_t));
+
+  for(int i = 0; i<t_cnt; i++){
+    int err = run_thread(&t[i], fn, arg);
+    if(err) return 1;
+  }
+
+  for(int i = 0; i<t_cnt; i++){
+    int err = wait_for_thread(t[i]);
+    if(err) return 2;
+  }
+
+  free(t);
+  return 0;
+}
diff --git a/threads.h b/threads.h
new file mode 100644
index 0000000000000000000000000000000000000000..437e6efae56813c4ebe534778cd397100b1f7361
--- /dev/null
+++ b/threads.h
@@ -0,0 +1,31 @@
+/**
+* Authors : Sitbon Benjamin, Beck Léonard
+* Small library to ease the use of pthread
+*/
+
+
+/*
+                      ___               _
+                     / _ )___ _________(_)__ ____
+                    / _  / _ `/ __/ __/ / -_) __/
+                   /____/\_,_/_/ /_/ /_/\__/_/
+
+  |^|                 |^|                 |^|                 |^|
+  | |-| |-| |-| |-| |-| |-| |-| |-| |-| |-| |-| |-| |-| |-| |-| |
+  | |-| |-| |-| |-| |-| |-| |-| |-| |-| |-| |-| |-| |-| |-| |-| |
+  | |-| |-| |-| |-| |-| |-| |-| |-| |-| |-| |-| |-| |-| |-| |-| |
+
+*/
+#define __GNU_SOURCE
+
+// #include <stdio.h>
+// #include <stdlib.h>
+#include <pthread.h>
+#include <unistd.h>
+#include <sys/types.h>
+
+int run_thread(pthread_t* t, void* (*fn )(void*), void *arg);
+int wait_for_thread(pthread_t t);
+int run_thread_and_wait (void* (*fn )(void*), void *arg);
+int run_threads_and_wait(void* (*fn )(void*), void** arg, int size_of_arg_type, int t_cnt);
+int run_threads_and_wait_single_param(void* (*fn )(void*), void* arg, int t_cnt);
diff --git a/wheel.c b/wheel.c
new file mode 100644
index 0000000000000000000000000000000000000000..716c7910d46e889a6a986771672a770bfad4e71d
--- /dev/null
+++ b/wheel.c
@@ -0,0 +1,7 @@
+int set_speed(int s){
+
+}
+
+int get_current_px(){
+
+}
diff --git a/wheel.h b/wheel.h
new file mode 100644
index 0000000000000000000000000000000000000000..2ec8c28cd0789626e9f9076585395a9bb71e48ad
--- /dev/null
+++ b/wheel.h
@@ -0,0 +1,7 @@
+typedef struct roue{
+  int speed;
+  int current_px;
+} wheel;
+
+int set_speed(int s);
+int get_current_px();