diff --git a/src/ApiCommons.Tests/ApiCommons.Tests.csproj b/src/ApiCommons.Tests/ApiCommons.Tests.csproj
index d71f23e968dd9d2026c281742b9b742131e86447..d7e2b5df23fa42db67a03cfed24bb106d09985ba 100644
--- a/src/ApiCommons.Tests/ApiCommons.Tests.csproj
+++ b/src/ApiCommons.Tests/ApiCommons.Tests.csproj
@@ -1,8 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
   <Import Project="..\packages\EntityFramework.6.4.4\build\EntityFramework.props" Condition="Exists('..\packages\EntityFramework.6.4.4\build\EntityFramework.props')" />
-  <Import Project="..\packages\linq2db.t4models.2.6.4\build\linq2db.t4models.props" Condition="Exists('..\packages\linq2db.t4models.2.6.4\build\linq2db.t4models.props')" />
-  <Import Project="..\packages\linq2db.SqlServer.2.6.4\build\linq2db.SqlServer.props" Condition="Exists('..\packages\linq2db.SqlServer.2.6.4\build\linq2db.SqlServer.props')" />
   <Import Project="..\packages\NUnit3TestAdapter.3.13.0\build\net35\NUnit3TestAdapter.props" Condition="Exists('..\packages\NUnit3TestAdapter.3.13.0\build\net35\NUnit3TestAdapter.props')" />
   <Import Project="..\packages\NUnit.3.12.0\build\NUnit.props" Condition="Exists('..\packages\NUnit.3.12.0\build\NUnit.props')" />
   <Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
@@ -44,11 +42,11 @@
     <Reference Include="Coscine.Configuration, Version=1.5.0.0, Culture=neutral, PublicKeyToken=ce3d7a32d7dc1e5a, processorArchitecture=MSIL">
       <HintPath>..\packages\Coscine.Configuration.1.5.0\lib\net461\Coscine.Configuration.dll</HintPath>
     </Reference>
-    <Reference Include="Coscine.Database, Version=1.24.0.0, Culture=neutral, PublicKeyToken=767d77427707b70a, processorArchitecture=MSIL">
-      <HintPath>..\packages\Coscine.Database.1.24.0\lib\net461\Coscine.Database.dll</HintPath>
+    <Reference Include="Coscine.Database, Version=1.26.1.0, Culture=neutral, PublicKeyToken=767d77427707b70a, processorArchitecture=MSIL">
+      <HintPath>..\packages\Coscine.Database.1.26.1-topic-1125-apito0012\lib\net461\Coscine.Database.dll</HintPath>
     </Reference>
-    <Reference Include="Coscine.Database.T4, Version=1.24.0.0, Culture=neutral, PublicKeyToken=84b4c404a0696261, processorArchitecture=MSIL">
-      <HintPath>..\packages\Coscine.Database.1.24.0\lib\net461\Coscine.Database.T4.dll</HintPath>
+    <Reference Include="Coscine.Database.T4, Version=1.26.1.0, Culture=neutral, PublicKeyToken=84b4c404a0696261, processorArchitecture=MSIL">
+      <HintPath>..\packages\Coscine.Database.1.26.1-topic-1125-apito0012\lib\net461\Coscine.Database.T4.dll</HintPath>
     </Reference>
     <Reference Include="Coscine.Logging, Version=1.2.0.0, Culture=neutral, PublicKeyToken=e1ed402bc3f6525e, processorArchitecture=MSIL">
       <HintPath>..\packages\Coscine.Logging.1.2.0\lib\net461\Coscine.Logging.dll</HintPath>
@@ -118,8 +116,6 @@
     </PropertyGroup>
     <Error Condition="!Exists('..\packages\NUnit.3.12.0\build\NUnit.props')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\NUnit.3.12.0\build\NUnit.props'))" />
     <Error Condition="!Exists('..\packages\NUnit3TestAdapter.3.13.0\build\net35\NUnit3TestAdapter.props')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\NUnit3TestAdapter.3.13.0\build\net35\NUnit3TestAdapter.props'))" />
-    <Error Condition="!Exists('..\packages\linq2db.SqlServer.2.6.4\build\linq2db.SqlServer.props')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\linq2db.SqlServer.2.6.4\build\linq2db.SqlServer.props'))" />
-    <Error Condition="!Exists('..\packages\linq2db.t4models.2.6.4\build\linq2db.t4models.props')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\linq2db.t4models.2.6.4\build\linq2db.t4models.props'))" />
     <Error Condition="!Exists('..\packages\EntityFramework.6.4.4\build\EntityFramework.props')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\EntityFramework.6.4.4\build\EntityFramework.props'))" />
     <Error Condition="!Exists('..\packages\EntityFramework.6.4.4\build\EntityFramework.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\EntityFramework.6.4.4\build\EntityFramework.targets'))" />
   </Target>
