diff --git a/src/Project.Tests/Project.Tests.csproj b/src/Project.Tests/Project.Tests.csproj
index d4fe9a064b6cef2b032af5f560451a14576f79c2..9b8843fcb2c77d99a8d227d25ab6090331d32245 100644
--- a/src/Project.Tests/Project.Tests.csproj
+++ b/src/Project.Tests/Project.Tests.csproj
@@ -65,8 +65,8 @@
     <Reference Include="Coscine.Configuration, Version=1.4.0.0, Culture=neutral, PublicKeyToken=ce3d7a32d7dc1e5a, processorArchitecture=MSIL">
       <HintPath>..\packages\Coscine.Configuration.1.4.0\lib\net461\Coscine.Configuration.dll</HintPath>
     </Reference>
-    <Reference Include="Coscine.Database, Version=1.6.0.0, Culture=neutral, PublicKeyToken=767d77427707b70a, processorArchitecture=MSIL">
-      <HintPath>..\packages\Coscine.Database.1.6.0\lib\net461\Coscine.Database.dll</HintPath>
+    <Reference Include="Coscine.Database, Version=1.8.0.0, Culture=neutral, PublicKeyToken=767d77427707b70a, processorArchitecture=MSIL">
+      <HintPath>..\packages\Coscine.Database.1.8.0\lib\net461\Coscine.Database.dll</HintPath>
     </Reference>
     <Reference Include="Coscine.ProxyApi, Version=1.2.0.0, Culture=neutral, processorArchitecture=MSIL">
       <HintPath>..\packages\Coscine.ProxyApi.1.2.0\lib\net461\Coscine.ProxyApi.dll</HintPath>
@@ -74,18 +74,30 @@
     <Reference Include="Coscine.SharePoint.Webparts.Vue, Version=1.4.0.0, Culture=neutral, PublicKeyToken=0fe8d3e516df6d98, processorArchitecture=MSIL">
       <HintPath>..\packages\Coscine.SharePoint.Webparts.Vue.1.4.0\lib\net461\Coscine.SharePoint.Webparts.Vue.dll</HintPath>
     </Reference>
+    <Reference Include="dotNetRDF, Version=2.2.1.0, Culture=neutral, PublicKeyToken=6055ffe4c97cc780, processorArchitecture=MSIL">
+      <HintPath>..\packages\dotNetRDF.2.2.1\lib\net40\dotNetRDF.dll</HintPath>
+    </Reference>
+    <Reference Include="dotNetRDF.Data.Virtuoso, Version=2.2.1.0, Culture=neutral, PublicKeyToken=6055ffe4c97cc780, processorArchitecture=MSIL">
+      <HintPath>..\packages\dotNetRDF.Data.Virtuoso.2.2.1\lib\net40\dotNetRDF.Data.Virtuoso.dll</HintPath>
+    </Reference>
     <Reference Include="EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089, processorArchitecture=MSIL">
       <HintPath>..\packages\EntityFramework.6.2.0\lib\net45\EntityFramework.dll</HintPath>
     </Reference>
     <Reference Include="EntityFramework.SqlServer, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089, processorArchitecture=MSIL">
       <HintPath>..\packages\EntityFramework.6.2.0\lib\net45\EntityFramework.SqlServer.dll</HintPath>
     </Reference>
+    <Reference Include="HtmlAgilityPack, Version=1.8.2.0, Culture=neutral, PublicKeyToken=bd319b19eaf3b43a, processorArchitecture=MSIL">
+      <HintPath>..\packages\HtmlAgilityPack.1.8.2\lib\Net45\HtmlAgilityPack.dll</HintPath>
+    </Reference>
     <Reference Include="linq2db, Version=2.6.4.0, Culture=neutral, PublicKeyToken=e41013125f9e410a, processorArchitecture=MSIL">
       <HintPath>..\packages\linq2db.2.6.4\lib\net46\linq2db.dll</HintPath>
     </Reference>
     <Reference Include="LinqKit, Version=1.1.16.0, Culture=neutral, PublicKeyToken=bc217f8844052a91, processorArchitecture=MSIL">
       <HintPath>..\packages\LinqKit.1.1.16\lib\net45\LinqKit.dll</HintPath>
     </Reference>
+    <Reference Include="Metadata, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL">
+      <HintPath>..\packages\Metadata.1.0.0\lib\net461\Metadata.dll</HintPath>
+    </Reference>
     <Reference Include="Microsoft.AspNetCore, Version=2.2.0.0, Culture=neutral, PublicKeyToken=adb9793829ddae60, processorArchitecture=MSIL">
       <HintPath>..\packages\Microsoft.AspNetCore.2.2.0\lib\netstandard2.0\Microsoft.AspNetCore.dll</HintPath>
     </Reference>
