diff --git a/Tsi1.Api/Tsi1.Api/Controllers/CourseController.cs b/Tsi1.Api/Tsi1.Api/Controllers/CourseController.cs
index 4a8d4b838b69c414438d9802c0ded5433fa78b0a..5469334a34225ac449c54dc52e9e4cfe9f9ca849 100644
--- a/Tsi1.Api/Tsi1.Api/Controllers/CourseController.cs
+++ b/Tsi1.Api/Tsi1.Api/Controllers/CourseController.cs
@@ -21,12 +21,9 @@ namespace Tsi1.Api.Controllers
     {
         private readonly ICourseService _courseService;
 
-        private readonly IFileService _fileService;
-
-        public CourseController(ICourseService courseService, IFileService fileService)
+        public CourseController(ICourseService courseService)
         {
             _courseService = courseService;
-            _fileService = fileService;
         }
 
         [Authorize(Roles = UserTypes.Student + ", " + UserTypes.Professor)]
diff --git a/Tsi1.Api/Tsi1.Api/Controllers/SectionItemController.cs b/Tsi1.Api/Tsi1.Api/Controllers/SectionItemController.cs
index 4e278ca49c8c101e03e2c593a2cc5a895c3196d1..1a1a7c5e582cf3d7caf234e21ccf243de7bb0c8b 100644
--- a/Tsi1.Api/Tsi1.Api/Controllers/SectionItemController.cs
+++ b/Tsi1.Api/Tsi1.Api/Controllers/SectionItemController.cs
@@ -1,4 +1,5 @@
 using System.Collections.Generic;
+using System.Linq;
 using System.Threading.Tasks;
 using Microsoft.AspNetCore.Authorization;
 using Microsoft.AspNetCore.Mvc;
@@ -25,7 +26,9 @@ namespace Tsi1.Api.Controllers
         [HttpPost("Create")]
         public async Task<IActionResult> Create(SectionItemCreateDto sectionItem)
         {
-            var result = await _sectionItemService.Create(sectionItem);
+            var tenantId = int.Parse(HttpContext.User.Claims.FirstOrDefault(x => x.Type == "TenantId").Value);
+
+            var result = await _sectionItemService.Create(sectionItem, tenantId);
             if (result.HasError)
             {
                 return BadRequest(result.Message);
diff --git a/Tsi1.Api/Tsi1.Api/Controllers/SurveyController.cs b/Tsi1.Api/Tsi1.Api/Controllers/SurveyController.cs
new file mode 100644
index 0000000000000000000000000000000000000000..48ae7c43759b9c5743eb0cddd78675961e71c601
--- /dev/null
+++ b/Tsi1.Api/Tsi1.Api/Controllers/SurveyController.cs
@@ -0,0 +1,136 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Security.Claims;
+using System.Threading.Tasks;
+using Microsoft.AspNetCore.Authorization;
+using Microsoft.AspNetCore.Http;
+using Microsoft.AspNetCore.Mvc;
+using Tsi1.BusinessLayer.Dtos;
+using Tsi1.BusinessLayer.Helpers;
+using Tsi1.BusinessLayer.Interfaces;
+using Tsi1.DataLayer.Entities;
+
+namespace Tsi1.Api.Controllers
+{
+    [Route("api/[controller]")]
+    [ApiController]
+    public class SurveyController : ControllerBase
+    {
+        private readonly ISurveyService _surveyService;
+
+        public SurveyController(ISurveyService surveyService)
+        {
+            _surveyService = surveyService;
+        }
+
+        [Authorize(Roles = UserTypes.FacultyAdmin + ", " + UserTypes.UdelarAdmin)]
+        [HttpPost("Create")]
+        public async Task<IActionResult> Create(SurveyCreateDto newSurvey, int tenantId)
+        {
+            var userType = HttpContext.User.Claims.FirstOrDefault(x => x.Type == ClaimTypes.Role).Value;
+            if (userType == UserTypes.FacultyAdmin)
+            {
+                tenantId = int.Parse(HttpContext.User.Claims.FirstOrDefault(x => x.Type == "TenantId").Value);
+            }
+            newSurvey.IsGlobal = true;
+
+            var result = await _surveyService.CreateGlobalSurvey(newSurvey, tenantId);
+
+            if (result.HasError)
+            {
+                return BadRequest(result.Message);
+            }
+
+            return Ok();
+        }
+
+        [Authorize(Roles = UserTypes.FacultyAdmin + ", " + UserTypes.UdelarAdmin)]
+        [HttpDelete("Delete/{surveyId}")]
+        public async Task<IActionResult> Delete(int surveyId)
+        {
+            var userType = HttpContext.User.Claims.FirstOrDefault(x => x.Type == ClaimTypes.Role).Value;
+            var tenantId = int.Parse(HttpContext.User.Claims.FirstOrDefault(x => x.Type == "TenantId").Value);
+
+            var result = await _surveyService.DeleteGlobalSurvey(surveyId, userType, tenantId);
+
+            if (result.HasError)
+            {
+                return BadRequest(result.Message);
+            }
+
+            return Ok();
+        }
+
+        [Authorize(Roles = UserTypes.FacultyAdmin + ", " + UserTypes.UdelarAdmin)]
+        [HttpGet("GetAllGlobalSurveys")]
+        public async Task<IActionResult> GetAllGlobalSurveys(int tenantId)
+        {
+            var userType = HttpContext.User.Claims.FirstOrDefault(x => x.Type == ClaimTypes.Role).Value;
+            if (userType == UserTypes.FacultyAdmin)
+            {
+                tenantId = int.Parse(HttpContext.User.Claims.FirstOrDefault(x => x.Type == "TenantId").Value);
+            }
+           
+            var result = await _surveyService.GetAllGlobalSurveys(tenantId, userType);
+
+            if (result.HasError)
+            {
+                return BadRequest(result.Message);
+            }
+
+            return Ok(result.Data);
+        }
+
+        [Authorize(Roles = UserTypes.FacultyAdmin + ", " + UserTypes.UdelarAdmin + ", " + UserTypes.Professor + ", " + UserTypes.Student)]
+        [HttpGet("GetMySurvey/{surveyId}")]
+        public async Task<IActionResult> GetMySurvey(int surveyId)
+        {
+            var userId = int.Parse(HttpContext.User.Claims.FirstOrDefault(x => x.Type == "Id").Value);
+
+            var result = await _surveyService.GetMySurvey(surveyId, userId);
+
+            if (result.HasError)
+            {
+                return NotFound(result.Message);
+            }
+
+            return Ok(result.Data);
+        }
+
+        [Authorize(Roles = UserTypes.Student)]
+        [HttpPost("Complete")]
+        public async Task<IActionResult> Complete(SurveyResponseCreateDto surveyResponse)
+        {
+            var userId = int.Parse(HttpContext.User.Claims.FirstOrDefault(x => x.Type == "Id").Value);
+            surveyResponse.UserId = userId;
+
+            var result = await _surveyService.Complete(surveyResponse);
+
+            if (result.HasError)
+            {
+                return NotFound(result.Message);
+            }
+
+            return Ok(result.Data);
+        }
+
+        [Authorize(Roles = UserTypes.FacultyAdmin + ", " + UserTypes.UdelarAdmin + ", " + UserTypes.Professor)]
+        [HttpGet("GetAllResponses/{surveyId}")]
+        public async Task<IActionResult> GetAllResponses(int surveyId)
+        {
+            var userType = HttpContext.User.Claims.FirstOrDefault(x => x.Type == ClaimTypes.Role).Value;
+            var tenantId = int.Parse(HttpContext.User.Claims.FirstOrDefault(x => x.Type == "TenantId").Value);
+            
+            var result = await _surveyService.GetAllResponses(surveyId, userType, tenantId);
+
+            if (result.HasError)
+            {
+                return NotFound(result.Message);
+            }
+
+            return Ok(result.Data);
+        }
+
+    }
+}
diff --git a/Tsi1.Api/Tsi1.Api/Startup.cs b/Tsi1.Api/Tsi1.Api/Startup.cs
index b15b91cef5d34e74460756ba52fd1a1da80d42c0..369da763de4eb9e1b36021dafd89bb2e15651955 100644
--- a/Tsi1.Api/Tsi1.Api/Startup.cs
+++ b/Tsi1.Api/Tsi1.Api/Startup.cs
@@ -91,6 +91,7 @@ namespace Tsi1.Api
             services.AddScoped<ISectionItemService, SectionItemService>();
             services.AddScoped<ISectionItemTypeService, SectionItemTypeService>();
             services.AddScoped<IDataLoad, DataLoad>();
+            services.AddScoped<ISurveyService, SurveyService>();
 
             services.Configure<MailSettings>(Configuration.GetSection("MailSettings"));
             services.AddScoped<IEmailService, EmailService>();
diff --git a/Tsi1.Api/Tsi1.BusinessLayer/DataLoad/DataLoad.cs b/Tsi1.Api/Tsi1.BusinessLayer/DataLoad/DataLoad.cs
index ea09ddf721818c249411dcdc6219633d99d350ad..db3a8af45db895fce706b8f731064675f59f73d5 100644
--- a/Tsi1.Api/Tsi1.BusinessLayer/DataLoad/DataLoad.cs
+++ b/Tsi1.Api/Tsi1.BusinessLayer/DataLoad/DataLoad.cs
@@ -13,29 +13,23 @@ namespace Tsi1.BusinessLayer.DataLoad
     public class DataLoad : IDataLoad
     {
         private readonly Tsi1Context _context;
-        private readonly IUserTypeService _userTypeService;
         private readonly ITenantService _tenantService;
         private readonly IUserService _userService;
         private readonly ICourseService _courseService;
-        private readonly ISectionItemTypeService _sectionItemTypeService;
         private readonly ISectionService _sectionService;
         private readonly ISectionItemService _sectionItemService;
 
         public DataLoad(Tsi1Context context,
-            IUserTypeService userTypeService,
             ITenantService tenantService,
             IUserService userService,
             ICourseService courseService,
-            ISectionItemTypeService sectionItemTypeService,
             ISectionService sectionService,
             ISectionItemService sectionItemService)
         {
             _context = context;
-            _userTypeService = userTypeService;
             _tenantService = tenantService;
             _userService = userService;
             _courseService = courseService;
-            _sectionItemTypeService = sectionItemTypeService;
             _sectionService = sectionService;
             _sectionItemService = sectionItemService;
         }
@@ -161,6 +155,12 @@ namespace Tsi1.BusinessLayer.DataLoad
             };
             _context.SectionItemTypes.Add(sectionItemTypeForum);
 
+            var sectionItemTypeSurvey = new SectionItemType
+            {
+                Name = SectionItemTypes.Survey,
+            };
+            _context.SectionItemTypes.Add(sectionItemTypeSurvey);
+
             await _context.SaveChangesAsync();
 
             // COURSES  
@@ -183,7 +183,7 @@ namespace Tsi1.BusinessLayer.DataLoad
                 Name = "Fisica 1",
                 TenantId = fingTenantId.Data.Id
             };
-            var course3 = await _courseService.Create(course3Dto);
+            await _courseService.Create(course3Dto);
 
             // SECTIONS
             var section1 = new SectionCreateDto
@@ -221,7 +221,7 @@ namespace Tsi1.BusinessLayer.DataLoad
                     Name = "Novedades"
                 }
             };
-            await _sectionItemService.Create(sectionItem1);
+            await _sectionItemService.Create(sectionItem1, fingTenantId.Data.Id);
 
             var sectionItem2 = new SectionItemCreateDto
             {
@@ -233,7 +233,7 @@ namespace Tsi1.BusinessLayer.DataLoad
                     Name = "Novedades"
                 }
             };
-            await _sectionItemService.Create(sectionItem2);
+            await _sectionItemService.Create(sectionItem2, fingTenantId.Data.Id);
 
             var sectionItem3 = new SectionItemCreateDto
             {
@@ -245,7 +245,7 @@ namespace Tsi1.BusinessLayer.DataLoad
                     Name = "General"
                 }
             };
-            await _sectionItemService.Create(sectionItem3);
+            await _sectionItemService.Create(sectionItem3, fingTenantId.Data.Id);
 
             var sectionItem4 = new SectionItemCreateDto
             {
@@ -257,7 +257,36 @@ namespace Tsi1.BusinessLayer.DataLoad
                     Name = "Tema 1"
                 }
             };
-            await _sectionItemService.Create(sectionItem4);
+            await _sectionItemService.Create(sectionItem4, fingTenantId.Data.Id);
+
+            // ANSWER OPTIONS
+            var answerOptions = new List<AnswerOption>
+            {
+                new AnswerOption
+                {
+                    Name = "Excelente"
+                },
+                new AnswerOption
+                {
+                    Name = "Conforme"
+                },
+                new AnswerOption
+                {
+                    Name = "Neutro"
+                },
+                new AnswerOption
+                {
+                    Name = "No Conforme"
+                },
+                new AnswerOption
+                {
+                    Name = "Mal"
+                },
+            };
+
+            _context.AnswerOptions.AddRange(answerOptions);
+            await _context.SaveChangesAsync();
+
         }
     }
 }
\ No newline at end of file
diff --git a/Tsi1.Api/Tsi1.BusinessLayer/Dtos/SectionItemCreateDto.cs b/Tsi1.Api/Tsi1.BusinessLayer/Dtos/SectionItemCreateDto.cs
index 9da60f96c22ec4674298ff8503a8d29b0b70cfb8..6ddb3a53587dc01c31fbe715054739d69f4cc871 100644
--- a/Tsi1.Api/Tsi1.BusinessLayer/Dtos/SectionItemCreateDto.cs
+++ b/Tsi1.Api/Tsi1.BusinessLayer/Dtos/SectionItemCreateDto.cs
@@ -12,5 +12,7 @@ namespace Tsi1.BusinessLayer.Dtos
 
         public ForumCreateDto Forum { get; set; }
         public FileDto File { get; set; }
+
+        public SurveyCreateDto Survey { get; set; }
     }
 }
diff --git a/Tsi1.Api/Tsi1.BusinessLayer/Dtos/SectionItemDetailDto.cs b/Tsi1.Api/Tsi1.BusinessLayer/Dtos/SectionItemDetailDto.cs
index 9b6929057d90d5d05100f272a1818a7f01772e54..242f74d5178763ad580e4cd006ad5f71a698d645 100644
--- a/Tsi1.Api/Tsi1.BusinessLayer/Dtos/SectionItemDetailDto.cs
+++ b/Tsi1.Api/Tsi1.BusinessLayer/Dtos/SectionItemDetailDto.cs
@@ -11,5 +11,6 @@ namespace Tsi1.BusinessLayer.Dtos
         public int SectionItemTypeId { get; set; }
         public ForumPreviewDto Forum { get; set; }
         public FileDetailDto File { get; set; }
+        public SurveyDetailDto Survey { get; set; }
     }
 }