diff --git a/src/ApiCommons.Tests/ApiCommonsTests.cs b/src/ApiCommons.Tests/ApiCommonsTests.cs
index 214c23504e92b43f5dd86b36fa6564b589cf9c03..17d3131bf873b3d51d73e1aa8392e2f78f03f7bf 100644
--- a/src/ApiCommons.Tests/ApiCommonsTests.cs
+++ b/src/ApiCommons.Tests/ApiCommonsTests.cs
@@ -13,7 +13,7 @@ namespace ApiCommons.Tests
         {
             CoscineLoggerConfiguration.SetConfig();
 
-            var logger = LogManager.GetCurrentClassLogger();
+            LogManager.GetCurrentClassLogger();
         }
 
     }
diff --git a/src/ApiCommons.Tests/Properties/AssemblyInfo.cs b/src/ApiCommons.Tests/Properties/AssemblyInfo.cs
index 092a35258b824d0ca00b1ffb6f29e82712585447..1c4367e987e2b43b4adf1ede766d191c471fce43 100644
--- a/src/ApiCommons.Tests/Properties/AssemblyInfo.cs
+++ b/src/ApiCommons.Tests/Properties/AssemblyInfo.cs
@@ -9,8 +9,8 @@ using System.Reflection;
 [assembly: AssemblyDescription("ApiCommons.Tests is a part of the CoScInE group.")]
 [assembly: AssemblyCompany("IT Center, RWTH Aachen University")]
 [assembly: AssemblyProduct("ApiCommons.Tests")]
-[assembly: AssemblyVersion("1.9.0")]
-[assembly: AssemblyFileVersion("1.9.0")]
-[assembly: AssemblyInformationalVersion("1.9.0-topic-827-notifi0001")]
+[assembly: AssemblyVersion("1.10.1")]
+[assembly: AssemblyFileVersion("1.10.1")]
+[assembly: AssemblyInformationalVersion("1.10.1-topic-1123-token0014")]
 [assembly: AssemblyCopyright("2020 IT Center, RWTH Aachen University")]
 
diff --git a/src/ApiCommons.Tests/packages.config b/src/ApiCommons.Tests/packages.config
index 865b675e389f686799f52bc32ba6a3f4b9a54814..bff9661d699b4b1fa54b459faed8cc4d9a24e0bd 100644
--- a/src/ApiCommons.Tests/packages.config
+++ b/src/ApiCommons.Tests/packages.config
@@ -2,12 +2,10 @@
 <packages>
   <package id="Consul" version="0.7.2.6" targetFramework="net461" />
   <package id="Coscine.Configuration" version="1.5.0" targetFramework="net461" />
-  <package id="Coscine.Database" version="1.24.0" targetFramework="net461" />
+  <package id="Coscine.Database" version="1.26.1-topic-1125-apito0012" targetFramework="net461" />
   <package id="Coscine.Logging" version="1.2.0" targetFramework="net461" />
   <package id="EntityFramework" version="6.4.4" targetFramework="net461" />
   <package id="linq2db" version="3.1.1" targetFramework="net461" />
-  <package id="linq2db.SqlServer" version="2.6.4" targetFramework="net461" />
-  <package id="linq2db.t4models" version="2.6.4" targetFramework="net461" />
   <package id="LinqKit" version="1.1.17" targetFramework="net461" />
   <package id="Microsoft.Extensions.Logging.Abstractions" version="2.2.0" targetFramework="net461" />
   <package id="Newtonsoft.Json" version="12.0.3" targetFramework="net461" />
diff --git a/src/ApiCommons/AbstractDefaultStartup.cs b/src/ApiCommons/AbstractDefaultStartup.cs
index 0b0be7b30e717b878dc2f32c9d5d45ec9fd96b00..0f16393fdc0237bd441fe5e30c418884d69a19d4 100644
--- a/src/ApiCommons/AbstractDefaultStartup.cs
+++ b/src/ApiCommons/AbstractDefaultStartup.cs
@@ -1,14 +1,11 @@
 using Coscine.ApiCommons.Middleware;
-using Coscine.ApiCommons.Utils;
 using Coscine.Configuration;
 using Coscine.Database.Settings;
 using LinqToDB.Data;
-using Microsoft.AspNetCore.Authentication.JwtBearer;
 using Microsoft.AspNetCore.Builder;
 using Microsoft.AspNetCore.Hosting;
 using Microsoft.AspNetCore.Http;
 using Microsoft.Extensions.DependencyInjection;
