diff --git a/pom.xml b/pom.xml
index 37ba4cf8f06b9b01aba7f038693c2f0ebc72bdf0..1d13de2c27e2d79e72ef2767846e5b90b25c815c 100644
--- a/pom.xml
+++ b/pom.xml
@@ -24,6 +24,22 @@
 		</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/data/Score.java b/src/main/java/lab/data/Score.java
index 435a6c2559cfa5925cad211374cdcd656a1f104b..2be798381f3f0f0634acc64df29fa574b38e4ee7 100644
--- a/src/main/java/lab/data/Score.java
+++ b/src/main/java/lab/data/Score.java
@@ -2,16 +2,25 @@ 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 +28,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..818aba97fd1ade8c0178fd67f60879bec6c34b0c 100644
--- a/src/main/java/lab/storage/JpaConnector.java
+++ b/src/main/java/lab/storage/JpaConnector.java
@@ -4,51 +4,80 @@ 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
 	public void init() {
+		/*nothing to do*/
 	}
 
 	@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 = entityManager.find(Score.class, id);
+		motificator.accept(score);
+		entityManager.getTransaction().commit();;
+		
 	}
 	
 }
diff --git a/src/main/java/module-info.java b/src/main/java/module-info.java
index fd02eeaaf3377d964e9498062cafecd395c77bf0..a98974e2b8c2ffefae3de82cacb14179e5c17da5 100644
--- a/src/main/java/module-info.java
+++ b/src/main/java/module-info.java
@@ -6,9 +6,11 @@ module cz.vsb.fei.java2.lab03_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;
 }
\ No newline at end of file
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/ClassStructureTest.java b/src/test/java/jez04/structure/test/ClassStructureTest.java
index 21c3023a1e362b7c8191843eee2cbda6fabde061..9fa7dff7e3dbb724da92636cdcc59ab3a7c318b6 100644
--- a/src/test/java/jez04/structure/test/ClassStructureTest.java
+++ b/src/test/java/jez04/structure/test/ClassStructureTest.java
@@ -46,7 +46,7 @@ class ClassStructureTest {
 		assertThat(TextFileContains.getProjectRoot(getClass()),
 				new TextFileContains("module-info.java", "jakarta.persistence;"));
 		assertThat(TextFileContains.getProjectRoot(getClass()),
-				new TextFileContains("module-info.java", "opens\\slab.data;"));
+				new TextFileContains("module-info.java", "opens\\s+lab.data;|opens\\s+lab.data\\s+to\\s+javafx.base,org.hibernate.orm.core;"));
 	}
 
 	@Test