diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 3258bacc9c30fb3897a2ea1b322c9e5e0764e15d..9dece0b5358b8cd94bfc8d8fd888563ca816cba1 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -4,10 +4,10 @@ include:
       - /dotnet.yml
 
 stages:
-  - migrate
+  #- migrate
   - build
-  - test
-  - cleanup
+  #- test
+  #- cleanup
   - publish
 
 variables:
@@ -15,32 +15,32 @@ variables:
   # Example DB_NAME = X_COSCINE_TMP_EF_1ecfd275
   DB_NAME: "X_COSCINE_TMP_EF_$CI_COMMIT_SHORT_SHA"
 
-migrate:
-  stage: migrate
-  extends: .dotnet-windows-base
-  script: 
-    - dotnet tool install dotnet-ef; echo "1"
-    - dotnet tool update dotnet-ef
-    # List dependencies that will be used during build
-    - dotnet restore src --no-cache
-    - dotnet list src package
-    # Create new database and migrate to latest state
-    - dotnet run --project .\src\Database.Actions -- --action-create --name $DB_NAME --source $DB_DATA_SOURCE --user $DB_USER_ID --pw $DB_PASSWORD
-    # Scaffold created database
-    - dotnet ef dbcontext scaffold "Data Source=$DB_DATA_SOURCE;Integrated Security=False;User ID=$DB_USER_ID;Password=$DB_PASSWORD;Database=$DB_NAME" Microsoft.EntityFrameworkCore.SqlServer -o DataModel -c "Model" -f --no-onconfiguring --project "src\Scaffolding"
-  artifacts:
-    paths:
-      - src\Scaffolding\DataModel
-    expire_in: 1 week
+#migrate:
+#  stage: migrate
+#  extends: .dotnet-windows-base
+#  script: 
+#    - dotnet tool install dotnet-ef; echo "1"
+#    - dotnet tool update dotnet-ef
+#    # List dependencies that will be used during build
+#    - dotnet restore src --no-cache
+#    - dotnet list src package
+#    # Create new database and migrate to latest state
+#    - dotnet run --project .\src\Database.Actions -- --action-create --name $DB_NAME --source $DB_DATA_SOURCE --user $DB_USER_ID --pw $DB_PASSWORD
+#    # Scaffold created database
+#    - dotnet ef dbcontext scaffold "Data Source=$DB_DATA_SOURCE;Integrated Security=False;User ID=$DB_USER_ID;Password=$DB_PASSWORD;Database=$DB_NAME" Microsoft.EntityFrameworkCore.SqlServer -o DataModel -c "Model" -f --no-onconfiguring --project "src\Scaffolding"
+#  artifacts:
+#    paths:
+#      - src\Scaffolding\DataModel
+#    expire_in: 1 week
 
 
-cleanup:
-  stage: cleanup
-  extends: .dotnet-windows-base
-  script: 
-    # Drop created database
-    - dotnet run -p .\src\Database.Actions -- --action-drop --name $DB_NAME --source $DB_DATA_SOURCE --user $DB_USER_ID --pw $DB_PASSWORD
-  when: always
+#cleanup:
+#  stage: cleanup
+#  extends: .dotnet-windows-base
+#  #script: 
+#    # Drop created database
+#    #- dotnet run -p .\src\Database.Actions -- --action-drop --name $DB_NAME --source $DB_DATA_SOURCE --user $DB_USER_ID --pw $DB_PASSWORD
+#  when: always
 
 build-branch:
   extends: .build-branch
@@ -48,18 +48,18 @@ build-branch:
 build-nuget-release:
   extends: .build-nuget-release
 
-test:  
-  extends: .dotnet-windows-base
-  stage: test
-  script:
-    - $env:DatabaseName=$DB_NAME
-    # Discover test projects in `src` folder
-    - dotnet test src
-  # TODO Add Dotnet Test coverage
-  only:
-    # Do not run tests for chore commit by bot but re-run tests for the semver tag before pushing to npm
-    variables:
-      - $GITLAB_USER_ID != $GIT_BOT_USER_ID || $CI_COMMIT_TAG =~ /v[0-9]*\.[0-9]*\.[0-9]*/
+#test:  
+#  extends: .dotnet-windows-base
+#  stage: test
+#  script:
+#    - $env:DatabaseName=$DB_NAME
+#    # Discover test projects in `src` folder
+#    - dotnet test src
+#  # TODO Add Dotnet Test coverage
+#  only:
+#    # Do not run tests for chore commit by bot but re-run tests for the semver tag before pushing to npm
+#    variables:
+#      - $GITLAB_USER_ID != $GIT_BOT_USER_ID || $CI_COMMIT_TAG =~ /v[0-9]*\.[0-9]*\.[0-9]*/
 
 publish-branch-prerelease:
   extends: .publish-branch-prerelease