-using Microsoft.IdentityModel.Tokens;
 
 namespace Coscine.ApiCommons
 {
diff --git a/src/ApiCommons/AbstractStartup.cs b/src/ApiCommons/AbstractStartup.cs
index 62c11e3ad8975bb49b6a659213743b5dfe508415..f10de52ec9280780d94f56efa4a93f0f3932fe22 100644
--- a/src/ApiCommons/AbstractStartup.cs
+++ b/src/ApiCommons/AbstractStartup.cs
@@ -1,5 +1,5 @@
 using Coscine.ApiCommons.Middleware;
-using Coscine.ApiCommons.Utils;
+using Coscine.JwtHandler;
 using Microsoft.AspNetCore.Authentication.JwtBearer;
 using Microsoft.AspNetCore.Builder;
 using Microsoft.AspNetCore.Hosting;
@@ -43,6 +43,8 @@ namespace Coscine.ApiCommons
                 x.SaveToken = true;
                 x.TokenValidationParameters = new TokenValidationParameters
                 {
+                    ValidAudience = "https://coscine.rwth-aachen.de",
+                    ValidIssuer = "https://coscine.rwth-aachen.de",
                     ValidateIssuerSigningKey = true,
                     IssuerSigningKey = key,
                     ValidateIssuer = false,
@@ -94,4 +96,4 @@ namespace Coscine.ApiCommons
         }
 
     }
-}
+}
\ No newline at end of file
diff --git a/src/ApiCommons/ApiCommons.csproj b/src/ApiCommons/ApiCommons.csproj
index e909d60a3e596a4e13d6282f245decf5835d0a65..8fa99975470dd6f75354eca5dd25084dfe466c08 100644
--- a/src/ApiCommons/ApiCommons.csproj
+++ b/src/ApiCommons/ApiCommons.csproj
@@ -4,8 +4,6 @@
   <Import Project="..\packages\NSwag.AspNetCore.13.6.2\build\NSwag.AspNetCore.props" Condition="Exists('..\packages\NSwag.AspNetCore.13.6.2\build\NSwag.AspNetCore.props')" />
   <Import Project="..\packages\Microsoft.Extensions.ApiDescription.Server.3.0.0\build\Microsoft.Extensions.ApiDescription.Server.props" Condition="Exists('..\packages\Microsoft.Extensions.ApiDescription.Server.3.0.0\build\Microsoft.Extensions.ApiDescription.Server.props')" />
   <Import Project="..\packages\NUnit.3.12.0\build\NUnit.props" Condition="Exists('..\packages\NUnit.3.12.0\build\NUnit.props')" />
-  <Import Project="..\packages\linq2db.t4models.2.6.4\build\linq2db.t4models.props" Condition="Exists('..\packages\linq2db.t4models.2.6.4\build\linq2db.t4models.props')" />
-  <Import Project="..\packages\linq2db.SqlServer.2.6.4\build\linq2db.SqlServer.props" Condition="Exists('..\packages\linq2db.SqlServer.2.6.4\build\linq2db.SqlServer.props')" />
   <Import Project="..\packages\Microsoft.CodeAnalysis.Analyzers.2.9.2\build\Microsoft.CodeAnalysis.Analyzers.props" Condition="Exists('..\packages\Microsoft.CodeAnalysis.Analyzers.2.9.2\build\Microsoft.CodeAnalysis.Analyzers.props')" />
   <Import Project="..\packages\Microsoft.AspNetCore.Mvc.Razor.Extensions.2.2.0\build\netstandard2.0\Microsoft.AspNetCore.Mvc.Razor.Extensions.props" Condition="Exists('..\packages\Microsoft.AspNetCore.Mvc.Razor.Extensions.2.2.0\build\netstandard2.0\Microsoft.AspNetCore.Mvc.Razor.Extensions.props')" />
   <Import Project="..\packages\Microsoft.AspNetCore.Razor.Design.2.2.0\build\netstandard2.0\Microsoft.AspNetCore.Razor.Design.props" Condition="Exists('..\packages\Microsoft.AspNetCore.Razor.Design.2.2.0\build\netstandard2.0\Microsoft.AspNetCore.Razor.Design.props')" />
@@ -54,11 +52,14 @@
     <Reference Include="Coscine.Configuration, Version=1.5.0.0, Culture=neutral, PublicKeyToken=ce3d7a32d7dc1e5a, processorArchitecture=MSIL">
       <HintPath>..\packages\Coscine.Configuration.1.5.0\lib\net461\Coscine.Configuration.dll</HintPath>
     </Reference>
-    <Reference Include="Coscine.Database, Version=1.24.0.0, Culture=neutral, PublicKeyToken=767d77427707b70a, processorArchitecture=MSIL">
-      <HintPath>..\packages\Coscine.Database.1.24.0\lib\net461\Coscine.Database.dll</HintPath>
+    <Reference Include="Coscine.Database, Version=1.26.1.0, Culture=neutral, PublicKeyToken=767d77427707b70a, processorArchitecture=MSIL">
+      <HintPath>..\packages\Coscine.Database.1.26.1-topic-1125-apito0012\lib\net461\Coscine.Database.dll</HintPath>
     </Reference>
