commit 222110753ac2c0b7730361c6ccd31546871ca6f6
Author: Roman Kalivoda <kalivoda@students.zcu.cz>
Date:   Wed May 26 07:30:44 2021 +0000

    Revert "Merge branch 'PredictorAPI' into 'master'"
    
    This reverts merge request !20

diff --git a/Server/ServerApp.sln b/Server/ServerApp.sln
index 591d3ce..89c9211 100644
--- a/Server/ServerApp.sln
+++ b/Server/ServerApp.sln
@@ -7,8 +7,6 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ServerApp", "ServerApp\Serv
 EndProject
 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TestProject", "TestProject\TestProject.csproj", "{8A09DB8E-64B1-4D55-991E-7F7B21996B45}"
 EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ServerAppTests", "ServerAppTests\ServerAppTests.csproj", "{E068474B-98FB-431D-84EB-000AA36D0FC5}"
-EndProject
 Global
 	GlobalSection(SolutionConfigurationPlatforms) = preSolution
 		Debug|Any CPU = Debug|Any CPU
@@ -33,14 +31,6 @@ Global
 		{8A09DB8E-64B1-4D55-991E-7F7B21996B45}.Release|Any CPU.Build.0 = Release|Any CPU
 		{8A09DB8E-64B1-4D55-991E-7F7B21996B45}.Release|x64.ActiveCfg = Release|Any CPU
 		{8A09DB8E-64B1-4D55-991E-7F7B21996B45}.Release|x64.Build.0 = Release|Any CPU
-		{E068474B-98FB-431D-84EB-000AA36D0FC5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
-		{E068474B-98FB-431D-84EB-000AA36D0FC5}.Debug|Any CPU.Build.0 = Debug|Any CPU
-		{E068474B-98FB-431D-84EB-000AA36D0FC5}.Debug|x64.ActiveCfg = Debug|Any CPU
-		{E068474B-98FB-431D-84EB-000AA36D0FC5}.Debug|x64.Build.0 = Debug|Any CPU
-		{E068474B-98FB-431D-84EB-000AA36D0FC5}.Release|Any CPU.ActiveCfg = Release|Any CPU
-		{E068474B-98FB-431D-84EB-000AA36D0FC5}.Release|Any CPU.Build.0 = Release|Any CPU
-		{E068474B-98FB-431D-84EB-000AA36D0FC5}.Release|x64.ActiveCfg = Release|Any CPU
-		{E068474B-98FB-431D-84EB-000AA36D0FC5}.Release|x64.Build.0 = Release|Any CPU
 	EndGlobalSection
 	GlobalSection(SolutionProperties) = preSolution
 		HideSolutionNode = FALSE
diff --git a/Server/ServerApp/Connection/XMLProtocolHandler/Request.cs b/Server/ServerApp/Connection/XMLProtocolHandler/Request.cs
index 0f314aa..41f228e 100644
--- a/Server/ServerApp/Connection/XMLProtocolHandler/Request.cs
+++ b/Server/ServerApp/Connection/XMLProtocolHandler/Request.cs
@@ -1,4 +1,8 @@
 ﻿using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
 using System.Xml.Serialization;
 
 namespace ServerApp.Connection.XMLProtocolHandler
diff --git a/Server/ServerApp/Parser/Parsers/DataParser.cs b/Server/ServerApp/Parser/Parsers/DataParser.cs
index 8e98de1..24ab8fa 100644
--- a/Server/ServerApp/Parser/Parsers/DataParser.cs
+++ b/Server/ServerApp/Parser/Parsers/DataParser.cs
@@ -82,13 +82,6 @@ namespace ServerApp.Parser.Parsers
             var jisFiles = downloader.GetData(pathJis, start, end);
             var loginFiles = downloader.GetData(pathLogIn, start, end);
 
-            WeatherDataUsed = new List<string>();
-            ActivityDataUsed = new List<string>();
-
-            WeatherDataUsed.AddRange(weatherFiles);
-            ActivityDataUsed.AddRange(jisFiles);
-            ActivityDataUsed.AddRange(loginFiles);
-
             WeatherList = weatherParser.ParseWeatherData(weatherFiles, startTime, endTime, wholeDay, interval);
             jisList = jisParser.ParseJisData(jisFiles, startTime, endTime, wholeDay, interval);
             loginList = loginParser.ParseLogInData(loginFiles, startTime, endTime, wholeDay, interval);
diff --git a/Server/ServerApp/Parser/Parsers/IDataParser.cs b/Server/ServerApp/Parser/Parsers/IDataParser.cs
index 886db4c..ae67a00 100644
--- a/Server/ServerApp/Parser/Parsers/IDataParser.cs
+++ b/Server/ServerApp/Parser/Parsers/IDataParser.cs
@@ -21,15 +21,6 @@ namespace ServerApp.Parser.Parsers
         List<ActivityInfo> attendanceList;
         public List<ActivityInfo> AttendanceList { get => attendanceList; internal set => attendanceList = value; }
 
-        /// <summary> List of weather file names the parser was last used on </summary>
-        List<String> weatherdataUsed;
-        public List<string> WeatherDataUsed { get => weatherdataUsed; set => weatherdataUsed = value; }
-
-        /// <summary> List of activity file names the parser was last used on </summary>
-        List<String> activitydataUsed;
-        public List<string> ActivityDataUsed { get => activitydataUsed; set => activitydataUsed = value; }
-
-
         /// <summary>
         /// Parse data
         /// </summary>
diff --git a/Server/ServerApp/Predictor/FeatureExtractor.cs b/Server/ServerApp/Predictor/FeatureExtractor.cs
index cda5897..4c7ccaa 100644
--- a/Server/ServerApp/Predictor/FeatureExtractor.cs
+++ b/Server/ServerApp/Predictor/FeatureExtractor.cs
@@ -13,26 +13,23 @@ namespace ServerApp.Predictor
     /// <summary>
     /// A class responsible for preparation of features for classifiers.
     /// </summary>
-    class FeatureExtractor
+    public class FeatureExtractor
     {
         /// <summary>
         /// A DataParser instance used to access info objects.
         /// </summary>
-        private readonly IDataParser DataParser;
+        private readonly IDataParser dataParser;
 
-        /// <summary>
-        /// A configuration object of the <c>Predictor</c> package
-        /// </summary>
-        private PredictorConfiguration Configuration;
+        private Dictionary<string, int> buildingsToAreas;
 
         /// <summary>
         /// Instantiates new FeatureExtractor class.
         /// </summary>
         /// <param name="dataParser">Data parser used to access training data.</param>
-        public FeatureExtractor(IDataParser dataParser, PredictorConfiguration configuration)
+        public FeatureExtractor(IDataParser dataParser, Dictionary<string, int> buildingsToAreas)
         {
-            this.DataParser = dataParser;
-            this.Configuration = configuration;
+            this.dataParser = dataParser;
+            this.buildingsToAreas = buildingsToAreas;
         }
 
         /// <summary>
@@ -44,12 +41,13 @@ namespace ServerApp.Predictor
         /// <param name="interval"></param>
         /// <param name="wholeDay"></param>
         /// <returns></returns>
-        public List<ModelInput> PrepareTrainingInput(int area)
+        public List<ModelInput> PrepareTrainingInput(int area, DateTime startDate, DateTime endDate, int interval = 1, bool wholeDay = true)
         {
+            dataParser.Parse(startDate, endDate, interval, wholeDay);
             List<string> buildings = new List<string>();
 
             // find all buildings in area
-            foreach (KeyValuePair<string, int> kvp in Configuration.BuildingsToAreas)
+            foreach (KeyValuePair<string, int> kvp in buildingsToAreas)
             {
                 if (kvp.Value == area)
                 {
@@ -58,28 +56,27 @@ namespace ServerApp.Predictor
             }
 
             var res = new List<ModelInput>();
-            foreach (WeatherInfo val in DataParser.WeatherList)
+            foreach (WeatherInfo val in dataParser.WeatherList)
             {
                 res.Add(new ModelInput
                 {
-                    Time = val.startTime,
                     Temp = (float)val.temp,
-                    Hour = val.startTime.Hour,
+                    Time = val.startTime,
                     Wind = (float)val.wind,
                     Rain = (float)val.rain,
                 });
             }
 
-            List<ActivityInfo> attendance = DataParser.AttendanceList;
+            List<ActivityInfo> attendance = dataParser.AttendanceList;
             foreach (ModelInput input in res)
             {
                 List<int> amounts = new List<int>();
                 List<int> maxima = new List<int>();
                 foreach (string building in buildings)
                 {
-                    List<ActivityInfo> temp = attendance.Where(activity => activity.building.Equals(building)).ToList();
-                    amounts.Add(temp.Where(activity => activity.startTime.Equals(input.Time)).Select(activity => activity.amount).First());
-                    maxima.Add(temp.Select(activity => activity.amount).Max());
+
+                    amounts.Add(attendance.Where(activity => activity.building.Equals(building) && activity.startTime.Equals(input.Time)).Select(activity => activity.amount).First());
+                    maxima.Add(attendance.Where(activity => activity.building.Equals(building)).Select(activity => activity.amount).Max());
                 }
                 double ratio = amounts.Sum() / (double)maxima.Sum();
                 input.Label = RatioToLabel(ratio);
@@ -93,81 +90,62 @@ namespace ServerApp.Predictor
             if (ratio < 0.1f)
             {
                 return "10%";
-            }
-            else if (ratio < 0.2f)
+            } else if (ratio < 0.2f)
             {
                 return "20%";
-            }
-            else if (ratio < 0.3f)
+            } else if (ratio < 0.3f)
             {
                 return "30%";
-            }
-            else if (ratio < 0.4f)
+            } else if (ratio < 0.4f)
             {
                 return "40%";
-            }
-            else if (ratio < 0.5f)
+            } else if (ratio < 0.5f)
             {
                 return "50%";
-            }
-            else if (ratio < 0.6f)
+            } else if (ratio < 0.6f)
             {
                 return "60%";
-            }
-            else if (ratio < 0.7f)
-            {
+            } else if(ratio < 0.7f) {
                 return "70%";
-            }
-            else if (ratio < 0.8f)
+            } else if (ratio < 0.8f)
             {
                 return "80%";
-            }
-            else if (ratio < 0.9f)
+            } else if (ratio < 0.9f)
             {
                 return "90%";
-            }
-            else
+            } else
             {
                 return "100%";
             }
         }
 
