diff --git a/src/Project/Controllers/DataSourceController.cs b/src/Project/Controllers/DataSourceController.cs
index 1c24695d2ef6d7caf2dee7777dcbd7fbfdb5198b..ff42b05c814f1d99ab0a9aa4a21c27a57491a030 100644
--- a/src/Project/Controllers/DataSourceController.cs
+++ b/src/Project/Controllers/DataSourceController.cs
@@ -1,6 +1,7 @@
 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;
@@ -255,6 +256,66 @@ namespace Coscine.Api.Project.Controllers
             }
         }
 
+        [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() == "rds")
+            {
+                RDSResourceType rdsResourceType = new RDSResourceType();
+                rdsResourceType.BucketName = resource["resourceTypeOption"]["BucketName"].ToString();
+                rdsResourceType.AccessKey = resource["resourceTypeOption"]["AccessKey"].ToString();
+                rdsResourceType.SecretKey = resource["resourceTypeOption"]["SecretKey"].ToString();
+                authHeader = BuildRdsAuthHeader(rdsResourceType);
+            }
+            else if (resource["type"]["displayName"].ToString().ToLower() == "gitlab")
+            {
+                GitlabResourceType gitlabResourceType = new GitlabResourceType();
+                gitlabResourceType.RepositoryNumber = (int)resource["resourceTypeOption"]["RepositoryNumber"];
+                gitlabResourceType.RepositoryUrl = resource["resourceTypeOption"]["RepositoryUrl"].ToString();
+                gitlabResourceType.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")}{resource["type"]["displayName"].ToString().ToLower()}{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)
@@ -393,9 +454,9 @@ namespace Coscine.Api.Project.Controllers
 
             var settings = new Dictionary<string, object>
             {
-                {"owner", "Tester"},
+                { "owner", "Tester"},
                 { "repo", gitlabResourceType.RepositoryUrl},
-                { "repo_id", gitlabResourceType.RepositoryNumber},
+                { "repo_id", gitlabResourceType.RepositoryNumber.ToString()},
                 { "host", "https://git.rwth-aachen.de"}
             };