@@ -560,6 +572,12 @@
       <Private>True</Private>
       <Private>True</Private>
     </Reference>
+    <Reference Include="VDS.Common, Version=1.10.0.0, Culture=neutral, PublicKeyToken=ab5f4eb908061bf0, processorArchitecture=MSIL">
+      <HintPath>..\packages\VDS.Common.1.10.0\lib\net40-client\VDS.Common.dll</HintPath>
+    </Reference>
+    <Reference Include="virtado4, Version=4.0.0.0, Culture=neutral, PublicKeyToken=391bf132017ae989, processorArchitecture=MSIL">
+      <HintPath>..\packages\OpenLink.Data.Virtuoso.7.20.3214.1\lib\net40\virtado4.dll</HintPath>
+    </Reference>
   </ItemGroup>
   <ItemGroup>
     <Compile Include="DefaultControllerTests.cs" />
diff --git a/src/Project.Tests/ResourceControllerTests.cs b/src/Project.Tests/ResourceControllerTests.cs
index 405547449e2a26fd9ca3b517baeba52a03878b6a..8c5d692dc929b7513497e258ee73378b9d1f5622 100644
--- a/src/Project.Tests/ResourceControllerTests.cs
+++ b/src/Project.Tests/ResourceControllerTests.cs
@@ -96,7 +96,9 @@ namespace Coscine.Api.Project.Tests
                 new List<DisciplineObject>() { new DisciplineObject(Discipline.Id, Discipline.Url, Discipline.DisplayName) },
                 new VisibilityObject(Visibility.Id, Visibility.DisplayName),
                 new LicenseObject(License.Id, License.DisplayName),
-                JObject.FromObject(new RDSResourceTypeObject(Guid.NewGuid(), "PITLABTTEST", "accesskey", "secretkey"))
+                JObject.FromObject(new RDSResourceTypeObject(Guid.NewGuid(), "PITLABTTEST", "accesskey", "secretkey")),
+                "link",
+                JToken.Parse("{}")
             );
 
             Stream stream = ObjectFactory<ResourceObject>.SerializeToStream(resourceObject);
diff --git a/src/Project.Tests/app.config b/src/Project.Tests/app.config
index cf15ee6db59a44a6f654ccf49e87523c4e54fb40..a4522c8ec90b9bf11d952ae9d3ae684788930732 100644
--- a/src/Project.Tests/app.config
+++ b/src/Project.Tests/app.config
@@ -88,7 +88,7 @@
       </dependentAssembly>
       <dependentAssembly>
         <assemblyIdentity name="Coscine.Database" publicKeyToken="767d77427707b70a" culture="neutral" />
-        <bindingRedirect oldVersion="0.0.0.0-1.6.0.0" newVersion="1.6.0.0" />
+        <bindingRedirect oldVersion="0.0.0.0-1.8.0.0" newVersion="1.8.0.0" />
       </dependentAssembly>
       <dependentAssembly>
         <assemblyIdentity name="System.IdentityModel.Tokens.Jwt" publicKeyToken="31bf3856ad364e35" culture="neutral" />
diff --git a/src/Project.Tests/packages.config b/src/Project.Tests/packages.config
index e9feed70992ea433145d0fd7079145d9e67cb898..65792be94db3206f7449256b9e651059387a9c3a 100644
--- a/src/Project.Tests/packages.config
+++ b/src/Project.Tests/packages.config
@@ -7,14 +7,18 @@
   <package id="Coscine.Action" version="1.3.1" targetFramework="net472" />
   <package id="Coscine.ApiCommons" version="1.2.1" targetFramework="net472" />
   <package id="Coscine.Configuration" version="1.4.0" targetFramework="net472" />
-  <package id="Coscine.Database" version="1.6.0" targetFramework="net472" />
+  <package id="Coscine.Database" version="1.8.0" targetFramework="net472" />
   <package id="Coscine.ProxyApi" version="1.2.0" targetFramework="net472" />
   <package id="Coscine.SharePoint.Webparts.Vue" version="1.4.0" targetFramework="net472" />
+  <package id="dotNetRDF" version="2.2.1" targetFramework="net472" />
+  <package id="dotNetRDF.Data.Virtuoso" version="2.2.1" targetFramework="net472" />
   <package id="EntityFramework" version="6.2.0" targetFramework="net472" />
+  <package id="HtmlAgilityPack" version="1.8.2" targetFramework="net472" />
   <package id="linq2db" version="2.6.4" targetFramework="net472" />
   <package id="linq2db.SqlServer" version="2.6.4" targetFramework="net472" />
   <package id="linq2db.t4models" version="2.6.4" targetFramework="net472" />
   <package id="LinqKit" version="1.1.16" targetFramework="net472" />