diff --git a/GitVersion.yml b/GitVersion.yml
index 1bdc0fe219f5f35d8a024a66d9fd715f44539640..5a111397d4a13dbd97c0549853e62ebaf3abd2cf 100644
--- a/GitVersion.yml
+++ b/GitVersion.yml
@@ -1,5 +1,5 @@
 mode: ContinuousDeployment
-next-version: 1.0.0
+next-version: 2.22.0
 major-version-bump-message: 'Breaking:'
 minor-version-bump-message: '(Update|New):'
 patch-version-bump-message: 'Fix:'
diff --git a/src/Database.Actions/Database.Actions.csproj b/src/Database.Actions/Database.Actions.csproj
index 28142ceb29b50340546c805d9eabfd038dad2de9..318d986bed6d52488e6d6bfff7a0129043ef0d12 100644
--- a/src/Database.Actions/Database.Actions.csproj
+++ b/src/Database.Actions/Database.Actions.csproj
@@ -4,7 +4,7 @@
 		<RootNamespace>Coscine.Database.Actions</RootNamespace>
 		<AssemblyName>Coscine.Database.Actions</AssemblyName>
 		<TargetFramework>net6.0</TargetFramework>
-		<Version>2.20.0</Version>
+		<Version>2.21.0</Version>
 	</PropertyGroup>
 
 	<ItemGroup>
diff --git a/src/Database.Tests/Database.Tests.csproj b/src/Database.Tests/Database.Tests.csproj
index 953c5b59c8001f11372f2ceef81efc0c0dbc85ea..cc816e62f794183ce9dcb5bc112f4907ef1b6d36 100644
--- a/src/Database.Tests/Database.Tests.csproj
+++ b/src/Database.Tests/Database.Tests.csproj
@@ -5,7 +5,7 @@
 		<AssemblyName>Coscine.Database.Tests</AssemblyName>
 		<TargetFramework>net6.0</TargetFramework>
 		<GenerateAssemblyInfo>false</GenerateAssemblyInfo>
-		<Version>2.20.0</Version>
+		<Version>2.21.0</Version>
 	</PropertyGroup>
 
 	<ItemGroup>
diff --git a/src/Database/Database.csproj b/src/Database/Database.csproj
index bddb13c83d2ef7ba7fae1b921b141a49f7788768..523494d1e27df1bcd4eeea8d3dbe5224b41356e8 100644
--- a/src/Database/Database.csproj
+++ b/src/Database/Database.csproj
@@ -4,9 +4,9 @@
 		<RootNamespace>Coscine.Database</RootNamespace>
 		<AssemblyName>Coscine.Database</AssemblyName>
 		<TargetFramework>net6.0</TargetFramework>
-		<Version>2.20.0</Version>
+		<Version>2.21.0</Version>
 	</PropertyGroup>
-	
+
 	<PropertyGroup>
 		<Authors>RWTH Aachen University</Authors>
 		<Company>IT Center, RWTH Aachen University</Company>
@@ -16,23 +16,23 @@
 		<PackageProjectUrl>https://git.rwth-aachen.de/coscine/backend/libraries/database</PackageProjectUrl>
 		<PackageRequireLicenseAcceptance>false</PackageRequireLicenseAcceptance>
 	</PropertyGroup>
-	
+
 	<PropertyGroup>
 		<SignAssembly>true</SignAssembly>
 		<AssemblyOriginatorKeyFile>Coscine.Database.Key.snk</AssemblyOriginatorKeyFile>
 	</PropertyGroup>
-	
+
 	<ItemGroup>
 		<None Include="Coscine.Database.Key.snk" />
 		<Reference Include="System.Web" Condition="'$(TargetFramework)' == 'net461'" />
 	</ItemGroup>
-	
+
 	<ItemGroup>
 		<Compile Include="..\Scaffolding\DataModel\*.*">
 			<Link>DataModel\%(Filename)%(Extension)</Link>
 		</Compile>
 	</ItemGroup>
-	
+
 	<ItemGroup>
 		<PackageReference Include="Coscine.Configuration" Version="*-*" />
 		<PackageReference Include="LinqKit" Version="1.2.3" />
@@ -40,7 +40,7 @@
 		<PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="6.0.11" PrivateAssets="all" />
 		<PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="6.0.11" />
 	</ItemGroup>
-	
+
 	<PropertyGroup>
 		<LangVersion>Preview</LangVersion>
 	</PropertyGroup>
