diff --git a/src/Project.Tests/ProjectControllerTests.cs b/src/Project.Tests/ProjectControllerTests.cs
index 1b5f2befdcea056b06d0df718e050529d79f3cf5..f5966aba129124a55184d45d132ce9e909530223 100644
--- a/src/Project.Tests/ProjectControllerTests.cs
+++ b/src/Project.Tests/ProjectControllerTests.cs
@@ -64,6 +64,7 @@ namespace Coscine.Api.Project.Tests
         }
 
 
+
         [Test]
         public void TestControllerUpdate()
         {
@@ -138,6 +139,69 @@ namespace Coscine.Api.Project.Tests
             projectModel.Delete(project);
         }
 
+        [Test]
+        public void TestControllerStoreWithSubProject()
+        {
+            ProjectObject newProjectObject = new ProjectObject(Guid.NewGuid(), "NewProject", "NewDisplayName", "NewOrganisation", DateTime.Now, DateTime.Now.AddYears(1), "test2;test3");
+
+            var stream = ObjectFactory<ProjectObject>.SerializeToStream(newProjectObject);
+            FakeControllerContext(Users[0], stream);
+            var actionResult = Controller.Store();
+
+            OkObjectResult okObjectResult = (OkObjectResult)actionResult;
+            ProjectObject createdProjectObject = (ProjectObject)okObjectResult.Value;
+
+            ProjectObject newSubProjectObject = new ProjectObject(Guid.NewGuid(), "NewSubProject", "NewDisplayNameSub", "NewOrganisation", DateTime.Now, DateTime.Now.AddYears(1), "test2;test3", createdProjectObject.Id);
+
+            var subStream = ObjectFactory<ProjectObject>.SerializeToStream(newSubProjectObject);
+            FakeControllerContext(Users[0], subStream);
+            var subActionResult = Controller.Store();
+
+            OkObjectResult okSubObjectResult = (OkObjectResult)subActionResult;
+            ProjectObject createdSubProjectObject = (ProjectObject)okSubObjectResult.Value;
+
+            SubProjectModel subProjectModel = new SubProjectModel();
+            var subProjects = subProjectModel.GetAllWhere((x) => x.ProjectId == createdProjectObject.Id);
+            foreach(var subProject in subProjects)
+            {
+                Assert.IsTrue(subProject.SubProjectId == createdSubProjectObject.Id);
+                Assert.IsTrue(subProject.ProjectId == createdProjectObject.Id);
+            }
+
+            // Cleanup
+            stream.Close();
+            subStream.Close();
+
+            ProjectModel projectModel = new ProjectModel();
+            var project = projectModel.GetById(createdProjectObject.Id);
+
+            SubProjectModel subProjectModel1 = new SubProjectModel();
+            var subProjects1 = subProjectModel1.GetAllWhere((x) => x.ProjectId == project.Id);
+            foreach (var subProject in subProjects1)
+            {
+                subProjectModel1.Delete(subProject);
+            }
+
+            ProjectRoleModel projectRoleModel = new ProjectRoleModel();
+            var projectRoles = projectRoleModel.GetAllWhere((x) => x.ProjectId == project.Id);
+            foreach (var projectRole in projectRoles)
+            {
+                projectRoleModel.Delete(projectRole);
+            }
+
+            projectModel.Delete(project);
+
+            ProjectModel projectModel2 = new ProjectModel();
+            var project2 = projectModel2.GetById(createdSubProjectObject.Id);
+            ProjectRoleModel projectRoleModel2 = new ProjectRoleModel();
+            var projectRoles2 = projectRoleModel2.GetAllWhere((x) => x.ProjectId == project2.Id);
+            foreach (var projectRole in projectRoles2)
+            {
+                projectRoleModel2.Delete(projectRole);
+            }
+            projectModel2.Delete(project2);
+        }
+
         [Test]
         public void CountTest()
         {
diff --git a/src/Project/Controllers/ProjectController.cs b/src/Project/Controllers/ProjectController.cs
index c089ece79dc789364abb421c160f5f828f665730..7623479fbbbfd0ba94fb2243333949585961bd10 100644
--- a/src/Project/Controllers/ProjectController.cs
+++ b/src/Project/Controllers/ProjectController.cs
@@ -83,6 +83,14 @@ namespace Coscine.Api.Project.Controllers
                 ProjectModel projectModel = new ProjectModel();
                 var project = projectModel.StoreFromObject(projectObject, user);
 
+                if (projectObject.ParentId != null 
+                    && projectObject.ParentId != new Guid()
+                    && projectModel.OwnsProject(user, projectModel.GetById(projectObject.ParentId))) // for now, only an owner can add subprojects to projects
+                {
+                    SubProjectModel subProjectModel = new SubProjectModel();
+                    subProjectModel.LinkSubProject(projectObject.ParentId, project.Id);
+                }
+
                 FireEvents((projectAction, projectEventArgs) => projectAction.OnProjectCreate(project, projectEventArgs));
 
                 return new ProjectObject(project.Id, project.Description, project.DisplayName, project.Organization, project.StartDate, project.EndDate, project.Keywords);
diff --git a/src/Project/Features/Feature1/Feature1.Template.xml b/src/Project/Features/Feature1/Feature1.Template.xml
new file mode 100644
index 0000000000000000000000000000000000000000..c27273d59d947f7e135803ac790fc6280a2236e0
--- /dev/null
+++ b/src/Project/Features/Feature1/Feature1.Template.xml
@@ -0,0 +1,3 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<Feature xmlns="http://schemas.microsoft.com/sharepoint/">
+</Feature>
\ No newline at end of file
diff --git a/src/Project/Layouts/Coscine.SharePoint.Webparts.Vue/css/remove-sharepoint-controls.css b/src/Project/Layouts/Coscine.SharePoint.Webparts.Vue/css/remove-sharepoint-controls.css
new file mode 100644
index 0000000000000000000000000000000000000000..0069f11b7ab36dd3c79feb5485c47f8fb279a12d
--- /dev/null
+++ b/src/Project/Layouts/Coscine.SharePoint.Webparts.Vue/css/remove-sharepoint-controls.css
@@ -0,0 +1,14 @@
+.ms-breadcrumb-top,
+#SearchBox,
+#suiteBarButtons,
+#globalNavBox {
+  display: none !important;
+}
+
+#welcomeMenuBox {
+  margin-top: 5px;
+}
+
+body.rwth-seattle #s4-titlerow, .ms-breadcrumb-box {
+  height: auto !important;
+}
diff --git a/src/Project/Models/SubProjectModel.cs b/src/Project/Models/SubProjectModel.cs
new file mode 100644
index 0000000000000000000000000000000000000000..b0d67e9305f1b3ee18b4590b50436ebaec2132f9
--- /dev/null
+++ b/src/Project/Models/SubProjectModel.cs
@@ -0,0 +1,45 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Linq.Expressions;
+using Coscine.Api.Project.ReturnObjects;
+using Coscine.ApiCommons.Models;
+using Coscine.Database.Model;
+using LinqToDB;
+
+namespace Coscine.Api.Project.Models
+{
+    public class SubProjectModel : DatabaseModel<Coscine.Database.Model.SubProject>
+    {
+        public SubProjectModel() : base(Program.Configuration)
+        {
+
+        }
+
+        public override Expression<Func<SubProject, Guid>> GetIdFromObject()
+        {
+            return databaseObject => databaseObject.RelationId;
+        }
+
+        public override ITable<SubProject> GetITableFromDatabase(CoscineDB db)
+        {
+            return db.SubProjects;
+        }
+
+        public void LinkSubProject(Guid parentId, Guid childId)
+        {
+            Coscine.Database.Model.SubProject subProject = new Coscine.Database.Model.SubProject()
+            {
+                ProjectId = parentId,
+                SubProjectId = childId,
+            };
+            Insert(subProject);
+            return;
+        }
+
+        public override void SetObjectId(SubProject databaseObject, Guid id)
+        {
+            databaseObject.RelationId = id;
+        }
+    }
+}
diff --git a/src/Project/Project.csproj b/src/Project/Project.csproj
index d8877e0b59ecff30e9eaec10cdf224fac6a34037..863a64fdb1a76495e2bda932c3728fdce67e5370 100644
--- a/src/Project/Project.csproj
+++ b/src/Project/Project.csproj
@@ -572,6 +572,7 @@
     <Compile Include="Models\ResourceModel.cs" />
     <Compile Include="Models\ResourceTypeModel.cs" />
     <Compile Include="Models\RoleModel.cs" />
