diff --git a/src/Project/Controllers/ProjectController.cs b/src/Project/Controllers/ProjectController.cs
index d2a952bf18680ef7e256762b7e8f66abf5fc136a..56cd94155d00dedafafb88d875b39591f6ff7c3b 100644
--- a/src/Project/Controllers/ProjectController.cs
+++ b/src/Project/Controllers/ProjectController.cs
@@ -40,7 +40,7 @@ namespace Coscine.Api.Project.Controllers
                             where projectRole.User == user
                             && projectRole.Role.DisplayName == "Owner"
                             select projectRole).Any()
-                ).Select((project) => _projectModel.CreateReturnObjectFromDatabaseObject(project));
+                ).Select((project) => _projectModel.CreateReturnObjectFromDatabaseObject(project)).OrderBy(element => element.DisplayName);
             }));
         }
 
@@ -78,7 +78,7 @@ namespace Coscine.Api.Project.Controllers
                             .Select((resource) =>
                             {
                                 return resourceModel.CreateReturnObjectFromDatabaseObject(resource);
-                            });
+                            }).OrderBy(element => element.DisplayName);
                 }
                 else
                 {
diff --git a/src/Project/Controllers/SearchController.cs b/src/Project/Controllers/SearchController.cs
index b5be4b68bda2748226729e5e1e88ab2dd7e5fa71..fac50f5ca188c14f451fcf75479a35543931c4e8 100644
--- a/src/Project/Controllers/SearchController.cs
+++ b/src/Project/Controllers/SearchController.cs
@@ -1,70 +1,226 @@
-using System.Linq;
-using Coscine.Api.Project.Models;
+using System;
+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 Microsoft.Extensions.Logging;
-using VDS.RDF.Query.Expressions.Functions.Sparql.String;
+using Newtonsoft.Json;
+using Newtonsoft.Json.Linq;
 
 namespace Coscine.Api.Project.Controllers
 {
     public class SearchController : Controller
     {
         private readonly Authenticator _authenticator;
-        private DatabaseConnection _databaseConnection;
-        private readonly ProjectModel _projectModel;
-
+        private readonly DatabaseConnection _databaseConnection;
 
         public SearchController()
         {
             _authenticator = new Authenticator(this, Program.Configuration);
-            _projectModel = new ProjectModel();
             _databaseConnection = new DatabaseConnection(Program.Configuration);
+        }
 
+        [HttpGet("[controller]/allNoFilter/")]
+        public IActionResult SearchNoFilter()
+        {
+            return Ok(_authenticator.ValidateAndExecute((user) =>
+            {
+                return GetSearchResults(user.Id, "", "");
+            }));
         }
 
-        [Route("[controller]")]
-        public IActionResult Index()
+        [HttpGet("[controller]/all/{encodedSearchWord}")]
+        public IActionResult Search(string encodedSearchWord)
         {
             return Ok(_authenticator.ValidateAndExecute((user) =>
             {
-                string searchQuery = "";
-                return _databaseConnection.ConnectToDatabase((db) =>
+                return GetSearchResults(user.Id, encodedSearchWord, "");
+            }));
+        }
+
+        [HttpGet("[controller]/projectNoFilter/{projectId}")]
+        public IActionResult SearchProjectNoFilter(string projectId)
+        {
+            return Ok(_authenticator.ValidateAndExecute((user) =>
+            {
+                return GetSearchResults(user.Id, "", projectId);
+            }));
+        }
+
+        [HttpGet("[controller]/project/{projectId}/{encodedSearchWord}")]
+        public IActionResult SearchProject(string projectId, string encodedSearchWord)
+        {
+            return Ok(_authenticator.ValidateAndExecute((user) =>
+            {
+                return GetSearchResults(user.Id, encodedSearchWord, projectId);
+            }));
+        }
+
+        private JToken GetSearchResults(Guid userId, string encodedSearchWord, string projectId)
+        {
+            string searchQuery;
+            if (!string.IsNullOrWhiteSpace(encodedSearchWord))
+            {
+                searchQuery = HttpUtility.UrlDecode(encodedSearchWord);
+            }
+            else
+            {
+                searchQuery = "";
+            }
+
+            List<Guid> list;
+            if (projectId.Equals(""))
+            {
+                list = new List<Guid>();
+            }
+            else
+            {
+                list = GetAllSubProjects(projectId);
+            }
+
+            // create return object
+            var json = new JObject();
+
+            // search and add results for resources
+            json["Resources"] = SearchForResources(userId, searchQuery, projectId, list);
+
+            // search and add results for projects
+            if (projectId.Equals(""))
+            {
+                json["Projects"] = SearchForProjects(userId, searchQuery, projectId, list, false);
+            }
+            else
+            {
+                json["Projects"] = new JArray();
+            }
+
+            // remove the id of the root project since it cann not be a subproject of it self
+            if (list.Count >= 1)
             {
-                return
+                list.RemoveAt(0);
+            }
+
+            // search and ad results for sub-projects
+            json["SubProjects"] = SearchForProjects(userId, searchQuery, projectId, list, true);
+
+            return json;
+        }
+
+
+        private List<Guid> GetAllSubProjects(string projectId)
+        {
+            var list = new List<Guid>();
+            if (!projectId.Equals(""))
+            {
+                list.Add(new Guid(projectId));
+                var counter = 0;
+                _databaseConnection.ConnectToDatabase((db) =>
+                {
+                    while (counter != list.Count)
+                    {
+                        var innerResults = (from sp in db.SubProjects
+                                            where sp.ProjectId.Equals(list[counter])
+                                            select sp.SubProjectId);
+                        list.AddRange(innerResults.ToList());
+                        counter++;
+                    }
+                });
+            }
+            return list;
+        }
+
+
+        private JToken SearchForProjects(Guid userId, string searchQuery, string projectId, List<Guid> listOfSubprojects, bool showSubProjects)
+        {
+            return _databaseConnection.ConnectToDatabase((db) =>
+            {
+                var allSubProjects = (from sp in db.SubProjects select sp.SubProjectId).ToList();
+                var allSubProjectsList = new List<Guid>();
+                allSubProjectsList.AddRange(allSubProjects);
+
+                var results =
                     (from p in db.Projects
-                        join v in db.Visibilities on p.VisibilityId equals v.Id
-                        join pd in db.ProjectDisciplines on p.Id equals pd.ProjectId
-                        join d in db.Disciplines on pd.DisciplineId equals d.Id
-                        join pi in db.ProjectInstitutes on p.Id equals pi.ProjectId
-                        join i in db.Institutes on pi.InstituteId equals i.Id
-
-                     where p.ProjectName.Contains(searchQuery) ||
-                           p.Description.Contains(searchQuery) ||
-                           p.StartDate.ToString().Contains(searchQuery) ||
-                           p.EndDate.ToString().Contains(searchQuery) ||
-                           p.Keywords.Contains(searchQuery) ||
-                           p.DisplayName.Contains(searchQuery) ||
-                           p.PrincipleInvestigators.Contains(searchQuery) ||
-                           p.GrantId.Contains(searchQuery) ||
-                           v.DisplayName.Contains(searchQuery) ||
-                           d.Url.Contains(searchQuery) ||
-                           d.DisplayNameDe.Contains(searchQuery) ||
-                           d.DisplayNameEn.Contains(searchQuery) ||
-                           i.DisplayName.Contains(searchQuery) ||
-                           i.IKZ.Contains(searchQuery) 
-
-                     select new {p.Id, p.DisplayName});
+                     join pr in db.ProjectRoles on p.Id equals pr.ProjectId into joinedPr
+                     from jpr in joinedPr.DefaultIfEmpty()
+                     join v in db.Visibilities on p.VisibilityId equals v.Id into joinedV
+                     from jv in joinedV.DefaultIfEmpty()
+                     join pd in db.ProjectDisciplines on p.Id equals pd.ProjectId into joinedPd
+                     from jpd in joinedPd.DefaultIfEmpty()
+                     join d in db.Disciplines on jpd.DisciplineId equals d.Id into joinedD
+                     from jd in joinedD.DefaultIfEmpty()
+                     join pi in db.ProjectInstitutes on p.Id equals pi.ProjectId into joinedPi
+                     from jpi in joinedPi.DefaultIfEmpty()
+                     join i in db.Institutes on jpi.InstituteId equals i.Id into joinedI
+                     from ji in joinedI.DefaultIfEmpty()
+
+                     where ((!showSubProjects && p.Id.NotIn(allSubProjectsList)) ||
+                         (showSubProjects && p.Id.In(allSubProjectsList))) &&
+                         (jpr.UserId.Equals(userId) || jv.DisplayName.Equals("Public")) &&
+                         (projectId.Equals("") || p.Id.In(listOfSubprojects)) &&
+                         (searchQuery.Equals("") ||
+                         p.ProjectName.Contains(searchQuery) ||
+                         p.Description.Contains(searchQuery) ||
+                         p.Keywords.Contains(searchQuery) ||
+                         p.DisplayName.Contains(searchQuery) ||
+                         p.PrincipleInvestigators.Contains(searchQuery) ||
+                         p.GrantId.Contains(searchQuery) ||
+                         jv.DisplayName.Contains(searchQuery) ||
+                         jd.Url.Contains(searchQuery) ||
+                         jd.DisplayNameDe.Contains(searchQuery) ||
+                         jd.DisplayNameEn.Contains(searchQuery) ||
+                         ji.DisplayName.Contains(searchQuery) ||
+                         ji.IKZ.Contains(searchQuery))
+
+                     select new { p.Id, p.DisplayName }).OrderBy(element => element.DisplayName).Distinct();
+                return JToken.Parse(JsonConvert.SerializeObject(results));
             });
-            }));
+        }
+
+        private JToken SearchForResources(Guid userId, string searchQuery, string projectId, List<Guid> listOfSubprojects)
+        {
+            return _databaseConnection.ConnectToDatabase((db) =>
+            {
+
+                var results = (from r in db.Resources
+                               join pres in db.ProjectResources on r.Id equals pres.ResourceId into joinedPres
+                               from jpres in joinedPres.DefaultIfEmpty()
+                               join p in db.Projects on jpres.ProjectId equals p.Id into joinedP
+                               from jp in joinedP.DefaultIfEmpty()
+                               join pr in db.ProjectRoles on jp.Id equals pr.ProjectId into joinedPr
+                               from jpr in joinedPr.DefaultIfEmpty()
+                               join v in db.Visibilities on r.VisibilityId equals v.Id into joinedV
+                               from jv in joinedV.DefaultIfEmpty()
+                               join rd in db.ResourceDisciplines on r.Id equals rd.ResourceId into joinedRd
+                               from jrd in joinedRd.DefaultIfEmpty()
+                               join d in db.Disciplines on jrd.DisciplineId equals d.Id into joinedD
+                               from jd in joinedD.DefaultIfEmpty()
+                               join l in db.Licenses on r.LicenseId equals l.Id into joinedL
+                               from jl in joinedL.DefaultIfEmpty()
+                               join rt in db.ResourceTypes on r.TypeId equals rt.Id into joinedRt
+                               from jrt in joinedRt.DefaultIfEmpty()
+
+                               where (jpr.UserId.Equals(userId) || jv.DisplayName.Equals("Public")) &&
+                                   (projectId.Equals("") || jp.Id.In(listOfSubprojects)) &&
+                                   (searchQuery.Equals("") ||
+                                   r.ResourceName.Contains(searchQuery) ||
+                                   r.DisplayName.Contains(searchQuery) ||
+                                   r.ResourceName.Contains(searchQuery) ||
+                                   r.Keywords.Contains(searchQuery) ||
+                                   r.UsageRights.Contains(searchQuery) ||
+                                   r.Description.Contains(searchQuery) ||
+                                   r.ApplicationProfile.Contains(searchQuery) ||
+                                   jrt.DisplayName.Contains(searchQuery) ||
+                                   jl.DisplayName.Contains(searchQuery) ||
+                                   jd.DisplayNameDe.Contains(searchQuery) ||
+                                   jd.DisplayNameEn.Contains(searchQuery))
 
-            /*
-            return DatabaseConnection.ConnectToDatabase((db) => (from relation in db.ProjectRoles
-                where relation.Project == project
-                      && relation.User == user
-                      && (relation.Role.DisplayName == "Owner"
-                          || relation.Role.DisplayName == "Member")
-                select relation).Any());*/
+                               select new { r.Id, r.DisplayName, jpr.ProjectId }).OrderBy(element => element.DisplayName).Distinct();
+
+                return JToken.Parse(JsonConvert.SerializeObject(results));
+
+            });
         }
     }