diff --git a/src/Database/Models/ProjectModel.cs b/src/Database/Models/ProjectModel.cs
index c6c19c7d3e6e54e5d715914212d7552ce67474d0..e1bb715ed91115ee6920c3e6b602c32a57861f4e 100644
--- a/src/Database/Models/ProjectModel.cs
+++ b/src/Database/Models/ProjectModel.cs
@@ -93,10 +93,7 @@ namespace Coscine.Database.Models
         {
             if (!databaseObject.Deleted)
             {
-                return DatabaseConnection.ConnectToDatabase((db) =>
-                {
-                    return (int)db.Update(databaseObject).State;
-                });
+                return DatabaseConnection.ConnectToDatabase((db) => (int)db.Update(databaseObject).State);
             }
             else
             {
diff --git a/src/Database/Models/UserModel.cs b/src/Database/Models/UserModel.cs
index a4f0efcf5222effe2ff063b3ca27a21aaa8b83e0..71043d881941b8e4f5b1d7205c560c076ec39ec2 100644
--- a/src/Database/Models/UserModel.cs
+++ b/src/Database/Models/UserModel.cs
@@ -65,7 +65,6 @@ namespace Coscine.Database.Models
                 user.Title == null ? null : new TitleObject(user.Title.Id, user.Title.DisplayName),
                 user.Language == null ? null : new LanguageObject(user.Language.Id, user.Language.DisplayName, user.Language.Abbreviation),
                 user.Organization,
-                user.Institute,
                 disciplines,
                 false,
                 externalAuthenticators);
@@ -78,7 +77,6 @@ namespace Coscine.Database.Models
             user.Surname = userObject.Surname;
             user.DisplayName = userObject.DisplayName;
             user.Organization = userObject.Organization;
-            user.Institute = userObject.Institute;
             user.LanguageId = userObject.Language?.Id;
             SetDisciplines(user, userObject.Disciplines);
             return Update(user);
diff --git a/src/Database/ReturnObjects/UserObject.cs b/src/Database/ReturnObjects/UserObject.cs
index 959285634286b12f6297d863921085473b5e0a1a..daa9f425875205b8a1741d32704832290c58a5e3 100644
--- a/src/Database/ReturnObjects/UserObject.cs
+++ b/src/Database/ReturnObjects/UserObject.cs
@@ -24,15 +24,13 @@ namespace Coscine.Database.ReturnObjects
 
         public string Organization { get; set; }
 
-        public string Institute { get; set; }
-
         public IEnumerable<DisciplineObject> Disciplines { get; set; }
 
         public bool IsRegistered { get; set; }
 
         public IEnumerable<ExternalAuthenticatorsObject> ExternalAuthenticators { get; set; }
 
-        public UserObject(Guid id, string displayName, string givenname, string surname, string emailAddress, bool hasProjectRole = false, TitleObject title = null, LanguageObject language = null, string organization = "", string institute = "", IEnumerable<DisciplineObject> disciplines = null, bool isRegistered = false, IEnumerable<ExternalAuthenticatorsObject> externalAuthenticators = null)
+        public UserObject(Guid id, string displayName, string givenname, string surname, string emailAddress, bool hasProjectRole = false, TitleObject title = null, LanguageObject language = null, string organization = "", IEnumerable<DisciplineObject> disciplines = null, bool isRegistered = false, IEnumerable<ExternalAuthenticatorsObject> externalAuthenticators = null)
         {
             Id = id;
             DisplayName = displayName;
@@ -43,7 +41,6 @@ namespace Coscine.Database.ReturnObjects
             Title = title;
             Language = language;
             Organization = organization;
-            Institute = institute;
             Disciplines = disciplines;
 
             HasProjectRole = hasProjectRole;
diff --git a/src/Scaffolding/DataModel/ActivityLog.cs b/src/Scaffolding/DataModel/ActivityLog.cs
new file mode 100644
index 0000000000000000000000000000000000000000..058de8788c5d8291bd5d1dac33237d937c5d8a34
--- /dev/null
+++ b/src/Scaffolding/DataModel/ActivityLog.cs
@@ -0,0 +1,18 @@
+using System;
+using System.Collections.Generic;
+
+namespace Coscine.Database.DataModel
+{
+    public partial class ActivityLog
+    {
+        public Guid Id { get; set; }
+        public string ApiPath { get; set; }
+        public Guid UserId { get; set; }
+        public DateTime ActivityTimestamp { get; set; }
+        public string HttpAction { get; set; }
+        public string ActionName { get; set; }
+        public string ControllerName { get; set; }
+
+        public virtual User User { get; set; }
+    }
+}
diff --git a/src/Scaffolding/DataModel/License.cs b/src/Scaffolding/DataModel/License.cs
index 169e2f1693fed78912f9561ae85922def01e2344..6069b831f01d245d2f7e12c5baa08a0a86717181 100644
--- a/src/Scaffolding/DataModel/License.cs
+++ b/src/Scaffolding/DataModel/License.cs
@@ -12,6 +12,7 @@ namespace Coscine.Database.DataModel
 
         public Guid Id { get; set; }
         public string DisplayName { get; set; }
+        public string Url { get; set; }
 
         public virtual ICollection<Resource> Resources { get; set; }
     }
diff --git a/src/Scaffolding/DataModel/Model.cs b/src/Scaffolding/DataModel/Model.cs
index 1b3b25146d54c80f47638b1b4c88125e61646f10..71976797f72706f2d91a3b3ce335f0cdce60ea53 100644
--- a/src/Scaffolding/DataModel/Model.cs
+++ b/src/Scaffolding/DataModel/Model.cs
@@ -1,4 +1,4 @@
-using System;
+using System;
 using System.Collections.Generic;
 using Microsoft.EntityFrameworkCore;
 using Microsoft.EntityFrameworkCore.Metadata;
@@ -17,6 +17,7 @@ namespace Coscine.Database.DataModel
         }
 
         public virtual DbSet<ActivatedFeature> ActivatedFeatures { get; set; }
