diff --git a/smp-angular/src/app/domain/domain-controller.ts b/smp-angular/src/app/domain/domain-controller.ts
index b075c22ae66a5f494b755ea4033b713bc29e8a92..eeec35f1ccf5d6264a4d5800aad621fdb9038f68 100644
--- a/smp-angular/src/app/domain/domain-controller.ts
+++ b/smp-angular/src/app/domain/domain-controller.ts
@@ -69,8 +69,9 @@ export class DomainController implements SearchTableController {
   }
 
   isRecordChanged(oldModel, newModel): boolean {
-    for (var property in oldModel) {
-      const isEqual = this.isEqual(newModel[property],oldModel[property]);
+    for (let property in oldModel) {
+      let isEqual = this.isEqual(newModel[property],oldModel[property]);
+      //console.log("Property: "+property+" new: " +newModel[property] +  "old: " +oldModel[property] + " val: " + isEqual  );
       if (!isEqual) {
         return true; // Property has changed
       }
diff --git a/smp-angular/src/app/service-group-edit/service-group-details-dialog/service-group-details-dialog.component.ts b/smp-angular/src/app/service-group-edit/service-group-details-dialog/service-group-details-dialog.component.ts
index 8d2ea3a15d49ce6b3a4ad7406da253b0aa61e539..36c01b33c58791adec59630d11d387cb3f20c8e2 100644
--- a/smp-angular/src/app/service-group-edit/service-group-details-dialog/service-group-details-dialog.component.ts
+++ b/smp-angular/src/app/service-group-edit/service-group-details-dialog/service-group-details-dialog.component.ts
@@ -78,6 +78,8 @@ export class ServiceGroupDetailsDialogComponent implements OnInit {
     this.current = this.editMode
       ? {
         ...this.data.row,
+        // copy serviceGroupDomain array
+        serviceGroupDomains: [...this.data.row.serviceGroupDomains]
       }
       : {
         id: null,
@@ -322,16 +324,19 @@ export class ServiceGroupDetailsDialogComponent implements OnInit {
     // if deselected warn  serviceMetadata will be deleted
     let domainCode = event.option.value.domainCode;
     if (!event.option.selected) {
-      this.dialog.open(ConfirmationDialogComponent, {
-        data: {
-          title: "Registered serviceMetadata on domain!",
-          description: "Unregistration of domain will also delete it's serviceMetadata. Do you want to continue?"
-        }
-      }).afterClosed().subscribe(result => {
-        if (!result) {
-          event.option.selected = true;
-        }
-      })
+      let smdCount = this.getServiceMetadataCountOnDomain(domainCode);
+      if (smdCount >0) {
+        this.dialog.open(ConfirmationDialogComponent, {
+          data: {
+            title: "Registered serviceMetadata on domain!",
+            description: "Unregistering service group from domain will also delete its serviceMetadata (count: "+smdCount+") from the domain! Do you want to continue?"
+          }
+        }).afterClosed().subscribe(result => {
+          if (!result) {
+            event.option.selected = true;
+          }
+        })
+      }
 
 
     }
diff --git a/smp-angular/src/app/service-group-edit/service-group-edit-controller.ts b/smp-angular/src/app/service-group-edit/service-group-edit-controller.ts
index ea32ce23d58b4b59a7ef11c1e1bbb4443c9b3c60..decd0564095980379e0e7025980cf98346234901 100644
--- a/smp-angular/src/app/service-group-edit/service-group-edit-controller.ts
+++ b/smp-angular/src/app/service-group-edit/service-group-edit-controller.ts
@@ -97,17 +97,42 @@ export class ServiceGroupEditController implements SearchTableController {
     // check if other properties were changed
     let propSize = this.compareSGProperties.length;
     for (let i = 0; i < propSize; i++) {
-
       let property =  this.compareSGProperties[i];
-      const isEqual = this.isEqual(newModel[property], oldModel[property]);
+      let isEqual = false;
+
+      if (property ==='users'
+        || property ==='serviceGroupDomains') {
+        isEqual = this.isEqualListByAttribute(newModel[property], oldModel[property], "id");
+      }else {
+        isEqual = this.isEqual(newModel[property], oldModel[property]);
+      }
+      console.log("Property: "+property+" new: " +newModel[property] +  "old: " +oldModel[property] + " val: " + isEqual  );
       if (!isEqual) {
-        console.log("property: "+property+" changed!");
         return true; // Property has changed
       }
     }
     return false;
   }
 
+  isEqualListByAttribute(array1, array2, compareByAttribute): boolean {
+    let result1 = array1.filter(function(o1){
+      // filter out (!) items in result2
+      return !array2.some(function(o2){
+        return o1[compareByAttribute] === o2[compareByAttribute]; //  unique id
+      });
+    });
+
+    let result2 = array2.filter(function(o1){
+      // filter out (!) items in result2
+      return !array1.some(function(o2){
+        return o1[compareByAttribute] === o2[compareByAttribute]; //  unique id
+      });
+    });
+
+    return (!result1 || result1.length === 0) && (!result2 || result2.length === 0);
+
+  }
+
   isEqual(val1, val2): boolean {
     return (this.isEmpty(val1) && this.isEmpty(val2)
       || val1 === val2);
diff --git a/smp-angular/src/app/service-group-edit/service-group-edit.component.ts b/smp-angular/src/app/service-group-edit/service-group-edit.component.ts
index 9be8017fdccac9d9585495c09d457f75d2bbfefe..0b07f4c124fd567a77177864c86d213489c23982 100644
--- a/smp-angular/src/app/service-group-edit/service-group-edit.component.ts
+++ b/smp-angular/src/app/service-group-edit/service-group-edit.component.ts
@@ -132,8 +132,9 @@ export class ServiceGroupEditComponent implements OnInit {
     formRef.afterClosed().subscribe(result => {
       if (result) {
 
-        let isXMLChanged=formRef.componentInstance.isMetaDataXMLChanged();
-        if (!isXMLChanged){
+        // method isServiceMetaDataChanged must be called before getCurrent!
+        let isChanged=formRef.componentInstance.isServiceMetaDataChanged();
+        if (!isChanged ){
           // nothing to save
           return;
         }
@@ -182,15 +183,7 @@ export class ServiceGroupEditComponent implements OnInit {
     }
   }
 
-  isRecordChanged (oldModel, newModel): boolean {
-    for (var property in oldModel) {
-      var changed = false;
-      if (newModel[property] !== oldModel[property]) {
-        return true; // Property has changed
-      }
-    }
-    return false;
-  }
+
 
   // for dirty guard...
   isDirty (): boolean {
diff --git a/smp-angular/src/app/service-group-edit/service-group-metadata-dialog/service-group-metadata-dialog.component.ts b/smp-angular/src/app/service-group-edit/service-group-metadata-dialog/service-group-metadata-dialog.component.ts
index 3717028f6924b52192123ea67cb49f30e8754372..bbe5227e7ddc394d03d56a5437c66a31fdaf9540 100644
--- a/smp-angular/src/app/service-group-edit/service-group-metadata-dialog/service-group-metadata-dialog.component.ts
+++ b/smp-angular/src/app/service-group-edit/service-group-metadata-dialog/service-group-metadata-dialog.component.ts
@@ -260,11 +260,24 @@ export class ServiceGroupMetadataDialogComponent implements OnInit {
     return this.current;
   }
 
+  //!! this two method must be called before getCurrent
   public isMetaDataXMLChanged():boolean{
      return  this.dialogForm.value['xmlContent'] !== this.current.xmlContent;
   }
+  public isServiceMetaDataChanged():boolean{
+    return  this.isMetaDataXMLChanged() || !this.isEqual(this.current.domainCode, this.domainList.selected.value.domainCode) ;
+  }
 
   compareDomainCode(sgDomain: ServiceGroupDomainEditRo, domainCode: String): boolean {
     return sgDomain.domainCode === domainCode;
   }
+
+  isEqual(val1, val2): boolean {
+    return (this.isEmpty(val1) && this.isEmpty(val2)
+      || val1 === val2);
+  }
+
+  isEmpty(str): boolean {
+    return (!str || 0 === str.length);
+  }
 }
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 6480a32bd6e8b52644ca8adb2427dc58d83fc73f..4e51b515bdd4202e204d2e342c0f7493a6e49060 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
@@ -123,9 +123,13 @@ public class DBServiceMetadata extends BaseEntity {
             }
         }
         else {
-            smdx.setServiceMetadata(this);
+            if (this.serviceMetadataXml == null) {
+                this.serviceMetadataXml = new DBServiceMetadataXml();
+                this.serviceMetadataXml.setServiceMetadata(this);
+            }
+            this.serviceMetadataXml.setXmlContent(smdx.getXmlContent());
+
         }
-        this.serviceMetadataXml = smdx;
     }
 
     @Transient
diff --git a/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/services/ui/UIServiceGroupService.java b/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/services/ui/UIServiceGroupService.java
index fb70c5a399ead405d33bf1bc57ebc50266e54272..55bc88c03851ff50aa2e46a0f418fb6df3c7492b 100644
--- a/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/services/ui/UIServiceGroupService.java
+++ b/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/services/ui/UIServiceGroupService.java
@@ -352,23 +352,41 @@ public class UIServiceGroupService extends UIServiceBase<DBServiceGroup, Service
                 if (optionalDbServiceGroupDomain.isPresent()) {
 
                     DBServiceGroupDomain dbServiceGroupDomain = optionalDbServiceGroupDomain.get();
+                    DBServiceMetadata dbServiceMetadata = dbServiceGroupDomain.getServiceMetadata(serviceMetadataRO.getDocumentIdentifier(),
+                            serviceMetadataRO.getDocumentIdentifierScheme());
                     if (serviceMetadataRO.getXmlContentStatus() == EntityROStatus.UPDATED.getStatusNumber()) {
                         // get service metadata
                         byte[] buff = validateServiceMetadata(serviceMetadataRO);
 
-                        DBServiceMetadata dbServiceMetadata = dbServiceGroupDomain.getServiceMetadata(serviceMetadataRO.getDocumentIdentifier(),
-                                serviceMetadataRO.getDocumentIdentifierScheme());
+
                         dbServiceMetadata.setXmlContent(buff);
                     }
 
                     if (!Objects.equals(serviceMetadataRO.getDomainCode(), dbServiceGroupDomain.getDomain().getDomainCode())) {
-                        // remove from old doman
+                        // remove from old domain
+                        LOG.info("Move service metadata from domain {} to domain: {}" , dbServiceGroupDomain.getDomain().getDomainCode(),
+                                serviceMetadataRO.getDomainCode( ));
+
                         DBServiceMetadata smd = dbServiceGroupDomain.removeServiceMetadata(serviceMetadataRO.getDocumentIdentifier(),
                                 serviceMetadataRO.getDocumentIdentifierScheme());
+
+
+
                         // find new domain and add
                         Optional<DBServiceGroupDomain> optNewDomain = dbServiceGroup.getServiceGroupForDomain(serviceMetadataRO.getDomainCode());
                         if (optNewDomain.isPresent()) {
-                            optNewDomain.get().addServiceMetadata(smd);
+                            LOG.info("ADD service metadata to domain {} " , optNewDomain.get().getDomain().getDomainCode(),
+                                    serviceMetadataRO.getDomainCode( ));
+                                // create new because the old service metadata will be deleted
+                                DBServiceMetadata smdNew = new DBServiceMetadata();
+                                smdNew.setDocumentIdentifier(dbServiceMetadata.getDocumentIdentifier());
+                                smdNew.setDocumentIdentifierScheme(dbServiceMetadata.getDocumentIdentifierScheme());
+                                smdNew.setServiceGroupDomain(optNewDomain.get());
+                                smdNew.setServiceMetadataXml(dbServiceMetadata.getServiceMetadataXml());
+                                smdNew.setCreatedOn(dbServiceMetadata.getCreatedOn());
+
+                                optNewDomain.get().addServiceMetadata(smdNew);
+
                         } else {
                             throw new SMPRuntimeException(SG_NOT_REGISTRED_FOR_DOMAIN, serviceMetadataRO.getDomainCode(),
                                     serviceGroupRO.getParticipantIdentifier(), serviceGroupRO.getParticipantScheme());
diff --git a/smp-server-library/src/test/java/eu/europa/ec/edelivery/smp/services/ui/UIServiceGroupServiceIntegrationTest.java b/smp-server-library/src/test/java/eu/europa/ec/edelivery/smp/services/ui/UIServiceGroupServiceIntegrationTest.java
index 3748b7b8886cb0489360184c2506439a430eb913..4711274f4fe3a4feb37367f33fbb73597b5fddec 100644
--- a/smp-server-library/src/test/java/eu/europa/ec/edelivery/smp/services/ui/UIServiceGroupServiceIntegrationTest.java
+++ b/smp-server-library/src/test/java/eu/europa/ec/edelivery/smp/services/ui/UIServiceGroupServiceIntegrationTest.java
@@ -237,6 +237,49 @@ public class UIServiceGroupServiceIntegrationTest extends AbstractServiceIntegra
         assertEquals(testDomain02.getSmlSubdomain(), smdUpdated.getSmlSubdomain());
 
     }
+    @Test
+    public void testUpdateServiceMatadataChangeDomainReverseOrder() {
+
+        // given
+        DBDomain testDomain01 = TestDBUtils.createDBDomain(TestConstants.TEST_DOMAIN_CODE_1);
+
+        DBDomain testDomain02 = TestDBUtils.createDBDomain(TestConstants.TEST_DOMAIN_CODE_2);
+        domainDao.persistFlushDetach(testDomain02);
+        domainDao.persistFlushDetach(testDomain01);
+
+        DBServiceGroup dbServiceGroup = TestDBUtils.createDBServiceGroup();
+        dbServiceGroup.addDomain(testDomain02);
+        dbServiceGroup.addDomain(testDomain01);
+        DBServiceMetadata dbServiceMetadata = TestDBUtils.createDBServiceMetadata(dbServiceGroup.getParticipantIdentifier(), dbServiceGroup.getParticipantScheme());
+        dbServiceGroup.getServiceGroupDomains().get(1 ).addServiceMetadata(dbServiceMetadata);
+        // add second domain
+
+        serviceGroupDao.persistFlushDetach(dbServiceGroup);
+
+        ServiceResult<ServiceGroupRO> res = testInstance.getTableList(-1, -1, null, null, null);
+
+        assertNotNull(res);
+        assertEquals(1, res.getCount().intValue());
+        ServiceGroupRO sgChanged = res.getServiceEntities().get(0);
+        ServiceMetadataRO smdToChange = sgChanged.getServiceMetadata().get(0);
+        assertEquals(testDomain01.getDomainCode(), smdToChange.getDomainCode());
+        assertEquals(testDomain01.getSmlSubdomain(), smdToChange.getSmlSubdomain());
+
+        // then
+        sgChanged.setStatus(EntityROStatus.UPDATED.getStatusNumber());
+        smdToChange.setStatus(EntityROStatus.UPDATED.getStatusNumber());
+        smdToChange.setDomainCode(testDomain02.getDomainCode());
+        smdToChange.setSmlSubdomain(testDomain02.getSmlSubdomain());
+        testInstance.updateServiceGroupList(Collections.singletonList(sgChanged));
+
+        res = testInstance.getTableList(-1, -1, null, null, null);
+        ServiceGroupRO sgUpdated = res.getServiceEntities().get(0);
+        ServiceMetadataRO smdUpdated = sgUpdated.getServiceMetadata().get(0);
+
+        assertEquals(testDomain02.getDomainCode(), smdUpdated.getDomainCode());
+        assertEquals(testDomain02.getSmlSubdomain(), smdUpdated.getSmlSubdomain());
+
+    }
 
 
     @Test
diff --git a/smp-webapp/src/main/java/eu/europa/ec/edelivery/smp/ui/ServiceGroupResource.java b/smp-webapp/src/main/java/eu/europa/ec/edelivery/smp/ui/ServiceGroupResource.java
index 3427b4ba3b378b12ab164693900b3305d8199353..2d697049e5559c53dfb0a58b0916f35f2585e25b 100644
--- a/smp-webapp/src/main/java/eu/europa/ec/edelivery/smp/ui/ServiceGroupResource.java
+++ b/smp-webapp/src/main/java/eu/europa/ec/edelivery/smp/ui/ServiceGroupResource.java
@@ -119,7 +119,7 @@ public class ServiceGroupResource {
     @RequestMapping(method = RequestMethod.PUT)
     @Secured({SMPAuthority.S_AUTHORITY_TOKEN_SYSTEM_ADMIN, SMPAuthority.S_AUTHORITY_TOKEN_SMP_ADMIN, SMPAuthority.S_AUTHORITY_TOKEN_SERVICE_GROUP_ADMIN})
     public void updateDomainList(@RequestBody(required = true) ServiceGroupRO[] updateEntities ){
-        LOG.info("GOT LIST OF ServiceGroupRO to UPDATE: " + updateEntities.length);
+        LOG.info("Update ServiceGroupRO count: " + updateEntities.length);
         uiServiceGroupService.updateServiceGroupList(Arrays.asList(updateEntities));
     }