-        internal double LabelToRatio(string label)
+        private double LabelToRatio(string label)
         {
-            if (label.Equals("10%"))
-            {
+            if (label.Equals("10%")) {
                 return 0.1f;
             }
-            else if (label.Equals("20%"))
-            {
+            else if (label.Equals("20%"))  {
                 return 0.2f;
             }
-            else if (label.Equals("30%"))
-            {
+            else if (label.Equals("30%")) {
                 return 0.3f;
             }
-            else if (label.Equals("40%"))
-            {
+            else if (label.Equals("40%")) {
                 return 0.4f;
             }
-            else if (label.Equals("50%"))
-            {
+            else if (label.Equals("50%")) {
                 return 0.5f;
             }
-            else if (label.Equals("60%"))
-            {
+            else if (label.Equals("60%")) {
                 return 0.6f;
             }
-            else if (label.Equals("70%"))
-            {
+            else if (label.Equals("70%")) {
                 return 0.7f;
             }
-            else if (label.Equals("80%"))
-            {
+            else if (label.Equals("80%")) {
                 return 0.8f;
             }
-            else if (label.Equals("90%"))
-            {
+            else if (label.Equals("90%")) {
                 return 0.9f;
             }
             else
diff --git a/Server/ServerApp/Predictor/IPredictionController.cs b/Server/ServerApp/Predictor/IPredictionController.cs
index a434a2b..023e3d8 100644
--- a/Server/ServerApp/Predictor/IPredictionController.cs
+++ b/Server/ServerApp/Predictor/IPredictionController.cs
@@ -2,8 +2,12 @@
 // Author: Roman Kalivoda
 //
 
+using System;
 using System.Collections.Generic;
+using System.IO;
+using Microsoft.ML;
 using ServerApp.Connection.XMLProtocolHandler;
+using ServerApp.Parser.OutputInfo;
 
 namespace ServerApp.Predictor
 {
@@ -28,7 +32,7 @@ namespace ServerApp.Predictor
         /// </summary>
         /// <param name="locationKey">A string identifier of the location for which to load a predictor.</param>
         /// <param name="path">A path to folder with trained prediction model.</param>
-        void Load(string locationKey = null, string path = null);
+        void Load(string locationKey = null,string path = null);
 
         /// <summary>
         /// Predicts turnout level at given time supposing given weather conditions.
diff --git a/Server/ServerApp/Predictor/ModelInput.cs b/Server/ServerApp/Predictor/ModelInput.cs
index 12da9ae..b7e1e6d 100644
--- a/Server/ServerApp/Predictor/ModelInput.cs
+++ b/Server/ServerApp/Predictor/ModelInput.cs
@@ -13,11 +13,6 @@ namespace ServerApp.Predictor
     /// </summary>
     public class ModelInput
     {
-        /// <summary>
-        /// Start time of the information.
-        /// </summary>
-        public DateTime Time { get; set; }
-
         /// <summary>
         /// A label of this training input.
         /// </summary>
@@ -31,19 +26,19 @@ namespace ServerApp.Predictor
         public float Temp { get; set; }
 
         /// <summary>
-        /// Hour of the predicted turnout.
+        /// Time of the predicted turnout.
         /// </summary>
-        [ColumnName("Hour"), LoadColumn(2)]
-        public int Hour { get; set; }
+        [ColumnName("Time"), LoadColumn(2)]
+        public DateTime Time { get; set; }
 
         /// <summary>
-        /// Wind velocity in m/s
+        /// Wind velocity in ? units
         /// </summary>
         [ColumnName("Wind"), LoadColumn(3)]
         public float Wind { get; set; }
 
         /// <summary>
-        /// Precipitation in %
+        /// Precipitation
         /// </summary>
         [ColumnName("Rain"), LoadColumn(4)]
         public float Rain { get; set; }
diff --git a/Server/ServerApp/Predictor/ModelOutput.cs b/Server/ServerApp/Predictor/ModelOutput.cs
index 5d8984b..ace5084 100644
--- a/Server/ServerApp/Predictor/ModelOutput.cs
+++ b/Server/ServerApp/Predictor/ModelOutput.cs
@@ -2,6 +2,7 @@
 // Author: Roman Kalivoda
 //
 
+using System;
 using Microsoft.ML.Data;
 
 namespace ServerApp.Predictor
@@ -15,7 +16,7 @@ namespace ServerApp.Predictor
         /// A predicted class.
         /// </summary>
         [ColumnName("PredictedLabel")]
-        public string PredictedLabel { get; set; }
+        public String Prediction { get; set; }
 
     }
 }
diff --git a/Server/ServerApp/Predictor/NaiveBayesClassifier.cs b/Server/ServerApp/Predictor/NaiveBayesClassifier.cs
index 7af64ad..31ce1d2 100644
--- a/Server/ServerApp/Predictor/NaiveBayesClassifier.cs
+++ b/Server/ServerApp/Predictor/NaiveBayesClassifier.cs
@@ -40,44 +40,26 @@ namespace ServerApp.Predictor
         {
             this._trainingDataView = _mlContext.Data.LoadFromEnumerable(trainInput);
             var pipeline = _mlContext.Transforms.Conversion.MapValueToKey(nameof(ModelInput.Label))
-                .Append(_mlContext.Transforms.Conversion.ConvertType(nameof(ModelInput.Hour)))
-                .Append(_mlContext.Transforms.Concatenate("Features", 
-                new[] { nameof(ModelInput.Temp), nameof(ModelInput.Rain), nameof(ModelInput.Wind), nameof(ModelInput.Hour) }))
-                .Append(_mlContext.Transforms.NormalizeMeanVariance("Features", useCdf:false))
+                .Append(_mlContext.Transforms.Concatenate("Features", new[] { "Temp" }))
+                .Append(_mlContext.Transforms.NormalizeMinMax("Features", "Features"))
                 .AppendCacheCheckpoint(_mlContext)
                 .Append(_mlContext.MulticlassClassification.Trainers.NaiveBayes())
-                .Append(_mlContext.Transforms.Conversion.MapKeyToValue(nameof(ModelOutput.PredictedLabel)));
+                .Append(_mlContext.Transforms.Conversion.MapKeyToValue("PredictedLabel")); ;
 
-            var cvResults = _mlContext.MulticlassClassification.CrossValidate(this._trainingDataView, pipeline);
-            foreach (var result in cvResults)
-            {
-                var testMetrics = result.Metrics;
-                Console.WriteLine($"*************************************************************************************************************");
-                Console.WriteLine($"*       Metrics for Multi-class Classification model - Model #{result.Fold}    ");
-                Console.WriteLine($"*------------------------------------------------------------------------------------------------------------");
-                Console.WriteLine($"*       MicroAccuracy:    {testMetrics.MicroAccuracy:0.###}");
-                Console.WriteLine($"*       MacroAccuracy:    {testMetrics.MacroAccuracy:0.###}");
-                Console.WriteLine($"*       LogLoss:          {testMetrics.LogLoss:#.###}");
-                Console.WriteLine($"*       LogLossReduction: {testMetrics.LogLossReduction:#.###}");
-                Console.WriteLine($"*       Confusion Matrix: {testMetrics.ConfusionMatrix.GetFormattedConfusionTable()}");
-                Console.WriteLine($"*************************************************************************************************************");
-            }
-            this._trainedModel = cvResults.OrderByDescending(fold => fold.Metrics.MicroAccuracy).Select(fold => fold.Model).First();
-            Console.WriteLine($"Selected the model #{cvResults.OrderByDescending(fold => fold.Metrics.MicroAccuracy).Select(fold => fold.Fold).First()} as the best.");
+            this._trainedModel = pipeline.Fit(this._trainingDataView);
             this._predictionEngine = _mlContext.Model.CreatePredictionEngine<ModelInput, ModelOutput>(this._trainedModel);
 
         }
 
         public string Predict(ModelInput input)
         {
-            return this._predictionEngine.Predict(input).PredictedLabel;
+            return this._predictionEngine.Predict(input).Prediction;
         }
 
         public void Evaluate(IEnumerable<ModelInput> modelInputs)
         {
             var testDataView = this._mlContext.Data.LoadFromEnumerable(modelInputs);
-            var data = _trainedModel.Transform(testDataView);
-            var testMetrics = _mlContext.MulticlassClassification.Evaluate(data);
+            var testMetrics = _mlContext.MulticlassClassification.Evaluate(_trainedModel.Transform(testDataView));
 
             Console.WriteLine($"*************************************************************************************************************");
             Console.WriteLine($"*       Metrics for Multi-class Classification model - Test Data     ");
@@ -86,7 +68,6 @@ namespace ServerApp.Predictor
             Console.WriteLine($"*       MacroAccuracy:    {testMetrics.MacroAccuracy:0.###}");
             Console.WriteLine($"*       LogLoss:          {testMetrics.LogLoss:#.###}");
             Console.WriteLine($"*       LogLossReduction: {testMetrics.LogLossReduction:#.###}");
-            Console.WriteLine($"*       Confusion Matrix: {testMetrics.ConfusionMatrix.GetFormattedConfusionTable()}");
             Console.WriteLine($"*************************************************************************************************************");
         }
     }
diff --git a/Server/ServerApp/Predictor/PredictionController.cs b/Server/ServerApp/Predictor/PredictionController.cs
index 634ddc7..9349326 100644
--- a/Server/ServerApp/Predictor/PredictionController.cs
+++ b/Server/ServerApp/Predictor/PredictionController.cs
@@ -4,76 +4,60 @@
 
 using System;
 using System.Collections.Generic;
+using System.IO;
+using Microsoft.ML;
 using ServerApp.Connection.XMLProtocolHandler;
-using ServerApp.Parser.Parsers;
-using Newtonsoft.Json;
-using ServerApp.WeatherPredictionParser;
 using ServerApp.Parser.OutputInfo;
+using ServerApp.Parser.Parsers;
 
 namespace ServerApp.Predictor
 {
     /// <summary>
     /// Implentation of the <c>IPredicitionController</c> interface.
     /// </summary>
-    public class PredictionController : IPredictionController
+    class PredictionController : IPredictionController
     {
         /// <summary>
-        /// Configuration of the <c>Predictor</c>
+        /// A dictionary for storing trained predictors.
         /// </summary>
-        private PredictorConfiguration Configuration;
+        private Dictionary<string, int> buildingsToAreas;
 
-        private List<IPredictor> Predictors;
+        private List<IPredictor> predictors;
 
         /// <summary>
         /// A reference to a data parser.
         /// </summary>
-        private IDataParser DataParser;
+        private IDataParser dataParser;
 
         /// <summary>
         /// A feature extractor instance.
         /// </summary>
-        private FeatureExtractor FeatureExtractor;
-
-        /// <summary>
-        /// A weather prediction parser service
-        /// </summary>
-        private IJsonParser weatherService;
+        private FeatureExtractor featureExtractor;
 
         /// <summary>
         /// Instantiates new prediction controller.
         /// </summary>
         /// <param name="dataParser">A data parser used to get training data.</param>
-        public PredictionController(IJsonParser weatherService, IDataParser dataParser, string pathToConfig = null)
+        public PredictionController(IDataParser dataParser)
         {
-            this.weatherService = weatherService;
-            // load config or get the default one
-            if (pathToConfig is null)
-            {
-                pathToConfig = PredictorConfiguration.DEFAULT_CONFIG_PATH;
-            }
-            try
-            {
-                string json = System.IO.File.ReadAllText(pathToConfig);
-                this.Configuration = JsonConvert.DeserializeObject<PredictorConfiguration>(json);
-            } catch (System.IO.IOException e)
-            {
-                Console.WriteLine(e.ToString());
-                this.Configuration = PredictorConfiguration.GetDefaultConfig();
-            }
-
-            this.DataParser = dataParser;
-            this.Predictors = new List<IPredictor>();
-            this.FeatureExtractor = new FeatureExtractor(this.DataParser, this.Configuration);
-
-            for (int i = 0; i < this.Configuration.PredictorCount; i++)
+            this.dataParser = dataParser;
+            this.predictors = new List<IPredictor>();
+            this.buildingsToAreas = new Dictionary<string, int>();
+            this.featureExtractor = new FeatureExtractor(dataParser, buildingsToAreas);
+
+            // fill predictors with all available locationKeys
+            // TODO Currently all locations use the same predictor. Try dividing locations into subareas with separate predictors.
+            var locationKeys = TagInfo.buildings;
+            foreach (string key in locationKeys)
             {
-                Predictors.Add(new NaiveBayesClassifier());
+                buildingsToAreas.Add(key, 0);
             }
-            PredictorConfiguration.SaveConfig(PredictorConfiguration.DEFAULT_CONFIG_PATH, Configuration);
+            IPredictor predictor = new NaiveBayesClassifier();
+            predictors.Add(predictor);
         }
         public List<string> GetPredictors()
         {
-            return new List<string>(this.Configuration.BuildingsToAreas.Keys);
+            return new List<string>(buildingsToAreas.Keys);
         }
 
         public void Load(string locationKey = null, string path = null)
@@ -90,97 +74,30 @@ namespace ServerApp.Predictor
 
         public Response Predict(Request request)
         {
-            DateTime start = new DateTime(year: request.start.year, month: request.start.month, day: request.start.day, hour: request.start.hour, minute: 0, second: 0);
-            List<Prediction> predictions = new List<Prediction>();
-            if (request.useEndDate)
-            {
-                DateTime end = new DateTime(year: request.end.year, month: request.end.month, day: request.end.day, hour: request.end.hour, minute: 0, second: 0);
-                DateTime current = start;
-                while (current < end)
-                {
-                    while (current.Hour < Date.MAX_HOUR)
-                    {
-                        var prediction = PredictSingle(request, current);
-                        predictions.Add(prediction);
-                        current = current.AddHours(this.Configuration.TimeResolution);
-                    }
-                    current = current.AddHours(23 - current.Hour + Date.MIN_HOUR);
-                }
-            } else
-            {
-                if (request.useWeather)
-                {
-                    predictions.Add(PredictSingle(request, start));
-                }
-            }
-            var response = new Response();
-            response.hoursPerSegment = Configuration.TimeResolution;
-            response.predicitons = predictions.ToArray();
-            return response;
+            throw new NotImplementedException();
         }
 
-        private Prediction PredictSingle(Request request, DateTime current)
-        {
-            double[] predictedValues = new double[this.Configuration.BuildingsToAreas.Count];
-            string[] predictedLabels = new string[this.Predictors.Count];
-            for (int i = 0; i < this.Predictors.Count; i++)
-            {
-                if (request.useWeather)
-                {
-                    predictedLabels[i] = this.Predictors[i].Predict(new ModelInput
-                    {
-                        Rain = (float)request.rain,
-                        Temp = (float)request.temperature,
-                        Wind = (float)request.wind,
-                        Hour = current.Hour,
-                        Time = current
-                    });
-                }
-                else
-                {
-                    List<WeatherInfo> weatherInfos = weatherService.GetPredictionForTime(from: current, to: current.AddHours(this.Configuration.TimeResolution));
-                    predictedLabels[i] = this.Predictors[i].Predict(new ModelInput
-                    {
-                        Rain = weatherInfos[0].rain,
-                        Temp = (float)weatherInfos[0].temp,
-                        Wind = (float)weatherInfos[0].wind,
-                        Hour = current.Hour,
-                        Time = current
-                    });
-                }
-            }
-            for (int i = 0; i < predictedValues.Length; i++)
-            {
-                predictedValues[i] = this.FeatureExtractor.LabelToRatio(predictedLabels[this.Configuration.BuildingsToAreas[TagInfo.buildings[i]]]) * 100;
-            }
-
-            Prediction prediction = new Prediction();
-            prediction.dateTime = new Date
-            {
-                year = current.Year,
-                month = current.Month,
-                day = current.Day,
-                hour = current.Hour
-            };
-            prediction.predictions = predictedValues;
-            return prediction;
-        }
 
         public void Train(string locationKey = null)
         {
             if (locationKey is null)
             // train all predictors
             {
-                DataParser.Parse(DateTime.MinValue, DateTime.MaxValue, this.Configuration.TimeResolution, wholeDay: false);
-                for (int i = 0; i < this.Predictors.Count; i++)
+                // TODO A single predictor is used for all areas, so training is done only once now.
+                for (int i = 0; i < this.predictors.Count; i++)
                 {
                     // train on all available data
-                    List<ModelInput> data = FeatureExtractor.PrepareTrainingInput(i);
-                    Console.WriteLine("Training predictor with {0} samples.", data.Count);
-                    this.Predictors[i].Fit(data);
+                    // TODO the train/test split is used just temporarily for demonstration.
+                    List<ModelInput> data = featureExtractor.PrepareTrainingInput(i, DateTime.MinValue, DateTime.MaxValue);
+                    List<ModelInput> trainingData = data.GetRange(index: 0, count: 500);
+                    List<ModelInput> testData = data.GetRange(index: 500, count: 94);
+                    Console.WriteLine("Training predictor with {0} samples.", trainingData.Count);
+                    this.predictors[i].Fit(trainingData);
+
+                    Console.WriteLine("Evaluating predictor with {0} samples.", testData.Count);
+                    this.predictors[i].Evaluate(testData);
                 }
-            }
-            else
+            } else
             // train specified predictor only
             {
                 throw new NotImplementedException();
diff --git a/Server/ServerApp/Predictor/PredictorConfiguration.cs b/Server/ServerApp/Predictor/PredictorConfiguration.cs
deleted file mode 100644
index 2fb6a1f..0000000
--- a/Server/ServerApp/Predictor/PredictorConfiguration.cs
+++ /dev/null
@@ -1,78 +0,0 @@
-﻿//
-// Author: Roman Kalivoda
-//
-
-using System.Collections.Generic;
-using System;
-using System.IO;
-using Newtonsoft.Json;
-
-namespace ServerApp.Predictor
-{
-    class PredictorConfiguration
-    {
-        public static readonly string DEFAULT_CONFIG_PATH = Path.GetFullPath(Path.GetDirectoryName(AppDomain.CurrentDomain.SetupInformation.ConfigurationFile) + @"\Predictor.config");
-
-        public int TimeResolution { get; set; }
-
-        public Dictionary<string, int> BuildingsToAreas { get; set; }
-
-        public int PredictorCount { get; set; }
-
-        public static PredictorConfiguration LoadConfig(string filename)
-        {
-            string json = System.IO.File.ReadAllText(filename);
-            PredictorConfiguration configuration = JsonConvert.DeserializeObject<PredictorConfiguration>(json);
-            return configuration;
-        }
-
-        public static void SaveConfig(string filename, PredictorConfiguration configuration)
-        {
-            string json = JsonConvert.SerializeObject(configuration);
-            System.IO.File.WriteAllText(filename, json);
-        }
-
-        public static PredictorConfiguration GetDefaultConfig()
-        {
-            Dictionary<string, int> dict = new Dictionary<string, int>();
-            var locationKeys = Parser.Parsers.TagInfo.buildings;
-            foreach (string key in locationKeys)
-            {
-                dict.Add(key, 0);
-            }
-
-            return new PredictorConfiguration
-            {
-                TimeResolution = 3,
-                PredictorCount = 3,
-                BuildingsToAreas = new Dictionary<string, int>
-                {
-                    { "FST+FEK", 0 },
-                    { "FDU", 0 },
-                    { "FAV", 0 },
-                    { "FEL", 0 },
-                    { "REK", 0 },
-                    { "MENZA", 0 },
-                    { "LIB", 0 },
-                    { "CIV", 0 },
-                    { "UNI14", 0 },
-                    { "DOM", 1 },
-                    { "HUS", 1 },
-                    { "CHOD", 1 },
-                    { "JUNG", 1 },
-                    { "KLAT", 1 },
-                    { "KOLL", 1 },
-                    { "RIEG", 1 },
-                    { "SADY", 1 },
-                    { "SED+VEL", 1 },
-                    { "TES", 1 },
-                    { "TYL", 1 },
-                    { "KARMA", 2 },
-                    { "KBORY", 2 },
-                    { "KLOCH", 2 },
-                    { "KKLAT", 2 }
-                }
-            };
-        }
-    }
-}
diff --git a/Server/ServerApp/Program.cs b/Server/ServerApp/Program.cs
index 274a52a..145f31b 100644
--- a/Server/ServerApp/Program.cs
+++ b/Server/ServerApp/Program.cs
@@ -1,7 +1,6 @@
 ﻿using ServerApp.Connection;
 using ServerApp.Connection.XMLProtocolHandler;
 using ServerApp.DataDownload;
-using ServerApp.Parser.OutputInfo;
 using ServerApp.Parser.Parsers;
 using ServerApp.Predictor;
 using ServerApp.User;
@@ -137,16 +136,9 @@ namespace ServerApp
             JsonParser jsonP = new JsonParser(null);
 			jsonP.ParsePrediction();
 
-			var res = jsonP.GetPredictionForTime(jsonP.Predictions[5].startTime, jsonP.Predictions[20].startTime);
-			Console.WriteLine("from " + jsonP.Predictions[5].startTime);
-			Console.WriteLine("end " + jsonP.Predictions[20].startTime);
-			foreach (WeatherInfo w in res)
-				Console.WriteLine(w.ToString());
-
-
 			// TODO nastavit čas
 			IDataParser p = new DataParser(dd);
-            IPredictionController predictionController = new PredictionController(jsonP, p);
+            IPredictionController predictionController = new PredictionController(p);
             predictionController.Train();
             //var results = predictionController.Predict()
 			
diff --git a/Server/ServerApp/ServerApp.csproj b/Server/ServerApp/ServerApp.csproj
index 18b2bef..2afd7df 100644
--- a/Server/ServerApp/ServerApp.csproj
+++ b/Server/ServerApp/ServerApp.csproj
@@ -179,7 +179,6 @@
     <Compile Include="Parser\Parsers\DataParser.cs" />
     <Compile Include="Parser\Parsers\IDataParser.cs" />
     <Compile Include="Parser\Parsers\JisParser.cs" />
-    <Compile Include="Predictor\PredictorConfiguration.cs" />
     <Compile Include="Predictor\FeatureExtractor.cs" />
     <Compile Include="Predictor\IPredictionController.cs" />
     <Compile Include="Predictor\PredictionController.cs" />
diff --git a/Server/ServerApp/WeatherPredictionParser/IJsonParser.cs b/Server/ServerApp/WeatherPredictionParser/IJsonParser.cs
index 9659bb6..31c8058 100644
--- a/Server/ServerApp/WeatherPredictionParser/IJsonParser.cs
+++ b/Server/ServerApp/WeatherPredictionParser/IJsonParser.cs
@@ -3,7 +3,6 @@
 //
 
 using ServerApp.Parser.OutputInfo;
-using System;
 using System.Collections.Generic;
 
 namespace ServerApp.WeatherPredictionParser
@@ -11,12 +10,12 @@ namespace ServerApp.WeatherPredictionParser
     /// <summary>
     /// Abstract class that every Json parser should inherit from
     /// </summary>
-    public abstract class IJsonParser
+    abstract class IJsonParser
     {
 
         /// <summary> Current weather </summary>
         WeatherInfo current;
-        public WeatherInfo Current { get => current; set => current = value; }
+        public WeatherInfo Current { get => current; }
 
         /// <summary> Prediction for today, tommorrow and day after tommorrow </summary>
         List<WeatherInfo> predictions;
@@ -28,14 +27,6 @@ namespace ServerApp.WeatherPredictionParser
         /// </summary>
         abstract public void ParsePrediction();
 
-        /// <summary>
-        /// Get predictions from Predictions that are within specified time span
-        /// </summary>
-        /// <param name="from">DateTime from</param>
-        /// <param name="to">DateTime to</param>
-        /// <returns>List of predictions that fit specified criteria</returns>
-        abstract public List<WeatherInfo> GetPredictionForTime(DateTime from, DateTime to);
-
     }
 
 }
diff --git a/Server/ServerApp/WeatherPredictionParser/JsonParser.cs b/Server/ServerApp/WeatherPredictionParser/JsonParser.cs
index a20349b..45b912b 100644
--- a/Server/ServerApp/WeatherPredictionParser/JsonParser.cs
+++ b/Server/ServerApp/WeatherPredictionParser/JsonParser.cs
@@ -20,6 +20,13 @@ namespace ServerApp.WeatherPredictionParser
     /// <author>A. Konig</author>
     class JsonParser : IJsonParser
     {
+        /// <summary> Current weather </summary>
+        WeatherInfo current;
+        public new WeatherInfo Current { get => current; }
+        /// <summary> Prediction for today, tommorrow and day after tommorrow </summary>
+        List<WeatherInfo> predictions;
+        public new List<WeatherInfo> Predictions { get => predictions; set => predictions = value; }
+
         /// <summary> Data loader </summary>
         DataDownloader loader;
         /// <summary> Currently parsed day </summary>
@@ -39,53 +46,6 @@ namespace ServerApp.WeatherPredictionParser
             this.loader = loader;
         }
 
-        /// <summary>
-        /// Get predictions from Predictions that are within specified time span
-        /// From-to including
-        /// If from == null then all until to
-        /// If to  == null then all starting from from
-        /// </summary>
-        /// <param name="from">DateTime from</param>
-        /// <param name="to">DateTime to</param>
-        /// <returns>List of predictions that fit specified criteria or null if incorrect input</returns>
-        public override List<WeatherInfo> GetPredictionForTime(DateTime from, DateTime to)
-        {
-            if (Predictions == null)
-                return null;
-
-            List<WeatherInfo> res = new List<WeatherInfo>();
-
-            if (from == null)
-                from = Predictions[0].startTime;
-
-            if (to == null)
-                from = Predictions[Predictions.Count].startTime;
-
-            if (from > to)
-                return null;
-
-            foreach (WeatherInfo pred in Predictions)
-            {
-                int hour = pred.startTime.Hour + pred.intervalLength;
-                Console.WriteLine(pred.intervalLength);
-                bool addDay = false;
-                if (hour >= 24)
-                {
-                    hour -= 24;
-                    addDay = true;
-                }
-                DateTime endTime = new DateTime(pred.startTime.Year, pred.startTime.Month, pred.startTime.Day, hour, pred.startTime.Minute, pred.startTime.Second);
-                if (addDay)
-                    endTime = endTime.AddDays(1);
-
-                // if both end and start not outside of interval
-                if (!((pred.startTime < from && endTime <= from) || (pred.startTime > to && endTime >= to)))
-                    res.Add(pred);
-            }
-
-            return res;
-        }
-
         /// <summary>
         /// Parse weather prediction
         /// Results is in attributes current for current weather and pred for weather prediction for today, tommorrow and day after tommorrow
@@ -99,8 +59,8 @@ namespace ServerApp.WeatherPredictionParser
             DateTime now = DateTime.Now;
             Console.WriteLine(File.Exists(file));
 
-            Current = new WeatherInfo();
-            Predictions = new List<WeatherInfo>();
+            current = new WeatherInfo();
+            predictions = new List<WeatherInfo>();
 
             if (!File.Exists(file))
                 return;
@@ -124,7 +84,7 @@ namespace ServerApp.WeatherPredictionParser
                     case "current_condition":
                         {
                             ArrayEnumerator currentWeather = weatherP.Current.Value.EnumerateArray();
-                            Current = ParseCurrentWeather(currentWeather);
+                            current = ParseCurrentWeather(currentWeather);
 
                             break;
                         }
@@ -150,8 +110,8 @@ namespace ServerApp.WeatherPredictionParser
         /// </summary>
         private void TestConsoleOutput()
         {
-            Console.WriteLine(Current);
-            foreach (WeatherInfo w in Predictions)
+            Console.WriteLine(current);
+            foreach (WeatherInfo w in predictions)
                 Console.WriteLine(w);
         }
 
@@ -177,14 +137,14 @@ namespace ServerApp.WeatherPredictionParser
         private void EncompassSunRiseSetTimes()
         {
             // change current weather
-            if ((Current.startTime.TimeOfDay > sunsetTime.TimeOfDay) || (Current.startTime.TimeOfDay < sunriseTime.TimeOfDay))
-                Current.condition = WeatherConditions.Dark;
+            if ((current.startTime.TimeOfDay > sunsetTime.TimeOfDay) || (current.startTime.TimeOfDay < sunriseTime.TimeOfDay))
+                current.condition = WeatherConditions.Dark;
 
             // change prediction
-            for (int i = 0; i < Predictions.Count - 1; i++)
+            for (int i = 0; i < predictions.Count - 1; i++)
             {
-                WeatherInfo w = Predictions[i];
-                WeatherInfo wNext = Predictions[i + 1];
+                WeatherInfo w = predictions[i];
+                WeatherInfo wNext = predictions[i + 1];
 
                 // if wNext time < than w time then it is prediction from the next day -> add 24 to correctly calculate timespan
                 int timespan = wNext.startTime.Hour - w.startTime.Hour;
@@ -218,9 +178,9 @@ namespace ServerApp.WeatherPredictionParser
             }
 
             // last prediction
-            WeatherInfo wLast = Predictions[Predictions.Count - 1];
+            WeatherInfo wLast = predictions[predictions.Count - 1];
             TimeSpan endTimeW = new TimeSpan(24, 0, 0);
-            int timespanLast = 24 - wLast.startTime.Hour;
+            int timespanLast = endTimeW.Hours - wLast.startTime.Hour;
             wLast.intervalLength = timespanLast;
 
             // if start under sunset
@@ -378,7 +338,7 @@ namespace ServerApp.WeatherPredictionParser
                 }
 
                 // Console.WriteLine(weather.ToString());
-                Predictions.Add(weather);
+                predictions.Add(weather);
 
             }
 
@@ -441,6 +401,5 @@ namespace ServerApp.WeatherPredictionParser
             return res;
         }
 
-      
     }
 }
diff --git a/Server/ServerAppTests/Predictor/PredictionControllerTests.cs b/Server/ServerAppTests/Predictor/PredictionControllerTests.cs
deleted file mode 100644
index 84c89eb..0000000
--- a/Server/ServerAppTests/Predictor/PredictionControllerTests.cs
+++ /dev/null
@@ -1,29 +0,0 @@
-﻿//
-// Author: Roman Kalivoda
-//
-using Microsoft.VisualStudio.TestTools.UnitTesting;
-using ServerApp.Predictor;
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Text;
-using System.Threading.Tasks;
-
-namespace ServerApp.Predictor.Tests
-{
-    [TestClass()]
-    public class PredictionControllerTests
-    {
-        [TestInitialize]
-        public void SetUp()
-        {
-
-        }
-
-        [TestMethod()]
-        public void TrainTest()
-        {
-            throw new NotImplementedException();
-        }
-    }
-}
diff --git a/Server/ServerAppTests/Properties/AssemblyInfo.cs b/Server/ServerAppTests/Properties/AssemblyInfo.cs
deleted file mode 100644
index c5df6a5..0000000
--- a/Server/ServerAppTests/Properties/AssemblyInfo.cs
+++ /dev/null
@@ -1,36 +0,0 @@
-﻿using System.Reflection;
-using System.Runtime.CompilerServices;
-using System.Runtime.InteropServices;
-
-// General Information about an assembly is controlled through the following 
-// set of attributes. Change these attribute values to modify the information
-// associated with an assembly.
-[assembly: AssemblyTitle("ServerAppTests")]
-[assembly: AssemblyDescription("")]
-[assembly: AssemblyConfiguration("")]
-[assembly: AssemblyCompany("")]
-[assembly: AssemblyProduct("ServerAppTests")]
-[assembly: AssemblyCopyright("Copyright ©  2021")]
-[assembly: AssemblyTrademark("")]
-[assembly: AssemblyCulture("")]
-
-// Setting ComVisible to false makes the types in this assembly not visible 
-// to COM components.  If you need to access a type in this assembly from 
-// COM, set the ComVisible attribute to true on that type.
-[assembly: ComVisible(false)]
-
-// The following GUID is for the ID of the typelib if this project is exposed to COM
-[assembly: Guid("e068474b-98fb-431d-84eb-000aa36d0fc5")]
-
-// Version information for an assembly consists of the following four values:
-//
-//      Major Version
-//      Minor Version 
-//      Build Number
-//      Revision
-//
-// You can specify all the values or you can default the Build and Revision Numbers 
-// by using the '*' as shown below:
-// [assembly: AssemblyVersion("1.0.*")]
-[assembly: AssemblyVersion("1.0.0.0")]
-[assembly: AssemblyFileVersion("1.0.0.0")]
diff --git a/Server/ServerAppTests/ServerAppTests.csproj b/Server/ServerAppTests/ServerAppTests.csproj
deleted file mode 100644
index f9a7410..0000000
--- a/Server/ServerAppTests/ServerAppTests.csproj
+++ /dev/null
@@ -1,120 +0,0 @@
-﻿<?xml version="1.0" encoding="utf-8"?>
-<Project ToolsVersion="15.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
-  <Import Project="..\packages\MSTest.TestAdapter.2.1.1\build\net45\MSTest.TestAdapter.props" Condition="Exists('..\packages\MSTest.TestAdapter.2.1.1\build\net45\MSTest.TestAdapter.props')" />
-  <PropertyGroup>
-    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
-    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
-    <ProjectGuid>{E068474B-98FB-431D-84EB-000AA36D0FC5}</ProjectGuid>
-    <OutputType>Library</OutputType>
-    <AppDesignerFolder>Properties</AppDesignerFolder>
-    <RootNamespace>ServerAppTests</RootNamespace>
-    <AssemblyName>ServerAppTests</AssemblyName>
-    <TargetFrameworkVersion>v4.7.2</TargetFrameworkVersion>
-    <FileAlignment>512</FileAlignment>
-    <ProjectTypeGuids>{3AC096D0-A1C2-E12C-1390-A8335801FDAB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
-    <VisualStudioVersion Condition="'$(VisualStudioVersion)' == ''">10.0</VisualStudioVersion>
-    <VSToolsPath Condition="'$(VSToolsPath)' == ''">$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)</VSToolsPath>
-    <ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\$(VisualStudioVersion)\UITestExtensionPackages</ReferencePath>
-    <IsCodedUITest>False</IsCodedUITest>
-    <TestProjectType>UnitTest</TestProjectType>
-    <TargetFrameworkProfile />
-    <NuGetPackageImportStamp>
-    </NuGetPackageImportStamp>
-  </PropertyGroup>
-  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
-    <DebugSymbols>true</DebugSymbols>
-    <DebugType>full</DebugType>
-    <Optimize>false</Optimize>
-    <OutputPath>bin\Debug\</OutputPath>
-    <DefineConstants>DEBUG;TRACE</DefineConstants>
-    <ErrorReport>prompt</ErrorReport>
-    <WarningLevel>4</WarningLevel>
-  </PropertyGroup>
-  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
-    <DebugType>pdbonly</DebugType>
-    <Optimize>true</Optimize>
-    <OutputPath>bin\Release\</OutputPath>
-    <DefineConstants>TRACE</DefineConstants>
-    <ErrorReport>prompt</ErrorReport>
-    <WarningLevel>4</WarningLevel>
-  </PropertyGroup>
-  <ItemGroup>
-    <Reference Include="Castle.Core, Version=4.0.0.0, Culture=neutral, PublicKeyToken=407dd0808d44fbdc, processorArchitecture=MSIL">
-      <HintPath>..\packages\Castle.Core.4.4.0\lib\net45\Castle.Core.dll</HintPath>
-    </Reference>
-    <Reference Include="Microsoft.VisualStudio.TestPlatform.TestFramework, Version=14.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
-      <HintPath>..\packages\MSTest.TestFramework.2.1.1\lib\net45\Microsoft.VisualStudio.TestPlatform.TestFramework.dll</HintPath>
-    </Reference>
-    <Reference Include="Microsoft.VisualStudio.TestPlatform.TestFramework.Extensions, Version=14.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
-      <HintPath>..\packages\MSTest.TestFramework.2.1.1\lib\net45\Microsoft.VisualStudio.TestPlatform.TestFramework.Extensions.dll</HintPath>
-    </Reference>
-    <Reference Include="Moq, Version=4.16.0.0, Culture=neutral, PublicKeyToken=69f491c39445e920, processorArchitecture=MSIL">
-      <HintPath>..\packages\Moq.4.16.1\lib\net45\Moq.dll</HintPath>
-    </Reference>
-    <Reference Include="System" />
-    <Reference Include="System.Configuration" />
-    <Reference Include="System.Runtime.CompilerServices.Unsafe, Version=4.0.4.1, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
-      <HintPath>..\packages\System.Runtime.CompilerServices.Unsafe.4.5.3\lib\net461\System.Runtime.CompilerServices.Unsafe.dll</HintPath>
-    </Reference>
-    <Reference Include="System.Threading.Tasks.Extensions, Version=4.2.0.1, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
-      <HintPath>..\packages\System.Threading.Tasks.Extensions.4.5.4\lib\net461\System.Threading.Tasks.Extensions.dll</HintPath>
-    </Reference>
-  </ItemGroup>
-  <Choose>
-    <When Condition="('$(VisualStudioVersion)' == '10.0' or '$(VisualStudioVersion)' == '') and '$(TargetFrameworkVersion)' == 'v3.5'">
-      <ItemGroup>
-        <Reference Include="Microsoft.VisualStudio.QualityTools.UnitTestFramework, Version=10.1.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL" />
-      </ItemGroup>
-    </When>
-    <Otherwise />
-  </Choose>
-  <ItemGroup>
-    <Compile Include="Predictor\PredictionControllerTests.cs" />
-    <Compile Include="Properties\AssemblyInfo.cs" />
-  </ItemGroup>
-  <ItemGroup>
-    <None Include="app.config" />
-    <None Include="packages.config" />
-  </ItemGroup>
-  <ItemGroup>
-    <ProjectReference Include="..\ServerApp\ServerApp.csproj">
-      <Project>{18FCFB20-B860-4147-8E7C-8A0DD84C55D4}</Project>
-      <Name>ServerApp</Name>
-    </ProjectReference>
-  </ItemGroup>
-  <Choose>
-    <When Condition="'$(VisualStudioVersion)' == '10.0' And '$(IsCodedUITest)' == 'True'">
-      <ItemGroup>
-        <Reference Include="Microsoft.VisualStudio.QualityTools.CodedUITestFramework, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
-          <Private>False</Private>
-        </Reference>
-        <Reference Include="Microsoft.VisualStudio.TestTools.UITest.Common, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
-          <Private>False</Private>
-        </Reference>
-        <Reference Include="Microsoft.VisualStudio.TestTools.UITest.Extension, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
-          <Private>False</Private>
-        </Reference>
-        <Reference Include="Microsoft.VisualStudio.TestTools.UITesting, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
-          <Private>False</Private>
-        </Reference>
-      </ItemGroup>
-    </When>
-  </Choose>
-  <Import Project="$(VSToolsPath)\TeamTest\Microsoft.TestTools.targets" Condition="Exists('$(VSToolsPath)\TeamTest\Microsoft.TestTools.targets')" />
-  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
-  <Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">
-    <PropertyGroup>
-      <ErrorText>This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them.  For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}.</ErrorText>
-    </PropertyGroup>
-    <Error Condition="!Exists('..\packages\MSTest.TestAdapter.2.1.1\build\net45\MSTest.TestAdapter.props')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\MSTest.TestAdapter.2.1.1\build\net45\MSTest.TestAdapter.props'))" />
-    <Error Condition="!Exists('..\packages\MSTest.TestAdapter.2.1.1\build\net45\MSTest.TestAdapter.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\MSTest.TestAdapter.2.1.1\build\net45\MSTest.TestAdapter.targets'))" />
-  </Target>
-  <Import Project="..\packages\MSTest.TestAdapter.2.1.1\build\net45\MSTest.TestAdapter.targets" Condition="Exists('..\packages\MSTest.TestAdapter.2.1.1\build\net45\MSTest.TestAdapter.targets')" />
-  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
-       Other similar extension points exist, see Microsoft.Common.targets.
-  <Target Name="BeforeBuild">
-  </Target>
-  <Target Name="AfterBuild">
-  </Target>
-  -->
-</Project>
\ No newline at end of file
diff --git a/Server/ServerAppTests/app.config b/Server/ServerAppTests/app.config
deleted file mode 100644
index 9901ce9..0000000
--- a/Server/ServerAppTests/app.config
+++ /dev/null
@@ -1,11 +0,0 @@
-﻿<?xml version="1.0" encoding="utf-8"?>
-<configuration>
-  <runtime>
-    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
-      <dependentAssembly>
-        <assemblyIdentity name="System.Runtime.CompilerServices.Unsafe" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
-        <bindingRedirect oldVersion="0.0.0.0-4.0.4.1" newVersion="4.0.4.1" />
-      </dependentAssembly>
-    </assemblyBinding>
-  </runtime>
-</configuration>
\ No newline at end of file
diff --git a/Server/ServerAppTests/packages.config b/Server/ServerAppTests/packages.config
deleted file mode 100644
index ef614aa..0000000
--- a/Server/ServerAppTests/packages.config
+++ /dev/null
@@ -1,9 +0,0 @@
-﻿<?xml version="1.0" encoding="utf-8"?>
-<packages>
-  <package id="Castle.Core" version="4.4.0" targetFramework="net472" />
-  <package id="Moq" version="4.16.1" targetFramework="net472" />
-  <package id="MSTest.TestAdapter" version="2.1.1" targetFramework="net472" />
-  <package id="MSTest.TestFramework" version="2.1.1" targetFramework="net472" />
-  <package id="System.Runtime.CompilerServices.Unsafe" version="4.5.3" targetFramework="net472" />
-  <package id="System.Threading.Tasks.Extensions" version="4.5.4" targetFramework="net472" />
-</packages>
\ No newline at end of file