+  <package id="Metadata" version="1.0.0" targetFramework="net472" />
   <package id="Microsoft.AspNetCore" version="2.2.0" targetFramework="net472" />
   <package id="Microsoft.AspNetCore.Antiforgery" version="2.2.0" targetFramework="net472" />
   <package id="Microsoft.AspNetCore.Authentication.Abstractions" version="2.2.0" targetFramework="net472" />
@@ -118,6 +122,7 @@
   <package id="Newtonsoft.Json.Bson" version="1.0.2" targetFramework="net472" />
   <package id="NUnit" version="3.11.0" targetFramework="net472" />
   <package id="NUnit3TestAdapter" version="3.13.0" targetFramework="net472" />
+  <package id="OpenLink.Data.Virtuoso" version="7.20.3214.1" targetFramework="net472" />
   <package id="System.AppContext" version="4.3.0" targetFramework="net472" />
   <package id="System.Buffers" version="4.5.0" targetFramework="net472" />
   <package id="System.Collections" version="4.3.0" targetFramework="net472" />
@@ -162,4 +167,5 @@
   <package id="System.Xml.ReaderWriter" version="4.3.1" targetFramework="net472" />
   <package id="System.Xml.XPath" version="4.3.0" targetFramework="net472" />
   <package id="System.Xml.XPath.XDocument" version="4.3.0" targetFramework="net472" />
+  <package id="VDS.Common" version="1.10.0" targetFramework="net472" />
 </packages>
\ No newline at end of file
diff --git a/src/Project/App.config b/src/Project/App.config
index 43975a34164ab0b0305c7dfaa54b10d29149aed7..46cfafcc43a3efcd2492faefae8a1c06e2f2e0e4 100644
--- a/src/Project/App.config
+++ b/src/Project/App.config
@@ -91,7 +91,7 @@
       </dependentAssembly>
       <dependentAssembly>
         <assemblyIdentity name="Coscine.Database" publicKeyToken="767d77427707b70a" culture="neutral" />
-        <bindingRedirect oldVersion="0.0.0.0-1.6.0.0" newVersion="1.6.0.0" />
+        <bindingRedirect oldVersion="0.0.0.0-1.8.0.0" newVersion="1.8.0.0" />
       </dependentAssembly>
       <dependentAssembly>
         <assemblyIdentity name="System.IdentityModel.Tokens.Jwt" publicKeyToken="31bf3856ad364e35" culture="neutral" />
diff --git a/src/Project/Controllers/DataSourceController.cs b/src/Project/Controllers/DataSourceController.cs
index bb0998c3e1660774441474e19ba562d30fc55fff..112e4833a781ccae8be62a40feab9e21062b2173 100644
--- a/src/Project/Controllers/DataSourceController.cs
+++ b/src/Project/Controllers/DataSourceController.cs
@@ -297,13 +297,12 @@ namespace Coscine.Api.Project.Controllers
                 return BadRequest($"{resourceId} is not a guid.");
             }
 
-#if! DEBUG
             var user = _authenticator.GetUserFromToken();
             if (!_resourceModel.OwnsResource(user, resource))
             {
                 return Forbid($"The user does not own the resource {resourceId}");
             }
