diff --git a/src/CSVReader/CSVReader.cpp b/src/CSVReader/CSVReader.cpp
index 7a2127254954091f40ce33a7224555b8145646e5..22c739addb7479dc0e37cff247405d7fecee0db9 100644
--- a/src/CSVReader/CSVReader.cpp
+++ b/src/CSVReader/CSVReader.cpp
@@ -88,6 +88,7 @@ namespace lib4neuro {
             data_set_contents.push_back(std::make_pair(input, output));
         }
 
-        return DataSet(&data_set_contents);
+        DoubleUnitStrategy* ds = new DoubleUnitStrategy();
+        return DataSet(&data_set_contents, ds);
     }
 }
\ No newline at end of file
diff --git a/src/DataSet/DataSet.cpp b/src/DataSet/DataSet.cpp
index fa517d0db2859bf151f55ef63b6371fbf8e9c21e..72ce426af68e952da316cd3884ced66f47a268d6 100644
--- a/src/DataSet/DataSet.cpp
+++ b/src/DataSet/DataSet.cpp
@@ -38,8 +38,8 @@ namespace lib4neuro {
 
         if(ns) {
             this->normalization_strategy = ns;
-            this->max_min_inp_val.at(0) = this->normalization_strategy->get_max_value();
-            this->max_min_inp_val.at(1) = this->normalization_strategy->get_min_value();
+//            this->max_min_inp_val.emplace_back(this->normalization_strategy->get_max_value());
+//            this->max_min_inp_val.emplace_back(this->normalization_strategy->get_min_value());
         }
 
         //TODO check the complete data set for input/output dimensions
@@ -58,8 +58,8 @@ namespace lib4neuro {
 
         if(ns) {
             this->normalization_strategy = ns;
-            this->max_min_inp_val.at(0) = this->normalization_strategy->get_max_value();
-            this->max_min_inp_val.at(1) = this->normalization_strategy->get_min_value();
+//            this->max_min_inp_val.emplace_back(this->normalization_strategy->get_max_value());
+//            this->max_min_inp_val.emplace_back(this->normalization_strategy->get_min_value());
         }
 
         this->add_isotropic_data(lower_bound, upper_bound, size, output);
@@ -78,8 +78,8 @@ namespace lib4neuro {
 
         if(ns) {
             this->normalization_strategy = ns;
-            this->max_min_inp_val.at(0) = this->normalization_strategy->get_max_value();
-            this->max_min_inp_val.at(1) = this->normalization_strategy->get_min_value();
+//            this->max_min_inp_val.emplace_back(this->normalization_strategy->get_max_value());
+//            this->max_min_inp_val.emplace_back(this->normalization_strategy->get_min_value());
         }
 
         this->add_isotropic_data(bounds, no_elems_in_one_dim, output_func);
@@ -222,12 +222,17 @@ namespace lib4neuro {
     }
 
     void DataSet::normalize() {
-//        if(this->normalized) {
-//            throw std::runtime_error("This data set is already normalized!");
-//        }
+        if(!this->normalization_strategy) {
+            throw std::runtime_error("There is no normalization strategy given for this data set, so it can not be "
+                                     "normalized!");
+        }
 
         /* Find maximum and minimum values */
-        this->max_min_inp_val.at(0) =  this->max_min_inp_val.at(1) = this->data[0].first.at(0);
+        if(this->max_min_inp_val.empty()) {
+            this->max_min_inp_val.emplace_back(this->data.at(0).first.at(0));
+            this->max_min_inp_val.emplace_back(this->data.at(0).first.at(0));
+        }
+
         double tmp, tmp2;
         for(auto pair : this->data) {
             /* Finding maximum */
@@ -294,9 +299,9 @@ namespace lib4neuro {
         return this->normalization_strategy;
     }
 
-//    bool DataSet::is_normalized() {
-//        return this->normalized;
-//    }
+    bool DataSet::is_normalized() {
+        return !this->max_min_inp_val.empty();
+    }
 
     double DataSet::get_max_inp_val() {
         return this->max_min_inp_val.at(0);
diff --git a/src/DataSet/DataSet.h b/src/DataSet/DataSet.h
index 0ac929056956e18bd2b42881b220952dcf5f2aa8..e0e040930a4e12a05bb929750b5354bef8342b00 100644
--- a/src/DataSet/DataSet.h
+++ b/src/DataSet/DataSet.h
@@ -77,7 +77,7 @@ namespace lib4neuro {
          *
          */
         //TODO let user choose in the constructor!
-        NormalizationStrategy* normalization_strategy = new DoubleUnitStrategy;
+        NormalizationStrategy* normalization_strategy = nullptr; //new DoubleUnitStrategy;
 
 //        /**
 //         *
@@ -248,11 +248,11 @@ namespace lib4neuro {
          */
         LIB4NEURO_API NormalizationStrategy* get_normalization_strategy();
 
-//        /**
-//         *
-//         * @return
-//         */
-//        LIB4NEURO_API bool is_normalized();
+        /**
+         *
+         * @return
+         */
+        LIB4NEURO_API bool is_normalized();
 
         /**
          *
diff --git a/src/LearningMethods/GradientDescent.cpp b/src/LearningMethods/GradientDescent.cpp
index be320f69e27ae48ec53b8a16943a61e21012601e..a457d0cf65e56889c150dd24592f01aa8fc15040 100644
--- a/src/LearningMethods/GradientDescent.cpp
+++ b/src/LearningMethods/GradientDescent.cpp
@@ -44,7 +44,7 @@ namespace lib4neuro {
     void GradientDescent::optimize(lib4neuro::ErrorFunction &ef) {
 
         /* Copy data set max and min values, if it's normalized */
-        if(!std::isnan(ef.get_dataset()->get_max_inp_val())) {
+        if(ef.get_dataset()->is_normalized()) {
             ef.get_network_instance()->set_normalization_strategy_instance(
                     ef.get_dataset()->get_normalization_strategy());
         }
diff --git a/src/LearningMethods/ParticleSwarm.cpp b/src/LearningMethods/ParticleSwarm.cpp
index 7c649f6de2f72912bc600cb7dfe131997515d8f2..5046f4e137646e0669cc65f8a99020e811f34ea8 100644
--- a/src/LearningMethods/ParticleSwarm.cpp
+++ b/src/LearningMethods/ParticleSwarm.cpp
@@ -258,7 +258,7 @@ namespace lib4neuro {
      */
     void ParticleSwarm::optimize(lib4neuro::ErrorFunction &ef) {
         /* Copy data set max and min values, if it's normalized */
-        if(!std::isnan(ef.get_dataset()->get_max_inp_val())) {
+        if(ef.get_dataset()->is_normalized()) {
             ef.get_network_instance()->set_normalization_strategy_instance(
                     ef.get_dataset()->get_normalization_strategy());
         }
diff --git a/src/NormalizationStrategy/NormalizationStrategy.cpp b/src/NormalizationStrategy/NormalizationStrategy.cpp
index 9ca3b04e3b2eca68f0d95550d56d49e1a5b80688..32f475cac58d5323c93d34178f5d8a34f53c278e 100644
--- a/src/NormalizationStrategy/NormalizationStrategy.cpp
+++ b/src/NormalizationStrategy/NormalizationStrategy.cpp
@@ -23,8 +23,13 @@ double NormalizationStrategy::get_min_value() {
 DoubleUnitStrategy::DoubleUnitStrategy() {}
 
 double DoubleUnitStrategy::normalize(double n, double max, double min) {
-    this->max_min_inp_val.at(0) = max;
-    this->max_min_inp_val.at(1) = min;
+    if(this->max_min_inp_val.empty()) {
+        this->max_min_inp_val.emplace_back(max);
+        this->max_min_inp_val.emplace_back(min);
+    } else {
+        this->max_min_inp_val.at(0) = max;
+        this->max_min_inp_val.at(1) = min;
+    }
 
     return 2*(n - min)/(max - min) - 1;
 }