diff --git a/pom.xml b/pom.xml
index ec1d0f05e6ecdea0a278eb5468cf39cf1e347767..1d7427f6f5769e146e5f4022e4d914c38e992b18 100644
--- a/pom.xml
+++ b/pom.xml
@@ -3,10 +3,10 @@
 	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
 	<modelVersion>4.0.0</modelVersion>
 	<groupId>cz.vsb.fei.java2</groupId>
-	<artifactId>java2-lab05-v3</artifactId>
+	<artifactId>java2-lab09-v3</artifactId>
 	<version>0.0.1-SNAPHOST</version>
 	<packaging>jar</packaging>
-	<name>java2-lab05-v3</name>
+	<name>java2-lab09-v3</name>
 	<properties>
 		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
 		<maven.compiler.source>21</maven.compiler.source>
@@ -24,6 +24,21 @@
 		</repository>
 	</repositories>
 	<dependencies>
+
+		<!--
+		https://mvnrepository.com/artifact/jakarta.persistence/jakarta.persistence-api -->
+		<dependency>
+			<groupId>jakarta.persistence</groupId>
+			<artifactId>jakarta.persistence-api</artifactId>
+			<version>3.2.0</version>
+		</dependency>
+		<!-- https://mvnrepository.com/artifact/org.hibernate.orm/hibernate-core -->
+		<dependency>
+			<groupId>org.hibernate.orm</groupId>
+			<artifactId>hibernate-core</artifactId>
+			<version>6.6.11.Final</version>
+		</dependency>
+
 		<dependency>
 			<groupId>cz.vsb.fei</groupId>
 			<artifactId>kelvin-java-unittest-support</artifactId>
diff --git a/src/main/java/lab/Setup.java b/src/main/java/lab/Setup.java
index d1f4b9ec802d4a3deacc74787fd0b8d5370ec52e..84caa5c0aa59d983788f2d9e22b7b1d177ae8ea4 100644
--- a/src/main/java/lab/Setup.java
+++ b/src/main/java/lab/Setup.java
@@ -1,5 +1,6 @@
 package lab;
 
+import jakarta.persistence.Entity;
 import lab.storage.DbConnector;
 import lab.storage.ScoreStorageInterface;
 import lombok.AllArgsConstructor;
@@ -7,6 +8,7 @@ import lombok.Builder;
 import lombok.Builder.Default;
 import lombok.EqualsAndHashCode;
 import lombok.Getter;
+import lombok.NoArgsConstructor;
 import lombok.ToString;
 
 @Getter
diff --git a/src/main/java/lab/data/Score.java b/src/main/java/lab/data/Score.java
index 247a9b4442f21b7cb6e894e98de691f5c81c5edc..c6219a5ccf95cecfdc1eeafa96b3ae07ef94f928 100644
--- a/src/main/java/lab/data/Score.java
+++ b/src/main/java/lab/data/Score.java
@@ -2,16 +2,26 @@ package lab.data;
 
 import java.util.Random;
 
+import jakarta.persistence.Entity;
+import jakarta.persistence.EnumType;
+import jakarta.persistence.Enumerated;
+import jakarta.persistence.GeneratedValue;
+import jakarta.persistence.GenerationType;
+import jakarta.persistence.Id;
+
 import lombok.AllArgsConstructor;
 import lombok.Builder;
 import lombok.EqualsAndHashCode;
 import lombok.Getter;
+import lombok.NoArgsConstructor;
 import lombok.Setter;
 import lombok.ToString;
 
+@Entity
 @Getter
 @Setter
 @AllArgsConstructor
+@NoArgsConstructor
 @EqualsAndHashCode
 @ToString
 @Builder(toBuilder = true)
