diff --git a/src/Tree/App.config b/src/Tree/App.config
index 20153e8bb3f89ce37e61a2706c333add291e8062..f2d19a6d513cbc67c959d2b5e76393af1971564c 100644
--- a/src/Tree/App.config
+++ b/src/Tree/App.config
@@ -149,7 +149,7 @@
       </dependentAssembly>
       <dependentAssembly>
         <assemblyIdentity name="Coscine.Database" publicKeyToken="767d77427707b70a" culture="neutral" />
-        <bindingRedirect oldVersion="0.0.0.0-1.27.0.0" newVersion="1.27.0.0" />
+        <bindingRedirect oldVersion="0.0.0.0-1.28.0.0" newVersion="1.28.0.0" />
       </dependentAssembly>
       <dependentAssembly>
         <assemblyIdentity name="Microsoft.Extensions.Options" publicKeyToken="adb9793829ddae60" culture="neutral" />
@@ -205,7 +205,11 @@
       </dependentAssembly>
       <dependentAssembly>
         <assemblyIdentity name="Coscine.Database.T4" publicKeyToken="84b4c404a0696261" culture="neutral" />
-        <bindingRedirect oldVersion="0.0.0.0-1.27.0.0" newVersion="1.27.0.0" />
+        <bindingRedirect oldVersion="0.0.0.0-1.28.0.0" newVersion="1.28.0.0" />
+      </dependentAssembly>
+      <dependentAssembly>
+        <assemblyIdentity name="Coscine.Logging" publicKeyToken="e1ed402bc3f6525e" culture="neutral" />
+        <bindingRedirect oldVersion="0.0.0.0-1.3.0.0" newVersion="1.3.0.0" />
       </dependentAssembly>
     </assemblyBinding>
   </runtime>
diff --git a/src/Tree/Controllers/TreeController.cs b/src/Tree/Controllers/TreeController.cs
index 71f74886ae41b44a9bd0c47ac0cbdeb62c6a7820..2d0d7a063852b0b2f79c3e61674b14807e73c6fc 100644
--- a/src/Tree/Controllers/TreeController.cs
+++ b/src/Tree/Controllers/TreeController.cs
@@ -145,7 +145,32 @@ namespace Coscine.Api.Tree.Controllers
                         ))
                     );
 
-                LogAnalytics("View MD", resourceId, path, user);
+                if (resource.ApplicationProfile[resource.ApplicationProfile.Length - 1] != '/')
+                {
+                    resource.ApplicationProfile += '/';
+                }
+                string metadataCompleteness = null;
+                try
+                {
+                    JToken metadata;
+                    if (jObject.SelectToken("data").SelectToken("metadataStorage").Count() > 0)
+                    {
+                        metadata = jObject.SelectToken("data").SelectToken("metadataStorage").First.First.First;
+                    }
+                    else
+                    {
+                        metadata = jObject.SelectToken("data").SelectToken("metadataStorage");
+                    }
+
+                    var shapesGraph = (Graph)_rdfStoreConnector.GetGraph(resource.ApplicationProfile);
+                    metadataCompleteness = GetMetadataCompleteness(metadata, shapesGraph);
+                }
+                catch (Exception e)
+                {
+                    metadataCompleteness = "Error";
+                }
+
+                LogAnalytics("Update MD", resourceId, path, user, metadataCompleteness);
                 return Json(jObject);
             }
             catch
@@ -258,12 +283,12 @@ namespace Coscine.Api.Tree.Controllers
             if (_rdfStoreConnector.HasGraph(graphNameUri))
             {
                 _rdfStoreConnector.ClearGraph(graphNameUri);
-                LogAnalytics("Update MD", resourceId, path, user);
+                LogAnalytics("Update MD", resourceId, path, user, GetMetadataCompleteness(innerBlock, shapesGraph));
             }
             else
             {
                 _rdfStoreConnector.CreateNamedGraph(graphNameUri);
-                LogAnalytics("Upload MD", resourceId, path, user);
+                LogAnalytics("Upload MD", resourceId, path, user, GetMetadataCompleteness(innerBlock, shapesGraph));
             }
 
             // BaseUri must be set for the sparql query
@@ -330,7 +355,8 @@ namespace Coscine.Api.Tree.Controllers
         /// <param name="resourceId">Resource of the id</param>
         /// <param name="filename">Name of the file</param>
         /// <param name="user">User object</param>