-    <Reference Include="Coscine.Database.T4, Version=1.24.0.0, Culture=neutral, PublicKeyToken=84b4c404a0696261, processorArchitecture=MSIL">
-      <HintPath>..\packages\Coscine.Database.1.24.0\lib\net461\Coscine.Database.T4.dll</HintPath>
+    <Reference Include="Coscine.Database.T4, Version=1.26.1.0, Culture=neutral, PublicKeyToken=84b4c404a0696261, processorArchitecture=MSIL">
+      <HintPath>..\packages\Coscine.Database.1.26.1-topic-1125-apito0012\lib\net461\Coscine.Database.T4.dll</HintPath>
+    </Reference>
+    <Reference Include="Coscine.JwtHandler, Version=1.2.0.0, Culture=neutral, PublicKeyToken=aaacf41df3a6253c, processorArchitecture=MSIL">
+      <HintPath>..\packages\Coscine.JwtHandler.1.2.0-topic-1125-apito0006\lib\net461\Coscine.JwtHandler.dll</HintPath>
     </Reference>
     <Reference Include="Coscine.Logging, Version=1.2.0.0, Culture=neutral, PublicKeyToken=e1ed402bc3f6525e, processorArchitecture=MSIL">
       <HintPath>..\packages\Coscine.Logging.1.2.0\lib\net461\Coscine.Logging.dll</HintPath>
@@ -292,11 +293,11 @@
     <Reference Include="Microsoft.Extensions.WebEncoders, Version=2.2.0.0, Culture=neutral, PublicKeyToken=adb9793829ddae60, processorArchitecture=MSIL">
       <HintPath>..\packages\Microsoft.Extensions.WebEncoders.2.2.0\lib\netstandard2.0\Microsoft.Extensions.WebEncoders.dll</HintPath>
     </Reference>
-    <Reference Include="Microsoft.IdentityModel.JsonWebTokens, Version=5.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
-      <HintPath>..\packages\Microsoft.IdentityModel.JsonWebTokens.5.5.0\lib\net461\Microsoft.IdentityModel.JsonWebTokens.dll</HintPath>
+    <Reference Include="Microsoft.IdentityModel.JsonWebTokens, Version=6.7.1.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
+      <HintPath>..\packages\Microsoft.IdentityModel.JsonWebTokens.6.7.1\lib\net461\Microsoft.IdentityModel.JsonWebTokens.dll</HintPath>
     </Reference>
-    <Reference Include="Microsoft.IdentityModel.Logging, Version=5.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
-      <HintPath>..\packages\Microsoft.IdentityModel.Logging.5.5.0\lib\net461\Microsoft.IdentityModel.Logging.dll</HintPath>
+    <Reference Include="Microsoft.IdentityModel.Logging, Version=6.7.1.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
+      <HintPath>..\packages\Microsoft.IdentityModel.Logging.6.7.1\lib\net461\Microsoft.IdentityModel.Logging.dll</HintPath>
     </Reference>
     <Reference Include="Microsoft.IdentityModel.Protocols, Version=5.3.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
       <HintPath>..\packages\Microsoft.IdentityModel.Protocols.5.3.0\lib\net461\Microsoft.IdentityModel.Protocols.dll</HintPath>
@@ -304,8 +305,8 @@
     <Reference Include="Microsoft.IdentityModel.Protocols.OpenIdConnect, Version=5.3.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
       <HintPath>..\packages\Microsoft.IdentityModel.Protocols.OpenIdConnect.5.3.0\lib\net461\Microsoft.IdentityModel.Protocols.OpenIdConnect.dll</HintPath>
     </Reference>
-    <Reference Include="Microsoft.IdentityModel.Tokens, Version=5.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
-      <HintPath>..\packages\Microsoft.IdentityModel.Tokens.5.5.0\lib\net461\Microsoft.IdentityModel.Tokens.dll</HintPath>
+    <Reference Include="Microsoft.IdentityModel.Tokens, Version=6.7.1.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
+      <HintPath>..\packages\Microsoft.IdentityModel.Tokens.6.7.1\lib\net461\Microsoft.IdentityModel.Tokens.dll</HintPath>
     </Reference>
     <Reference Include="Microsoft.Net.Http.Headers, Version=2.2.0.0, Culture=neutral, PublicKeyToken=adb9793829ddae60, processorArchitecture=MSIL">
       <HintPath>..\packages\Microsoft.Net.Http.Headers.2.2.0\lib\netstandard2.0\Microsoft.Net.Http.Headers.dll</HintPath>
@@ -365,13 +366,10 @@
     <Reference Include="System.Data.Linq" />
     <Reference Include="System.Data.OracleClient" />
     <Reference Include="System.Drawing" />
