diff --git a/smp-server-library/src/main/java/eu/europa/ec/cipa/smp/server/conversion/ServiceGroupConverter.java b/smp-server-library/src/main/java/eu/europa/ec/cipa/smp/server/conversion/ServiceGroupConverter.java
index 4711e3b4b92744272e611fb2e4fbb42557d60b5d..b67ca7fa65ea8415a10b7b55d8cb98897335e9e4 100644
--- a/smp-server-library/src/main/java/eu/europa/ec/cipa/smp/server/conversion/ServiceGroupConverter.java
+++ b/smp-server-library/src/main/java/eu/europa/ec/cipa/smp/server/conversion/ServiceGroupConverter.java
@@ -15,6 +15,7 @@
 
 package eu.europa.ec.cipa.smp.server.conversion;
 
+import eu.europa.ec.edelivery.smp.data.model.DBServiceGroupId;
 import eu.europa.ec.edelivery.smp.exceptions.ConversionException;
 import eu.europa.ec.edelivery.smp.exceptions.XmlParsingException;
 import eu.europa.ec.cipa.smp.server.util.ExtensionUtils;
@@ -104,4 +105,8 @@ public class ServiceGroupConverter {
             throw new ConversionException(e);
         }
     }
+
+    public static DBServiceGroupId toDbModel(ParticipantIdentifierType serviceGroupId){
+        return new DBServiceGroupId(serviceGroupId.getScheme(), serviceGroupId.getValue());
+    }
 }
diff --git a/smp-server-library/src/main/java/eu/europa/ec/cipa/smp/server/conversion/ServiceMetadataConverter.java b/smp-server-library/src/main/java/eu/europa/ec/cipa/smp/server/conversion/ServiceMetadataConverter.java
index 90eeedbc9318237589808def44585e1a045cf350..16bce44a3dc63680e9fb688c25388d331fceda6d 100644
--- a/smp-server-library/src/main/java/eu/europa/ec/cipa/smp/server/conversion/ServiceMetadataConverter.java
+++ b/smp-server-library/src/main/java/eu/europa/ec/cipa/smp/server/conversion/ServiceMetadataConverter.java
@@ -15,7 +15,10 @@
 
 package eu.europa.ec.cipa.smp.server.conversion;
 
+import eu.europa.ec.edelivery.smp.data.model.DBServiceMetadataId;
 import eu.europa.ec.edelivery.smp.exceptions.XmlParsingException;
+import org.oasis_open.docs.bdxr.ns.smp._2016._05.DocumentIdentifier;
+import org.oasis_open.docs.bdxr.ns.smp._2016._05.ParticipantIdentifierType;
 import org.oasis_open.docs.bdxr.ns.smp._2016._05.ServiceMetadata;
 import org.w3c.dom.Document;
 import org.w3c.dom.Node;
@@ -100,4 +103,10 @@ public class ServiceMetadataConverter {
         return dbf.newDocumentBuilder();
     }
 
+    public static DBServiceMetadataId toDbModel(ParticipantIdentifierType participantId, DocumentIdentifier docId){
+        return new DBServiceMetadataId(participantId.getScheme(),
+                participantId.getValue(),
+                docId.getScheme(),
+                docId.getValue());
+    }
 }
diff --git a/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/data/dao/BaseDao.java b/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/data/dao/BaseDao.java
new file mode 100644
index 0000000000000000000000000000000000000000..e0faa253d70df1f9890695832f9555a913945b53
--- /dev/null
+++ b/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/data/dao/BaseDao.java
@@ -0,0 +1,67 @@
+/*
+ * Copyright 2017 European Commission | CEF eDelivery
+ *
+ * Licensed under the EUPL, Version 1.1 or – as soon they will be approved by the European Commission - subsequent versions of the EUPL (the "Licence");
+ * You may not use this work except in compliance with the Licence.
+ *
+ * You may obtain a copy of the Licence at:
+ * https://joinup.ec.europa.eu/software/page/eupl
+ * or file: LICENCE-EUPL-v1.1.pdf
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under the Licence is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the Licence for the specific language governing permissions and limitations under the Licence.
+ */
+
+package eu.europa.ec.edelivery.smp.data.dao;
+
+import org.springframework.core.GenericTypeResolver;
+
+import javax.persistence.EntityExistsException;
+import javax.persistence.EntityManager;
+import javax.persistence.PersistenceContext;
+import java.io.Serializable;
+
+/**
+ * Created by gutowpa on 24/11/2017.
+ */
+public abstract class BaseDao<E extends Serializable> {
+
+    @PersistenceContext
+    protected EntityManager em;
+
+    private final Class<E> entityClass;
+
+    public BaseDao() {
+        entityClass = (Class<E>) GenericTypeResolver.resolveTypeArgument(getClass(), BaseDao.class);
+    }
+
+    public E find(Object primaryKey) {
+        return em.find(entityClass, primaryKey);
+    }
+
+    public void save(E entity) {
+        try {
+            em.persist(entity);
+        } catch(EntityExistsException e){
+            em.merge(entity);
+        }
+    }
+
+    public void remove(E entity) {
+        em.remove(entity);
+    }
+
+    /**
+     * Removes Entity by given primary key
+     *
+     * @return true if entity existed before and was removed in this call.
+     * False if entity did not exist, so nothing was changed
+     */
+    public boolean removeById(Object primaryKey) {
+        int removedRecords = em.createQuery("delete from " + entityClass.getName() + " e where e.id = :primaryKey")
+                .setParameter("primaryKey", primaryKey)
+                .executeUpdate();
+        return removedRecords > 0;
+    }
+}
diff --git a/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/data/dao/OwnershipDao.java b/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/data/dao/OwnershipDao.java
index d3478ac5548ae28a0085f5e2271301676fb66edd..2a4ac0b9adba90422c8e6a49d90b2f7a5b617ebb 100644
--- a/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/data/dao/OwnershipDao.java
+++ b/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/data/dao/OwnershipDao.java
@@ -16,29 +16,20 @@
 package eu.europa.ec.edelivery.smp.data.dao;
 
 import eu.europa.ec.edelivery.smp.data.model.DBOwnership;
