diff --git a/ws/eclipse/HibIntro/src/main/java/entity/company8/Persist.java b/ws/eclipse/HibIntro/src/main/java/entity/company8/Persist.java
new file mode 100644
index 0000000000000000000000000000000000000000..f47fc6816520dd5dbe724565571ddd3f9bcc0c0d
--- /dev/null
+++ b/ws/eclipse/HibIntro/src/main/java/entity/company8/Persist.java
@@ -0,0 +1,44 @@
+package entity.company8;
+
+import hibintro.util.HibernateUtil;
+
+import org.hibernate.Session;
+import org.hibernate.Transaction;
+
+import entity.company8.model.Employee;
+import entity.company8.model.Project;
+
+
+
+
+/**
+ * Defining many-to-many relationship between
+ * {@link Employee} and {@link Project}
+ *
+ */
+public class Persist {
+  public static void main(String[] args) {
+    final Session session = HibernateUtil.createSessionFactory("entity/company8/hibernate.cfg.xml").openSession();
+    {
+      final Transaction transaction = session.beginTransaction();
+      final Employee  martin = new Employee(123, "Martin Goik"),
+          eve = new Employee(140, "Eve Blix"),
+          jim = new Employee(160, "Jim Clarke");
+      
+      session.save(martin);
+      session.save(eve);
+      session.save(jim);
+
+      final Project water = new Project(1, "Water supply")
+      ,health = new Project(2, "Health management");
+ 
+      water.addEmployee(martin);
+      water.addEmployee(eve);
+      session.save(water);
+      session.save(health);
+      
+      
+      transaction.commit();
+    }
+  }
+}
\ No newline at end of file
diff --git a/ws/eclipse/HibIntro/src/main/java/entity/company8/ReassignProjects.java b/ws/eclipse/HibIntro/src/main/java/entity/company8/ReassignProjects.java
new file mode 100644
index 0000000000000000000000000000000000000000..73ef378d0f8b0333cef2f60c0bc116e801142414
--- /dev/null
+++ b/ws/eclipse/HibIntro/src/main/java/entity/company8/ReassignProjects.java
@@ -0,0 +1,48 @@
+package entity.company8;
+
+import hibintro.util.HibernateUtil;
+
+import org.hibernate.Criteria;
+import org.hibernate.Session;
+import org.hibernate.Transaction;
+import org.hibernate.criterion.Restrictions;
+
+import entity.company8.model.Employee;
+import entity.company8.model.Project;
+
+public class ReassignProjects {
+   
+  public static void main(String[] args) {
+     
+     
+     
+    final Session session = HibernateUtil.createSessionFactory("entity/company8/hibernate.cfg.xml").openSession();
+    {
+      final Transaction transaction = session.beginTransaction();
+      
+      final Employee
+         martin = (Employee) session.createCriteria(Employee.class).add(
+                     Restrictions.eq("staffNumber", 123)).list().get(0)
+                     
+           ,eve = (Employee) session.createCriteria(Employee.class).add(
+                     Restrictions.eq("staffNumber", 140)). list().get(0)
+                     
+           ,jim = (Employee) session.createCriteria(Employee.class).add(
+                     Restrictions.eq("staffNumber", 160)). list().get(0);
+      
+      final Criteria searchProject = session.createCriteria(Project.class);
+      
+      final Project water = (Project) searchProject.add(
+            Restrictions.eq("no", 1)).list().get(0);
+
+      water.removeEmployee(martin);
+      water.addEmployee(jim);
+      
+      
+      session.save(martin);
+      session.save(eve);
+      session.save(jim);
+      transaction.commit();
+    }
+  }
+}
\ No newline at end of file
diff --git a/ws/eclipse/HibIntro/src/main/java/entity/company8/hibernate.cfg.xml b/ws/eclipse/HibIntro/src/main/java/entity/company8/hibernate.cfg.xml
new file mode 100644
index 0000000000000000000000000000000000000000..dd6f7481c45ef081acccd24c3ea4474a02d3cc3c
--- /dev/null
+++ b/ws/eclipse/HibIntro/src/main/java/entity/company8/hibernate.cfg.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<!DOCTYPE hibernate-configuration PUBLIC
+	"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
+	"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
+
+<hibernate-configuration>
+ <session-factory >
+  <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
+  <property name="hibernate.connection.password">XYZ</property>
+  <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/hdm</property>
+  <property name="hibernate.connection.username">hdmuser</property>
+  <property name="hibernate.dialect">org.hibernate.dialect.MySQL5InnoDBDialect</property>
+  <property name="hibernate.show_sql">true</property>
+  <property name="hibernate.format_sql">true</property>
+  <property name="hibernate.hbm2ddl.auto">update</property>
+  
+  <mapping class="entity.company8.model.Employee"/>
+  <mapping class="entity.company8.model.Project"/>
+  <mapping class="entity.company8.model.EmployeeProject"/>
+ </session-factory>
+</hibernate-configuration>
diff --git a/ws/eclipse/HibIntro/src/main/java/entity/company8/model/Employee.java b/ws/eclipse/HibIntro/src/main/java/entity/company8/model/Employee.java
new file mode 100644
index 0000000000000000000000000000000000000000..72c7fb8f528543a4672dbc166568b1796a79c207
--- /dev/null
+++ b/ws/eclipse/HibIntro/src/main/java/entity/company8/model/Employee.java
@@ -0,0 +1,69 @@
+package entity.company8.model;
+
+import java.util.HashSet;
+import java.util.Set;
+
+import javax.persistence.CascadeType;
+import javax.persistence.Entity;
+import javax.persistence.FetchType;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.OneToMany;
+import javax.persistence.Table;
+import javax.persistence.UniqueConstraint;
+
+import org.hibernate.annotations.Cascade;
+
+import entity.company12.Department;
+
+
+/**
+ * 
+ *         {@link Employee} instances related to {@link Department}
+ * 
+ */
+@Entity
+@Table(uniqueConstraints={@UniqueConstraint(columnNames={"staffNumber"})})
+public class Employee {
+
+  @Id
+  @GeneratedValue
+  public Long getId() {return id;}
+  protected void setId(Long id) {this.id = id;}
+  private Long id;
+
+  public int getStaffNumber() { return staffNumber;}
+  public void setStaffNumber(int staffNumber) { this.staffNumber = staffNumber;}
+  int staffNumber = Integer.MIN_VALUE;
+
+  public String getCname() { return cname;}
+  public void setCname(String cname) { this.cname = cname;}
+  private String cname; // Common name
+
+  @OneToMany(orphanRemoval=true,fetch = FetchType.LAZY, mappedBy ="pk.employee",
+        cascade = {CascadeType.PERSIST, CascadeType.MERGE})
+  @Cascade({org.hibernate.annotations.CascadeType.SAVE_UPDATE})
+
+  public Set<EmployeeProject> getEmployeeProjects() { return employeeProjects;}
+  public void setEmployeeProjects(Set<EmployeeProject> employeeProjects) { this.employeeProjects = employeeProjects;}
+  private Set<EmployeeProject> employeeProjects = new HashSet<EmployeeProject>();
+
+  protected Employee(){}
+
+  public Employee(final int staffNumber, final String cname) {
+    setStaffNumber(staffNumber);
+    setCname(cname);
+  }
+  @Override
+  public boolean equals(Object other) {
+    if (this == other) {
+      return true;
+    } else if (other instanceof Employee) {
+      return getStaffNumber() == ((Employee) other).getStaffNumber();
+    } else {
+      return false;
+    }
+  }
+  @Override
+  public int hashCode() { return getStaffNumber();}
+}
\ No newline at end of file
diff --git a/ws/eclipse/HibIntro/src/main/java/entity/company8/model/EmployeeProject.java b/ws/eclipse/HibIntro/src/main/java/entity/company8/model/EmployeeProject.java
new file mode 100644
index 0000000000000000000000000000000000000000..3a690d668833cebee3fb1ad29bfaa98e3854cff9
--- /dev/null
+++ b/ws/eclipse/HibIntro/src/main/java/entity/company8/model/EmployeeProject.java
@@ -0,0 +1,47 @@
+package entity.company8.model;
+
+import javax.persistence.AssociationOverride;
+import javax.persistence.AssociationOverrides;
+import javax.persistence.EmbeddedId;
+import javax.persistence.Entity;
+import javax.persistence.JoinColumn;
+import javax.persistence.Transient;
+
+
+@Entity
+@AssociationOverrides({
+@AssociationOverride(name ="pk.employee", joinColumns = @JoinColumn(name ="employee_id")),
+@AssociationOverride(name ="pk.project", joinColumns = @JoinColumn(name ="project_id"))
+        })
+public class EmployeeProject {
+   
+   @EmbeddedId
+   private EmployeeProjectPk getPk() { return pk;}
+   protected void setPk(EmployeeProjectPk pk) { this.pk = pk;}
+   private EmployeeProjectPk pk = new EmployeeProjectPk();
+   
+   @Transient
+   public Employee getEmployee() { return getPk().getEmployee();}
+   public void setEmployee(Employee employee) { getPk().setEmployee(employee);}
+
+   @Transient
+   public Project getProject() { return getPk().getProject();}
+   public void setProject(Project project) { getPk().setProject(project);}
+ 
+   public boolean equals(Object o) {
+      if (this == o) {
+         return true;
+      } else if (o instanceof EmployeeProject) {
+         return getPk().equals(((EmployeeProject) o).getPk());
+      } else {
+         return false;
+      }
+  }
+  public int hashCode() {
+     if (null == getPk()) {
+        return 0;
+     } else {
+        return getPk().hashCode();
+     }
+  }
+}
diff --git a/ws/eclipse/HibIntro/src/main/java/entity/company8/model/EmployeeProjectPk.java b/ws/eclipse/HibIntro/src/main/java/entity/company8/model/EmployeeProjectPk.java
new file mode 100644
index 0000000000000000000000000000000000000000..bc185f2a6051aee2fe5c6b8742d21b96685ed125
--- /dev/null
+++ b/ws/eclipse/HibIntro/src/main/java/entity/company8/model/EmployeeProjectPk.java
@@ -0,0 +1,46 @@
+package entity.company8.model;
+
+import java.io.Serializable;
+
+import javax.persistence.Embeddable;
+import javax.persistence.ManyToOne;
+
+// See http://giannigar.wordpress.com/2009/09/04/mapping-a-many-to-many-join-table-with-extra-column-using-jpa
+
+@Embeddable
+public class EmployeeProjectPk implements Serializable {
+   
+   private static final long serialVersionUID = -8380988172656519306L;
+
+   @ManyToOne
+   public Employee getEmployee() {return employee; }
+   public void setEmployee(Employee employee) {this.employee = employee;}
+   private Employee employee;
+
+   @ManyToOne
+   public Project  getProject() { return project;}
+   public void setProject(Project project) { this.project = project;}
+   private Project project;
+
+   public boolean equals(Object o) {
+      if (this == o) {
+         return true;
+      } else if (o instanceof EmployeeProjectPk) {
+         EmployeeProjectPk that = (EmployeeProjectPk) o;
+         if (null == getEmployee()  && null != that.getEmployee()) {
+            return false;
+         } else if (null == getProject() && null != that.getProject()){
+            return false;
+         } else {
+            return getProject().equals(that.getProject()) &&
+                  getEmployee().equals(that.getEmployee());
+         }
+      } else {
+         return false;
+      }
+   }
+   public int hashCode() {
+      int result = (employee == null ? 0 : employee.hashCode());
+      return 31 * result + (project == null ? 0 : project.hashCode());
+   }
+}
diff --git a/ws/eclipse/HibIntro/src/main/java/entity/company8/model/Project.java b/ws/eclipse/HibIntro/src/main/java/entity/company8/model/Project.java
new file mode 100644
index 0000000000000000000000000000000000000000..e027c551151f50bbeda38f7706fa31cdbc4c8449
--- /dev/null
+++ b/ws/eclipse/HibIntro/src/main/java/entity/company8/model/Project.java
@@ -0,0 +1,93 @@
+package entity.company8.model;
+
+import java.util.HashSet;
+import java.util.Set;
+
+import javax.persistence.CascadeType;
+import javax.persistence.Entity;
+import javax.persistence.FetchType;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.OneToMany;
+import javax.persistence.Table;
+import javax.persistence.UniqueConstraint;
+
+import org.hibernate.annotations.Cascade;
+
+/**
+ * 
+ *         {@link Project} instances related to {@link Employee}
+ * 
+ */
+@Entity
+@Table(uniqueConstraints={@UniqueConstraint(columnNames={"no"})})
+public class Project {
+
+   @Id
+   @GeneratedValue
+   public Long getId() {return id;}
+   protected void setId(Long id) {this.id = id;}
+   private Long id;
+
+   public int getNo() { return no;}
+   public void setNo(int no) { this.no = no;}
+   int no;
+
+   public String getTitle() { return title;}
+   public void setTitle(String title) { this.title = title;}
+   String title;
+
+
+   @OneToMany(orphanRemoval=true, fetch = FetchType.LAZY, mappedBy ="pk.project",
+         cascade = {CascadeType.PERSIST, CascadeType.MERGE})
+   @Cascade({org.hibernate.annotations.CascadeType.SAVE_UPDATE})
+   public Set<EmployeeProject> getEmployeeProjects() { return employeeProjects;}
+   public void setEmployeeProjects(Set<EmployeeProject> employeeProjects) { this.employeeProjects = employeeProjects;}
+   private Set<EmployeeProject> employeeProjects = new HashSet<EmployeeProject>();
+
+   public void addEmployee(final Employee employee) {
+      EmployeeProject ep = new EmployeeProject();
+      ep.setEmployee(employee);
+      ep.setProject(this);
+      getEmployeeProjects().add(ep);
+      employee.getEmployeeProjects().add(ep);
+   }
+
+   public void removeEmployee(final Employee employee) {
+      
+      Set<EmployeeProject> eps = getEmployeeProjects();
+      
+      for (EmployeeProject ep: eps) {
+         if (ep.getEmployee().equals(employee)){
+            getEmployeeProjects().remove(ep);
+            employee.getEmployeeProjects().remove(ep);
+            return;
+         }
+      }
+      
+      EmployeeProject ep = new EmployeeProject();
+      ep.setEmployee(employee);
+      ep.setProject(this);
+      getEmployeeProjects().add(ep);
+      employee.getEmployeeProjects().add(ep);
+   }
+
+   protected Project(){}
+
+   public Project(final int no, final String title) {
+      setNo(no);
+      setTitle(title);
+   }
+   @Override
+   public boolean equals(Object other) {
+      if (this == other) {
+         return true;
+      } else if (other instanceof Project) {
+         return getNo() == ((Project) other).getNo();
+      } else {
+         return false;
+      }
+   }
+   @Override
+   public int hashCode() { return getNo();}
+}
\ No newline at end of file