diff --git a/pom.xml b/pom.xml
index f16c5d503ad46b305b0ffbd279348a4aa5b50f5f..70540865ad8cbb638f22b1732c0efaf5035dce7c 100644
--- a/pom.xml
+++ b/pom.xml
@@ -15,7 +15,6 @@
     <description>VOSpace REST service</description>
 
     <properties>
-        <java.version>11</java.version>
         <!-- File catalog repository directory -->
         <init_database_scripts_path>../../../vospace-file-catalog</init_database_scripts_path>
         <finalName>${project.artifactId}-${project.version}</finalName>
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 d8f18014b8ec5bd3a6f58a699151671b6a9fa3ef..b6021f217d757681a799e23bebdc15b143bf4646 100644
--- a/src/main/java/it/inaf/oats/vospace/persistence/NodeDAO.java
+++ b/src/main/java/it/inaf/oats/vospace/persistence/NodeDAO.java
@@ -7,12 +7,17 @@ import java.sql.ResultSet;
 import java.sql.SQLException;
 import java.sql.Types;
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.List;
 import java.util.Optional;
+import java.util.function.Function;
+import java.util.stream.Collectors;
 import javax.sql.DataSource;
 import net.ivoa.xml.vospace.v2.ContainerNode;
 import net.ivoa.xml.vospace.v2.DataNode;
 import net.ivoa.xml.vospace.v2.Property;
+import net.ivoa.xml.vospace.v2.StructuredDataNode;
+import net.ivoa.xml.vospace.v2.View;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.jdbc.core.JdbcTemplate;
@@ -63,29 +68,33 @@ public class NodeDAO {
         StringBuilder sb = new StringBuilder();
         sb.append("INSERT INTO node");
         sb.append(" (name, busy_state, owner_id, creator_id, group_read, group_write,");
-        sb.append(" is_public, parent_path, parent_relative_path, type)");
-        sb.append(" VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ? )");
+        sb.append(" is_public, parent_path, parent_relative_path, type, accept_views, provide_views)");
+        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(ps, getProperty(myNode, getPropertyURI("groupread"))));
-            ps.setArray(6, fromPropertyToArray(ps, getProperty(myNode, getPropertyURI("groupwrite"))));
-            ps.setBoolean(7, Boolean.valueOf(getProperty(myNode, getPropertyURI("publicread"))));
-            ps.setObject(8, paths.get(0).path, Types.OTHER);
-            ps.setObject(9, paths.get(0).relativePath, Types.OTHER);
-            ps.setObject(10, getDbNodeType(myNode), Types.OTHER);
+            int i = 0;
+            ps.setString(++i, getNodeName(myNode));
+            ps.setBoolean(++i, getIsBusy(myNode));
+            ps.setString(++i, getProperty(myNode, getPropertyURI("creator")));
+            ps.setString(++i, getProperty(myNode, getPropertyURI("creator")));
+            ps.setArray(++i, fromPropertyToArray(ps, getProperty(myNode, getPropertyURI("groupread"))));
+            ps.setArray(++i, fromPropertyToArray(ps, getProperty(myNode, getPropertyURI("groupwrite"))));
+            ps.setBoolean(++i, Boolean.valueOf(getProperty(myNode, getPropertyURI("publicread"))));
+            ps.setObject(++i, paths.get(0).path, Types.OTHER);
+            ps.setObject(++i, paths.get(0).relativePath, Types.OTHER);
+            ps.setObject(++i, getDbNodeType(myNode), Types.OTHER);
+            ps.setObject(++i, fromViewsToArray(ps, myNode, d -> d.getAccepts()), Types.OTHER);
+            ps.setObject(++i, fromViewsToArray(ps, myNode, d -> d.getProvides()), Types.OTHER);
             return ps;
         });