+    <Compile Include="Models\SubProjectModel.cs" />
     <Compile Include="Models\UserModel.cs" />
     <Compile Include="Program.cs" />
     <Compile Include="Properties\AssemblyInfo.cs" />
@@ -587,6 +588,12 @@
   <ItemGroup>
     <Service Include="{508349B6-6B84-4DF5-91F0-309BEEBAD82D}" />
   </ItemGroup>
+  <ItemGroup>
+    <Content Include="Features\Feature1\Feature1.Template.xml" />
+    <Content Include="Layouts\Coscine.SharePoint.Webparts.Vue\css\remove-sharepoint-controls.css" />
+    <Content Include="VueComponent\Elements.xml" />
+    <Content Include="VueComponent\VueComponentUserControl.ascx" />
+  </ItemGroup>
   <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
   <Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">
     <PropertyGroup>
diff --git a/src/Project/ReturnObjects/ProjectObject.cs b/src/Project/ReturnObjects/ProjectObject.cs
index f769fb16884f22a60444375fa1e6dc699037e922..6094df6cf99ff1dd4f75ffda53c5a774fdca7bc7 100644
--- a/src/Project/ReturnObjects/ProjectObject.cs
+++ b/src/Project/ReturnObjects/ProjectObject.cs
@@ -16,7 +16,9 @@ namespace Coscine.Api.Project.ReturnObjects
         public DateTime EndDate { get; set; }
         public string Keywords { get; set; }
 
