diff --git a/docker/post-boot-commands.asadmin b/docker/post-boot-commands.asadmin
index a934ecdb706612e7f81d6f5d919463392636d0ff..9afc702dd1921877e0862be202eaaeef548a827f 100755
--- a/docker/post-boot-commands.asadmin
+++ b/docker/post-boot-commands.asadmin
@@ -1,7 +1,7 @@
 set-hazelcast-configuration --enabled=true --dynamic=true
 
 add-library  /tmp/h2.jar
-create-jdbc-connection-pool --datasourceclassname org.h2.jdbcx.JdbcDataSource --restype javax.sql.ConnectionPoolDataSource --property password=password:user=user:url="jdbc:h2:tcp://db:9092/payara;MODE=PostgreSQL;DATABASE_TO_LOWER=TRUE" My-H2-pool
+create-jdbc-connection-pool --datasourceclassname org.h2.jdbcx.JdbcDataSource --restype javax.sql.ConnectionPoolDataSource --property password=password:user=user:url="jdbc:h2:tcp://db:9092/payara;MODE=PostgreSQL;DATABASE_TO_LOWER=TRUE;DEFAULT_NULL_ORDERING=HIGH" My-H2-pool
 create-jdbc-resource --connectionpoolid My-H2-pool jdbc/my-h2-pool
 
 # set configs.config.server-config.network-config.protocols.protocol.http-listener-2.ssl.cert-nickname=mycert
diff --git a/entites/src/main/java/fr/univtln/bruno/samples/jee91/dao/Person.java b/entites/src/main/java/fr/univtln/bruno/samples/jee91/dao/Person.java
index 2b85888364a51ab6761879e6b7e83f556a2fdd58..b3bdcf85113dbc5920c50e441cffee5c626fd594 100644
--- a/entites/src/main/java/fr/univtln/bruno/samples/jee91/dao/Person.java
+++ b/entites/src/main/java/fr/univtln/bruno/samples/jee91/dao/Person.java
@@ -2,40 +2,51 @@ package fr.univtln.bruno.samples.jee91.dao;
 
 import jakarta.json.bind.annotation.JsonbTransient;
 import jakarta.persistence.*;
+import jakarta.validation.constraints.NotBlank;
+import jakarta.validation.constraints.Pattern;
 import jakarta.xml.bind.annotation.XmlRootElement;
-import lombok.AccessLevel;
-import lombok.Getter;
-import lombok.Setter;
+import lombok.*;
 import lombok.experimental.FieldDefaults;
 
+import java.io.Serializable;
 import java.util.UUID;
 
+@AllArgsConstructor(staticName = "of")
+@NoArgsConstructor
+@ToString(onlyExplicitlyIncluded = true)
 @Table(name = "PERSON")
 @Entity
 @Getter
 @Setter
-@NamedQueries({
-        @NamedQuery(name = "Person.findAll",
-                query = "select p from Person p"),
-        @NamedQuery(
-                name = "Person.findAllOrderedByName",
-                query = "SELECT p FROM Person p ORDER BY p.name"),
-        @NamedQuery(
-                name = "Person.findByUUID",
-                query = "SELECT p FROM Person p WHERE p.uuid=:uuid")
-})
+@NamedQuery(name = "Person.findAll",
+        query = "select p from Person p")
+@NamedQuery(
+        name = "Person.findAllOrderedByName",
+        query = "SELECT p FROM Person p ORDER BY p.name")
+@NamedQuery(
+        name = "Person.findByUUID",
+        query = "SELECT p FROM Person p WHERE p.uuid=:uuid")
 @XmlRootElement
 @FieldDefaults(level = AccessLevel.PRIVATE)
