diff --git a/Helios/Controllers/ConfiguratorController.cs b/Helios/Controllers/ConfiguratorController.cs
new file mode 100644
index 0000000000000000000000000000000000000000..9060e96608d18bba3dfc204a06545f9424459c40
--- /dev/null
+++ b/Helios/Controllers/ConfiguratorController.cs
@@ -0,0 +1,27 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Threading.Tasks;
+using Helios.Source;
+using Microsoft.AspNetCore.Mvc;
+
+// For more information on enabling MVC for empty projects, visit https://go.microsoft.com/fwlink/?LinkID=397860
+
+namespace Helios.Controllers
+{
+    public class ConfiguratorController : Controller
+    {
+        private readonly ConfiguratorService _service;
+
+        public ConfiguratorController(ConfiguratorService service)
+        {
+            _service = service;
+        }
+
+        public IActionResult Index()
+        {
+            return View();
+        }
+    }
+}
+
diff --git a/Helios/Helios.csproj b/Helios/Helios.csproj
index fc9d27436ca1afc4e77c5d53f73a0b8fe23f2f93..94eff889a551ff3407508f9987e16dae6a3f74ac 100644
--- a/Helios/Helios.csproj
+++ b/Helios/Helios.csproj
@@ -12,10 +12,12 @@
     <None Remove="Microsoft.VisualStudio.Web.CodeGeneration.Design" />
     <None Remove="Swashbuckle.AspNetCore" />
     <None Remove="Views\Login\" />
+    <None Remove="Views\Configurator\" />
   </ItemGroup>
   <ItemGroup>
     <Folder Include="Source\" />
     <Folder Include="Views\Login\" />
+    <Folder Include="Views\Configurator\" />
   </ItemGroup>
   <ItemGroup>
     <PackageReference Include="Npgsql" Version="6.0.4" />