-        public ProjectObject(Guid id, string description, string displayName, string organisation, DateTime startDate, DateTime endDate, string keywords)
+        public Guid ParentId { get; set; }
+        
+        public ProjectObject(Guid id, string description, string displayName, string organisation, DateTime startDate, DateTime endDate, string keywords, Guid parentId = new Guid())
         {
             Id = id;
             Description = description;
@@ -25,7 +27,7 @@ namespace Coscine.Api.Project.ReturnObjects
             StartDate = startDate;
             EndDate = endDate;
             Keywords = keywords;
+            ParentId = parentId;
         }
-
     }
 }
diff --git a/src/Project/VueComponent/Elements.xml b/src/Project/VueComponent/Elements.xml
new file mode 100644
index 0000000000000000000000000000000000000000..9cb73fad502a6ef4e9113ab52c2c27e51142dcb1
--- /dev/null
+++ b/src/Project/VueComponent/Elements.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Elements xmlns="http://schemas.microsoft.com/sharepoint/" >
+  <Module Name="VueComponent" List="113" Url="_catalogs/wp">
+    <File Path="VueComponent\VueComponent.webpart" Url="Coscine.SharePoint.Webparts.Vue_VueComponent.webpart" Type="GhostableInLibrary" >
+      <Property Name="Group" Value="Custom" />
+    </File>
+  </Module>
+</Elements>
diff --git a/src/Project/VueComponent/VueComponentUserControl.ascx b/src/Project/VueComponent/VueComponentUserControl.ascx
new file mode 100644
index 0000000000000000000000000000000000000000..2a98b4dbe41b1c98f485fd9f22b2229660ff65f7
--- /dev/null
+++ b/src/Project/VueComponent/VueComponentUserControl.ascx
@@ -0,0 +1,15 @@
+<%@ Assembly Name="$SharePoint.Project.AssemblyFullName$" %>
+<%@ Assembly Name="Microsoft.Web.CommandUI, Version=15.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" %> 
+<%@ Register Tagprefix="SharePoint" Namespace="Microsoft.SharePoint.WebControls" Assembly="Microsoft.SharePoint, Version=15.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" %> 
+<%@ Register Tagprefix="Utilities" Namespace="Microsoft.SharePoint.Utilities" Assembly="Microsoft.SharePoint, Version=15.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" %>
+<%@ Register Tagprefix="asp" Namespace="System.Web.UI" Assembly="System.Web.Extensions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" %>
+<%@ Import Namespace="Microsoft.SharePoint" %> 
+<%@ Register Tagprefix="WebPartPages" Namespace="Microsoft.SharePoint.WebPartPages" Assembly="Microsoft.SharePoint, Version=15.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" %>
+<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="VueComponentUserControl.ascx.cs" Inherits="Coscine.SharePoint.Webparts.Vue.VueComponent.VueComponentUserControl" %>
+
+<script type="text/javascript">
+    var coscine = coscine || {};
+    coscine.authorization = coscine.authorization || {};
+    coscine.authorization.bearer = "<%= GetUserJWT() %>";
+    window.component = "<%= GetComponent() %>";
+</script>
\ No newline at end of file