diff --git a/Sda2/P/Jpa/HibernateCacheDemo/pom.xml b/Sda2/P/Jpa/HibernateCacheDemo/pom.xml
new file mode 100644
index 0000000000000000000000000000000000000000..b3183ab898eff31df25392d197d0210e7cad7721
--- /dev/null
+++ b/Sda2/P/Jpa/HibernateCacheDemo/pom.xml
@@ -0,0 +1,60 @@
+<?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>
+	<groupId>com.mastertheboss</groupId>
+	<artifactId>EclipseJPAExample</artifactId>
+	<version>1.0-SNAPSHOT</version>
+	<repositories>
+		<repository>
+			<id>EclipseLink Repo</id>
+			<url>http://download.eclipse.org/rt/eclipselink/maven.repo</url>
+			<name>EclipseLink Repo</name>
+		</repository>
+	</repositories>
+	<dependencies>
+		<dependency>
+			<groupId>mysql</groupId>
+			<artifactId>mysql-connector-java</artifactId>
+			<version>5.1.33</version>
+		</dependency>
+
+<!-- 
+		<dependency>
+			<groupId>org.hibernate.javax.persistence</groupId>
+			<artifactId>hibernate-jpa-2.1-api</artifactId>
+			<version>1.0.0.Final</version>
+		</dependency>
+
+		<dependency>
+        <groupId>net.sf.ehcache</groupId>
+        <artifactId>ehcache</artifactId>
+        <version>2.8.3</version>
+    </dependency>
+
+		 -->
+		<dependency>
+			<groupId>org.hibernate</groupId>
+			<artifactId>hibernate-core</artifactId>
+			<version>4.2.16.Final</version>
+		</dependency>
+
+		<dependency>
+			<groupId>org.hibernate</groupId>
+			<artifactId>hibernate-entitymanager</artifactId>
+			<version>4.2.16.Final</version>
+		</dependency>
+		<dependency>
+			<groupId>org.hibernate</groupId>
+			<artifactId>hibernate-ehcache</artifactId>
+			<version>4.2.16.Final</version>
+		</dependency>
+		
+		<dependency>
+			<groupId>org.slf4j</groupId>
+			<artifactId>slf4j-log4j12</artifactId>
+			<version>1.7.9</version>
+		</dependency>
+
+	</dependencies>
+</project>
diff --git a/Sda2/P/Jpa/HibernateCacheDemo/src/main/java/de/hdm_stuttgart/mi/sda2/ehcache/JpaTest.java b/Sda2/P/Jpa/HibernateCacheDemo/src/main/java/de/hdm_stuttgart/mi/sda2/ehcache/JpaTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..825b1c63c94f3ae438542920c5e02ed59e14acf1
--- /dev/null
+++ b/Sda2/P/Jpa/HibernateCacheDemo/src/main/java/de/hdm_stuttgart/mi/sda2/ehcache/JpaTest.java
@@ -0,0 +1,126 @@
+package de.hdm_stuttgart.mi.sda2.ehcache;
+
+import java.util.List;
+
+import javax.persistence.EntityManager;
+import javax.persistence.EntityManagerFactory;
+import javax.persistence.EntityTransaction;
+import javax.persistence.Persistence;
+
+import net.sf.ehcache.Cache;
+import net.sf.ehcache.CacheManager;
+import de.hdm_stuttgart.mi.sda2.ehcache.domain.Department;
+import de.hdm_stuttgart.mi.sda2.ehcache.domain.Employee;
+
+public class JpaTest {
+
+   private static EntityManager manager1, manager2, manager3;
+
+   /**
+    * @param args
+    */
+   public static void main(String[] args) {
+
+
+      EntityManagerFactory factory = Persistence.createEntityManagerFactory("persistenceUnit");
+      manager1 = factory.createEntityManager();
+      manager2 = factory.createEntityManager();
+      manager3 = factory.createEntityManager();
+
+      System.out.println("manager1 == manager2:" + (manager1 == manager2));
+
+
+      try {
+         createEmployees(manager1);
+      } catch (Exception e) {
+         e.printStackTrace();
+      }
+
+      System.out.println("Reading employees by manager 1");
+      final Employee emp1[] = listEmployees(manager1);
+      System.out.println("-------------------");
+      
+      findEmployees(manager2, emp1);
+      findEmployees(manager3, emp1);
+      
+      displayCacheState();
+
+      System.out.println("Reading employees by manager 3");
+      listEmployees(manager3);
+      System.out.println("-------------------");
+
+      displayCacheState();
+   }
+   
+   private static void findEmployees(final EntityManager manager, final Employee[] employees) {
+      final EntityTransaction tx = manager.getTransaction();
+      
+      tx.begin();
+      {
+         for (final Employee e: employees) {
+            System.out.println("Loading employee #" + e.getId() + " by manager " + manager);
+            System.out.println(" ->" + manager.find(Employee.class, e.getId()));
+         }
+      }
+      tx.commit();
+   }
+
+   private static void displayCacheState() {
+      for (CacheManager cm : CacheManager.ALL_CACHE_MANAGERS) {
+         System.out.println("----------- CacheManager:" + cm.getName());
+         for (final String item: cm.getCacheNames()) {
+            System.out.println("Cache:" + item);
+            analyzeCache(cm, item);
+            System.out.println("-------------------");
+         }
+      }
+   }
+
+   private static void analyzeCache(final CacheManager cm, final String cacheName) {
+      Cache cache = cm.getCache(cacheName);
+
+      System.out.println("isDisabled=" +cache.isDisabled());
+
+      System.out.println("hit count:" + cache.getLiveCacheStatistics().getCacheHitCount());
+
+      List<?> cachedObjects = cache.getKeys();
+      System.out.println("Num of objects in cache:" + cachedObjects.size());
+      for (final Object key: cachedObjects) {
+         System.out.println("key:" + key);
+      }
+   }
+
+   private static void createEmployees(final EntityManager manager) {
+      final EntityTransaction tx = manager.getTransaction();
+      tx.begin();
+      {
+         int numOfEmployees = manager.createQuery("Select a From Employee a", Employee.class).getResultList().size();
+         if (numOfEmployees == 0) {
+            Department department = new Department("java");
+            manager.persist(department);
+
+            manager.persist(new Employee("Jakab Gipsz",department));
+            manager.persist(new Employee("Captain Nemo",department));
+         }
+      }
+      tx.commit();
+   }
+
+   private static Employee[] listEmployees(final EntityManager manager) {
+      final EntityTransaction tx = manager.getTransaction();
+      
+      List<Employee> resultList;
+      tx.begin();
+      {
+         resultList = manager.createQuery("Select a From Employee a", Employee.class).
+               setHint("org.hibernate.cacheable", true).getResultList();
+         System.out.println("num of employess:" + resultList.size());
+         for (Employee next : resultList) {
+            manager.find(Employee.class, next.getId());
+            System.out.println("next employee: " + next);
+         }
+      }
+      tx.commit();
+      return resultList.toArray(new Employee[0]);
+   }
+}
diff --git a/Sda2/P/Jpa/HibernateCacheDemo/src/main/java/de/hdm_stuttgart/mi/sda2/ehcache/domain/Department.java b/Sda2/P/Jpa/HibernateCacheDemo/src/main/java/de/hdm_stuttgart/mi/sda2/ehcache/domain/Department.java
new file mode 100644
index 0000000000000000000000000000000000000000..081cb52e75748ddb8b8977f010c1f4f7e1349e45
--- /dev/null
+++ b/Sda2/P/Jpa/HibernateCacheDemo/src/main/java/de/hdm_stuttgart/mi/sda2/ehcache/domain/Department.java
@@ -0,0 +1,52 @@
+package de.hdm_stuttgart.mi.sda2.ehcache.domain;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.persistence.Cacheable;
+import javax.persistence.CascadeType;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.OneToMany;
+
+@Entity
+@Cacheable(true)
+public class Department {
+
+	@Id
+	@GeneratedValue
+	private Long id;
+	
+	private String name;
+	
+	@OneToMany(mappedBy="department",cascade=CascadeType.PERSIST)
+	private List<Employee> employees = new ArrayList<Employee>();
+	
+	
+	
+	public Department() {
+		super();
+	}
+	public Department(String name) {
+		this.name = name;
+	}
+	public Long getId() {
+		return id;
+	}
+	public void setId(Long id) {
+		this.id = id;
+	}
+	public String getName() {
+		return name;
+	}
+	public void setName(String name) {
+		this.name = name;
+	}
+	public List<Employee> getEmployees() {
+		return employees;
+	}
+	public void setEmployees(List<Employee> employees) {
+		this.employees = employees;
+	}
+}
diff --git a/Sda2/P/Jpa/HibernateCacheDemo/src/main/java/de/hdm_stuttgart/mi/sda2/ehcache/domain/Employee.java b/Sda2/P/Jpa/HibernateCacheDemo/src/main/java/de/hdm_stuttgart/mi/sda2/ehcache/domain/Employee.java
new file mode 100644
index 0000000000000000000000000000000000000000..0c1bcfa3904618d8cc1422696739a89f7e7e972f
--- /dev/null
+++ b/Sda2/P/Jpa/HibernateCacheDemo/src/main/java/de/hdm_stuttgart/mi/sda2/ehcache/domain/Employee.java
@@ -0,0 +1,63 @@
+package de.hdm_stuttgart.mi.sda2.ehcache.domain;
+
+import javax.persistence.Cacheable;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.ManyToOne;
+
+@Entity
+@Cacheable(true)
+public class Employee {
+	@Id
+	@GeneratedValue
+	private Long id;
+
+	private String name;
+	
+	@ManyToOne
+	private Department department;
+
+	public Employee() {}
+
+	public Employee(String name, Department department) {
+		this.name = name;
+		this.department = department;
+	}
+	
+
+	public Employee(String name) {
+		this.name = name;
+	}
+
+	public Long getId() {
+		return id;
+	}
+
+	public void setId(Long id) {
+		this.id = id;
+	}
+
+	public String getName() {
+		return name;
+	}
+
+	public void setName(String name) {
+		this.name = name;
+	}
+
+	public Department getDepartment() {
+		return department;
+	}
+
+	public void setDepartment(Department department) {
+		this.department = department;
+	}
+
+	@Override
+	public String toString() {
+		return "Employee [id=" + id + ", name=" + name + ", department="
+				+ department.getName() + "]";
+	}
+
+}
diff --git a/Sda2/P/Jpa/HibernateCacheDemo/src/main/resources/META-INF/persistence.xml b/Sda2/P/Jpa/HibernateCacheDemo/src/main/resources/META-INF/persistence.xml
new file mode 100644
index 0000000000000000000000000000000000000000..00e20063de5d3f50ef6013a82f308bdaa2cdfd0a
--- /dev/null
+++ b/Sda2/P/Jpa/HibernateCacheDemo/src/main/resources/META-INF/persistence.xml
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<persistence xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"
+	version="2.0" xmlns="http://java.sun.com/xml/ns/persistence">
+	<persistence-unit name="persistenceUnit" transaction-type="RESOURCE_LOCAL">
+		
+		<provider>org.hibernate.ejb.HibernatePersistence</provider>
+		
+		<class>de.hdm_stuttgart.mi.sda2.ehcache.domain.Employee</class>
+		<class>de.hdm_stuttgart.mi.sda2.ehcache.domain.Department</class>
+		
+		<shared-cache-mode>ENABLE_SELECTIVE</shared-cache-mode>
+		<properties>
+		
+			<property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver" />
+			<property name="javax.persistence.jdbc.url" value="jdbc:mysql://localhost:3306/hdm" />
+			<property name="javax.persistence.jdbc.user" value="hdmuser" />
+			<property name="javax.persistence.jdbc.password" value="XYZ" />
+			
+			<property name="hibernate.show_sql" value="true"/>
+			<property name="hibernate.hbm2ddl.auto" value="create-drop" />
+			<property name="hibernate.dialect" value="org.hibernate.dialect.MySQL5InnoDBDialect" />
+			
+			
+			<property name="hibernate.cache.region.factory_class" value="org.hibernate.cache.ehcache.EhCacheRegionFactory"/>
+			<property name="hibernate.cache.use_second_level_cache" value="true" />
+			<property name="hibernate.cache.use_query_cache" value="true" />
+			<property name="hibernate.generate_statistics" value="true" />
+			
+			
+		</properties>
+
+	</persistence-unit>
+</persistence>
\ No newline at end of file
diff --git a/Sda2/P/Jpa/HibernateCacheDemo/src/main/resources/ehcache.xml b/Sda2/P/Jpa/HibernateCacheDemo/src/main/resources/ehcache.xml
new file mode 100644
index 0000000000000000000000000000000000000000..fbc01fcfd6835ea080a0d9638d0b449e2234c8d5
--- /dev/null
+++ b/Sda2/P/Jpa/HibernateCacheDemo/src/main/resources/ehcache.xml
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ehcache> 
+    <diskStore path="/tmp/ehcache"/> 
+    <defaultCache maxElementsInMemory="10000"
+        eternal="false"
+        timeToIdleSeconds="300"
+        timeToLiveSeconds="600"
+        diskSpoolBufferSizeMB="30"
+        maxElementsOnDisk="10000"
+        diskExpiryThreadIntervalSeconds="120"
+        memoryStoreEvictionPolicy="LRU" statistics="true">
+    </defaultCache>
+    
+    <cache
+        name="org.hibernate.cache.spi.UpdateTimestampsCache"
+        maxElementsInMemory="10000"
+        eternal="false">
+    </cache>
+    
+    <cache
+        name="org.hibernate.cache.internal.StandardQueryCache"
+        maxElementsInMemory="10000"
+        eternal="false"
+        timeToLiveSeconds="300">
+    </cache>
+    
+    <!--
+    <cache name="XXX"
+        maxElementsInMemory="500"
+        eternal="true"
+        timeToIdleSeconds="0"
+        timeToLiveSeconds="0"
+        overflowToDisk="false"
+    />
+    -->
+</ehcache>
\ No newline at end of file
diff --git a/Sda2/P/Jpa/HibernateCacheDemo/src/main/resources/log4j.properties b/Sda2/P/Jpa/HibernateCacheDemo/src/main/resources/log4j.properties
new file mode 100644
index 0000000000000000000000000000000000000000..510abca9e3a412d0d4267772ac300083245ced29
--- /dev/null
+++ b/Sda2/P/Jpa/HibernateCacheDemo/src/main/resources/log4j.properties
@@ -0,0 +1,7 @@
+log4j.rootLogger=INFO, stdout
+ 
+# Direct log messages to stdout
+log4j.appender.stdout=org.apache.log4j.ConsoleAppender
+log4j.appender.stdout.Target=System.out
+log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
+log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n
\ No newline at end of file