diff --git a/Helios/Models/ConfiguratorResult.cs b/Helios/Models/ConfiguratorResult.cs
new file mode 100644
index 0000000000000000000000000000000000000000..c94ba9be5c2de98ceceedfa9210947048f521a9c
--- /dev/null
+++ b/Helios/Models/ConfiguratorResult.cs
@@ -0,0 +1,21 @@
+using System;
+namespace Helios.Models
+{
+	public class ConfiguratorResult
+	{
+        public double RoofArea { get; set; }
+        public double RoofAngle { get; set; }
+        public double PanelEfficiency { get; set; }
+        public double InstallationCost { get; set; }
+        public double PowerGeneratedSummer { get; set; }
+        public double PowerGeneratedWinter { get; set; }
+        public bool GeneratesRequiredPower { get; set; }
+        public bool ExceedsMaximumPower { get; set; }
+        public bool WithinBudget { get; set; }
+
+        public ConfiguratorResult()
+		{
+		}
+	}
+}
+
diff --git a/Helios/Source/ConfiguratorService.cs b/Helios/Source/ConfiguratorService.cs
new file mode 100644
index 0000000000000000000000000000000000000000..749a519de39674cf935d56c4dd9d4bc6444292ff
--- /dev/null
+++ b/Helios/Source/ConfiguratorService.cs
@@ -0,0 +1,111 @@
+using System;
+using Helios.Models;
+using Npgsql;
+
+namespace Helios.Source
+{
+	public class ConfiguratorService
+	{
+		private readonly NpgsqlConnection _connection;
+		private readonly List<SolarPanel> _solarPanels;
+		private readonly SunElevation _maxElevation;
+
+		public ConfiguratorService(string connectionString)
+		{
+			_connection = new NpgsqlConnection(connectionString);
+
+			this._solarPanels = GetSolarPanels();
+			this._maxElevation = GetSunElevation();
+		}
+
+		public List<ConfiguratorResult> GetResults(List<Roof> roofs, int requiredPower, int maxPower, int budget)
+        {
+			List<ConfiguratorResult> results = new List<ConfiguratorResult>();
+
+			foreach (var roof in roofs)
+			{
+				foreach (SolarPanel panel in _solarPanels)
+				{
+					ConfiguratorResult result = new ConfiguratorResult();
+
+					result.RoofArea = roof.Area;
+					result.RoofAngle = roof.Elevation;
+					result.PanelEfficiency = panel.Efficiency;
+					result.InstallationCost = panel.GetInstallationCost(roof.Area);
+					result.PowerGeneratedSummer = panel.GetPowerOutput(roof.Area, _maxElevation.SummerElevation);
+					result.PowerGeneratedWinter = panel.GetPowerOutput(roof.Area, _maxElevation.WinterElevation);
+					result.GeneratesRequiredPower = GeneratesRequiredPower(requiredPower, result.PowerGeneratedWinter);
+					result.ExceedsMaximumPower = ExceedsPowerLimit(maxPower, result.PowerGeneratedWinter);
+					result.WithinBudget = WithinBudget(budget, result.InstallationCost);
+					
+					results.Add(result);
+				}
+			}
+
+			return results;
+        }
+
+		private bool WithinBudget(int budget, double installationCost)
+		{
+			return installationCost > budget;
+		}
+
+		private bool GeneratesRequiredPower(int requiredPower, double powerGenerated)
+        {
+			return powerGenerated >= requiredPower;
+        }
+
+		private bool ExceedsPowerLimit(int maxPower, double powerGenerated)
+		{
+			return powerGenerated >= maxPower;
+		}
+
+
+		private List<SolarPanel> GetSolarPanels()
+        {
+			List<SolarPanel> solarPanels = new List<SolarPanel>();
+
+            _connection.Open();
+
+            NpgsqlCommand cmd = new NpgsqlCommand("select efficiency, area_cost from solar_panel", _connection);
+
+            using var reader = cmd.ExecuteReader();
+
+			while (reader.Read())
+            {
+				solarPanels.Add(new SolarPanel
+				{
+					Efficiency = double.Parse(reader["efficiency"].ToString()),
+					CostPerMetreSquared = double.Parse(reader["area_cost"].ToString())
+				});
+            }
+
+            _connection.Close();
+
+			return solarPanels;
+        }
+
+		private SunElevation GetSunElevation()
+        {
+			SunElevation elevation = new SunElevation();
+
+			_connection.Open();
+
+			NpgsqlCommand cmd = new NpgsqlCommand("select  \"time\", summer_eleveation, winter_eleveation from sun_elevation where \"time\" = '12:00'", _connection);
+
+			using var reader = cmd.ExecuteReader();
+
+			if (reader.Read())
+			{
+				elevation.Time = DateTime.Parse(reader["time"].ToString());
+				elevation.SummerElevation = int.Parse(reader["summer_eleveation"].ToString());
+				elevation.WinterElevation = int.Parse(reader["winter_eleveation"].ToString());	
+			}
+
+			_connection.Close();
+
+			return elevation;
+		}
+	}
+}
+
diff --git a/Helios/Source/SolarPanel.cs b/Helios/Source/SolarPanel.cs
index ab72a117d1ac4ccc082c946f7f533405402467d5..e2a09a3e0de9ef948c21a8e72eda5e15fe0ad78d 100644
--- a/Helios/Source/SolarPanel.cs
+++ b/Helios/Source/SolarPanel.cs
@@ -31,7 +31,7 @@ namespace Helios.Source
             return installationCost;
         }
 
-        public double GetPowerOutput(int roofArea, int roofElevation)
+        public double GetPowerOutput(double roofArea, int roofElevation)
         {
             double powerOutput;
 
diff --git a/Helios/Source/SunElevation.cs b/Helios/Source/SunElevation.cs
new file mode 100644
index 0000000000000000000000000000000000000000..b15cd38fcf25d0a22cc5e9f8c15633c914fef77d
--- /dev/null
+++ b/Helios/Source/SunElevation.cs
@@ -0,0 +1,15 @@
+using System;
+namespace Helios.Source
+{
+	public class SunElevation
+	{
+        public DateTime Time { get; set; }
+        public int SummerElevation { get; set; }
+        public int WinterElevation { get; set; }
+
+        public SunElevation()
+		{
+		}
+	}
+}
+