diff --git a/Tsi1.Api/Tsi1.BusinessLayer/Dtos/SurveyAnswerCreateDto.cs b/Tsi1.Api/Tsi1.BusinessLayer/Dtos/SurveyAnswerCreateDto.cs
new file mode 100644
index 0000000000000000000000000000000000000000..2b261bbc014c40692bb438284506f3055d07cd66
--- /dev/null
+++ b/Tsi1.Api/Tsi1.BusinessLayer/Dtos/SurveyAnswerCreateDto.cs
@@ -0,0 +1,13 @@
+using System;
+using System.Collections.Generic;
+using System.Text;
+using System.Text.Json.Serialization;
+
+namespace Tsi1.BusinessLayer.Dtos
+{
+    public class SurveyAnswerCreateDto
+    {
+        public int AnswerOptionId { get; set; }
+        public int SurveyQuestionId { get; set; }
+    }
+}
diff --git a/Tsi1.Api/Tsi1.BusinessLayer/Dtos/SurveyAnswerDetailDto.cs b/Tsi1.Api/Tsi1.BusinessLayer/Dtos/SurveyAnswerDetailDto.cs
new file mode 100644
index 0000000000000000000000000000000000000000..d51d83f915a2dc32286c2568e84987fcb880a64c
--- /dev/null
+++ b/Tsi1.Api/Tsi1.BusinessLayer/Dtos/SurveyAnswerDetailDto.cs
@@ -0,0 +1,14 @@
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace Tsi1.BusinessLayer.Dtos
+{
+    public class SurveyAnswerDetailDto
+    {
+        public int Id { get; set; }
+        public int AnswerOptionId { get; set; }
+        public int SurveyResponseId { get; set; }
+        public int SurveyQuestionId { get; set; }
+    }
+}
diff --git a/Tsi1.Api/Tsi1.BusinessLayer/Dtos/SurveyCreateDto.cs b/Tsi1.Api/Tsi1.BusinessLayer/Dtos/SurveyCreateDto.cs
new file mode 100644
index 0000000000000000000000000000000000000000..3721d0de114a82137a8affea3344d0e2c68e357d
--- /dev/null
+++ b/Tsi1.Api/Tsi1.BusinessLayer/Dtos/SurveyCreateDto.cs
@@ -0,0 +1,17 @@
+using System;
+using System.Collections.Generic;
+using System.Text;
+using System.Text.Json.Serialization;
+
+namespace Tsi1.BusinessLayer.Dtos
+{
+    public class SurveyCreateDto
+    {
+        public string Name { get; set; }
+
+        [JsonIgnore]
+        public bool IsGlobal { get; set; }
+
+        public List<SurveyQuestionCreateDto> SurveyQuestions { get; set; }
+    }
+}
diff --git a/Tsi1.Api/Tsi1.BusinessLayer/Dtos/SurveyDetailDto.cs b/Tsi1.Api/Tsi1.BusinessLayer/Dtos/SurveyDetailDto.cs
new file mode 100644
index 0000000000000000000000000000000000000000..4b29dcd667e7db7dc09e2f0d1921b6bd539b44a2
--- /dev/null
+++ b/Tsi1.Api/Tsi1.BusinessLayer/Dtos/SurveyDetailDto.cs
@@ -0,0 +1,18 @@
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace Tsi1.BusinessLayer.Dtos
+{
+    public class SurveyDetailDto
+    {
+        public int Id { get; set; }
+        public string Name { get; set; }
+        public bool IsGlobal { get; set; }
+
+        public List<SurveyQuestionPreviewDto> SurveyQuestions { get; set; }
+
+        public SurveyResponseDetailDto SurveyResponse { get; set; }
+
+    }
+}
diff --git a/Tsi1.Api/Tsi1.BusinessLayer/Dtos/SurveyPreviewDto.cs b/Tsi1.Api/Tsi1.BusinessLayer/Dtos/SurveyPreviewDto.cs
new file mode 100644
index 0000000000000000000000000000000000000000..ac5fd309bff78020ac7035cebe4a66c948c26be0
--- /dev/null
+++ b/Tsi1.Api/Tsi1.BusinessLayer/Dtos/SurveyPreviewDto.cs
@@ -0,0 +1,13 @@
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace Tsi1.BusinessLayer.Dtos
+{
+    public class SurveyPreviewDto
+    {
+        public int Id { get; set; }
+        public string Name { get; set; }
+
+    }
+}
diff --git a/Tsi1.Api/Tsi1.BusinessLayer/Dtos/SurveyQuestionCreateDto.cs b/Tsi1.Api/Tsi1.BusinessLayer/Dtos/SurveyQuestionCreateDto.cs
new file mode 100644
index 0000000000000000000000000000000000000000..e9b9f89a41fde5227c6b670e096025933563f98d
--- /dev/null
+++ b/Tsi1.Api/Tsi1.BusinessLayer/Dtos/SurveyQuestionCreateDto.cs
@@ -0,0 +1,11 @@
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace Tsi1.BusinessLayer.Dtos
+{
+    public class SurveyQuestionCreateDto
+    {
+        public string Question { get; set; }
+    }
+}
diff --git a/Tsi1.Api/Tsi1.BusinessLayer/Dtos/SurveyQuestionPreviewDto.cs b/Tsi1.Api/Tsi1.BusinessLayer/Dtos/SurveyQuestionPreviewDto.cs
new file mode 100644
index 0000000000000000000000000000000000000000..3767f926acf956024b1a427caec6ad8dc9879051
--- /dev/null
+++ b/Tsi1.Api/Tsi1.BusinessLayer/Dtos/SurveyQuestionPreviewDto.cs
@@ -0,0 +1,12 @@
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace Tsi1.BusinessLayer.Dtos
+{
+    public class SurveyQuestionPreviewDto
+    {
+        public int Id { get; set; }
+        public string Question { get; set; }
+    }
+}
diff --git a/Tsi1.Api/Tsi1.BusinessLayer/Dtos/SurveyResponseCreateDto.cs b/Tsi1.Api/Tsi1.BusinessLayer/Dtos/SurveyResponseCreateDto.cs
new file mode 100644
index 0000000000000000000000000000000000000000..2d8a31cf2b60df97ef20893561b9bf23f1edd8b1
--- /dev/null
+++ b/Tsi1.Api/Tsi1.BusinessLayer/Dtos/SurveyResponseCreateDto.cs
@@ -0,0 +1,15 @@
+using System;
+using System.Collections.Generic;
+using System.Text;
+using System.Text.Json.Serialization;
+
+namespace Tsi1.BusinessLayer.Dtos
+{
+    public class SurveyResponseCreateDto
+    {
+        [JsonIgnore]
+        public int UserId { get; set; }
+        public int SurveyId { get; set; }
+        public List<SurveyAnswerCreateDto> SurveyAnswers { get; set; }
+    }
+}
diff --git a/Tsi1.Api/Tsi1.BusinessLayer/Dtos/SurveyResponseDetailDto.cs b/Tsi1.Api/Tsi1.BusinessLayer/Dtos/SurveyResponseDetailDto.cs
new file mode 100644
index 0000000000000000000000000000000000000000..70f064b0c2014ba58ec0b17032c1b3e39a0cdc41
--- /dev/null
+++ b/Tsi1.Api/Tsi1.BusinessLayer/Dtos/SurveyResponseDetailDto.cs
@@ -0,0 +1,14 @@
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace Tsi1.BusinessLayer.Dtos
+{
+    public class SurveyResponseDetailDto
+    {
+        public int Id { get; set; }
+        public int UserId { get; set; }
+        public int SurveyId { get; set; }
+        public List<SurveyAnswerDetailDto> SurveyAnswers { get; set; }
+    }
+}
diff --git a/Tsi1.Api/Tsi1.BusinessLayer/Helpers/ErrorMessages.cs b/Tsi1.Api/Tsi1.BusinessLayer/Helpers/ErrorMessages.cs
index 41b7cf04530200739506f9fc996dff91c0ac3b81..322b0643d8e329eb1a4f74025c356a389776e0cd 100644
--- a/Tsi1.Api/Tsi1.BusinessLayer/Helpers/ErrorMessages.cs
+++ b/Tsi1.Api/Tsi1.BusinessLayer/Helpers/ErrorMessages.cs
@@ -54,5 +54,11 @@ namespace Tsi1.BusinessLayer.Helpers
         public const string ForumIsNull = "El foro es nulo";
         public const string FileIsNull = "El archivo es nulo";
         public const string InvalidSectionItemData = "El tipo de item de seccion '{0}' no coincide con su contenido '{1}'";
+
+        public const string SurveyDoesNotExist = "La encuesta con id '{0}' no existe";
+        public const string SurveyIsNull = "La encuesta es nula";
+        public const string SurveyHasNoQuestions = "La encuesta no tiene preguntas";
+        public const string InvalidSurvey = "La encuesta no pertenece a la facultad con id '{0}'";
+        public const string SurveyResponseAlreadyExist = "El usuario '{0}' ya completo la encuesta '{1}'";
     }
 }
diff --git a/Tsi1.Api/Tsi1.BusinessLayer/Helpers/MappingProfile.cs b/Tsi1.Api/Tsi1.BusinessLayer/Helpers/MappingProfile.cs
index 4d7d53b30ba60bfd543f4520cac5d16b0a07d6c2..1f30ef1cfdbb29e897c72ddc82dc175e8542b9b4 100644
--- a/Tsi1.Api/Tsi1.BusinessLayer/Helpers/MappingProfile.cs
+++ b/Tsi1.Api/Tsi1.BusinessLayer/Helpers/MappingProfile.cs
@@ -35,13 +35,20 @@ namespace Tsi1.BusinessLayer.Helpers
             CreateMap<File, FileDto>();
             CreateMap<SectionItem, SectionItemCreateDto>();
             CreateMap<Section, SectionCreateDto>();
-            CreateMap<SectionItemType, SectionItemTypeDto>();
-            
+            CreateMap<SectionItemType, SectionItemTypeDto>();       
             CreateMap<Course, CourseDetailDto>();
             CreateMap<Section, SectionDetailDto>();
             CreateMap<SectionItem, SectionItemDetailDto>();
             CreateMap<File, FileDetailDto>();
-          
+            CreateMap<Survey, SurveyCreateDto>();
+            CreateMap<Survey, SurveyPreviewDto>();
+            CreateMap<Survey, SurveyDetailDto>();
+            CreateMap<SurveyQuestion, SurveyQuestionCreateDto>();
+            CreateMap<SurveyQuestion, SurveyQuestionPreviewDto>();
+            CreateMap<SurveyResponse, SurveyResponseCreateDto>();
+            CreateMap<SurveyResponse, SurveyResponseDetailDto>();
+            CreateMap<SurveyAnswer, SurveyAnswerDetailDto>();
+            CreateMap<SurveyAnswer, SurveyAnswerCreateDto>();
 
             CreateMap<ForumCreateDto, Forum>();
             CreateMap<ForumPreviewDto, Forum>();
@@ -67,11 +74,20 @@ namespace Tsi1.BusinessLayer.Helpers
             CreateMap<SectionItemCreateDto, SectionItem>();
             CreateMap<SectionCreateDto, Section>();
             CreateMap<SectionItemTypeDto, SectionItemType>();
-
             CreateMap<CourseDetailDto, Course>();
             CreateMap<SectionDetailDto, Section>();
             CreateMap<SectionItemDetailDto, SectionItem>();
             CreateMap<FileDetailDto, File>();
+            CreateMap<SurveyCreateDto, Survey>();
+            CreateMap<SurveyDetailDto, Survey>();
+            CreateMap<SurveyPreviewDto, Survey>();
+            CreateMap<SurveyQuestionCreateDto, SurveyQuestion>();
+            CreateMap<SurveyQuestionPreviewDto, SurveyQuestion>();
+            CreateMap<SurveyResponseCreateDto, SurveyResponse>();
+            CreateMap<SurveyResponseDetailDto, SurveyResponse>();
+            CreateMap<SurveyAnswerDetailDto, SurveyAnswer>();
+            CreateMap<SurveyAnswerCreateDto, SurveyAnswer>();
+
         }
     }
 }
diff --git a/Tsi1.Api/Tsi1.BusinessLayer/Helpers/SectionItemTypes.cs b/Tsi1.Api/Tsi1.BusinessLayer/Helpers/SectionItemTypes.cs
index 0eee4f0c3bd2dd3c53204e5539652b839534a794..a889446941100b1eb36fb20075cd6b8228dd614c 100644
--- a/Tsi1.Api/Tsi1.BusinessLayer/Helpers/SectionItemTypes.cs
+++ b/Tsi1.Api/Tsi1.BusinessLayer/Helpers/SectionItemTypes.cs
@@ -8,5 +8,6 @@ namespace Tsi1.BusinessLayer.Helpers
     {
         public const string Forum  = nameof(Forum);
         public const string File  = nameof(File);
+        public const string Survey = nameof(Survey);
     }
 }