+        public virtual DbSet<ActivityLog> ActivityLogs { get; set; }
         public virtual DbSet<ApiToken> ApiTokens { get; set; }
         public virtual DbSet<ContactChange> ContactChanges { get; set; }
         public virtual DbSet<Discipline> Disciplines { get; set; }
@@ -35,6 +36,7 @@ namespace Coscine.Database.DataModel
         public virtual DbSet<Project> Projects { get; set; }
         public virtual DbSet<ProjectDiscipline> ProjectDisciplines { get; set; }
         public virtual DbSet<ProjectInstitute> ProjectInstitutes { get; set; }
+        public virtual DbSet<ProjectPublicationRequest> ProjectPublicationRequests { get; set; }
         public virtual DbSet<ProjectQuota> ProjectQuotas { get; set; }
         public virtual DbSet<ProjectResource> ProjectResources { get; set; }
         public virtual DbSet<ProjectRole> ProjectRoles { get; set; }
@@ -58,6 +60,10 @@ namespace Coscine.Database.DataModel
         {
             modelBuilder.Entity<ActivatedFeature>(entity =>
             {
+                entity.HasIndex(e => e.FeatureId, "IX_ActivatedFeatures_FeatureId");
+
+                entity.HasIndex(e => e.ProjectId, "IX_ActivatedFeatures_ProjectId");
+
                 entity.Property(e => e.Id).HasDefaultValueSql("(newid())");
 
                 entity.HasOne(d => d.Feature)
@@ -73,8 +79,39 @@ namespace Coscine.Database.DataModel
                     .HasConstraintName("FK_ActivatedFeatures_ProjectId_Projects_Id");
             });
 
+            modelBuilder.Entity<ActivityLog>(entity =>
+            {
+                entity.HasIndex(e => e.UserId, "IX_ActivityLogs_UserId");
+
+                entity.Property(e => e.Id).ValueGeneratedNever();
+
+                entity.Property(e => e.ActionName)
+                    .HasMaxLength(255)
+                    .HasDefaultValueSql("(N'NA')");
+
+                entity.Property(e => e.ApiPath)
+                    .IsRequired()
+                    .HasMaxLength(255);
+
+                entity.Property(e => e.ControllerName)
+                    .HasMaxLength(255)
+                    .HasDefaultValueSql("(N'NA')");
+
+                entity.Property(e => e.HttpAction)
+                    .IsRequired()
+                    .HasMaxLength(10)
+                    .HasDefaultValueSql("(N'NA')");
+
+                entity.HasOne(d => d.User)
+                    .WithMany(p => p.ActivityLogs)
+                    .HasForeignKey(d => d.UserId)
+                    .OnDelete(DeleteBehavior.ClientSetNull);
+            });
+
             modelBuilder.Entity<ApiToken>(entity =>
             {
+                entity.HasIndex(e => e.UserId, "IX_ApiTokens_UserId");
+
                 entity.Property(e => e.Id).HasDefaultValueSql("(newid())");
 
                 entity.Property(e => e.Expiration).HasColumnType("datetime");
@@ -98,6 +135,8 @@ namespace Coscine.Database.DataModel
 
                 entity.ToTable("ContactChange");
 
+                entity.HasIndex(e => e.UserId, "IX_ContactChange_UserId");
+
                 entity.Property(e => e.RelationId).HasDefaultValueSql("(newid())");
 
                 entity.Property(e => e.ConfirmationToken).HasDefaultValueSql("(newid())");
@@ -141,6 +180,10 @@ namespace Coscine.Database.DataModel
             {
                 entity.HasKey(e => e.RelationId);
 
+                entity.HasIndex(e => e.ExternalAuthenticatorId, "IX_ExternalIds_ExternalAuthenticatorId");
+
+                entity.HasIndex(e => e.UserId, "IX_ExternalIds_UserId");
+
                 entity.Property(e => e.RelationId).HasDefaultValueSql("(newid())");
 
                 entity.Property(e => e.ExternalId1)
@@ -212,6 +255,10 @@ namespace Coscine.Database.DataModel
             {
                 entity.HasKey(e => e.RelationId);
 
+                entity.HasIndex(e => e.GroupId, "IX_GroupMemberships_GroupId");
+
+                entity.HasIndex(e => e.UserId, "IX_GroupMemberships_UserId");
+
                 entity.Property(e => e.RelationId).HasDefaultValueSql("(newid())");
 
                 entity.HasOne(d => d.Group)
@@ -229,6 +276,12 @@ namespace Coscine.Database.DataModel
 
             modelBuilder.Entity<Invitation>(entity =>
             {
+                entity.HasIndex(e => e.Issuer, "IX_Invitations_Issuer");
+
+                entity.HasIndex(e => e.Project, "IX_Invitations_Project");
+
+                entity.HasIndex(e => e.Role, "IX_Invitations_Role");
+
                 entity.Property(e => e.Id).HasDefaultValueSql("(newid())");
 
                 entity.Property(e => e.Expiration).HasColumnType("datetime");
@@ -318,6 +371,8 @@ namespace Coscine.Database.DataModel
             {
                 entity.ToTable("MetadataExtraction");
 
+                entity.HasIndex(e => e.ResourceId, "IX_MetadataExtraction_ResourceId");
+
                 entity.Property(e => e.Id).HasDefaultValueSql("(newid())");
 
                 entity.HasOne(d => d.Resource)
@@ -328,6 +383,8 @@ namespace Coscine.Database.DataModel
 
             modelBuilder.Entity<Project>(entity =>
             {
+                entity.HasIndex(e => e.VisibilityId, "IX_Projects_VisibilityId");
+
                 entity.Property(e => e.Id).HasDefaultValueSql("(newid())");
 
                 entity.Property(e => e.DateCreated)
@@ -370,6 +427,10 @@ namespace Coscine.Database.DataModel
 
                 entity.ToTable("ProjectDiscipline");
 
+                entity.HasIndex(e => e.DisciplineId, "IX_ProjectDiscipline_DisciplineId");
+
+                entity.HasIndex(e => e.ProjectId, "IX_ProjectDiscipline_ProjectId");
+
                 entity.Property(e => e.RelationId).HasDefaultValueSql("(newid())");
 
                 entity.HasOne(d => d.Discipline)
@@ -391,6 +452,8 @@ namespace Coscine.Database.DataModel
 
                 entity.ToTable("ProjectInstitute");
 
+                entity.HasIndex(e => e.ProjectId, "IX_ProjectInstitute_ProjectId");
+
                 entity.Property(e => e.RelationId).HasDefaultValueSql("(newid())");
 
                 entity.Property(e => e.OrganizationUrl)
@@ -405,10 +468,52 @@ namespace Coscine.Database.DataModel
                     .HasConstraintName("FK_ProjectInstitute_ProjectId_Projects_Id");
             });
 
+            modelBuilder.Entity<ProjectPublicationRequest>(entity =>
+            {
+                entity.HasIndex(e => e.CreatorId, "IX_ProjectPublicationRequests_CreatorId");
+
+                entity.HasIndex(e => e.ProjectId, "IX_ProjectPublicationRequests_ProjectId");
+
+                entity.Property(e => e.Id).ValueGeneratedNever();
+
+                entity.Property(e => e.DateCreated)
+                    .HasColumnType("datetime")
+                    .HasDefaultValueSql("(getutcdate())");
+
+                entity.Property(e => e.PublicationServiceRorId).IsRequired();
+
+                entity.HasOne(d => d.Creator)
+                    .WithMany(p => p.ProjectPublicationRequests)
+                    .HasForeignKey(d => d.CreatorId)
+                    .OnDelete(DeleteBehavior.ClientSetNull);
+
+                entity.HasOne(d => d.Project)
+                    .WithMany(p => p.ProjectPublicationRequests)
+                    .HasForeignKey(d => d.ProjectId)
+                    .OnDelete(DeleteBehavior.ClientSetNull);
+
+                entity.HasMany(d => d.Resources)
+                    .WithMany(p => p.PublicationRequests)
+                    .UsingEntity<Dictionary<string, object>>(
+                        "ProjectPublicationRequestResource",
+                        l => l.HasOne<Resource>().WithMany().HasForeignKey("ResourcesId"),
+                        r => r.HasOne<ProjectPublicationRequest>().WithMany().HasForeignKey("PublicationRequestsId"),
+                        j =>
+                        {
+                            j.HasKey("PublicationRequestsId", "ResourcesId");
+
+                            j.ToTable("ProjectPublicationRequestResource");
+
+                            j.HasIndex(new[] { "ResourcesId" }, "IX_ProjectPublicationRequestResource_ResourcesId");
+                        });
+            });
+
             modelBuilder.Entity<ProjectQuota>(entity =>
             {
                 entity.HasKey(e => e.RelationId);
 
+                entity.HasIndex(e => e.ResourceTypeId, "IX_ProjectQuotas_ResourceTypeId");
+
                 entity.HasIndex(e => new { e.ProjectId, e.ResourceTypeId }, "ProjectIdResourceTypeId")
                     .IsUnique();
 
@@ -435,6 +540,10 @@ namespace Coscine.Database.DataModel
 
                 entity.ToTable("ProjectResource");
 
+                entity.HasIndex(e => e.ProjectId, "IX_ProjectResource_ProjectId");
+
+                entity.HasIndex(e => e.ResourceId, "IX_ProjectResource_ResourceId");
+
                 entity.Property(e => e.RelationId).HasDefaultValueSql("(newid())");
 
                 entity.HasOne(d => d.Project)
@@ -453,6 +562,12 @@ namespace Coscine.Database.DataModel
             {
                 entity.HasKey(e => e.RelationId);
 
+                entity.HasIndex(e => e.ProjectId, "IX_ProjectRoles_ProjectId");
+
+                entity.HasIndex(e => e.RoleId, "IX_ProjectRoles_RoleId");
+
+                entity.HasIndex(e => e.UserId, "IX_ProjectRoles_UserId");
+
                 entity.Property(e => e.RelationId).HasDefaultValueSql("(newid())");
 
                 entity.HasOne(d => d.Project)
@@ -577,6 +692,12 @@ namespace Coscine.Database.DataModel
 
             modelBuilder.Entity<Resource>(entity =>
             {
+                entity.HasIndex(e => e.LicenseId, "IX_Resources_LicenseId");
+
+                entity.HasIndex(e => e.TypeId, "IX_Resources_TypeId");
+
+                entity.HasIndex(e => e.VisibilityId, "IX_Resources_VisibilityId");
+
                 entity.Property(e => e.Id).HasDefaultValueSql("(newid())");
 
                 entity.Property(e => e.ApplicationProfile).HasMaxLength(500);
@@ -594,6 +715,10 @@ namespace Coscine.Database.DataModel
 
                 entity.Property(e => e.Keywords).HasMaxLength(1000);
 
+                entity.Property(e => e.MetadataLocalCopy)
+                    .IsRequired()
+                    .HasDefaultValueSql("(CONVERT([bit],(0)))");
+
                 entity.Property(e => e.ResourceName).HasMaxLength(200);
 
                 entity.Property(e => e.UsageRights).HasMaxLength(200);
@@ -621,6 +746,10 @@ namespace Coscine.Database.DataModel
 
                 entity.ToTable("ResourceDiscipline");
 
+                entity.HasIndex(e => e.DisciplineId, "IX_ResourceDiscipline_DisciplineId");
+
+                entity.HasIndex(e => e.ResourceId, "IX_ResourceDiscipline_ResourceId");
+
                 entity.Property(e => e.RelationId).HasDefaultValueSql("(newid())");
 
                 entity.HasOne(d => d.Discipline)
@@ -688,6 +817,10 @@ namespace Coscine.Database.DataModel
             {
                 entity.HasKey(e => e.RelationId);
 
+                entity.HasIndex(e => e.ProjectId, "IX_SubProjects_ProjectId");
+
+                entity.HasIndex(e => e.SubProjectId, "IX_SubProjects_SubProjectId");
+
                 entity.Property(e => e.RelationId).HasDefaultValueSql("(newid())");
 
                 entity.HasOne(d => d.Project)
@@ -718,6 +851,8 @@ namespace Coscine.Database.DataModel
 
                 entity.ToTable("TOSAccepted");
 
+                entity.HasIndex(e => e.UserId, "IX_TOSAccepted_UserId");
+
                 entity.Property(e => e.RelationId).HasDefaultValueSql("(newid())");
 
                 entity.Property(e => e.Version)
@@ -733,6 +868,10 @@ namespace Coscine.Database.DataModel
 
             modelBuilder.Entity<User>(entity =>
             {
+                entity.HasIndex(e => e.LanguageId, "IX_Users_LanguageId");
+
+                entity.HasIndex(e => e.TitleId, "IX_Users_TitleId");
+
                 entity.Property(e => e.Id).HasDefaultValueSql("(newid())");
 
                 entity.Property(e => e.DisplayName)
@@ -745,7 +884,9 @@ namespace Coscine.Database.DataModel
 
                 entity.Property(e => e.Givenname).HasMaxLength(200);
 
-                entity.Property(e => e.Institute).HasMaxLength(200);
+                entity.Property(e => e.LatestActivity)
+                    .HasColumnType("datetime")
+                    .HasDefaultValueSql("(getutcdate())");
 
                 entity.Property(e => e.Organization).HasMaxLength(200);
 
@@ -766,6 +907,10 @@ namespace Coscine.Database.DataModel
             {
                 entity.HasKey(e => e.RelationId);
 
+                entity.HasIndex(e => e.DisciplineId, "IX_UserDisciplines_DisciplineId");
+
+                entity.HasIndex(e => e.UserId, "IX_UserDisciplines_UserId");
+
                 entity.Property(e => e.RelationId).HasDefaultValueSql("(newid())");
 
                 entity.HasOne(d => d.Discipline)
diff --git a/src/Scaffolding/DataModel/Project.cs b/src/Scaffolding/DataModel/Project.cs
index 24f0af4476a7c91e9ed09f11a509a3ed628c85f9..8e31fa931ea6f39729e1bb529b39c2ea80d8e68b 100644
--- a/src/Scaffolding/DataModel/Project.cs
+++ b/src/Scaffolding/DataModel/Project.cs
@@ -11,6 +11,7 @@ namespace Coscine.Database.DataModel
             Invitations = new HashSet<Invitation>();
             ProjectDisciplines = new HashSet<ProjectDiscipline>();
             ProjectInstitutes = new HashSet<ProjectInstitute>();
+            ProjectPublicationRequests = new HashSet<ProjectPublicationRequest>();
             ProjectQuotas = new HashSet<ProjectQuota>();
             ProjectResources = new HashSet<ProjectResource>();
             ProjectRoles = new HashSet<ProjectRole>();
@@ -38,6 +39,7 @@ namespace Coscine.Database.DataModel
         public virtual ICollection<Invitation> Invitations { get; set; }
         public virtual ICollection<ProjectDiscipline> ProjectDisciplines { get; set; }
         public virtual ICollection<ProjectInstitute> ProjectInstitutes { get; set; }
+        public virtual ICollection<ProjectPublicationRequest> ProjectPublicationRequests { get; set; }
         public virtual ICollection<ProjectQuota> ProjectQuotas { get; set; }
         public virtual ICollection<ProjectResource> ProjectResources { get; set; }
         public virtual ICollection<ProjectRole> ProjectRoles { get; set; }
diff --git a/src/Scaffolding/DataModel/ProjectPublicationRequest.cs b/src/Scaffolding/DataModel/ProjectPublicationRequest.cs
new file mode 100644
index 0000000000000000000000000000000000000000..500a6f04868be73e13315cca17f398cbf61b8674
--- /dev/null
+++ b/src/Scaffolding/DataModel/ProjectPublicationRequest.cs
@@ -0,0 +1,25 @@
+using System;
+using System.Collections.Generic;
+
+namespace Coscine.Database.DataModel
+{
+    public partial class ProjectPublicationRequest
+    {
+        public ProjectPublicationRequest()
+        {
+            Resources = new HashSet<Resource>();
+        }
+
+        public Guid Id { get; set; }
+        public Guid ProjectId { get; set; }
+        public string PublicationServiceRorId { get; set; }
+        public Guid CreatorId { get; set; }
+        public DateTime DateCreated { get; set; }
+        public string Message { get; set; }
+
+        public virtual User Creator { get; set; }
+        public virtual Project Project { get; set; }
+
+        public virtual ICollection<Resource> Resources { get; set; }
+    }
+}
diff --git a/src/Scaffolding/DataModel/Resource.cs b/src/Scaffolding/DataModel/Resource.cs
index d528af2741387c682db33c4b3dbdd1e5d4a9266d..65d8e23c7971ace761bb6ffeaffd0d997d5764ce 100644
--- a/src/Scaffolding/DataModel/Resource.cs
+++ b/src/Scaffolding/DataModel/Resource.cs
@@ -10,6 +10,7 @@ namespace Coscine.Database.DataModel
             MetadataExtractions = new HashSet<MetadataExtraction>();
             ProjectResources = new HashSet<ProjectResource>();
             ResourceDisciplines = new HashSet<ResourceDiscipline>();
+            PublicationRequests = new HashSet<ProjectPublicationRequest>();
         }
 
         public Guid Id { get; set; }
@@ -28,6 +29,7 @@ namespace Coscine.Database.DataModel
         public string Archived { get; set; }
         public bool Deleted { get; set; }
         public DateTime? DateCreated { get; set; }
+        public bool? MetadataLocalCopy { get; set; }
 
         public virtual License License { get; set; }
         public virtual ResourceType Type { get; set; }
@@ -35,5 +37,7 @@ namespace Coscine.Database.DataModel
         public virtual ICollection<MetadataExtraction> MetadataExtractions { get; set; }
         public virtual ICollection<ProjectResource> ProjectResources { get; set; }
         public virtual ICollection<ResourceDiscipline> ResourceDisciplines { get; set; }
+
+        public virtual ICollection<ProjectPublicationRequest> PublicationRequests { get; set; }
     }
 }
diff --git a/src/Scaffolding/DataModel/User.cs b/src/Scaffolding/DataModel/User.cs
index a459fceba82bc5404e2bdf707e3dc64025e64cd8..ce69a28adc2bbc3380ce3d666e7260a9bc089a66 100644
--- a/src/Scaffolding/DataModel/User.cs
+++ b/src/Scaffolding/DataModel/User.cs
@@ -7,11 +7,13 @@ namespace Coscine.Database.DataModel
     {
         public User()
         {
+            ActivityLogs = new HashSet<ActivityLog>();
             ApiTokens = new HashSet<ApiToken>();
             ContactChanges = new HashSet<ContactChange>();
             ExternalIds = new HashSet<ExternalId>();
             GroupMemberships = new HashSet<GroupMembership>();
             Invitations = new HashSet<Invitation>();
+            ProjectPublicationRequests = new HashSet<ProjectPublicationRequest>();
             ProjectRoles = new HashSet<ProjectRole>();
             Tosaccepteds = new HashSet<Tosaccepted>();
             UserDisciplines = new HashSet<UserDiscipline>();
@@ -26,15 +28,18 @@ namespace Coscine.Database.DataModel
         public string Organization { get; set; }
         public Guid? TitleId { get; set; }
         public Guid? LanguageId { get; set; }
-        public string Institute { get; set; }
+        public DateTime? LatestActivity { get; set; }
+        public DateTime? DeletedAt { get; set; }
 
         public virtual Language Language { get; set; }
         public virtual Title Title { get; set; }
+        public virtual ICollection<ActivityLog> ActivityLogs { get; set; }
         public virtual ICollection<ApiToken> ApiTokens { get; set; }
         public virtual ICollection<ContactChange> ContactChanges { get; set; }
         public virtual ICollection<ExternalId> ExternalIds { get; set; }
         public virtual ICollection<GroupMembership> GroupMemberships { get; set; }
         public virtual ICollection<Invitation> Invitations { get; set; }
+        public virtual ICollection<ProjectPublicationRequest> ProjectPublicationRequests { get; set; }
         public virtual ICollection<ProjectRole> ProjectRoles { get; set; }
         public virtual ICollection<Tosaccepted> Tosaccepteds { get; set; }
         public virtual ICollection<UserDiscipline> UserDisciplines { get; set; }
diff --git a/src/Scaffolding/Scaffolding.csproj b/src/Scaffolding/Scaffolding.csproj
index 15b68fec33c543f14a0acc459010ccc28db92ebf..850f7a3b89d5b62eab0dfb9dbf9a33992caedfc5 100644
--- a/src/Scaffolding/Scaffolding.csproj
+++ b/src/Scaffolding/Scaffolding.csproj
@@ -3,9 +3,9 @@
 		<RootNamespace>Coscine.Database</RootNamespace>
 		<AssemblyName>Coscine.Database.Scaffolding</AssemblyName>
 		<TargetFramework>net6.0</TargetFramework>
-		<Version>2.20.0</Version>
+		<Version>2.21.0</Version>
 	</PropertyGroup>
-	
+
 	<ItemGroup>
 		<PackageReference Include="Inflector.NetStandard" Version="1.2.2" />
 		<PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="6.0.11" PrivateAssets="all" />