diff --git a/backend/build.gradle.kts b/backend/build.gradle.kts
index b0bf79b..8fe2246 100644
--- a/backend/build.gradle.kts
+++ b/backend/build.gradle.kts
@@ -16,6 +16,8 @@ repositories {
 }
 
 dependencies {
+	compileOnly("org.projectlombok:lombok")
+	annotationProcessor("org.projectlombok:lombok")
 	implementation("org.springframework.boot:spring-boot-starter-jdbc")
 	implementation("org.springframework.boot:spring-boot-starter-data-jpa")
 	implementation("org.springframework.boot:spring-boot-starter-mail")
diff --git a/backend/src/main/java/ovh/herisson/Clyde/DTO/Msg/DiscussionDTO.java b/backend/src/main/java/ovh/herisson/Clyde/DTO/Msg/DiscussionDTO.java
new file mode 100644
index 0000000..cd7f3cf
--- /dev/null
+++ b/backend/src/main/java/ovh/herisson/Clyde/DTO/Msg/DiscussionDTO.java
@@ -0,0 +1,34 @@
+package ovh.herisson.Clyde.DTO.Msg;
+
+/******************************************************
+ * @file DiscussionDTO.java
+ * @author Anthony Debucquoy
+ * @scope Extension messagerie
+ *
+ * File to format a discussion using messageDTO 
+ ******************************************************/
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.stream.Collectors;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import ovh.herisson.Clyde.Tables.User;
+import ovh.herisson.Clyde.Tables.Msg.Discussion;
+import ovh.herisson.Clyde.DTO.Msg.MessagesDTO;
+
+@Data
+@AllArgsConstructor
+public class DiscussionDTO {
+	private long id;
+	private String name;
+	private List<User> members;
+	private List<MessagesDTO> msgs;
+
+	public static DiscussionDTO construct(Discussion d, User u){
+		List<MessagesDTO> msgsdto = new ArrayList<>();
+		d.getMsgs().forEach(x -> msgsdto.add(MessagesDTO.construct(x, u)));
+		return new DiscussionDTO(d.getId(), d.getName(), d.getMembers(), msgsdto);
+	} 
+}
diff --git a/backend/src/main/java/ovh/herisson/Clyde/DTO/Msg/MessagesDTO.java b/backend/src/main/java/ovh/herisson/Clyde/DTO/Msg/MessagesDTO.java
new file mode 100644
index 0000000..2ce0228
--- /dev/null
+++ b/backend/src/main/java/ovh/herisson/Clyde/DTO/Msg/MessagesDTO.java
@@ -0,0 +1,33 @@
+package ovh.herisson.Clyde.DTO.Msg;
+
+/******************************************************
+ * @file MessagesDTO.java
+ * @author Anthony Debucquoy
+ * @scope Extension messagerie
+ *
+ * File to Format the response adding the sender field
+ ******************************************************/
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import ovh.herisson.Clyde.Tables.User;
+import ovh.herisson.Clyde.Tables.Msg.Message;
+import java.util.Date;
+
+@Data
+@AllArgsConstructor
+public class MessagesDTO {
+	private long id;
+	private String content; 
+	private User author;
+	private boolean sender;
+	private Date created;
+	//TODO: Attachment
+
+	public static MessagesDTO construct(Message m, User user){
+		boolean sender = false;
+		if(m.getAuthor().equals(user))
+			sender = true;
+		return new MessagesDTO(m.getId(), m.getContent(), m.getAuthor(), sender, m.getCreated());
+	}
+}
diff --git a/backend/src/main/java/ovh/herisson/Clyde/EndPoints/Msg/MessagesController.java b/backend/src/main/java/ovh/herisson/Clyde/EndPoints/Msg/MessagesController.java
new file mode 100644
index 0000000..9f1db44
--- /dev/null
+++ b/backend/src/main/java/ovh/herisson/Clyde/EndPoints/Msg/MessagesController.java
@@ -0,0 +1,126 @@
+package ovh.herisson.Clyde.EndPoints.Msg;
+
+/******************************************************
+ * @file MessagesController.java
+ * @author Anthony Debucquoy
+ * @scope Extension messagerie
+ *
+ * Entry point for the messages application
+ ******************************************************/
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.bind.annotation.CrossOrigin;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PatchMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestHeader;
+import org.springframework.web.bind.annotation.RestController;
+
+import lombok.AllArgsConstructor;
+import ovh.herisson.Clyde.DTO.Msg.DiscussionDTO;
+import ovh.herisson.Clyde.Repositories.UserRepository;
+import ovh.herisson.Clyde.Repositories.Msg.DiscussionRepository;
+import ovh.herisson.Clyde.Responses.UnauthorizedResponse;
+import ovh.herisson.Clyde.Services.AuthenticatorService;
+import ovh.herisson.Clyde.Services.UserService;
+import ovh.herisson.Clyde.Services.Msg.DiscussionService;
+import ovh.herisson.Clyde.Tables.User;
+import ovh.herisson.Clyde.Tables.Msg.Discussion;
+import ovh.herisson.Clyde.Tables.Msg.Message;
+
+@RestController
+@CrossOrigin(originPatterns = "*", allowCredentials = "true")
+@AllArgsConstructor
+public class MessagesController {
+
+	private AuthenticatorService authServ;
+	private DiscussionService discServ;
+	private DiscussionRepository discRepo;
+	private UserService userServ;
+
+	@GetMapping("/discussions")
+	public ResponseEntity<Iterable<Discussion>> getDiscussions(@RequestHeader("Authorization") String token ){
+		User user = authServ.getUserFromToken(token);
+		if(user == null){
+			return new UnauthorizedResponse<>(null);
+		}
+
+		Iterable<Discussion> mock = discServ.getOwned(authServ.getUserFromToken(token));
+
+		return new ResponseEntity<>(mock, HttpStatus.OK); 
+	} 
+
+	@GetMapping("/discussion/{id}")
+	public ResponseEntity<DiscussionDTO> getDiscussion(@RequestHeader("Authorization") String token, @PathVariable long id){
+		User user = authServ.getUserFromToken(token);
+		if(user == null || !discServ.hasDiscussion(user, id) ){
+			return new UnauthorizedResponse<>(null);
+		}
+		return new ResponseEntity<>(DiscussionDTO.construct(discRepo.findById(id).orElse(null), authServ.getUserFromToken(token)), HttpStatus.OK);
+	} 
+
+	@PatchMapping("/discussion/{id}")
+	public ResponseEntity<Discussion> AlterDiscussion(@RequestHeader("Authorization") String token, @PathVariable long id, @RequestBody Discussion data){
+		User user = authServ.getUserFromToken(token);
+		if(user == null){
+			return new UnauthorizedResponse<>(null);
+		}
+
+		Discussion disc = discRepo.findById(id).orElse(null);
+		disc.setName(data.getName());
+		discRepo.save(disc);
+		return new ResponseEntity<>(disc, HttpStatus.OK);
+	}
+
+	@PatchMapping("/discussion/{id}/add")
+	public ResponseEntity<Discussion> invite(@RequestHeader("Authorization") String token, @PathVariable long id, @RequestBody User data){
+		User user = authServ.getUserFromToken(token);
+		if(user == null){
+			return new UnauthorizedResponse<>(null);
+		}
+
+		Discussion disc = discRepo.findById(id).orElse(null);
+		User invited = userServ.getUserById(data.getRegNo());
+		disc.addMember(invited);
+		discRepo.save(disc);
+		return new ResponseEntity<>(disc, HttpStatus.OK);
+	}
+
+	@PatchMapping("/discussion/{id}/remove")
+	public ResponseEntity<Discussion> removeMember(@RequestHeader("Authorization") String token, @PathVariable long id, @RequestBody User data){
+		User user = authServ.getUserFromToken(token);
+		if(user == null){
+			return new UnauthorizedResponse<>(null);
+		}
+
+		Discussion disc = discRepo.findById(id).orElse(null);
+		User member = userServ.getUserById(data.getRegNo());
+		disc.delMember(member);
+		discRepo.save(disc);
+		return new ResponseEntity<>(disc, HttpStatus.OK);
+	}
+
+	@PostMapping("/discussion/{id}")
+	public ResponseEntity<Discussion> sendMessage(@RequestHeader("Authorization") String token, @PathVariable long id, @RequestBody Message msg){
+		User user = authServ.getUserFromToken(token);
+		if(user == null){
+			return new UnauthorizedResponse<>(null);
+		}
+
+		Discussion disc = discRepo.findById(id).orElse(null);
+		msg.setAuthor(user);
+		if(disc != null)
+			discServ.CreateMessage(disc, msg);
+		return new ResponseEntity<>(disc, HttpStatus.OK);
+	}
+
+
+	@PostMapping("/discussion")
+	public ResponseEntity<Discussion> createDiscussion(@RequestHeader("Authorization") String token, @RequestBody Discussion data){
+		return new ResponseEntity<>(discServ.create(data.getName(), authServ.getUserFromToken(token)), HttpStatus.OK);
+	}
+}
diff --git a/backend/src/main/java/ovh/herisson/Clyde/Repositories/Msg/DiscussionRepository.java b/backend/src/main/java/ovh/herisson/Clyde/Repositories/Msg/DiscussionRepository.java
new file mode 100644
index 0000000..9b2675b
--- /dev/null
+++ b/backend/src/main/java/ovh/herisson/Clyde/Repositories/Msg/DiscussionRepository.java
@@ -0,0 +1,23 @@
+package ovh.herisson.Clyde.Repositories.Msg;
+
+/******************************************************
+ * @file DiscussionRepository.java
+ * @author Anthony Debucquoy
+ * @scope Extension messagerie
+ *
+ * Repository of Discussion allowing to fetch discussion by user 
+ ******************************************************/
+
+
+import java.util.List;
+
+import org.springframework.data.jpa.repository.Query;
+import org.springframework.data.repository.CrudRepository;
+
+import ovh.herisson.Clyde.Tables.Msg.Discussion;
+
+public interface DiscussionRepository extends CrudRepository<Discussion, Long>{
+
+	@Query("SELECT d FROM Discussion d INNER JOIN FETCH d.members dm WHERE dm.id = ?1")
+	List<Discussion> findByMembership(long userid);
+}
diff --git a/backend/src/main/java/ovh/herisson/Clyde/Repositories/Msg/MessageRepository.java b/backend/src/main/java/ovh/herisson/Clyde/Repositories/Msg/MessageRepository.java
new file mode 100644
index 0000000..021ac79
--- /dev/null
+++ b/backend/src/main/java/ovh/herisson/Clyde/Repositories/Msg/MessageRepository.java
@@ -0,0 +1,14 @@
+package ovh.herisson.Clyde.Repositories.Msg;
+
+/******************************************************
+ * @file MessageRepository.java
+ * @author Anthony Debucquoy
+ * @scope Extension messagerie
+ ******************************************************/
+
+
+import org.springframework.data.repository.CrudRepository;
+
+import ovh.herisson.Clyde.Tables.Msg.Message;
+
+public interface MessageRepository extends CrudRepository<Message, Long> {}
diff --git a/backend/src/main/java/ovh/herisson/Clyde/Services/Msg/DiscussionService.java b/backend/src/main/java/ovh/herisson/Clyde/Services/Msg/DiscussionService.java
new file mode 100644
index 0000000..9a471da
--- /dev/null
+++ b/backend/src/main/java/ovh/herisson/Clyde/Services/Msg/DiscussionService.java
@@ -0,0 +1,57 @@
+package ovh.herisson.Clyde.Services.Msg;
+
+import java.util.List;
+
+/******************************************************
+ * @file DiscussionService.java
+ * @author Anthony Debucquoy
+ * @scope Extension messagerie
+ *
+ * Various function utilised by the messages application
+ ******************************************************/
+
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import com.fasterxml.jackson.databind.util.JSONPObject;
+
+import ovh.herisson.Clyde.Repositories.Msg.DiscussionRepository;
+import ovh.herisson.Clyde.Tables.User;
+import ovh.herisson.Clyde.Tables.Msg.Discussion;
+import ovh.herisson.Clyde.Tables.Msg.Message;
+
+@Service
+public class DiscussionService {
+
+	@Autowired
+	private DiscussionRepository discRepo;
+
+	public Discussion create(String name, User author){
+		return discRepo.save(new Discussion(name, author));
+	}
+
+	/**
+	 * list discussions owned by a certain user
+	 */
+	public Iterable<Discussion> getOwned(User author){
+		return discRepo.findByMembership(author.getRegNo());
+	}
+
+	/**
+	 * Create a message and link it to it's discussion
+	 */
+	public Discussion CreateMessage(Discussion disc, Message msg){
+		disc.addMessage(msg);
+		return discRepo.save(disc);
+	}
+
+	/**
+	 * Check if a user is in a discussion
+	 */
+    public boolean hasDiscussion(User user, long id) {
+		Discussion disc = discRepo.findById(id).orElse(null);
+		List<User> members = disc.getMembers();
+		return members.contains(user);
+    }
+}
diff --git a/backend/src/main/java/ovh/herisson/Clyde/Tables/Msg/Discussion.java b/backend/src/main/java/ovh/herisson/Clyde/Tables/Msg/Discussion.java
new file mode 100644
index 0000000..4d76d5f
--- /dev/null
+++ b/backend/src/main/java/ovh/herisson/Clyde/Tables/Msg/Discussion.java
@@ -0,0 +1,72 @@
+package ovh.herisson.Clyde.Tables.Msg;
+
+/******************************************************
+ * @file Discussion.java
+ * @author Anthony Debucquoy
+ * @scope Extension messagerie
+ *
+ * Discussion allow to regroupe multiple user in and message together
+ * for the messages application to work
+ ******************************************************/
+
+
+import java.util.List;
+
+import jakarta.persistence.CascadeType;
+import jakarta.persistence.Entity;
+import jakarta.persistence.GeneratedValue;
+import jakarta.persistence.GenerationType;
+import jakarta.persistence.Id;
+import jakarta.persistence.JoinColumn;
+import jakarta.persistence.JoinTable;
+import jakarta.persistence.ManyToMany;
+import jakarta.persistence.OneToMany;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+import lombok.Setter;
+import ovh.herisson.Clyde.Tables.User;
+
+@Entity
+@Getter
+@Setter
+@NoArgsConstructor
+public class Discussion{
+
+	@Id
+    @GeneratedValue(strategy = GenerationType.AUTO)
+	private long id;
+	private String name;
+
+    @ManyToMany
+	@JoinTable(
+		name = "discussion_members",
+		joinColumns = @JoinColumn(name = "discussion_id"),
+		inverseJoinColumns = @JoinColumn(name = "user_id")
+	)
+	private List<User> members;
+
+	@OneToMany(mappedBy="discussion", orphanRemoval = true, cascade = CascadeType.ALL)
+	private List<Message> msgs;
+
+	public Discussion(String name){
+		this.name = name;
+	}
+
+	public Discussion(String name, User user){
+		this.name = name;
+		this.members = List.of(user);
+	}
+
+	public void addMessage(Message msg){
+		msg.setDiscussion(this);
+		msgs.add(msg);
+	}
+
+    public void addMember(User user) {
+		members.add(user);
+    }
+
+    public void delMember(User user) {
+		members.remove(user);
+    }
+}
diff --git a/backend/src/main/java/ovh/herisson/Clyde/Tables/Msg/Message.java b/backend/src/main/java/ovh/herisson/Clyde/Tables/Msg/Message.java
new file mode 100644
index 0000000..2afa6ba
--- /dev/null
+++ b/backend/src/main/java/ovh/herisson/Clyde/Tables/Msg/Message.java
@@ -0,0 +1,66 @@
+package ovh.herisson.Clyde.Tables.Msg;
+
+/******************************************************
+ * @file Message.java
+ * @author Anthony Debucquoy
+ * @scope Extension messagerie
+ *
+ * Represent a message sent to a discussion
+ ******************************************************/
+
+
+import org.hibernate.annotations.CreationTimestamp;
+import org.hibernate.annotations.UpdateTimestamp;
+
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import java.util.Date;
+
+import jakarta.persistence.CascadeType;
+import jakarta.persistence.Column;
+import jakarta.persistence.Entity;
+import jakarta.persistence.GeneratedValue;
+import jakarta.persistence.GenerationType;
+import jakarta.persistence.Id;
+import jakarta.persistence.ManyToOne;
+import jakarta.persistence.OneToMany;
+import jakarta.persistence.OneToOne;
+import jakarta.persistence.PrePersist;
+import jakarta.persistence.Temporal;
+import jakarta.persistence.TemporalType;
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+import lombok.Setter;
+import ovh.herisson.Clyde.Tables.User;
+
+@Getter
+@Setter
+@NoArgsConstructor
+@AllArgsConstructor
+@Entity
+public class Message {
+	
+	@Id
+	@GeneratedValue(strategy = GenerationType.AUTO)
+	private long id;
+	private String content; 
+
+	@CreationTimestamp
+	@Column(nullable = false)
+	private Date created;
+
+	@ManyToOne
+	private User author;
+
+	public User getAuthor() {
+        return author;
+    }
+
+    @OneToOne
+	private Message response;
+
+	@ManyToOne(optional = false)
+	@JsonIgnore
+	private Discussion discussion;
+	
+}
diff --git a/backend/src/main/java/ovh/herisson/Clyde/Tables/User.java b/backend/src/main/java/ovh/herisson/Clyde/Tables/User.java
index de958df..2badd32 100644
--- a/backend/src/main/java/ovh/herisson/Clyde/Tables/User.java
+++ b/backend/src/main/java/ovh/herisson/Clyde/Tables/User.java
@@ -1,7 +1,11 @@
 package ovh.herisson.Clyde.Tables;
 
 import jakarta.persistence.*;
+import ovh.herisson.Clyde.Tables.Msg.Discussion;
+import ovh.herisson.Clyde.Tables.Msg.Message;
+
 import java.util.Date;
+import java.util.List;
 
 
 @Entity
@@ -20,6 +24,15 @@ public class User {
     private String profilePictureUrl;
     private ovh.herisson.Clyde.Tables.Role role;
     private String password;
+
+	////// Extension Messagerie /////
+	@OneToMany(mappedBy = "author", cascade = CascadeType.ALL)
+	private List<Message> msgs;
+	/////////////////////////////////
+
+	@ManyToMany( mappedBy = "members" )
+	private List<Discussion> discussions;
+
     public User(String lastName, String firstName, String email, String address,
                 String country, Date birthDate, String profilePictureUrl, Role role, String password)
     {
diff --git a/frontend/src/Apps/Msg.vue b/frontend/src/Apps/Msg.vue
new file mode 100644
index 0000000..709f8c4
--- /dev/null
+++ b/frontend/src/Apps/Msg.vue
@@ -0,0 +1,213 @@
+<!----------------------------------------------------
+	File:  Msg.vue
+	Author: Anthony Debucquoy
+	Scope: Extension messagerie
+	Description: Main msg page
+----------------------------------------------------->
+
+<script setup>
+	import { ref, reactive } from 'vue'
+	import { discussionsList, currentDiscussion, fetchDiscussion, createDiscussion, sendMessage, updateDiscussionName, invite, removeMember} from '@/rest/msg.js'
+
+	const msgContent = ref("");
+	const addMember = ref(false);
+	const currentTitle = ref("");
+
+	function formatTime(date){
+		return date.getHours() + ":" + date.getMinutes() + " " + date.getDate() + "/" + date.getMonth();
+	}
+
+</script>
+
+<template>
+	<div id="msg">
+		<div id="discList">
+			<div @click="fetchDiscussion(discussion.id).then(e => currentTitle = currentDiscussion.name)" class="discItem" v-for="discussion in discussionsList" :key="discussion.id">{{ discussion.name }}</div>
+			<button id="createDiscussion" @click="createDiscussion('New Discussion')">+</button>
+		</div>
+		<div id="discussion" v-if="currentDiscussion.length != 0">
+			<h1 id=msgName ><input class="InputTitle" type="text" @change="updateDiscussionName(currentDiscussion.id, currentTitle)" v-model="currentTitle"></h1>
+			<div id=msgs>
+				<div class="msg" v-for="msg in currentDiscussion.msgs" :sender="msg.sender" :key="msg.id">
+					{{ msg.content }}<br/>
+					<span class="sender"><span v-if="!msg.sender">{{ msg.author.firstName }} {{ msg.author.lastName.toUpperCase() }}</span> {{formatTime(new Date(msg.created))}}</span>
+				</div>
+			</div>
+			<div id=messageBox>
+				<input type="text" @keyup.enter="sendMessage(currentDiscussion.id, msgContent, null); msgContent = ''" v-model="msgContent">
+				<input type="submit" @click="sendMessage(currentDiscussion.id, msgContent, null); msgContent = ''" value="send">
+			</div>
+		</div>
+		<div id="members" v-if="currentDiscussion.length != 0">
+			<div class="memberItem" v-for="member in currentDiscussion.members" @click="removeMember(currentDiscussion.id, member.regNo)" :key="member.id"><span>{{ member.firstName }} {{ member.lastName.toUpperCase() }}</span></div>
+			<input type=text id="addMembers" @focus="addMember = true" @blur="addMember = false;$event.target.value = ''" @change="invite(currentDiscussion.id, $event.target.value)" :placeholder="addMember ? 'Regno' : '+'"/>
+		</div>
+	</div>
+</template>
+
+<style scoped>
+
+div#msg{
+	position: relative;
+	width: 100%;
+	height: 100%;
+
+	display: grid;
+	grid-template-columns: 20% auto 10%;
+}
+
+div#discList{
+	margin: 30px 0 30px 30px;
+	background-color: rgba(255, 255, 255, 0.05);
+	border-radius: 10px;
+	overflow: hidden;
+	padding: 10px;
+	display: flex;
+	flex-direction: column;
+}
+
+div#members{
+	margin: 30px 0;
+	border-radius: 10px 0 0 10px;
+	background-color: red;
+	background-color: rgba(255, 255, 255, 0.05);
+	overflow: hidden;
+	display: flex;
+	padding: 10px 0 0 10px;
+	flex-direction: column;
+}
+
+.InputTitle{
+	all: inherit;
+	margin: auto;
+}
+
+.discItem{
+	color: darkorange;
+	display: flex;
+	font-family: sans-serif;
+	font-weight: bold;
+	height: 4vh;
+	margin: 5px;
+	border-radius: 0 30px 30px 0;
+	align-items: center;
+	justify-content: center;
+	border: 1px solid darkorange;
+}
+
+.memberItem{
+	color: darkorange;
+	display: flex;
+	font-family: sans-serif;
+	font-weight: bold;
+	height: 4vh;
+	margin: 5px;
+	border-radius: 30px 0 0 30px;
+	align-items: center;
+	justify-content: center;
+	border: 1px solid darkorange;
+}
+
+.memberItem:hover span{
+	display: none;
+}
+
+.memberItem:hover{
+	background-color: red;
+}
+
+.memberItem:hover:before{
+	color: white;
+	content: "X"
+}
+
+#createDiscussion{
+	height: 4vh;
+	margin: 5px;
+	color: white;
+	background-color: green;
+	border-radius: 0 30px 30px 0;
+	border: none;
+	font-weight: 900;
+	font-size: 2em;
+}
+#addMembers{
+	height: 4vh;
+	margin: 5px;
+	text-align: center;
+	color: white;
+	background-color: green;
+	border-radius: 30px 0 0 30px;
+	border: none;
+	font-weight: 900;
+	font-size: 2em;
+}
+
+div#discussion{
+	display: flex;
+	flex-direction: column;
+	margin: 30px;
+	background-color: rgba(255, 255, 255, 0.05);
+	border-radius: 10px;
+	overflow: hidden;
+}
+
+#msgName{
+	text-align: center;
+	display: block;
+	background-color: #2a1981;
+	border-radius: 5px;
+	color: white;
+	width: 75%;
+	margin: 30px auto;
+}
+
+.discItem:hover{
+	background-color: gray;
+}
+
+#msgs{
+	display: flex;
+	flex-grow: 1;
+	flex-direction: column;
+}
+
+.msg {
+	background-color: aliceblue;
+	font-family: sans-serif;
+	margin: 10px;
+	padding: 5px;
+	border-radius: 3px;
+	max-width: 50%;
+	align-self: start;
+}
+
+.sender{
+	display: inline-block;
+	color: gray;
+	font-size: 0.5em;
+}
+
+.msg[sender=true]{
+	background-color: darkorange;
+	align-self: end;
+}
+
+#messageBox{
+	width: 100%;
+	height: 30px;
+	background-color: white;
+	display: flex;
+}
+
+#messageBox input[type="text"]{
+	all: inherit;
+	padding: 0 10px;
+}
+
+#messageBox input[type="submit"]{
+	border: inherit;
+	padding: 0 10px;
+}
+
+</style>
diff --git a/frontend/src/rest/apps.js b/frontend/src/rest/apps.js
index 102073e..0105112 100644
--- a/frontend/src/rest/apps.js
+++ b/frontend/src/rest/apps.js
@@ -10,6 +10,7 @@ import Courses from "@/Apps/ManageCourses.vue"
 import Users from "@/Apps/UsersList.vue"
 import Students from "@/Apps/StudentsList.vue"
 import ResearcherProfile from "@/Apps/ScientificPublications/ResearcherProfile.vue";