diff --git a/Tsi1.Api/Tsi1.BusinessLayer/Interfaces/ISectionItemService.cs b/Tsi1.Api/Tsi1.BusinessLayer/Interfaces/ISectionItemService.cs
index 4834f03114b891bfae163d7d87ac1be83dfced28..ad048812770a41c268427b9a0d0c1aa1a8ca7812 100644
--- a/Tsi1.Api/Tsi1.BusinessLayer/Interfaces/ISectionItemService.cs
+++ b/Tsi1.Api/Tsi1.BusinessLayer/Interfaces/ISectionItemService.cs
@@ -9,7 +9,7 @@ namespace Tsi1.BusinessLayer.Interfaces
 {
     public interface ISectionItemService
     {
-        Task<ServiceResult<bool>> Create(SectionItemCreateDto newSectionItem);
+        Task<ServiceResult<bool>> Create(SectionItemCreateDto newSectionItem, int tenantId);
         Task<ServiceResult<bool>> Delete(int sectionItemId);
         Task<ServiceResult<bool>> OrderSectionItems(List<OrderDto> orderDtos);
     }
diff --git a/Tsi1.Api/Tsi1.BusinessLayer/Interfaces/ISurveyService.cs b/Tsi1.Api/Tsi1.BusinessLayer/Interfaces/ISurveyService.cs
new file mode 100644
index 0000000000000000000000000000000000000000..166da72495011ee0b30a6ccaee67e8f108288c3b
--- /dev/null
+++ b/Tsi1.Api/Tsi1.BusinessLayer/Interfaces/ISurveyService.cs
@@ -0,0 +1,19 @@
+using System;
+using System.Collections.Generic;
+using System.Text;
+using System.Threading.Tasks;
+using Tsi1.BusinessLayer.Dtos;
+using Tsi1.BusinessLayer.Helpers;
+
+namespace Tsi1.BusinessLayer.Interfaces
+{
+    public interface ISurveyService
+    {
+        Task<ServiceResult<bool>> CreateGlobalSurvey(SurveyCreateDto newSurvey, int tenantId);
+        Task<ServiceResult<bool>> DeleteGlobalSurvey(int surveyId, string userType, int tenantId);
+        Task<ServiceResult<List<SurveyPreviewDto>>> GetAllGlobalSurveys(int tenantId, string userType);
+        Task<ServiceResult<SurveyDetailDto>> GetMySurvey(int surveyId, int userId);
+        Task<ServiceResult<bool>> Complete(SurveyResponseCreateDto surveyResponse);
+        Task<ServiceResult<List<SurveyResponseDetailDto>>> GetAllResponses(int surveyId, string userType, int tenantId);
+    }
+}
diff --git a/Tsi1.Api/Tsi1.BusinessLayer/Services/CourseService.cs b/Tsi1.Api/Tsi1.BusinessLayer/Services/CourseService.cs
index fffcc93913bd4653c1fc9228a6d362b6e2acd8f8..326206b791ac86d65b5575c47373ff84fb7aab6e 100644
--- a/Tsi1.Api/Tsi1.BusinessLayer/Services/CourseService.cs
+++ b/Tsi1.Api/Tsi1.BusinessLayer/Services/CourseService.cs
@@ -353,6 +353,9 @@ namespace Tsi1.BusinessLayer.Services
                 .Include(x => x.Sections)
                     .ThenInclude(x => x.SectionItems)
                         .ThenInclude(x => x.File)
+                .Include(x => x.Sections)
+                    .ThenInclude(x => x.SectionItems)
+                        .ThenInclude(x => x.Survey)
                 .FirstOrDefaultAsync(x => x.Id == courseId);
 
             if (course == null)
diff --git a/Tsi1.Api/Tsi1.BusinessLayer/Services/EmailService.cs b/Tsi1.Api/Tsi1.BusinessLayer/Services/EmailService.cs
index 9519fc5b0cf3037535e101a866a297392b786825..6be1396f8a82712544d99e643c9550d44407dfcd 100644
--- a/Tsi1.Api/Tsi1.BusinessLayer/Services/EmailService.cs
+++ b/Tsi1.Api/Tsi1.BusinessLayer/Services/EmailService.cs
@@ -29,14 +29,16 @@ namespace Tsi1.BusinessLayer.Services
 
             message.Sender = MailboxAddress.Parse(_mailSettings.Mail);
 
-            var client = new SmtpClient();
-            client.CheckCertificateRevocation = false;
+            var client = new SmtpClient
+            {
+                CheckCertificateRevocation = false
+            };
 
             try
             {
                 await client.ConnectAsync(_mailSettings.Host, _mailSettings.Port, SecureSocketOptions.StartTls);
             }
-            catch (Exception e)
+            catch (Exception)
             {
                 result.HasError = true;
                 result.Message = ErrorMessages.CannotConnectToSmtpServer;
diff --git a/Tsi1.Api/Tsi1.BusinessLayer/Services/SectionItemService.cs b/Tsi1.Api/Tsi1.BusinessLayer/Services/SectionItemService.cs
index ae0eedca11130f202ca5cc31688ea5725eea6525..70142c455cccf76b1996d8440e986b7231024b61 100644
--- a/Tsi1.Api/Tsi1.BusinessLayer/Services/SectionItemService.cs
+++ b/Tsi1.Api/Tsi1.BusinessLayer/Services/SectionItemService.cs
@@ -27,17 +27,24 @@ namespace Tsi1.BusinessLayer.Services
             _fileService = fileService;
         }
 
-        public async Task<ServiceResult<bool>> Create(SectionItemCreateDto newSectionItem)
+        public async Task<ServiceResult<bool>> Create(SectionItemCreateDto newSectionItem, int tenantId)
         {
             var sectionItem = _mapper.Map<SectionItem>(newSectionItem);
 
-            var result = await this.SectionItemValidations(sectionItem);
+            var sectionItemType = await _context.SectionItemTypes
+                .FirstOrDefaultAsync(x => x.Id == sectionItem.SectionItemTypeId);
+
+            var result = this.SectionItemValidations(sectionItem, sectionItemType);
 
             if (result.HasError)
             {
                 return result;
             }
 
+            if (sectionItemType.Name == SectionItemTypes.Survey)
+            {
+                sectionItem.Survey.Tenant.Id = tenantId;
+            }
             _context.SectionItems.Add(sectionItem);
             await _context.SaveChangesAsync();
 
@@ -100,13 +107,10 @@ namespace Tsi1.BusinessLayer.Services
             return result;
         }
 
-        private async Task<ServiceResult<bool>> SectionItemValidations(SectionItem sectionItem)
+        private ServiceResult<bool> SectionItemValidations(SectionItem sectionItem, SectionItemType sectionItemType)
         {
             var result = new ServiceResult<bool>();
-
-            var sectionItemType = await _context.SectionItemTypes
-                .FirstOrDefaultAsync(x => x.Id == sectionItem.SectionItemTypeId);
-
+         
             if (sectionItemType == null)
             {
                 result.HasError = true;
@@ -122,7 +126,7 @@ namespace Tsi1.BusinessLayer.Services
                     result.AddMessage(ErrorMessages.ForumIsNull);
                 }
 
-                if (sectionItem.File != null)
+                if (sectionItem.File != null || sectionItem.Survey != null)
                 {
                     result.HasError = true;
                     result.AddMessage(string.Format(ErrorMessages.InvalidSectionItemData, sectionItemType.Name, SectionItemTypes.File));
@@ -137,7 +141,7 @@ namespace Tsi1.BusinessLayer.Services
                     result.AddMessage(ErrorMessages.FileIsNull);
                 }
 
-                if (sectionItem.Forum != null)
+                if (sectionItem.Forum != null || sectionItem.Survey != null)
                 {
                     result.HasError = true;
                     result.AddMessage(string.Format(ErrorMessages.InvalidSectionItemData, sectionItemType.Name, SectionItemTypes.Forum));
@@ -150,6 +154,21 @@ namespace Tsi1.BusinessLayer.Services
                 }
             }
 
+            if (sectionItemType.Name == SectionItemTypes.Survey)
+            {
+                if (sectionItem.Survey == null)
+                {
+                    result.HasError = true;
+                    result.AddMessage(ErrorMessages.SurveyIsNull);
+                }
+
+                if (sectionItem.File != null || sectionItem.Forum != null)
+                {
+                    result.HasError = true;
+                    result.AddMessage(string.Format(ErrorMessages.InvalidSectionItemData, sectionItemType.Name, SectionItemTypes.File));
+                }
+            }
+
             return result;
         }
     }
diff --git a/Tsi1.Api/Tsi1.BusinessLayer/Services/SurveyService.cs b/Tsi1.Api/Tsi1.BusinessLayer/Services/SurveyService.cs
new file mode 100644
index 0000000000000000000000000000000000000000..51beed6b69060913983701c8c88f8b1889fc5e1e
--- /dev/null
+++ b/Tsi1.Api/Tsi1.BusinessLayer/Services/SurveyService.cs
@@ -0,0 +1,210 @@
+using AutoMapper;
+using Microsoft.EntityFrameworkCore;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using Tsi1.BusinessLayer.Dtos;
+using Tsi1.BusinessLayer.Helpers;
+using Tsi1.BusinessLayer.Interfaces;
+using Tsi1.DataLayer;
+using Tsi1.DataLayer.Entities;
+
+namespace Tsi1.BusinessLayer.Services
+{
+    public class SurveyService : ISurveyService
+    {
+        private readonly Tsi1Context _context;
+        private readonly IMapper _mapper;
+
+        public SurveyService(Tsi1Context context, IMapper mapper)
+        {
+            _context = context;
+            _mapper = mapper;
+        }
+
+        public async Task<ServiceResult<bool>> CreateGlobalSurvey(SurveyCreateDto newSurvey, int tenantId)
+        {
+            var result = new ServiceResult<bool>();
+
+            var tenant = await _context.Tenants.FirstOrDefaultAsync(x => x.Id == tenantId);
+
+            if (tenant == null)
+            {
+                result.HasError = true;
+                result.AddMessage(string.Format(ErrorMessages.TenantDoesNotExist, tenantId));
+                return result;
+            }
+
+            var survey = _mapper.Map<Survey>(newSurvey);
+
+            if (!survey.SurveyQuestions.Any())
+            {
+                result.HasError = true;
+                result.AddMessage(ErrorMessages.SurveyHasNoQuestions);
+                return result;
+            }
+
+            survey.Tenant = tenant;
+            _context.Surveys.Add(survey);
+            
+            await _context.SaveChangesAsync();
+
+            return result;
+        }
+
+        public async Task<ServiceResult<bool>> DeleteGlobalSurvey(int surveyId, string userType, int tenantId)
+        {
+            var result = new ServiceResult<bool>();
+
+            var survey = await _context.Surveys
+                .Include(x => x.Tenant)
+                .FirstOrDefaultAsync(x => x.Id == surveyId);
+
+            if (survey == null)
+            {
+                result.HasError = true;
+                result.AddMessage(string.Format(ErrorMessages.SurveyDoesNotExist, surveyId));
+                return result;
+            }
+
+            if (userType == UserTypes.FacultyAdmin && survey.Tenant.Id != tenantId)
+            {
+                result.HasError = true;
+                result.AddMessage("No se puede borrar una encuesta de otra facultad");
+                return result;
+            }
+
+            _context.Surveys.Remove(survey);
+          
+            await _context.SaveChangesAsync();
+
+            return result;
+        }
+
+        public async Task<ServiceResult<List<SurveyPreviewDto>>> GetAllGlobalSurveys(int tenantId, string userType)
+        {
+            var result = new ServiceResult<List<SurveyPreviewDto>>();
+
+            var tenant = await _context.Tenants.FirstOrDefaultAsync(x => x.Id == tenantId);
+            var tenantAdmin = await _context.Tenants.FirstOrDefaultAsync(x => x.Name == TenantAdmin.Name);
+
+            if (tenant == null || userType == UserTypes.UdelarAdmin && tenantAdmin.Id == tenantId)
+            {
+                result.HasError = true;
+                result.AddMessage(string.Format(ErrorMessages.TenantDoesNotExist, tenantId));
+                return result;
+            }
+
+            var surveys = await _context.Surveys
+                .Include(x => x.Tenant)
+                .Where(x => x.IsGlobal && x.Tenant.Id == tenantId)
+                .ToListAsync();
+
+            result.Data = _mapper.Map<List<SurveyPreviewDto>>(surveys);
+
+            return result;
+        }
+
+        public async Task<ServiceResult<SurveyDetailDto>> GetMySurvey(int surveyId, int userId)
+        {
+            var result = new ServiceResult<SurveyDetailDto>();
+
+            var survey = await _context.Surveys
+                .Include(x => x.SurveyQuestions)
+                .FirstOrDefaultAsync(x => x.Id == surveyId);
+        
+            if (survey == null)
+            {
+                result.HasError = true;
+                result.AddMessage(string.Format(ErrorMessages.SurveyDoesNotExist, surveyId));
+                return result;
+            }
+
+            var surveyResponse = await _context.SurveyResponses
+                .Include(x => x.SurveyAnswers)
+                .FirstOrDefaultAsync(x => x.SurveyId == surveyId && x.UserId == userId);
+
+            var surveyResponseDto = _mapper.Map<SurveyResponseDetailDto>(surveyResponse);
+            var surveyDto = _mapper.Map<SurveyDetailDto>(survey);
+            surveyDto.SurveyResponse = surveyResponseDto;
+
+            result.Data = surveyDto;
+            return result;
+        }
+
+        public async Task<ServiceResult<bool>> Complete(SurveyResponseCreateDto surveyResponse)
+        {
+            var result = new ServiceResult<bool>();
+
+            var survey = await _context.Surveys
+                .FirstOrDefaultAsync(x => x.Id == surveyResponse.SurveyId);
+
+            if (survey == null)
+            {
+                result.HasError = true;
+                result.AddMessage(string.Format(ErrorMessages.SurveyDoesNotExist, surveyResponse.SurveyId));
+                return result;
+            }
+
+            var existingSurveyResponse = await _context.SurveyResponses
+                .Include(x => x.SurveyAnswers)
+                .FirstOrDefaultAsync(x => x.SurveyId == surveyResponse.SurveyId && x.UserId == surveyResponse.UserId);
+
+            if (existingSurveyResponse != null)
+            {
+                result.HasError = true;
+                result.AddMessage(string.Format(ErrorMessages.SurveyResponseAlreadyExist, surveyResponse.UserId, surveyResponse.SurveyId));
+                return result;
+            }
+
+            var newSurveyResponse = _mapper.Map<SurveyResponse>(surveyResponse);
+            _context.Add(newSurveyResponse);
+            
+
+            await _context.SaveChangesAsync();
+
+            return result;
+        }
+
+        public async Task<ServiceResult<List<SurveyResponseDetailDto>>> GetAllResponses(int surveyId, string userType, int tenantId)
+        {
+            var result = new ServiceResult<List<SurveyResponseDetailDto>>();
+
+            var tenant = await _context.Tenants.FirstOrDefaultAsync(x => x.Id == tenantId);
+
+            if (tenant == null)
+            {
+                result.HasError = true;
+                result.AddMessage(string.Format(ErrorMessages.TenantDoesNotExist, tenantId));
+                return result;
+            }
+
+            var survey = await _context.Surveys.FirstOrDefaultAsync(x => x.Id == surveyId);
+
+            if (survey == null)
+            {
+                result.HasError = true;
+                result.AddMessage(string.Format(ErrorMessages.SurveyDoesNotExist, surveyId));
+                return result;
+            }
+
+            if (userType == UserTypes.Professor)
+            {
+                result.HasError = true;
+                result.AddMessage(string.Format(ErrorMessages.InvalidSurvey, surveyId));
+                return result;
+            }
+
+            var surveyResponses = await _context.SurveyResponses
+                .Include(x => x.SurveyAnswers)
+                .Where(x => x.SurveyId == surveyId)
+                .ToListAsync();
+
+            result.Data = _mapper.Map<List<SurveyResponseDetailDto>>(surveyResponses);
+
+            return result;
+        }
+    }
+}
diff --git a/Tsi1.Api/Tsi1.DataLayer/Entities/AnswerOption.cs b/Tsi1.Api/Tsi1.DataLayer/Entities/AnswerOption.cs
new file mode 100644
index 0000000000000000000000000000000000000000..bf05fa1f904e6cabe57457c029ec4b82c923924c
--- /dev/null
+++ b/Tsi1.Api/Tsi1.DataLayer/Entities/AnswerOption.cs
@@ -0,0 +1,19 @@
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace Tsi1.DataLayer.Entities
+{
+    public class AnswerOption
+    {
+        public AnswerOption()
+        {
+            SurveyAnswers = new HashSet<SurveyAnswer>();
+        }
+
+        public int Id { get; set; }
+        public string Name { get; set; }
+
+        public ICollection<SurveyAnswer> SurveyAnswers { get; set; }
+    }
+}
diff --git a/Tsi1.Api/Tsi1.DataLayer/Entities/SectionItem.cs b/Tsi1.Api/Tsi1.DataLayer/Entities/SectionItem.cs
index 3bd1ea22fc82fb58c6cc1015adeeae598bc64c67..f42b25859f23d392b954868de6e9059b5cc3356b 100644
--- a/Tsi1.Api/Tsi1.DataLayer/Entities/SectionItem.cs
+++ b/Tsi1.Api/Tsi1.DataLayer/Entities/SectionItem.cs
@@ -13,9 +13,13 @@ namespace Tsi1.DataLayer.Entities
         public int? ForumId { get; set; }
         public int? FileId { get; set; }
 
+        public int? SurveyId { get; set; }
+
         public Section Section { get; set; }
         public SectionItemType SectionItemType { get; set; }
         public Forum Forum { get; set; }
         public File File { get; set; }
+
+        public Survey Survey { get; set; }
     }
 }
