diff --git a/src/main/java/it/inaf/oats/vospace/persistence/NodeDAO.java b/src/main/java/it/inaf/oats/vospace/persistence/NodeDAO.java
index d843da79d26fdfebd276b42cbacb0e883feb4eb6..a93728b89eb7bf8e2fc362557463f2b86c8b249d 100644
--- a/src/main/java/it/inaf/oats/vospace/persistence/NodeDAO.java
+++ b/src/main/java/it/inaf/oats/vospace/persistence/NodeDAO.java
@@ -119,8 +119,14 @@ public class NodeDAO {
         return Optional.of(node);
     }
 
+    public Node setNode(Node newNode) {
+        return setNode(newNode, false);
+    }    
     
-    public Node setNode(Node newNode) {       
+    /**
+     * If recursive flag is true the update is applied to children too.
+     */
+    public Node setNode(Node newNode, boolean recursive) {
         
         String vosPath = NodeUtils.getVosPath(newNode);
 
diff --git a/src/test/java/it/inaf/oats/vospace/persistence/NodeDAOTest.java b/src/test/java/it/inaf/oats/vospace/persistence/NodeDAOTest.java
index 16f117678812a79effbef0e643654fd726ebf3a6..e28f10dd6d07d7d838d63498b53cfaccf466ec06 100644
--- a/src/test/java/it/inaf/oats/vospace/persistence/NodeDAOTest.java
+++ b/src/test/java/it/inaf/oats/vospace/persistence/NodeDAOTest.java
@@ -3,7 +3,10 @@ package it.inaf.oats.vospace.persistence;
 import it.inaf.oats.vospace.datamodel.NodeProperties;
 import it.inaf.oats.vospace.exception.InternalFaultException;
 import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.HashSet;
 import java.util.List;
+import java.util.Set;
 import javax.sql.DataSource;
 import net.ivoa.xml.vospace.v2.ContainerNode;
 import net.ivoa.xml.vospace.v2.DataNode;
@@ -58,7 +61,7 @@ public class NodeDAOTest {
         
         assertEquals("true", NodeProperties.getNodePropertyAsListByURI(root, NodeProperties.PUBLIC_READ_URI).get(0));
 
-        assertEquals("group1 group2", getProperty(root.getNodes().get(0), "ivo://ivoa.net/vospace/core#groupread"));
+        assertEquals("group1 group2", NodeProperties.getNodePropertyByURI(root.getNodes().get(0), NodeProperties.GROUP_READ_URI));
     }
 
     @Test
@@ -114,9 +117,7 @@ public class NodeDAOTest {
     @Test
     public void testSetNode() {
 
-        Property publicReadProperty = new Property();
-        publicReadProperty.setUri(NodeProperties.PUBLIC_READ_URI);
-        publicReadProperty.setValue(String.valueOf(false));
+        Property publicReadProperty = getProperty(NodeProperties.PUBLIC_READ_URI, String.valueOf(false));
 
         Node node = new DataNode();
         node.setUri("vos://example.com!vospace/mydata3");
@@ -136,13 +137,61 @@ public class NodeDAOTest {
         assertEquals("true", NodeProperties.getNodePropertyByURI(node, NodeProperties.PUBLIC_READ_URI));
     }
 
-    private String getProperty(Node node, String uri) {
-        for (Property property : node.getProperties()) {
-            if (uri.equals(property.getUri())) {
-                return property.getValue();
-            }
-        }
-        return null;
+    //@Test
+    public void testSetNodeRecursiveGroup() {
+
+        Property parentGroupRead = getProperty(NodeProperties.GROUP_READ_URI, "group1 group2");
+        Property parentGroupWrite = getProperty(NodeProperties.GROUP_WRITE_URI, "group2 group3");
+
+        Node node = new DataNode();
+        node.setUri("vos://example.com!vospace/mydata4");
+        node.getProperties().add(parentGroupRead);
+        node.getProperties().add(parentGroupWrite);
+        dao.createNode(node);
+
+        Node child1 = new DataNode();
+        child1.setUri("vos://example.com!vospace/mydata4/child1");
+        child1.getProperties().add(getProperty(NodeProperties.GROUP_READ_URI, "group3"));
+        child1.getProperties().add(getProperty(NodeProperties.GROUP_WRITE_URI, "group3 group4"));
+        dao.createNode(child1);
+
+        Node child2 = new DataNode();
+        child2.setUri("vos://example.com!vospace/mydata4/child1/child2");
+        child2.getProperties().add(getProperty(NodeProperties.GROUP_READ_URI, "group2 group5"));
+        child2.getProperties().add(getProperty(NodeProperties.GROUP_WRITE_URI, "group6"));
+        dao.createNode(child2);
+
+        parentGroupRead.setValue("group1 group5"); // remove group2; add group5
+        parentGroupWrite.setValue("group2 group6"); // remove group3; add group6
+
+        // Recursively set node
+        dao.setNode(node, true);
+
+        node = dao.listNode("/mydata4").get();
+        child1 = dao.listNode("/mydata4/child1").get();
+        child2 = dao.listNode("/mydata4/child1/child2").get();
+
+        checkGroups(NodeProperties.getNodePropertyAsListByURI(node, NodeProperties.GROUP_READ_URI), "group1", "group5");
+        checkGroups(NodeProperties.getNodePropertyAsListByURI(node, NodeProperties.GROUP_WRITE_URI), "group2", "group6");
+
+        checkGroups(NodeProperties.getNodePropertyAsListByURI(child1, NodeProperties.GROUP_READ_URI), "group3", "group5");
+        checkGroups(NodeProperties.getNodePropertyAsListByURI(child1, NodeProperties.GROUP_WRITE_URI), "group4", "group6");
+
+        checkGroups(NodeProperties.getNodePropertyAsListByURI(child2, NodeProperties.GROUP_READ_URI), "group5");
+        checkGroups(NodeProperties.getNodePropertyAsListByURI(child2, NodeProperties.GROUP_WRITE_URI), "group6");
+    }
+
+    private Property getProperty(String uri, String value) {
+        Property property = new Property();
+        property.setUri(uri);
+        property.setValue(value);
+        return property;
+    }
+
+    private void checkGroups(List<String> groups, String... expectedGroups) {
+        Set<String> set1 = new HashSet<>(Arrays.asList(expectedGroups));
+        Set<String> set2 = new HashSet<>(groups);
+        assertEquals(set1, set2);
     }
 
     private List<View> getViews() {