-#endif
+
             try
             {
                 resource = _resourceModel.GetById(resouceGuid);
diff --git a/src/Project/Controllers/MetadataController.cs b/src/Project/Controllers/MetadataController.cs
new file mode 100644
index 0000000000000000000000000000000000000000..c517da4f694cfe96db921cdc4567d946ad091c53
--- /dev/null
+++ b/src/Project/Controllers/MetadataController.cs
@@ -0,0 +1,221 @@
+using Coscine.Api.Project.Models;
+using Coscine.ApiCommons;
+using Coscine.ApiCommons.Exceptions;
+using Coscine.ApiCommons.Factories;
+using Microsoft.AspNetCore.Mvc;
+using Newtonsoft.Json.Linq;
+using System;
+using System.Linq;
+using VDS.RDF.Writing;
+using VDS.RDF.Parsing;
+using VDS.RDF;
+using Metadata;
+using System.Web;
+using System.IO;
+
+namespace Coscine.Api.Project.Controllers
+{
+    public class MetadataController : Controller
+    {
+        private readonly Authenticator _authenticator;
+        private readonly MetadataModel _metadataModel;
+        private readonly ResourceModel _resourceModel;
+        private readonly Util _util;
+
+        public MetadataController()
+        {
+            _authenticator = new Authenticator(this, Program.Configuration);
+            _metadataModel = new MetadataModel();
+            _resourceModel = new ResourceModel();
+            _util = new Util();
+        }
+
+        [Route("[controller]")]
+        public IActionResult Index()
+        {
+            return Ok(_authenticator.ValidateAndExecute((user) =>
+            {
+                return NoContent();
+            }));
+        }
+
+        [HttpGet("[controller]/resource/{resourceId}/ap/{applicationProfileId}")]
+        public IActionResult GetApplicationProfile(string resourceId, string applicationProfileId)
+        {
+            var user = _authenticator.GetUserFromToken();
+
+            var resource = _resourceModel.GetById(Guid.Parse(resourceId));
+            if (_metadataModel.IsProjectMember(user, resource))
+            {
+                var graph = _util.GetGraph(HttpUtility.UrlDecode(applicationProfileId));
+                var fixedValuesGraph = new Graph();
+
+                fixedValuesGraph.LoadFromString(resource.FixedValues, new RdfJsonParser());
+
+                graph.Merge(fixedValuesGraph);
+
+                var json = JToken.Parse(VDS.RDF.Writing.StringWriter.Write(graph, new RdfJsonWriter()));
+                
+                return Ok(json);
+            }
+            else
+            {
+                throw new NotAuthorizedException("User is no project member!");
+            }
+
+        }
+
+        [HttpGet("[controller]/resource/{resourceId}/aplist/")]
+        public IActionResult ListAllApplicationProfiles(string resourceId)
+        {
+            return Ok(_authenticator.ValidateAndExecute((user) =>
+            {
+                var resource = _resourceModel.GetById(Guid.Parse(resourceId));
+                if (_metadataModel.IsProjectMember(user, resource))
+                {
+                    var graphUris = _util.ListGraphs();
+
+                    return new JArray(graphUris.Select(x => x.ToString()).Where(x => x.StartsWith("https://purl.org/coscine/ap/")));
+                }
+                else
+                {
+                    throw new NotAuthorizedException("User is no project member!");
+                }
+            }));
+        }
+
+        [HttpGet("[controller]/resource/{resourceId}/filename/{filename}/ver/{version}")]
+        public IActionResult GetMetadataForFile(string resourceId, string filename, string version)
+        {
+            return Ok(_authenticator.ValidateAndExecute((user) =>
+            {
+                var resource = _resourceModel.GetById(Guid.Parse(resourceId));
+                if (_metadataModel.IsProjectMember(user, resource))
+                {
+                    var id = _metadataModel.GenerateId(resourceId, filename, version);
+                    var graph = _util.GetGraph(id);
+                    return JToken.Parse(VDS.RDF.Writing.StringWriter.Write(graph, new RdfJsonWriter()));
+                }
+                else
+                {
+                    throw new NotAuthorizedException("User is no project member!");
+                }
+            }));
+        }
+
+        [HttpPut("[controller]/resource/{resourceId}/filename/{filename}/ver/{version}")]
+        public IActionResult StoreMetadataForFile(string resourceId, string filename, string version)
+        {
+            return Ok(_authenticator.ValidateAndExecute((user) =>
+            {
+                var innerBlock = ObjectFactory<JToken>.DeserializeFromStream(Request.Body);
+                var graphName = _metadataModel.GenerateId(resourceId, filename, version);
+                var graphNameUri = new Uri(graphName);
+                var json = new JObject
+                {
+                    [graphName] = innerBlock
+                };
+
+                var resource = _resourceModel.GetById(Guid.Parse(resourceId));
+                if (_metadataModel.IsProjectMember(user, resource))
+                {
+                    var graph = new Graph();
+                    graph.LoadFromString(json.ToString(), new RdfJsonParser());
+
+                    var fixedValuesGraph = new Graph();
+                    fixedValuesGraph.LoadFromString(resource.FixedValues, new RdfJsonParser());
+
+                    foreach(var triple in fixedValuesGraph.Triples.Where(x => x.Predicate.ToString() == "https://purl.org/coscine/fixedValue"))
+                    {
+                        // Remove any existing triples
+                        foreach (var triple2 in graph.GetTriplesWithSubjectPredicate(graph.CreateUriNode(graphNameUri), triple.Subject).ToList())
+                        {
+                            graph.Retract(triple2);
+                        }
+                        graph.Assert(graph.CreateUriNode(graphNameUri), triple.Subject, triple.Object);
+                    }
+
+                    // Default values is not checked or added
+
+                    Console.WriteLine(VDS.RDF.Writing.StringWriter.Write(graph, new RdfJsonWriter()));
+                    // validate the data
+                    if (_util.ValidateShacl(graph, graphNameUri))
+                    {
+                        // store the data
+                        if (_util.HasGraph(graphNameUri))
+                        {
+                            _util.ClearGraph(graphNameUri);
+                        }
+                        else
+                        {
+                            _util.CreateNamedGraph(graphNameUri);
+                        }
+
+                        // BaseUri must be set for the sparql query
+                        graph.BaseUri = graphNameUri;
+                        _util.AddGraph(graph);
+
+                        return NoContent();
+                    }
+                    else
+                    {
+                        throw new NotAuthorizedException("Data has the wrong format!");
+                    }
+
+                }
+                else
+                {
+                    throw new NotAuthorizedException("User is no project member!");
+                }
+            }));
+        }
+
+        [HttpGet("[controller]/vocabulary/{resourceId}/{path}")]
+        public IActionResult GetVocabulary(string resourceId, string path)
+        {
+            return Ok(_authenticator.ValidateAndExecute((user) =>
+            {
+                var resource = _resourceModel.GetById(Guid.Parse(resourceId));
+                if (_metadataModel.IsProjectMember(user, resource))
+                {
+                    var graph = _util.GetGraph(HttpUtility.UrlDecode(path));
+
+                    JArray de = new JArray();
+                    foreach (var kv in _util.GetVocabularyLabels(graph, "de"))
+                    {
+                        JObject obj = new JObject
+                        {
+                            ["value"] = kv.Key,
+                            ["name"] = kv.Value
+                        };
+                        de.Add(obj);
+                    }
+
+                    JArray en = new JArray();
+                    foreach(var kv in _util.GetVocabularyLabels(graph, "en"))
+                    {
+                        JObject obj = new JObject
+                        {
+                            ["value"] = kv.Key,
+                            ["name"] = kv.Value
+                        };
+                        en.Add(obj);
+                    }
+
+                    JObject json = new JObject
+                    {
+                        ["de"] = de,
+                        ["en"] = en
+                    };
+
+                    return json;
+                }
+                else
+                {
+                    throw new NotAuthorizedException("User is no project member!");
+                }
+            }));
+        }
+
+    }
+}
diff --git a/src/Project/Controllers/ResourceController.cs b/src/Project/Controllers/ResourceController.cs
index 27c3e13350e3e317c4db119ef305b17022c059b0..3a93201ca146011b80ac067a1cb6491cb9c44849 100644
--- a/src/Project/Controllers/ResourceController.cs
+++ b/src/Project/Controllers/ResourceController.cs
@@ -3,10 +3,10 @@ using Coscine.Api.Project.ReturnObjects;
 using Coscine.ApiCommons;
 using Coscine.ApiCommons.Exceptions;
 using Coscine.ApiCommons.Factories;
-using Coscine.Database.Model;
 using Microsoft.AspNetCore.Mvc;
 using System;
 using System.Linq;
+using Newtonsoft.Json.Linq;
 
 namespace Coscine.Api.Project.Controllers
 {
@@ -116,6 +116,5 @@ namespace Coscine.Api.Project.Controllers
                 }                
             }));
         }