-
     }
 
     public Optional<Node> listNode(String path) {
 
-        String sql = "SELECT os.vos_path, n.node_id, type, async_trans, busy_state, creator_id, group_read, group_write, is_public, content_length, created_on, last_modified from node n\n"
+        String sql = "SELECT os.vos_path, n.node_id, type, async_trans, busy_state, creator_id, group_read, group_write,\n"
+                + "is_public, content_length, created_on, last_modified, accept_views, provide_views\n"
+                + "FROM node n\n"
                 + "JOIN node_vos_path os ON n.node_id = os.node_id\n"
                 + "WHERE n.path ~ (" + getFirstLevelChildrenSelector(path) + ")::lquery\n"
                 + "OR os.vos_path = ? ORDER BY vos_path";
@@ -132,7 +141,12 @@ public class NodeDAO {
         Node node = getTypedNode(rs.getString("type"));
 
         if (node instanceof DataNode) {
-            ((DataNode) node).setBusy(rs.getBoolean("busy_state"));
+
+            DataNode dataNode = (DataNode) node;
+
+            dataNode.setBusy(rs.getBoolean("busy_state"));
+            dataNode.setAccepts(getViews(rs.getArray("accept_views")));
+            dataNode.setProvides(getViews(rs.getArray("provide_views")));
         }
 
         node.setUri(getUri(rs.getString("vos_path")));
@@ -198,6 +212,9 @@ public class NodeDAO {
             case "data":
                 node = new DataNode();
                 break;
+            case "structured":
+                node = new StructuredDataNode();
+                break;
             default:
                 throw new UnsupportedOperationException("Node type " + type + " not supported yet");
         }
@@ -273,6 +290,31 @@ public class NodeDAO {
         }
     }
 
+    private Array fromViewsToArray(PreparedStatement ps, Node node, Function<DataNode, List<View>> viewsExtractor) throws SQLException {
+        if (node instanceof DataNode) {
+            DataNode dataNode = (DataNode) node;
+            List<View> views = viewsExtractor.apply(dataNode);
+            if (views != null && !views.isEmpty()) {
+                Object[] array = views.stream().map(v -> v.getUri()).toArray();
+                return ps.getConnection().createArrayOf("varchar", array);
+            }
+        }
+        return null;
+    }
+
+    private List<View> getViews(Array array) throws SQLException {
+        if (array == null) {
+            return null;
+        }
+        return Arrays.stream((String[]) array.getArray())
+                .map(uri -> {
+                    View view = new View();
+                    view.setUri(uri);
+                    return view;
+                })
+                .collect(Collectors.toList());
+    }
+
     private String getDbNodeType(Node node) {
         if (node instanceof ContainerNode) {
             return "container";
diff --git a/src/test/java/it/inaf/oats/vospace/persistence/DataSourceConfig.java b/src/test/java/it/inaf/oats/vospace/persistence/DataSourceConfig.java
index eadeaec8d8962ee0e45436f8ebc06caf269762f8..5993356419744cb12394870e580c7be9d85fffea 100644
--- a/src/test/java/it/inaf/oats/vospace/persistence/DataSourceConfig.java
+++ b/src/test/java/it/inaf/oats/vospace/persistence/DataSourceConfig.java
@@ -75,7 +75,7 @@ public class DataSourceConfig {
             File scriptDir = currentDir.toPath().resolve(scriptPath).toFile().getCanonicalFile();
 
             assertTrue(scriptDir.exists(), "DAO tests require " + scriptDir.getAbsolutePath() + " to exists.\n"
-                    + "Please clone the repository from https://www.ict.inaf.it/gitlab/ia2/vospace-file-catalog.git");
+                    + "Please clone the repository from https://www.ict.inaf.it/gitlab/vospace/vospace-file-catalog.git");
 
             File[] scripts = scriptDir.listFiles(f -> f.getName().endsWith(".sql"));
             Arrays.sort(scripts); // sort alphabetically
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 47936c5a897c376ef46afced62fd64797966f11c..ee7bbe23edb92f3c538f71bc6e85279d728b63c0 100644
--- a/src/test/java/it/inaf/oats/vospace/persistence/NodeDAOTest.java
+++ b/src/test/java/it/inaf/oats/vospace/persistence/NodeDAOTest.java
@@ -1,10 +1,13 @@
 package it.inaf.oats.vospace.persistence;
 
+import java.util.ArrayList;
+import java.util.List;
 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 net.ivoa.xml.vospace.v2.View;
 import static org.junit.jupiter.api.Assertions.assertEquals;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
@@ -27,15 +30,22 @@ 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");
-        
+        dataNode.setAccepts(getViews());
+        dataNode.setProvides(getViews());
+        dataNode.setBusy(true);
+
         dao.createNode(dataNode);
-        
+
+        DataNode retrievedNode = (DataNode) dao.listNode("/mydata1").get();
+
+        assertEquals(retrievedNode.getAccepts().get(0).getUri(), dataNode.getAccepts().get(0).getUri());
+        assertEquals(retrievedNode.getProvides().get(0).getUri(), dataNode.getProvides().get(0).getUri());
     }
 
     @Test
@@ -54,4 +64,12 @@ public class NodeDAOTest {
         }
         return null;
     }
+
+    private List<View> getViews() {
+        View view = new View();
+        view.setUri("urn:myview");
+        List<View> views = new ArrayList<>();
+        views.add(view);
+        return views;
+    }
 }