diff --git a/Tsi1.Api/Tsi1.DataLayer/Entities/Survey.cs b/Tsi1.Api/Tsi1.DataLayer/Entities/Survey.cs
new file mode 100644
index 0000000000000000000000000000000000000000..8ab2b1100066d5ad5258fa248871548fa573fd4c
--- /dev/null
+++ b/Tsi1.Api/Tsi1.DataLayer/Entities/Survey.cs
@@ -0,0 +1,24 @@
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace Tsi1.DataLayer.Entities
+{
+    public class Survey
+    {
+        public Survey()
+        {
+            SurveyQuestions = new HashSet<SurveyQuestion>();
+            SurveyResponses = new HashSet<SurveyResponse>();
+        }
+        public int Id { get; set; }
+        public string Name { get; set; }
+        public bool IsGlobal { get; set; }
+
+        public SectionItem SectionItem { get; set; }
+        public Tenant Tenant { get; set; }
+
+        public ICollection<SurveyQuestion> SurveyQuestions { get; set; }
+        public ICollection<SurveyResponse> SurveyResponses { get; set; }
+    }
+}
diff --git a/Tsi1.Api/Tsi1.DataLayer/Entities/SurveyAnswer.cs b/Tsi1.Api/Tsi1.DataLayer/Entities/SurveyAnswer.cs
new file mode 100644
index 0000000000000000000000000000000000000000..f7d573bd0fd37a269d4d18d7fe17695f2684d39a
--- /dev/null
+++ b/Tsi1.Api/Tsi1.DataLayer/Entities/SurveyAnswer.cs
@@ -0,0 +1,18 @@
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace Tsi1.DataLayer.Entities
+{
+    public class SurveyAnswer
+    {
+        public int Id { get; set; }
+        public int AnswerOptionId { get; set; }
+        public int SurveyResponseId { get; set; }
+        public int SurveyQuestionId { get; set; }
+
+        public AnswerOption AnswerOption { get; set; }
+        public SurveyResponse SurveyResponse { get; set; }
+        public SurveyQuestion SurveyQuestion { get; set; }
+    }
+}
diff --git a/Tsi1.Api/Tsi1.DataLayer/Entities/SurveyQuestion.cs b/Tsi1.Api/Tsi1.DataLayer/Entities/SurveyQuestion.cs
new file mode 100644
index 0000000000000000000000000000000000000000..32769392e5a21636f11181be36fe3c3da4815045
--- /dev/null
+++ b/Tsi1.Api/Tsi1.DataLayer/Entities/SurveyQuestion.cs
@@ -0,0 +1,22 @@
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace Tsi1.DataLayer.Entities
+{
+    public class SurveyQuestion
+    {
+        public SurveyQuestion()
+        {
+            SurveyAnswers = new HashSet<SurveyAnswer>();
+        }
+
+        public int Id { get; set; }
+        public string Question { get; set; }
+        public int SurveyId { get; set; }
+        public Survey Survey { get; set; }
+
+        public ICollection<SurveyAnswer> SurveyAnswers { get; set; }
+
+    }
+}
diff --git a/Tsi1.Api/Tsi1.DataLayer/Entities/SurveyResponse.cs b/Tsi1.Api/Tsi1.DataLayer/Entities/SurveyResponse.cs
new file mode 100644
index 0000000000000000000000000000000000000000..c5af9e970ca490d625d4cc482c9dd3716172fef7
--- /dev/null
+++ b/Tsi1.Api/Tsi1.DataLayer/Entities/SurveyResponse.cs
@@ -0,0 +1,22 @@
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace Tsi1.DataLayer.Entities
+{
+    public class SurveyResponse
+    {
+        public SurveyResponse()
+        {
+            SurveyAnswers = new HashSet<SurveyAnswer>();
+        }
+
+        public int Id { get; set; }
+        public int UserId { get; set; }        
+        public int SurveyId { get; set; }
+
+        public User User { get; set; }
+        public Survey Survey { get; set; }
+        public ICollection<SurveyAnswer> SurveyAnswers { get; set; }
+    }
+}
diff --git a/Tsi1.Api/Tsi1.DataLayer/Entities/Tenant.cs b/Tsi1.Api/Tsi1.DataLayer/Entities/Tenant.cs
index ce807be9044482303da464874681b0f0b4814d67..0a153f83884dc7a09793b79647cb6dc174309b54 100644
--- a/Tsi1.Api/Tsi1.DataLayer/Entities/Tenant.cs
+++ b/Tsi1.Api/Tsi1.DataLayer/Entities/Tenant.cs
@@ -12,6 +12,7 @@ namespace Tsi1.DataLayer.Entities
             Professors = new HashSet<Professor>();
             Students = new HashSet<Student>();
             Users = new HashSet<User>();
+            Surveys = new HashSet<Survey>();
         }
 
         public int Id { get; set; }
@@ -22,5 +23,6 @@ namespace Tsi1.DataLayer.Entities
         public ICollection<Professor> Professors { get; set; }
         public ICollection<Student> Students { get; set; }
         public ICollection<User> Users { get; set; }
+        public ICollection<Survey> Surveys { get; set; }
     }
 }
diff --git a/Tsi1.Api/Tsi1.DataLayer/Entities/User.cs b/Tsi1.Api/Tsi1.DataLayer/Entities/User.cs
index a62c4662edc5a781040ab78d454b33875ebb76d3..e3656322faa236d10a84b18c1fc4985cb240280d 100644
--- a/Tsi1.Api/Tsi1.DataLayer/Entities/User.cs
+++ b/Tsi1.Api/Tsi1.DataLayer/Entities/User.cs
@@ -11,6 +11,7 @@ namespace Tsi1.DataLayer.Entities
             Posts = new HashSet<Post>();
             PostMessages = new HashSet<PostMessage>();
             ForumUsers = new HashSet<ForumUser>();
+            SurveyResponses = new HashSet<SurveyResponse>();
         }
 
         public int Id { get; set; }
@@ -41,5 +42,6 @@ namespace Tsi1.DataLayer.Entities
         public ICollection<Post> Posts { get; set; }
         public ICollection<PostMessage> PostMessages { get; set; }
         public ICollection<ForumUser> ForumUsers { get; set; }
+        public ICollection<SurveyResponse> SurveyResponses { get; set; }
     }
 }
diff --git a/Tsi1.Api/Tsi1.DataLayer/EntityConfiguration/AnswerOptionConfiguration.cs b/Tsi1.Api/Tsi1.DataLayer/EntityConfiguration/AnswerOptionConfiguration.cs
new file mode 100644
index 0000000000000000000000000000000000000000..e0ef2bbf59cffa846bf1e88b7e343da1c55a78ee
--- /dev/null
+++ b/Tsi1.Api/Tsi1.DataLayer/EntityConfiguration/AnswerOptionConfiguration.cs
@@ -0,0 +1,23 @@
+using Microsoft.EntityFrameworkCore;
+using Microsoft.EntityFrameworkCore.Metadata.Builders;
+using System;
+using System.Collections.Generic;
+using System.Text;
+using Tsi1.DataLayer.Entities;
+
+namespace Tsi1.DataLayer.EntityConfiguration
+{
+    public class AnswerOptionConfiguration : IEntityTypeConfiguration<AnswerOption>
+    {
+        public void Configure(EntityTypeBuilder<AnswerOption> builder)
+        {
+            builder.HasKey(x => x.Id);
+
+            builder.HasIndex(x => x.Name);
+
+            builder.Property(x => x.Name)
+                .IsRequired()
+                .HasColumnType("character varying(100)");
+        }
+    }
+}
diff --git a/Tsi1.Api/Tsi1.DataLayer/EntityConfiguration/SectionItemConfiguration.cs b/Tsi1.Api/Tsi1.DataLayer/EntityConfiguration/SectionItemConfiguration.cs
index ffcda8dfd6c0f26718219dd2e30e04fcd6a1db81..592b44415b20ebc4ec13287c82e07a252ded9b92 100644
--- a/Tsi1.Api/Tsi1.DataLayer/EntityConfiguration/SectionItemConfiguration.cs
+++ b/Tsi1.Api/Tsi1.DataLayer/EntityConfiguration/SectionItemConfiguration.cs
@@ -31,6 +31,10 @@ namespace Tsi1.DataLayer.EntityConfiguration
             builder.HasOne(x => x.Section)
                 .WithMany(x => x.SectionItems)
                 .HasForeignKey(x => x.SectionId);
+
+            builder.HasOne(x => x.Survey)
+                .WithOne(x => x.SectionItem)
+                .HasForeignKey<SectionItem>(x => x.SurveyId);
         }
     }
 }