-
     }
 }
diff --git a/src/Project/Models/MetadataModel.cs b/src/Project/Models/MetadataModel.cs
new file mode 100644
index 0000000000000000000000000000000000000000..7383a096780264ed3e53422566cb782a19f740ed
--- /dev/null
+++ b/src/Project/Models/MetadataModel.cs
@@ -0,0 +1,69 @@
+using Coscine.Api.Project.ReturnObjects;
+using Coscine.ApiCommons.Models;
+using Coscine.Database.Model;
+using LinqToDB;
+using System;
+using System.Linq;
+using System.Linq.Expressions;
+
+namespace Coscine.Api.Project.Models
+{
+    public class MetadataModel : DatabaseModel<Resource>
+    {
+
+        public MetadataModel() : base(Program.Configuration)
+        {
+        }
+
+        public override Expression<Func<Resource, Guid>> GetIdFromObject()
+        {
+            throw new NotImplementedException();
+        }
+
+        public override void SetObjectId(Resource databaseObject, Guid id)
+        {
+            throw new NotImplementedException();
+        }
+
+        public override ITable<Resource> GetITableFromDatabase(CoscineDB db)
+        {
+            throw new NotImplementedException();
+        }
+
+        public Resource StoreFromObject(ResourceObject resourceObject)
+        {
+            Resource resource = new Resource()
+            {
+                DisplayName = resourceObject.DisplayName,
+                ResourceName = resourceObject.ResourceName,
+                Keywords = resourceObject.Keywords,
+                UsageRights = resourceObject.UsageRights,
+                TypeId = resourceObject.Type.Id,
+                Type = new ResourceTypeModel().GetById(resourceObject.Type.Id),
+                VisibilityId = resourceObject.Visibility.Id,
+                LicenseId = resourceObject.License.Id
+            };
+
+
+            return resource;
+        }
+
+        public string GenerateId(string resourceId, string filename, string version)
+        {
+            return $"https://purl.org/coscine/md/{resourceId}/{filename}/{version}/";
+        }
+
+        public bool IsProjectMember(User user, Resource resource)
+        {
+            return DatabaseConnection.ConnectToDatabase((db) =>
+            {
+                return (from relation in db.ProjectRoles
+                        where relation.User == user
+                            && (relation.Role.DisplayName == "Owner" || relation.Role.DisplayName == "Member")
+                            && (relation.Project.ProjectResourceProjectIdIds != null && relation.Project.ProjectResourceProjectIdIds.
+                                Any((projectResource) => projectResource.Resource == resource))
+                        select relation).Any();
+            });
+        }
+    }
+}
diff --git a/src/Project/Models/ResourceModel.cs b/src/Project/Models/ResourceModel.cs
index c1ff1877a51940b59b29a06546d899c66f43375f..4516f24186dfc065590abedaed3baa1089aec43f 100644
--- a/src/Project/Models/ResourceModel.cs
+++ b/src/Project/Models/ResourceModel.cs
@@ -14,7 +14,6 @@ namespace Coscine.Api.Project.Models
     {
         public ResourceModel() : base(Program.Configuration)
         {
-
         }
 
         public Resource StoreFromObject(ResourceObject resourceObject)
@@ -131,7 +130,7 @@ namespace Coscine.Api.Project.Models
                 throw new ArgumentException("Not supported resource type!");
             }
         }
