diff --git a/tp2/README.md b/tp2/README.md
index b52cefe6aa90c89f12ebd937bb760a7612002f61..c7943276eea6f1250c88ab74c5bde76ce835e176 100644
--- a/tp2/README.md
+++ b/tp2/README.md
@@ -279,11 +279,63 @@ fn main() {
 
 ## 2.3. Lifetimes on types
 ### 2.3.1. Types 1
+
+On ajoute un lifetime au type `Message` pour son attribut `content` qui est une référence car le type `Message` a besoin que la référence de `content` soit valide encore valide pour être utilisé :
+
 ```rs
+struct Message<'a> {
+    content: &'a str,
+}
+
+impl<'a> Message<'a> {
+    fn from(s: &str) -> Message {
+        Message {
+            content: s
+        }
+    }
+}
+fn main() {
+    let s = String::from("Hello");
+    let m = Message::from(&s);
+    println!("{}", m.content);
+}
 ```
 
 ### 2.3.2. Types 2
+
+On ajoute le lifetime `'a` au type `Node` car il a une référence vers un autre `Node` :
+
 ```rs
+struct Node<'a> {
+    value: i32,
+    next: Option<&'a Node<'a>>
+}
+
+impl<'a> Node<'a> {
+    fn new(value: i32) -> Node<'a> {
+        Node { value, next: None }
+    }
+    fn push(&mut self, node: &'a Node<'a>) {
+        self.next = Some(node);
+    }
+    fn print(&self) {
+        println!("{}", self.value);
+        if let Some(n) = self.next {
+            n.print()
+        }
+    }
+}
+
+fn main() {
+    let mut node1 = Node::new(1);
+    let mut node2 = Node::new(2);
+    let node3 = Node::new(3);
+
+    node2.push(&node3);
+    node1.push(&node2);
+    node1.print();
+}
+
 ```
 
 # 3. Long exercise : a mini web server
diff --git a/tp2/src/exercice2/types1.rs b/tp2/src/exercice2/types1.rs
new file mode 100644
index 0000000000000000000000000000000000000000..3f2d25c129e19296e81d7c698edbbbd4dd546b83
--- /dev/null
+++ b/tp2/src/exercice2/types1.rs
@@ -0,0 +1,16 @@
+struct Message<'a> {
+    content: &'a str,
+}
+
+impl<'a> Message<'a> {
+    fn from(s: &str) -> Message {
+        Message {
+            content: s
+        }
+    }
+}
+fn main() {
+    let s = String::from("Hello");
+    let m = Message::from(&s);
+    println!("{}", m.content);
+}
diff --git a/tp2/src/exercice2/types2.rs b/tp2/src/exercice2/types2.rs
new file mode 100644
index 0000000000000000000000000000000000000000..b5b71d2a520d4a338b7dbbb050e80b131fc2314d
--- /dev/null
+++ b/tp2/src/exercice2/types2.rs
@@ -0,0 +1,29 @@
+struct Node<'a> {
+    value: i32,
+    next: Option<&'a Node<'a>>
+}
+
+impl<'a> Node<'a> {
+    fn new(value: i32) -> Node<'a> {
+        Node { value, next: None }
+    }
+    fn push(&mut self, node: &'a Node<'a>) {
+        self.next = Some(node);
+    }
+    fn print(&self) {
+        println!("{}", self.value);
+        if let Some(n) = self.next {
+            n.print()
+        }
+    }
+}
+
+fn main() {
+    let mut node1 = Node::new(1);
+    let mut node2 = Node::new(2);
+    let node3 = Node::new(3);
+
+    node2.push(&node3);
+    node1.push(&node2);
+    node1.print();
+}