-    <Reference Include="System.IdentityModel.Tokens.Jwt, Version=5.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
-      <HintPath>..\packages\System.IdentityModel.Tokens.Jwt.5.5.0\lib\net461\System.IdentityModel.Tokens.Jwt.dll</HintPath>
+    <Reference Include="System.IdentityModel.Tokens.Jwt, Version=6.7.1.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
+      <HintPath>..\packages\System.IdentityModel.Tokens.Jwt.6.7.1\lib\net461\System.IdentityModel.Tokens.Jwt.dll</HintPath>
     </Reference>
     <Reference Include="System.Management" />
-    <Reference Include="System.Memory, Version=4.0.1.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
-      <HintPath>..\packages\System.Memory.4.5.1\lib\netstandard2.0\System.Memory.dll</HintPath>
-    </Reference>
     <Reference Include="System.Net" />
     <Reference Include="System.Net.Http.WebRequest" />
     <Reference Include="System.Numerics" />
@@ -423,7 +421,6 @@
     <Compile Include="Middleware\TOSMiddleware.cs" />
     <Compile Include="Properties\AssemblyInfo.cs" />
     <Compile Include="AbstractDefaultStartup.cs" />
-    <Compile Include="Utils\JWTHandler.cs" />
     <Compile Include="Middleware\LoggingMiddleware.cs" />
   </ItemGroup>
   <ItemGroup>
@@ -440,8 +437,6 @@
     <Error Condition="!Exists('..\packages\Microsoft.AspNetCore.Mvc.Razor.Extensions.2.2.0\build\netstandard2.0\Microsoft.AspNetCore.Mvc.Razor.Extensions.props')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\Microsoft.AspNetCore.Mvc.Razor.Extensions.2.2.0\build\netstandard2.0\Microsoft.AspNetCore.Mvc.Razor.Extensions.props'))" />
     <Error Condition="!Exists('..\packages\Microsoft.AspNetCore.Mvc.Razor.Extensions.2.2.0\build\netstandard2.0\Microsoft.AspNetCore.Mvc.Razor.Extensions.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\Microsoft.AspNetCore.Mvc.Razor.Extensions.2.2.0\build\netstandard2.0\Microsoft.AspNetCore.Mvc.Razor.Extensions.targets'))" />
     <Error Condition="!Exists('..\packages\Microsoft.CodeAnalysis.Analyzers.2.9.2\build\Microsoft.CodeAnalysis.Analyzers.props')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\Microsoft.CodeAnalysis.Analyzers.2.9.2\build\Microsoft.CodeAnalysis.Analyzers.props'))" />
-    <Error Condition="!Exists('..\packages\linq2db.SqlServer.2.6.4\build\linq2db.SqlServer.props')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\linq2db.SqlServer.2.6.4\build\linq2db.SqlServer.props'))" />
-    <Error Condition="!Exists('..\packages\linq2db.t4models.2.6.4\build\linq2db.t4models.props')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\linq2db.t4models.2.6.4\build\linq2db.t4models.props'))" />
     <Error Condition="!Exists('..\packages\NUnit.3.12.0\build\NUnit.props')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\NUnit.3.12.0\build\NUnit.props'))" />
     <Error Condition="!Exists('..\packages\Microsoft.Extensions.ApiDescription.Server.3.0.0\build\Microsoft.Extensions.ApiDescription.Server.props')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\Microsoft.Extensions.ApiDescription.Server.3.0.0\build\Microsoft.Extensions.ApiDescription.Server.props'))" />
     <Error Condition="!Exists('..\packages\Microsoft.Extensions.ApiDescription.Server.3.0.0\build\Microsoft.Extensions.ApiDescription.Server.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\Microsoft.Extensions.ApiDescription.Server.3.0.0\build\Microsoft.Extensions.ApiDescription.Server.targets'))" />
diff --git a/src/ApiCommons/Authenticator.cs b/src/ApiCommons/Authenticator.cs
index c3466da1c7caf64c065f6de9f235d363ce5aac20..4851093ab7698d7381e2854100e12924f98b2d84 100644
--- a/src/ApiCommons/Authenticator.cs
+++ b/src/ApiCommons/Authenticator.cs
@@ -1,10 +1,12 @@
-using Coscine.ApiCommons.Utils;
-using Coscine.Configuration;
+using Coscine.Configuration;
 using Coscine.Database.DataModel;
 using Coscine.Database.Models;
+using Coscine.JwtHandler;
 using Microsoft.AspNetCore.Mvc;
 using System;
+using System.Collections.Generic;
 using System.Linq;