+import Msg from "@/Apps/Msg.vue"
 
 const apps = {
 		'/login': LoginPage,
@@ -19,6 +20,7 @@ const apps = {
 		'/users-list' : Users,
 		'/students-list' : Students,
 		'/researcher-profile' : ResearcherProfile,
+		'/msg' : Msg,
 }
 
 const appsList = {
diff --git a/frontend/src/rest/msg.js b/frontend/src/rest/msg.js
new file mode 100644
index 0000000..fb832dc
--- /dev/null
+++ b/frontend/src/rest/msg.js
@@ -0,0 +1,60 @@
+/*******************************************************
+ * File: msg.js
+ * Author: Anthony Debucquoy
+ * Scope: Extension messagerie
+ * Description: Messages frontend api consumer
+ *******************************************************/
+
+import { restGet, restPost, restPatch } from './restConsumer.js'
+import { ref } from 'vue'
+
+/**
+ * - id
+ * - name
+ * - members
+ */
+export const discussionsList = ref();
+export const currentDiscussion = ref([]);
+let timerSet = false
+
+
+export async function createDiscussion(name){
+	let disc = await restPost("/discussion", {name: name});
+	discussionsList.value.push(disc);
+}
+
+
+export async function invite(id, regNo){
+	restPatch("/discussion/"+ id+ "/add", {regNo: parseInt(regNo)}).then(() => fetchDiscussion(id))
+}
+
+export async function removeMember(id, regNo){
+	restPatch("/discussion/"+ id+ "/remove", {regNo: parseInt(regNo)}).then(() => fetchDiscussion(id))
+}
+
+export async function sendMessage(id, content, responseId){
+	let data = {
+		content: content,
+		response: responseId,
+	}
+	restPost("/discussion/" + id, data).then(() => fetchDiscussion(id));
+}
+
+export async function updateDiscussionName(id, name){
+	restPatch("/discussion/" + id, {name: name}).then(() => fetchDiscussions());
+}
+
+
+async function fetchDiscussions(){
+	discussionsList.value = await restGet("/discussions");
+}
+
+export async function fetchDiscussion(id){
+	currentDiscussion.value = await restGet("/discussion/" + id);
+	if(!timerSet){
+		timerSet = true;
+		setTimeout(() => {timerSet = false;fetchDiscussion(currentDiscussion.value.id)} , 5000);
+	}
+}
+
+await fetchDiscussions();