-}
+}
\ No newline at end of file
diff --git a/src/Project/Controllers/SubProjectController.cs b/src/Project/Controllers/SubProjectController.cs
index 74db39e5298c4766a70fb996e2ff0567a4c50717..89f06741ca8d19768ee05dd1cdb24905f31de66d 100644
--- a/src/Project/Controllers/SubProjectController.cs
+++ b/src/Project/Controllers/SubProjectController.cs
@@ -29,7 +29,8 @@ namespace Coscine.Api.Project.Controllers
                 {
                     var subProjects = _subProjectModel.GetAllWhere((subProjectM) => (subProjectM.ProjectId == parentGuid))
                                                      .Select((subProject) => projectModel.GetById(subProject.SubProjectId))
-                                                     .Select((project) => projectModel.CreateReturnObjectFromDatabaseObject(project, parentGuid));
+                                                     .Select((project) => projectModel.CreateReturnObjectFromDatabaseObject(project, parentGuid))
+                                                     .OrderBy(element => element.DisplayName);
                     return subProjects;
                 }
                 else
diff --git a/src/Project/Project.csproj b/src/Project/Project.csproj
index 82c8b3c09738866ce651c8e3811f637ebfafe714..32d15bb472d764081e272ce7c10c44c0cc44cd2c 100644
--- a/src/Project/Project.csproj
+++ b/src/Project/Project.csproj
@@ -606,6 +606,7 @@
     <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" />