diff --git a/Tsi1.Api/Tsi1.DataLayer/EntityConfiguration/SurveyAnswerConfiguration.cs b/Tsi1.Api/Tsi1.DataLayer/EntityConfiguration/SurveyAnswerConfiguration.cs
new file mode 100644
index 0000000000000000000000000000000000000000..8b4f6739f8a13c3590f6494ff8a177441b95ef94
--- /dev/null
+++ b/Tsi1.Api/Tsi1.DataLayer/EntityConfiguration/SurveyAnswerConfiguration.cs
@@ -0,0 +1,29 @@
+using Microsoft.EntityFrameworkCore;
+using Microsoft.EntityFrameworkCore.Metadata.Builders;
+using System;
+using System.Collections.Generic;
+using System.Text;
+using Tsi1.DataLayer.Entities;
+
+namespace Tsi1.DataLayer.EntityConfiguration
+{
+    public class SurveyAnswerConfiguration : IEntityTypeConfiguration<SurveyAnswer>
+    {
+        public void Configure(EntityTypeBuilder<SurveyAnswer> builder)
+        {
+            builder.HasKey(x => x.Id);
+
+            builder.HasOne(x => x.AnswerOption)
+                .WithMany(x => x.SurveyAnswers)
+                .HasForeignKey(x => x.AnswerOptionId);
+
+            builder.HasOne(x => x.SurveyResponse)
+                .WithMany(x => x.SurveyAnswers)
+                .HasForeignKey(x => x.SurveyResponseId);
+
+            builder.HasOne(x => x.SurveyQuestion)
+                .WithMany(x => x.SurveyAnswers)
+                .HasForeignKey(x => x.SurveyQuestionId);
+        }
+    }
+}
diff --git a/Tsi1.Api/Tsi1.DataLayer/EntityConfiguration/SurveyConfiguration.cs b/Tsi1.Api/Tsi1.DataLayer/EntityConfiguration/SurveyConfiguration.cs
new file mode 100644
index 0000000000000000000000000000000000000000..2340c231d7dab274d9eb31e35b44346483330008
--- /dev/null
+++ b/Tsi1.Api/Tsi1.DataLayer/EntityConfiguration/SurveyConfiguration.cs
@@ -0,0 +1,24 @@
+using Microsoft.EntityFrameworkCore;
+using Microsoft.EntityFrameworkCore.Metadata.Builders;
+using System;
+using System.Collections.Generic;
+using System.Text;
+using Tsi1.DataLayer.Entities;
+
+namespace Tsi1.DataLayer.EntityConfiguration
+{
+    public class SurveyConfiguration : IEntityTypeConfiguration<Survey>
+    {
+        public void Configure(EntityTypeBuilder<Survey> builder)
+        {
+            builder.HasKey(x => x.Id);
+
+            builder.HasIndex(x => x.Name);
+
+            builder.Property(x => x.Name)
+                .IsRequired()
+                .HasColumnType("character varying(255)");
+
+        }
+    }
+}
diff --git a/Tsi1.Api/Tsi1.DataLayer/EntityConfiguration/SurveyQuestionConfiguration.cs b/Tsi1.Api/Tsi1.DataLayer/EntityConfiguration/SurveyQuestionConfiguration.cs
new file mode 100644
index 0000000000000000000000000000000000000000..34fc8b49ae3de6e20a421fb47adc8fecdef054e1
--- /dev/null
+++ b/Tsi1.Api/Tsi1.DataLayer/EntityConfiguration/SurveyQuestionConfiguration.cs
@@ -0,0 +1,25 @@
+using Microsoft.EntityFrameworkCore;
+using Microsoft.EntityFrameworkCore.Metadata.Builders;
+using System;
+using System.Collections.Generic;
+using System.Text;
+using Tsi1.DataLayer.Entities;
+
+namespace Tsi1.DataLayer.EntityConfiguration
+{
+    public class SurveyQuestionConfiguration : IEntityTypeConfiguration<SurveyQuestion>
+    {
+        public void Configure(EntityTypeBuilder<SurveyQuestion> builder)
+        {
+            builder.HasKey(x => x.Id);
+
+            builder.Property(x => x.Question)
+                .IsRequired()
+                .HasColumnType("character varying(255)");
+
+            builder.HasOne(x => x.Survey)
+                .WithMany(x => x.SurveyQuestions)
+                .HasForeignKey(x => x.SurveyId);
+        }
+    }
+}
diff --git a/Tsi1.Api/Tsi1.DataLayer/EntityConfiguration/SurveyResponseConfiguration.cs b/Tsi1.Api/Tsi1.DataLayer/EntityConfiguration/SurveyResponseConfiguration.cs
new file mode 100644
index 0000000000000000000000000000000000000000..b9ad0c750d5acff46cb6dbffd5b95f9c78d343f8
--- /dev/null
+++ b/Tsi1.Api/Tsi1.DataLayer/EntityConfiguration/SurveyResponseConfiguration.cs
@@ -0,0 +1,25 @@
+using Microsoft.EntityFrameworkCore;
+using Microsoft.EntityFrameworkCore.Metadata.Builders;
+using System;
+using System.Collections.Generic;
+using System.Text;
+using Tsi1.DataLayer.Entities;
+
+namespace Tsi1.DataLayer.EntityConfiguration
+{
+    public class SurveyResponseConfiguration : IEntityTypeConfiguration<SurveyResponse>
+    {
+        public void Configure(EntityTypeBuilder<SurveyResponse> builder)
+        {
+            builder.HasKey(x => x.Id);
+
+            builder.HasOne(x => x.User)
+                .WithMany(x => x.SurveyResponses)
+                .HasForeignKey(x => x.UserId);
+
+            builder.HasOne(x => x.Survey)
+                .WithMany(x => x.SurveyResponses)
+                .HasForeignKey(x => x.SurveyId);
+        }
+    }
+}
diff --git a/Tsi1.Api/Tsi1.DataLayer/Migrations/20201108233000_add-survey-entities.Designer.cs b/Tsi1.Api/Tsi1.DataLayer/Migrations/20201108233000_add-survey-entities.Designer.cs
new file mode 100644
index 0000000000000000000000000000000000000000..8e3d4e0be10bfcc9a7f8e9e7429ae05f8022d492
--- /dev/null
+++ b/Tsi1.Api/Tsi1.DataLayer/Migrations/20201108233000_add-survey-entities.Designer.cs
@@ -0,0 +1,786 @@
+// <auto-generated />
+using System;
+using Microsoft.EntityFrameworkCore;
+using Microsoft.EntityFrameworkCore.Infrastructure;
+using Microsoft.EntityFrameworkCore.Migrations;
+using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
+using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata;
+using Tsi1.DataLayer;
+
+namespace Tsi1.DataLayer.Migrations
+{
+    [DbContext(typeof(Tsi1Context))]
+    [Migration("20201108233000_add-survey-entities")]
+    partial class addsurveyentities
+    {
+        protected override void BuildTargetModel(ModelBuilder modelBuilder)
+        {
+#pragma warning disable 612, 618
+            modelBuilder
+                .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn)
+                .HasAnnotation("ProductVersion", "3.1.4")
+                .HasAnnotation("Relational:MaxIdentifierLength", 63);
+
+            modelBuilder.Entity("Tsi1.DataLayer.Entities.AnswerOption", b =>
+                {
+                    b.Property<int>("Id")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("integer")
+                        .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn);
+
+                    b.Property<string>("Name")
+                        .IsRequired()
+                        .HasColumnType("character varying(100)");
+
+                    b.HasKey("Id");
+
+                    b.HasIndex("Name");
+
+                    b.ToTable("AnswerOptions");
+                });
+
+            modelBuilder.Entity("Tsi1.DataLayer.Entities.Connection", b =>
+                {
+                    b.Property<string>("ConnectionId")
+                        .HasColumnType("text");
+
+                    b.Property<string>("GroupName")
+                        .HasColumnType("text");
+
+                    b.Property<int>("UserId")
+                        .HasColumnType("integer");
+
+                    b.HasKey("ConnectionId");
+
+                    b.HasIndex("GroupName");
+
+                    b.ToTable("Connections");
+                });
+
+            modelBuilder.Entity("Tsi1.DataLayer.Entities.Course", b =>
+                {
+                    b.Property<int>("Id")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("integer")
+                        .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn);
+
+                    b.Property<string>("Name")
+                        .IsRequired()
+                        .HasColumnType("character varying(50)");
+
+                    b.Property<int>("TenantId")
+                        .HasColumnType("integer");
+
+                    b.HasKey("Id");
+
+                    b.HasIndex("TenantId");
+
+                    b.HasIndex("Name", "TenantId")
+                        .IsUnique();
+
+                    b.ToTable("Courses");
+                });
+
+            modelBuilder.Entity("Tsi1.DataLayer.Entities.File", b =>
+                {
+                    b.Property<int>("Id")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("integer")
+                        .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn);
+
+                    b.Property<string>("Name")
+                        .IsRequired()
+                        .HasColumnType("character varying(50)");
+
+                    b.Property<string>("Path")
+                        .IsRequired()
+                        .HasColumnType("character varying(1000)");
+
+                    b.HasKey("Id");
+
+                    b.HasIndex("Path")
+                        .IsUnique();
+
+                    b.ToTable("Files");
+                });
+
+            modelBuilder.Entity("Tsi1.DataLayer.Entities.Forum", b =>
+                {
+                    b.Property<int>("Id")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("integer")
+                        .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn);
+
+                    b.Property<string>("Name")
+                        .IsRequired()
+                        .HasColumnType("character varying(50)");
+
+                    b.HasKey("Id");
+
+                    b.ToTable("Forums");
+                });
+
+            modelBuilder.Entity("Tsi1.DataLayer.Entities.ForumUser", b =>
+                {
+                    b.Property<int>("ForumId")
+                        .HasColumnType("integer");
+
+                    b.Property<int>("UserId")
+                        .HasColumnType("integer");
+
+                    b.HasKey("ForumId", "UserId");
+
+                    b.HasIndex("UserId");
+
+                    b.ToTable("ForumUsers");
+                });
+
+            modelBuilder.Entity("Tsi1.DataLayer.Entities.Group", b =>
+                {
+                    b.Property<string>("Name")
+                        .HasColumnType("text");
+
+                    b.HasKey("Name");
+
+                    b.ToTable("Groups");
+                });
+
+            modelBuilder.Entity("Tsi1.DataLayer.Entities.Post", b =>
+                {
+                    b.Property<int>("Id")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("integer")
+                        .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn);
+
+                    b.Property<DateTime>("Date")
+                        .HasColumnType("timestamp without time zone");
+
+                    b.Property<int>("ForumId")
+                        .HasColumnType("integer");
+
+                    b.Property<string>("Title")
+                        .IsRequired()
+                        .HasColumnType("character varying(100)");
+
+                    b.Property<int>("UserId")
+                        .HasColumnType("integer");
+
+                    b.HasKey("Id");
+
+                    b.HasIndex("UserId");
+
+                    b.HasIndex("ForumId", "Title")
+                        .IsUnique();
+
+                    b.ToTable("Posts");
+                });
+
+            modelBuilder.Entity("Tsi1.DataLayer.Entities.PostMessage", b =>
+                {
+                    b.Property<int>("Id")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("integer")
+                        .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn);
+
+                    b.Property<string>("Content")
+                        .IsRequired()
+                        .HasColumnType("character varying(10485760)");
+
+                    b.Property<DateTime>("Date")
+                        .HasColumnType("timestamp without time zone");
+
+                    b.Property<int>("PostId")
+                        .HasColumnType("integer");
+
+                    b.Property<int>("UserId")
+                        .HasColumnType("integer");
+
+                    b.HasKey("Id");
+
+                    b.HasIndex("PostId");
+
+                    b.HasIndex("UserId");
+
+                    b.ToTable("PostMessages");
+                });
+
+            modelBuilder.Entity("Tsi1.DataLayer.Entities.Professor", b =>
+                {
+                    b.Property<int>("Id")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("integer")
+                        .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn);
+
+                    b.Property<string>("IdentityCard")
+                        .IsRequired()
+                        .HasColumnType("character varying(50)");
+
+                    b.Property<int>("TenantId")
+                        .HasColumnType("integer");
+
+                    b.HasKey("Id");
+
+                    b.HasIndex("TenantId");
+
+                    b.HasIndex("IdentityCard", "TenantId")
+                        .IsUnique();
+
+                    b.ToTable("Professors");
+                });
+
+            modelBuilder.Entity("Tsi1.DataLayer.Entities.ProfessorCourse", b =>
+                {
+                    b.Property<int>("ProfessorId")
+                        .HasColumnType("integer");
+
+                    b.Property<int>("CourseId")
+                        .HasColumnType("integer");
+
+                    b.HasKey("ProfessorId", "CourseId");
+
+                    b.HasIndex("CourseId");
+
+                    b.ToTable("ProfessorCourses");
+                });
+
+            modelBuilder.Entity("Tsi1.DataLayer.Entities.Section", b =>
+                {
+                    b.Property<int>("Id")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("integer")
+                        .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn);
+
+                    b.Property<int>("CourseId")
+                        .HasColumnType("integer");
+
+                    b.Property<string>("Name")
+                        .IsRequired()
+                        .HasColumnType("character varying(255)");
+
+                    b.Property<int>("Order")
+                        .HasColumnType("integer");
+
+                    b.HasKey("Id");
+
+                    b.HasIndex("CourseId");
+
+                    b.ToTable("Sections");
+                });
+
+            modelBuilder.Entity("Tsi1.DataLayer.Entities.SectionItem", b =>
+                {
+                    b.Property<int>("Id")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("integer")
+                        .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn);
+
+                    b.Property<int?>("FileId")
+                        .HasColumnType("integer");
+
+                    b.Property<int?>("ForumId")
+                        .HasColumnType("integer");
+
+                    b.Property<int>("Order")
+                        .HasColumnType("integer");
+
+                    b.Property<int>("SectionId")
+                        .HasColumnType("integer");
+
+                    b.Property<int>("SectionItemTypeId")
+                        .HasColumnType("integer");
+
+                    b.Property<int?>("SurveyId")
+                        .HasColumnType("integer");
+
+                    b.HasKey("Id");
+
+                    b.HasIndex("FileId")
+                        .IsUnique();
+
+                    b.HasIndex("ForumId")
+                        .IsUnique();
+
+                    b.HasIndex("SectionId");
+
+                    b.HasIndex("SectionItemTypeId");
+
+                    b.HasIndex("SurveyId")
+                        .IsUnique();
+
+                    b.ToTable("SectionItems");
+                });
+
+            modelBuilder.Entity("Tsi1.DataLayer.Entities.SectionItemType", b =>
+                {
+                    b.Property<int>("Id")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("integer")
+                        .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn);
+
+                    b.Property<string>("Name")
+                        .IsRequired()
+                        .HasColumnType("character varying(100)");
+
+                    b.HasKey("Id");
+
+                    b.ToTable("SectionItemTypes");
+                });
+
+            modelBuilder.Entity("Tsi1.DataLayer.Entities.Student", b =>
+                {
+                    b.Property<int>("Id")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("integer")
+                        .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn);
+
+                    b.Property<int>("Age")
+                        .HasColumnType("integer");
+
+                    b.Property<string>("IdentityCard")
+                        .IsRequired()
+                        .HasColumnType("character varying(50)");
+
+                    b.Property<int>("TenantId")
+                        .HasColumnType("integer");
+
+                    b.HasKey("Id");
+
+                    b.HasIndex("TenantId");
+
+                    b.HasIndex("IdentityCard", "TenantId")
+                        .IsUnique();
+
+                    b.ToTable("Students");
+                });
+
+            modelBuilder.Entity("Tsi1.DataLayer.Entities.StudentCourse", b =>
+                {
+                    b.Property<int>("StudentId")
+                        .HasColumnType("integer");
+
+                    b.Property<int>("CourseId")
+                        .HasColumnType("integer");
+
+                    b.HasKey("StudentId", "CourseId");
+
+                    b.HasIndex("CourseId");
+
+                    b.ToTable("StudentCourses");
+                });
+
+            modelBuilder.Entity("Tsi1.DataLayer.Entities.Survey", b =>
+                {
+                    b.Property<int>("Id")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("integer")
+                        .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn);
+
+                    b.Property<bool>("IsGlobal")
+                        .HasColumnType("boolean");
+
+                    b.Property<string>("Name")
+                        .IsRequired()
+                        .HasColumnType("character varying(255)");
+
+                    b.Property<int>("TenantId")
+                        .HasColumnType("integer");
+
+                    b.HasKey("Id");
+
+                    b.HasIndex("Name");
+
+                    b.HasIndex("TenantId");
+
+                    b.ToTable("Surveys");
+                });
+
+            modelBuilder.Entity("Tsi1.DataLayer.Entities.SurveyAnswer", b =>
+                {
+                    b.Property<int>("Id")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("integer")
+                        .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn);
+
+                    b.Property<int>("AnswerOptionId")
+                        .HasColumnType("integer");
+
+                    b.Property<int>("SurveyQuestionId")
+                        .HasColumnType("integer");
+
+                    b.Property<int>("SurveyResponseId")
+                        .HasColumnType("integer");
+
+                    b.HasKey("Id");
+
+                    b.HasIndex("AnswerOptionId");
+
+                    b.HasIndex("SurveyQuestionId");
+
+                    b.HasIndex("SurveyResponseId");
+
+                    b.ToTable("SurveyAnswers");
+                });
+
+            modelBuilder.Entity("Tsi1.DataLayer.Entities.SurveyQuestion", b =>
+                {
+                    b.Property<int>("Id")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("integer")
+                        .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn);
+
+                    b.Property<string>("Question")
+                        .IsRequired()
+                        .HasColumnType("character varying(255)");
+
+                    b.Property<int>("SurveyId")
+                        .HasColumnType("integer");
+
+                    b.HasKey("Id");
+
+                    b.HasIndex("SurveyId");
+
+                    b.ToTable("SurveyQuestions");
+                });
+
+            modelBuilder.Entity("Tsi1.DataLayer.Entities.SurveyResponse", b =>
+                {
+                    b.Property<int>("Id")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("integer")
+                        .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn);
+
+                    b.Property<int>("SurveyId")
+                        .HasColumnType("integer");
+
+                    b.Property<int>("UserId")
+                        .HasColumnType("integer");
+
+                    b.HasKey("Id");
+
+                    b.HasIndex("SurveyId");
+
+                    b.HasIndex("UserId");
+
+                    b.ToTable("SurveyResponses");
+                });
+
+            modelBuilder.Entity("Tsi1.DataLayer.Entities.Tenant", b =>
+                {
+                    b.Property<int>("Id")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("integer")
+                        .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn);
+
+                    b.Property<string>("Name")
+                        .IsRequired()
+                        .HasColumnType("character varying(50)");
+
+                    b.HasKey("Id");
+
+                    b.HasIndex("Name")
+                        .IsUnique();
+
+                    b.ToTable("Tenants");
+                });
+
+            modelBuilder.Entity("Tsi1.DataLayer.Entities.User", b =>
+                {
+                    b.Property<int>("Id")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("integer")
+                        .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn);
+
+                    b.Property<string>("Email")
+                        .IsRequired()
+                        .HasColumnType("character varying(255)");
+
+                    b.Property<string>("FirstName")
+                        .IsRequired()
+                        .HasColumnType("character varying(255)");
+
+                    b.Property<string>("LastName")
+                        .IsRequired()
+                        .HasColumnType("character varying(255)");
+
+                    b.Property<string>("Password")
+                        .IsRequired()
+                        .HasColumnType("character varying(255)");
+
+                    b.Property<int?>("ProfessorId")
+                        .HasColumnType("integer");
+
+                    b.Property<int?>("StudentId")
+                        .HasColumnType("integer");
+
+                    b.Property<int>("TenantId")
+                        .HasColumnType("integer");
+
+                    b.Property<int>("UserTypeId")
+                        .HasColumnType("integer");
+
+                    b.Property<string>("Username")
+                        .IsRequired()
+                        .HasColumnType("character varying(50)");
+
+                    b.HasKey("Id");
+
+                    b.HasIndex("ProfessorId")
+                        .IsUnique();
+
+                    b.HasIndex("StudentId")
+                        .IsUnique();
+
+                    b.HasIndex("TenantId");
+
+                    b.HasIndex("UserTypeId");
+
+                    b.HasIndex("Username", "TenantId")
+                        .IsUnique();
+
+                    b.ToTable("Users");
+                });
+
+            modelBuilder.Entity("Tsi1.DataLayer.Entities.UserType", b =>
+                {
+                    b.Property<int>("Id")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("integer")
+                        .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn);
+
+                    b.Property<string>("Name")
+                        .IsRequired()
+                        .HasColumnType("character varying(50)");
+
+                    b.HasKey("Id");
+
+                    b.HasIndex("Name")
+                        .IsUnique();
+
+                    b.ToTable("UserTypes");
+                });
+
+            modelBuilder.Entity("Tsi1.DataLayer.Entities.Connection", b =>
+                {
+                    b.HasOne("Tsi1.DataLayer.Entities.Group", "Group")
+                        .WithMany("Connections")
+                        .HasForeignKey("GroupName");
+                });
+
+            modelBuilder.Entity("Tsi1.DataLayer.Entities.Course", b =>
+                {
+                    b.HasOne("Tsi1.DataLayer.Entities.Tenant", "Tenant")
+                        .WithMany("Courses")
+                        .HasForeignKey("TenantId")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+                });
+
+            modelBuilder.Entity("Tsi1.DataLayer.Entities.ForumUser", b =>
+                {
+                    b.HasOne("Tsi1.DataLayer.Entities.Forum", "Forum")
+                        .WithMany("ForumUsers")
+                        .HasForeignKey("ForumId")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.HasOne("Tsi1.DataLayer.Entities.User", "User")
+                        .WithMany("ForumUsers")
+                        .HasForeignKey("UserId")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+                });
+
+            modelBuilder.Entity("Tsi1.DataLayer.Entities.Post", b =>
+                {
+                    b.HasOne("Tsi1.DataLayer.Entities.Forum", "Forum")
+                        .WithMany("Posts")
+                        .HasForeignKey("ForumId")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.HasOne("Tsi1.DataLayer.Entities.User", "User")
+                        .WithMany("Posts")
+                        .HasForeignKey("UserId")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+                });
+
+            modelBuilder.Entity("Tsi1.DataLayer.Entities.PostMessage", b =>
+                {
+                    b.HasOne("Tsi1.DataLayer.Entities.Post", "Post")
+                        .WithMany("PostMessages")
+                        .HasForeignKey("PostId")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.HasOne("Tsi1.DataLayer.Entities.User", "User")
+                        .WithMany("PostMessages")
+                        .HasForeignKey("UserId")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+                });
+
+            modelBuilder.Entity("Tsi1.DataLayer.Entities.Professor", b =>
+                {
+                    b.HasOne("Tsi1.DataLayer.Entities.Tenant", "Tenant")
+                        .WithMany("Professors")
+                        .HasForeignKey("TenantId")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+                });
+
+            modelBuilder.Entity("Tsi1.DataLayer.Entities.ProfessorCourse", b =>
+                {
+                    b.HasOne("Tsi1.DataLayer.Entities.Course", "Course")
+                        .WithMany("ProfessorCourses")
+                        .HasForeignKey("CourseId")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.HasOne("Tsi1.DataLayer.Entities.Professor", "Professor")
+                        .WithMany("ProfessorCourses")
+                        .HasForeignKey("ProfessorId")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+                });
+
+            modelBuilder.Entity("Tsi1.DataLayer.Entities.Section", b =>
+                {
+                    b.HasOne("Tsi1.DataLayer.Entities.Course", "Course")
+                        .WithMany("Sections")
+                        .HasForeignKey("CourseId")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+                });
+
+            modelBuilder.Entity("Tsi1.DataLayer.Entities.SectionItem", b =>
+                {
+                    b.HasOne("Tsi1.DataLayer.Entities.File", "File")
+                        .WithOne("SectionItem")
+                        .HasForeignKey("Tsi1.DataLayer.Entities.SectionItem", "FileId");
+
+                    b.HasOne("Tsi1.DataLayer.Entities.Forum", "Forum")
+                        .WithOne("SectionItem")
+                        .HasForeignKey("Tsi1.DataLayer.Entities.SectionItem", "ForumId");
+
+                    b.HasOne("Tsi1.DataLayer.Entities.Section", "Section")
+                        .WithMany("SectionItems")
+                        .HasForeignKey("SectionId")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.HasOne("Tsi1.DataLayer.Entities.SectionItemType", "SectionItemType")
+                        .WithMany("SectionItems")
+                        .HasForeignKey("SectionItemTypeId")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.HasOne("Tsi1.DataLayer.Entities.Survey", "Survey")
+                        .WithOne("SectionItem")
+                        .HasForeignKey("Tsi1.DataLayer.Entities.SectionItem", "SurveyId");
+                });
+
+            modelBuilder.Entity("Tsi1.DataLayer.Entities.Student", b =>
+                {
+                    b.HasOne("Tsi1.DataLayer.Entities.Tenant", "Tenant")
+                        .WithMany("Students")
+                        .HasForeignKey("TenantId")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+                });
+
+            modelBuilder.Entity("Tsi1.DataLayer.Entities.StudentCourse", b =>
+                {
+                    b.HasOne("Tsi1.DataLayer.Entities.Course", "Course")
+                        .WithMany("StudentCourses")
+                        .HasForeignKey("CourseId")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.HasOne("Tsi1.DataLayer.Entities.Student", "Student")
+                        .WithMany("StudentCourses")
+                        .HasForeignKey("StudentId")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+                });
+
+            modelBuilder.Entity("Tsi1.DataLayer.Entities.Survey", b =>
+                {
+                    b.HasOne("Tsi1.DataLayer.Entities.Tenant", "Tenant")
+                        .WithMany("Surveys")
+                        .HasForeignKey("TenantId")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+                });
+
+            modelBuilder.Entity("Tsi1.DataLayer.Entities.SurveyAnswer", b =>
+                {
+                    b.HasOne("Tsi1.DataLayer.Entities.AnswerOption", "AnswerOption")
+                        .WithMany("SurveyAnswers")
+                        .HasForeignKey("AnswerOptionId")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.HasOne("Tsi1.DataLayer.Entities.SurveyQuestion", "SurveyQuestion")
+                        .WithMany("SurveyAnswers")
+                        .HasForeignKey("SurveyQuestionId")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.HasOne("Tsi1.DataLayer.Entities.SurveyResponse", "SurveyResponse")
+                        .WithMany("SurveyAnswers")
+                        .HasForeignKey("SurveyResponseId")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+                });
+
+            modelBuilder.Entity("Tsi1.DataLayer.Entities.SurveyQuestion", b =>
+                {
+                    b.HasOne("Tsi1.DataLayer.Entities.Survey", "Survey")
+                        .WithMany("SurveyQuestions")
+                        .HasForeignKey("SurveyId")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+                });
+
+            modelBuilder.Entity("Tsi1.DataLayer.Entities.SurveyResponse", b =>
+                {
+                    b.HasOne("Tsi1.DataLayer.Entities.Survey", "Survey")
+                        .WithMany("SurveyResponses")
+                        .HasForeignKey("SurveyId")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.HasOne("Tsi1.DataLayer.Entities.User", "User")
+                        .WithMany("SurveyResponses")
+                        .HasForeignKey("UserId")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+                });
+
+            modelBuilder.Entity("Tsi1.DataLayer.Entities.User", b =>
+                {
+                    b.HasOne("Tsi1.DataLayer.Entities.Professor", "Professor")
+                        .WithOne("User")
+                        .HasForeignKey("Tsi1.DataLayer.Entities.User", "ProfessorId");
+
+                    b.HasOne("Tsi1.DataLayer.Entities.Student", "Student")
+                        .WithOne("User")
+                        .HasForeignKey("Tsi1.DataLayer.Entities.User", "StudentId");
+
+                    b.HasOne("Tsi1.DataLayer.Entities.Tenant", "Tenant")
+                        .WithMany("Users")
+                        .HasForeignKey("TenantId")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.HasOne("Tsi1.DataLayer.Entities.UserType", "UserType")
+                        .WithMany()
+                        .HasForeignKey("UserTypeId")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+                });
+#pragma warning restore 612, 618
+        }
+    }
+}
diff --git a/Tsi1.Api/Tsi1.DataLayer/Migrations/20201108233000_add-survey-entities.cs b/Tsi1.Api/Tsi1.DataLayer/Migrations/20201108233000_add-survey-entities.cs
new file mode 100644
index 0000000000000000000000000000000000000000..9ec24a5d00e7bc9f7e894209671769346c8f6895
--- /dev/null
+++ b/Tsi1.Api/Tsi1.DataLayer/Migrations/20201108233000_add-survey-entities.cs
@@ -0,0 +1,218 @@
+using Microsoft.EntityFrameworkCore.Migrations;
+using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata;
+
+namespace Tsi1.DataLayer.Migrations
+{
+    public partial class addsurveyentities : Migration
+    {
+        protected override void Up(MigrationBuilder migrationBuilder)
+        {
+            migrationBuilder.AddColumn<int>(
+                name: "SurveyId",
+                table: "SectionItems",
+                nullable: true);
+
+            migrationBuilder.CreateTable(
+                name: "AnswerOptions",
+                columns: table => new
+                {
+                    Id = table.Column<int>(nullable: false)
+                        .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn),
+                    Name = table.Column<string>(type: "character varying(100)", nullable: false)
+                },
+                constraints: table =>
+                {
+                    table.PrimaryKey("PK_AnswerOptions", x => x.Id);
+                });
+
+            migrationBuilder.CreateTable(
+                name: "Surveys",
+                columns: table => new
+                {
+                    Id = table.Column<int>(nullable: false)
+                        .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn),
+                    Name = table.Column<string>(type: "character varying(255)", nullable: false),
+                    IsGlobal = table.Column<bool>(nullable: false),
+                    TenantId = table.Column<int>(nullable: false)
+                },
+                constraints: table =>
+                {
+                    table.PrimaryKey("PK_Surveys", x => x.Id);
+                    table.ForeignKey(
+                        name: "FK_Surveys_Tenants_TenantId",
+                        column: x => x.TenantId,
+                        principalTable: "Tenants",
+                        principalColumn: "Id",
+                        onDelete: ReferentialAction.Cascade);
+                });
+
+            migrationBuilder.CreateTable(
+                name: "SurveyQuestions",
+                columns: table => new
+                {
+                    Id = table.Column<int>(nullable: false)
+                        .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn),
+                    Question = table.Column<string>(type: "character varying(255)", nullable: false),
+                    SurveyId = table.Column<int>(nullable: false)
+                },
+                constraints: table =>
+                {
+                    table.PrimaryKey("PK_SurveyQuestions", x => x.Id);
+                    table.ForeignKey(
+                        name: "FK_SurveyQuestions_Surveys_SurveyId",
+                        column: x => x.SurveyId,
+                        principalTable: "Surveys",
+                        principalColumn: "Id",
+                        onDelete: ReferentialAction.Cascade);
+                });
+
+            migrationBuilder.CreateTable(
+                name: "SurveyResponses",
+                columns: table => new
+                {
+                    Id = table.Column<int>(nullable: false)
+                        .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn),
+                    UserId = table.Column<int>(nullable: false),
+                    SurveyId = table.Column<int>(nullable: false)
+                },
+                constraints: table =>
+                {
+                    table.PrimaryKey("PK_SurveyResponses", x => x.Id);
+                    table.ForeignKey(
+                        name: "FK_SurveyResponses_Surveys_SurveyId",
+                        column: x => x.SurveyId,
+                        principalTable: "Surveys",
+                        principalColumn: "Id",
+                        onDelete: ReferentialAction.Cascade);
+                    table.ForeignKey(
+                        name: "FK_SurveyResponses_Users_UserId",
+                        column: x => x.UserId,
+                        principalTable: "Users",
+                        principalColumn: "Id",
+                        onDelete: ReferentialAction.Cascade);
+                });
+
+            migrationBuilder.CreateTable(
+                name: "SurveyAnswers",
+                columns: table => new
+                {
+                    Id = table.Column<int>(nullable: false)
+                        .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn),
+                    AnswerOptionId = table.Column<int>(nullable: false),
+                    SurveyResponseId = table.Column<int>(nullable: false),
+                    SurveyQuestionId = table.Column<int>(nullable: false)
+                },
+                constraints: table =>
+                {
+                    table.PrimaryKey("PK_SurveyAnswers", x => x.Id);
+                    table.ForeignKey(
+                        name: "FK_SurveyAnswers_AnswerOptions_AnswerOptionId",
+                        column: x => x.AnswerOptionId,
+                        principalTable: "AnswerOptions",
+                        principalColumn: "Id",
+                        onDelete: ReferentialAction.Cascade);
+                    table.ForeignKey(
+                        name: "FK_SurveyAnswers_SurveyQuestions_SurveyQuestionId",
+                        column: x => x.SurveyQuestionId,
+                        principalTable: "SurveyQuestions",
+                        principalColumn: "Id",
+                        onDelete: ReferentialAction.Cascade);
+                    table.ForeignKey(
+                        name: "FK_SurveyAnswers_SurveyResponses_SurveyResponseId",
+                        column: x => x.SurveyResponseId,
+                        principalTable: "SurveyResponses",
+                        principalColumn: "Id",
+                        onDelete: ReferentialAction.Cascade);
+                });
+
+            migrationBuilder.CreateIndex(
+                name: "IX_SectionItems_SurveyId",
+                table: "SectionItems",
+                column: "SurveyId",
+                unique: true);
+
+            migrationBuilder.CreateIndex(
+                name: "IX_AnswerOptions_Name",
+                table: "AnswerOptions",
+                column: "Name");
+
+            migrationBuilder.CreateIndex(
+                name: "IX_SurveyAnswers_AnswerOptionId",
+                table: "SurveyAnswers",
+                column: "AnswerOptionId");
+
+            migrationBuilder.CreateIndex(
+                name: "IX_SurveyAnswers_SurveyQuestionId",
+                table: "SurveyAnswers",
+                column: "SurveyQuestionId");
+
+            migrationBuilder.CreateIndex(
+                name: "IX_SurveyAnswers_SurveyResponseId",
+                table: "SurveyAnswers",
+                column: "SurveyResponseId");
+
+            migrationBuilder.CreateIndex(
+                name: "IX_SurveyQuestions_SurveyId",
+                table: "SurveyQuestions",
+                column: "SurveyId");
+
+            migrationBuilder.CreateIndex(
+                name: "IX_SurveyResponses_SurveyId",
+                table: "SurveyResponses",
+                column: "SurveyId");
+
+            migrationBuilder.CreateIndex(
+                name: "IX_SurveyResponses_UserId",
+                table: "SurveyResponses",
+                column: "UserId");
+
+            migrationBuilder.CreateIndex(
+                name: "IX_Surveys_Name",
+                table: "Surveys",
+                column: "Name");
+
+            migrationBuilder.CreateIndex(
+                name: "IX_Surveys_TenantId",
+                table: "Surveys",
+                column: "TenantId");
+
+            migrationBuilder.AddForeignKey(
+                name: "FK_SectionItems_Surveys_SurveyId",
+                table: "SectionItems",
+                column: "SurveyId",
+                principalTable: "Surveys",
+                principalColumn: "Id",
+                onDelete: ReferentialAction.Restrict);
+        }
+
+        protected override void Down(MigrationBuilder migrationBuilder)
+        {
+            migrationBuilder.DropForeignKey(
+                name: "FK_SectionItems_Surveys_SurveyId",
+                table: "SectionItems");
+
+            migrationBuilder.DropTable(
+                name: "SurveyAnswers");
+
+            migrationBuilder.DropTable(
+                name: "AnswerOptions");
+
+            migrationBuilder.DropTable(
+                name: "SurveyQuestions");
+
+            migrationBuilder.DropTable(
+                name: "SurveyResponses");
+
+            migrationBuilder.DropTable(
+                name: "Surveys");
+
+            migrationBuilder.DropIndex(
+                name: "IX_SectionItems_SurveyId",
+                table: "SectionItems");
+
+            migrationBuilder.DropColumn(
+                name: "SurveyId",
+                table: "SectionItems");
+        }
+    }
+}
diff --git a/Tsi1.Api/Tsi1.DataLayer/Migrations/20201112225623_fix-survey.Designer.cs b/Tsi1.Api/Tsi1.DataLayer/Migrations/20201112225623_fix-survey.Designer.cs
new file mode 100644
index 0000000000000000000000000000000000000000..69b5ff244f791fa4686adf5831e99f80cfea40a8
--- /dev/null
+++ b/Tsi1.Api/Tsi1.DataLayer/Migrations/20201112225623_fix-survey.Designer.cs
@@ -0,0 +1,784 @@
+// <auto-generated />
+using System;
+using Microsoft.EntityFrameworkCore;
+using Microsoft.EntityFrameworkCore.Infrastructure;
+using Microsoft.EntityFrameworkCore.Migrations;
+using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
+using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata;
+using Tsi1.DataLayer;
+
+namespace Tsi1.DataLayer.Migrations
+{
+    [DbContext(typeof(Tsi1Context))]
+    [Migration("20201112225623_fix-survey")]
+    partial class fixsurvey
+    {
+        protected override void BuildTargetModel(ModelBuilder modelBuilder)
+        {
+#pragma warning disable 612, 618
+            modelBuilder
+                .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn)
+                .HasAnnotation("ProductVersion", "3.1.4")
+                .HasAnnotation("Relational:MaxIdentifierLength", 63);
+
+            modelBuilder.Entity("Tsi1.DataLayer.Entities.AnswerOption", b =>
+                {
+                    b.Property<int>("Id")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("integer")
+                        .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn);
+
+                    b.Property<string>("Name")
+                        .IsRequired()
+                        .HasColumnType("character varying(100)");
+
+                    b.HasKey("Id");
+
+                    b.HasIndex("Name");
+
+                    b.ToTable("AnswerOptions");
+                });
+
+            modelBuilder.Entity("Tsi1.DataLayer.Entities.Connection", b =>
+                {
+                    b.Property<string>("ConnectionId")
+                        .HasColumnType("text");
+
+                    b.Property<string>("GroupName")
+                        .HasColumnType("text");
+
+                    b.Property<int>("UserId")
+                        .HasColumnType("integer");
+
+                    b.HasKey("ConnectionId");
+
+                    b.HasIndex("GroupName");
+
+                    b.ToTable("Connections");
+                });
+
+            modelBuilder.Entity("Tsi1.DataLayer.Entities.Course", b =>
+                {
+                    b.Property<int>("Id")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("integer")
+                        .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn);
+
+                    b.Property<string>("Name")
+                        .IsRequired()
+                        .HasColumnType("character varying(50)");
+
+                    b.Property<int>("TenantId")
+                        .HasColumnType("integer");
+
+                    b.HasKey("Id");
+
+                    b.HasIndex("TenantId");
+
+                    b.HasIndex("Name", "TenantId")
+                        .IsUnique();
+
+                    b.ToTable("Courses");
+                });
+
+            modelBuilder.Entity("Tsi1.DataLayer.Entities.File", b =>
+                {
+                    b.Property<int>("Id")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("integer")
+                        .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn);
+
+                    b.Property<string>("Name")
+                        .IsRequired()
+                        .HasColumnType("character varying(50)");
+
+                    b.Property<string>("Path")
+                        .IsRequired()
+                        .HasColumnType("character varying(1000)");
+
+                    b.HasKey("Id");
+
+                    b.HasIndex("Path")
+                        .IsUnique();
+
+                    b.ToTable("Files");
+                });
+
+            modelBuilder.Entity("Tsi1.DataLayer.Entities.Forum", b =>
+                {
+                    b.Property<int>("Id")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("integer")
+                        .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn);
+
+                    b.Property<string>("Name")
+                        .IsRequired()
+                        .HasColumnType("character varying(50)");
+
+                    b.HasKey("Id");
+
+                    b.ToTable("Forums");
+                });
+
+            modelBuilder.Entity("Tsi1.DataLayer.Entities.ForumUser", b =>
+                {
+                    b.Property<int>("ForumId")
+                        .HasColumnType("integer");
+
+                    b.Property<int>("UserId")
+                        .HasColumnType("integer");
+
+                    b.HasKey("ForumId", "UserId");
+
+                    b.HasIndex("UserId");
+
+                    b.ToTable("ForumUsers");
+                });
+
+            modelBuilder.Entity("Tsi1.DataLayer.Entities.Group", b =>
+                {
+                    b.Property<string>("Name")
+                        .HasColumnType("text");
+
+                    b.HasKey("Name");
+
+                    b.ToTable("Groups");
+                });
+
+            modelBuilder.Entity("Tsi1.DataLayer.Entities.Post", b =>
+                {
+                    b.Property<int>("Id")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("integer")
+                        .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn);
+
+                    b.Property<DateTime>("Date")
+                        .HasColumnType("timestamp without time zone");
+
+                    b.Property<int>("ForumId")
+                        .HasColumnType("integer");
+
+                    b.Property<string>("Title")
+                        .IsRequired()
+                        .HasColumnType("character varying(100)");
+
+                    b.Property<int>("UserId")
+                        .HasColumnType("integer");
+
+                    b.HasKey("Id");
+
+                    b.HasIndex("UserId");
+
+                    b.HasIndex("ForumId", "Title")
+                        .IsUnique();
+
+                    b.ToTable("Posts");
+                });
+
+            modelBuilder.Entity("Tsi1.DataLayer.Entities.PostMessage", b =>
+                {
+                    b.Property<int>("Id")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("integer")
+                        .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn);
+
+                    b.Property<string>("Content")
+                        .IsRequired()
+                        .HasColumnType("character varying(10485760)");
+
+                    b.Property<DateTime>("Date")
+                        .HasColumnType("timestamp without time zone");
+
+                    b.Property<int>("PostId")
+                        .HasColumnType("integer");
+
+                    b.Property<int>("UserId")
+                        .HasColumnType("integer");
+
+                    b.HasKey("Id");
+
+                    b.HasIndex("PostId");
+
+                    b.HasIndex("UserId");
+
+                    b.ToTable("PostMessages");
+                });
+
+            modelBuilder.Entity("Tsi1.DataLayer.Entities.Professor", b =>
+                {
+                    b.Property<int>("Id")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("integer")
+                        .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn);
+
+                    b.Property<string>("IdentityCard")
+                        .IsRequired()
+                        .HasColumnType("character varying(50)");
+
+                    b.Property<int>("TenantId")
+                        .HasColumnType("integer");
+
+                    b.HasKey("Id");
+
+                    b.HasIndex("TenantId");
+
+                    b.HasIndex("IdentityCard", "TenantId")
+                        .IsUnique();
+
+                    b.ToTable("Professors");
+                });
+
+            modelBuilder.Entity("Tsi1.DataLayer.Entities.ProfessorCourse", b =>
+                {
+                    b.Property<int>("ProfessorId")
+                        .HasColumnType("integer");
+
+                    b.Property<int>("CourseId")
+                        .HasColumnType("integer");
+
+                    b.HasKey("ProfessorId", "CourseId");
+
+                    b.HasIndex("CourseId");
+
+                    b.ToTable("ProfessorCourses");
+                });
+
+            modelBuilder.Entity("Tsi1.DataLayer.Entities.Section", b =>
+                {
+                    b.Property<int>("Id")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("integer")
+                        .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn);
+
+                    b.Property<int>("CourseId")
+                        .HasColumnType("integer");
+
+                    b.Property<string>("Name")
+                        .IsRequired()
+                        .HasColumnType("character varying(255)");
+
+                    b.Property<int>("Order")
+                        .HasColumnType("integer");
+
+                    b.HasKey("Id");
+
+                    b.HasIndex("CourseId");
+
+                    b.ToTable("Sections");
+                });
+
+            modelBuilder.Entity("Tsi1.DataLayer.Entities.SectionItem", b =>
+                {
+                    b.Property<int>("Id")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("integer")
+                        .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn);
+
+                    b.Property<int?>("FileId")
+                        .HasColumnType("integer");
+
+                    b.Property<int?>("ForumId")
+                        .HasColumnType("integer");
+
+                    b.Property<int>("Order")
+                        .HasColumnType("integer");
+
+                    b.Property<int>("SectionId")
+                        .HasColumnType("integer");
+
+                    b.Property<int>("SectionItemTypeId")
+                        .HasColumnType("integer");
+
+                    b.Property<int?>("SurveyId")
+                        .HasColumnType("integer");
+
+                    b.HasKey("Id");
+
+                    b.HasIndex("FileId")
+                        .IsUnique();
+
+                    b.HasIndex("ForumId")
+                        .IsUnique();
+
+                    b.HasIndex("SectionId");
+
+                    b.HasIndex("SectionItemTypeId");
+
+                    b.HasIndex("SurveyId")
+                        .IsUnique();
+
+                    b.ToTable("SectionItems");
+                });
+
+            modelBuilder.Entity("Tsi1.DataLayer.Entities.SectionItemType", b =>
+                {
+                    b.Property<int>("Id")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("integer")
+                        .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn);
+
+                    b.Property<string>("Name")
+                        .IsRequired()
+                        .HasColumnType("character varying(100)");
+
+                    b.HasKey("Id");
+
+                    b.ToTable("SectionItemTypes");
+                });
+
+            modelBuilder.Entity("Tsi1.DataLayer.Entities.Student", b =>
+                {
+                    b.Property<int>("Id")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("integer")
+                        .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn);
+
+                    b.Property<int>("Age")
+                        .HasColumnType("integer");
+
+                    b.Property<string>("IdentityCard")
+                        .IsRequired()
+                        .HasColumnType("character varying(50)");
+
+                    b.Property<int>("TenantId")
+                        .HasColumnType("integer");
+
+                    b.HasKey("Id");
+
+                    b.HasIndex("TenantId");
+
+                    b.HasIndex("IdentityCard", "TenantId")
+                        .IsUnique();
+
+                    b.ToTable("Students");
+                });
+
+            modelBuilder.Entity("Tsi1.DataLayer.Entities.StudentCourse", b =>
+                {
+                    b.Property<int>("StudentId")
+                        .HasColumnType("integer");
+
+                    b.Property<int>("CourseId")
+                        .HasColumnType("integer");
+
+                    b.HasKey("StudentId", "CourseId");
+
+                    b.HasIndex("CourseId");
+
+                    b.ToTable("StudentCourses");
+                });
+
+            modelBuilder.Entity("Tsi1.DataLayer.Entities.Survey", b =>
+                {
+                    b.Property<int>("Id")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("integer")
+                        .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn);
+
+                    b.Property<bool>("IsGlobal")
+                        .HasColumnType("boolean");
+
+                    b.Property<string>("Name")
+                        .IsRequired()
+                        .HasColumnType("character varying(255)");
+
+                    b.Property<int?>("TenantId")
+                        .HasColumnType("integer");
+
+                    b.HasKey("Id");
+
+                    b.HasIndex("Name");
+
+                    b.HasIndex("TenantId");
+
+                    b.ToTable("Surveys");
+                });
+
+            modelBuilder.Entity("Tsi1.DataLayer.Entities.SurveyAnswer", b =>
+                {
+                    b.Property<int>("Id")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("integer")
+                        .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn);
+
+                    b.Property<int>("AnswerOptionId")
+                        .HasColumnType("integer");
+
+                    b.Property<int>("SurveyQuestionId")
+                        .HasColumnType("integer");
+
+                    b.Property<int>("SurveyResponseId")
+                        .HasColumnType("integer");
+
+                    b.HasKey("Id");
+
+                    b.HasIndex("AnswerOptionId");
+
+                    b.HasIndex("SurveyQuestionId");
+
+                    b.HasIndex("SurveyResponseId");
+
+                    b.ToTable("SurveyAnswers");
+                });
+
+            modelBuilder.Entity("Tsi1.DataLayer.Entities.SurveyQuestion", b =>
+                {
+                    b.Property<int>("Id")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("integer")
+                        .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn);
+
+                    b.Property<string>("Question")
+                        .IsRequired()
+                        .HasColumnType("character varying(255)");
+
+                    b.Property<int>("SurveyId")
+                        .HasColumnType("integer");
+
+                    b.HasKey("Id");
+
+                    b.HasIndex("SurveyId");
+
+                    b.ToTable("SurveyQuestions");
+                });
+
+            modelBuilder.Entity("Tsi1.DataLayer.Entities.SurveyResponse", b =>
+                {
+                    b.Property<int>("Id")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("integer")
+                        .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn);
+
+                    b.Property<int>("SurveyId")
+                        .HasColumnType("integer");
+
+                    b.Property<int>("UserId")
+                        .HasColumnType("integer");
+
+                    b.HasKey("Id");
+
+                    b.HasIndex("SurveyId");
+
+                    b.HasIndex("UserId");
+
+                    b.ToTable("SurveyResponses");
+                });
+
+            modelBuilder.Entity("Tsi1.DataLayer.Entities.Tenant", b =>
+                {
+                    b.Property<int>("Id")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("integer")
+                        .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn);
+
+                    b.Property<string>("Name")
+                        .IsRequired()
+                        .HasColumnType("character varying(50)");
+
+                    b.HasKey("Id");
+
+                    b.HasIndex("Name")
+                        .IsUnique();
+
+                    b.ToTable("Tenants");
+                });
+
+            modelBuilder.Entity("Tsi1.DataLayer.Entities.User", b =>
+                {
+                    b.Property<int>("Id")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("integer")
+                        .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn);
+
+                    b.Property<string>("Email")
+                        .IsRequired()
+                        .HasColumnType("character varying(255)");
+
+                    b.Property<string>("FirstName")
+                        .IsRequired()
+                        .HasColumnType("character varying(255)");
+
+                    b.Property<string>("LastName")
+                        .IsRequired()
+                        .HasColumnType("character varying(255)");
+
+                    b.Property<string>("Password")
+                        .IsRequired()
+                        .HasColumnType("character varying(255)");
+
+                    b.Property<int?>("ProfessorId")
+                        .HasColumnType("integer");
+
+                    b.Property<int?>("StudentId")
+                        .HasColumnType("integer");
+
+                    b.Property<int>("TenantId")
+                        .HasColumnType("integer");
+
+                    b.Property<int>("UserTypeId")
+                        .HasColumnType("integer");
+
+                    b.Property<string>("Username")
+                        .IsRequired()
+                        .HasColumnType("character varying(50)");
+
+                    b.HasKey("Id");
+
+                    b.HasIndex("ProfessorId")
+                        .IsUnique();
+
+                    b.HasIndex("StudentId")
+                        .IsUnique();
+
+                    b.HasIndex("TenantId");
+
+                    b.HasIndex("UserTypeId");
+
+                    b.HasIndex("Username", "TenantId")
+                        .IsUnique();
+
+                    b.ToTable("Users");
+                });
+
+            modelBuilder.Entity("Tsi1.DataLayer.Entities.UserType", b =>
+                {
+                    b.Property<int>("Id")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("integer")
+                        .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn);
+
+                    b.Property<string>("Name")
+                        .IsRequired()
+                        .HasColumnType("character varying(50)");
+
+                    b.HasKey("Id");
+
+                    b.HasIndex("Name")
+                        .IsUnique();
+
+                    b.ToTable("UserTypes");
+                });
+
+            modelBuilder.Entity("Tsi1.DataLayer.Entities.Connection", b =>
+                {
+                    b.HasOne("Tsi1.DataLayer.Entities.Group", "Group")
+                        .WithMany("Connections")
+                        .HasForeignKey("GroupName");
+                });
+
+            modelBuilder.Entity("Tsi1.DataLayer.Entities.Course", b =>
+                {
+                    b.HasOne("Tsi1.DataLayer.Entities.Tenant", "Tenant")
+                        .WithMany("Courses")
+                        .HasForeignKey("TenantId")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+                });
+
+            modelBuilder.Entity("Tsi1.DataLayer.Entities.ForumUser", b =>
+                {
+                    b.HasOne("Tsi1.DataLayer.Entities.Forum", "Forum")
+                        .WithMany("ForumUsers")
+                        .HasForeignKey("ForumId")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.HasOne("Tsi1.DataLayer.Entities.User", "User")
+                        .WithMany("ForumUsers")
+                        .HasForeignKey("UserId")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+                });
+
+            modelBuilder.Entity("Tsi1.DataLayer.Entities.Post", b =>
+                {
+                    b.HasOne("Tsi1.DataLayer.Entities.Forum", "Forum")
+                        .WithMany("Posts")
+                        .HasForeignKey("ForumId")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.HasOne("Tsi1.DataLayer.Entities.User", "User")
+                        .WithMany("Posts")
+                        .HasForeignKey("UserId")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+                });
+
+            modelBuilder.Entity("Tsi1.DataLayer.Entities.PostMessage", b =>
+                {
+                    b.HasOne("Tsi1.DataLayer.Entities.Post", "Post")
+                        .WithMany("PostMessages")
+                        .HasForeignKey("PostId")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.HasOne("Tsi1.DataLayer.Entities.User", "User")
+                        .WithMany("PostMessages")
+                        .HasForeignKey("UserId")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+                });
+
+            modelBuilder.Entity("Tsi1.DataLayer.Entities.Professor", b =>
+                {
+                    b.HasOne("Tsi1.DataLayer.Entities.Tenant", "Tenant")
+                        .WithMany("Professors")
+                        .HasForeignKey("TenantId")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+                });
+
+            modelBuilder.Entity("Tsi1.DataLayer.Entities.ProfessorCourse", b =>
+                {
+                    b.HasOne("Tsi1.DataLayer.Entities.Course", "Course")
+                        .WithMany("ProfessorCourses")
+                        .HasForeignKey("CourseId")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.HasOne("Tsi1.DataLayer.Entities.Professor", "Professor")
+                        .WithMany("ProfessorCourses")
+                        .HasForeignKey("ProfessorId")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+                });
+
+            modelBuilder.Entity("Tsi1.DataLayer.Entities.Section", b =>
+                {
+                    b.HasOne("Tsi1.DataLayer.Entities.Course", "Course")
+                        .WithMany("Sections")
+                        .HasForeignKey("CourseId")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+                });
+
+            modelBuilder.Entity("Tsi1.DataLayer.Entities.SectionItem", b =>
+                {
+                    b.HasOne("Tsi1.DataLayer.Entities.File", "File")
+                        .WithOne("SectionItem")
+                        .HasForeignKey("Tsi1.DataLayer.Entities.SectionItem", "FileId");
+
+                    b.HasOne("Tsi1.DataLayer.Entities.Forum", "Forum")
+                        .WithOne("SectionItem")
+                        .HasForeignKey("Tsi1.DataLayer.Entities.SectionItem", "ForumId");
+
+                    b.HasOne("Tsi1.DataLayer.Entities.Section", "Section")
+                        .WithMany("SectionItems")
+                        .HasForeignKey("SectionId")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.HasOne("Tsi1.DataLayer.Entities.SectionItemType", "SectionItemType")
+                        .WithMany("SectionItems")
+                        .HasForeignKey("SectionItemTypeId")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.HasOne("Tsi1.DataLayer.Entities.Survey", "Survey")
+                        .WithOne("SectionItem")
+                        .HasForeignKey("Tsi1.DataLayer.Entities.SectionItem", "SurveyId");
+                });
+
+            modelBuilder.Entity("Tsi1.DataLayer.Entities.Student", b =>
+                {
+                    b.HasOne("Tsi1.DataLayer.Entities.Tenant", "Tenant")
+                        .WithMany("Students")
+                        .HasForeignKey("TenantId")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+                });
+
+            modelBuilder.Entity("Tsi1.DataLayer.Entities.StudentCourse", b =>
+                {
+                    b.HasOne("Tsi1.DataLayer.Entities.Course", "Course")
+                        .WithMany("StudentCourses")
+                        .HasForeignKey("CourseId")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.HasOne("Tsi1.DataLayer.Entities.Student", "Student")
+                        .WithMany("StudentCourses")
+                        .HasForeignKey("StudentId")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+                });
+
+            modelBuilder.Entity("Tsi1.DataLayer.Entities.Survey", b =>
+                {
+                    b.HasOne("Tsi1.DataLayer.Entities.Tenant", "Tenant")
+                        .WithMany("Surveys")
+                        .HasForeignKey("TenantId");
+                });
+
+            modelBuilder.Entity("Tsi1.DataLayer.Entities.SurveyAnswer", b =>
+                {
+                    b.HasOne("Tsi1.DataLayer.Entities.AnswerOption", "AnswerOption")
+                        .WithMany("SurveyAnswers")
+                        .HasForeignKey("AnswerOptionId")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.HasOne("Tsi1.DataLayer.Entities.SurveyQuestion", "SurveyQuestion")
+                        .WithMany("SurveyAnswers")
+                        .HasForeignKey("SurveyQuestionId")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.HasOne("Tsi1.DataLayer.Entities.SurveyResponse", "SurveyResponse")
+                        .WithMany("SurveyAnswers")
+                        .HasForeignKey("SurveyResponseId")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+                });
+
+            modelBuilder.Entity("Tsi1.DataLayer.Entities.SurveyQuestion", b =>
+                {
+                    b.HasOne("Tsi1.DataLayer.Entities.Survey", "Survey")
+                        .WithMany("SurveyQuestions")
+                        .HasForeignKey("SurveyId")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+                });
+
+            modelBuilder.Entity("Tsi1.DataLayer.Entities.SurveyResponse", b =>
+                {
+                    b.HasOne("Tsi1.DataLayer.Entities.Survey", "Survey")
+                        .WithMany("SurveyResponses")
+                        .HasForeignKey("SurveyId")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.HasOne("Tsi1.DataLayer.Entities.User", "User")
+                        .WithMany("SurveyResponses")
+                        .HasForeignKey("UserId")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+                });
+
+            modelBuilder.Entity("Tsi1.DataLayer.Entities.User", b =>
+                {
+                    b.HasOne("Tsi1.DataLayer.Entities.Professor", "Professor")
+                        .WithOne("User")
+                        .HasForeignKey("Tsi1.DataLayer.Entities.User", "ProfessorId");
+
+                    b.HasOne("Tsi1.DataLayer.Entities.Student", "Student")
+                        .WithOne("User")
+                        .HasForeignKey("Tsi1.DataLayer.Entities.User", "StudentId");
+
+                    b.HasOne("Tsi1.DataLayer.Entities.Tenant", "Tenant")
+                        .WithMany("Users")
+                        .HasForeignKey("TenantId")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.HasOne("Tsi1.DataLayer.Entities.UserType", "UserType")
+                        .WithMany()
+                        .HasForeignKey("UserTypeId")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+                });
+#pragma warning restore 612, 618
+        }
+    }
+}
diff --git a/Tsi1.Api/Tsi1.DataLayer/Migrations/20201112225623_fix-survey.cs b/Tsi1.Api/Tsi1.DataLayer/Migrations/20201112225623_fix-survey.cs
new file mode 100644
index 0000000000000000000000000000000000000000..3293f991ce1fbba90d705846ddaab6a8e1bdfd2a
--- /dev/null
+++ b/Tsi1.Api/Tsi1.DataLayer/Migrations/20201112225623_fix-survey.cs
@@ -0,0 +1,52 @@
+using Microsoft.EntityFrameworkCore.Migrations;
+
+namespace Tsi1.DataLayer.Migrations
+{
+    public partial class fixsurvey : Migration
+    {
+        protected override void Up(MigrationBuilder migrationBuilder)
+        {
+            migrationBuilder.DropForeignKey(
+                name: "FK_Surveys_Tenants_TenantId",
+                table: "Surveys");
+
+            migrationBuilder.AlterColumn<int>(
+                name: "TenantId",
+                table: "Surveys",
+                nullable: true,
+                oldClrType: typeof(int),
+                oldType: "integer");
+
+            migrationBuilder.AddForeignKey(
+                name: "FK_Surveys_Tenants_TenantId",
+                table: "Surveys",
+                column: "TenantId",
+                principalTable: "Tenants",
+                principalColumn: "Id",
+                onDelete: ReferentialAction.Restrict);
+        }
+
+        protected override void Down(MigrationBuilder migrationBuilder)
+        {
+            migrationBuilder.DropForeignKey(
+                name: "FK_Surveys_Tenants_TenantId",
+                table: "Surveys");
+
+            migrationBuilder.AlterColumn<int>(
+                name: "TenantId",
+                table: "Surveys",
+                type: "integer",
+                nullable: false,
+                oldClrType: typeof(int),
+                oldNullable: true);
+
+            migrationBuilder.AddForeignKey(
+                name: "FK_Surveys_Tenants_TenantId",
+                table: "Surveys",
+                column: "TenantId",
+                principalTable: "Tenants",
+                principalColumn: "Id",
+                onDelete: ReferentialAction.Cascade);
+        }
+    }
+}
diff --git a/Tsi1.Api/Tsi1.DataLayer/Migrations/Tsi1ContextModelSnapshot.cs b/Tsi1.Api/Tsi1.DataLayer/Migrations/Tsi1ContextModelSnapshot.cs
index e661f62fc22750b698b1da14d4ac889d01af8e80..8216f4b4c15b9fbc380b98cd89567475da7dc6d2 100644
--- a/Tsi1.Api/Tsi1.DataLayer/Migrations/Tsi1ContextModelSnapshot.cs
+++ b/Tsi1.Api/Tsi1.DataLayer/Migrations/Tsi1ContextModelSnapshot.cs
@@ -19,6 +19,24 @@ namespace Tsi1.DataLayer.Migrations
                 .HasAnnotation("ProductVersion", "3.1.4")
                 .HasAnnotation("Relational:MaxIdentifierLength", 63);
 