-        private void LogAnalytics(string operation, string resourceId, string filename, User user)
+        /// <param name="metadataCompleteness">Metadata Completeness</param>
+        private void LogAnalytics(string operation, string resourceId, string filename, User user, string metadataCompleteness = null)
         {
             if (CoscineLoggerConfiguration.IsLogLevelActivated(LogType.Analytics))
             {
@@ -340,8 +366,27 @@ namespace Coscine.Api.Tree.Controllers
                 _analyticsLogObject.ResourceId = resourceId;
                 _analyticsLogObject.ProjectId = _projectResourceModel.GetProjectForResource(new Guid(resourceId)).ToString();
                 _analyticsLogObject.RoleId = _projectRoleModel.GetGetUserRoleForProject(new Guid(_analyticsLogObject.ProjectId), user.Id).ToString();
+                _analyticsLogObject.ApplicationsProfile = _resourceModel.CreateReturnObjectFromDatabaseObject(_resourceModel.GetById(new Guid(resourceId))).ApplicationProfile;
+                _analyticsLogObject.MetadataCompleteness = metadataCompleteness;
                 _coscineLogger.AnalyticsLog(_analyticsLogObject);
             }
         }
+
+        /// <summary>
+        /// Gets metadata completeness by comparing submitted values to the application profile specific shape graph
+        /// </summary>
+        /// <param name="valueTokens"></param>
+        /// <param name="shapesGraph"></param>
+        /// <returns></returns>
+        private string GetMetadataCompleteness (JToken valueTokens, IGraph shapesGraph)
+        {
+            NodeFactory nodeFactory = new NodeFactory();
+            UriNode uriNode = (UriNode)nodeFactory.CreateUriNode(new Uri("http://www.w3.org/ns/shacl#property"));
+
+            int total = shapesGraph.GetTriplesWithPredicate(uriNode).Count();
+            int present = valueTokens.Count();
+
+            return $"{present}/{total}";
+        }
     }
 }
diff --git a/src/Tree/Tree.csproj b/src/Tree/Tree.csproj
index 5d3b7b847a6ef763123d28ce3501e2c4a1277f09..fdd1ec3bc6625abe5d5cd3f7ac164923d0357308 100644
--- a/src/Tree/Tree.csproj
+++ b/src/Tree/Tree.csproj
@@ -56,17 +56,17 @@
     <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.27.0.0, Culture=neutral, PublicKeyToken=767d77427707b70a, processorArchitecture=MSIL">
-      <HintPath>..\packages\Coscine.Database.1.27.0\lib\net461\Coscine.Database.dll</HintPath>
+    <Reference Include="Coscine.Database, Version=1.28.0.0, Culture=neutral, PublicKeyToken=767d77427707b70a, processorArchitecture=MSIL">
+      <HintPath>..\packages\Coscine.Database.1.28.0-topic-1221-loggi0005\lib\net461\Coscine.Database.dll</HintPath>
     </Reference>
-    <Reference Include="Coscine.Database.T4, Version=1.27.0.0, Culture=neutral, PublicKeyToken=84b4c404a0696261, processorArchitecture=MSIL">
-      <HintPath>..\packages\Coscine.Database.1.27.0\lib\net461\Coscine.Database.T4.dll</HintPath>
+    <Reference Include="Coscine.Database.T4, Version=1.28.0.0, Culture=neutral, PublicKeyToken=84b4c404a0696261, processorArchitecture=MSIL">
+      <HintPath>..\packages\Coscine.Database.1.28.0-topic-1221-loggi0005\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\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>
+    <Reference Include="Coscine.Logging, Version=1.3.0.0, Culture=neutral, PublicKeyToken=e1ed402bc3f6525e, processorArchitecture=MSIL">
+      <HintPath>..\packages\Coscine.Logging.1.3.0-topic-1221-loggi0001\lib\net461\Coscine.Logging.dll</HintPath>
     </Reference>
     <Reference Include="Coscine.Metadata, Version=1.5.0.0, Culture=neutral, processorArchitecture=MSIL">
       <HintPath>..\packages\Coscine.Metadata.1.5.0\lib\net461\Coscine.Metadata.dll</HintPath>
diff --git a/src/Tree/packages.config b/src/Tree/packages.config
index 5cb7fddecdda4bba26eabe31e768648b51835b53..34afa10345ad0c278914f627bc8ff693ee4dbc29 100644
--- a/src/Tree/packages.config
+++ b/src/Tree/packages.config
@@ -3,9 +3,9 @@
   <package id="Consul" version="0.7.2.6" targetFramework="net461" />
   <package id="Coscine.ApiCommons" version="1.11.0" targetFramework="net461" />
   <package id="Coscine.Configuration" version="1.5.0" targetFramework="net461" />
-  <package id="Coscine.Database" version="1.27.0" targetFramework="net461" />
+  <package id="Coscine.Database" version="1.28.0-topic-1221-loggi0005" targetFramework="net461" />
   <package id="Coscine.JwtHandler" version="1.2.0" targetFramework="net461" />
-  <package id="Coscine.Logging" version="1.2.0" targetFramework="net461" />
+  <package id="Coscine.Logging" version="1.3.0-topic-1221-loggi0001" targetFramework="net461" />
   <package id="Coscine.Metadata" version="1.5.0" targetFramework="net461" />
   <package id="Coscine.ResourceConfiguration" version="1.3.0" targetFramework="net461" />
   <package id="Coscine.ResourceLoader" version="1.2.0" targetFramework="net461" />