+using System.Security.Claims;
 
 namespace Coscine.ApiCommons
 {
@@ -12,6 +14,7 @@ namespace Coscine.ApiCommons
     {
         private readonly Controller _controller;
         private readonly IConfiguration _configuration;
+        private static readonly ApiTokenModel _apiTokenModel = new ApiTokenModel();
 
         public Authenticator(Controller controller, IConfiguration configuration)
         {
@@ -33,17 +36,43 @@ namespace Coscine.ApiCommons
             return true;
         }
 
-        public string GetUserId()
+        public static string GetUserId(IEnumerable<Claim> claims)
         {
             try
             {
-                return _controller.HttpContext.User.FindFirst("UserID").Value;
-            } catch (NullReferenceException)
+                var userId = claims.Where(x => x.Type.ToLower() == "userId".ToLower()).FirstOrDefault()?.Value;
+                var tokenId = claims.Where(x => x.Type.ToLower() == "tokenId".ToLower()).FirstOrDefault()?.Value;
+
+                // Only one can be set
+                if (userId != null && tokenId != null)
+                {
+                    return null;
+                }
+
+                if (userId != null)
+                {
+                    return userId;
+                }
+
+                if (tokenId != null)
+                {
+                    var token = _apiTokenModel.GetById(new Guid(tokenId));
+                    return token.UserId.ToString();
+                }
+
+                return null;
+            }
+            catch (NullReferenceException)
             {
                 return null;
             }
         }
 
+        public string GetUserId()
+        {
+            return GetUserId(_controller.HttpContext.User.Claims);
+        }
+
         public User GetUser()
         {
             return GetUser(GetUserId());
diff --git a/src/ApiCommons/Middleware/LoggingMiddleware.cs b/src/ApiCommons/Middleware/LoggingMiddleware.cs
index 7e2b59c73a7bfa3e18c178b86d8ee72a77871e38..8538c981a7ac247b264db8a6703ba2f1a415f0b5 100644
--- a/src/ApiCommons/Middleware/LoggingMiddleware.cs
+++ b/src/ApiCommons/Middleware/LoggingMiddleware.cs
@@ -1,14 +1,12 @@
-using Coscine.ApiCommons.Utils;
-using Coscine.Configuration;
+using Coscine.Configuration;
+using Coscine.JwtHandler;
 using Coscine.Logging;
-using Microsoft.AspNetCore.Diagnostics;
 using Microsoft.AspNetCore.Http;
 using Microsoft.AspNetCore.Http.Internal;
 using Microsoft.Extensions.Logging;
 using Microsoft.Extensions.Primitives;
 using System;
 using System.IO;
-using System.Linq;
 using System.Threading.Tasks;
 
 namespace Coscine.ApiCommons.Middleware
@@ -29,7 +27,7 @@ namespace Coscine.ApiCommons.Middleware
             if (context.Request.Path.Value.Contains("TOS"))
             {
                 await _next(context);
-            } 
+            }
             else
             {
                 string _uri = "";
@@ -78,10 +76,11 @@ namespace Coscine.ApiCommons.Middleware
                                 bearer = bearer.Replace("Bearer", "").Trim();
                                 JWTHandler jwtHandler = new JWTHandler(new ConsulConfiguration());
                                 var claims = jwtHandler.GetContents(bearer);
-                                var userClaim = (from claimObj in claims
-                                                 where claimObj.Type == "UserId"
-                                                 select claimObj).First();
-                                CoscineLoggerMetadata.SetUserId(userClaim.Value);
+                                var userId = Authenticator.GetUserId(claims);
+                                if (userId != null)
+                                {
+                                    CoscineLoggerMetadata.SetUserId(userId);
+                                }
                             }
 
                             // Get the corrolation Id
@@ -90,7 +89,7 @@ namespace Coscine.ApiCommons.Middleware
                             {
                                 CoscineLoggerMetadata.SetClientCorrolationId(clientCorrolationId.ToString());
                             }
-                            CoscineLoggerMetadata.SetCorrolationId();                        
+                            CoscineLoggerMetadata.SetCorrolationId();
 
                             /*******************************************
                              * preparation of the logging process
@@ -160,7 +159,7 @@ namespace Coscine.ApiCommons.Middleware
                                 {
                                     _responseBody = "No Response Body or Response Body to long.";
                                 }
-                            
+
                                 responseBodyStream.Seek(0, SeekOrigin.Begin);
                                 await responseBodyStream.CopyToAsync(originalResponseBody);
                             }
diff --git a/src/ApiCommons/Properties/AssemblyInfo.cs b/src/ApiCommons/Properties/AssemblyInfo.cs
index 7c969d421bd32dae55d23e98d4815f393649f124..36bfc36a9c366713897192c513ede382b4041059 100644
--- a/src/ApiCommons/Properties/AssemblyInfo.cs
+++ b/src/ApiCommons/Properties/AssemblyInfo.cs
@@ -9,8 +9,8 @@ using System.Reflection;
 [assembly: AssemblyDescription("ApiCommons is a part of the CoScInE group.")]
 [assembly: AssemblyCompany("IT Center, RWTH Aachen University")]
 [assembly: AssemblyProduct("ApiCommons")]
-[assembly: AssemblyVersion("1.9.0")]
-[assembly: AssemblyFileVersion("1.9.0")]
-[assembly: AssemblyInformationalVersion("1.9.0-topic-827-notifi0001")]
+[assembly: AssemblyVersion("1.10.1")]
+[assembly: AssemblyFileVersion("1.10.1")]
+[assembly: AssemblyInformationalVersion("1.10.1-topic-1123-token0014")]
 [assembly: AssemblyCopyright("2020 IT Center, RWTH Aachen University")]
 
diff --git a/src/ApiCommons/Utils/JWTHandler.cs b/src/ApiCommons/Utils/JWTHandler.cs
deleted file mode 100644
index e91cab36f28a51bb69a0c240030c55d6b60f8a3f..0000000000000000000000000000000000000000
--- a/src/ApiCommons/Utils/JWTHandler.cs
+++ /dev/null
@@ -1,104 +0,0 @@
-using Coscine.ApiCommons.Exceptions;
-using Coscine.Configuration;
-using Microsoft.IdentityModel.Tokens;
-using System;
-using System.Collections.Generic;
-using System.IdentityModel.Tokens.Jwt;
-using System.Linq;
-using System.Security.Claims;
-using System.Text;
-using System.Threading.Tasks;
-
-namespace Coscine.ApiCommons.Utils
-{
-    public class JWTHandler
-    {
-        private readonly IConfiguration _configuration;
-        private readonly JwtSecurityTokenHandler _jwtSecurityTokenHandler;
-
-        public JWTHandler(IConfiguration configuration)
-        {
-            _configuration = configuration;
-            _jwtSecurityTokenHandler = new JwtSecurityTokenHandler();
-        }
-
-        public SymmetricSecurityKey GetSecurityKey()
-        {
-            string secretKey = _configuration.GetStringAndWait("coscine/global/jwtsecret");
-
-            if (secretKey == null)
-            {
-                throw new ArgumentNullException("JWT Secret Configuration value is not set!");
-            }
-
-            return new SymmetricSecurityKey(Encoding.UTF8.GetBytes(secretKey));
-        }
-
-        public bool ValidToken(string token, string encryptionAlgorithm = "HS256")
-        {
-
-            TokenValidationParameters tokenValidationParameters = new TokenValidationParameters
-            {
-                IssuerSigningKey = GetSecurityKey(),
-                // TODO: Validate those two
-                ValidateAudience = false,
-                ValidateIssuer = false
-            };
-
-            try
-            {
-                _jwtSecurityTokenHandler.ValidateToken(token, tokenValidationParameters, out SecurityToken securityToken);
-            }
-            catch (Exception)
-            {
-                return false;
-            }
-            return true;
-        }
-
-        public IEnumerable<Claim> GetContents(string jwt, string encryptionAlgorithm = "HS256")
-        {
-            if (ValidToken(jwt, encryptionAlgorithm))
-            {
-                var token = _jwtSecurityTokenHandler.ReadJwtToken(jwt);
-                return token.Claims;
-            }
-            else
-            {
-                throw new InvalidTokenException("Invalid token!");
-            }
-        }
-
-        public string GenerateJwtToken(JwtPayload payload, string encryptionAlgorithm = "HS256")
-        {
-            if (payload == null)
-            {
-                throw new ArgumentNullException("JwtPayload value is not set!");
-            }
-
-            var signingCredentials = new SigningCredentials(GetSecurityKey(), encryptionAlgorithm);
-
-            var centuryBegin = new DateTime(1970, 1, 1);
-            var exp = new TimeSpan(DateTime.Now.AddMinutes(30).Ticks - centuryBegin.Ticks).TotalSeconds;
-            var now = new TimeSpan(DateTime.Now.Ticks - centuryBegin.Ticks).TotalSeconds;
-
-            payload.Add("iss", "coscine");
-            payload.Add("aud", "coscine");
-            payload.Add("iat", (long)now);
-            payload.Add("exp", (long)exp);
-
-            var header = new JwtHeader(signingCredentials);
-            var securityToken = new JwtSecurityToken(header, payload);
-
-            return _jwtSecurityTokenHandler.WriteToken(securityToken);
-        }
-
-        public string GenerateJwtToken(IReadOnlyDictionary<string, string> payloadContents, string encryptionAlgorithm = "HS256")
-        {
-            var payload = new JwtPayload(payloadContents.Select(c => new Claim(c.Key, c.Value)));
-
-            return GenerateJwtToken(payload, encryptionAlgorithm);
-        }
-
-    }
-}
diff --git a/src/ApiCommons/app.config b/src/ApiCommons/app.config
index 13bafa5253db41186ae3086aecc0226befaf5986..77d17c189ca1e89528190c0648d4587910f0c000 100644
--- a/src/ApiCommons/app.config
+++ b/src/ApiCommons/app.config
@@ -96,15 +96,15 @@
       </dependentAssembly>
       <dependentAssembly>
         <assemblyIdentity name="Microsoft.IdentityModel.Logging" publicKeyToken="31bf3856ad364e35" culture="neutral" />
-        <bindingRedirect oldVersion="0.0.0.0-5.5.0.0" newVersion="5.5.0.0" />
+        <bindingRedirect oldVersion="0.0.0.0-6.7.1.0" newVersion="6.7.1.0" />
       </dependentAssembly>
       <dependentAssembly>
         <assemblyIdentity name="Microsoft.IdentityModel.Tokens" publicKeyToken="31bf3856ad364e35" culture="neutral" />
-        <bindingRedirect oldVersion="0.0.0.0-5.5.0.0" newVersion="5.5.0.0" />
+        <bindingRedirect oldVersion="0.0.0.0-6.7.1.0" newVersion="6.7.1.0" />
       </dependentAssembly>
       <dependentAssembly>
         <assemblyIdentity name="System.IdentityModel.Tokens.Jwt" publicKeyToken="31bf3856ad364e35" culture="neutral" />
-        <bindingRedirect oldVersion="0.0.0.0-5.5.0.0" newVersion="5.5.0.0" />
+        <bindingRedirect oldVersion="0.0.0.0-6.7.1.0" newVersion="6.7.1.0" />
       </dependentAssembly>      <dependentAssembly>
         <assemblyIdentity name="Coscine.Configuration" publicKeyToken="ce3d7a32d7dc1e5a" culture="neutral" />
         <bindingRedirect oldVersion="0.0.0.0-1.5.0.0" newVersion="1.5.0.0" />
diff --git a/src/ApiCommons/packages.config b/src/ApiCommons/packages.config
index eca90e7a9e7fa8d1d6ebd0c93e13c34ba1ea6caa..ec9341a5460e840444f47fd4c222f381d7aec0d7 100644
--- a/src/ApiCommons/packages.config
+++ b/src/ApiCommons/packages.config
@@ -2,12 +2,11 @@
 <packages>
   <package id="Consul" version="0.7.2.6" targetFramework="net472" />
   <package id="Coscine.Configuration" version="1.5.0" targetFramework="net461" />
-  <package id="Coscine.Database" version="1.24.0" targetFramework="net461" />
+  <package id="Coscine.Database" version="1.26.1-topic-1125-apito0012" targetFramework="net461" />
+  <package id="Coscine.JwtHandler" version="1.2.0-topic-1125-apito0006" targetFramework="net461" />
   <package id="Coscine.Logging" version="1.2.0" targetFramework="net461" />
   <package id="EntityFramework" version="6.4.4" targetFramework="net461" />
   <package id="linq2db" version="3.1.1" targetFramework="net461" />
-  <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.17" targetFramework="net461" />
   <package id="Microsoft.AspNetCore.Antiforgery" version="2.2.0" targetFramework="net472" />
   <package id="Microsoft.AspNetCore.Authentication" version="2.2.0" targetFramework="net461" />
@@ -94,11 +93,11 @@
   <package id="Microsoft.Extensions.Options" version="2.2.0" targetFramework="net472" />
   <package id="Microsoft.Extensions.Primitives" version="2.2.0" targetFramework="net472" />
   <package id="Microsoft.Extensions.WebEncoders" version="2.2.0" targetFramework="net472" />
-  <package id="Microsoft.IdentityModel.JsonWebTokens" version="5.5.0" targetFramework="net472" />
-  <package id="Microsoft.IdentityModel.Logging" version="5.5.0" targetFramework="net472" />
+  <package id="Microsoft.IdentityModel.JsonWebTokens" version="6.7.1" targetFramework="net461" />
+  <package id="Microsoft.IdentityModel.Logging" version="6.7.1" targetFramework="net461" />
   <package id="Microsoft.IdentityModel.Protocols" version="5.3.0" targetFramework="net461" />
   <package id="Microsoft.IdentityModel.Protocols.OpenIdConnect" version="5.3.0" targetFramework="net461" />
-  <package id="Microsoft.IdentityModel.Tokens" version="5.5.0" targetFramework="net472" />
+  <package id="Microsoft.IdentityModel.Tokens" version="6.7.1" targetFramework="net461" />
   <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="Namotion.Reflection" version="1.0.11" targetFramework="net461" />
@@ -127,7 +126,7 @@
   <package id="System.Diagnostics.StackTrace" version="4.3.0" targetFramework="net472" />
   <package id="System.Dynamic.Runtime" version="4.3.0" targetFramework="net472" />
   <package id="System.Globalization" version="4.3.0" targetFramework="net472" />
-  <package id="System.IdentityModel.Tokens.Jwt" version="5.5.0" targetFramework="net472" />
+  <package id="System.IdentityModel.Tokens.Jwt" version="6.7.1" targetFramework="net461" />
   <package id="System.IO" version="4.3.0" targetFramework="net472" />
   <package id="System.IO.FileSystem" version="4.3.0" targetFramework="net472" />
   <package id="System.IO.FileSystem.Primitives" version="4.3.0" targetFramework="net472" />