-
+        
         private void SetDisciplines(Resource resource, IEnumerable<DisciplineObject> disciplines)
         {
             ResourceDisciplineModel resourceDisciplineModel = new ResourceDisciplineModel();
@@ -162,7 +161,7 @@ namespace Coscine.Api.Project.Models
                         select relation).Any();
             });
         }
-               
+
         public int UpdateByObject(Resource resource, ResourceObject resourceObject)
         {
             if (resourceObject.Disciplines.Count() == 0 || resourceObject.ResourceTypeOption == null)
@@ -183,6 +182,8 @@ namespace Coscine.Api.Project.Models
             resource.Type = new ResourceTypeModel().GetById(resourceObject.Type.Id);
             resource.VisibilityId = resourceObject.Visibility.Id;
             resource.LicenseId = resourceObject.License.Id;
+            resource.ApplicationProfile = resourceObject.ApplicationProfile;
+            resource.FixedValues = resourceObject.FixedValues.ToString();
 
             SetDisciplines(resource, resourceObject.Disciplines);
             SetResourceTypeObject(resource, resourceObject.ResourceTypeOption);
@@ -262,7 +263,9 @@ namespace Coscine.Api.Project.Models
                 disciplines,
                 (resource.Visibility != null) ? new VisibilityObject(resource.Visibility.Id, resource.Visibility.DisplayName) : null,
                 (resource.License != null) ? new LicenseObject(resource.License.Id, resource.License.DisplayName) : null,
-                JObject.FromObject(resourceTypeOptionObject)
+                JObject.FromObject(resourceTypeOptionObject),
+                resource.ApplicationProfile,
+                JToken.Parse(resource.FixedValues)
             );
         }
 
diff --git a/src/Project/Project.csproj b/src/Project/Project.csproj
index 9441cf8f6526ebc422d6750c8444ee85fc75cc11..216ae1db39b2a2c87588c8cb22eca16620952f02 100644
--- a/src/Project/Project.csproj
+++ b/src/Project/Project.csproj
@@ -54,8 +54,8 @@
     <Reference Include="Coscine.Configuration, Version=1.4.0.0, Culture=neutral, PublicKeyToken=ce3d7a32d7dc1e5a, processorArchitecture=MSIL">
       <HintPath>..\packages\Coscine.Configuration.1.4.0\lib\net461\Coscine.Configuration.dll</HintPath>
     </Reference>
-    <Reference Include="Coscine.Database, Version=1.6.0.0, Culture=neutral, PublicKeyToken=767d77427707b70a, processorArchitecture=MSIL">
-      <HintPath>..\packages\Coscine.Database.1.6.0\lib\net461\Coscine.Database.dll</HintPath>
+    <Reference Include="Coscine.Database, Version=1.8.0.0, Culture=neutral, PublicKeyToken=767d77427707b70a, processorArchitecture=MSIL">
+      <HintPath>..\packages\Coscine.Database.1.8.0\lib\net461\Coscine.Database.dll</HintPath>
     </Reference>
     <Reference Include="Coscine.ProxyApi, Version=1.2.0.0, Culture=neutral, processorArchitecture=MSIL">
       <HintPath>..\packages\Coscine.ProxyApi.1.2.0\lib\net461\Coscine.ProxyApi.dll</HintPath>
@@ -63,18 +63,30 @@
     <Reference Include="Coscine.SharePoint.Webparts.Vue, Version=1.4.0.0, Culture=neutral, PublicKeyToken=0fe8d3e516df6d98, processorArchitecture=MSIL">
       <HintPath>..\packages\Coscine.SharePoint.Webparts.Vue.1.4.0\lib\net461\Coscine.SharePoint.Webparts.Vue.dll</HintPath>
     </Reference>