@@ -19,9 +29,12 @@ public class Score {
 
 	private static final Random RANDOM = new Random();
 	
+	@Id
+	@GeneratedValue(strategy = GenerationType.AUTO)
 	private Long id;
 	private String name;
 	private int points;
+	@Enumerated(EnumType.STRING)
 	private Level level;
 	
 	
diff --git a/src/main/java/lab/storage/JpaConnector.java b/src/main/java/lab/storage/JpaConnector.java
index b1f5bf10a6129abf829d8a7283603076b76a2e7d..87358543aba95b69008d9c0d604a3d68b0893a8b 100644
--- a/src/main/java/lab/storage/JpaConnector.java
+++ b/src/main/java/lab/storage/JpaConnector.java
@@ -1,25 +1,32 @@
 package lab.storage;
 
-import java.util.Collections;
 import java.util.List;
 import java.util.function.Consumer;
 
+import jakarta.persistence.EntityManager;
+import jakarta.persistence.EntityManagerFactory;
+import jakarta.persistence.Persistence;
 import lab.data.Score;
 
 public class JpaConnector implements ScoreStorageInterface {
 
 
+	private EntityManagerFactory entityManagerFactory;
+	private EntityManager entityManager;
+	
 	public JpaConnector() {
+		entityManagerFactory = Persistence.createEntityManagerFactory("java2");
+		entityManager = entityManagerFactory.createEntityManager();
 	}
 
 	@Override
 	public List<Score> getAll() {
-		return Collections.emptyList();
+		return entityManager.createQuery("select s from Score s", Score.class).getResultList();
 	}
 
 	@Override
 	public List<Score> getFirstTen() {
-		return Collections.emptyList();
+		return entityManager.createQuery("select s from Score s order by s.points DESC", Score.class).setMaxResults(10).getResultList();
 	}
 
 	@Override
@@ -28,27 +35,46 @@ public class JpaConnector implements ScoreStorageInterface {
 
 	@Override
 	public Score save(Score score) {
-		return null;
+		Score result;
+		entityManager.getTransaction().begin();
+		if(score.getId() == null || score.getId() == 0) {
+			entityManager.persist(score);
+			result = score;
+		} else {
+			result = entityManager.merge(score);
+		}
+		entityManager.getTransaction().commit();
+		return result;
 	}
 
 	@Override
 	public void delete(List<Score> scores) {
+		entityManager.getTransaction().begin();
+		for (Score score : scores) {
+			entityManager.remove(score);
+		}
+		entityManager.getTransaction().commit();
 	}
 
 	@Override
 	public void stop() {
+		entityManager.close();
+		entityManagerFactory.close();
 	}
 
 	public Object getEntityManager() {
 		//return entity manager. Type Object is there because of compilation of empty task assignment
-		return null;
+		return entityManager;
 	}
 
 	public Score find(long id) {
-		return null;
+		return entityManager.find(Score.class, id);
 	}
 	
 	public void modifyNoPersistOrMerge(long id, Consumer<Score> motificator) {
+		entityManager.getTransaction().begin();
+		Score score = find(id);
+		motificator.accept(score);
+		entityManager.getTransaction().commit();
 	}
-	
 }
diff --git a/src/main/java/module-info.java b/src/main/java/module-info.java
index 8f97c195abf646bd9ee2909fae4c51d29014984d..abec1388d0a3157f5921212a8964fbb36fed1e4d 100644
--- a/src/main/java/module-info.java
+++ b/src/main/java/module-info.java
@@ -6,9 +6,11 @@ module lab05_module {
 	requires org.apache.logging.log4j;
 	requires static lombok;
 	requires com.h2database;
+	requires jakarta.persistence;
+	requires org.hibernate.orm.core;
 	
 	opens lab.gui to javafx.fxml;
-	opens lab.data to javafx.base;
+	opens lab.data to javafx.base,org.hibernate.orm.core;
 
 	exports lab.gui to javafx.fxml, javafx.graphics;
 }
diff --git a/src/main/resources/META-INF/persistence.xml b/src/main/resources/META-INF/persistence.xml
new file mode 100644
index 0000000000000000000000000000000000000000..3a1bac1bb18249f8353d9a891abeeb9d860d0671
--- /dev/null
+++ b/src/main/resources/META-INF/persistence.xml
@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<persistence version="3.0"
+    xmlns="https://jakarta.ee/xml/ns/persistence"
+    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+    xsi:schemaLocation="
+        https://jakarta.ee/xml/ns/persistence
+        https://jakarta.ee/xml/ns/persistence/persistence_3_0.xsd">
+    <persistence-unit name="java2"
+        transaction-type="RESOURCE_LOCAL">
+
+        <!-- If you are running in a production environment, add a managed data 
+            source, this example data source is just for development and testing! -->
+        <properties>
+            <property name="jakarta.persistence.jdbc.url"
+                value="jdbc:h2:file:./db/java2" />
+            <!-- In memory DB no store to disk
+                <property name="jakarta.persistence.jdbc.url" value="jdbc:h2:mem:java2" />
+            -->
+            <property name="jakarta.persistence.jdbc.driver"
+                value="org.h2.Driver" />
+
+
+            <property name="jakarta.persistence.jdbc.user" value="app" />
+            <property name="jakarta.persistence.jdbc.password"
+                value="app" />
+            <property
+                name="jakarta.persistence.schema-generation.database.action"
+                value="create"></property>
+
+            <!-- Properties for Hibernate -->
+            <property name="hibernate.show_sql" value="false" />
+            <property name="hibernate.format_sql" value="true" />
+            <!--
+                <property name="hibernate.hbm2ddl.auto" value="update" />
+            -->
+
+        </properties>
+    </persistence-unit>
+
+</persistence>
\ No newline at end of file
diff --git a/src/test/java/jez04/structure/test/ClassStructureTestHw.java b/src/test/java/jez04/structure/test/ClassStructureTestHw.java
new file mode 100644
index 0000000000000000000000000000000000000000..fc22107f6c8354c6acf7b221a1f654e2857d10d5
--- /dev/null
+++ b/src/test/java/jez04/structure/test/ClassStructureTestHw.java
@@ -0,0 +1,77 @@
+package jez04.structure.test;
+
+import static org.hamcrest.MatcherAssert.assertThat;
+
+import java.net.URISyntaxException;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+
+import org.hamcrest.Matchers;
+import org.junit.jupiter.api.Test;
+
+import cz.vsb.fei.kelvin.unittest.ProjectContains;
+import cz.vsb.fei.kelvin.unittest.StructureHelper;
+import cz.vsb.fei.kelvin.unittest.TextFileContains;
+import cz.vsb.fei.kelvin.unittest.XmlFileContains;
+
+class ClassStructureTestHw {
+
+	StructureHelper helper = StructureHelper.getInstance(ClassStructureTest.class);
+
+	@Test
+	void jakartaAndHibernateAsDependencyTest() throws URISyntaxException {
+		assertThat(TextFileContains.getProjectRoot(getClass()), new XmlFileContains("pom.xml",
+				"/project/dependencies/dependency/artifactId[text() = 'jakarta.persistence-api']"));
+		assertThat(TextFileContains.getProjectRoot(getClass()), new XmlFileContains("pom.xml",
+				"/project/dependencies/dependency/artifactId[text() = 'hibernate-core']"));
+	}
+
+	@Test
+	void jakartaInModulInfoTest() throws URISyntaxException {
+		assertThat(TextFileContains.getProjectRoot(getClass()),
+				new TextFileContains("module-info.java", "jakarta.persistence;"));
+		assertThat(TextFileContains.getProjectRoot(getClass()),
+				new TextFileContains("module-info.java", "opens\\s+lab.data;|opens\\s+lab.data\\s+to\\s+javafx.base,org.hibernate.orm.core;"));
+
+	}
+
+	@Test
+	void pesistenceXmlTest() throws URISyntaxException {
+		ProjectContains projectContains = new ProjectContains("persistence.xml");
+		assertThat(TextFileContains.getProjectRoot(getClass()), projectContains);
+		assertThat(projectContains.getFoundFiles(), Matchers.not(Matchers.hasSize(0)));
+		Path persistenceXml = projectContains.getFoundFiles().getFirst();
+		assertThat(persistenceXml.toAbsolutePath().toString(),
+				Matchers.endsWith(Paths.get("resources", "META-INF", "persistence.xml").toString()));
+	}
+
+	@Test
+	void useEntityTest() throws URISyntaxException {
+		assertThat(TextFileContains.getProjectRoot(getClass()),
+				new TextFileContains(".*\\.java", "@Entity").useRegExpForName(true));
+	}
+
+	@Test
+	void useIdTest() throws URISyntaxException {
+		assertThat(TextFileContains.getProjectRoot(getClass()),
+				new TextFileContains(".*\\.java", "@Id").useRegExpForName(true));
+	}
+
+	@Test
+	void useGeneratedValueTest() throws URISyntaxException {
+		assertThat(TextFileContains.getProjectRoot(getClass()),
+				new TextFileContains(".*\\.java", "@GeneratedValue").useRegExpForName(true));
+	}
+
+	@Test
+	void useEntityManagerTest() throws URISyntaxException {
+		assertThat(TextFileContains.getProjectRoot(getClass()),
+				new TextFileContains(".*\\.java", "EntityManager").useRegExpForName(true));
+	}
+
+	@Test
+	void usePersistOrMergeTest() throws URISyntaxException {
+		assertThat(TextFileContains.getProjectRoot(getClass()),
+				new TextFileContains(".*\\.java", "\\.persist\\(|\\.merge\\(").useRegExpForName(true));
+	}
+}