+            modelBuilder.Entity("Tsi1.DataLayer.Entities.AnswerOption", b =>
+                {
+                    b.Property<int>("Id")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("integer")
+                        .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn);
+
+                    b.Property<string>("Name")
+                        .IsRequired()
+                        .HasColumnType("character varying(100)");
+
+                    b.HasKey("Id");
+
+                    b.HasIndex("Name");
+
+                    b.ToTable("AnswerOptions");
+                });
+
             modelBuilder.Entity("Tsi1.DataLayer.Entities.Connection", b =>
                 {
                     b.Property<string>("ConnectionId")
@@ -269,6 +287,9 @@ namespace Tsi1.DataLayer.Migrations
                     b.Property<int>("SectionItemTypeId")
                         .HasColumnType("integer");
 
+                    b.Property<int?>("SurveyId")
+                        .HasColumnType("integer");
+
                     b.HasKey("Id");
 
                     b.HasIndex("FileId")
@@ -281,6 +302,9 @@ namespace Tsi1.DataLayer.Migrations
 
                     b.HasIndex("SectionItemTypeId");
 
+                    b.HasIndex("SurveyId")
+                        .IsUnique();
+
                     b.ToTable("SectionItems");
                 });
 
@@ -342,6 +366,102 @@ namespace Tsi1.DataLayer.Migrations
                     b.ToTable("StudentCourses");
                 });
 