+    <Reference Include="dotNetRDF, Version=2.2.1.0, Culture=neutral, PublicKeyToken=6055ffe4c97cc780, processorArchitecture=MSIL">
+      <HintPath>..\packages\dotNetRDF.2.2.1\lib\net40\dotNetRDF.dll</HintPath>
+    </Reference>
+    <Reference Include="dotNetRDF.Data.Virtuoso, Version=2.2.1.0, Culture=neutral, PublicKeyToken=6055ffe4c97cc780, processorArchitecture=MSIL">
+      <HintPath>..\packages\dotNetRDF.Data.Virtuoso.2.2.1\lib\net40\dotNetRDF.Data.Virtuoso.dll</HintPath>
+    </Reference>
     <Reference Include="EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089, processorArchitecture=MSIL">
       <HintPath>..\packages\EntityFramework.6.2.0\lib\net45\EntityFramework.dll</HintPath>
     </Reference>
     <Reference Include="EntityFramework.SqlServer, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089, processorArchitecture=MSIL">
       <HintPath>..\packages\EntityFramework.6.2.0\lib\net45\EntityFramework.SqlServer.dll</HintPath>
     </Reference>
+    <Reference Include="HtmlAgilityPack, Version=1.8.2.0, Culture=neutral, PublicKeyToken=bd319b19eaf3b43a, processorArchitecture=MSIL">
+      <HintPath>..\packages\HtmlAgilityPack.1.8.2\lib\Net45\HtmlAgilityPack.dll</HintPath>
+    </Reference>
     <Reference Include="linq2db, Version=2.6.4.0, Culture=neutral, PublicKeyToken=e41013125f9e410a, processorArchitecture=MSIL">
       <HintPath>..\packages\linq2db.2.6.4\lib\net46\linq2db.dll</HintPath>
     </Reference>
     <Reference Include="LinqKit, Version=1.1.16.0, Culture=neutral, PublicKeyToken=bc217f8844052a91, processorArchitecture=MSIL">
       <HintPath>..\packages\LinqKit.1.1.16\lib\net45\LinqKit.dll</HintPath>
     </Reference>
+    <Reference Include="Metadata, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL">
+      <HintPath>..\packages\Metadata.1.0.0\lib\net461\Metadata.dll</HintPath>
+    </Reference>
     <Reference Include="Microsoft.AspNetCore, Version=2.2.0.0, Culture=neutral, PublicKeyToken=adb9793829ddae60, processorArchitecture=MSIL">
       <HintPath>..\packages\Microsoft.AspNetCore.2.2.0\lib\netstandard2.0\Microsoft.AspNetCore.dll</HintPath>
     </Reference>
@@ -384,6 +396,7 @@
     </Reference>
     <Reference Include="System.ComponentModel.Composition" />
     <Reference Include="System.ComponentModel.DataAnnotations" />
+    <Reference Include="System.Configuration" />
     <Reference Include="System.Console, Version=4.0.1.1, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
       <HintPath>..\packages\System.Console.4.3.1\lib\net46\System.Console.dll</HintPath>
       <Private>True</Private>
@@ -564,9 +577,16 @@
       <Private>True</Private>
       <Private>True</Private>
     </Reference>
+    <Reference Include="VDS.Common, Version=1.10.0.0, Culture=neutral, PublicKeyToken=ab5f4eb908061bf0, processorArchitecture=MSIL">
+      <HintPath>..\packages\VDS.Common.1.10.0\lib\net40-client\VDS.Common.dll</HintPath>
+    </Reference>
+    <Reference Include="virtado4, Version=4.0.0.0, Culture=neutral, PublicKeyToken=391bf132017ae989, processorArchitecture=MSIL">
+      <HintPath>..\packages\OpenLink.Data.Virtuoso.7.20.3214.1\lib\net40\virtado4.dll</HintPath>
+    </Reference>
   </ItemGroup>
   <ItemGroup>
     <Compile Include="Controllers\DataSourceController.cs" />
+    <Compile Include="Controllers\MetadataController.cs" />
     <Compile Include="Controllers\VisibilityController.cs" />
     <Compile Include="Controllers\InstituteController.cs" />
     <Compile Include="Controllers\DisciplineController.cs" />
@@ -587,6 +607,7 @@
     <Compile Include="Models\ProjectRoleModel.cs" />
     <Compile Include="Models\RDSResourceTypeModel.cs" />
     <Compile Include="Models\ResourceDisciplineModel.cs" />
+    <Compile Include="Models\MetadataModel.cs" />
     <Compile Include="Models\ResourceModel.cs" />
     <Compile Include="Models\ResourceTypeModel.cs" />
     <Compile Include="Models\RoleModel.cs" />