-import eu.europa.ec.edelivery.smp.data.model.DBServiceGroupID;
+import eu.europa.ec.edelivery.smp.data.model.DBServiceGroupId;
 import org.springframework.stereotype.Repository;
 
-import javax.persistence.EntityManager;
-import javax.persistence.PersistenceContext;
-
 /**
  * Created by gutowpa on 14/11/2017.
  */
 @Repository
-public class OwnershipDao {
-
-    @PersistenceContext
-    EntityManager entityManager;
+public class OwnershipDao extends BaseDao<DBOwnership>{
 
-    public void removeByServiceGroupId(DBServiceGroupID serviceGroupID) {
-        entityManager.createQuery("DELETE FROM DBOwnership o WHERE o.id.businessIdentifierScheme = :scheme and o.id.businessIdentifier = :id")
+    public void removeByServiceGroupId(DBServiceGroupId serviceGroupID) {
+        em.createQuery("DELETE FROM DBOwnership o WHERE o.id.businessIdentifierScheme = :scheme and o.id.businessIdentifier = :id")
                 .setParameter("scheme", serviceGroupID.getBusinessIdentifierScheme())
                 .setParameter("id", serviceGroupID.getBusinessIdentifier())
                 .executeUpdate();
     }
 
-    public void save(DBOwnership ownership) {
-        entityManager.persist(ownership);
-    }
 }
diff --git a/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/data/dao/ServiceGroupDao.java b/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/data/dao/ServiceGroupDao.java
index ac66884976e43f3c1d5e49bbe7ce689c1ecdbb8f..36ab5d1cfdad1b45e82871c6ed4f4cf95a0bdd7b 100644
--- a/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/data/dao/ServiceGroupDao.java
+++ b/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/data/dao/ServiceGroupDao.java
@@ -16,33 +16,11 @@
 package eu.europa.ec.edelivery.smp.data.dao;
 
 import eu.europa.ec.edelivery.smp.data.model.DBServiceGroup;
-import eu.europa.ec.edelivery.smp.data.model.DBServiceGroupID;
 import org.springframework.stereotype.Repository;
 
-import javax.persistence.EntityManager;
-import javax.persistence.PersistenceContext;
-
 /**
  * Created by gutowpa on 14/11/2017.
  */
 @Repository
-public class ServiceGroupDao {
-
-    @PersistenceContext
-    EntityManager entityManager;
-
-    public DBServiceGroup find(String participantIdScheme,
-                               String participantIdValue) {
-
-        DBServiceGroupID dbServiceGroupId = new DBServiceGroupID(participantIdScheme, participantIdValue);
-        return entityManager.find(DBServiceGroup.class, dbServiceGroupId);
-    }
-
-    public void save(DBServiceGroup dbServiceGroup) {
-        entityManager.persist(dbServiceGroup);
-    }
-
-    public void remove(DBServiceGroup serviceGroup) {
-        entityManager.remove(serviceGroup);
-    }
+public class ServiceGroupDao extends BaseDao<DBServiceGroup> {
 }
diff --git a/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/data/dao/ServiceMetadataDao.java b/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/data/dao/ServiceMetadataDao.java
index 112d63e64a4a9e88e9d4f62a87a57526133e3ce7..d6a27dcb41b3aa0a2d198381afc864cf0545e966 100644
--- a/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/data/dao/ServiceMetadataDao.java
+++ b/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/data/dao/ServiceMetadataDao.java
@@ -16,66 +16,21 @@
 package eu.europa.ec.edelivery.smp.data.dao;
 
 import eu.europa.ec.edelivery.smp.data.model.DBServiceMetadata;
-import eu.europa.ec.edelivery.smp.data.model.DBServiceMetadataID;
+import eu.europa.ec.edelivery.smp.data.model.DBServiceMetadataId;
 import org.springframework.stereotype.Repository;
 
-import javax.persistence.EntityManager;
-import javax.persistence.PersistenceContext;
 import java.util.List;
 
 /**
  * Created by gutowpa on 14/11/2017.
  */
 @Repository
-public class ServiceMetadataDao {
+public class ServiceMetadataDao extends BaseDao<DBServiceMetadata> {
 
-    @PersistenceContext
-    EntityManager entityManager;
-
-    public DBServiceMetadata find(String participantIdScheme,
-                                  String participantIdValue,
-                                  String documentIdScheme,
-                                  String documentIdValue) {
-
-        DBServiceMetadataID serviceMetadataId = new DBServiceMetadataID(participantIdScheme,
-                participantIdValue,
-                documentIdScheme,
-                documentIdValue);
-
-        return entityManager.find(DBServiceMetadata.class, serviceMetadataId);
-    }
-
-    /**
-     * Removes ServiceMetadata
-     *
-     * @return true if entity existed before and was removed in this call.
-     * False if entity did not exist, so nothing was changed
-     */
-    public boolean remove(String participantIdScheme,
-                          String participantIdValue,
-                          String documentIdScheme,
-                          String documentIdValue) {
-
-        DBServiceMetadata serviceMetadata = find(participantIdScheme,
-                participantIdValue,
-                documentIdScheme,
-                documentIdValue);
-
-        if (serviceMetadata == null) {
-            return false;
-        }
-        entityManager.remove(serviceMetadata);
-        return true;
-    }
-
-    public void save(DBServiceMetadata serviceMetadata) {
-        entityManager.persist(serviceMetadata);
-    }
-
-    public List<DBServiceMetadataID> findIdsByServiceGroup(String participantIdScheme,
+    public List<DBServiceMetadataId> findIdsByServiceGroup(String participantIdScheme,
                                                            String participantIdValue) {
 
-        return entityManager.createQuery("SELECT p.id FROM DBServiceMetadata p WHERE p.id.businessIdentifierScheme = :scheme AND p.id.businessIdentifier = :value", DBServiceMetadataID.class)
+        return em.createQuery("SELECT p.id FROM DBServiceMetadata p WHERE p.id.businessIdentifierScheme = :scheme AND p.id.businessIdentifier = :value", DBServiceMetadataId.class)
                 .setParameter("scheme", participantIdScheme)
                 .setParameter("value", participantIdValue)
                 .getResultList();
diff --git a/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/data/dao/UserDao.java b/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/data/dao/UserDao.java
index c968a252be362d9b3949b9bd8cea4f494b085847..9ec88083b881be9be4c6755518cbdd896b67e513 100644
--- a/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/data/dao/UserDao.java
+++ b/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/data/dao/UserDao.java
@@ -18,20 +18,9 @@ package eu.europa.ec.edelivery.smp.data.dao;
 import eu.europa.ec.edelivery.smp.data.model.DBUser;
 import org.springframework.stereotype.Repository;
 
-import javax.persistence.EntityManager;
-import javax.persistence.PersistenceContext;
-
 /**
  * Created by gutowpa on 14/11/2017.
  */
 @Repository
-public class UserDao {
-
-    @PersistenceContext
-    EntityManager entityManager;
-
-    public DBUser find(String username) {
-        return entityManager.find(DBUser.class, username);
-    }
-
+public class UserDao extends BaseDao<DBUser> {
 }
diff --git a/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/data/model/DBOwnership.java b/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/data/model/DBOwnership.java
index 93a412d3da1a643f86ab90aedd2b554a17f8871e..b39a5dd20e87c3572ecc3409708c09c5ebd09401 100644
--- a/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/data/model/DBOwnership.java
+++ b/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/data/model/DBOwnership.java
@@ -22,20 +22,20 @@ import java.io.Serializable;
 @Table (name = "smp_ownership")
 public class DBOwnership implements Serializable {
 
-  private DBOwnershipID ownershipId;
+  private DBOwnershipId ownershipId;
   private DBUser user;
   private DBServiceGroup serviceGroup;
 
   public DBOwnership () {}
 
-  public DBOwnership (final DBOwnershipID ownershipId, final DBUser user, final DBServiceGroup serviceGroup) {
+  public DBOwnership (final DBOwnershipId ownershipId, final DBUser user, final DBServiceGroup serviceGroup) {
     this.ownershipId = ownershipId;
     this.user = user;
     this.serviceGroup = serviceGroup;
   }
 
   @EmbeddedId
-  public DBOwnershipID getId () {
+  public DBOwnershipId getId () {
     return ownershipId;
   }
 
@@ -60,7 +60,7 @@ public class DBOwnership implements Serializable {
     return serviceGroup;
   }
 
-  public void setId (final DBOwnershipID ownershipId) {
+  public void setId (final DBOwnershipId ownershipId) {
     this.ownershipId = ownershipId;
   }
 
diff --git a/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/data/model/DBOwnershipID.java b/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/data/model/DBOwnershipId.java
similarity index 93%
rename from smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/data/model/DBOwnershipID.java
rename to smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/data/model/DBOwnershipId.java
index 82603e78be495fca03876b5fb4000a2f99f88981..a6bc958ce389f63de7bc7e27c4e303b08907cc0f 100644
--- a/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/data/model/DBOwnershipID.java
+++ b/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/data/model/DBOwnershipId.java
@@ -25,17 +25,16 @@ import java.io.Serializable;
 @Embeddable
 @ToString
 @EqualsAndHashCode
-public class DBOwnershipID implements Serializable {
+public class DBOwnershipId implements Serializable {
 
     private String username;
     private String participantIdScheme;
     private String participantIdValue;
 
-    @Deprecated
-    public DBOwnershipID() {
+    public DBOwnershipId() {
     }
 
-    public DBOwnershipID(String userName, String participantIdScheme, String participantIdValue) {
+    public DBOwnershipId(String userName, String participantIdScheme, String participantIdValue) {
         username = userName;
         setBusinessIdentifierScheme(participantIdScheme);
         setBusinessIdentifier(participantIdValue);
diff --git a/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/data/model/DBServiceGroup.java b/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/data/model/DBServiceGroup.java
index b606f62d2597814cfff5b88344ed62d979a74a79..ea564e9f849b77cfecd917ac546b20f720fc52f9 100644
--- a/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/data/model/DBServiceGroup.java
+++ b/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/data/model/DBServiceGroup.java
@@ -24,7 +24,7 @@ import java.util.Set;
 @Table(name = "smp_service_group")
 public class DBServiceGroup implements Serializable {
 
-    private DBServiceGroupID serviceGroupId;
+    private DBServiceGroupId serviceGroupId;
     private String extension;
     private Set<DBOwnership> ownerships = new HashSet<>();
     private Set<DBServiceMetadata> serviceMetadatas = new HashSet<DBServiceMetadata>();
@@ -32,11 +32,11 @@ public class DBServiceGroup implements Serializable {
     public DBServiceGroup() {
     }
 
-    public DBServiceGroup(final DBServiceGroupID serviceGroupId) {
+    public DBServiceGroup(final DBServiceGroupId serviceGroupId) {
         this.serviceGroupId = serviceGroupId;
     }
 
-    public DBServiceGroup(final DBServiceGroupID serviceGroupId,
+    public DBServiceGroup(final DBServiceGroupId serviceGroupId,
                           final String extension,
                           final Set<DBOwnership> ownerships,
                           final Set<DBServiceMetadata> serviceMetadatas) {
@@ -48,7 +48,7 @@ public class DBServiceGroup implements Serializable {
     }
 
     @EmbeddedId
-    public DBServiceGroupID getId() {
+    public DBServiceGroupId getId() {
         return serviceGroupId;
     }
 
@@ -58,17 +58,17 @@ public class DBServiceGroup implements Serializable {
         return extension;
     }
 
-    @OneToMany(fetch = FetchType.LAZY, mappedBy = "serviceGroup", cascade = {CascadeType.ALL})
+    @OneToMany(fetch = FetchType.LAZY, mappedBy = "serviceGroup", cascade = CascadeType.ALL)
     public Set<DBOwnership> getOwnerships() {
         return ownerships;
     }
 
-    @OneToMany(fetch = FetchType.LAZY, mappedBy = "serviceGroup", cascade = {CascadeType.ALL})
+    @OneToMany(fetch = FetchType.LAZY, mappedBy = "serviceGroup", cascade = CascadeType.ALL)
     public Set<DBServiceMetadata> getServiceMetadatas() {
         return serviceMetadatas;
     }
 
-    public void setId(final DBServiceGroupID serviceGroupId) {
+    public void setId(final DBServiceGroupId serviceGroupId) {
         this.serviceGroupId = serviceGroupId;
     }
 
diff --git a/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/data/model/DBServiceGroupID.java b/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/data/model/DBServiceGroupId.java
similarity index 92%
rename from smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/data/model/DBServiceGroupID.java
rename to smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/data/model/DBServiceGroupId.java
index 51830f8bd799ff6fb432517f8e9f948c38b1a40f..1a1767d21504ba121ed446bc87c456d5bb5645a5 100644
--- a/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/data/model/DBServiceGroupID.java
+++ b/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/data/model/DBServiceGroupId.java
@@ -28,16 +28,15 @@ import static eu.europa.ec.edelivery.smp.data.model.CommonColumnsLengths.MAX_PAR
 @Embeddable
 @ToString
 @EqualsAndHashCode
-public class DBServiceGroupID implements Serializable {
+public class DBServiceGroupId implements Serializable {
 
     private String participantIdScheme;
     private String participantIdValue;
 
-    @Deprecated
-    public DBServiceGroupID() {
+    public DBServiceGroupId() {
     }
 
-    public DBServiceGroupID(String participantIdScheme,
+    public DBServiceGroupId(String participantIdScheme,
                             String participantIdValue) {
 
         setBusinessIdentifierScheme(participantIdScheme);
diff --git a/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/data/model/DBServiceMetadata.java b/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/data/model/DBServiceMetadata.java
index 2143a3a4599672d9daf9ed2cf9734ab29aa730f4..aa40efe49fbc9adde8d655e6af33df0b3752e709 100644
--- a/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/data/model/DBServiceMetadata.java
+++ b/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/data/model/DBServiceMetadata.java
@@ -22,17 +22,17 @@ import java.io.Serializable;
 @Table(name = "smp_service_metadata")
 public class DBServiceMetadata implements Serializable {
 
-    private DBServiceMetadataID serviceMetadataId;
+    private DBServiceMetadataId serviceMetadataId;
     private DBServiceGroup serviceGroup;
     private String xmlContent;
 
     public DBServiceMetadata() {  }
 
-    public DBServiceMetadata(DBServiceMetadataID serviceMetadataId, DBServiceGroup serviceGroup) {
+    public DBServiceMetadata(DBServiceMetadataId serviceMetadataId, DBServiceGroup serviceGroup) {
         this(serviceMetadataId, serviceGroup, null);
     }
 
-    public DBServiceMetadata(DBServiceMetadataID serviceMetadataId,
+    public DBServiceMetadata(DBServiceMetadataId serviceMetadataId,
                              DBServiceGroup serviceGroup,
                              String xmlContent) {
         this.serviceMetadataId = serviceMetadataId;
@@ -41,7 +41,7 @@ public class DBServiceMetadata implements Serializable {
     }
 
     @EmbeddedId
-    public DBServiceMetadataID getId() {
+    public DBServiceMetadataId getId() {
         return serviceMetadataId;
     }
 
@@ -66,7 +66,7 @@ public class DBServiceMetadata implements Serializable {
         return xmlContent;
     }
 
-    public void setId(final DBServiceMetadataID serviceMetadataId) {
+    public void setId(final DBServiceMetadataId serviceMetadataId) {
         this.serviceMetadataId = serviceMetadataId;
     }
 
diff --git a/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/data/model/DBServiceMetadataID.java b/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/data/model/DBServiceMetadataId.java
similarity index 95%
rename from smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/data/model/DBServiceMetadataID.java
rename to smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/data/model/DBServiceMetadataId.java
index 22627554adbd20fd50910a1b5ecaa0eb75006601..83be66e289d72ade3299969257287417fd033b6a 100644
--- a/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/data/model/DBServiceMetadataID.java
+++ b/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/data/model/DBServiceMetadataId.java
@@ -26,7 +26,7 @@ import static eu.europa.ec.edelivery.smp.data.model.CommonColumnsLengths.*;
 @Embeddable
 @ToString
 @EqualsAndHashCode
-public class DBServiceMetadataID implements Serializable {
+public class DBServiceMetadataId implements Serializable {
 
     private String participantIdScheme;
     private String participantIdValue;
@@ -35,10 +35,10 @@ public class DBServiceMetadataID implements Serializable {
     private String documentIdValue;
 
     @Deprecated
-    public DBServiceMetadataID() {
+    public DBServiceMetadataId() {
     }
 
-    public DBServiceMetadataID(String participantIdScheme,
+    public DBServiceMetadataId(String participantIdScheme,
                                String participantIdValue,
                                String documentIdScheme,
                                String documentIdValue) {
diff --git a/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/services/ServiceGroupService.java b/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/services/ServiceGroupService.java
index efc28a290c901b9db0705ed6dfc539bb7993587e..6ad61bf294a9f75fd1af9034f0ea3cc89673c8f9 100644
--- a/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/services/ServiceGroupService.java
+++ b/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/services/ServiceGroupService.java
@@ -32,7 +32,14 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
+import java.lang.reflect.Array;
+import java.util.Arrays;
+import java.util.HashSet;
+import java.util.Set;
+
+import static eu.europa.ec.cipa.smp.server.conversion.ServiceGroupConverter.toDbModel;
 import static eu.europa.ec.smp.api.Identifiers.asString;
+import static java.util.Arrays.asList;
 
 /**
  * Created by gutowpa on 14/11/2017.
@@ -48,9 +55,6 @@ public class ServiceGroupService {
     @Autowired
     private ServiceGroupDao serviceGroupDao;
 
-    @Autowired
-    private OwnershipDao ownershipDao;
-
     @Autowired
     private UserDao userDao;
 
@@ -60,7 +64,7 @@ public class ServiceGroupService {
     public ServiceGroup getServiceGroup(ParticipantIdentifierType serviceGroupId) {
         ParticipantIdentifierType normalizedServiceGroupId = caseSensitivityNormalizer.normalize(serviceGroupId);
 
-        DBServiceGroup dbServiceGroup = serviceGroupDao.find(normalizedServiceGroupId.getScheme(), normalizedServiceGroupId.getValue());
+        DBServiceGroup dbServiceGroup = serviceGroupDao.find(toDbModel(normalizedServiceGroupId));
         if (dbServiceGroup == null) {
             throw new NotFoundException("ServiceGroup not found: '%s'", asString(serviceGroupId));
         }
@@ -77,7 +81,7 @@ public class ServiceGroupService {
             throw new UnknownUserException(newOwnerName);
         }
 
-        DBServiceGroup dbServiceGroup = serviceGroupDao.find(normalizedParticipantId.getScheme(), normalizedParticipantId.getValue());
+        DBServiceGroup dbServiceGroup = serviceGroupDao.find(toDbModel(normalizedParticipantId));
 
         String extensions = ServiceGroupConverter.extractExtensionsPayload(normalizedServiceGroup);
 
@@ -90,14 +94,15 @@ public class ServiceGroupService {
             m_aHook.create(normalizedParticipantId);
 
             //Save ServiceGroup
-            dbServiceGroup = new DBServiceGroup(new DBServiceGroupID(normalizedParticipantId.getScheme(), normalizedParticipantId.getValue()));
+            dbServiceGroup = new DBServiceGroup(new DBServiceGroupId(normalizedParticipantId.getScheme(), normalizedParticipantId.getValue()));
             dbServiceGroup.setExtension(extensions);
-            serviceGroupDao.save(dbServiceGroup);
 
             // Save the ownership information
-            final DBOwnershipID ownershipID = new DBOwnershipID(newOwnerName, normalizedParticipantId.getScheme(), normalizedParticipantId.getValue());
-            final DBOwnership ownership = new DBOwnership(ownershipID, newOwner, dbServiceGroup);
-            ownershipDao.save(ownership);
+            DBOwnershipId dbOwnershipID = new DBOwnershipId(newOwnerName, normalizedParticipantId.getScheme(), normalizedParticipantId.getValue());
+            DBOwnership dbOwnership = new DBOwnership(dbOwnershipID, newOwner, dbServiceGroup);
+            dbServiceGroup.setOwnerships(new HashSet(asList(dbOwnership)));
+            //ownershipDao.save(ownership);
+            serviceGroupDao.save(dbServiceGroup);
             return true;
         }
     }
@@ -115,12 +120,12 @@ public class ServiceGroupService {
     public void deleteServiceGroup(ParticipantIdentifierType serviceGroupId) {
         final ParticipantIdentifierType normalizedServiceGroupId = caseSensitivityNormalizer.normalize(serviceGroupId);
 
-        DBServiceGroup dbServiceGroup = serviceGroupDao.find(normalizedServiceGroupId.getScheme(), normalizedServiceGroupId.getValue());
+        DBServiceGroup dbServiceGroup = serviceGroupDao.find(toDbModel(normalizedServiceGroupId));
         if (dbServiceGroup == null) {
             throw new NotFoundException("ServiceGroup not found: '%s'", asString(serviceGroupId));
         }
 
-        ownershipDao.removeByServiceGroupId(dbServiceGroup.getId());
+        //ownershipDao.removeByServiceGroupId(dbServiceGroup.getId());
         serviceGroupDao.remove(dbServiceGroup);
 
         m_aHook.delete(normalizedServiceGroupId);
diff --git a/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/services/ServiceMetadataService.java b/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/services/ServiceMetadataService.java
index 88eacd84a0d2e9ad924fd982378c021c447eebc9..971a7b811e09004c25fa23b9444dce9e31b293bc 100644
--- a/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/services/ServiceMetadataService.java
+++ b/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/services/ServiceMetadataService.java
@@ -16,19 +16,16 @@
 package eu.europa.ec.edelivery.smp.services;
 
 import eu.europa.ec.cipa.smp.server.conversion.CaseSensitivityNormalizer;
-import eu.europa.ec.cipa.smp.server.conversion.ServiceMetadataConverter;
+import eu.europa.ec.cipa.smp.server.conversion.ServiceGroupConverter;
 import eu.europa.ec.cipa.smp.server.util.SignatureFilter;
 import eu.europa.ec.edelivery.smp.data.dao.ServiceGroupDao;
 import eu.europa.ec.edelivery.smp.data.dao.ServiceMetadataDao;
 import eu.europa.ec.edelivery.smp.data.model.DBServiceGroup;
 import eu.europa.ec.edelivery.smp.data.model.DBServiceMetadata;
-import eu.europa.ec.edelivery.smp.data.model.DBServiceMetadataID;
+import eu.europa.ec.edelivery.smp.data.model.DBServiceMetadataId;
 import eu.europa.ec.edelivery.smp.exceptions.NotFoundException;
 import org.oasis_open.docs.bdxr.ns.smp._2016._05.DocumentIdentifier;
 import org.oasis_open.docs.bdxr.ns.smp._2016._05.ParticipantIdentifierType;
-import org.oasis_open.docs.bdxr.ns.smp._2016._05.ServiceGroup;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
@@ -37,6 +34,8 @@ import org.w3c.dom.Document;
 import java.util.ArrayList;
 import java.util.List;
 
+import static eu.europa.ec.cipa.smp.server.conversion.ServiceMetadataConverter.toDbModel;
+import static eu.europa.ec.cipa.smp.server.conversion.ServiceMetadataConverter.toSignedServiceMetadatadaDocument;
 import static eu.europa.ec.smp.api.Identifiers.asString;
 
 /**
@@ -61,17 +60,13 @@ public class ServiceMetadataService {
         ParticipantIdentifierType normalizedServiceGroupId = caseSensitivityNormalizer.normalize(serviceGroupId);
         DocumentIdentifier normalizedDocId = caseSensitivityNormalizer.normalize(documentId);
 
-        DBServiceMetadata serviceMetadata = serviceMetadataDao.find(
-                normalizedServiceGroupId.getScheme(),
-                normalizedServiceGroupId.getValue(),
-                normalizedDocId.getScheme(),
-                normalizedDocId.getValue());
+        DBServiceMetadata serviceMetadata = serviceMetadataDao.find(toDbModel(normalizedServiceGroupId, normalizedDocId));
 
         if (serviceMetadata == null || serviceMetadata.getXmlContent() == null) {
             throw new NotFoundException("ServiceMetadata not found, ServiceGroupID: '%s', DocumentID: '%s'", asString(serviceGroupId), asString(documentId));
         }
 
-        Document aSignedServiceMetadata = ServiceMetadataConverter.toSignedServiceMetadatadaDocument(serviceMetadata.getXmlContent());
+        Document aSignedServiceMetadata = toSignedServiceMetadatadaDocument(serviceMetadata.getXmlContent());
         signatureFilter.sign(aSignedServiceMetadata);
         return aSignedServiceMetadata;
     }
@@ -86,26 +81,19 @@ public class ServiceMetadataService {
         ParticipantIdentifierType normalizedServiceGroupId = caseSensitivityNormalizer.normalize(serviceGroupId);
         DocumentIdentifier normalizedDocId = caseSensitivityNormalizer.normalize(documentId);
 
-        DBServiceGroup serviceGroup = serviceGroupDao.find(normalizedServiceGroupId.getScheme(), normalizedServiceGroupId.getValue());
+        DBServiceGroup serviceGroup = serviceGroupDao.find(ServiceGroupConverter.toDbModel(normalizedServiceGroupId));
         if (serviceGroup == null) {
             throw new NotFoundException("ServiceGroup not found: '%s'", asString(serviceGroupId));
         }
 
-        boolean alreadyExisted = serviceMetadataDao.remove(
-                normalizedServiceGroupId.getScheme(),
-                normalizedServiceGroupId.getValue(),
-                normalizedDocId.getScheme(),
-                normalizedDocId.getValue());
+        DBServiceMetadataId dbServiceMetadataId = toDbModel(normalizedServiceGroupId, normalizedDocId);
+        boolean alreadyExisted = serviceMetadataDao.removeById(dbServiceMetadataId);
 
-        DBServiceMetadata serviceMetadata = new DBServiceMetadata();
-        serviceMetadata.setId(new DBServiceMetadataID(
-                normalizedServiceGroupId.getScheme(),
-                normalizedServiceGroupId.getValue(),
-                normalizedDocId.getScheme(),
-                normalizedDocId.getValue()));
+        DBServiceMetadata dbServiceMetadata = new DBServiceMetadata();
+        dbServiceMetadata.setId(dbServiceMetadataId);
 
-        serviceMetadata.setXmlContent(xmlContent);
-        serviceMetadataDao.save(serviceMetadata);
+        dbServiceMetadata.setXmlContent(xmlContent);
+        serviceMetadataDao.save(dbServiceMetadata);
         return !alreadyExisted;
     }
 
@@ -114,11 +102,8 @@ public class ServiceMetadataService {
         ParticipantIdentifierType normalizedServiceGroupId = caseSensitivityNormalizer.normalize(serviceGroupId);
         DocumentIdentifier normalizedDocId = caseSensitivityNormalizer.normalize(documentId);
 
-        boolean serviceMetadataRemoved = serviceMetadataDao.remove(
-                normalizedServiceGroupId.getScheme(),
-                normalizedServiceGroupId.getValue(),
-                normalizedDocId.getScheme(),
-                normalizedDocId.getValue());
+        DBServiceMetadataId dbServiceMetadataId = toDbModel(normalizedServiceGroupId, normalizedDocId);
+        boolean serviceMetadataRemoved = serviceMetadataDao.removeById(dbServiceMetadataId);
 
         if (!serviceMetadataRemoved) {
             throw new NotFoundException("ServiceGroup not found: '%s'", asString(serviceGroupId));
@@ -127,12 +112,12 @@ public class ServiceMetadataService {
 
     public List<DocumentIdentifier> findServiceMetadataIdentifiers(ParticipantIdentifierType participantId) {
         ParticipantIdentifierType normalizedServiceGroupId = caseSensitivityNormalizer.normalize(participantId);
-        List<DBServiceMetadataID> metadataIds = serviceMetadataDao.findIdsByServiceGroup(
+        List<DBServiceMetadataId> metadataIds = serviceMetadataDao.findIdsByServiceGroup(
                 normalizedServiceGroupId.getScheme(),
                 normalizedServiceGroupId.getValue());
 
         List<DocumentIdentifier> documentIds = new ArrayList();
-        for (DBServiceMetadataID metadataId : metadataIds) {
+        for (DBServiceMetadataId metadataId : metadataIds) {
             DocumentIdentifier documentIdentifier = new DocumentIdentifier(metadataId.getDocumentIdentifier(), metadataId.getDocumentIdentifierScheme());
             documentIds.add(documentIdentifier);
         }
diff --git a/smp-server-library/src/test/java/eu/europa/ec/edelivery/smp/services/ServiceGroupServiceIntegrationTest.java b/smp-server-library/src/test/java/eu/europa/ec/edelivery/smp/services/ServiceGroupServiceIntegrationTest.java
index 4445ab42738d2e2aa9a8f1c3ecf160627cc240e7..baea2f99b7508a1777620394772e82325fb5b31e 100644
--- a/smp-server-library/src/test/java/eu/europa/ec/edelivery/smp/services/ServiceGroupServiceIntegrationTest.java
+++ b/smp-server-library/src/test/java/eu/europa/ec/edelivery/smp/services/ServiceGroupServiceIntegrationTest.java
@@ -15,6 +15,11 @@
 
 package eu.europa.ec.edelivery.smp.services;
 
+import eu.europa.ec.edelivery.smp.data.dao.OwnershipDao;
+import eu.europa.ec.edelivery.smp.data.dao.ServiceGroupDao;
+import eu.europa.ec.edelivery.smp.data.model.DBOwnership;
+import eu.europa.ec.edelivery.smp.data.model.DBOwnershipId;
+import eu.europa.ec.edelivery.smp.data.model.DBServiceGroup;
 import eu.europa.ec.edelivery.smp.exceptions.NotFoundException;
 import eu.europa.ec.edelivery.smp.config.SmpServicesTestConfig;
 import org.junit.Test;
@@ -30,10 +35,14 @@ import org.springframework.test.context.jdbc.Sql;
 import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
 import org.springframework.transaction.annotation.Transactional;
 
+import javax.persistence.EntityManager;
+import javax.persistence.PersistenceContext;
 import javax.xml.bind.JAXBException;
 import java.io.IOException;
+import java.security.acl.Owner;
 import java.util.List;
 
+import static eu.europa.ec.cipa.smp.server.conversion.ServiceGroupConverter.toDbModel;
 import static eu.europa.ec.cipa.smp.server.conversion.ServiceGroupConverter.unmarshal;
 import static eu.europa.ec.cipa.smp.server.util.XmlTestUtils.loadDocumentAsString;
 import static eu.europa.ec.cipa.smp.server.util.XmlTestUtils.marshall;
@@ -51,12 +60,29 @@ import static org.junit.Assert.*;
 public class ServiceGroupServiceIntegrationTest {
 
     private static final String SERVICE_GROUP_XML_PATH = "/eu/europa/ec/edelivery/smp/services/ServiceGroupPoland.xml";
-    private static final ParticipantIdentifierType SERVICE_GROUP_ID = asParticipantId("participant-scheme-qns::urn:Poland:ncpb");
+    private static final ParticipantIdentifierType SERVICE_GROUP_ID = asParticipantId("participant-scheme-qns::urn:poland:ncpb");
     public static final String ADMIN_USERNAME = "test_admin";
 
+    @PersistenceContext
+    EntityManager em;
+
+    @Autowired
+    ServiceGroupDao serviceGroupDao;
+
+    @Autowired
+    OwnershipDao ownershipDao;
+
     @Autowired
     private ServiceGroupService serviceGroupService;
 
+    @Test
+    public void makeSureServiceGroupDoesNotExistAlready(){
+        DBServiceGroup dbServiceGroup = serviceGroupDao.find(toDbModel(SERVICE_GROUP_ID));
+        if(dbServiceGroup != null){
+            throw new IllegalStateException("Underlying DB already contains test data that should not be there. Remove them manually.");
+        }
+    }
+
     @Test
     public void saveAndReadPositiveScenario() throws IOException, JAXBException {
         //when
@@ -66,6 +92,10 @@ public class ServiceGroupServiceIntegrationTest {
         //then
         assertFalse(inServiceGroup == outServiceGroup);
         assertEquals(marshall(inServiceGroup), marshall(outServiceGroup));
+
+        em.flush();
+        DBOwnership outOwnership = ownershipDao.find(new DBOwnershipId(ADMIN_USERNAME, SERVICE_GROUP_ID.getScheme(), SERVICE_GROUP_ID.getValue()));
+        assertEquals(ADMIN_USERNAME, outOwnership.getUser().getUsername());
     }
 
     @Test(expected = NotFoundException.class)
@@ -77,9 +107,11 @@ public class ServiceGroupServiceIntegrationTest {
     public void saveAndDeletePositiveScenario() throws IOException {
         //given
         saveServiceGroup();
+        em.flush();
 
         //when
         serviceGroupService.deleteServiceGroup(SERVICE_GROUP_ID);
+        em.flush();
 
         //then
         try {
diff --git a/smp-server-library/src/test/java/eu/europa/ec/edelivery/smp/services/ServiceMetadataIntegrationTest.java b/smp-server-library/src/test/java/eu/europa/ec/edelivery/smp/services/ServiceMetadataIntegrationTest.java
index 97118d37fa656f3a08a154ebd537613f74ae1ec8..2243f2b03454b434ec63aba1ab064f9f379238f3 100644
--- a/smp-server-library/src/test/java/eu/europa/ec/edelivery/smp/services/ServiceMetadataIntegrationTest.java
+++ b/smp-server-library/src/test/java/eu/europa/ec/edelivery/smp/services/ServiceMetadataIntegrationTest.java
@@ -17,6 +17,9 @@ package eu.europa.ec.edelivery.smp.services;
 
 import eu.europa.ec.cipa.smp.server.conversion.ServiceGroupConverter;
 import eu.europa.ec.cipa.smp.server.conversion.ServiceMetadataConverter;
+import eu.europa.ec.edelivery.smp.data.dao.ServiceMetadataDao;
+import eu.europa.ec.edelivery.smp.data.model.DBServiceGroup;
+import eu.europa.ec.edelivery.smp.data.model.DBServiceMetadata;
 import eu.europa.ec.edelivery.smp.exceptions.NotFoundException;
 import eu.europa.ec.edelivery.smp.config.SmpServicesTestConfig;
 import org.junit.Before;
@@ -31,11 +34,15 @@ import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
 import org.springframework.transaction.annotation.Transactional;
 import org.w3c.dom.Document;
 
+import javax.persistence.EntityManager;
+import javax.persistence.EntityNotFoundException;
+import javax.persistence.PersistenceContext;
 import javax.xml.bind.JAXBException;
 import javax.xml.transform.TransformerException;
 import java.io.IOException;
 import java.util.List;
 
+import static eu.europa.ec.cipa.smp.server.conversion.ServiceGroupConverter.toDbModel;
 import static eu.europa.ec.cipa.smp.server.conversion.ServiceMetadataConverter.unmarshal;
 import static eu.europa.ec.cipa.smp.server.util.XmlTestUtils.loadDocumentAsString;
 import static eu.europa.ec.cipa.smp.server.util.XmlTestUtils.marshall;
@@ -66,12 +73,26 @@ public class ServiceMetadataIntegrationTest {
     @Autowired
     ServiceGroupService serviceGroupService;
 
+    @PersistenceContext
+    EntityManager em;
+
+    @Autowired
+    private ServiceMetadataDao serviceMetadataDao;
+
     @Before
     public void before() throws IOException {
         ServiceGroup inServiceGroup = ServiceGroupConverter.unmarshal(loadDocumentAsString(SERVICE_GROUP_XML_PATH));
         serviceGroupService.saveServiceGroup(inServiceGroup, ADMIN_USERNAME);
     }
 
+    @Test
+    public void makeSureServiceMetadataDoesNotExistAlready(){
+        DBServiceMetadata dbServiceMetadata = serviceMetadataDao.find(ServiceMetadataConverter.toDbModel(SERVICE_GROUP_ID, DOC_ID));
+        if(dbServiceMetadata != null){
+            throw new IllegalStateException("Underlying DB already contains test data that should not be there. Remove them manually.");
+        }
+    }
+
     @Test
     public void saveAndReadPositiveScenario() throws IOException, TransformerException, JAXBException {
         //given
@@ -96,6 +117,11 @@ public class ServiceMetadataIntegrationTest {
         serviceMetadataService.getServiceMetadataDocument(SERVICE_GROUP_ID, DOC_ID);
     }
 
+    @Test(expected = NotFoundException.class)
+    public void notFoundExceptionThrownWhenDeletingNotExisting() {
+        serviceMetadataService.deleteServiceMetadata(SERVICE_GROUP_ID, DOC_ID);
+    }
+
     @Test
     public void saveAndDeletePositiveScenario() throws IOException {
         //given
@@ -103,6 +129,8 @@ public class ServiceMetadataIntegrationTest {
         serviceMetadataService.saveServiceMetadata(SERVICE_GROUP_ID, DOC_ID, inServiceMetadataXml);
         List<DocumentIdentifier> docIdsBefore = serviceMetadataService.findServiceMetadataIdentifiers(SERVICE_GROUP_ID);
         assertEquals(1, docIdsBefore.size());
+        DBServiceMetadata dbServiceMetadata = serviceMetadataDao.find(ServiceMetadataConverter.toDbModel(SERVICE_GROUP_ID, DOC_ID));
+        assertNotNull(dbServiceMetadata);
 
         //when
         serviceMetadataService.deleteServiceMetadata(SERVICE_GROUP_ID, DOC_ID);
@@ -110,6 +138,13 @@ public class ServiceMetadataIntegrationTest {
         //then
         List<DocumentIdentifier> docIdsAfter = serviceMetadataService.findServiceMetadataIdentifiers(SERVICE_GROUP_ID);
         assertEquals(0, docIdsAfter.size());
+        try {
+            em.refresh(dbServiceMetadata);
+        }catch (EntityNotFoundException e){
+            // expected and needed - Hibernate's changes made on the same entity
+            // by persist() and Queries were not aware of each other
+        }
+
         try {
             serviceMetadataService.getServiceMetadataDocument(SERVICE_GROUP_ID, DOC_ID);
         } catch (NotFoundException e) {