diff --git a/app/controller/ContactController.php b/app/controller/ContactController.php
new file mode 100644
index 0000000000000000000000000000000000000000..8942bf0507aee41ad13e9e912c6fe204a26fbcbe
--- /dev/null
+++ b/app/controller/ContactController.php
@@ -0,0 +1,62 @@
+<?php
+class ContactController extends Controller { // classe de contrôleur pour l'inscription au site
+
+	public function displayValid() { // la fonction d'affichage du formulaire
+		$this->view->display();
+	}
+
+	public function displayForm() { // la fonction d'affichage du formulaire
+		$this->view->display();
+	}
+
+	public function send() { // vérifie les données de contact
+		if(!isset($_POST['nom']) || !isset($_POST['prenom']) || !isset($_POST['email']) || !isset($_POST['message'])) { // si l'une des données manque, erreur
+			//appeler une fonction d'erreur
+			echo "<h1>Erreur : variables absentes</h1>";
+			die();
+		}
+		$data = $_POST;
+		
+		if($data['nom'] == "") {
+			session_start(); // on démarre une session pour avoir accès aux variables superglobales de session
+			$_SESSION["contactErrCode"] = 2; // on stocke le code d'erreur
+			header('Location:../contact'); // on redirige vers la page de formulaire (il faut faire un retour dans le dossier parent pour que ça fonctionne)
+		}
+		if($data['prenom'] == "") {
+			session_start(); // on démarre une session pour avoir accès aux variables superglobales de session
+			$_SESSION["contactErrCode"] = 3; // on stocke le code d'erreur
+			header('Location:../contact'); // on redirige vers la page de formulaire (il faut faire un retour dans le dossier parent pour que ça fonctionne)
+		}
+		if(!preg_match("#^[a-z0-9._-]+(@|%40)[a-z0-9._-]{2,}\.[a-z]{2,4}$#", $data['email'])) {
+			session_start(); // on démarre une session pour avoir accès aux variables superglobales de session
+			$_SESSION["contactErrCode"] = 4; // on stocke le code d'erreur
+			header('Location:../contact'); // on redirige vers la page de formulaire (il faut faire un retour dans le dossier parent pour que ça fonctionne)
+		}
+		if($data['message'] == null) {
+			session_start(); // on démarre une session pour avoir accès aux variables superglobales de session
+			$_SESSION["contactErrCode"] = 5; // on stocke le code d'erreur
+			header('Location:../contact'); // on redirige vers la page de formulaire (il faut faire un retour dans le dossier parent pour que ça fonctionne)
+		}
+		
+		$sender = $data['prenom'];
+		if($data['pseudo'] != "") $sender .= " '".$data['pseudo']."'";
+		$sender .= " ".$data['nom'];
+		
+		$header = "From: \"".$sender."\"<".$data['email'].">\n";
+		$header.= "Reply-to: \"".$sender."\"<".$data['email'].">\n";
+		$header.= "MIME-Version: 1.0\n";
+		
+		$success = mail(
+			"vbochet@gmail.com", // adresse email du destinataire
+			"Message envoyé via Classements Ludiques", // objet du mail
+			htmlspecialchars($data['message']), // message du mail
+			$header);// on réalise l'inscription à l'aide d'une méthode de la classe Register
+		if ($success == 1) {
+			header('Location:valid'); // on redirige vers la  page OK
+		} 
+		else {
+			echo "<h1>Erreur : l'envoi du mail a échoué</h1>";
+		}
+	}
+	
+}
diff --git a/app/controller/JeuController.php b/app/controller/JeuController.php
index 84da026d732f7b9e551b238734f6981e35b2e29f..1b10c85ab47e37c35ce13c600c83f5c76b1d5031 100644
--- a/app/controller/JeuController.php
+++ b/app/controller/JeuController.php
@@ -32,11 +32,42 @@ class JeuController extends Controller {
 	}
 
 	public function displayFormAdd() {
+        session_start();
+        
+        if(isset($_SESSION['addRequestErrCode'])) { // si message d'erreur
+            $errCode = $_SESSION['addRequestErrCode'];
+            if ($errCode == 1) { // on détermine le message
+                $errMsg = "<h3>Ce jeu est déjà dans la base !</h3>";
+            } elseif ($errCode == 2) {
+                $errMsg = "<h3>Image manquante</h3>";
+            } elseif ($errCode == 5) {
+                $errMsg = "<h3>Problème sur l'image</h3>";
+            } elseif ($errCode == 6) {
+                $errMsg = "<h3>Le fichier n'est pas une image</h3>";
+            } elseif ($errCode == 7) {
+                $errMsg = "<h3>L'image est trop grande</h3>";
+            } elseif ($errCode == 8) {
+                $errMsg = "<h3>Les valeurs pour les joueurs et/ou les équipes doivent être des nombres.</h3>";
+            } elseif ($errCode == 9) {
+                $errMsg = "<h3>Les valeurs pour les joueurs et/ou les équipes sont incohérentes.</h3>";
+            }
+			elseif ($errCode == 10) {
+				$errMsg = "<h3>Les joueurs/équipes max ne sont pas remplis.</h3><p><em>Si vous ne voulez pas les remplir, cochez la case infini, ou changez de type de jeu.</em></p>";
+			}
+            else{
+                $errMsg = "<h3>Exception non gérée.</h3>";
+            }
+            unset($_SESSION['addRequestErrCode']);
+            $this->view->errMsg = $errMsg;
+        }
+         
 		$this->view->display();
 	}
 
 	public function addRequest() {
-		if(!isset($_POST['nom']) || !isset($_POST['description'])) { // si l'une des données manque, erreur
+		session_start();
+		if(!isset($_POST['nom']) || !isset($_POST['description']) || !isset($_POST['type']) || !isset($_POST['type_scores'])
+		|| !isset($_POST['max_joueurs']) ||!isset($_POST['min_joueurs'])) { // si l'une des données manque, erreur
 			//appeler une fonction d'erreur
 			echo "<h1>Erreur : variables absentes</h1>";
 			die();
@@ -46,25 +77,92 @@ class JeuController extends Controller {
         $data['slug_jeu'] = self::slugify($_POST['nom']);
 
         $result = Jeu::checkExists($data['slug_jeu']); // vérifie si le jeu n'est pas encore dans la BDD
-
+        $_POST['type_scores'] = self::slugify($_POST['type_scores']);
         if($result == 0) { // connexion valide
 			if(isset($_FILES['image'])) {
 				list($err, $image) = getImage($_FILES['image'], 512, 512);
 				if ($err == 0) {
 					saveImage($image, ROOT."/www/images/jeu/".$data['slug_jeu'].".jpg");
 				} elseif($err == 1) {
-					session_start(); // on démarre une session pour avoir accès aux variables superglobales de session
 					$_SESSION["addRequestErrCode"] = 2; // on stocke le code d'erreur
 					header('Location:../addjeu'); // on redirige vers la page de formulaire (il faut faire un retour dans le dossier parent pour que ça fonctionne)
 					die();
 				} else {
-					session_start(); // on démarre une session pour avoir accès aux variables superglobales de session
 					$_SESSION["addRequestErrCode"] = $err; // on stocke le code d'erreur
 					header('Location:../addjeu'); // on redirige vers la page de formulaire (il faut faire un retour dans le dossier parent pour que ça fonctionne)
 					die();
 				}
-				Jeu::addRequest($data['nom'], $data['description'], $data['slug_jeu'], 0);// on ajoute le jeu à la BDD avec
+
+				if(!is_numeric($data['min_joueurs'])) {
+					$_SESSION["addRequestErrCode"] = 8; // on stocke le code d'erreur
+					header('Location:../addjeu'); // on redirige vers la page de formulaire (il faut faire un retour dans le dossier parent pour que ça fonctionne)
+					die();
+				}
+
+				if($data['min_joueurs'] < 0) {
+					$_SESSION["addRequestErrCode"] = 9; // on stocke le code d'erreur
+					header('Location:../addjeu'); // on redirige vers la page de formulaire (il faut faire un retour dans le dossier parent pour que ça fonctionne)
+					die();
+				}
+
+				if(!isset($data['max_joueurs_inf']) && ($data['max_joueurs'] < 0 || $data['max_joueurs'] < $data['min_joueurs'])) {
+                    if(!is_numeric($data['max_joueurs']))
+                        $_SESSION["addRequestErrCode"] = 10;
+                    else
+                        $_SESSION["addRequestErrCode"] = 9; // on stocke le code d'erreur
+					header('Location:../addjeu'); // on redirige vers la page de formulaire (il faut faire un retour dans le dossier parent pour que ça fonctionne)
+					die();
+				}
+
+				if($data['type'] == "Chacun pour soi"){
+                    $_POST['type'] = "duels";
+					if(isset($data['max_joueurs_inf']) && $data['max_joueurs_inf'])
+						Jeu::addRequest($data['nom'], $data['description'], $data['slug_jeu'], 0, $_POST['type'], $data['type_scores'], $data['min_joueurs']);// on ajoute le jeu à la BDD avec
+					else{
+						Jeu::addRequest($data['nom'], $data['description'], $data['slug_jeu'], 0, $_POST['type'], $data['type_scores'], $data['min_joueurs'], $data['max_joueurs']);// on ajoute le jeu à la BDD avec
+					}
 				header('Location:requestvalid'); // on redirige vers la  page OK
+				}
+				else if ($data['type'] == "Équipes"){
+                    $_POST['type'] = "equipes";
+					if(!isset($data['max_equipes']) || !isset($data['min_equipes'])) {
+						echo "<h1>Erreur : variables absentes</h1>";
+						die();
+					}
+					if(!is_numeric($data['min_equipes'])) {
+						$_SESSION["addRequestErrCode"] = 8; // on stocke le code d'erreur
+						header('Location:../addjeu'); // on redirige vers la page de formulaire (il faut faire un retour dans le dossier parent pour que ça fonctionne)
+						die();
+					}
+					if($data['min_equipes'] < 0) {
+						$_SESSION["addRequestErrCode"] = 9; // on stocke le code d'erreur
+						header('Location:../addjeu'); // on redirige vers la page de formulaire (il faut faire un retour dans le dossier parent pour que ça fonctionne)
+						die();
+					}
+					if(!isset($data['max_equipes_inf']) && ($data['max_equipes'] < 0 || $data['max_equipes'] < $data['min_equipes'])) {
+						if(!is_numeric($data['max_equipes']))
+							$_SESSION["addRequestErrCode"] = 10;
+						else
+							$_SESSION["addRequestErrCode"] = 9; // on stocke le code d'erreur
+						header('Location:../addjeu'); // on redirige vers la page de formulaire (il faut faire un retour dans le dossier parent pour que ça fonctionne)
+						die();
+					}
+                    if(isset($data['max_joueurs_inf']) && $data['max_joueurs_inf']){
+					if(isset($data['max_equipes_inf']) && $data['max_equipes_inf'])
+						Jeu::addRequest($data['nom'], $data['description'], $data['slug_jeu'], 0, $data['type'], $data['type_scores'], $data['min_joueurs'], null, $data['min_equipes']);// on ajoute le jeu à la BDD avec
+					else{
+						Jeu::addRequest($data['nom'], $data['description'], $data['slug_jeu'], 0, $data['type'], $data['type_scores'], $data['min_joueurs'], null, $data['min_equipes'], $data['max_equipes']);// on ajoute le jeu à la BDD avec
+					}
+                    }
+                    else{
+                        if(isset($data['max_equipes_inf']) && $data['max_equipes_inf'])
+                            Jeu::addRequest($data['nom'], $data['description'], $data['slug_jeu'], 0, $data['type'], $data['type_scores'], $data['min_joueurs'], $data['max_joueurs'], $data['min_equipes']);// on ajoute le jeu à la BDD avec
+                        else{
+                            Jeu::addRequest($data['nom'], $data['description'], $data['slug_jeu'], 0, $data['type'], $data['type_scores'], $data['min_joueurs'], $data['max_joueurs'],  $data['min_equipes'], $data['max_equipes']);// on ajoute le jeu à la BDD avec
+                        }
+                    }
+                    header('Location:requestvalid');
+				}
 			} else {
 				session_start(); // on démarre une session pour avoir accès aux variables superglobales de session
 				$_SESSION["addRequestErrCode"] = 2; // on stocke le code d'erreur
@@ -83,4 +181,36 @@ class JeuController extends Controller {
     public function displayRequestValid() { // la fonction d'affichage de réussite
         $this->view->display(); // on affiche la page avec le message de réussite
     }
+
+    public function displayFavorisValid() { // la fonction d'affichage de réussite
+		session_start(); // on démarre une session pour avoir accès aux variables superglobales de session
+		$slug_jeu = $this->route["params"]["slug"];
+		if(!isset($_SESSION['connected'])) { // vérification que membre connecté
+			$this->view->msg_error = "Vous n'êtes pas connecté !";
+			$this->view->sous_msg = "Connectez-vous, puis revenez ajouter ce jeu. :)";
+			$this->view->display(); // on affiche la page avec le message d'erreur
+		}
+		else if(!(Jeu::checkExists($slug_jeu))) { // vérification que jeu existe
+			$this->view->msg_error = "Ce jeu n'existe pas !";
+			$this->view->sous_msg = "Vous pouvez peut-être demander son ajout via le formulaire de demande d'ajout de jeu. :)";
+			$this->view->display(); // on affiche la page avec le message d'erreur
+		}
+		else if(Profil::checkJeuFavoris($_SESSION['user']->slug, $slug_jeu)) { // si jeu déjà dans favoris => on le retire
+			Profil::upadteJeuFavoris($_SESSION['user']->slug, $slug_jeu, 0);
+			$this->view->msg_success = "Ce jeu a été retiré de vos favoris !";
+			$this->view->sous_msg = "Il en faut pour tous les goûts ! :)";
+			$this->view->display(); // on affiche la page avec le message de réussite
+		}
+		else { // sinon, on le met en favoris
+			if(Profil::checkADejaJoue($_SESSION['user']->slug, $slug_jeu)) { // si une ligne joueur-jeu existe déjà => UPDATE
+				Profil::upadteJeuFavoris($_SESSION['user']->slug, $slug_jeu, 1);
+			}
+			else { // sinon => INSERT avec des null pour le classement et le score
+				Profil::insertJeuFavoris($_SESSION['user']->slug, $slug_jeu, 1);
+			}
+			$this->view->msg_success = "Ce jeu a été ajouté à vos favoris !";
+			$this->view->sous_msg = ":)";
+			$this->view->display(); // on affiche la page avec le message de réussite
+		}
+    }
 }
diff --git a/app/kernel/Router.php b/app/kernel/Router.php
index 60c0bc0561a141c36e4c2d44b393b63d985dd154..3ff09c27f1d3a50bb67185cbf0d0ab84474a91a0 100644
--- a/app/kernel/Router.php
+++ b/app/kernel/Router.php
@@ -55,6 +55,11 @@ class Router
 				$result["action"] = "displayRequestValid";
 				// il n'y a pas de paramètres attendus, on n'affecte pas $result["params"]
 			}
+			else if($parts[0] == "add_favoris" && count($parts) == 2) { // pour ajouter un jeu à ses favoris (add_favoris/nomdujeu)
+				$result["controller"] = "Jeu";
+				$result["action"] = "displayFavorisValid";
+				$result["params"]["slug"] = $parts[1]; //on a des paramètres dans l'URL (normalement le slug du jeu), on le stocke aussi
+			}
 			
 			/*** consultation des profils ***/
 			else if($parts[0] == "profil" && count($parts) == 2) { // consultation d'un profil : 2 morceaux (profil/pseudoDeLaPersonne)
@@ -87,7 +92,7 @@ class Router
 					$result["params"]["slug"] = $result["params"]["slug"].'/'.$parts[$k];
 				}
 			}
-			
+
 			/*** connexion au site ***/
 			else if($parts[0] == "connexion" && count($parts) == 1) { // formulaire de connexion
 				$result["controller"] = "Connexion"; 
@@ -124,7 +129,22 @@ class Router
 				$result["action"] = "save"; // "save" pour appeler la méthode d'enregistrement dans la BDD
 			}
 
-            /*** Ajout de partie ***/
+			/*** contact au site ***/
+			else if($parts[0] == "contact" && count($parts) == 1) { // formulaire de connexion
+				$result["controller"] = "Contact"; 
+				$result["action"] = "displayForm"; // "displayForm" pour afficher le formulaire
+			}
+			else if($parts[0] == "contact" && count($parts) == 2 && $parts[1] == "valid") { // connexion réussie
+				$result["controller"] = "Contact"; 
+				$result["action"] = "displayValid"; // "displayValid" pour afficher la page avec le message de réussite
+			}
+			else if($parts[0] == "contact" && count($parts) == 2 && $parts[1] == "send") { // réalisation de l'inscription dans la BDD
+				$result["controller"] = "Contact"; 
+				$result["action"] = "send"; // "save" pour appeler la méthode d'enregistrement dans la BDD
+			}
+
+
+			/*** Ajout de partie ***/
             else if ($parts[0] == "add_partie" && count($parts) == 1) {
                 $result["controller"] = "Partie";
                 $result["action"] = "displayStep0";
diff --git a/app/kernel/View.php b/app/kernel/View.php
index 65c48bef3086f2660d4fbde60f864e7a3d641327..6b1a1467b901b7aaad3c3da53046f13af5e38748 100644
--- a/app/kernel/View.php
+++ b/app/kernel/View.php
@@ -24,6 +24,9 @@ class View { // classe abstraite pour les vues
 	}
 	
 	public function __get($key) { // idem, mais pour les getters. :-)
-		return $this->data[$key];
+		if(isset($this->data[$key]))
+			return $this->data[$key];
+		else
+			return null;
 	}
 }
diff --git a/app/model/Jeu.php b/app/model/Jeu.php
index f873c0355e543749ab6e61aef73c25f3e11c95f4..743c804838190916c709bba7a189e11cb65ac41b 100644
--- a/app/model/Jeu.php
+++ b/app/model/Jeu.php
@@ -75,11 +75,12 @@ class Jeu extends Model {
       return 0; // on aurait pu mettre deux return (un dans le if et un ici), mais bon...
    }
 
-   public static function addRequest($nom_jeu, $description, $slug_jeu, $est_valide) {
+   public static function addRequest($nom_jeu, $description, $slug_jeu, $est_valide, $type, $type_scores, $min_joueurs, $max_joueurs=null, $min_equipes=null, $max_equipes=null) {
       $db = Database::getInstance();
-      $sql = "INSERT INTO R_jeu (nom, description, slug, est_valide) VALUES (:nom, :description, :slug, :est_valide);";
-      $stmt = $db->prepare($sql);
-      if($stmt->execute(array(":nom" => $nom_jeu, ":description" => $description, ":slug" => $slug_jeu, ":est_valide" => $est_valide))) {
+      $sql = "INSERT INTO R_jeu (nom, description, slug, est_valide, min_joueurs, max_joueurs, min_equipes, max_equipes, type, type_scores)
+              VALUES (:nom, :description, :slug, :est_valide, :min_joueurs, :max_joueurs, :min_equipes, :max_equipes, :type, :type_scores);";
+       $stmt = $db->prepare($sql);
+      if($stmt->execute(array(":nom" => $nom_jeu, ":description" => $description, ":slug" => $slug_jeu, ":est_valide" => $est_valide, ":type" => $type, ":type_scores" => $type_scores, ":min_joueurs" => $min_joueurs, ":max_joueurs" => $max_joueurs, ":min_equipes" => $min_equipes, ":max_equipes" => $max_equipes))) {
           //ok
       }
        else {
diff --git a/app/model/Profil.php b/app/model/Profil.php
index 1a05985e74ce4d0b2e9570af6bc36b4be492f29a..0fd63f1e87755f958a7b108051bedae35f55b361 100644
--- a/app/model/Profil.php
+++ b/app/model/Profil.php
@@ -71,6 +71,44 @@ class Profil extends Model { // classe de modèle pour l'affichage de profils
 
 		return 0; // on aurait pu mettre deux return (un dans le if et un ici), mais bon...
 	}
+	
+	public static function checkJeuFavoris($slug_joueur, $slug_jeu) { // méthode permettant de vérifier si un jeu est jeu favoris d'un joueur
+		$db = Database::getInstance(); // on récupère la connexion à la BDD
+		$sql = "SELECT * FROM R_joueur_jeu WHERE joueur = :slug_j AND jeu = :slug_jeu AND est_jeu_favoris";
+		$req = $db->prepare($sql); // on prépare la requête
+		$req->execute(array(":slug_j" => $slug_joueur, ":slug_jeu" => $slug_jeu)); // on remplace les variables dans la requête
+
+		if($result = $req->fetch()) { // on récupère l'enregistrement, s'il existe
+			return 1;
+		}
+		return 0;
+	}
+	
+	public static function checkADejaJoue($slug_joueur, $slug_jeu) { // méthode permettant de vérifier si un joueur a déjà joué à un jeu
+		$db = Database::getInstance(); // on récupère la connexion à la BDD
+		$sql = "SELECT * FROM R_joueur_jeu WHERE joueur = :slug_j AND jeu = :slug_jeu";
+		$req = $db->prepare($sql); // on prépare la requête
+		$req->execute(array(":slug_j" => $slug_joueur, ":slug_jeu" => $slug_jeu)); // on remplace les variables dans la requête
+
+		if($result = $req->fetch()) { // on récupère l'enregistrement, s'il existe
+			return 1;
+		}
+		return 0;
+	}
+	
+	public static function upadteJeuFavoris($slug_joueur, $slug_jeu, $favoris) { // méthode permettant de définir un jeu comme étant jeu favoris d'un joueur, ou l'inverse
+		$db = Database::getInstance(); // on récupère la connexion à la BDD
+		$sql = "UPDATE R_joueur_jeu SET est_jeu_favoris = :favoris WHERE joueur = :slug_j AND jeu = :slug_jeu";
+		$req = $db->prepare($sql); // on prépare la requête
+		$req->execute(array(":favoris" => $favoris, ":slug_j" => $slug_joueur, ":slug_jeu" => $slug_jeu)); // on remplace les variables dans la requête
+	}
+	
+	public static function insertJeuFavoris($slug_joueur, $slug_jeu, $favoris) { // méthode permettant de définir un jeu comme étant jeu favoris d'un joueur, ou l'inverse
+		$db = Database::getInstance(); // on récupère la connexion à la BDD
+		$sql = "INSERT INTO R_joueur_jeu VALUES (:slug_joueur, :slug_jeu, null, null, :favoris) ";
+		$req = $db->prepare($sql); // on prépare la requête
+		$req->execute(array(":slug_joueur" => $slug_joueur, ":slug_jeu" => $slug_jeu, ":favoris" => $favoris)); // on remplace les variables dans la requête
+	}
 }
 
 
diff --git a/app/view/Contact/displayForm.html b/app/view/Contact/displayForm.html
new file mode 100644
index 0000000000000000000000000000000000000000..be0b9b6a50155dc16fc6513e84764c819bfc94b4
--- /dev/null
+++ b/app/view/Contact/displayForm.html
@@ -0,0 +1,95 @@
+<?php 
+	session_start(); 
+	
+	$page_title = "Formulaire de contact"; 
+	include(ROOT."/app/view/Includes/header.include.html");
+?>
+
+
+	<?php 
+		if(isset($_SESSION['contactErrCode'])) { // si message d'erreur
+			$errCode = $_SESSION['contactErrCode'];
+			if($errCode == 2) { // on détermine le message
+				$errMsg = '<h3>Veuillez indiquer votre nom !</h3>';
+			} 
+			elseif($errCode == 3) { 
+				$errMsg = '<h3>Veuillez indiquer votre prénom !</h3>';
+			} 
+			elseif($errCode == 4) {
+				$errMsg = '<h3>Veuillez indiquer une adresse mail valide !</h3>';
+			}
+			elseif($errCode == 5) { 
+				$errMsg = '<h3>Veuillez indiquer votre message !</h3>';
+			} 
+			echo '<article class="msg-erreur">'.$errMsg.'</article>'; // on affiche le message
+			unset($_SESSION['contactErrCode']); // on retire la variable de session
+		}
+	?>
+	
+	
+    <article>
+        <h2>Formulaire de contact</h2>
+        <div class="inscription-form">
+			<form  method="post" action="contact/send"  enctype="multipart/form-data" onsubmit="return checkForm();">
+				
+				<div class="form-line">
+					<div class="validation-container-left">
+						<label for="pseudo">Pseudo : </label>
+						<input type="text" name="pseudo" id="pseudo" />
+					</div>
+				</div>
+				<div class="form-line">
+					<div class="validation-container-left">
+						<label for="nom">Nom* : </label>
+						<input type="text" required="" name="nom" id="nom" />
+					</div>
+					<div class="validation-container">
+						<span id="rsp_nom" class="validation-container-content"></span>
+						<input type="checkbox" disabled name="valid_nom" class="validation-checkbox" />
+					</div>
+				</div>
+				<div class="form-line">
+					<div class="validation-container-left">
+						<label for="prenom">Prénom* : </label>
+						<input type="text" required="" name="prenom" id="prenom" />
+					</div>
+					<div class="validation-container">
+						<span id="rsp_prenom" class="validation-container-content"></span>
+						<input type="checkbox" disabled name="valid_prenom" class="validation-checkbox" />
+					</div>
+				</div>
+				<div class="form-line">
+					<div class="validation-container-left">
+						<label for="email">Adresse e-mail* : </label>
+						<input type="email" required="" name="email" id="email" onchange="if(this.value != '') checkEmail(this.value, this.id);" />
+					</div>
+					<div class="validation-container">
+						<span id="rsp_email" class="validation-container-content"></span>
+						<input type="checkbox" disabled name="valid_email" class="validation-checkbox" />
+					</div>
+				</div>
+				<div class="form-line">
+					<div class="validation-container-left">
+						<label for="description">Votre message* : </label>
+						<textarea required="" name="message" id="message"></textarea>
+					</div>
+					<div class="validation-container">
+						<span id="rsp_message" class="validation-container-content"></span>
+						<input type="checkbox" disabled name="valid_message" class="validation-checkbox" />
+					</div>
+				</div>
+				<div class="submit">
+					<input type="reset" name="reset" value="Réinitialiser">
+					<input type="submit" name="submit" value="Envoyer">
+				</div>
+			</form>
+        </div>
+    </article>
+	
+	
+	
+	<script type="text/javascript" src="<?php echo BASE_URL; ?>/js/jquery.min.js"></script>
+	<script type="text/javascript" src="<?php echo BASE_URL; ?>/js/verif_form_contact.js"></script>
+	
+	
+<?php include(ROOT."/app/view/Includes/footer.include.html"); ?>
diff --git a/app/view/Contact/displayValid.html b/app/view/Contact/displayValid.html
new file mode 100644
index 0000000000000000000000000000000000000000..d919b943c6e438cb8b89b27f49a2319f3430d939
--- /dev/null
+++ b/app/view/Contact/displayValid.html
@@ -0,0 +1,11 @@
+<?php 
+	$page_title = "Message envoyé"; 
+	include(ROOT."/app/view/Includes/header.include.html");
+?>
+
+	<article class="msg-valide"><h2>Votre message a été envoyé !</h2></article>
+	<article>
+		<p>Vous pouvez continuer à naviguer sur notre site. :)</p>
+	</article>
+	
+<?php include(ROOT."/app/view/Includes/footer.include.html"); ?>
diff --git a/app/view/Jeu/display.html b/app/view/Jeu/display.html
index 6d7cb413d9c5444b913eb7da7896740cfde7c692..0e5d6151c38a44aeaad3d3d04c4316176cff1768 100644
--- a/app/view/Jeu/display.html
+++ b/app/view/Jeu/display.html
@@ -12,6 +12,26 @@
                     <?php echo $this->jeu->description; ?>
                 </p>
             </div>
+			<?php 
+			if(isset($_SESSION['connected']) && $_SESSION['connected'] == true) {
+				if(Profil::checkJeuFavoris($_SESSION['user']->slug, $this->jeu->slug)) {
+				?>
+				<h2 class="stat-title">Vous n'aimez plus ce jeu ?</h2>
+				<div class="inscription-btn-container">
+					<a class="inscription-btn" href="<?php echo BASE_URL; ?>/add_favoris/<?php echo $this->jeu->slug; ?>">Retirez-le de vos favoris !</a>
+				</div>
+				<?php 
+				}
+				else {
+				?>
+				<h2 class="stat-title">Vous aimez ce jeu ?</h2>
+				<div class="inscription-btn-container">
+					<a class="inscription-btn" href="<?php echo BASE_URL; ?>/add_favoris/<?php echo $this->jeu->slug; ?>">Ajoutez-le à vos favoris !</a>
+				</div>
+				<?php 
+				}
+			}
+			?>
         </article>
         <div class="classement-card">
             <table class="classement-table">
diff --git a/app/view/Jeu/displayFavorisValid.html b/app/view/Jeu/displayFavorisValid.html
new file mode 100644
index 0000000000000000000000000000000000000000..c73d7cb1fc2f16e97ea081d643265fb429b563e4
--- /dev/null
+++ b/app/view/Jeu/displayFavorisValid.html
@@ -0,0 +1,23 @@
+<?php 
+	// session déjà démarrée dans le contrôleur, pas besoin de le faire ici
+	
+	$page_title = "Ajout du jeu à ses favoris"; 
+	include(ROOT."/app/view/Includes/header.include.html");
+	
+	if(!is_null($this->msg_success)) {
+?>
+	<article class="msg-valide"><h2><?php echo $this->msg_success; ?></h2></article>
+<?php 
+	}
+	else if(!is_null($this->msg_error)) {
+?>
+	<article class="msg-erreur"><h2><?php echo $this->msg_error; ?></h2></article>
+<?php 
+	}
+?>
+
+	<article>
+		<p><?php echo $this->sous_msg; ?></p>
+	</article>
+
+<?php include(ROOT."/app/view/Includes/footer.include.html"); ?>
diff --git a/app/view/Jeu/displayFormAdd.html b/app/view/Jeu/displayFormAdd.html
index 195b72b65701b9737ce4fad7cc45282a8bdf8759..9b704e76bdea692dfa9dc5c7747fd9e5137fbf09 100644
--- a/app/view/Jeu/displayFormAdd.html
+++ b/app/view/Jeu/displayFormAdd.html
@@ -1,5 +1,4 @@
-<?php 
-	session_start();
+<?php
 	
 	if(!isset($_SESSION['connected']) || $_SESSION['connected'] != true) {
 		header('Location:'.BASE_URL);
@@ -9,38 +8,42 @@
 	include(ROOT."/app/view/Includes/header.include.html");
 ?>
 
-	<?php
-			if(isset($_SESSION['addRequestErrCode'])) { // si message d'erreur
-				$errCode = $_SESSION['addRequestErrCode'];
-				if($errCode == 1) { // on détermine le message
-					$errMsg = '<h3>Ce jeu est déjà dans la base !</h3>';
-				} elseif($errCode == 2) {
-					$errMsg = '<h3>Image manquante</h3>';
-				} elseif($errCode == 5) {
-					$errMsg = '<h3>Problème sur l\'image</h3>';
-				} elseif($errCode == 6) {
-					$errMsg = '<h3>Le fichier n\'est pas une image</h3>';
-				} elseif($errCode == 7) {
-					$errMsg = '<h3>L\'image est trop grande</h3>';
-				}
-				echo '<article class="msg-erreur">'.$errMsg.'</article>'; // on affiche le message
-				unset($_SESSION['addRequestErrCode']); // on retire la variable de session
-			}
-	?>
-   
-    <article>
-        <h2>Formulaire de demande d'ajout de jeu</h2>
-        <div class="addjeu-form">
-		   <form method="post" action="addjeu/addrequest" enctype="multipart/form-data">
-				<label for="nom">Nom du jeu :</label> <input type="text" name="nom" required="" id="nom" /> <br/>
-				<label for="description">Description :</label> <textarea name="description" id="description" ></textarea> <br/>
-				<label for="image">Image du jeu: </label>	<input type="file" required="" name="image" id="image" /><br/>
-				<div class="submit">
-					<input type="reset" name="reset" value="Réinitialiser">
-					<input type="submit" name="submit" value="Demander l'ajout">
-				</div>
-		   </form>
-        </div>
-    </article>
-	
+<?php	if (!is_null($this->errMsg)){ ?>
+<article class="msg-erreur"><?php echo $this->errMsg;?></article>
+<?php } ?>
+
+<article>
+    <h2>Formulaire de demande d'ajout de jeu</h2>
+    <div class="addjeu-form">
+        <form method="post" action="addjeu/addrequest" enctype="multipart/form-data">
+            <label for="nom">Nom du jeu * :</label> <input type="text" name="nom" required="" id="nom"/> <br/>
+            <label for="description">Description :</label> <textarea name="description" id="description"></textarea>
+            <br/>
+            <label for="type">Type de jeu * :</label>
+            <select name="type" required="" id="type">
+                <option>Équipes</option>
+                <option>Chacun pour soi</option>
+            </select><br/>
+
+            <label for="type_scores">Type du résultat * :</label>
+            <select name="type_scores" required="" id="type_scores">
+                <option>Scores</option>
+                <option>Classement</option>
+            </select><br/>
+
+            <label for="max_joueurs">Joueurs max : </label><input type="text" name="max_joueurs" id="max_joueurs"/><br/>
+            <label for="max_joueurs_inf">Joueurs max infini ?</label><input type="checkbox" name="max_joueurs_inf" id="max_joueurs_inf" value="1">
+            <label for="min_joueurs">Joueurs min * : </label><input type="text" name="min_joueurs" required="" id="min_joueurs"/><br/>
+            <label for="min_equipes">Equipes max : </label><input type="text" name="min_equipes" id="min_equipes"/><br/>
+            <label for="max_equipes">Equipes min : </label><input type="text" name="max_equipes" id="max_equipes"/><br/>
+            <label for="max_equipes_inf">Equipes max infini ?</label><input type="checkbox" name="max_equipes_inf" id="max_equipes_inf" value="1">
+            <label for="image">Image du jeu * (max 200x200px) : </label> <input type="file" required="" name="image" id="image"/><br/>
+            <div class="submit">
+                <input type="reset" name="reset" value="Réinitialiser">
+                <input type="submit" name="submit" value="Demander l'ajout">
+            </div>
+        </form>
+    </div>
+</article>
+
 <?php include(ROOT."/app/view/Includes/footer.include.html"); ?>
diff --git a/generate_base.sql b/generate_base.sql
index 22770ab4d3dbd7f8f9653e4a2636d134bad76cd6..54a7b5ebcffe1da5a1f885fd36dbfb57ecddab2e 100644
--- a/generate_base.sql
+++ b/generate_base.sql
@@ -8,7 +8,8 @@ CREATE TABLE R_jeu (
   min_joueurs INT(11),
   min_equipes INT(11),
   max_equipes INT(11),
-  type ENUM ('duels', 'equipes') NOT NULL
+  type ENUM ('duels', 'equipes') NOT NULL,
+  type_scores ENUM ('classement', 'scores') NOT NULL
 );
 
 DROP TABLE IF EXISTS R_joueur;
@@ -19,7 +20,8 @@ CREATE TABLE R_joueur (
   nom VARCHAR(150) NOT NULL,
   prenom VARCHAR(150) NOT NULL,
   email VARCHAR(255) UNIQUE NOT NULL,
-  description TEXT NOT NULL
+  description TEXT NOT NULL,
+  avatar BOOLEAN DEFAULT '0'
 );
 
 DROP TABLE IF EXISTS R_admin;
diff --git a/valeurs.sql b/valeurs.sql
index fbb392c4674fad9c75242ff440039f02870ac6e3..68537978e8caf73ba7156c44fd32ba2ca4e9d0ff 100644
--- a/valeurs.sql
+++ b/valeurs.sql
@@ -1,13 +1,13 @@
-INSERT INTO R_jeu (nom, description, slug, est_valide, min_joueurs, max_joueurs, min_equipes, max_equipes, type) VALUES
-('Rencontres Cosmiques', 'Jeu de plateau de 3 à 6 joueurs dont le but consiste à remporter cinq planètes adverses.', 'rencontres-cosmiques', 1, 3, 5, NULL, NULL, 'duels'),
-('Jeu Équipes', 'cats', 'jeu-equipes', 0, 0, NULL, 0, 4, 'equipes');
+INSERT INTO R_jeu (nom, description, slug, est_valide, min_joueurs, max_joueurs, min_equipes, max_equipes, type, type_scores) VALUES
+('Rencontres Cosmiques', 'Jeu de plateau de 3 à 6 joueurs dont le but consiste à remporter cinq planètes adverses.', 'rencontres-cosmiques', 1, 3, 5, NULL, NULL, 'duels', 'scores'),
+('Jeu Équipes', 'cats', 'jeu-equipes', 0, 0, NULL, 0, 4, 'equipes', 'scores');
 
-INSERT INTO R_joueur (slug, pseudo, password, nom, prenom, email, description) VALUES
-('nestor', 'Nestor', '', 'Bochet', 'Vincent', 'vbochet@gmail.com', 'L''un des quatre membres du groupe, le moins joueur des quatre. :)'),
-('nestor1', 'Nestor1', '', 'Bochet1', 'Vincent', 'vbochet1@gmail.com', 'L''un des quatre membres du groupe, le moins joueur des quatre. :)'),
-('nestor2', 'Nestor2', '', 'Bochet2', 'Vincent', 'vbochet2@gmail.com', 'L''un des quatre membres du groupe, le moins joueur des quatre. :)'),
-('nestor3', 'Nestor3', '', 'Bochet3', 'Vincent', 'vbochet3@gmail.com', 'L''un des quatre membres du groupe, le moins joueur des quatre. :)'),
-('nestor4', 'Nestor4', '', 'Bochet4', 'Vincent', 'vbochet4@gmail.com', 'L''un des quatre membres du groupe, le moins joueur des quatre. :)');
+INSERT INTO R_joueur (slug, pseudo, password, nom, prenom, email, description, avatar) VALUES
+('nestor', 'Nestor', '$2y$10$CwRFu66YRrpI2dFmLWWjeeDn2GI5Gup5ililfJsT5HDE.zyiAG/6m', 'Bochet', 'Vincent', 'vbochet@gmail.com', 'L''un des quatre membres du groupe, le moins joueur des quatre. :)', 0),
+('nestor1', 'Nestor1', '', 'Bochet1', 'Vincent', 'vbochet1@gmail.com', 'L''un des quatre membres du groupe, le moins joueur des quatre. :)', 0),
+('nestor2', 'Nestor2', '', 'Bochet2', 'Vincent', 'vbochet2@gmail.com', 'L''un des quatre membres du groupe, le moins joueur des quatre. :)', 0),
+('nestor3', 'Nestor3', '', 'Bochet3', 'Vincent', 'vbochet3@gmail.com', 'L''un des quatre membres du groupe, le moins joueur des quatre. :)', 0),
+('nestor4', 'Nestor4', '', 'Bochet4', 'Vincent', 'vbochet4@gmail.com', 'L''un des quatre membres du groupe, le moins joueur des quatre. :)', 0);
 
 
 INSERT INTO R_admin (identite) VALUES
diff --git a/www/js/verif_form_contact.js b/www/js/verif_form_contact.js
new file mode 100644
index 0000000000000000000000000000000000000000..437dcb78990724c5d5a39f3e2cef9efd2a3a65ad
--- /dev/null
+++ b/www/js/verif_form_contact.js
@@ -0,0 +1,43 @@
+function checkEmail(value, target) {
+	var regex = /^[a-z0-9._-]+(@|%40)[a-z0-9._-]{2,}\.[a-z]{2,4}$/;
+	var success = regex.test(value);
+
+	if (success) {
+		//validation OK
+		$('#rsp_'+target).text("Ok");
+		$('#rsp_'+target).parent().css("display","none");
+		$('input[name="valid_'+target+'"]').prop('checked',true);
+	} 
+	else {
+		//invalidation
+		$('#rsp_'+target).text("Format invalide");
+		$('#rsp_'+target).parent().css("display","flex");
+		$('input[name="valid_'+target+'"]').prop('checked',false);
+		$('#'+target).focus();
+	}
+}
+
+function checkForm() {
+	if($('#nom').val() == "") {
+		alert("Veuillez entrer votre nom dans le formulaire");
+		$('#nom').focus();
+		return false;
+	}
+	if($('#prenom').val() == "") {
+		alert("Veuillez entrer votre prénom dans le formulaire");
+		$('#prenom').focus();
+		return false;
+	}
+	if($('#email').val() == "" || !$('input[name="valid_email"]').is(':checked')) {
+		alert("Veuillez indiquer une adresse e-mail valide");
+		$('#email').focus();
+		return false;
+	}
+	if($('#message').val() == "") {
+		alert("Veuillez entrer votre message");
+		$('#message').focus();
+		return false;
+	}
+	
+	return true;
+}