diff --git a/src/Project/ReturnObjects/ResourceObject.cs b/src/Project/ReturnObjects/ResourceObject.cs
index c8c6264636fcde0e394e984c8e6c5383a4abc56b..76e56ead7250e158f47ac107b1dbf8b86ab59001 100644
--- a/src/Project/ReturnObjects/ResourceObject.cs
+++ b/src/Project/ReturnObjects/ResourceObject.cs
@@ -18,8 +18,10 @@ namespace Coscine.Api.Project.ReturnObjects
         public VisibilityObject Visibility { get; set; }
         public LicenseObject License { get; set; }
         public JObject ResourceTypeOption { get; set; }
+        public string ApplicationProfile { get; set; }
+        public JToken FixedValues { get; set; }
 
-        public ResourceObject(Guid id,  string displayName, string resourceName, string keywords, string usageRights, ResourceTypeObject type, IEnumerable<DisciplineObject> disciplines, VisibilityObject visibility, LicenseObject license, JObject resourceTypeOption)
+        public ResourceObject(Guid id,  string displayName, string resourceName, string keywords, string usageRights, ResourceTypeObject type, IEnumerable<DisciplineObject> disciplines, VisibilityObject visibility, LicenseObject license, JObject resourceTypeOption, string applicationProfile, JToken fixedValues)
         {
             Id = id;
 
@@ -34,6 +36,9 @@ namespace Coscine.Api.Project.ReturnObjects
             License = license;
 
             ResourceTypeOption = resourceTypeOption;
+
+            ApplicationProfile = applicationProfile;
+            FixedValues = fixedValues;
         }
     }
 }
diff --git a/src/Project/packages.config b/src/Project/packages.config
index cc0c49a1bc8f02290993ff1c08bf2964551912d8..8d10d75d55fb1d0f54e505dadbe6b6be0b664e37 100644
--- a/src/Project/packages.config
+++ b/src/Project/packages.config
@@ -6,14 +6,18 @@
   <package id="Coscine.Action" version="1.3.1" targetFramework="net472" />
   <package id="Coscine.ApiCommons" version="1.2.1" targetFramework="net472" />
   <package id="Coscine.Configuration" version="1.4.0" targetFramework="net472" />
-  <package id="Coscine.Database" version="1.6.0" targetFramework="net472" />
+  <package id="Coscine.Database" version="1.8.0" targetFramework="net472" />
   <package id="Coscine.ProxyApi" version="1.2.0" targetFramework="net472" />
   <package id="Coscine.SharePoint.Webparts.Vue" version="1.4.0" targetFramework="net472" />
+  <package id="dotNetRDF" version="2.2.1" targetFramework="net472" />
+  <package id="dotNetRDF.Data.Virtuoso" version="2.2.1" targetFramework="net472" />
   <package id="EntityFramework" version="6.2.0" targetFramework="net472" />
+  <package id="HtmlAgilityPack" version="1.8.2" targetFramework="net472" />
   <package id="linq2db" version="2.6.4" targetFramework="net472" />
   <package id="linq2db.SqlServer" version="2.6.4" targetFramework="net472" />
   <package id="linq2db.t4models" version="2.6.4" targetFramework="net472" />
   <package id="LinqKit" version="1.1.16" targetFramework="net472" />
+  <package id="Metadata" version="1.0.0" targetFramework="net472" />
   <package id="Microsoft.AspNetCore" version="2.2.0" targetFramework="net472" />
   <package id="Microsoft.AspNetCore.Antiforgery" version="2.2.0" targetFramework="net472" />
   <package id="Microsoft.AspNetCore.Authentication.Abstractions" version="2.2.0" targetFramework="net472" />
@@ -114,6 +118,7 @@
   <package id="Microsoft.Win32.Registry" version="4.5.0" targetFramework="net472" />
   <package id="Newtonsoft.Json" version="12.0.2" targetFramework="net472" />
   <package id="Newtonsoft.Json.Bson" version="1.0.2" targetFramework="net472" />
+  <package id="OpenLink.Data.Virtuoso" version="7.20.3214.1" targetFramework="net472" />
   <package id="System.AppContext" version="4.3.0" targetFramework="net472" />
   <package id="System.Buffers" version="4.5.0" targetFramework="net472" />
   <package id="System.Collections" version="4.3.0" targetFramework="net472" />
@@ -171,4 +176,5 @@
   <package id="System.Xml.XmlDocument" version="4.3.0" targetFramework="net472" />
   <package id="System.Xml.XPath" version="4.3.0" targetFramework="net472" />
   <package id="System.Xml.XPath.XDocument" version="4.3.0" targetFramework="net472" />
+  <package id="VDS.Common" version="1.10.0" targetFramework="net472" />
 </packages>
\ No newline at end of file