-public class Person {
+public class Person implements Serializable {
     @Id
     @GeneratedValue(strategy = GenerationType.IDENTITY)
     @Column(name = "ID")
     @JsonbTransient
     long id;
 
+    @ToString.Include
     @Column(name = "NAME")
+    @NotBlank
+    @Pattern(regexp = "[A-Z][a-z]+", message = "Le nom doit commencer par une majuscule suivie de minuscules")
     String name;
 
+    @ToString.Include
     @Column(name = "UUID", updatable = false, nullable = false, unique = true)
     UUID uuid = UUID.randomUUID();
+
+    @Builder
+    public Person(String name) {
+        this.name = name;
+    }
 }
diff --git a/jsf/src/main/java/fr/univtln/bruno/jee91/jsf/AddPersonView.java b/jsf/src/main/java/fr/univtln/bruno/jee91/jsf/AddPersonView.java
new file mode 100644
index 0000000000000000000000000000000000000000..b1ee601de102ca32027938e2c9b462d9190eb8bc
--- /dev/null
+++ b/jsf/src/main/java/fr/univtln/bruno/jee91/jsf/AddPersonView.java
@@ -0,0 +1,35 @@
+package fr.univtln.bruno.jee91.jsf;
+
+import fr.univtln.bruno.samples.jee91.dao.Person;
+import fr.univtln.bruno.samples.jee91.dao.PersonDAO;
+import jakarta.faces.application.FacesMessage;
+import jakarta.faces.context.FacesContext;
+import jakarta.faces.view.ViewScoped;
+import jakarta.inject.Inject;
+import jakarta.inject.Named;
+import jakarta.transaction.Transactional;
+import lombok.Getter;
+
+import java.io.Serializable;
+
+@Named
+@ViewScoped
+public class AddPersonView implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @Inject
+    private transient PersonDAO personDAO;
+
+    @Getter
+    private Person newPerson = new Person();
+    @Getter
+    private Person addedPerson = new Person();
+
+    @Transactional
+    public void addPerson() {
+        FacesMessage facesMessage;
+        personDAO.persist(addedPerson = Person.builder().name(newPerson.getName()).build());
+        FacesContext.getCurrentInstance().addMessage("growl-id", new FacesMessage(FacesMessage.SEVERITY_INFO, "Person added", addedPerson.getName() + "(" + addedPerson.getUuid() + ")"));
+    }
+}
diff --git a/jsf/src/main/java/fr/univtln/bruno/jee91/jsf/GrowlView.java b/jsf/src/main/java/fr/univtln/bruno/jee91/jsf/GrowlView.java
new file mode 100644
index 0000000000000000000000000000000000000000..947c219a14fa122895b710e6a7afc9881105228c
--- /dev/null
+++ b/jsf/src/main/java/fr/univtln/bruno/jee91/jsf/GrowlView.java
@@ -0,0 +1,38 @@
+package fr.univtln.bruno.jee91.jsf;
+
+import jakarta.enterprise.context.RequestScoped;
+import jakarta.faces.application.FacesMessage;
+import jakarta.faces.context.FacesContext;
+import jakarta.inject.Named;
+
+@Named
+@RequestScoped
+public class GrowlView {
+
+    public void addMessage(FacesMessage.Severity severity, String summary, String detail) {
+        FacesContext.getCurrentInstance().
+                addMessage(null, new FacesMessage(severity, summary, detail));
+    }
+
+    public void showInfo() {
+        addMessage(FacesMessage.SEVERITY_INFO, "Info Message", "Message Content");
+    }
+
+    public void showWarn() {
+        addMessage(FacesMessage.SEVERITY_WARN, "Warn Message", "Message Content");
+    }
+
+    public void showError() {
+        addMessage(FacesMessage.SEVERITY_ERROR, "Error Message", "Message Content");
+    }
+
+    public void showSticky() {
+        FacesContext.getCurrentInstance().addMessage("sticky-key", new FacesMessage(FacesMessage.SEVERITY_INFO, "Sticky Message", "Message Content"));
+    }
+
+    public void showMultiple() {
+        addMessage(FacesMessage.SEVERITY_INFO, "Message 1", "Message Content");
+        addMessage(FacesMessage.SEVERITY_INFO, "Message 2", "Message Content");
+        addMessage(FacesMessage.SEVERITY_INFO, "Message 3", "Message Content");
+    }
+}
\ No newline at end of file
diff --git a/jsf/src/main/java/fr/univtln/bruno/jee91/jsf/SampleBean.java b/jsf/src/main/java/fr/univtln/bruno/jee91/jsf/ViewPersonBean.java
similarity index 94%
rename from jsf/src/main/java/fr/univtln/bruno/jee91/jsf/SampleBean.java
rename to jsf/src/main/java/fr/univtln/bruno/jee91/jsf/ViewPersonBean.java
index b1304efaf78ee6ab308670edf94d9f2ccd8cfa9c..ac1d482773b1c7c8bab248b238552ed49afc9cdf 100644
--- a/jsf/src/main/java/fr/univtln/bruno/jee91/jsf/SampleBean.java
+++ b/jsf/src/main/java/fr/univtln/bruno/jee91/jsf/ViewPersonBean.java
@@ -10,7 +10,7 @@ import java.util.List;
 
 @Named
 @RequestScoped
