diff --git a/.gitignore b/.gitignore
index d2df1da5b5077d597142e85e19812ba900a4e81c..049d4ff517c43d098d972828e4f34a5fc7473ae0 100644
--- a/.gitignore
+++ b/.gitignore
@@ -268,3 +268,6 @@ __pycache__/
 tools/*
 !tools/packages.config
 dist/
+
+#linq2db
+src/.tools/
diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 70f41bc841fef797f60350032c50e96f2d99fe9b..f7b030abc30bbf114db0df73c58ddd83b02678d8 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -19,15 +19,6 @@ cake:Test:
     - master
     - tags
 
-docs:
-  stage: docs
-  script:
-    - .\publishDocs.ps1 $GITLAB_TOKEN
-  variables:
-    GIT_STRATEGY: clone
-  only:
-    - tags
-
 cake:Release:
   stage: release
   script:
diff --git a/publishDocs.ps1 b/publishDocs.ps1
deleted file mode 100644
index f49b3b93e477ca9d57f7b1163b2bcf246f86d35d..0000000000000000000000000000000000000000
--- a/publishDocs.ps1
+++ /dev/null
@@ -1,19 +0,0 @@
-param(
-    $token
-)
-
-$remoteUrl = git config --get remote.origin.url
-$remoteUrl = $remoteUrl.replace("git@", "")
-$remoteUrl = $remoteUrl -replace "https(.*?)@",""
-$remoteUrl = $remoteUrl.replace(":", "/")
-$remoteUrl = $remoteUrl.replace(".git", ".wiki.git")
-
-$temporaryFolderName = "publishDocsTempFolder"
-
-git clone "https://gitlab-ci-token:$($token)@$($remoteUrl)" $temporaryFolderName
-cd $temporaryFolderName
-Remove-Item *
-cp -r ../docs/* ./
-git add . 
-git commit -m "Docs: Documentation Update" 
-git push
\ No newline at end of file
diff --git a/src/.tools/linq2db.t4models/FirebirdSql.Data.FirebirdClient.dll b/src/.tools/linq2db.t4models/FirebirdSql.Data.FirebirdClient.dll
deleted file mode 100644
index dd8e0105289d37e4be97c1419fd12a2cbc6e00c4..0000000000000000000000000000000000000000
Binary files a/src/.tools/linq2db.t4models/FirebirdSql.Data.FirebirdClient.dll and /dev/null differ
diff --git a/src/.tools/linq2db.t4models/Init.ps1 b/src/.tools/linq2db.t4models/Init.ps1
deleted file mode 100644
index d7e710d55907097cf93d3d3e546801028e12d906..0000000000000000000000000000000000000000
--- a/src/.tools/linq2db.t4models/Init.ps1
+++ /dev/null
@@ -1,9 +0,0 @@
-param($installPath, $toolsPath, $package, $project)
-
-# get the active solution
-$solution           = Get-Interface $dte.Solution ([EnvDTE80.Solution2])
-$solutionPath       = [System.IO.Path]::GetDirectoryName($solution.FullName)
-$linq2dbToolsPath   = [System.IO.Path]::Combine($solutionPath, ".tools", "linq2db.t4models")
-
-# tools copy
-xcopy $("$toolsPath\*.*") $("$linq2dbToolsPath\") /y /e
diff --git a/src/.tools/linq2db.t4models/Microsoft.SqlServer.Types.dll b/src/.tools/linq2db.t4models/Microsoft.SqlServer.Types.dll
deleted file mode 100644
index d4dd789939d82c83eb2720bf5868234ffafca86d..0000000000000000000000000000000000000000
Binary files a/src/.tools/linq2db.t4models/Microsoft.SqlServer.Types.dll and /dev/null differ
diff --git a/src/.tools/linq2db.t4models/MySql.Data.dll b/src/.tools/linq2db.t4models/MySql.Data.dll
deleted file mode 100644
index d97ad46b903f211ecb4e3e09bc44e7128ec887e2..0000000000000000000000000000000000000000
Binary files a/src/.tools/linq2db.t4models/MySql.Data.dll and /dev/null differ
diff --git a/src/.tools/linq2db.t4models/Npgsql.dll b/src/.tools/linq2db.t4models/Npgsql.dll
deleted file mode 100644
index c814b2681c107eac00cbb32812954bc9d163ba73..0000000000000000000000000000000000000000
Binary files a/src/.tools/linq2db.t4models/Npgsql.dll and /dev/null differ
diff --git a/src/.tools/linq2db.t4models/Oracle.ManagedDataAccess.dll b/src/.tools/linq2db.t4models/Oracle.ManagedDataAccess.dll
deleted file mode 100644
index c228b7093fb73194e9bf9689d99b1154a963cf15..0000000000000000000000000000000000000000
Binary files a/src/.tools/linq2db.t4models/Oracle.ManagedDataAccess.dll and /dev/null differ
diff --git a/src/.tools/linq2db.t4models/SQLite.Interop.dll b/src/.tools/linq2db.t4models/SQLite.Interop.dll
deleted file mode 100644
index 5b872055f5a4b1b759bfa0811901675d4c01346b..0000000000000000000000000000000000000000
Binary files a/src/.tools/linq2db.t4models/SQLite.Interop.dll and /dev/null differ
diff --git a/src/.tools/linq2db.t4models/System.Data.SQLite.dll b/src/.tools/linq2db.t4models/System.Data.SQLite.dll
deleted file mode 100644
index 59f3dcc375988dbd291f100bd06f259b88a887e0..0000000000000000000000000000000000000000
Binary files a/src/.tools/linq2db.t4models/System.Data.SQLite.dll and /dev/null differ
diff --git a/src/.tools/linq2db.t4models/System.Threading.Tasks.Extensions.dll b/src/.tools/linq2db.t4models/System.Threading.Tasks.Extensions.dll
deleted file mode 100644
index 6807cbd9ba040b9f721a03d7fbe6bc0ec088d50b..0000000000000000000000000000000000000000
Binary files a/src/.tools/linq2db.t4models/System.Threading.Tasks.Extensions.dll and /dev/null differ
diff --git a/src/.tools/linq2db.t4models/linq2db.dll b/src/.tools/linq2db.t4models/linq2db.dll
deleted file mode 100644
index bcbdac1d0742aad9fe3866797e3036961812b53d..0000000000000000000000000000000000000000
Binary files a/src/.tools/linq2db.t4models/linq2db.dll and /dev/null differ
diff --git a/src/Project.Tests/DefaultControllerTests.cs b/src/Project.Tests/DefaultControllerTests.cs
index 2ec3846c09fb824813529c547918984d17808d7b..16e01dfe3d293de987ca1f073f752e1091cf4191 100644
--- a/src/Project.Tests/DefaultControllerTests.cs
+++ b/src/Project.Tests/DefaultControllerTests.cs
@@ -1,7 +1,7 @@
 using Coscine.Api.Project.Controllers;
-using Coscine.Api.Project.Models;
+using Coscine.Database.Models;
 using Coscine.ApiCommons.Utils;
-using Coscine.Database.Model;
+using Coscine.Database.DataModel;
 using Microsoft.AspNetCore.Http;
 using Microsoft.AspNetCore.Mvc;
 using Microsoft.AspNetCore.Mvc.Controllers;
@@ -14,6 +14,9 @@ using System.IO;
 using System.Linq;
 using System.Management;
 using System.Security.Claims;
+using LinqToDB.Data;
+using Coscine.Database.Settings;
+using Coscine.Configuration;
 
 namespace Coscine.Api.Project.Tests
 {
@@ -21,7 +24,7 @@ namespace Coscine.Api.Project.Tests
     {
         protected T Controller { get; }
 
-        protected readonly List<Coscine.Database.Model.Project> Projects = new List<Coscine.Database.Model.Project>();
+        protected readonly List<Coscine.Database.DataModel.Project> Projects = new List<Coscine.Database.DataModel.Project>();
         protected readonly List<User> Users = new List<User>();
         protected readonly List<ProjectRole> ProjectRoles = new List<ProjectRole>();
         protected readonly List<ResourceType> ResourceTypes = new List<ResourceType>();
@@ -44,6 +47,7 @@ namespace Coscine.Api.Project.Tests
         [OneTimeSetUp]
         public void Setup()
         {
+            DataConnection.DefaultSettings = new CoscineSettings(new ConsulConfiguration());
             DisciplineModel disciplineModel = new DisciplineModel();
             Discipline = new Discipline()
             {
@@ -87,7 +91,7 @@ namespace Coscine.Api.Project.Tests
 
             FakeControllerContext(user);
 
-            var project = new Coscine.Database.Model.Project()
+            var project = new Coscine.Database.DataModel.Project()
             {
                 Description = "Description",
                 ProjectName = "TestProject",
@@ -122,7 +126,7 @@ namespace Coscine.Api.Project.Tests
 
             Projects.Add(projectModel.GetById(project.Id));
 
-            var project2 = new Coscine.Database.Model.Project()
+            var project2 = new Coscine.Database.DataModel.Project()
             {
                 Description = "Description2",
                 ProjectName = "TestProject",
diff --git a/src/Project.Tests/Project.Tests.csproj b/src/Project.Tests/Project.Tests.csproj
index 3755d38c2e7baa734f4d774a74f41fd3dd0909ab..22ce06bf0230a957526f0c5d7e9fa4a7e20be3f9 100644
--- a/src/Project.Tests/Project.Tests.csproj
+++ b/src/Project.Tests/Project.Tests.csproj
@@ -56,17 +56,17 @@
     <Reference Include="Consul, Version=0.7.2.6, Culture=neutral, PublicKeyToken=20a6ad9a81df1d95, processorArchitecture=MSIL">
       <HintPath>..\packages\Consul.0.7.2.6\lib\net45\Consul.dll</HintPath>
     </Reference>
-    <Reference Include="Coscine.Action, Version=1.9.0.0, Culture=neutral, processorArchitecture=AMD64">
-      <HintPath>..\packages\Coscine.Action.1.9.0\lib\net461\Coscine.Action.dll</HintPath>
+    <Reference Include="Coscine.Action, Version=1.10.0.0, Culture=neutral, processorArchitecture=AMD64">
+      <HintPath>..\packages\Coscine.Action.1.10.0\lib\net461\Coscine.Action.dll</HintPath>
     </Reference>
-    <Reference Include="Coscine.ApiCommons, Version=1.5.0.0, Culture=neutral, PublicKeyToken=af4c1345df96546b, processorArchitecture=MSIL">
-      <HintPath>..\packages\Coscine.ApiCommons.1.5.0\lib\net461\Coscine.ApiCommons.dll</HintPath>
+    <Reference Include="Coscine.ApiCommons, Version=1.6.0.0, Culture=neutral, PublicKeyToken=af4c1345df96546b, processorArchitecture=MSIL">
+      <HintPath>..\packages\Coscine.ApiCommons.1.6.0\lib\net461\Coscine.ApiCommons.dll</HintPath>
     </Reference>
     <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.15.1.0, Culture=neutral, PublicKeyToken=767d77427707b70a, processorArchitecture=MSIL">
-      <HintPath>..\packages\Coscine.Database.1.15.1\lib\net461\Coscine.Database.dll</HintPath>
+    <Reference Include="Coscine.Database, Version=1.16.0.0, Culture=neutral, PublicKeyToken=767d77427707b70a, processorArchitecture=MSIL">
+      <HintPath>..\packages\Coscine.Database.1.16.0\lib\net461\Coscine.Database.dll</HintPath>
     </Reference>
     <Reference Include="Coscine.Logging, Version=1.0.1.0, Culture=neutral, PublicKeyToken=e1ed402bc3f6525e, processorArchitecture=MSIL">
       <HintPath>..\packages\Coscine.Logging.1.0.1\lib\net461\Coscine.Logging.dll</HintPath>
@@ -74,14 +74,8 @@
     <Reference Include="Coscine.ProxyApi, Version=1.2.1.0, Culture=neutral, processorArchitecture=MSIL">
       <HintPath>..\packages\Coscine.ProxyApi.1.2.1\lib\net461\Coscine.ProxyApi.dll</HintPath>
     </Reference>
-    <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 Include="Coscine.SharePoint.Webparts.Vue, Version=1.5.0.0, Culture=neutral, PublicKeyToken=0fe8d3e516df6d98, processorArchitecture=MSIL">
+      <HintPath>..\packages\Coscine.SharePoint.Webparts.Vue.1.5.0\lib\net461\Coscine.SharePoint.Webparts.Vue.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>
@@ -95,11 +89,8 @@
     <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 Include="LinqKit, Version=1.1.17.0, Culture=neutral, PublicKeyToken=bc217f8844052a91, processorArchitecture=MSIL">
+      <HintPath>..\packages\LinqKit.1.1.17\lib\net45\LinqKit.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>
@@ -392,11 +383,11 @@
     <Reference Include="Microsoft.Win32.Registry, Version=4.1.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
       <HintPath>..\packages\Microsoft.Win32.Registry.4.5.0\lib\net461\Microsoft.Win32.Registry.dll</HintPath>
     </Reference>
-    <Reference Include="Moq, Version=4.12.0.0, Culture=neutral, PublicKeyToken=69f491c39445e920, processorArchitecture=MSIL">
-      <HintPath>..\packages\Moq.4.12.0\lib\net45\Moq.dll</HintPath>
+    <Reference Include="Moq, Version=4.13.0.0, Culture=neutral, PublicKeyToken=69f491c39445e920, processorArchitecture=MSIL">
+      <HintPath>..\packages\Moq.4.13.1\lib\net45\Moq.dll</HintPath>
     </Reference>
     <Reference Include="Newtonsoft.Json, Version=12.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL">
-      <HintPath>..\packages\Newtonsoft.Json.12.0.2\lib\net45\Newtonsoft.Json.dll</HintPath>
+      <HintPath>..\packages\Newtonsoft.Json.12.0.3\lib\net45\Newtonsoft.Json.dll</HintPath>
     </Reference>
     <Reference Include="Newtonsoft.Json.Bson, Version=1.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL">
       <HintPath>..\packages\Newtonsoft.Json.Bson.1.0.2\lib\net45\Newtonsoft.Json.Bson.dll</HintPath>
@@ -614,8 +605,6 @@
     <Compile Include="DefaultControllerTests.cs" />
     <Compile Include="ProjectControllerTests.cs" />
     <Compile Include="Properties\AssemblyInfo.cs" />
-    <Compile Include="ResourceControllerTests.cs" />
-    <Compile Include="ResourceTypeControllerTests.cs" />
   </ItemGroup>
   <ItemGroup>
     <None Include="app.config" />
diff --git a/src/Project.Tests/ProjectControllerTests.cs b/src/Project.Tests/ProjectControllerTests.cs
index 330df51924bce211087502acf0822ab0a21b99f0..c76c9b272d3c7c0a59c3cf4dd67d9e0819b4faad 100644
--- a/src/Project.Tests/ProjectControllerTests.cs
+++ b/src/Project.Tests/ProjectControllerTests.cs
@@ -1,16 +1,15 @@
 using NUnit.Framework;
 using Coscine.Api.Project.Controllers;
 using Microsoft.AspNetCore.Mvc;
-using Coscine.Api.Project.Models;
+using Coscine.Database.Models;
 using System.Linq;
-using Coscine.Api.Project.ReturnObjects;
+using Coscine.Database.ReturnObjects;
 using System.IO;
 using System;
-using Coscine.ApiCommons.Exceptions;
 using Coscine.ApiCommons.Factories;
 using System.Collections.Generic;
+using Coscine.Database.Util;
 
-#region DupFinder Exclusion
 namespace Coscine.Api.Project.Tests
 {
     [TestFixture]
@@ -266,5 +265,4 @@ namespace Coscine.Api.Project.Tests
             Assert.IsTrue(Previous == projectModel.GetAll().ToArray().Length - Projects.Count);
         }
     }
-}
-#endregion
\ No newline at end of file
+}
\ No newline at end of file
diff --git a/src/Project.Tests/ResourceControllerTests.cs b/src/Project.Tests/ResourceControllerTests.cs
deleted file mode 100644
index e728df469d34ae9fbab590cde0bb0b8e0244fa6c..0000000000000000000000000000000000000000
--- a/src/Project.Tests/ResourceControllerTests.cs
+++ /dev/null
@@ -1,120 +0,0 @@
-using Coscine.Api.Project.Controllers;
-using Coscine.Api.Project.Models;
-using Coscine.Api.Project.ReturnObjects;
-using Coscine.ApiCommons.Exceptions;
-using Coscine.ApiCommons.Factories;
-using Microsoft.AspNetCore.Mvc;
-using Newtonsoft.Json.Linq;
-using NUnit.Framework;
-using System;
-using System.Collections.Generic;
-using System.IO;
-
-namespace Coscine.Api.Project.Tests
-{
-    [TestFixture]
-    public class ResourceControllerTests : DefaultControllerTests<ResourceController>
-    {
-        public ResourceControllerTests() : base(new ResourceController())
-        {
-        }
-
-        [Test]
-        public void TestControllerIndex()
-        {
-            var actionResult = Controller.Index();
-            Assert.IsTrue(actionResult.GetType() == typeof(JsonResult));
-        }
-
-        [Test]
-        public void TestControllerGet()
-        {
-            var actionResult = Controller.Get(Resources[0].Id.ToString());
-            Assert.IsTrue(actionResult.GetType() == typeof(JsonResult));
-
-            JsonResult result = (JsonResult)actionResult;
-            Assert.IsTrue(result.Value.GetType() == typeof(ResourceObject));
-
-            ResourceObject resourceObject = (ResourceObject)result.Value;
-
-            Assert.IsTrue(resourceObject.Id == Resources[0].Id);
-            Assert.IsTrue(resourceObject.DisplayName == Resources[0].DisplayName);
-            Assert.IsTrue(resourceObject.Visibility.DisplayName == Resources[0].Visibility.DisplayName);
-            Assert.IsTrue(resourceObject.Type.Id == Resources[0].Type.Id);
-            Assert.IsTrue(resourceObject.Type.DisplayName == Resources[0].Type.DisplayName);
-        }
-
-
-        [Test]
-        public void TestControllerUpdate()
-        {
-            var actionResult = Controller.Get(Resources[0].Id.ToString());
-            JsonResult result = (JsonResult)actionResult;
-            ResourceObject resourceObject = (ResourceObject)result.Value;
-
-            resourceObject.DisplayName = "OtherName";
-            resourceObject.ResourceTypeOption = JObject.FromObject(new RDSResourceTypeObject(Guid.NewGuid(), "PITLABTTEST", 0));
-
-            Stream stream = ObjectFactory<ResourceObject>.SerializeToStream(resourceObject);
-
-            FakeControllerContext(Users[0], stream);
-
-            actionResult = Controller.Update(Resources[0].Id.ToString());
-            Assert.IsTrue(actionResult.GetType() == typeof(JsonResult));
-
-            // Cleanup
-            stream.Close();
-
-            stream = ObjectFactory<ResourceObject>.SerializeToStream(resourceObject);
-
-            FakeControllerContext(Users[0], stream);
-
-            actionResult = Controller.Update(Resources[1].Id.ToString());
-            Assert.IsTrue(actionResult.GetType() == typeof(UnauthorizedObjectResult));
-
-            // Cleanup
-            stream.Close();
-        }
-
-        [Test]
-        public void TestControllerStoreToProject()
-        {
-            ResourceObject resourceObject = new ResourceObject(
-                Guid.NewGuid(),
-                "Test",
-                "testR",
-                "testD",
-                "keys",
-                "usageR",
-                new ResourceTypeObject(Resources[0].Type.Id, Resources[0].Type.DisplayName, Resources[0].Type.Enabled),
-                new List<DisciplineObject>() { new DisciplineObject(Discipline.Id, Discipline.Url, Discipline.DisplayNameDe, Discipline.DisplayNameEn) },
-                new VisibilityObject(Visibility.Id, Visibility.DisplayName),
-                new LicenseObject(License.Id, License.DisplayName),
-                JObject.FromObject(new RDSResourceTypeObject(Guid.NewGuid(), "PITLABTTEST", 0)),
-                "link",
-                JToken.Parse("{}")
-            );
-
-            Stream stream = ObjectFactory<ResourceObject>.SerializeToStream(resourceObject);
-
-            FakeControllerContext(Users[0], stream);
-
-            var actionResult = Controller.StoreToProject(Projects[0].Id.ToString());
-            Assert.IsTrue(actionResult.GetType() == typeof(JsonResult));
-            JsonResult result = (JsonResult)actionResult;
-            resourceObject = (ResourceObject)result.Value;
-
-            // Cleanup
-            stream.Close();
-
-            stream = ObjectFactory<ResourceObject>.SerializeToStream(resourceObject);
-
-            FakeControllerContext(Users[0], stream);
-
-            actionResult = Controller.Delete(resourceObject.Id.ToString());
-            Assert.IsTrue(actionResult.GetType() == typeof(JsonResult));
-
-            stream.Close();
-        }
-    }
-}
diff --git a/src/Project.Tests/ResourceTypeControllerTests.cs b/src/Project.Tests/ResourceTypeControllerTests.cs
deleted file mode 100644
index 69dc700e7011ee811d28843a2f24c0abf828b81b..0000000000000000000000000000000000000000
--- a/src/Project.Tests/ResourceTypeControllerTests.cs
+++ /dev/null
@@ -1,38 +0,0 @@
-using Coscine.Api.Project.Controllers;
-using Microsoft.AspNetCore.Mvc;
-using NUnit.Framework;
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Text;
-using System.Threading.Tasks;
-
-namespace Coscine.Api.Project.Tests
-{
-    [TestFixture]
-    public class ResourceTypeControllerTests : DefaultControllerTests<ResourceTypeController>
-    {
-        public ResourceTypeControllerTests() : base(new ResourceTypeController())
-        {
-        }
-
-        [Test]
-        public void TestGettingFields()
-        {
-            var actionResult = Controller.Fields(Resources[0].Type.Id.ToString());
-            Assert.IsTrue(actionResult.GetType() == typeof(JsonResult));
-
-            JsonResult result = (JsonResult)actionResult;
-            List<string> fields = (List<string>) result.Value;
-            if(fields.Count() == 2)
-            {
-                Assert.IsTrue(fields[0] == "BucketName");
-                Assert.IsTrue(fields[1] == "Size");
-            }
-            else
-            {
-                Assert.Fail("Wrong field count!");
-            }
-        }
-    }
-}
diff --git a/src/Project.Tests/app.config b/src/Project.Tests/app.config
index 18737b637ddc443065a0f73228d995c78017e929..0b05b46dfcd37c4524d11fa88a90853aa86db5b0 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.15.1.0" newVersion="1.15.1.0" />
+        <bindingRedirect oldVersion="0.0.0.0-1.16.0.0" newVersion="1.16.0.0" />
       </dependentAssembly>
       <dependentAssembly>
         <assemblyIdentity name="System.IdentityModel.Tokens.Jwt" publicKeyToken="31bf3856ad364e35" culture="neutral" />
@@ -100,7 +100,7 @@
       </dependentAssembly>
       <dependentAssembly>
         <assemblyIdentity name="Coscine.SharePoint.Webparts.Vue" publicKeyToken="0fe8d3e516df6d98" culture="neutral" />
-        <bindingRedirect oldVersion="0.0.0.0-1.4.0.0" newVersion="1.4.0.0" />
+        <bindingRedirect oldVersion="0.0.0.0-1.5.0.0" newVersion="1.5.0.0" />
       </dependentAssembly>
       <dependentAssembly>
         <assemblyIdentity name="Microsoft.Extensions.Configuration.Abstractions" publicKeyToken="adb9793829ddae60" culture="neutral" />
@@ -146,6 +146,10 @@
         <assemblyIdentity name="Microsoft.IdentityModel.Logging" publicKeyToken="31bf3856ad364e35" culture="neutral" />
         <bindingRedirect oldVersion="0.0.0.0-5.6.0.0" newVersion="5.6.0.0" />
       </dependentAssembly>
+      <dependentAssembly>
+        <assemblyIdentity name="LinqKit" publicKeyToken="bc217f8844052a91" culture="neutral" />
+        <bindingRedirect oldVersion="0.0.0.0-1.1.17.0" newVersion="1.1.17.0" />
+      </dependentAssembly>
     </assemblyBinding>
   </runtime>
   <entityFramework>
diff --git a/src/Project.Tests/packages.config b/src/Project.Tests/packages.config
index baf1b96a1c2089927302a5a05b2849c5dd1d868c..354c788fa9f08e6d1398a24085cf2a6199539c15 100644
--- a/src/Project.Tests/packages.config
+++ b/src/Project.Tests/packages.config
@@ -4,22 +4,19 @@
   <package id="AutoMapper.Extensions.Microsoft.DependencyInjection" version="6.0.0" targetFramework="net472" />
   <package id="Castle.Core" version="4.4.0" targetFramework="net472" />
   <package id="Consul" version="0.7.2.6" targetFramework="net472" />
-  <package id="Coscine.Action" version="1.9.0" targetFramework="net472" />
-  <package id="Coscine.ApiCommons" version="1.5.0" targetFramework="net472" />
+  <package id="Coscine.Action" version="1.10.0" targetFramework="net472" />
+  <package id="Coscine.ApiCommons" version="1.6.0" targetFramework="net472" />
   <package id="Coscine.Configuration" version="1.4.0" targetFramework="net472" />
-  <package id="Coscine.Database" version="1.15.1" targetFramework="net472" />
+  <package id="Coscine.Database" version="1.16.0" targetFramework="net472" />
   <package id="Coscine.Logging" version="1.0.1" targetFramework="net472" />
   <package id="Coscine.ProxyApi" version="1.2.1" 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="Coscine.SharePoint.Webparts.Vue" version="1.5.0" 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="LinqKit" version="1.1.17" 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" version="2.2.0" targetFramework="net472" />
@@ -122,8 +119,8 @@
   <package id="Microsoft.IdentityModel.Tokens" version="5.6.0" targetFramework="net472" />
   <package id="Microsoft.Net.Http.Headers" version="2.2.0" targetFramework="net472" />
   <package id="Microsoft.Win32.Registry" version="4.5.0" targetFramework="net472" />
-  <package id="Moq" version="4.12.0" targetFramework="net472" />
-  <package id="Newtonsoft.Json" version="12.0.2" targetFramework="net472" />
+  <package id="Moq" version="4.13.1" targetFramework="net472" />
+  <package id="Newtonsoft.Json" version="12.0.3" targetFramework="net472" />
   <package id="Newtonsoft.Json.Bson" version="1.0.2" targetFramework="net472" />
   <package id="NLog" version="4.6.8" targetFramework="net472" />
   <package id="NLog.Config" version="4.6.8" targetFramework="net472" />
diff --git a/src/Project/App.config b/src/Project/App.config
index 904a3bca6a8f977af3cf15ac10f6e77f7938cbf1..1ff23b04ddd41b21a2225cc747a160a0e479e5d3 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.15.1.0" newVersion="1.15.1.0" />
+        <bindingRedirect oldVersion="0.0.0.0-1.16.0.0" newVersion="1.16.0.0" />
       </dependentAssembly>
       <dependentAssembly>
         <assemblyIdentity name="System.IdentityModel.Tokens.Jwt" publicKeyToken="31bf3856ad364e35" culture="neutral" />
@@ -103,7 +103,7 @@
       </dependentAssembly>
       <dependentAssembly>
         <assemblyIdentity name="Coscine.SharePoint.Webparts.Vue" publicKeyToken="0fe8d3e516df6d98" culture="neutral" />
-        <bindingRedirect oldVersion="0.0.0.0-1.3.0.0" newVersion="1.3.0.0" />
+        <bindingRedirect oldVersion="0.0.0.0-1.5.0.0" newVersion="1.5.0.0" />
       </dependentAssembly>
       <dependentAssembly>
         <assemblyIdentity name="Microsoft.Extensions.Configuration.Abstractions" publicKeyToken="adb9793829ddae60" culture="neutral" />
@@ -149,6 +149,10 @@
         <assemblyIdentity name="Microsoft.IdentityModel.Logging" publicKeyToken="31bf3856ad364e35" culture="neutral" />
         <bindingRedirect oldVersion="0.0.0.0-5.6.0.0" newVersion="5.6.0.0" />
       </dependentAssembly>
+      <dependentAssembly>
+        <assemblyIdentity name="LinqKit" publicKeyToken="bc217f8844052a91" culture="neutral" />
+        <bindingRedirect oldVersion="0.0.0.0-1.1.17.0" newVersion="1.1.17.0" />
+      </dependentAssembly>
     </assemblyBinding>
   </runtime>
   <entityFramework>
diff --git a/src/Project/Controllers/DataSourceController.cs b/src/Project/Controllers/DataSourceController.cs
deleted file mode 100644
index 8eb0c2697ef39253c47208c9f4e9a6c72002d369..0000000000000000000000000000000000000000
--- a/src/Project/Controllers/DataSourceController.cs
+++ /dev/null
@@ -1,542 +0,0 @@
-using Coscine.Api.Project.Models;
-using Coscine.Api.Project.ReturnObjects;
-using Coscine.ApiCommons;
-using Coscine.ApiCommons.Factories;
-using Coscine.ApiCommons.Utils;
-using Coscine.Configuration;
-using Coscine.Database.Model;
-using Microsoft.AspNetCore.Authorization;
-using Microsoft.AspNetCore.Mvc;
-using Newtonsoft.Json.Linq;
-using System;
-using System.Collections.Generic;
-using System.IdentityModel.Tokens.Jwt;
-using System.IO;
-using System.Linq;
-using System.Net.Http;
-using System.Net.Http.Headers;
-using System.Text.RegularExpressions;
-using System.Threading.Tasks;
-using System.Web;
-
-#region DupFinder Exclusion
-
-namespace Coscine.Api.Project.Controllers
-{
-    [Authorize]
-    public class DataSourceController : Controller
-    {
-        private readonly IConfiguration _configuration;
-        private readonly JWTHandler _jwtHandler;
-        // make to lazy property
-        private static readonly HttpClient Client;
-        private readonly Authenticator _authenticator;
-        private readonly ResourceModel _resourceModel;
-        private readonly ProjectModel _projectModel;
-
-        static DataSourceController()
-        {
-            Client = new HttpClient
-            {
-                Timeout = TimeSpan.FromMinutes(30)
-            };
-        }
-
-        public DataSourceController()
-        {
-            _configuration = Program.Configuration;
-            _jwtHandler = new JWTHandler(_configuration);
-            _authenticator = new Authenticator(this, _configuration);
-            _resourceModel = new ResourceModel();
-            _projectModel = new ProjectModel();
-        }
-
-        // inferring a ../ (urlencoded) can manipulate the url.
-        // However the constructed signature for s3 won't match and it will not be resolved.
-        // This may be a problem for other provider!
-        [HttpGet("[controller]/{resourceId}/{path}")]
-        public async Task<IActionResult> GetWaterButlerFolder(string resourceId, string path)
-        {
-            var user = _authenticator.GetUser();
-
-            path = FormatPath(path);
-
-            var check = CheckResourceIdAndPath(resourceId, path, out Resource resource);
-            if (check != null)
-            {
-                return check;
-            }
-
-            if (!_resourceModel.HasAccess(user, resource, UserRoles.Owner, UserRoles.Member))
-            {
-                return BadRequest("User does not have permission to the resource.");
-            }
-
-            var authHeader = BuildAuthHeader(resource);
-
-            if (authHeader == null)
-            {
-                return BadRequest($"No provider for: \"{resource.Type.DisplayName}\".");
-            }
-            else
-            {
-                // If the path is null, an empty string is added.
-                string url = $"{_configuration.GetString("coscine/global/waterbutler_url")}{GetResourceTypeName(resource)}{path}";
-
-                var request = new HttpRequestMessage(HttpMethod.Get, url);
-                request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", authHeader);
-
-                // Thread safe according to msdn and HttpCompletionOption sets it to get only headers first.
-                var response = await Client.SendAsync(request, HttpCompletionOption.ResponseHeadersRead);
-                if (response.IsSuccessStatusCode)
-                {
-                    if (response.Content.Headers.Contains("Content-Disposition"))
-                    {
-                        return File(await response.Content.ReadAsStreamAsync(),
-                            response.Content.Headers.GetValues("Content-Type").First());
-                    }
-                    else
-                    {
-                        var data = JObject.Parse(await response.Content.ReadAsStringAsync())["data"];
-                        return Ok(new WaterbutlerObject(path, data));
-                    }
-                }
-                else
-                {
-                    return FailedRequest(response, path);
-                }
-            }
-        }
-
-        // inferring a ../ (urlencoded) can manipulate the url.
-        // However the constructed signature for s3 won't match and it will not be resolved.
-        // This may be a problem for other provider!
-        [HttpPut("[controller]/{resourceId}/{path}")]
-        [DisableRequestSizeLimit]
-        public async Task<IActionResult> PutUploadFile(string resourceId, string path)
-        {
-            var user = _authenticator.GetUser();
-
-            path = FormatPath(path);
-
-            var check = CheckResourceIdAndPath(resourceId, path, out Resource resource);
-            if (check != null)
-            {
-                return check;
-            }
-
-            if(!_resourceModel.HasAccess(user, resource, UserRoles.Owner, UserRoles.Member))
-            {
-                return BadRequest("User does not have permission to the resource.");
-            }
-
-            var authHeader = BuildAuthHeader(resource, new string[] { "gitlab" });
-
-            if (authHeader == null)
-            {
-                return BadRequest($"No provider for: \"{resource.Type.DisplayName}\".");
-            }
-            else
-            {
-                // If the path is null, an empty string is added.
-                string url = $"{_configuration.GetString("coscine/global/waterbutler_url")}{GetResourceTypeName(resource)}/?kind=file&name={path}";
-
-                try
-                {
-                    var response = await UploadFile(url, authHeader, Request.Body);
-                    if (response.IsSuccessStatusCode)
-                    {
-                        return NoContent();
-                    }
-                    else
-                    {
-                        return FailedRequest(response, path);
-                    }
-                }
-                catch (Exception e)
-                {
-                    Console.WriteLine(e);
-                    return BadRequest(e);
-                }
-            }
-        }
-
-        // inferring a ../ (urlencoded) can manipulate the url.
-        // However the constructed signature for s3 won't match and it will not be resolved.
-        // This may be a problem for other provider!
-        [HttpPut("[controller]/{resourceId}/{path}/update")]
-        [DisableRequestSizeLimit]
-        public async Task<IActionResult> PutUpdateFile(string resourceId, string path)
-        {
-            var user = _authenticator.GetUser();
-
-            path = FormatPath(path);
-
-            var check = CheckResourceIdAndPath(resourceId, path, out Resource resource);
-            if (check != null)
-            {
-                return check;
-            }
-
-            if (!_resourceModel.HasAccess(user, resource, UserRoles.Owner, UserRoles.Member))
-            {
-                return BadRequest("User does not have permission to the resource.");
-            }
-
-            var authHeader = BuildAuthHeader(resource, new string[] { "gitlab" });
-
-            if (authHeader == null)
-            {
-                return BadRequest($"No provider for: \"{resource.Type.DisplayName}\".");
-            }
-            else
-            {
-                // If the path is null, an empty string is added.
-                string url = $"{_configuration.GetString("coscine/global/waterbutler_url")}{GetResourceTypeName(resource)}/{path}?kind=file";
-
-                try
-                {
-                    var response = await UploadFile(url, authHeader, Request.Body);
-                    if (response.IsSuccessStatusCode)
-                    {
-                        return NoContent();
-                    }
-                    else
-                    {
-                        return FailedRequest(response, path);
-                    }
-                }
-                catch (Exception e)
-                {
-                    Console.WriteLine(e);
-                    return BadRequest(e);
-                }
-            }
-        }
-
-        private string FormatPath(string path)
-        {
-            if (!string.IsNullOrWhiteSpace(path))
-            {
-                path = HttpUtility.UrlDecode(path);
-                path = path.Replace(@"\", "/");
-            }
-
-            return path;
-        }
-
-        private string GetResourceTypeName(Resource resource)
-        {
-            if (resource.Type.DisplayName.ToLower().Equals("s3")) {
-                return "rds";
-            }
-            else
-            {
-                return resource.Type.DisplayName.ToLower();
-            }
-        }
-
-        private string GetResourceTypeName(JToken resource)
-        {
-            if (resource["type"]["displayName"].ToString().ToLower().Equals("s3"))
-            {
-                return "rds";
-            }
-            else
-            {
-                return resource["type"]["displayName"].ToString().ToLower();
-            }
-        }
-
-
-        public async Task<HttpResponseMessage> UploadFile(string url, string authHeader, Stream stream)
-        {
-            var request = new HttpRequestMessage(HttpMethod.Put, url);
-            request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", authHeader);
-            request.Content = new StreamContent(stream);
-            return await Client.SendAsync(request, HttpCompletionOption.ResponseHeadersRead);
-        }
-
-        [HttpDelete("[controller]/{resourceId}/{path}")]
-        public async Task<IActionResult> Delete(string resourceId, string path)
-        {
-            var user = _authenticator.GetUser();
-
-            path = FormatPath(path);
-
-            var check = CheckResourceIdAndPath(resourceId, path, out Resource resource);
-            if (check != null)
-            {
-                return check;
-            }
-
-            if (!_resourceModel.HasAccess(user, resource, UserRoles.Owner, UserRoles.Member))
-            {
-                return BadRequest("User does not have permission to the resource.");
-            }
-
-            var authHeader = BuildAuthHeader(resource, new string[] { "gitlab" });
-
-            if (authHeader == null)
-            {
-                return BadRequest($"No provider for: \"{resource.Type.DisplayName}\".");
-            }
-            else
-            {
-                // If the path is null, an empty string is added.
-                string url = $"{_configuration.GetString("coscine/global/waterbutler_url")}{GetResourceTypeName(resource)}{path}";
-
-                var request = new HttpRequestMessage(HttpMethod.Delete, url);
-                request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", authHeader);
-
-                // Thread safe according to msdn and HttpCompletionOption sets it to get only headers first.
-                try
-                {
-                    var response = await Client.SendAsync(request, HttpCompletionOption.ResponseHeadersRead);
-                    if (response.IsSuccessStatusCode)
-                    {
-                        return NoContent();
-                    }
-                    else
-                    {
-                        return FailedRequest(response, path);
-                    }
-                }
-                catch (Exception e)
-                {
-                    Console.WriteLine(e);
-                    return BadRequest(e);
-                }
-            }
-        }
-
-        [HttpPost("[controller]/validate")]
-        public async Task<IActionResult> IsResourceValid()
-        {
-            var path = "/";
-
-            JToken resource = ObjectFactory<JToken>.DeserializeFromStream(Request.Body);
-
-            string authHeader = null;
-            if (resource["type"]["displayName"].ToString().ToLower() == "s3")
-            {
-                S3ResourceType s3ResourceType = new S3ResourceType();
-                s3ResourceType.BucketName = resource["resourceTypeOption"]["BucketName"].ToString();
-                s3ResourceType.AccessKey = resource["resourceTypeOption"]["AccessKey"].ToString();
-                s3ResourceType.SecretKey = resource["resourceTypeOption"]["SecretKey"].ToString();
-                authHeader = BuildS3AuthHeader(s3ResourceType);
-            }
-            else if (resource["type"]["displayName"].ToString().ToLower() == "gitlab")
-            {
-                GitlabResourceType gitlabResourceType = new GitlabResourceType
-                {
-                    RepositoryNumber = (int)resource["resourceTypeOption"]["RepositoryNumber"],
-                    RepositoryUrl = resource["resourceTypeOption"]["RepositoryUrl"].ToString(),
-                    Token = resource["resourceTypeOption"]["Token"].ToString()
-                };
-                authHeader = BuildGitlabAuthHeader(gitlabResourceType);
-            }
-
-            if (authHeader == null)
-            {
-                return BadRequest($"No provider for: \"{resource["type"]["displayName"].ToString()}\".");
-            }
-            else
-            {
-                // If the path is null, an empty string is added.
-                string url = $"{_configuration.GetString("coscine/global/waterbutler_url")}{GetResourceTypeName(resource)}{path}";
-
-                var request = new HttpRequestMessage(HttpMethod.Get, url);
-                request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", authHeader);
-
-                // Thread safe according to msdn and HttpCompletionOption sets it to get only headers first.
-                var response = await Client.SendAsync(request, HttpCompletionOption.ResponseHeadersRead);
-                if (response.IsSuccessStatusCode)
-                {
-                    if (response.Content.Headers.Contains("Content-Disposition"))
-                    {
-                        return File(await response.Content.ReadAsStreamAsync(),
-                            response.Content.Headers.GetValues("Content-Type").First());
-                    }
-                    else
-                    {
-                        var data = JObject.Parse(await response.Content.ReadAsStringAsync())["data"];
-                        return Ok(new WaterbutlerObject(path, data));
-                    }
-                }
-                else
-                {
-                    return FailedRequest(response, path);
-                }
-            }
-        }
-
-        private IActionResult FailedRequest(HttpResponseMessage response, string path)
-        {
-            if (response.StatusCode == System.Net.HttpStatusCode.NotFound)
-            {
-                return NotFound($"Could not find object for: \"{path}\".");
-            }
-            else if (response.StatusCode == System.Net.HttpStatusCode.Forbidden)
-            {
-                return Forbid("Not allowed to access the datasource.");
-            }
-            else
-            {
-                return BadRequest($"Error in communication with waterbutler: {response.StatusCode}");
-            }
-        }
-
-        private IActionResult CheckResourceIdAndPath(string resourceId, string path, out Resource resource)
-        {
-            resource = null;
-
-            if (string.IsNullOrWhiteSpace(path))
-            {
-                return BadRequest($"Your path \"{path}\" is empty.");
-            }
-
-            Regex rgx = new Regex(@"[\:?*<>|]+");
-            if (rgx.IsMatch(path))
-            {
-                return BadRequest($"Your path \"{path}\" contains bad characters. The following characters are not permissible: {@"\/:?*<>|"}.");
-            }
-
-            if (!Guid.TryParse(resourceId, out Guid resourceGuid))
-            {
-                return BadRequest($"{resourceId} is not a guid.");
-            }
-
-            try
-            {
-                resource = _resourceModel.GetById(resourceGuid);
-                if (resource == null)
-                {
-                    return NotFound($"Could not find resource with id: {resourceId}");
-                }
-            }
-            catch (Exception)
-            {
-                return NotFound($"Could not find resource with id: {resourceId}");
-            }
-
-            if (resource.Type == null)
-            {
-                ResourceTypeModel resourceTypeModel = new ResourceTypeModel();
-                resource.Type = resourceTypeModel.GetById(resource.TypeId);
-            }
-
-            // All good
-            return null;
-        }
-
-        private string BuildWaterbutlerPayload(Dictionary<string, object> auth, Dictionary<string, object> credentials, Dictionary<string, object> settings)
-        {
-            var data = new Dictionary<string, object>
-            {
-                { "auth", auth },
-                { "credentials", credentials },
-                { "settings", settings },
-                { "callback_url", "rwth-aachen.de" }
-            };
-
-            var payload = new JwtPayload
-            {
-                { "data", data }
-            };
-
-            return _jwtHandler.GenerateJwtToken(payload);
-        }
-
-        private string BuildAuthHeader(Resource resource, IEnumerable<string> exclude = null)
-        {
-            if (exclude != null && exclude.Contains(resource.Type.DisplayName.ToLower()))
-            {
-                return null;
-            }
-
-            string authHeader = null;
-            if (resource.Type.DisplayName.ToLower() == "rds")
-            {
-                RDSResourceTypeModel rdsResourceTypeModel = new RDSResourceTypeModel();
-                var rdsResourceType = rdsResourceTypeModel.GetById(resource.ResourceTypeOptionId.Value);
-
-                authHeader = BuildRdsAuthHeader(rdsResourceType);
-            }
-            else if (resource.Type.DisplayName.ToLower() == "s3")
-            {
-                S3ResourceTypeModel s3ResourceTypeModel = new S3ResourceTypeModel();
-                var s3ResourceType = s3ResourceTypeModel.GetById(resource.ResourceTypeOptionId.Value);
-
-                authHeader = BuildS3AuthHeader(s3ResourceType);
-            }
-            else if (resource.Type.DisplayName.ToLower() == "gitlab")
-            {
-                GitlabResourceTypeModel gitlabResourceTypeModel = new GitlabResourceTypeModel();
-                var gitlabResourceType = gitlabResourceTypeModel.GetById(resource.ResourceTypeOptionId.Value);
-
-                authHeader = BuildGitlabAuthHeader(gitlabResourceType);
-            }
-
-            return authHeader;
-        }
-
-        private string BuildRdsAuthHeader(RDSResourceType rdsResourceType)
-        {
-            var auth = new Dictionary<string, object>();
-
-            var credentials = new Dictionary<string, object>
-            {
-                { "access_key", _configuration.GetStringAndWait("coscine/global/buckets/accessKey") },
-                { "secret_key", _configuration.GetStringAndWait("coscine/global/buckets/secretKey") }
-            };
-
-            var settings = new Dictionary<string, object>
-            {
-                { "bucket", rdsResourceType.BucketName }
-            };
-
-            return BuildWaterbutlerPayload(auth, credentials, settings);
-        }
-
-        private string BuildS3AuthHeader(S3ResourceType s3ResourceType)
-        {
-            var auth = new Dictionary<string, object>();
-
-            var credentials = new Dictionary<string, object>
-            {
-                { "access_key", s3ResourceType.AccessKey },
-                { "secret_key", s3ResourceType.SecretKey }
-            };
-
-            var settings = new Dictionary<string, object>
-            {
-                { "bucket", s3ResourceType.BucketName }
-            };
-
-            return BuildWaterbutlerPayload(auth, credentials, settings);
-        }
-
-        private string BuildGitlabAuthHeader(GitlabResourceType gitlabResourceType)
-        {
-
-            var auth = new Dictionary<string, object>();
-
-            var credentials = new Dictionary<string, object>
-            {
-                { "token", gitlabResourceType.Token }
-            };
-
-            var settings = new Dictionary<string, object>
-            {
-                { "owner", "Tester"},
-                { "repo", gitlabResourceType.RepositoryUrl},
-                { "repo_id", gitlabResourceType.RepositoryNumber.ToString()},
-                { "host", "https://git.rwth-aachen.de"}
-            };
-
-            return BuildWaterbutlerPayload(auth, credentials, settings);
-        }
-    }
-}
-#endregion
diff --git a/src/Project/Controllers/DisciplineController.cs b/src/Project/Controllers/DisciplineController.cs
index 34ae92d571cd01013de3d444e6e42b1eed827348..6650df79f51c94dabfd279eaa75e1464f3665fab 100644
--- a/src/Project/Controllers/DisciplineController.cs
+++ b/src/Project/Controllers/DisciplineController.cs
@@ -1,5 +1,5 @@
-using Coscine.Api.Project.Models;
-using Coscine.Api.Project.ReturnObjects;
+using Coscine.Database.Models;
+using Coscine.Database.ReturnObjects;
 using Microsoft.AspNetCore.Authorization;
 using Microsoft.AspNetCore.Mvc;
 using System.Linq;
diff --git a/src/Project/Controllers/InstituteController.cs b/src/Project/Controllers/InstituteController.cs
index 2fff9d6f9256c56de08db5b49bb6b9999cfcd077..671e6c8c9d704faf2956998856f683d1e532f682 100644
--- a/src/Project/Controllers/InstituteController.cs
+++ b/src/Project/Controllers/InstituteController.cs
@@ -1,5 +1,5 @@
-using Coscine.Api.Project.Models;
-using Coscine.Api.Project.ReturnObjects;
+using Coscine.Database.Models;
+using Coscine.Database.ReturnObjects;
 using Microsoft.AspNetCore.Authorization;
 using Microsoft.AspNetCore.Mvc;
 using System.Linq;
diff --git a/src/Project/Controllers/LicenseController.cs b/src/Project/Controllers/LicenseController.cs
index c4210d9876bfaba22baf91813ba49b5dad38c24a..ce19251bdaf4f7c106059a5f47e115a625077eea 100644
--- a/src/Project/Controllers/LicenseController.cs
+++ b/src/Project/Controllers/LicenseController.cs
@@ -1,5 +1,5 @@
-using Coscine.Api.Project.Models;
-using Coscine.Api.Project.ReturnObjects;
+using Coscine.Database.Models;
+using Coscine.Database.ReturnObjects;
 using Microsoft.AspNetCore.Authorization;
 using Microsoft.AspNetCore.Mvc;
 using System.Linq;
diff --git a/src/Project/Controllers/MetadataController.cs b/src/Project/Controllers/MetadataController.cs
deleted file mode 100644
index db5099ae32f7d84448fc1bf2032efc459b2aa211..0000000000000000000000000000000000000000
--- a/src/Project/Controllers/MetadataController.cs
+++ /dev/null
@@ -1,254 +0,0 @@
-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 Microsoft.AspNetCore.Authorization;
-
-namespace Coscine.Api.Project.Controllers
-{
-
-    [Authorize]
-    public class MetadataController : Controller
-    {
-        private readonly Authenticator _authenticator;
-        private readonly MetadataModel _metadataModel;
-        private readonly ResourceModel _resourceModel;
-        private readonly ProjectModel _projectModel;
-        private readonly Util _util;
-
-        public MetadataController()
-        {
-            _authenticator = new Authenticator(this, Program.Configuration);
-            _metadataModel = new MetadataModel();
-            _resourceModel = new ResourceModel();
-            _projectModel = new ProjectModel();
-            _util = new Util();
-        }
-
-        [Route("[controller]")]
-        public IActionResult Index()
-        {
-            return NoContent();
-        }
-
-        // returns the basic application profile
-        [HttpGet("[controller]/resource/{projectId}/ap/{applicationProfileId}")]
-        public IActionResult GetApplicationProfile(Guid projectId, string applicationProfileId)
-        {
-            var user = _authenticator.GetUser();
-
-            if (_projectModel.HasAccess(user, _projectModel.GetById(projectId), UserRoles.Owner, UserRoles.Member))
-            {
-                var graph = _util.GetGraph(HttpUtility.UrlDecode(applicationProfileId));                
-
-                var json = JToken.Parse(VDS.RDF.Writing.StringWriter.Write(graph, new RdfJsonWriter()));
-                
-                return Json(json);
-            }
-            else
-            {
-                throw new NotAuthorizedException("User is no project member!");
-            }
-
-        }
-
-        // returns the application profile with the fixed values
-        [HttpGet("[controller]/resource/{resourceId}/apc/{applicationProfileId}")]
-        public IActionResult GetApplicationProfileComplete(string resourceId, string applicationProfileId)
-        {
-            var user = _authenticator.GetUser();
-
-            var resource = _resourceModel.GetById(Guid.Parse(resourceId));
-            if (_resourceModel.HasAccess(user, resource, UserRoles.Owner, UserRoles.Member) && applicationProfileId != null)
-            {
-                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]/project/{projectId}/aplist/")]
-        public IActionResult ListAllApplicationProfiles(Guid projectId)
-        {
-            var user = _authenticator.GetUser();
-            if (_projectModel.HasAccess(user, _projectModel.GetById(projectId), UserRoles.Owner, UserRoles.Member))
-            {
-                var graphUris = _util.ListGraphs();
-
-                return Json(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)
-        {
-            var user = _authenticator.GetUser();
-            var resource = _resourceModel.GetById(Guid.Parse(resourceId));
-            if (_resourceModel.HasAccess(user, resource, UserRoles.Owner, UserRoles.Member))
-            {
-                var id = _metadataModel.GenerateId(resourceId, filename, version);
-                var uri = _metadataModel.CreateUri(id);
-                var graph = _util.GetGraph(uri);
-                return Json(JToken.Parse(VDS.RDF.Writing.StringWriter.Write(graph, new RdfJsonWriter())).ToString());
-            }
-            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)
-        {
-            var innerBlock = ObjectFactory<JToken>.DeserializeFromStream(Request.Body);
-            var graphName = _metadataModel.GenerateId(resourceId, filename, version);
-            var graphNameUri = _metadataModel.CreateUri(graphName);
-            var json = new JObject
-            {
-                [graphName] = innerBlock
-            };
-
-            var user = _authenticator.GetUser();
-            var resource = _resourceModel.GetById(Guid.Parse(resourceId));
-                
-            if (_resourceModel.HasAccess(user, resource, UserRoles.Owner, UserRoles.Member))
-            {
-                json[graphName]["http://www.w3.org/1999/02/22-rdf-syntax-ns#type"] = new JArray
-                {
-                    new JObject
-                    {
-                        ["value"] = resource.ApplicationProfile.Substring(0, resource.ApplicationProfile.Length-1),
-                        ["type"] = "uri"
-                    }
-                };
-                // throw bad request if empty node value is detected
-                JToken root = json.First.First;
-                foreach (var node in root)
-                {
-                    string nodeValue = node.First.First["value"].ToString().ToLower();
-                    if (String.IsNullOrEmpty(nodeValue))
-                    {
-                        throw new ArgumentException("Empty values in application profile are not accepted.");
-                    }
-                }
-
-                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
-
-                // 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/{projectId}/{path}")]
-        public IActionResult GetVocabulary(Guid projectId, string path)
-        {
-            var user = _authenticator.GetUser();
-            if (_projectModel.HasAccess(user, _projectModel.GetById(projectId), UserRoles.Owner, UserRoles.Member))
-            {
-                var graph = _util.GetGraph(HttpUtility.UrlDecode(path));
-
-                var de = new JArray();
-                foreach (var kv in _util.GetVocabularyLabels(graph, "de"))
-                {
-                    JObject obj = new JObject
-                    {
-                        ["value"] = kv.Key,
-                        ["name"] = kv.Value
-                    };
-                    de.Add(obj);
-                }
-
-                var 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(json);
-            }
-            else
-            {
-                throw new NotAuthorizedException("User is no project member!");
-            }
-        }
-
-    }
-}
diff --git a/src/Project/Controllers/ProjectController.cs b/src/Project/Controllers/ProjectController.cs
index 19556cc27e9a632b7bbcbc238a68673812ed1f3e..5a6c3a827caf41717c4b660365da98d6d3605228 100644
--- a/src/Project/Controllers/ProjectController.cs
+++ b/src/Project/Controllers/ProjectController.cs
@@ -1,7 +1,7 @@
 using Coscine.Action;
 using Coscine.Action.EventArgs;
-using Coscine.Api.Project.Models;
-using Coscine.Api.Project.ReturnObjects;
+using Coscine.Database.Models;
+using Coscine.Database.ReturnObjects;
 using Coscine.ApiCommons;
 using Coscine.ApiCommons.Factories;
 using Microsoft.AspNetCore.Mvc;
@@ -9,6 +9,7 @@ using System;
 using System.Linq;
 using Coscine.Configuration;
 using Microsoft.AspNetCore.Authorization;
+using Coscine.Database.Util;
 
 namespace Coscine.Api.Project.Controllers
 {
@@ -120,12 +121,12 @@ namespace Coscine.Api.Project.Controllers
             }
         }
 
-        public void DeleteProject(Database.Model.Project project, bool isHard = false, bool propegateAction = true)
+        public void DeleteProject(Database.DataModel.Project project, bool isHard = false, bool propegateAction = true)
         {
             var subProjectModel = new SubProjectModel();
             foreach(var subProject in subProjectModel.GetAllWhere((subProject) => subProject.ProjectId == project.Id))
             {
-                Database.Model.Project subProjectObject;
+                Database.DataModel.Project subProjectObject;
                 if (isHard)
                 {
                     subProjectModel.Delete(subProject);
diff --git a/src/Project/Controllers/ProjectRoleController.cs b/src/Project/Controllers/ProjectRoleController.cs
index 4dca837349c9e050fa3be359c769b75d98f7883a..ecb48d77371fe361fe985d47a3cf63e0d8f3b9f8 100644
--- a/src/Project/Controllers/ProjectRoleController.cs
+++ b/src/Project/Controllers/ProjectRoleController.cs
@@ -1,7 +1,7 @@
 using Coscine.Action;
 using Coscine.Action.EventArgs;
-using Coscine.Api.Project.Models;
-using Coscine.Api.Project.ReturnObjects;
+using Coscine.Database.Models;
+using Coscine.Database.ReturnObjects;
 using Coscine.ApiCommons;
 using Coscine.ApiCommons.Factories;
 using Coscine.Configuration;
@@ -9,6 +9,7 @@ using Microsoft.AspNetCore.Authorization;
 using Microsoft.AspNetCore.Mvc;
 using System;
 using System.Linq;
+using Coscine.Database.Util;
 
 namespace Coscine.Api.Project.Controllers
 {
diff --git a/src/Project/Controllers/ResourceController.cs b/src/Project/Controllers/ResourceController.cs
deleted file mode 100644
index bee1704f7c615a3a9817b430c0fa8ee9d7dba8dc..0000000000000000000000000000000000000000
--- a/src/Project/Controllers/ResourceController.cs
+++ /dev/null
@@ -1,149 +0,0 @@
-using Coscine.Api.Project.Models;
-using Coscine.Api.Project.ReturnObjects;
-using Coscine.ApiCommons;
-using Coscine.ApiCommons.Factories;
-using Microsoft.AspNetCore.Mvc;
-using System;
-using System.Linq;
-using Coscine.Action;
-using Coscine.Configuration;
-using Coscine.Action.EventArgs;
-using Microsoft.AspNetCore.Authorization;
-using Newtonsoft.Json.Linq;
-using Coscine.Database.Model;
-
-namespace Coscine.Api.Project.Controllers
-{
-    [Authorize]
-    public class ResourceController : Controller
-    {
-        private readonly Authenticator _authenticator;
-        private readonly ResourceModel _resourceModel;
-        private readonly IConfiguration _configuration;
-        private readonly Emitter _emitter;
-
-        public ResourceController()
-        {
-            _authenticator = new Authenticator(this, Program.Configuration);
-            _configuration = Program.Configuration;
-            _resourceModel = new ResourceModel();
-            _emitter = new Emitter(this._configuration);
-        }
-
-        [Route("[controller]")]
-        public IActionResult Index()
-        {
-            var user = _authenticator.GetUser();
-            return Json(_resourceModel.GetAllWhere((resource) =>
-                (from projectResource in resource.ProjectResourceResourceIdIds
-                 where (from projectRole in projectResource.Project.ProjectRolesProjectIdIds
-                        where projectRole.User == user
-                        && (projectRole.Role.DisplayName == "Owner" || projectRole.Role.DisplayName == "Member")
-                        select projectRole).Any()
-                 select projectResource).Any()
-            ).Select((resource) => _resourceModel.CreateReturnObjectFromDatabaseObject(resource)));
-        }
-
-
-        [HttpGet("[controller]/{id}")]
-        public IActionResult Get(string id)
-        {
-            var resource = _resourceModel.GetById(Guid.Parse(id));
-            var user = _authenticator.GetUser();
-            if (_resourceModel.HasAccess(user, resource, UserRoles.Owner, UserRoles.Member))
-            {
-                _resourceModel.SetType(resource);
-                return Json(_resourceModel.CreateReturnObjectFromDatabaseObject(resource));
-            }
-            else
-            {
-                return Unauthorized("User does not own resource!");
-            }
-        }
-
-        [HttpGet("[controller]/resource/{id}/isCreator")]
-        public IActionResult IsUserResourceCreator(string id)
-        {
-            Resource resource = _resourceModel.GetById(Guid.Parse(id));
-            var user = _authenticator.GetUser();
-            var json = new JObject
-            {
-                ["isResourceCreator"] = resource.Creator.Equals(user.Id)
-            };
-            return Json(json);
-        }
-
-        [HttpPost("[controller]/{id}")]
-        public IActionResult Update(string id)
-        {
-            var resourceObject = ObjectFactory<ResourceObject>.DeserializeFromStream(Request.Body);
-            var resource = _resourceModel.GetById(Guid.Parse(id));
-            var user = _authenticator.GetUser();
-
-            if (_resourceModel.HasAccess(user, resource, UserRoles.Owner) ||
-                (_resourceModel.HasAccess(user, resource, UserRoles.Member) && resource.Creator.Equals(user.Id)))
-            {
-                return Json(_resourceModel.UpdateByObject(resource, resourceObject));
-            }
-            else
-            {
-                return Unauthorized("The user is not authorized to perform an update on the selected resource!");
-            }
-        }
-
-        [HttpDelete("[controller]/{id}")]
-        public IActionResult Delete(string id)
-        {
-            var resource = _resourceModel.GetById(Guid.Parse(id));
-            var user = _authenticator.GetUser();
-            if (_resourceModel.HasAccess(user, resource, UserRoles.Owner) ||
-                (_resourceModel.HasAccess(user, resource, UserRoles.Member) && resource.Creator.Equals(user.Id)))
-            {
-                var returnObject = _resourceModel.CreateReturnObjectFromDatabaseObject(resource);
-                _emitter.EmitResourceDelete(new ResourceEventArgs(_configuration)
-                {
-                    Resource = resource
-                });
-                _resourceModel.DeleteResource(resource);
-                return Json(returnObject);
-            }
-            else
-            {
-                return Unauthorized("The user is not authorized to perform an update on the selected resource!");
-            }
-        }
-
-        [HttpPost("[controller]/project/{projectId}")]
-        public IActionResult StoreToProject(string projectId)
-        {
-            var resourceObject = ObjectFactory<ResourceObject>.DeserializeFromStream(Request.Body);
-            var projectModel = new ProjectModel();
-            var resourceTypeModel = new ResourceTypeModel();
-            var isResourceEnabled = resourceTypeModel.GetById(resourceObject.Type.Id).Enabled;
-            var project = projectModel.GetById(Guid.Parse(projectId));
-            var user = _authenticator.GetUser();
-
-            if (projectModel.HasAccess(user, project, UserRoles.Owner, UserRoles.Member))
-            {
-                if (!isResourceEnabled)
-                {
-                    return Unauthorized("The user is not authorized to add a new resource of this type to the selected project!");
-                }
-                resourceObject.Creator = user.Id;
-                var resource = _resourceModel.StoreFromObject(resourceObject);
-                projectModel.AddResource(project, resource);
-
-                _emitter.EmitResourceCreate(new ResourceEventArgs(_configuration)
-                {
-                    Resource = resource
-                });
-
-                return Json(_resourceModel.CreateReturnObjectFromDatabaseObject(resource));
-            }
-            else
-            {
-                return Unauthorized("The user is not authorized to add a new resource to the selected project!");
-            }
-        }
-    }
-}
diff --git a/src/Project/Controllers/ResourceTypeController.cs b/src/Project/Controllers/ResourceTypeController.cs
deleted file mode 100644
index 4fb4237ebc4defb35baed99034d0a24b73cfb2dc..0000000000000000000000000000000000000000
--- a/src/Project/Controllers/ResourceTypeController.cs
+++ /dev/null
@@ -1,70 +0,0 @@
-using Coscine.Api.Project.Models;
-using Coscine.Api.Project.ReturnObjects;
-using Coscine.ApiCommons;
-using Microsoft.AspNetCore.Authorization;
-using Microsoft.AspNetCore.Mvc;
-using System;
-using System.Linq;
-
-namespace Coscine.Api.Project.Controllers
-{
-    [Authorize]
-    public class ResourceTypeController : Controller
-    {
-        private readonly Authenticator _authenticator;
-        private readonly ResourceTypeModel _resourceTypeModel;
-
-        public ResourceTypeController()
-        {
-            _authenticator = new Authenticator(this, Program.Configuration);
-            _resourceTypeModel = new ResourceTypeModel();
-        }
-
-
-        [Route("[controller]")]
-        public IActionResult Index()
-        {
-                return Json(_resourceTypeModel.GetAll()
-                    .Select((resourceType) => new ResourceTypeObject(resourceType.Id, resourceType.DisplayName, resourceType.Enabled)));
-        }
-
-        [Route("[controller]/enabled")]
-        public IActionResult GetEnabledResourceTypes()
-        {
-            return Json(_resourceTypeModel.GetAllWhere((resourceType) => (resourceType.Enabled == true))
-                .Select((resourceType) => new ResourceTypeObject(resourceType.Id, resourceType.DisplayName, resourceType.Enabled)));
-        }
-
-        [Route("[controller]/{id}/fields")]
-        public IActionResult Fields(string id)
-        {
-            var resourceType = _resourceTypeModel.GetById(Guid.Parse(id));
-
-                if (resourceType.DisplayName == "s3")
-                {
-                    return Json(Type.GetType("Coscine.Api.Project.ReturnObjects.S3ResourceTypeObject").GetProperties()
-                            .Where((property) => property.Name != "Id")
-                            .Select((property) => property.Name)
-                            .ToList());
-                }
-                else if (resourceType.DisplayName == "rds")
-                {
-                    return Json(Type.GetType("Coscine.Api.Project.ReturnObjects.RDSResourceTypeObject").GetProperties()
-                            .Where((property) => property.Name != "Id")
-                            .Select((property) => property.Name)
-                            .ToList());
-                }
-                else if(resourceType.DisplayName == "gitlab")
-                {
-                    return Json(Type.GetType("Coscine.Api.Project.ReturnObjects.GitlabResourceTypeObject").GetProperties()
-                            .Where((property) => property.Name != "Id")
-                            .Select((property) => property.Name)
-                            .ToList());
-                }
-                else
-                {
-                    throw new ArgumentException("Invalid Resource Type!");
-                }
-        }
-    }
-}
diff --git a/src/Project/Controllers/RoleController.cs b/src/Project/Controllers/RoleController.cs
index d2596276883d053ca450895743a8847766cf9cd6..bbd738181f90ff5227934aa72067f97d5467e4d9 100644
--- a/src/Project/Controllers/RoleController.cs
+++ b/src/Project/Controllers/RoleController.cs
@@ -1,5 +1,5 @@
-using Coscine.Api.Project.Models;
-using Coscine.Api.Project.ReturnObjects;
+using Coscine.Database.Models;
+using Coscine.Database.ReturnObjects;
 using Microsoft.AspNetCore.Authorization;
 using Microsoft.AspNetCore.Mvc;
 using System.Linq;
diff --git a/src/Project/Controllers/SearchController.cs b/src/Project/Controllers/SearchController.cs
index f22e1d5af306298313e04df93f197b5eabcead98..64f5b53c2c651daf6f7f2fa2dd835ef17904d440 100644
--- a/src/Project/Controllers/SearchController.cs
+++ b/src/Project/Controllers/SearchController.cs
@@ -3,12 +3,12 @@ using System.Collections.Generic;
 using System.Linq;
 using System.Web;
 using Coscine.ApiCommons;
-using Coscine.ApiCommons.Utils;
 using LinqToDB.Tools;
 using Microsoft.AspNetCore.Mvc;
 using Newtonsoft.Json;
 using Newtonsoft.Json.Linq;
 using Microsoft.AspNetCore.Authorization;
+using Coscine.Database.Util;
 
 namespace Coscine.Api.Project.Controllers
 {
@@ -16,12 +16,10 @@ namespace Coscine.Api.Project.Controllers
     public class SearchController : Controller
     {
         private readonly Authenticator _authenticator;
-        private readonly DatabaseConnection _databaseConnection;
 
         public SearchController()
         {
             _authenticator = new Authenticator(this, Program.Configuration);
-            _databaseConnection = new DatabaseConnection(Program.Configuration);
         }
 
         [HttpGet("[controller]/allNoFilter/")]
@@ -110,7 +108,7 @@ namespace Coscine.Api.Project.Controllers
             {
                 list.Add(new Guid(projectId));
                 var counter = 0;
-                _databaseConnection.ConnectToDatabase((db) =>
+                DatabaseConnection.ConnectToDatabase((db) =>
                 {
                     while (counter != list.Count)
                     {
@@ -128,7 +126,7 @@ namespace Coscine.Api.Project.Controllers
 
         private JToken SearchForProjects(Guid userId, string searchQuery, string projectId, List<Guid> listOfSubprojects, bool showSubProjects)
         {
-            return _databaseConnection.ConnectToDatabase((db) =>
+            return DatabaseConnection.ConnectToDatabase((db) =>
             {
                 var allSubProjects = (from sp in db.SubProjects select sp.SubProjectId).ToList();
                 var allSubProjectsList = new List<Guid>();
@@ -175,7 +173,7 @@ namespace Coscine.Api.Project.Controllers
 
         private JToken SearchForResources(Guid userId, string searchQuery, string projectId, List<Guid> listOfSubprojects)
         {
-            return _databaseConnection.ConnectToDatabase((db) =>
+            return DatabaseConnection.ConnectToDatabase((db) =>
             {
 
                 var results = (from r in db.Resources
diff --git a/src/Project/Controllers/SubProjectController.cs b/src/Project/Controllers/SubProjectController.cs
index ef54e41e528f3c46cba50dc80c996f262fd279e2..fa898c70e3aa3c47dabdadb438406adf8445ac59 100644
--- a/src/Project/Controllers/SubProjectController.cs
+++ b/src/Project/Controllers/SubProjectController.cs
@@ -1,10 +1,11 @@
-using Coscine.Api.Project.Models;
+using Coscine.Database.Models;
 using Coscine.ApiCommons;
 using Microsoft.AspNetCore.Authorization;
 using Microsoft.AspNetCore.Mvc;
 using Newtonsoft.Json.Linq;
 using System;
 using System.Linq;
+using Coscine.Database.Util;
 
 namespace Coscine.Api.Project.Controllers
 {
diff --git a/src/Project/Controllers/VisibilityController.cs b/src/Project/Controllers/VisibilityController.cs
index bdf9bc3bcd55c9a906a0c9575ab58e651b451bb5..ed9d80cdf8819db5a799baebc78cefe90e172cab 100644
--- a/src/Project/Controllers/VisibilityController.cs
+++ b/src/Project/Controllers/VisibilityController.cs
@@ -1,5 +1,5 @@
-using Coscine.Api.Project.Models;
-using Coscine.Api.Project.ReturnObjects;
+using Coscine.Database.Models;
+using Coscine.Database.ReturnObjects;
 using Microsoft.AspNetCore.Authorization;
 using Microsoft.AspNetCore.Mvc;
 using System.Linq;
diff --git a/src/Project/Models/DisciplineModel.cs b/src/Project/Models/DisciplineModel.cs
deleted file mode 100644
index f59ed9676bda1b05e33c781b574363682f6ae67c..0000000000000000000000000000000000000000
--- a/src/Project/Models/DisciplineModel.cs
+++ /dev/null
@@ -1,35 +0,0 @@
-using Coscine.ApiCommons.Models;
-using Coscine.Configuration;
-using Coscine.Database.Model;
-using LinqToDB;
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Linq.Expressions;
-using System.Text;
-using System.Threading.Tasks;
-
-namespace Coscine.Api.Project.Models
-{
-    public class DisciplineModel : DatabaseModel<Discipline>
-    {
-        public DisciplineModel() : base(Program.Configuration)
-        {
-        }
-
-        public override Expression<Func<Discipline, Guid>> GetIdFromObject()
-        {
-            return (discipline) => discipline.Id;
-        }
-
-        public override ITable<Discipline> GetITableFromDatabase(CoscineDB db)
-        {
-            return db.Disciplines;
-        }
-
-        public override void SetObjectId(Discipline databaseObject, Guid id)
-        {
-            databaseObject.Id = id;
-        }
-    }
-}
diff --git a/src/Project/Models/GitlabResourceTypeModel.cs b/src/Project/Models/GitlabResourceTypeModel.cs
deleted file mode 100644
index 5ca0c42d79d9df46873439c032bbe5dcd5939c81..0000000000000000000000000000000000000000
--- a/src/Project/Models/GitlabResourceTypeModel.cs
+++ /dev/null
@@ -1,35 +0,0 @@
-using Coscine.ApiCommons.Models;
-using Coscine.Database.Model;
-using LinqToDB;
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Linq.Expressions;
-using System.Text;
-using System.Threading.Tasks;
-
-namespace Coscine.Api.Project.Models
-{
-    public class GitlabResourceTypeModel : DatabaseModel<GitlabResourceType>
-    {
-        public GitlabResourceTypeModel() : base(Program.Configuration)
-        {
-
-        }
-
-        public override Expression<Func<GitlabResourceType, Guid>> GetIdFromObject()
-        {
-            return (gitlabResourceType) => gitlabResourceType.Id;
-        }
-
-        public override ITable<GitlabResourceType> GetITableFromDatabase(CoscineDB db)
-        {
-            return db.GitlabResourceTypes;
-        }
-
-        public override void SetObjectId(GitlabResourceType databaseObject, Guid id)
-        {
-            databaseObject.Id = id;
-        }
-    }
-}
diff --git a/src/Project/Models/InstituteModel.cs b/src/Project/Models/InstituteModel.cs
deleted file mode 100644
index 2b9c4c1bed176e87613f2ce80bd61d155fcff4b7..0000000000000000000000000000000000000000
--- a/src/Project/Models/InstituteModel.cs
+++ /dev/null
@@ -1,35 +0,0 @@
-using Coscine.ApiCommons.Models;
-using Coscine.Database.Model;
-using LinqToDB;
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Linq.Expressions;
-using System.Text;
-using System.Threading.Tasks;
-
-namespace Coscine.Api.Project.Models
-{
-    public class InstituteModel : DatabaseModel<Institute>
-    {
-        public InstituteModel() : base(Program.Configuration)
-        {
-
-        }
-
-        public override Expression<Func<Institute, Guid>> GetIdFromObject()
-        {
-            return (institute) => institute.Id;
-        }
-
-        public override ITable<Institute> GetITableFromDatabase(CoscineDB db)
-        {
-            return db.Institutes;
-        }
-
-        public override void SetObjectId(Institute databaseObject, Guid id)
-        {
-            databaseObject.Id = id;
-        }
-    }
-}
diff --git a/src/Project/Models/LicenseModel.cs b/src/Project/Models/LicenseModel.cs
deleted file mode 100644
index 40d914335be4e575d12479f1c6888a5acc2cd4e2..0000000000000000000000000000000000000000
--- a/src/Project/Models/LicenseModel.cs
+++ /dev/null
@@ -1,33 +0,0 @@
-using Coscine.ApiCommons.Models;
-using Coscine.Database.Model;
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Text;
-using System.Threading.Tasks;
-
-namespace Coscine.Api.Project.Models
-{
-    public class LicenseModel : DatabaseModel<License>
-    {
-        public LicenseModel() : base(Program.Configuration)
-        {
-
-        }
-
-        public override System.Linq.Expressions.Expression<Func<License, Guid>> GetIdFromObject()
-        {
-            return (license) => license.Id;
-        }
-
-        public override LinqToDB.ITable<License> GetITableFromDatabase(CoscineDB db)
-        {
-            return db.Licenses;
-        }
-
-        public override void SetObjectId(License databaseObject, Guid id)
-        {
-            databaseObject.Id = id;
-        }
-    }
-}
diff --git a/src/Project/Models/MetadataModel.cs b/src/Project/Models/MetadataModel.cs
deleted file mode 100644
index a5f3cee395e4fa0a8cfc7a6b5a5963e237f0fd4e..0000000000000000000000000000000000000000
--- a/src/Project/Models/MetadataModel.cs
+++ /dev/null
@@ -1,65 +0,0 @@
-using Coscine.Api.Project.ReturnObjects;
-using Coscine.ApiCommons.Models;
-using Coscine.Database.Model;
-using LinqToDB;
-using System;
-using System.Linq;
-using System.Linq.Expressions;
-using System.Web;
-
-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)
-        {
-            // Double UrlEncode since converting it to Uri executes one UrlDecode and Virtuoso
-            // graph names don't support special characters
-            var encodedFileName = HttpUtility.UrlEncode(HttpUtility.UrlEncode(filename));
-            return $"https://purl.org/coscine/md/{resourceId}/{encodedFileName}/{version}/";
-        }
-
-        public Uri CreateUri(string graphName)
-        {
-            return new Uri(graphName);
-        }
-    }
-}
diff --git a/src/Project/Models/ProjectDisciplineModel.cs b/src/Project/Models/ProjectDisciplineModel.cs
deleted file mode 100644
index 1a1d74017248c5983b9062a3a7bb5ed06b2de0f8..0000000000000000000000000000000000000000
--- a/src/Project/Models/ProjectDisciplineModel.cs
+++ /dev/null
@@ -1,35 +0,0 @@
-using Coscine.ApiCommons.Models;
-using Coscine.Database.Model;
-using LinqToDB;
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Linq.Expressions;
-using System.Text;
-using System.Threading.Tasks;
-
-namespace Coscine.Api.Project.Models
-{
-    public class ProjectDisciplineModel : DatabaseModel<ProjectDiscipline>
-    {
-        public ProjectDisciplineModel() : base(Program.Configuration)
-        {
-
-        }
-
-        public override Expression<Func<ProjectDiscipline, Guid>> GetIdFromObject()
-        {
-            return (projectDiscipline) => projectDiscipline.RelationId;
-        }
-
-        public override ITable<ProjectDiscipline> GetITableFromDatabase(CoscineDB db)
-        {
-            return db.ProjectDisciplines;
-        }
-
-        public override void SetObjectId(ProjectDiscipline databaseObject, Guid id)
-        {
-            databaseObject.RelationId = id;
-        }
-    }
-}
diff --git a/src/Project/Models/ProjectInstituteModel.cs b/src/Project/Models/ProjectInstituteModel.cs
deleted file mode 100644
index 80da701fde3e184489230566e77e7b2d77ce480e..0000000000000000000000000000000000000000
--- a/src/Project/Models/ProjectInstituteModel.cs
+++ /dev/null
@@ -1,35 +0,0 @@
-using Coscine.ApiCommons.Models;
-using Coscine.Database.Model;
-using LinqToDB;
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Linq.Expressions;
-using System.Text;
-using System.Threading.Tasks;
-
-namespace Coscine.Api.Project.Models
-{
-    public class ProjectInstituteModel : DatabaseModel<ProjectInstitute>
-    {
-        public ProjectInstituteModel() : base(Program.Configuration)
-        {
-
-        }
-
-        public override Expression<Func<ProjectInstitute, Guid>> GetIdFromObject()
-        {
-            return (projectInstitute) => projectInstitute.RelationId;
-        }
-
-        public override ITable<ProjectInstitute> GetITableFromDatabase(CoscineDB db)
-        {
-            return db.ProjectInstitutes;
-        }
-
-        public override void SetObjectId(ProjectInstitute databaseObject, Guid id)
-        {
-            databaseObject.RelationId = id;
-        }
-    }
-}
diff --git a/src/Project/Models/ProjectModel.cs b/src/Project/Models/ProjectModel.cs
deleted file mode 100644
index 253aeecb785b3f1de847dbde9973769bbd320237..0000000000000000000000000000000000000000
--- a/src/Project/Models/ProjectModel.cs
+++ /dev/null
@@ -1,345 +0,0 @@
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Linq.Expressions;
-using Coscine.Api.Project.ReturnObjects;
-using Coscine.ApiCommons.Models;
-using Coscine.Database.Model;
-using LinqKit;
-using LinqToDB;
-
-namespace Coscine.Api.Project.Models
-{
-    public class ProjectModel : DatabaseModel<Coscine.Database.Model.Project>
-    {
-
-        public ProjectModel() : base(Program.Configuration) 
-        {
-        }
-
-        public bool IsDeleted(Guid id)
-        {
-            return DatabaseConnection.ConnectToDatabase((db) =>
-            {
-                return
-                    (from tableEntry in GetITableFromDatabase(db).AsExpandable()
-                     where  tableEntry.Id == id 
-                            && tableEntry.Deleted == true
-                     select tableEntry).Count() == 1;
-            });
-        }
-
-        public override Database.Model.Project GetById(Guid id)
-        {
-            var expression = GetIdFromObject();
-            return DatabaseConnection.ConnectToDatabase((db) =>
-            {
-                return
-                    (from tableEntry in GetITableFromDatabase(db).AsExpandable()
-                     where expression.Invoke(tableEntry) == id
-                        && tableEntry.Deleted == false
-                     select tableEntry).First();
-            });
-        }
-
-        public Database.Model.Project GetByIdIncludingDeleted(Guid id)
-        {
-            var expression = GetIdFromObject();
-            return DatabaseConnection.ConnectToDatabase((db) =>
-            {
-                return
-                    (from tableEntry in GetITableFromDatabase(db).AsExpandable()
-                     where expression.Invoke(tableEntry) == id
-                     select tableEntry).First();
-            });
-        }
-
-        public override Database.Model.Project GetWhere(Expression<Func<Database.Model.Project, bool>> whereClause)
-        {
-            return DatabaseConnection.ConnectToDatabase((db) =>
-            {
-                return
-                    (from tableEntry in GetITableFromDatabase(db).AsExpandable()
-                     where whereClause.Invoke(tableEntry)
-                        && tableEntry.Deleted == false
-                     select tableEntry).First();
-            });
-        }
-
-        public override IEnumerable<Database.Model.Project> GetAll()
-        {
-            return DatabaseConnection.ConnectToDatabase((db) =>
-            {
-                return
-                    (from tableEntry in GetITableFromDatabase(db)
-                     where tableEntry.Deleted == false
-                     select tableEntry).ToList();
-            });
-        }
-
-        public override IEnumerable<Database.Model.Project> GetAllWhere(Expression<Func<Database.Model.Project, bool>> whereClause)
-        {
-            return DatabaseConnection.ConnectToDatabase((db) =>
-            {
-                return
-                    (from tableEntry in GetITableFromDatabase(db).AsExpandable()
-                     where whereClause.Invoke(tableEntry)
-                        && tableEntry.Deleted == false
-                     select tableEntry).ToList();
-            });
-        }
-
-        public override int Update(Database.Model.Project databaseObject)
-        {
-            if (databaseObject.Deleted != false)
-            {
-                return DatabaseConnection.ConnectToDatabase((db) =>
-                {
-                    return db.Update(databaseObject);
-                });
-            } else
-            {
-                return 0;
-            }
-        }
-
-        public override int Delete(Database.Model.Project databaseObject)
-        {
-            databaseObject.Deleted = true;
-            return DatabaseConnection.ConnectToDatabase((db) =>
-            {
-                return db.Update(databaseObject);
-            });
-        }
-
-        public int HardDelete(Database.Model.Project databaseObject)
-        {
-            return DatabaseConnection.ConnectToDatabase((db) =>
-            {
-                return db.Delete(databaseObject);
-            });
-        }
-
-        public Coscine.Database.Model.Project StoreFromObject(ProjectObject projectObject, User user)
-        {
-            if(projectObject.Disciplines.Count() == 0 || projectObject.Institutes.Count() == 0)
-            {
-                throw new ArgumentException("Discipline and Institute are necessary!");
-            }
-
-            Coscine.Database.Model.Project project = new Coscine.Database.Model.Project()
-            {
-                Description = projectObject.Description,
-                DisplayName = projectObject.DisplayName,
-                StartDate = projectObject.StartDate,
-                EndDate = projectObject.EndDate,
-                Keywords = projectObject.Keywords,
-
-                ProjectName = projectObject.ProjectName,
-                PrincipleInvestigators = projectObject.PrincipleInvestigators,
-                GrantId = projectObject.GrantId,
-
-                VisibilityId = projectObject.Visibility.Id,
-            };
-            Insert(project);
-            try
-            {
-                SetDisciplines(project, projectObject.Disciplines);
-                SetInstitutes(project, projectObject.Institutes);
-            }
-            catch (Exception e)
-            {
-                HardDelete(project);
-                throw e;
-            }
-            SetOwner(project, user);
-            return project;
-        }
-
-        private void SetDisciplines(Database.Model.Project project, IEnumerable<DisciplineObject> disciplines)
-        {
-            ProjectDisciplineModel projectDisciplineModel = new ProjectDisciplineModel();
-            foreach(var oldDiscipline in projectDisciplineModel.GetAllWhere((projectDiscipline) => projectDiscipline.ProjectId == project.Id))
-            {
-                projectDisciplineModel.Delete(oldDiscipline);
-            }
-            foreach (var discipline in disciplines)
-            {
-                projectDisciplineModel.Insert(new ProjectDiscipline()
-                {
-                    ProjectId = project.Id,
-                    DisciplineId = discipline.Id
-                });
-            }
-        }
-
-        private void SetInstitutes(Database.Model.Project project, IEnumerable<InstituteObject> institutes)
-        {
-            ProjectInstituteModel projectInstituteModel = new ProjectInstituteModel();
-            foreach (var oldInstitute in projectInstituteModel.GetAllWhere((projectInstitute) => projectInstitute.ProjectId == project.Id))
-            {
-                projectInstituteModel.Delete(oldInstitute);
-            }
-            foreach (var institute in institutes)
-            {
-                projectInstituteModel.Insert(new ProjectInstitute()
-                {
-                    ProjectId = project.Id,
-                    InstituteId = institute.Id
-                });
-            }
-        }
-
-        public ProjectRole SetOwner(Coscine.Database.Model.Project project, User user)
-        {
-            ProjectRoleModel projectRoleModel = new ProjectRoleModel();
-
-            ProjectRole projectRole = new ProjectRole()
-            {
-                RelationId = Guid.NewGuid(),
-                ProjectId = project.Id,
-                UserId = user.Id,
-                RoleId = new RoleModel().GetWhere((x) => x.DisplayName == "Owner").Id
-            };
-            projectRoleModel.Insert(projectRole);
-
-            return projectRole;
-        }
-
-        public bool HasAccess(User user, Guid projectId, params string[] allowedAccess)
-        {
-            return HasAccess(user, GetById(projectId), allowedAccess);
-        }
-
-        public bool HasAccess(User user, Database.Model.Project project, params string[] allowedAccess)
-        {
-            ProjectRoleModel projectRoleModel = new ProjectRoleModel();
-            allowedAccess = allowedAccess.Select(x => x.ToLower().Trim()).ToArray();
-
-            IEnumerable<Coscine.Database.Model.ProjectRole> projectRoles = projectRoleModel.GetAllWhere(
-                (projectRoleRelation) => projectRoleRelation.ProjectId == project.Id && 
-                                         projectRoleRelation.UserId == user.Id &&
-                                         allowedAccess.Contains(projectRoleRelation.Role.DisplayName.ToLower()));
-            return projectRoles.Count() > 0;
-        }
-
-        public IEnumerable<Database.Model.Project> GetWithAccess(User user, params string[] allowedAccess)
-        {
-            ProjectRoleModel projectRoleModel = new ProjectRoleModel();
-            ProjectModel projectModel = new ProjectModel();
-
-            allowedAccess = allowedAccess.Select(x => x.ToLower().Trim()).ToArray();
-            var allUserProjectRoles = projectRoleModel.GetAllWhere((projectRoleRelation) => projectRoleRelation.UserId == user.Id &&
-                                                                                            allowedAccess.Contains(projectRoleRelation.Role.DisplayName.ToLower()));
-            var allowedProjectIds = allUserProjectRoles.Select((projectRole) => projectRole.ProjectId);
-            var allowedProjects = projectModel.GetAllWhere((project) => allowedProjectIds.Contains(project.Id)
-                                                                        && ((!project.SubProjectsSubProjectIdIds.Any()) // get top level projects not having any parent projects
-                                                                            || !(from subProject in project.SubProjectsSubProjectIdIds // check if the direct parent project is accessible to the current user
-                                                                                where (from parentProjectRole in subProject.Project.ProjectRolesProjectIdIds
-                                                                                        where parentProjectRole.UserId == user.Id
-                                                                                        && allowedAccess.Contains(parentProjectRole.Role.DisplayName.ToLower())
-                                                                                        select parentProjectRole).Any()
-                                                                                select subProject).Any())
-                                                            );
-
-            return allowedProjects.ToList();
-        }
-
-        public void AddResource(Coscine.Database.Model.Project project, Resource resource)
-        {
-            ProjectResourceModel projectResourceModel = new ProjectResourceModel();
-            if (projectResourceModel.GetAllWhere((projectResource) => projectResource.ResourceId == resource.Id && projectResource.ProjectId == project.Id).Any())
-            {
-                throw new InvalidOperationException("Resource is already assigned to project!");
-            }
-            ProjectResource newProjectResource = new ProjectResource
-            {
-                ProjectId = project.Id,
-                ResourceId = resource.Id
-            };
-            projectResourceModel.Insert(newProjectResource);
-        }
-
-        public int UpdateByObject(Database.Model.Project project, ProjectObject projectObject)
-        {
-            if (projectObject.Disciplines.Count() == 0 || projectObject.Institutes.Count() == 0)
-            {
-                throw new ArgumentException("Discipline and Institute are necessary!");
-            }
-
-            project.Description = projectObject.Description;
-            project.DisplayName = projectObject.DisplayName;
-            project.StartDate = projectObject.StartDate;
-            project.EndDate = projectObject.EndDate;
-            project.Keywords = projectObject.Keywords;
-
-            project.ProjectName = projectObject.ProjectName;
-            project.PrincipleInvestigators = projectObject.PrincipleInvestigators;
-            project.GrantId = projectObject.GrantId;
-
-            SetDisciplines(project, projectObject.Disciplines);
-            SetInstitutes(project, projectObject.Institutes);
-            project.VisibilityId = projectObject.Visibility.Id;
-
-            return Update(project);
-        }
-
-        public ProjectObject CreateReturnObjectFromDatabaseObject(Database.Model.Project project)
-        {
-            return CreateReturnObjectFromDatabaseObject(project, new Guid());
-        }
-
-        public ProjectObject CreateReturnObjectFromDatabaseObject(Database.Model.Project project, Guid parentId)
-        {
-            IEnumerable<DisciplineObject> disciplines = new List<DisciplineObject>();
-            if(project.ProjectDisciplineProjectIdIds == null)
-            {
-                DisciplineModel disciplineModel = new DisciplineModel();
-                disciplines = disciplineModel.GetAllWhere((discipline) => (from relation in discipline.ProjectDisciplineDisciplineIdIds where relation.ProjectId == project.Id select relation).Any())
-                                                .Select((discipline) => new DisciplineObject(discipline.Id, discipline.Url, discipline.DisplayNameDe, discipline.DisplayNameEn));
-            }
-            else
-            {
-                disciplines = project.ProjectDisciplineProjectIdIds.Select((discipline) => new DisciplineObject(discipline.Discipline.Id, discipline.Discipline.Url, discipline.Discipline.DisplayNameDe, discipline.Discipline.DisplayNameEn));
-            }
-            IEnumerable<InstituteObject> institutes = new List<InstituteObject>();
-            if (project.ProjectInstituteProjectIdIds == null)
-            {
-                InstituteModel instituteModel = new InstituteModel();
-                institutes = instituteModel.GetAllWhere((institute) => (from relation in institute.ProjectInstituteInstituteIdIds where relation.ProjectId == project.Id select relation).Any())
-                                                .Select((institute) => new InstituteObject(institute.Id, institute.IKZ, institute.DisplayName));
-            }
-            else
-            {
-                institutes = project.ProjectInstituteProjectIdIds.Select((institute) => new InstituteObject(institute.Institute.Id, institute.Institute.IKZ, institute.Institute.DisplayName));
-            }
-            if (project.Visibility == null && project.VisibilityId.HasValue)
-            {
-                VisibilityModel visibilityModel = new VisibilityModel();
-                project.Visibility = visibilityModel.GetById(project.VisibilityId.Value);
-            }
-
-            return new ProjectObject(project.Id, project.Description, project.DisplayName, project.StartDate, project.EndDate, project.Keywords, 
-                                                    project.ProjectName, project.PrincipleInvestigators, project.GrantId,
-                                                    disciplines,
-                                                    institutes,
-                                                    project.Visibility == null ? null : new VisibilityObject(project.Visibility.Id, project.Visibility.DisplayName),
-                                                    parentId);
-        }
-
-        public override Expression<Func<Database.Model.Project, Guid>> GetIdFromObject()
-        {
-            return databaseObject => databaseObject.Id;
-        }
-
-        public override ITable<Database.Model.Project> GetITableFromDatabase(CoscineDB db)
-        {
-            return db.Projects;
-        }
-
-        public override void SetObjectId(Database.Model.Project databaseObject, Guid id)
-        {
-            databaseObject.Id = id;
-        }
-    }
-}
diff --git a/src/Project/Models/ProjectResourceModel.cs b/src/Project/Models/ProjectResourceModel.cs
deleted file mode 100644
index ecf3d176d3ffa926db08202c6a7881d74e5a4d1d..0000000000000000000000000000000000000000
--- a/src/Project/Models/ProjectResourceModel.cs
+++ /dev/null
@@ -1,30 +0,0 @@
-using System;
-using System.Linq.Expressions;
-using Coscine.ApiCommons.Models;
-using Coscine.Database.Model;
-using LinqToDB;
-
-namespace Coscine.Api.Project.Models
-{
-    public class ProjectResourceModel : DatabaseModel<ProjectResource>
-    {
-        public ProjectResourceModel() : base(Program.Configuration)
-        {
-        }
-
-        public override Expression<Func<ProjectResource, Guid>> GetIdFromObject()
-        {
-            return (projectResource) => projectResource.RelationId;
-        }
-
-        public override ITable<ProjectResource> GetITableFromDatabase(CoscineDB db)
-        {
-            return db.ProjectResources;
-        }
-
-        public override void SetObjectId(ProjectResource databaseObject, Guid id)
-        {
-            databaseObject.RelationId = id;
-        }
-    }
-}
\ No newline at end of file
diff --git a/src/Project/Models/ProjectRoleModel.cs b/src/Project/Models/ProjectRoleModel.cs
deleted file mode 100644
index c3c5d16a01da083ab0c76d085b811f17fdf93ff9..0000000000000000000000000000000000000000
--- a/src/Project/Models/ProjectRoleModel.cs
+++ /dev/null
@@ -1,75 +0,0 @@
-using Coscine.Api.Project.ReturnObjects;
-using Coscine.ApiCommons.Exceptions;
-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 ProjectRoleModel : DatabaseModel<ProjectRole>
-    {
-        public ProjectRoleModel() : base(Program.Configuration)
-        {
-
-        }
-        
-        public ProjectRole SetFromObject(ProjectRoleObject projectRoleObject)
-        {
-            // Remove existing roles if they exist
-            var existingRoles = GetAllWhere((dbProjectRole) => dbProjectRole.ProjectId == projectRoleObject.ProjectId && dbProjectRole.UserId == projectRoleObject.User.Id);            
-
-            if (existingRoles.Count() > 0)
-            {
-                foreach(var role in existingRoles)
-                {
-                    CheckIfLastOwnerWillBeRemoved(role.RoleId, projectRoleObject.ProjectId);
-                    Delete(role);
-                }
-            }
-            ProjectRole projectRole = new ProjectRole()
-            {
-                ProjectId = projectRoleObject.ProjectId,
-                UserId = projectRoleObject.User.Id,
-                RoleId = projectRoleObject.Role.Id
-            };
-            Insert(projectRole);
-            return projectRole;
-        }
-
-        public void CheckIfLastOwnerWillBeRemoved(Guid roleId, Guid projectId)
-        {
-            RoleModel roleModel = new RoleModel();
-            var ownerRole = roleModel.GetOwnerRole();
-
-            if (roleId == ownerRole.Id)
-            {
-                var moreThanOneOwnerExists = GetAllWhere((projectRole) =>
-                    projectRole.ProjectId == projectId
-                    && projectRole.RoleId == ownerRole.Id
-                ).Count() > 1;
-                if (!moreThanOneOwnerExists)
-                {
-                    throw new NotAuthorizedException("The last owner cannot be removed!");
-                }
-            }
-        }
-
-        public override Expression<Func<ProjectRole, Guid>> GetIdFromObject()
-        {
-            return databaseObject => databaseObject.RelationId;
-        }
-
-        public override ITable<ProjectRole> GetITableFromDatabase(CoscineDB db)
-        {
-            return db.ProjectRoles;
-        }
-
-        public override void SetObjectId(ProjectRole databaseObject, Guid id)
-        {
-            databaseObject.RelationId = id;
-        }
-    }
-}
diff --git a/src/Project/Models/RDSResourceTypeModel.cs b/src/Project/Models/RDSResourceTypeModel.cs
deleted file mode 100644
index d8aada145190e475d40fc7d7e5ff1ef437bdd03c..0000000000000000000000000000000000000000
--- a/src/Project/Models/RDSResourceTypeModel.cs
+++ /dev/null
@@ -1,35 +0,0 @@
-using Coscine.ApiCommons.Models;
-using Coscine.Database.Model;
-using LinqToDB;
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Linq.Expressions;
-using System.Text;
-using System.Threading.Tasks;
-
-namespace Coscine.Api.Project.Models
-{
-    public class RDSResourceTypeModel : DatabaseModel<RDSResourceType>
-    {
-        public RDSResourceTypeModel() : base(Program.Configuration)
-        {
-
-        }
-
-        public override Expression<Func<RDSResourceType, Guid>> GetIdFromObject()
-        {
-            return (rdsResourceType) => rdsResourceType.Id;
-        }
-
-        public override ITable<RDSResourceType> GetITableFromDatabase(CoscineDB db)
-        {
-            return db.RDSResourceTypes;
-        }
-
-        public override void SetObjectId(RDSResourceType databaseObject, Guid id)
-        {
-            databaseObject.Id = id;
-        }
-    }
-}
diff --git a/src/Project/Models/ResourceDisciplineModel.cs b/src/Project/Models/ResourceDisciplineModel.cs
deleted file mode 100644
index 8dbfc92b4da52fc31e2bf2f59c78144f473dbf50..0000000000000000000000000000000000000000
--- a/src/Project/Models/ResourceDisciplineModel.cs
+++ /dev/null
@@ -1,35 +0,0 @@
-using Coscine.ApiCommons.Models;
-using Coscine.Database.Model;
-using LinqToDB;
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Linq.Expressions;
-using System.Text;
-using System.Threading.Tasks;
-
-namespace Coscine.Api.Project.Models
-{
-    public class ResourceDisciplineModel : DatabaseModel<ResourceDiscipline>
-    {
-        public ResourceDisciplineModel() : base(Program.Configuration)
-        {
-
-        }
-
-        public override Expression<Func<ResourceDiscipline, Guid>> GetIdFromObject()
-        {
-            return (resourceDiscipline) => resourceDiscipline.RelationId;
-        }
-
-        public override ITable<ResourceDiscipline> GetITableFromDatabase(CoscineDB db)
-        {
-            return db.ResourceDisciplines;
-        }
-
-        public override void SetObjectId(ResourceDiscipline databaseObject, Guid id)
-        {
-            databaseObject.RelationId = id;
-        }
-    }
-}
diff --git a/src/Project/Models/ResourceModel.cs b/src/Project/Models/ResourceModel.cs
deleted file mode 100644
index a44a64d6cd3206d401c988aa28947432ad0f271b..0000000000000000000000000000000000000000
--- a/src/Project/Models/ResourceModel.cs
+++ /dev/null
@@ -1,351 +0,0 @@
-using Coscine.Api.Project.ReturnObjects;
-using Coscine.ApiCommons.Models;
-using Coscine.Configuration;
-using Coscine.Database.Model;
-using LinqToDB;
-using Newtonsoft.Json.Linq;
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Linq.Expressions;
-
-namespace Coscine.Api.Project.Models
-{
-    public class ResourceModel : DatabaseModel<Resource>
-    {
-        private readonly IConfiguration _configuration;
-
-        public ResourceModel() : base(Program.Configuration)
-        {
-            _configuration = Program.Configuration;
-        }
-
-        public Resource StoreFromObject(ResourceObject resourceObject)
-        {
-            if (resourceObject.Disciplines.Count() == 0 || resourceObject.ResourceTypeOption == null)
-            {
-                throw new ArgumentException("Discipline and ResourceTypeOption are necessary!");
-            }
-
-            Resource resource = new Resource()
-            {
-                DisplayName = resourceObject.DisplayName,
-                ResourceName = resourceObject.ResourceName,
-                Description = resourceObject.Description,
-                Keywords = resourceObject.Keywords,
-                UsageRights = resourceObject.UsageRights,
-                TypeId = resourceObject.Type.Id,
-                Type = new ResourceTypeModel().GetById(resourceObject.Type.Id),
-                VisibilityId = resourceObject.Visibility.Id,
-                ApplicationProfile = resourceObject.ApplicationProfile,
-                FixedValues = resourceObject.FixedValues != null ? resourceObject.FixedValues.ToString() :"{}",
-                Creator = resourceObject.Creator
-            };
-            if(resourceObject.License != null)
-            {
-                resource.LicenseId = resourceObject.License.Id;
-            }
-            Insert(resource);
-            
-            try
-            {
-                SetDisciplines(resource, resourceObject.Disciplines);
-                SetResourceTypeObject(resource, resourceObject.ResourceTypeOption);
-            }
-            catch (Exception e)
-            {
-                Delete(resource);
-                throw e;
-            }
-
-            return resource;
-        }
-
-        public int DeleteResource(Resource resource)
-        {
-            ProjectResourceModel projectResourceModel = new ProjectResourceModel();
-            foreach (var projectResource in projectResourceModel.GetAllWhere((projectResource) => projectResource.ResourceId == resource.Id))
-            {
-                projectResourceModel.Delete(projectResource);
-            }
-
-            ResourceDisciplineModel resourceDisciplineModel = new ResourceDisciplineModel();
-            foreach (var resourceDiscipline in resourceDisciplineModel.GetAllWhere((resourceDicipline) => resourceDicipline.ResourceId == resource.Id))
-            {
-                resourceDisciplineModel.Delete(resourceDiscipline);
-            }
-
-            DeleteResourceTypeObject(resource);
-
-            return Delete(resource);
-        }
-
-        private void SetResourceTypeObject(Resource resource, JObject resourceTypeOption)
-        {
-            if (resource.Type.DisplayName == "rds")
-            {
-                RDSResourceTypeObject rdsResourceTypeObject = resourceTypeOption.ToObject<RDSResourceTypeObject>();
-                RDSResourceTypeModel rdsResourceTypeModel = new RDSResourceTypeModel();
-                if (resource.ResourceTypeOptionId != null)
-                {
-                    RDSResourceType rdsResourceType = rdsResourceTypeModel.GetById(resource.ResourceTypeOptionId.Value);
-                    rdsResourceTypeModel.Update(rdsResourceType);
-                }
-                else
-                {
-                    RDSResourceType rdsResourceType = new RDSResourceType()
-                    {
-                        BucketName = GetRDSBucketName(),
-                        Size = rdsResourceTypeObject.Size,
-                    };
-                    rdsResourceTypeModel.Insert(rdsResourceType);
-                    resource.ResourceTypeOptionId = rdsResourceType.Id;
-                    Update(resource);
-                }
-            }
-            else if (resource.Type.DisplayName == "s3")
-            {
-                S3ResourceTypeObject s3ResourceTypeObject = resourceTypeOption.ToObject<S3ResourceTypeObject>();
-                S3ResourceTypeModel s3ResourceTypeModel = new S3ResourceTypeModel();
-                if (resource.ResourceTypeOptionId != null)
-                {
-                    S3ResourceType s3ResourceType = s3ResourceTypeModel.GetById(resource.ResourceTypeOptionId.Value);
-
-                    s3ResourceType.BucketName = s3ResourceTypeObject.BucketName;
-                    s3ResourceType.AccessKey = s3ResourceTypeObject.AccessKey ?? s3ResourceType.AccessKey;
-                    s3ResourceType.SecretKey = s3ResourceTypeObject.SecretKey ?? s3ResourceType.SecretKey;
-
-                    s3ResourceTypeModel.Update(s3ResourceType);
-                }
-                else
-                {
-                    S3ResourceType s3ResourceType = new S3ResourceType()
-                    {
-                        BucketName = s3ResourceTypeObject.BucketName,
-                        AccessKey = s3ResourceTypeObject.AccessKey,
-                        SecretKey = s3ResourceTypeObject.SecretKey
-                    };
-                    s3ResourceTypeModel.Insert(s3ResourceType);
-                    resource.ResourceTypeOptionId = s3ResourceType.Id;
-                    Update(resource);
-                }
-            }
-            else if (resource.Type.DisplayName == "gitlab")
-            {
-                GitlabResourceTypeObject gitlabResourceTypeObject = resourceTypeOption.ToObject<GitlabResourceTypeObject>();
-                GitlabResourceTypeModel gitlabResourceTypeModel = new GitlabResourceTypeModel();
-                if (resource.ResourceTypeOptionId != null)
-                {
-                    GitlabResourceType gitlabResourceType = gitlabResourceTypeModel.GetById(resource.ResourceTypeOptionId.Value);
-
-                    gitlabResourceType.RepositoryNumber = gitlabResourceTypeObject.RepositoryNumber;
-                    gitlabResourceType.RepositoryUrl = gitlabResourceTypeObject.RepositoryUrl;
-                    gitlabResourceType.Token = gitlabResourceTypeObject.Token ?? gitlabResourceType.Token;
-
-                    gitlabResourceTypeModel.Update(gitlabResourceType);
-                }
-                else
-                {
-                    GitlabResourceType gitlabResourceType = new GitlabResourceType()
-                    {
-                        RepositoryNumber = gitlabResourceTypeObject.RepositoryNumber,
-                        RepositoryUrl = gitlabResourceTypeObject.RepositoryUrl,
-                        Token = gitlabResourceTypeObject.Token
-                    };
-                    gitlabResourceTypeModel.Insert(gitlabResourceType);
-                    resource.ResourceTypeOptionId = gitlabResourceType.Id;
-                    Update(resource);
-                }
-            }
-            else
-            {
-                throw new ArgumentException("Not supported resource type!");
-            }
-        }
-
-        private string GetRDSBucketName()
-        {
-            var prefix = _configuration.GetStringAndWait("coscine/global/buckets/prefix");
-            var number = Int32.Parse(_configuration.GetStringAndWait("coscine/global/buckets/currentid"));
-            var maxNumber = Int32.Parse(_configuration.GetStringAndWait("coscine/global/buckets/highestid"));
-            var newNumber = number % maxNumber == 0 ? 1 : number + 1;
-            _configuration.Put("coscine/global/buckets/currentid", "" + newNumber);
-
-            return String.Format("{0}{1,3:000}", prefix, number);
-        }
-
-        private void SetDisciplines(Resource resource, IEnumerable<DisciplineObject> disciplines)
-        {
-            ResourceDisciplineModel resourceDisciplineModel = new ResourceDisciplineModel();
-            foreach (var oldDiscipline in resourceDisciplineModel.GetAllWhere((resourceDiscipline) => resourceDiscipline.ResourceId == resource.Id))
-            {
-                resourceDisciplineModel.Delete(oldDiscipline);
-            }
-            foreach (var discipline in disciplines)
-            {
-                ResourceDiscipline resourceDiscipline = new ResourceDiscipline()
-                {
-                    DisciplineId = discipline.Id,
-                    ResourceId = resource.Id
-                };
-                resourceDisciplineModel.Insert(resourceDiscipline);
-            }
-        }
-
-        public bool HasAccess(User user, Database.Model.Resource resource, params string[] allowedAccess)
-        {
-            IEnumerable<string> allowedAccessLabels = allowedAccess.Select(x => x.ToLower().Trim()).ToList();
-            return DatabaseConnection.ConnectToDatabase((db) => (from relation in db.ProjectRoles
-                                                                 where relation.Project.ProjectResourceProjectIdIds != null && relation.Project.ProjectResourceProjectIdIds
-                                                                    .Any((projectResource) => projectResource.Resource.Id == resource.Id)
-                                                                     && relation.User.Id == user.Id
-                                                                     && allowedAccessLabels.Contains(relation.Role.DisplayName.ToLower())
-                                                                 select relation).Any());
-        }
-
-        public int UpdateByObject(Resource resource, ResourceObject resourceObject)
-        {
-            if (resourceObject.Disciplines.Count() == 0 || resourceObject.ResourceTypeOption == null)
-            {
-                throw new ArgumentException("Discipline and ResourceTypeOption are necessary!");
-            }
-
-            if (resource.TypeId != resourceObject.Type.Id)
-            {
-                DeleteResourceTypeObject(resource);
-            }
-
-            resource.DisplayName = resourceObject.DisplayName;
-            resource.ResourceName = resourceObject.ResourceName;
-            resource.Description = resourceObject.Description;
-            resource.Keywords = resourceObject.Keywords;
-            resource.UsageRights = resourceObject.UsageRights;
-            resource.TypeId = resourceObject.Type.Id;
-            resource.Type = new ResourceTypeModel().GetById(resourceObject.Type.Id);
-            resource.VisibilityId = resourceObject.Visibility.Id;
-            if(resourceObject.License != null)
-            {
-                resource.LicenseId = resourceObject.License.Id;
-            }
-
-            // the application profile can not be altered after creation
-            // resource.ApplicationProfile = resourceObject.ApplicationProfile;
-
-            resource.FixedValues = resourceObject.FixedValues != null ? resourceObject.FixedValues.ToString() : "{}";
-
-            // the resource creator can not be altered after creation
-            // resource.Creator = resourceObject.Creator;
-
-            SetDisciplines(resource, resourceObject.Disciplines);
-            SetResourceTypeObject(resource, resourceObject.ResourceTypeOption);
-
-            return Update(resource);
-        }
-
-        // TODO: Find out why resource.Type is not set
-        public void SetType(Resource resource)
-        {
-            if (resource.Type == null)
-            {
-                ResourceTypeModel resourceTypeModel = new ResourceTypeModel();
-                resource.Type = resourceTypeModel.GetById(resource.TypeId);
-            }
-        }
-
-        public void DeleteResourceTypeObject(Resource resource)
-        {
-            SetType(resource);
-            if (resource.Type.DisplayName == "rds" && resource.ResourceTypeOptionId != null)
-            {
-                RDSResourceTypeModel rdsResourceTypeModel = new RDSResourceTypeModel();
-                rdsResourceTypeModel.Delete(rdsResourceTypeModel.GetById(resource.ResourceTypeOptionId.Value));
-            }
-            else if (resource.Type.DisplayName == "s3" && resource.ResourceTypeOptionId != null)
-            {
-                S3ResourceTypeModel s3ResourceTypeModel = new S3ResourceTypeModel();
-                s3ResourceTypeModel.Delete(s3ResourceTypeModel.GetById(resource.ResourceTypeOptionId.Value));
-            }
-            else if (resource.Type.DisplayName == "gitlab" && resource.ResourceTypeOptionId != null)
-            {
-                GitlabResourceTypeModel gitlabResourceTypeModel = new GitlabResourceTypeModel();
-                gitlabResourceTypeModel.Delete(gitlabResourceTypeModel.GetById(resource.ResourceTypeOptionId.Value));
-            }
-        }
-
-        public ResourceObject CreateReturnObjectFromDatabaseObject(Resource resource)
-        {
-            SetType(resource);
-
-            DisciplineModel disciplineModel = new DisciplineModel();
-            var disciplines = disciplineModel.GetAllWhere((discipline) =>
-                            (from relation in discipline.ResourceDisciplineDisciplineIdIds
-                             where relation.ResourceId == resource.Id
-                             select relation).Any())
-                            .Select((discipline) => new DisciplineObject(discipline.Id, discipline.Url, discipline.DisplayNameDe, discipline.DisplayNameEn));
-
-            if (resource.Visibility == null && resource.VisibilityId != null)
-            {
-                VisibilityModel visibilityModel = new VisibilityModel();
-                resource.Visibility = visibilityModel.GetById(resource.VisibilityId.Value);
-            }
-
-            if (resource.License == null && resource.LicenseId != null)
-            {
-                LicenseModel licenseModel = new LicenseModel();
-                resource.License = licenseModel.GetById(resource.LicenseId.Value);
-            }
-
-            ResourceTypeOptionObject resourceTypeOptionObject = null;
-            if(resource.Type.DisplayName == "rds" && resource.ResourceTypeOptionId != null)
-            {
-                RDSResourceTypeModel rdsResourceTypeModel = new RDSResourceTypeModel();
-                var rdsResourceType = rdsResourceTypeModel.GetById(resource.ResourceTypeOptionId.Value);
-                resourceTypeOptionObject = new RDSResourceTypeObject(rdsResourceType.Id, rdsResourceType.BucketName, (int)rdsResourceType.Size);
-            }
-            else if (resource.Type.DisplayName == "s3" && resource.ResourceTypeOptionId != null)
-            {
-                S3ResourceTypeModel s3ResourceTypeModel = new S3ResourceTypeModel();
-                var s3ResourceType = s3ResourceTypeModel.GetById(resource.ResourceTypeOptionId.Value);
-                resourceTypeOptionObject = new S3ResourceTypeObject(s3ResourceType.Id, s3ResourceType.BucketName, null, null);
-            }
-            else if(resource.Type.DisplayName == "gitlab" && resource.ResourceTypeOptionId != null)
-            {
-                GitlabResourceTypeModel gitlabResourceTypeModel = new GitlabResourceTypeModel();
-                var gitlabResourceType = gitlabResourceTypeModel.GetById(resource.ResourceTypeOptionId.Value);
-                resourceTypeOptionObject = new GitlabResourceTypeObject(gitlabResourceType.Id, gitlabResourceType.RepositoryNumber, gitlabResourceType.RepositoryUrl, null);
-            }
-
-            return new ResourceObject(
-                resource.Id,
-                resource.DisplayName,
-                resource.ResourceName,
-                resource.Description,
-                resource.Keywords,
-                resource.UsageRights,
-                new ResourceTypeObject(resource.Type.Id, resource.Type.DisplayName, resource.Type.Enabled),
-                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),
-                resource.ApplicationProfile,
-                JToken.Parse(resource.FixedValues == null ? "{}": resource.FixedValues ),
-                (resource.Creator != null) ? resource.Creator : null
-            );
-        }
-
-        public override Expression<Func<Resource, Guid>> GetIdFromObject()
-        {
-            return databaseObject => databaseObject.Id;
-        }
-
-        public override ITable<Resource> GetITableFromDatabase(CoscineDB db)
-        {
-            return db.Resources;
-        }
-
-        public override void SetObjectId(Resource databaseObject, Guid id)
-        {
-            databaseObject.Id = id;
-        }
-    }
-}
diff --git a/src/Project/Models/ResourceTypeModel.cs b/src/Project/Models/ResourceTypeModel.cs
deleted file mode 100644
index 5770105796cec6e4f35eff7a904212de9568331e..0000000000000000000000000000000000000000
--- a/src/Project/Models/ResourceTypeModel.cs
+++ /dev/null
@@ -1,31 +0,0 @@
-using Coscine.ApiCommons.Models;
-using Coscine.Database.Model;
-using LinqToDB;
-using System;
-using System.Linq.Expressions;
-
-namespace Coscine.Api.Project.Models
-{
-    public class ResourceTypeModel : DatabaseModel<ResourceType>
-    {
-        public ResourceTypeModel() : base(Program.Configuration)
-        {
-
-        }
-
-        public override Expression<Func<ResourceType, Guid>> GetIdFromObject()
-        {
-            return databaseObject => databaseObject.Id;
-        }
-
-        public override ITable<ResourceType> GetITableFromDatabase(CoscineDB db)
-        {
-            return db.ResourceTypes;
-        }
-
-        public override void SetObjectId(ResourceType databaseObject, Guid id)
-        {
-            databaseObject.Id = id;
-        }
-    }
-}
diff --git a/src/Project/Models/RoleModel.cs b/src/Project/Models/RoleModel.cs
deleted file mode 100644
index 318d0f3cc22d0b4b43cca2f610aeab0e23e3de70..0000000000000000000000000000000000000000
--- a/src/Project/Models/RoleModel.cs
+++ /dev/null
@@ -1,41 +0,0 @@
-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 RoleModel : DatabaseModel<Role>
-    {
-
-        public RoleModel() : base(Program.Configuration)
-        {
-
-        }
-
-        public override Expression<Func<Role, Guid>> GetIdFromObject()
-        {
-            return databaseObject => databaseObject.Id;
-        }
-
-        public override ITable<Role> GetITableFromDatabase(CoscineDB db)
-        {
-            return db.Roles;
-        }
-
-        public override void SetObjectId(Role databaseObject, Guid id)
-        {
-            databaseObject.Id = id;
-        }
-
-        public Role GetOwnerRole()
-        {
-            return DatabaseConnection.ConnectToDatabase((db) => 
-                    (from tableEntry in GetITableFromDatabase(db)
-                     where tableEntry.DisplayName == "Owner"
-                     select tableEntry).First());
-        }
-    }
-}
diff --git a/src/Project/Models/S3ResourceTypeModel.cs b/src/Project/Models/S3ResourceTypeModel.cs
deleted file mode 100644
index 33aef5403e9a91f35dc2d856eb58fc19b0641e4c..0000000000000000000000000000000000000000
--- a/src/Project/Models/S3ResourceTypeModel.cs
+++ /dev/null
@@ -1,35 +0,0 @@
-using Coscine.ApiCommons.Models;
-using Coscine.Database.Model;
-using LinqToDB;
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Linq.Expressions;
-using System.Text;
-using System.Threading.Tasks;
-
-namespace Coscine.Api.Project.Models
-{
-    public class S3ResourceTypeModel : DatabaseModel<S3ResourceType>
-    {
-        public S3ResourceTypeModel() : base(Program.Configuration)
-        {
-
-        }
-
-        public override Expression<Func<S3ResourceType, Guid>> GetIdFromObject()
-        {
-            return (rdsResourceType) => rdsResourceType.Id;
-        }
-
-        public override ITable<S3ResourceType> GetITableFromDatabase(CoscineDB db)
-        {
-            return db.S3ResourceTypes;
-        }
-
-        public override void SetObjectId(S3ResourceType databaseObject, Guid id)
-        {
-            databaseObject.Id = id;
-        }
-    }
-}
diff --git a/src/Project/Models/SubProjectModel.cs b/src/Project/Models/SubProjectModel.cs
deleted file mode 100644
index 8db29f82914a0017ac881854a02f8c9dc9350ea9..0000000000000000000000000000000000000000
--- a/src/Project/Models/SubProjectModel.cs
+++ /dev/null
@@ -1,40 +0,0 @@
-using System;
-using System.Linq.Expressions;
-using Coscine.ApiCommons.Models;
-using Coscine.Database.Model;
-using LinqToDB;
-
-namespace Coscine.Api.Project.Models
-{
-    public class SubProjectModel : DatabaseModel<SubProject>
-    {
-        public SubProjectModel() : base(Program.Configuration)
-        {
-
-        }
-
-        public override Expression<Func<SubProject, Guid>> GetIdFromObject()
-        {
-            return databaseObject => databaseObject.RelationId;
-        }
-
-        public override ITable<SubProject> GetITableFromDatabase(CoscineDB db)
-        {
-            return db.SubProjects;
-        }
-
-        public void LinkSubProject(Guid parentId, Guid childId)
-        {
-            Insert(new SubProject()
-            {
-                ProjectId = parentId,
-                SubProjectId = childId,
-            });
-        }
-
-        public override void SetObjectId(SubProject databaseObject, Guid id)
-        {
-            databaseObject.RelationId = id;
-        }
-    }
-}
diff --git a/src/Project/Models/UserModel.cs b/src/Project/Models/UserModel.cs
deleted file mode 100644
index ca0eeb2c2cdbd5752449661467ef7359805cc691..0000000000000000000000000000000000000000
--- a/src/Project/Models/UserModel.cs
+++ /dev/null
@@ -1,13 +0,0 @@
-using Coscine.ApiCommons.Models;
-
-namespace Coscine.Api.Project.Models
-{
-    public class UserModel : UserPlainModel
-    {
-
-        public UserModel() : base(Program.Configuration)
-        {
-        }
-
-    }
-}
\ No newline at end of file
diff --git a/src/Project/Models/VisibilityModel.cs b/src/Project/Models/VisibilityModel.cs
deleted file mode 100644
index 12b79b8f1db36806de33ddc5ea6eabafb15201ea..0000000000000000000000000000000000000000
--- a/src/Project/Models/VisibilityModel.cs
+++ /dev/null
@@ -1,34 +0,0 @@
-using Coscine.ApiCommons.Models;
-using Coscine.Database.Model;
-using LinqToDB;
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Linq.Expressions;
-using System.Text;
-using System.Threading.Tasks;
-
-namespace Coscine.Api.Project.Models
-{
-    public class VisibilityModel : DatabaseModel<Visibility>
-    {
-        public VisibilityModel() : base(Program.Configuration)
-        {
-
-        }
-        public override Expression<Func<Visibility, Guid>> GetIdFromObject()
-        {
-            return (visibility) => visibility.Id;
-        }
-
-        public override ITable<Visibility> GetITableFromDatabase(CoscineDB db)
-        {
-            return db.Visibilities;
-        }
-
-        public override void SetObjectId(Visibility databaseObject, Guid id)
-        {
-            databaseObject.Id = id;
-        }
-    }
-}
diff --git a/src/Project/Project.csproj b/src/Project/Project.csproj
index f24000a9c8fcc7790dd19a0008ab52e5cfee2c65..8720511db489f50ea83a428f5a0bfa7e13cd7226 100644
--- a/src/Project/Project.csproj
+++ b/src/Project/Project.csproj
@@ -43,20 +43,23 @@
     <WarningLevel>4</WarningLevel>
   </PropertyGroup>
   <ItemGroup>
+    <Reference Include="Castle.Core, Version=4.0.0.0, Culture=neutral, PublicKeyToken=407dd0808d44fbdc, processorArchitecture=MSIL">
+      <HintPath>..\packages\Castle.Core.4.4.0\lib\net45\Castle.Core.dll</HintPath>
+    </Reference>
     <Reference Include="Consul, Version=0.7.2.6, Culture=neutral, PublicKeyToken=20a6ad9a81df1d95, processorArchitecture=MSIL">
       <HintPath>..\packages\Consul.0.7.2.6\lib\net45\Consul.dll</HintPath>
     </Reference>
-    <Reference Include="Coscine.Action, Version=1.9.0.0, Culture=neutral, processorArchitecture=AMD64">
-      <HintPath>..\packages\Coscine.Action.1.9.0\lib\net461\Coscine.Action.dll</HintPath>
+    <Reference Include="Coscine.Action, Version=1.10.0.0, Culture=neutral, processorArchitecture=AMD64">
+      <HintPath>..\packages\Coscine.Action.1.10.0\lib\net461\Coscine.Action.dll</HintPath>
     </Reference>
-    <Reference Include="Coscine.ApiCommons, Version=1.5.0.0, Culture=neutral, PublicKeyToken=af4c1345df96546b, processorArchitecture=MSIL">
-      <HintPath>..\packages\Coscine.ApiCommons.1.5.0\lib\net461\Coscine.ApiCommons.dll</HintPath>
+    <Reference Include="Coscine.ApiCommons, Version=1.6.0.0, Culture=neutral, PublicKeyToken=af4c1345df96546b, processorArchitecture=MSIL">
+      <HintPath>..\packages\Coscine.ApiCommons.1.6.0\lib\net461\Coscine.ApiCommons.dll</HintPath>
     </Reference>
     <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.15.1.0, Culture=neutral, PublicKeyToken=767d77427707b70a, processorArchitecture=MSIL">
-      <HintPath>..\packages\Coscine.Database.1.15.1\lib\net461\Coscine.Database.dll</HintPath>
+    <Reference Include="Coscine.Database, Version=1.16.0.0, Culture=neutral, PublicKeyToken=767d77427707b70a, processorArchitecture=MSIL">
+      <HintPath>..\packages\Coscine.Database.1.16.0\lib\net461\Coscine.Database.dll</HintPath>
     </Reference>
     <Reference Include="Coscine.Logging, Version=1.0.1.0, Culture=neutral, PublicKeyToken=e1ed402bc3f6525e, processorArchitecture=MSIL">
       <HintPath>..\packages\Coscine.Logging.1.0.1\lib\net461\Coscine.Logging.dll</HintPath>
@@ -64,14 +67,8 @@
     <Reference Include="Coscine.ProxyApi, Version=1.2.1.0, Culture=neutral, processorArchitecture=MSIL">
       <HintPath>..\packages\Coscine.ProxyApi.1.2.1\lib\net461\Coscine.ProxyApi.dll</HintPath>
     </Reference>
-    <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 Include="Coscine.SharePoint.Webparts.Vue, Version=1.5.0.0, Culture=neutral, PublicKeyToken=0fe8d3e516df6d98, processorArchitecture=MSIL">
+      <HintPath>..\packages\Coscine.SharePoint.Webparts.Vue.1.5.0\lib\net461\Coscine.SharePoint.Webparts.Vue.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>
@@ -85,11 +82,8 @@
     <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 Include="LinqKit, Version=1.1.17.0, Culture=neutral, PublicKeyToken=bc217f8844052a91, processorArchitecture=MSIL">
+      <HintPath>..\packages\LinqKit.1.1.17\lib\net45\LinqKit.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>
@@ -387,9 +381,11 @@
     <Reference Include="Microsoft.Win32.Registry, Version=4.1.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
       <HintPath>..\packages\Microsoft.Win32.Registry.4.5.0\lib\net461\Microsoft.Win32.Registry.dll</HintPath>
     </Reference>
+    <Reference Include="Moq, Version=4.13.0.0, Culture=neutral, PublicKeyToken=69f491c39445e920, processorArchitecture=MSIL">
+      <HintPath>..\packages\Moq.4.13.1\lib\net45\Moq.dll</HintPath>
+    </Reference>
     <Reference Include="Newtonsoft.Json, Version=12.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL">
-      <HintPath>..\packages\Newtonsoft.Json.12.0.2\lib\net45\Newtonsoft.Json.dll</HintPath>
-      <Private>True</Private>
+      <HintPath>..\packages\Newtonsoft.Json.12.0.3\lib\net45\Newtonsoft.Json.dll</HintPath>
     </Reference>
     <Reference Include="Newtonsoft.Json.Bson, Version=1.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL">
       <HintPath>..\packages\Newtonsoft.Json.Bson.1.0.2\lib\net45\Newtonsoft.Json.Bson.dll</HintPath>
@@ -615,57 +611,18 @@
     </Reference>
   </ItemGroup>
   <ItemGroup>
-    <Compile Include="Controllers\DataSourceController.cs" />
-    <Compile Include="Controllers\MetadataController.cs" />
     <Compile Include="Controllers\LicenseController.cs" />
     <Compile Include="Controllers\SearchController.cs" />
     <Compile Include="Controllers\VisibilityController.cs" />
     <Compile Include="Controllers\InstituteController.cs" />
     <Compile Include="Controllers\DisciplineController.cs" />
     <Compile Include="Controllers\ProjectController.cs" />
-    <Compile Include="Controllers\ResourceController.cs" />
-    <Compile Include="Controllers\ResourceTypeController.cs" />
     <Compile Include="Controllers\RoleController.cs" />
     <Compile Include="Controllers\SubProjectController.cs" />
     <Compile Include="Controllers\ProjectRoleController.cs" />
-    <Compile Include="Models\DisciplineModel.cs" />
-    <Compile Include="Models\GitlabResourceTypeModel.cs" />
-    <Compile Include="Models\InstituteModel.cs" />
-    <Compile Include="Models\LicenseModel.cs" />
-    <Compile Include="Models\ProjectDisciplineModel.cs" />
-    <Compile Include="Models\ProjectInstituteModel.cs" />
-    <Compile Include="Models\ProjectModel.cs" />
-    <Compile Include="Models\ProjectResourceModel.cs" />
-    <Compile Include="Models\ProjectRoleModel.cs" />
-    <Compile Include="Models\S3ResourceTypeModel.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" />
-    <Compile Include="Models\SubProjectModel.cs" />
-    <Compile Include="Models\UserModel.cs" />
-    <Compile Include="Models\VisibilityModel.cs" />
     <Compile Include="Program.cs" />
     <Compile Include="Properties\AssemblyInfo.cs" />
-    <Compile Include="ReturnObjects\GitlabResourceTypeObject.cs" />
-    <Compile Include="ReturnObjects\LicenseObject.cs" />
-    <Compile Include="ReturnObjects\S3ResourceTypeObject.cs" />
-    <Compile Include="ReturnObjects\RDSResourceTypeObject.cs" />
-    <Compile Include="ReturnObjects\ResourceTypeOptionObject.cs" />
-    <Compile Include="ReturnObjects\VisibilityObject.cs" />
-    <Compile Include="ReturnObjects\InstituteObject.cs" />
-    <Compile Include="ReturnObjects\DisciplineObject.cs" />
-    <Compile Include="ReturnObjects\ProjectObject.cs" />
-    <Compile Include="ReturnObjects\ProjectRoleObject.cs" />
-    <Compile Include="ReturnObjects\ResourceObject.cs" />
-    <Compile Include="ReturnObjects\ResourceTypeObject.cs" />
-    <Compile Include="ReturnObjects\RoleObject.cs" />
-    <Compile Include="ReturnObjects\UserObject.cs" />
-    <Compile Include="ReturnObjects\WaterbutlerFolder.cs" />
     <Compile Include="Startup.cs" />
-    <Compile Include="UserRoles.cs" />
   </ItemGroup>
   <ItemGroup>
     <None Include="App.config" />
diff --git a/src/Project/ReturnObjects/DisciplineObject.cs b/src/Project/ReturnObjects/DisciplineObject.cs
deleted file mode 100644
index 5a2fed7b9ff54a4dbeed030401d239467f7f31d6..0000000000000000000000000000000000000000
--- a/src/Project/ReturnObjects/DisciplineObject.cs
+++ /dev/null
@@ -1,28 +0,0 @@
-using Coscine.ApiCommons.ReturnObjects;
-using Coscine.Database.Model;
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Text;
-using System.Threading.Tasks;
-
-namespace Coscine.Api.Project.ReturnObjects
-{
-    public class DisciplineObject : IReturnObject
-    {
-        public Guid Id { get; set; }
-
-        public string Url { get; set; }
-        public string DisplayNameDe { get; set; }
-
-        public string DisplayNameEn { get; set; }
-
-        public DisciplineObject(Guid id, string url, string displayNameDe, string displayNameEn)
-        {
-            Id = id;
-            Url = url;
-            DisplayNameDe = displayNameDe;
-            DisplayNameEn = displayNameEn;
-        }
-    }
-}
diff --git a/src/Project/ReturnObjects/GitlabResourceTypeObject.cs b/src/Project/ReturnObjects/GitlabResourceTypeObject.cs
deleted file mode 100644
index 54d2189b64f2f606b7b67b283843394d151cc9e6..0000000000000000000000000000000000000000
--- a/src/Project/ReturnObjects/GitlabResourceTypeObject.cs
+++ /dev/null
@@ -1,22 +0,0 @@
-using System;
-
-namespace Coscine.Api.Project.ReturnObjects
-{
-    [Serializable]
-    public class GitlabResourceTypeObject : ResourceTypeOptionObject
-    {
-        public Guid Id { get; set; }
-
-        public int RepositoryNumber { get; set; }
-        public string RepositoryUrl { get; set; }
-        public string Token { get; set; }
-
-        public GitlabResourceTypeObject(Guid id, int repositoryNumber, string repositoryUrl, string token)
-        {
-            Id = id;
-            RepositoryNumber = repositoryNumber;
-            RepositoryUrl = repositoryUrl;
-            Token = token;
-        }
-    }
-}
diff --git a/src/Project/ReturnObjects/InstituteObject.cs b/src/Project/ReturnObjects/InstituteObject.cs
deleted file mode 100644
index 01a77b1f468c4b2ff8b9398ee3598c7014eb9faf..0000000000000000000000000000000000000000
--- a/src/Project/ReturnObjects/InstituteObject.cs
+++ /dev/null
@@ -1,25 +0,0 @@
-using Coscine.ApiCommons.ReturnObjects;
-using Coscine.Database.Model;
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Text;
-using System.Threading.Tasks;
-
-namespace Coscine.Api.Project.ReturnObjects
-{
-    public class InstituteObject : IReturnObject
-    {
-        public Guid Id { get; set; }
-
-        public string Ikz { get; set; }
-        public string DisplayName { get; set; }
-
-        public InstituteObject(Guid id, string ikz, string displayName)
-        {
-            Id = id;
-            Ikz = ikz;
-            DisplayName = displayName;
-        }
-    }
-}
diff --git a/src/Project/ReturnObjects/LicenseObject.cs b/src/Project/ReturnObjects/LicenseObject.cs
deleted file mode 100644
index 16f617bb1c98d86d8a982094c8cc03a101376a6b..0000000000000000000000000000000000000000
--- a/src/Project/ReturnObjects/LicenseObject.cs
+++ /dev/null
@@ -1,19 +0,0 @@
-using Coscine.ApiCommons.ReturnObjects;
-using System;
-
-namespace Coscine.Api.Project.ReturnObjects
-{
-    [Serializable]
-    public class LicenseObject : IReturnObject
-    {
-        public Guid Id { get; set; }
-
-        public string DisplayName { get; set; }
-
-        public LicenseObject(Guid id, string displayName)
-        {
-            Id = id;
-            DisplayName = displayName;
-        }
-    }
-}
\ No newline at end of file
diff --git a/src/Project/ReturnObjects/ProjectObject.cs b/src/Project/ReturnObjects/ProjectObject.cs
deleted file mode 100644
index 389ea945aa8c5805ceb6a6849b5a9f7698ac7026..0000000000000000000000000000000000000000
--- a/src/Project/ReturnObjects/ProjectObject.cs
+++ /dev/null
@@ -1,49 +0,0 @@
-using Coscine.Api.Project.Models;
-using Coscine.ApiCommons.ReturnObjects;
-using System;
-using System.Collections.Generic;
-
-namespace Coscine.Api.Project.ReturnObjects
-{
-
-    [Serializable]
-    public class ProjectObject : IReturnObject
-    {
-        public Guid Id { get; set; }
-
-        public string Description { get; set; }
-        public string DisplayName { get; set; }
-        public DateTime StartDate { get; set; }
-        public DateTime EndDate { get; set; }
-        public string Keywords { get; set; }
-
-        public string ProjectName { get; set; }
-        public string PrincipleInvestigators { get; set; }
-        public string GrantId { get; set; }
-
-        public IEnumerable<DisciplineObject> Disciplines { get; set; }
-        public IEnumerable<InstituteObject> Institutes { get; set; }
-        public VisibilityObject Visibility { get; set; }
-
-        public Guid ParentId { get; set; }
-        
-        public ProjectObject(Guid id, string description, string displayName, DateTime startDate, DateTime endDate, string keywords, string projectName, string principleInvestigators, string grantId, IEnumerable<DisciplineObject> discipline, IEnumerable<InstituteObject> institute, VisibilityObject visibility, Guid parentId = new Guid())
-        {
-            Id = id;
-            Description = description;
-            DisplayName = displayName;
-            StartDate = startDate;
-            EndDate = endDate;
-            Keywords = keywords;
-            ParentId = parentId;
-
-            ProjectName = projectName;
-            PrincipleInvestigators = principleInvestigators;
-            GrantId = grantId;
-
-            Disciplines = discipline;
-            Institutes = institute;
-            Visibility = visibility;
-        }
-    }
-}
diff --git a/src/Project/ReturnObjects/ProjectRoleObject.cs b/src/Project/ReturnObjects/ProjectRoleObject.cs
deleted file mode 100644
index a35826e48dc528dd79f3bdeeffb941ad377437f2..0000000000000000000000000000000000000000
--- a/src/Project/ReturnObjects/ProjectRoleObject.cs
+++ /dev/null
@@ -1,25 +0,0 @@
-using Coscine.ApiCommons.ReturnObjects;
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Text;
-using System.Threading.Tasks;
-
-namespace Coscine.Api.Project.ReturnObjects
-{
-    [Serializable]
-    public class ProjectRoleObject : IReturnObject
-    {
-        public Guid ProjectId { get; set; }
-        public UserObject User { get; set; }
-        public RoleObject Role { get; set; }
-
-        public ProjectRoleObject(Guid projectId, UserObject user, RoleObject role)
-        {
-            ProjectId = projectId;
-            User = user;
-            Role = role;
-        }
-
-    }
-}
diff --git a/src/Project/ReturnObjects/RDSResourceTypeObject.cs b/src/Project/ReturnObjects/RDSResourceTypeObject.cs
deleted file mode 100644
index daa4de5dca7007240612934685a83e5820a6145c..0000000000000000000000000000000000000000
--- a/src/Project/ReturnObjects/RDSResourceTypeObject.cs
+++ /dev/null
@@ -1,19 +0,0 @@
-using System;
-
-namespace Coscine.Api.Project.ReturnObjects
-{
-    [Serializable]
-    public class RDSResourceTypeObject : ResourceTypeOptionObject
-    {
-        public Guid Id { get; set; }
-        public string BucketName { get; set; }
-        public int Size { get; set; }
-
-        public RDSResourceTypeObject(Guid id, string bucketName, int size)
-        {
-            Id = id;
-            BucketName = bucketName;
-            Size = size;
-        }
-    }
-}
diff --git a/src/Project/ReturnObjects/ResourceObject.cs b/src/Project/ReturnObjects/ResourceObject.cs
deleted file mode 100644
index 9f0132f6b1ca7fa8711f4cdc8c88e7a287d3b351..0000000000000000000000000000000000000000
--- a/src/Project/ReturnObjects/ResourceObject.cs
+++ /dev/null
@@ -1,50 +0,0 @@
-using Coscine.ApiCommons.ReturnObjects;
-using Newtonsoft.Json.Linq;
-using System;
-using System.Collections.Generic;
-
-namespace Coscine.Api.Project.ReturnObjects
-{
-    [Serializable]
-    public class ResourceObject : IReturnObject
-    {
-        public Guid Id { get; set; }
-        public string PID { get { return Program.Configuration.GetStringAndWait("coscine/global/epic/prefix") + "/" + Id.ToString(); } }
-        public string DisplayName { get; set; }
-        public string ResourceName { get; set; }
-        public string Description { get; set; }
-        public string Keywords { get; set; }
-        public string UsageRights { get; set; }
-        public ResourceTypeObject Type { get; set; }
-        public IEnumerable<DisciplineObject> Disciplines { get; set; }
-        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 Guid? Creator { get; set; }
-
-        public ResourceObject(Guid id,  string displayName, string resourceName, string description, string keywords, string usageRights, ResourceTypeObject type, IEnumerable<DisciplineObject> disciplines, VisibilityObject visibility, LicenseObject license, JObject resourceTypeOption, string applicationProfile, JToken fixedValues, Guid? creator = null)
-        {
-            Id = id;
-
-            DisplayName = displayName;
-            ResourceName = resourceName;
-            Description = description;
-            Keywords = keywords;
-            UsageRights = usageRights;
-            
-            Type = type;
-            Disciplines = disciplines;
-            Visibility = visibility;
-            License = license;
-
-            ResourceTypeOption = resourceTypeOption;
-
-            ApplicationProfile = applicationProfile;
-            FixedValues = fixedValues;
-
-            Creator = creator;
-        }
-    }
-}
diff --git a/src/Project/ReturnObjects/ResourceTypeObject.cs b/src/Project/ReturnObjects/ResourceTypeObject.cs
deleted file mode 100644
index 63e26afcb139d9dbe521617b21c878c9487d22d6..0000000000000000000000000000000000000000
--- a/src/Project/ReturnObjects/ResourceTypeObject.cs
+++ /dev/null
@@ -1,23 +0,0 @@
-using Coscine.ApiCommons.ReturnObjects;
-using System;
-
-namespace Coscine.Api.Project.ReturnObjects
-{
-    [Serializable]
-    public class ResourceTypeObject : IReturnObject
-    {
-        public Guid Id { get; set; }
-
-        public string DisplayName { get; set; }
-
-        public bool Enabled { get; set; }
-
-        public ResourceTypeObject(Guid id, string displayName, bool enabled)
-        {
-            Id = id;
-            DisplayName = displayName;
-            Enabled = enabled;
-        }
-
-    }
-}
diff --git a/src/Project/ReturnObjects/ResourceTypeOptionObject.cs b/src/Project/ReturnObjects/ResourceTypeOptionObject.cs
deleted file mode 100644
index 194e529afebb74835a45b9a045a2663703edba63..0000000000000000000000000000000000000000
--- a/src/Project/ReturnObjects/ResourceTypeOptionObject.cs
+++ /dev/null
@@ -1,10 +0,0 @@
-using Coscine.ApiCommons.ReturnObjects;
-using System;
-
-namespace Coscine.Api.Project.ReturnObjects
-{
-    [Serializable]
-    public abstract class ResourceTypeOptionObject : IReturnObject
-    {
-    }
-}
\ No newline at end of file
diff --git a/src/Project/ReturnObjects/RoleObject.cs b/src/Project/ReturnObjects/RoleObject.cs
deleted file mode 100644
index a9b2afa8d2aa8e57d52727196877ae047cc3a052..0000000000000000000000000000000000000000
--- a/src/Project/ReturnObjects/RoleObject.cs
+++ /dev/null
@@ -1,19 +0,0 @@
-using Coscine.ApiCommons.ReturnObjects;
-using System;
-
-namespace Coscine.Api.Project.ReturnObjects
-{
-    [Serializable]
-    public class RoleObject : IReturnObject
-    {
-        public Guid Id { get; set; }
-
-        public string DisplayName { get; set; }
-
-        public RoleObject(Guid id, string displayName)
-        {
-            Id = id;
-            DisplayName = displayName;
-        }
-    }
-}
\ No newline at end of file
diff --git a/src/Project/ReturnObjects/S3ResourceTypeObject.cs b/src/Project/ReturnObjects/S3ResourceTypeObject.cs
deleted file mode 100644
index f539a9744ae788649efd7b7c21d5527ed36396a6..0000000000000000000000000000000000000000
--- a/src/Project/ReturnObjects/S3ResourceTypeObject.cs
+++ /dev/null
@@ -1,22 +0,0 @@
-using System;
-
-namespace Coscine.Api.Project.ReturnObjects
-{
-    [Serializable]
-    public class S3ResourceTypeObject : ResourceTypeOptionObject
-    {
-        public Guid Id { get; set; }
-        public string BucketName { get; set; }
-        public string AccessKey { get; set; }
-        public string SecretKey { get; set; }
-
-        public S3ResourceTypeObject(Guid id, string bucketName, string accessKey, string secretKey)
-        {
-            Id = id;
-            BucketName = bucketName;
-
-            AccessKey = accessKey;
-            SecretKey = secretKey;
-        }
-    }
-}
diff --git a/src/Project/ReturnObjects/UserObject.cs b/src/Project/ReturnObjects/UserObject.cs
deleted file mode 100644
index 13114f86363b2c4bdf19821627b18cf28a82ce49..0000000000000000000000000000000000000000
--- a/src/Project/ReturnObjects/UserObject.cs
+++ /dev/null
@@ -1,28 +0,0 @@
-using Coscine.ApiCommons.ReturnObjects;
-using System;
-
-namespace Coscine.Api.Project.ReturnObjects
-{
-    [Serializable]
-    public class UserObject : IReturnObject
-    {
-        public Guid Id { get; set; }
-
-        public string DisplayName { get; set; }
-
-        public string Givenname { get; set; }
-
-        public string Surname { get; set; }
-
-        public string EmailAddress { get; set; }
-
-        public UserObject(Guid id, string displayName, string givenname, string surname, string emailAddress)
-        {
-            Id = id;
-            DisplayName = displayName;
-            Givenname = givenname;
-            Surname = surname;
-            EmailAddress = emailAddress;
-        }
-    }
-}
diff --git a/src/Project/ReturnObjects/VisibilityObject.cs b/src/Project/ReturnObjects/VisibilityObject.cs
deleted file mode 100644
index 63fca3be1a2fabd7e85bf0ffdff5c313fa3b2346..0000000000000000000000000000000000000000
--- a/src/Project/ReturnObjects/VisibilityObject.cs
+++ /dev/null
@@ -1,23 +0,0 @@
-using Coscine.ApiCommons.ReturnObjects;
-using Coscine.Database.Model;
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Text;
-using System.Threading.Tasks;
-
-namespace Coscine.Api.Project.ReturnObjects
-{
-    public class VisibilityObject : IReturnObject
-    {
-        public Guid Id { get; set; }
-
-        public string DisplayName { get; set; }
-
-        public VisibilityObject(Guid id, string displayName)
-        {
-            Id = id;
-            DisplayName = displayName;
-        }
-    }
-}
diff --git a/src/Project/ReturnObjects/WaterbutlerFolder.cs b/src/Project/ReturnObjects/WaterbutlerFolder.cs
deleted file mode 100644
index 5af33b7e7ba0d60c21f1f34430bcdf3e0a9f8c65..0000000000000000000000000000000000000000
--- a/src/Project/ReturnObjects/WaterbutlerFolder.cs
+++ /dev/null
@@ -1,52 +0,0 @@
-using System;
-using System.Collections.Generic;
-using Newtonsoft.Json.Linq;
-
-namespace Coscine.Api.Project.ReturnObjects
-{
-    public class WaterbutlerObject
-    {
-        public bool IsFolder { get; set; } = false;
-        public string Absolutepath { get; set; } = null;
-        public string Name { get; set; } = null;
-        public string LastModified { get; set; }
-        public string Created { get; set; }
-        public string Size { get; set; }
-        // Shallow! Only one level deep. 
-        // Should the folder contain additional folders, they will be empty/null.
-        public List<WaterbutlerObject> Content { get; set; } = null;
-
-        public WaterbutlerObject()
-        {
-
-        }
-
-        public WaterbutlerObject(string path, JToken data)
-        {
-            Absolutepath = path;
-            Content = new List<WaterbutlerObject>();
-            IsFolder = true;
-
-            if (data == null)
-            {
-                throw new ArgumentNullException("The data for the WaterbutlerFolder cannot be null.");
-            }
-
-            foreach (var obj in data)
-            {
-                if (obj["type"].ToObject<string>() == "files")
-                {
-                    Content.Add(new WaterbutlerObject
-                    {
-                        IsFolder = obj["attributes"]["kind"].ToObject<string>() == "folder",
-                        Absolutepath = obj["attributes"]["path"].ToObject<string>(),
-                        Name = obj["attributes"]["name"].ToObject<string>(),
-                        Created = obj["attributes"]["modified_utc"]?.ToObject<string>(),
-                        LastModified = obj["attributes"]["LastModified_utc"]?.ToObject<string>(),
-                        Size = obj["attributes"]["size"]?.ToObject<string>(),
-                    });
-                }
-            }
-        }
-    }
-}
diff --git a/src/Project/UserRoles.cs b/src/Project/UserRoles.cs
deleted file mode 100644
index 4a3b85301f9344ddc458577e6533dd782f871e22..0000000000000000000000000000000000000000
--- a/src/Project/UserRoles.cs
+++ /dev/null
@@ -1,8 +0,0 @@
-namespace Coscine.Api.Project
-{
-    public static class UserRoles
-    {
-        public static string Member { get; } = "member";
-        public static string Owner { get; } = "owner";
-    }
-}
diff --git a/src/Project/packages.config b/src/Project/packages.config
index 05173a40b6acca0131c64e0b7fbd76d20340ccca..65ac45bf4956ca051199e47836192659ab9822c8 100644
--- a/src/Project/packages.config
+++ b/src/Project/packages.config
@@ -2,23 +2,21 @@
 <packages>
   <package id="AutoMapper" version="8.0.0" targetFramework="net472" />
   <package id="AutoMapper.Extensions.Microsoft.DependencyInjection" version="6.0.0" targetFramework="net472" />
+  <package id="Castle.Core" version="4.4.0" targetFramework="net472" />
   <package id="Consul" version="0.7.2.6" targetFramework="net472" />
-  <package id="Coscine.Action" version="1.9.0" targetFramework="net472" />
-  <package id="Coscine.ApiCommons" version="1.5.0" targetFramework="net472" />
+  <package id="Coscine.Action" version="1.10.0" targetFramework="net472" />
+  <package id="Coscine.ApiCommons" version="1.6.0" targetFramework="net472" />
   <package id="Coscine.Configuration" version="1.4.0" targetFramework="net472" />
-  <package id="Coscine.Database" version="1.15.1" targetFramework="net472" />
+  <package id="Coscine.Database" version="1.16.0" targetFramework="net472" />
   <package id="Coscine.Logging" version="1.0.1" targetFramework="net472" />
   <package id="Coscine.ProxyApi" version="1.2.1" 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="Coscine.SharePoint.Webparts.Vue" version="1.5.0" 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="LinqKit" version="1.1.17" 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" version="2.2.0" targetFramework="net472" />
@@ -121,7 +119,8 @@
   <package id="Microsoft.IdentityModel.Tokens" version="5.6.0" targetFramework="net472" />
   <package id="Microsoft.Net.Http.Headers" version="2.2.0" targetFramework="net472" />
   <package id="Microsoft.Win32.Registry" version="4.5.0" targetFramework="net472" />
-  <package id="Newtonsoft.Json" version="12.0.2" targetFramework="net472" />
+  <package id="Moq" version="4.13.1" targetFramework="net472" />
+  <package id="Newtonsoft.Json" version="12.0.3" targetFramework="net472" />
   <package id="Newtonsoft.Json.Bson" version="1.0.2" targetFramework="net472" />
   <package id="NLog" version="4.6.8" targetFramework="net472" />
   <package id="NLog.Config" version="4.6.8" targetFramework="net472" />