diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 6be72a4941e93c64fda2dc631ef5860e9eed6ea5..b6b2da7a952982fd20bcbe499f459014595da48c 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -37,3 +37,4 @@ include:
   - local: "/try-monade/.gitlab-ci.yml"
   - local: "/java-puzzles/.gitlab-ci.yml"
   - local: "/java-monades/.gitlab-ci.yml"
+  - local: "/java-diamond/.gitlab-ci.yml"
diff --git a/java-diamond/.gitlab-ci.yml b/java-diamond/.gitlab-ci.yml
new file mode 100644
index 0000000000000000000000000000000000000000..166a5eb43858426f24e7f1c18a8c300de6ada37c
--- /dev/null
+++ b/java-diamond/.gitlab-ci.yml
@@ -0,0 +1,11 @@
+package-java-diamond:
+  variables:
+    PROJECT_FOLDER: "java-diamond"
+  extends: .java
+  only:
+    refs:
+      - master
+      - merge_requests
+    changes:
+      - ".gitlab-common-ci.yml"
+      - "java-diamond/**/*"
diff --git a/java-diamond/pom.xml b/java-diamond/pom.xml
new file mode 100644
index 0000000000000000000000000000000000000000..b6ec9017505c1d7aa890baf577bc10a3b66a7d04
--- /dev/null
+++ b/java-diamond/pom.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <parent>
+    <version>1.0.0</version>
+    <groupId>fr.ippon.kata</groupId>
+    <artifactId>java-parent</artifactId>
+    <relativePath>../java-parent</relativePath>
+  </parent>
+
+  <version>1.0.0-SNAPSHOT</version>
+  <artifactId>diamond</artifactId>
+
+  <name>Diamond</name>
+
+  <developers>
+    <developer>
+      <name>Sara TABHABIK</name>
+    </developer>
+    <developer>
+      <email>cdamon@ippon.fr</email>
+      <name>Colin DAMON</name>
+    </developer>
+  </developers>
+</project>
diff --git a/java-diamond/readme.md b/java-diamond/readme.md
new file mode 100644
index 0000000000000000000000000000000000000000..4b336fbbc53bcb95a78fad10da90b89dcd694429
--- /dev/null
+++ b/java-diamond/readme.md
@@ -0,0 +1,9 @@
+# Diamond
+
+Résolution en Java du kata [Diamond](https://codingdojo.org/kata/Diamond/).
+
+-   **Auteurs** : Sara TABHABIK et Colin DAMON
+-   **Date** : 20/05/2021
+-   **Langage** : Java
+-   **Niveau** : Moyen
+-   **Replay** : [Twitch](https://www.twitch.tv/videos/1028994816)
diff --git a/java-diamond/src/main/java/fr/craft/kata/Diamond.java b/java-diamond/src/main/java/fr/craft/kata/Diamond.java
new file mode 100644
index 0000000000000000000000000000000000000000..2a4efa74cc406e28536ebe49939fcb730e058611
--- /dev/null
+++ b/java-diamond/src/main/java/fr/craft/kata/Diamond.java
@@ -0,0 +1,32 @@
+package fr.craft.kata;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import java.util.function.IntFunction;
+import java.util.stream.Collectors;
+import java.util.stream.IntStream;
+
+public class Diamond {
+
+  public static List<String> of(char size) {
+    List<String> diamond = IntStream
+        .range((int) 'A', ((int) size) + 1)
+        .mapToObj(toLine(size))
+        .collect(Collectors.toList());
+
+    List<String> secondPart = new ArrayList<>(diamond);
+    Collections.reverse(secondPart);
+    secondPart.remove(0);
+
+    diamond.addAll(secondPart);
+
+    return diamond;
+  }
+
+  private static IntFunction<String> toLine(char size) {
+    return current -> Line.of((char) current, size)
+        .representation();
+  }
+
+}
diff --git a/java-diamond/src/main/java/fr/craft/kata/Line.java b/java-diamond/src/main/java/fr/craft/kata/Line.java
new file mode 100644
index 0000000000000000000000000000000000000000..43924e7c95dec0d4c2422b9f3691ca0588735125
--- /dev/null
+++ b/java-diamond/src/main/java/fr/craft/kata/Line.java
@@ -0,0 +1,25 @@
+package fr.craft.kata;
+
+public record Line(String representation) {
+
+  public static Line of(char character, char size) {
+    String outerSpaces = outerSpaces(character, size);
+
+    if (character == 'A') {
+      return new Line(outerSpaces + "A" + outerSpaces);
+    }
+
+    return new Line(outerSpaces + character
+        + innerSpaces(character) + character + outerSpaces);
+  }
+
+  private static String outerSpaces(char character,
+      char size) {
+    return " ".repeat(size - character);
+  }
+
+  private static String innerSpaces(char character) {
+    return " ".repeat(((character - 'A') - 1) * 2 + 1);
+  }
+
+}
diff --git a/java-diamond/src/test/java/fr/craft/kata/DiamondTest.java b/java-diamond/src/test/java/fr/craft/kata/DiamondTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..111369ed1c01835b96f1f38ad2c655c00040dc34
--- /dev/null
+++ b/java-diamond/src/test/java/fr/craft/kata/DiamondTest.java
@@ -0,0 +1,43 @@
+package fr.craft.kata;
+
+import static org.assertj.core.api.Assertions.*;
+
+import java.io.IOException;
+import java.nio.file.Files;
+import java.nio.file.Paths;
+import java.util.List;
+
+import org.junit.jupiter.api.Test;
+
+class DiamondTest {
+
+  @Test
+  void shouldDrawDiamondOfA() {
+    assertThat(Diamond.of('A')).isEqualTo(diamond('A'));
+  }
+
+  @Test
+  void shouldDrawDiamondOfB() {
+    assertThat(Diamond.of('B')).isEqualTo(diamond('B'));
+  }
+
+  @Test
+  void shouldDrawDiamondOfC() {
+    assertThat(Diamond.of('C')).isEqualTo(diamond('C'));
+  }
+
+  @Test
+  void shouldDrawDiamondOfD() {
+    assertThat(Diamond.of('D')).isEqualTo(diamond('D'));
+  }
+
+  private List<String> diamond(char file) {
+    try {
+      return Files.readAllLines(Paths
+          .get("src/test/resources/" + String.valueOf(file)
+              .toLowerCase() + ".txt"));
+    } catch (IOException e) {
+      throw new AssertionError(e.getMessage(), e);
+    }
+  }
+}
diff --git a/java-diamond/src/test/java/fr/craft/kata/LineTest.java b/java-diamond/src/test/java/fr/craft/kata/LineTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..5ca947fc0fd73d1c0b990269dce2ae67690abdc1
--- /dev/null
+++ b/java-diamond/src/test/java/fr/craft/kata/LineTest.java
@@ -0,0 +1,39 @@
+package fr.craft.kata;
+
+import static org.assertj.core.api.Assertions.*;
+
+import org.junit.jupiter.api.Test;
+
+class LineTest {
+
+  @Test
+  void shouldGetLetterALineForSizeA() {
+    assertThat(Line.of('A', 'A')
+        .representation()).isEqualTo("A");
+  }
+
+  @Test
+  void shouldGetLetterALineForSizeB() {
+    assertThat(Line.of('A', 'B')
+        .representation()).isEqualTo(" A ");
+  }
+
+  @Test
+  void shouldGetLetterBLineForSizeB() {
+    assertThat(Line.of('B', 'B')
+        .representation()).isEqualTo("B B");
+  }
+
+  @Test
+  void shouldGetLetterBLineForSizeC() {
+    assertThat(Line.of('B', 'C')
+        .representation()).isEqualTo(" B B ");
+  }
+
+  @Test
+  void shouldGetLetterDLineForSizeD() {
+    assertThat(Line.of('D', 'D')
+        .representation())
+            .isEqualTo("D" + " ".repeat(5) + "D");
+  }
+}
diff --git a/java-diamond/src/test/resources/a.txt b/java-diamond/src/test/resources/a.txt
new file mode 100644
index 0000000000000000000000000000000000000000..8c7e5a667f1b771847fe88c01c3de34413a1b220
--- /dev/null
+++ b/java-diamond/src/test/resources/a.txt
@@ -0,0 +1 @@
+A
\ No newline at end of file
diff --git a/java-diamond/src/test/resources/b.txt b/java-diamond/src/test/resources/b.txt
new file mode 100644
index 0000000000000000000000000000000000000000..1e22151204794fa7f6b9e77e73679eff3ea157c6
--- /dev/null
+++ b/java-diamond/src/test/resources/b.txt
@@ -0,0 +1,3 @@
+ A 
+B B
+ A 
\ No newline at end of file
diff --git a/java-diamond/src/test/resources/c.txt b/java-diamond/src/test/resources/c.txt
new file mode 100644
index 0000000000000000000000000000000000000000..53f59c3491d8239567e89b9ad53219d5271c6518
--- /dev/null
+++ b/java-diamond/src/test/resources/c.txt
@@ -0,0 +1,5 @@
+  A  
+ B B 
+C   C
+ B B 
+  A  
\ No newline at end of file
diff --git a/java-diamond/src/test/resources/d.txt b/java-diamond/src/test/resources/d.txt
new file mode 100644
index 0000000000000000000000000000000000000000..df61f1d793d4057ffcfe81f35043b51d6d007fee
--- /dev/null
+++ b/java-diamond/src/test/resources/d.txt
@@ -0,0 +1,7 @@
+   A   
+  B B  
+ C   C 
+D     D
+ C   C 
+  B B  
+   A   
\ No newline at end of file
diff --git a/readme.md b/readme.md
index 83a2aeef0e46acb2bfceeb69424a4a8a62199848..a9bbdf4cf5d0a4c9d083f848c29166c4e655b7aa 100644
--- a/readme.md
+++ b/readme.md
@@ -43,6 +43,7 @@ Un kata de code est un petit exercice pensé pour s'entrainer jusqu'à maitriser
 -   [Bowling Game](/bowling-game)
 -   [Tennis Refactoring kata](/tennis/refactoring)
 -   [Puzzles](java-puzzles)
+-   [Diamond](java-diamond)
 
 ### Énervé