-public class SampleBean {
+public class ViewPersonBean {
 
     @Inject
     PersonDAO personDAO;
@@ -24,4 +24,5 @@ public class SampleBean {
     public List<Person> getPersons() {
         return personDAO.findAll();
     }
+
 }
diff --git a/jsf/src/main/resources/META-INF/persistence.xml b/jsf/src/main/resources/META-INF/persistence.xml
index 18fe3bac73127e9a827bed24e72d412c334bdcc5..e900259cf5ea473bb81e5f25c9f8716ceb87f03f 100644
--- a/jsf/src/main/resources/META-INF/persistence.xml
+++ b/jsf/src/main/resources/META-INF/persistence.xml
@@ -6,7 +6,7 @@
     <persistence-unit name="myappPU" transaction-type="JTA">
         <jta-data-source>jdbc/my-h2-pool</jta-data-source>
         <class>fr.univtln.bruno.samples.jee91.dao.Person</class>
-
+        <validation-mode>CALLBACK</validation-mode>
         <properties>
             <property name="jakarta.persistence.schema-generation.database.action" value="drop-and-create" />
             <property name="jakarta.persistence.schema-generation.scripts.action" value="drop-and-create" />
diff --git a/jsf/src/main/webapp/WEB-INF/web.xml b/jsf/src/main/webapp/WEB-INF/web.xml
index ab57d6889f0874de41e6c31c358ffc0edc9a6bd6..cffeb3b2ed648e1cbc8628e1be4c1f1cf89594df 100644
--- a/jsf/src/main/webapp/WEB-INF/web.xml
+++ b/jsf/src/main/webapp/WEB-INF/web.xml
@@ -3,10 +3,10 @@
     xsi:schemaLocation="https://jakarta.ee/xml/ns/jakartaee https://jakarta.ee/xml/ns/jakartaee/web-app_5_0.xsd"
     version="5.0">
 
-    <context-param>
+    <!--context-param>
         <param-name>jakarta.faces.PROJECT_STAGE</param-name>
         <param-value>Development</param-value>
-    </context-param>
+    </context-param-->
 
     <servlet>
         <servlet-name>Faces Servlet</servlet-name>
@@ -26,4 +26,19 @@
     <welcome-file-list>
         <welcome-file>index.xhtml</welcome-file>
     </welcome-file-list>
+
+    <mime-mapping>
+        <extension>woff</extension>
+        <mime-type>application/font-woff</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>ttf</extension>
+        <mime-type>application/x-font-ttf</mime-type>
+    </mime-mapping>
+
+    <mime-mapping>
+        <extension>eot</extension>
+        <mime-type>application/vnd.ms-fontobject</mime-type>
+    </mime-mapping>
+
 </web-app>
\ No newline at end of file
diff --git a/jsf/src/main/webapp/addPerson.xhtml b/jsf/src/main/webapp/addPerson.xhtml
new file mode 100644
index 0000000000000000000000000000000000000000..8ce3f48169039f606000618a1f3fbb7532cc8517
--- /dev/null
+++ b/jsf/src/main/webapp/addPerson.xhtml
@@ -0,0 +1,21 @@
+<html xmlns="http://www.w3.org/1999/xhtml"
+      xmlns:h="http://java.sun.com/jsf/html"
+      xmlns:p="http://primefaces.org/ui">
+
+<h:head></h:head>
+
+<h:body>
+    <div class="card">
+        <h:form>
+            <h3 class="p-mt-0">Add a person</h3>
+            <p:growl id="growl" for="growl-id" showDetail="true" skipDetailIfEqualsSummary="true"/>
+            <h:panelGrid columns="3" cellpadding="7">
+                <p:outputLabel for="fieldName" value="Name"/>
+                <p:inputText id="fieldName" value="#{addPersonView.newPerson.name}"/>
+                <p:message for="fieldName"/>
+                <p:commandButton value="Save" ajax="false" icon="pi pi-check" validateClient="true" styleClass="p-mr-3" action="#{addPersonView.addPerson}"/>
+            </h:panelGrid>
+        </h:form>
+    </div>
+</h:body>
+</html>
diff --git a/jsf/src/main/webapp/growl.xhtml b/jsf/src/main/webapp/growl.xhtml
new file mode 100644
index 0000000000000000000000000000000000000000..32909b8fe32b1f41c1a1918355e318934408bf80
--- /dev/null
+++ b/jsf/src/main/webapp/growl.xhtml
@@ -0,0 +1,37 @@
+<html xmlns="http://www.w3.org/1999/xhtml"
+      xmlns:h="http://java.sun.com/jsf/html"
+      xmlns:f="http://java.sun.com/jsf/core"
+      xmlns:p="http://primefaces.org/ui">
+
+<h:head>
+
+</h:head>
+
+<h:body>
+
+    <p:spinner />
+
+<div class="card">
+    <h:form>
+        <p:growl id="growl" showDetail="true"/>
+        <p:growl id="growl-sticky" for="sticky-key" showDetail="true" sticky="true"/>
+
+        <h5 class="p-mt-0">Severities</h5>
+        <p:commandButton actionListener="#{growlView.showInfo}" update="growl" value="Info" styleClass="p-mr-2"
+                         style="width: 10rem"/>
+        <p:commandButton actionListener="#{growlView.showWarn}" update="growl" value="Warn"
+                         styleClass="p-mr-2 ui-button-warning" style="width: 10rem"/>
+        <p:commandButton actionListener="#{growlView.showError}" update="growl" value="Error"
+                         styleClass="ui-button-danger" style="width: 10rem"/>
+
+        <h5>Multiple</h5>
+        <p:commandButton actionListener="#{growlView.showMultiple}" update="growl" value="Multiple" style="width: 10rem"
+                         styleClass="ui-button-outlined"/>
+
+        <h5>Sticky</h5>
+        <p:commandButton actionListener="#{growlView.showSticky}" update="growl-sticky" value="Info"
+                         style="width: 10rem" styleClass="ui-button-help"/>
+    </h:form>
+</div>
+</h:body>
+</html>
\ No newline at end of file
diff --git a/jsf/src/main/webapp/index.xhtml b/jsf/src/main/webapp/index.xhtml
index 1dd50f9cff9fe62337690d46bf11dcc3e12b84b2..96067ea6fbebfd298b40549fe32a1c3bb3ff9884 100644
--- a/jsf/src/main/webapp/index.xhtml
+++ b/jsf/src/main/webapp/index.xhtml
@@ -1,46 +1,26 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
-        "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
 <html xmlns="http://www.w3.org/1999/xhtml"
-      xmlns:h="http://xmlns.jcp.org/jsf/html"
+      xmlns:h="http://java.sun.com/jsf/html"
       xmlns:f="http://java.sun.com/jsf/core"
-      xmlns:p="http://primefaces.org/ui"
->
+      xmlns:p="http://primefaces.org/ui">
 
 <h:head>
-    <title>Hello World JSF 3</title>
+
 </h:head>
 
 <h:body>
-    <h3 style="text-align: center">#{sampleBean.message}</h3>
-
-    <h:dataTable value="#{sampleBean.persons}" var="person"
-                 styleClass="order-table"
-                 headerClass="order-table-header"
-                 rowClasses="order-table-odd-row,order-table-even-row">
-        <h:column>
-            <f:facet name="header">UUID</f:facet>
-            #{person.uuid}
-        </h:column>
-
-        <h:column>
-            <f:facet name="header">Name</f:facet>
-            #{person.name}
-        </h:column>
-    </h:dataTable>
+    <h3 style="text-align: center">#{viewPersonBean.message}</h3>
 
-    <h:form>
-        <div class="card">
-            <p:dataTable var="person" value="#{sampleBean.persons}">
-                <p:column headerText="UUID">
-                    <h:outputText value="#{person.uuid}" />
-                </p:column>
+    <div class="card">
+        <p:dataTable var="person" value="#{viewPersonBean.persons}">
+            <p:column headerText="UUID">
+                <h:outputText value="#{person.uuid}"/>
+            </p:column>
 
-                <p:column headerText="Name">
-                    <h:outputText value="#{person.name}" />
-                </p:column>
-            </p:dataTable>
-        </div>
-    </h:form>
+            <p:column headerText="Name">
+                <h:outputText value="#{person.name}"/>
+            </p:column>
+        </p:dataTable>
+    </div>
 
 </h:body>
 </html>
diff --git a/jsf/src/main/webapp/test.xhtml b/jsf/src/main/webapp/test.xhtml
new file mode 100644
index 0000000000000000000000000000000000000000..c854dabea51d0a48ce87247a67f7eb11df8aa95c
--- /dev/null
+++ b/jsf/src/main/webapp/test.xhtml
@@ -0,0 +1,12 @@
+<html xmlns="http://www.w3.org/1999/xhtml"
+      xmlns:h="http://java.sun.com/jsf/html"
+      xmlns:f="http://java.sun.com/jsf/core"
+      xmlns:p="http://primefaces.org/ui">
+
+<h:head>
+</h:head>
+
+<h:body>
+    <p:spinner />
+</h:body>
+</html>
\ No newline at end of file