+            modelBuilder.Entity("Tsi1.DataLayer.Entities.Survey", b =>
+                {
+                    b.Property<int>("Id")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("integer")
+                        .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn);
+
+                    b.Property<bool>("IsGlobal")
+                        .HasColumnType("boolean");
+
+                    b.Property<string>("Name")
+                        .IsRequired()
+                        .HasColumnType("character varying(255)");
+
+                    b.Property<int?>("TenantId")
+                        .HasColumnType("integer");
+
+                    b.HasKey("Id");
+
+                    b.HasIndex("Name");
+
+                    b.HasIndex("TenantId");
+
+                    b.ToTable("Surveys");
+                });
+
+            modelBuilder.Entity("Tsi1.DataLayer.Entities.SurveyAnswer", b =>
+                {
+                    b.Property<int>("Id")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("integer")
+                        .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn);
+
+                    b.Property<int>("AnswerOptionId")
+                        .HasColumnType("integer");
+
+                    b.Property<int>("SurveyQuestionId")
+                        .HasColumnType("integer");
+
+                    b.Property<int>("SurveyResponseId")
+                        .HasColumnType("integer");
+
+                    b.HasKey("Id");
+
+                    b.HasIndex("AnswerOptionId");
+
+                    b.HasIndex("SurveyQuestionId");
+
+                    b.HasIndex("SurveyResponseId");
+
+                    b.ToTable("SurveyAnswers");
+                });
+
+            modelBuilder.Entity("Tsi1.DataLayer.Entities.SurveyQuestion", b =>
+                {
+                    b.Property<int>("Id")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("integer")
+                        .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn);
+
+                    b.Property<string>("Question")
+                        .IsRequired()
+                        .HasColumnType("character varying(255)");
+
+                    b.Property<int>("SurveyId")
+                        .HasColumnType("integer");
+
+                    b.HasKey("Id");
+
+                    b.HasIndex("SurveyId");
+
+                    b.ToTable("SurveyQuestions");
+                });
+
+            modelBuilder.Entity("Tsi1.DataLayer.Entities.SurveyResponse", b =>
+                {
+                    b.Property<int>("Id")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("integer")
+                        .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn);
+
+                    b.Property<int>("SurveyId")
+                        .HasColumnType("integer");
+
+                    b.Property<int>("UserId")
+                        .HasColumnType("integer");
+
+                    b.HasKey("Id");
+
+                    b.HasIndex("SurveyId");
+
+                    b.HasIndex("UserId");
+
+                    b.ToTable("SurveyResponses");
+                });
+
             modelBuilder.Entity("Tsi1.DataLayer.Entities.Tenant", b =>
                 {
                     b.Property<int>("Id")
@@ -552,6 +672,10 @@ namespace Tsi1.DataLayer.Migrations
                         .HasForeignKey("SectionItemTypeId")
                         .OnDelete(DeleteBehavior.Cascade)
                         .IsRequired();
+
+                    b.HasOne("Tsi1.DataLayer.Entities.Survey", "Survey")
+                        .WithOne("SectionItem")
+                        .HasForeignKey("Tsi1.DataLayer.Entities.SectionItem", "SurveyId");
                 });
 
             modelBuilder.Entity("Tsi1.DataLayer.Entities.Student", b =>
@@ -578,6 +702,58 @@ namespace Tsi1.DataLayer.Migrations
                         .IsRequired();
                 });
 
