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 64ab6b68f8d52555f2388437491cbb01e462033c..508eb4465f4d45f7cfb203a090e046a83b374306 100644
--- a/src/main/java/it/inaf/oats/vospace/persistence/NodeDAO.java
+++ b/src/main/java/it/inaf/oats/vospace/persistence/NodeDAO.java
@@ -5,6 +5,7 @@ import net.ivoa.xml.vospace.v2.Node;
 import java.sql.PreparedStatement;
 import java.sql.ResultSet;
 import java.sql.SQLException;
+import java.sql.Types;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Optional;
@@ -34,18 +35,65 @@ public class NodeDAO {
         jdbcTemplate = new JdbcTemplate(dataSource);
     }
 
-    public Node createNode(Node myNode) {
+   public void createNode(Node myNode) {
+        
+        // check if parent path exist, else throw HTTP 404 , secondo specifica vospace
+        
+        /*
+            Retrieve the path (ltree) and the relative_path (ltree) of the parent node:
+ 
+            select path, relative_path from node n
+            join node_vos_path p on n.node_id = p.node_id
+            where p.vos_path = '/path/to/parent’
+ 
+            Then perform the insert using the path and relative_path to fill the parent_path and parent_relative_path columns of the new node.
+
+        */
+        
+        String nodeURI = myNode.getUri();
+        String path = nodeURI.replaceAll("vos://[^/]+", "");
+        String parentPath = getParentPath(path);
+        
+        String sql = "SELECT path, relative_path from "
+                + "node n join node_vos_path p on n.node_id = p.node_id "
+                + "where p.vos_path = ?";
+        
+        List<NodePaths> paths = jdbcTemplate.query(conn -> {
+              PreparedStatement ps = conn.prepareStatement(sql);
+              ps.setString(1, parentPath);
+              return ps;
+        }, (row, index) -> {
+            return getPathsFromResultSet(row);
+        });
+                   
 
+        if(paths.isEmpty()) {
+            throw new IllegalStateException("Unable to find parent node during node creation");
+        }     
+            
         StringBuilder sb = new StringBuilder();
-        sb.append("INSERT INTO ");
-        sb.append("NodeProperty");
-        sb.append(" (nodeID,propertyURI,propertyValue) SELECT ?, ?, ?");
-        sb.append(" WHERE NOT EXISTS (SELECT * FROM NodeProperty");
-        sb.append(" WHERE nodeID=? and propertyURI=?)");
-        String sqlQuery = sb.toString();
-
-        return myNode;
+        sb.append("INSERT INTO node");
+        sb.append(" (name, busy_state, owner_id, creator_id, group_read, group_write,");
+        sb.append(" is_public,  parent_path, type)");
+        sb.append(" VALUES (?, ?, ?, ?, ?, ?, ?, ?, ? )");   
+        
+        jdbcTemplate.update(conn -> {
+            PreparedStatement ps = conn.prepareStatement(sb.toString());
+            ps.setString(1, getNodeName(myNode));
+            ps.setBoolean(2, getIsBusy(myNode));
+            ps.setString(3, getProperty(myNode, getPropertyURI("creator")));
+            ps.setString(4, getProperty(myNode, getPropertyURI("creator")));
+            ps.setArray(5, fromPropertyToArray(getProperty(myNode, getPropertyURI("groupread"))));
+            ps.setArray(6, fromPropertyToArray(getProperty(myNode, getPropertyURI("groupwrite"))));
+            ps.setBoolean(7, Boolean.valueOf(getProperty(myNode, getPropertyURI("publicread"))));
+            //ps.setBoolean(7, true);
+            ps.setObject(8, paths.get(0).parentPath, Types.OTHER);
+            ps.setString(9, getProperty(myNode, getPropertyURI("type")));
+            return ps;
+        });
+        
     }
+    
 
     public Optional<Node> listNode(String path) {
 
@@ -168,4 +216,98 @@ public class NodeDAO {
     private String getUri(String path) {
         return "vos://" + authority + path;
     }
+        
+
+    private NodePaths getPathsFromResultSet(ResultSet rs) throws SQLException {
+       
+        NodePaths paths = new NodePaths(rs.getString("path"), rs.getString("relative_path"));
+        
+        return  paths;
+      
+    }
+    
+    private String getNodeName(String path) {
+        String[] parsedPath = path.split("/");
+
+        return parsedPath[parsedPath.length -1]; 
+        
+    }
+    
+ 
+    
+    private String getNodeName(Node myNode) {
+        
+        String uri = myNode.getUri();
+        return getNodeName(uri);
+        
+    }  
+
+    
+    private boolean getIsBusy(Node myNode) {
+        
+        if (myNode instanceof DataNode) {
+            
+            DataNode dataNode = (DataNode)myNode;
+            return dataNode.isBusy();
+        }
+        
+        return false;
+        
+    }
+    
+    
+    private String getParentPath(String path) {
+        String[] parsedPath = path.split("/");
+
+        StringBuilder sb = new StringBuilder();
+
+        for (int i = 0; i < parsedPath.length - 1; i++) {
+            sb.append("/").append(parsedPath[i]);
+        }
+
+        return sb.toString();
+    }
+    
+    
+    private String getProperty(Node node, String uri) {
+        for (Property property : node.getProperties()) {
+            if (uri.equals(property.getUri())) {
+                return property.getValue();
+            }
+        }
+        return null;
+    }
+    
+    private Array fromPropertyToArray(String myProperty) {
+        
+        if (myProperty == null || myProperty.isBlank()) 
+        
+            return null;
+        
+        else {
+            
+            //myProperty.split(" ")
+            return null;        
+        }
+        
+    }
+    
+    
+    private class NodePaths {
+
+        private String path;
+        private String parentPath;
+        
+        public NodePaths(String myPath, String myParentPath) {
+            
+            this.path = myPath;
+            this.parentPath = myParentPath;
+        
+        }       
+        
+        public String toString() {
+            return  parentPath + " " + path;
+        }
+    }
+
 }
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 d1cfcf0ddd2cfac25120653b87d6b53dfb7fa500..47936c5a897c376ef46afced62fd64797966f11c 100644
--- a/src/test/java/it/inaf/oats/vospace/persistence/NodeDAOTest.java
+++ b/src/test/java/it/inaf/oats/vospace/persistence/NodeDAOTest.java
@@ -2,6 +2,7 @@ package it.inaf.oats.vospace.persistence;
 
 import javax.sql.DataSource;
 import net.ivoa.xml.vospace.v2.ContainerNode;
+import net.ivoa.xml.vospace.v2.DataNode;
 import net.ivoa.xml.vospace.v2.Node;
 import net.ivoa.xml.vospace.v2.Property;
 import static org.junit.jupiter.api.Assertions.assertEquals;
@@ -26,6 +27,16 @@ public class NodeDAOTest {
     public void init() {
         dao = new NodeDAO(dataSource);
     }
+       
+    @Test
+    public void testCreateNode() {
+        DataNode dataNode = new DataNode();
+        
+        dataNode.setUri("vos://example.com!vospace/mydata1");
+        
+        dao.createNode(dataNode);
+        
+    }
 
     @Test
     public void testListNode() {