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 f07c4ce5be9a0ef976531dc6daf128d84db754d9..c15550dfe1aac47abb0054a3efbfb4eb18443146 100644
--- a/src/main/java/it/inaf/oats/vospace/persistence/NodeDAO.java
+++ b/src/main/java/it/inaf/oats/vospace/persistence/NodeDAO.java
@@ -403,6 +403,30 @@ public class NodeDAO {
             return ps;
         });
     }
+    
+    public void setBranchImmutable(Long rootNodeId, boolean setImmutable) {
+        String sql = "UPDATE node c SET immutable = ? "
+                + "FROM node r "
+                + "WHERE r.node_id = ? "
+                + "AND r.path @> c.path";
+
+        jdbcTemplate.update(conn -> {
+            PreparedStatement ps = conn.prepareStatement(sql);
+            ps.setBoolean(1, setImmutable);
+            ps.setLong(2, rootNodeId);
+            return ps;
+        });        
+    }
+
+    public boolean isBranchImmutable(long parentNodeId) {
+
+        String sql = "SELECT COUNT(c.node_id) > 0 "
+                + "FROM node n "
+                + "JOIN node c ON c.path <@ n.path "
+                + "WHERE n.node_id = ? AND c.immutable IS TRUE";
+
+        return jdbcTemplate.queryForObject(sql, new Object[]{parentNodeId}, new int[]{Types.BIGINT}, Boolean.class);
+    }
 
     public void releaseBusyNodesByJobId(String jobId) {
         String sql = "UPDATE node SET job_id = NULL WHERE job_id = ?";
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 862b598461b5f1a2e53485c61fbcee82c5873fd8..8285f528f2e6de1b2250afff775fbb9a11f65888 100644
--- a/src/test/java/it/inaf/oats/vospace/persistence/NodeDAOTest.java
+++ b/src/test/java/it/inaf/oats/vospace/persistence/NodeDAOTest.java
@@ -50,7 +50,6 @@ public class NodeDAOTest {
         ReflectionTestUtils.setField(dao, "authority", AUTHORITY);
     }
 
-
     @Test
     public void testCreateNode() {
         DataNode dataNode = new DataNode();
@@ -275,6 +274,27 @@ public class NodeDAOTest {
 
     }
 
+    @Test
+    public void testSetImmutable() {
+        Optional<Long> optId = dao.getNodeId("/test3/m1");
+        assertTrue(optId.isPresent());
+
+        assertFalse(dao.isBranchImmutable(optId.get()));
+
+        dao.setBranchImmutable(optId.get(), true);
+
+        assertTrue(dao.isBranchImmutable(optId.get()));
+
+        Optional<Long> childId = dao.getNodeId("/test3/m1/m2");
+        assertTrue(childId.isPresent());
+
+        assertTrue(dao.isBranchImmutable(childId.get()));
+
+        dao.setBranchImmutable(optId.get(), false);
+
+        assertFalse(dao.isBranchBusy(optId.get()));
+        assertFalse(dao.isBranchBusy((childId.get())));
+    }
 
     @Test
     public void testMoveNodeBranch() {