+            modelBuilder.Entity("Tsi1.DataLayer.Entities.Survey", b =>
+                {
+                    b.HasOne("Tsi1.DataLayer.Entities.Tenant", "Tenant")
+                        .WithMany("Surveys")
+                        .HasForeignKey("TenantId");
+                });
+
+            modelBuilder.Entity("Tsi1.DataLayer.Entities.SurveyAnswer", b =>
+                {
+                    b.HasOne("Tsi1.DataLayer.Entities.AnswerOption", "AnswerOption")
+                        .WithMany("SurveyAnswers")
+                        .HasForeignKey("AnswerOptionId")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.HasOne("Tsi1.DataLayer.Entities.SurveyQuestion", "SurveyQuestion")
+                        .WithMany("SurveyAnswers")
+                        .HasForeignKey("SurveyQuestionId")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.HasOne("Tsi1.DataLayer.Entities.SurveyResponse", "SurveyResponse")
+                        .WithMany("SurveyAnswers")
+                        .HasForeignKey("SurveyResponseId")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+                });
+
+            modelBuilder.Entity("Tsi1.DataLayer.Entities.SurveyQuestion", b =>
+                {
+                    b.HasOne("Tsi1.DataLayer.Entities.Survey", "Survey")
+                        .WithMany("SurveyQuestions")
+                        .HasForeignKey("SurveyId")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+                });
+
+            modelBuilder.Entity("Tsi1.DataLayer.Entities.SurveyResponse", b =>
+                {
+                    b.HasOne("Tsi1.DataLayer.Entities.Survey", "Survey")
+                        .WithMany("SurveyResponses")
+                        .HasForeignKey("SurveyId")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.HasOne("Tsi1.DataLayer.Entities.User", "User")
+                        .WithMany("SurveyResponses")
+                        .HasForeignKey("UserId")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+                });
+
             modelBuilder.Entity("Tsi1.DataLayer.Entities.User", b =>
                 {
                     b.HasOne("Tsi1.DataLayer.Entities.Professor", "Professor")
diff --git a/Tsi1.Api/Tsi1.DataLayer/Tsi1Context.cs b/Tsi1.Api/Tsi1.DataLayer/Tsi1Context.cs
index ba1524c725417ba94a5672a0254a9cd05d66f911..468e7dd1b6849216aedf0fee5ad9ae03bffd44b9 100644
--- a/Tsi1.Api/Tsi1.DataLayer/Tsi1Context.cs
+++ b/Tsi1.Api/Tsi1.DataLayer/Tsi1Context.cs
@@ -27,6 +27,12 @@ namespace Tsi1.DataLayer
         public DbSet<Section> Sections { get; set; }
         public DbSet<SectionItem> SectionItems { get; set; }
         public DbSet<SectionItemType> SectionItemTypes { get; set; }
+        public DbSet<Survey> Surveys { get; set; }
+        public DbSet<SurveyAnswer> SurveyAnswers { get; set; }
+        public DbSet<SurveyQuestion> SurveyQuestions { get; set; }
+        public DbSet<SurveyResponse> SurveyResponses { get; set; }
+        public DbSet<AnswerOption> AnswerOptions { get; set; }
+
 
 
         public Tsi1Context(DbContextOptions options) : base(options) { }
@@ -51,6 +57,11 @@ namespace Tsi1.DataLayer
             modelBuilder.ApplyConfiguration(new SectionConfiguration());
             modelBuilder.ApplyConfiguration(new SectionItemConfiguration());
             modelBuilder.ApplyConfiguration(new SectionItemTypeConfiguration());
+            modelBuilder.ApplyConfiguration(new SurveyConfiguration());
+            modelBuilder.ApplyConfiguration(new SurveyAnswerConfiguration());
+            modelBuilder.ApplyConfiguration(new SurveyQuestionConfiguration());
+            modelBuilder.ApplyConfiguration(new SurveyResponseConfiguration());
+            modelBuilder.ApplyConfiguration(new AnswerOptionConfiguration());
         }
     }
 }