diff --git a/eraser-base/src/main/java/de/tudresden/inf/st/eraser/jastadd/model/MachineLearningHandlerFactory.java b/eraser-base/src/main/java/de/tudresden/inf/st/eraser/jastadd/model/MachineLearningHandlerFactory.java
index aa98f3508dfb635dee1bb986153a9f1aa1630855..5d982f3447bacf475bfba840497aef41b0df6445 100644
--- a/eraser-base/src/main/java/de/tudresden/inf/st/eraser/jastadd/model/MachineLearningHandlerFactory.java
+++ b/eraser-base/src/main/java/de/tudresden/inf/st/eraser/jastadd/model/MachineLearningHandlerFactory.java
@@ -38,4 +38,12 @@ public abstract class MachineLearningHandlerFactory implements MachineLearningSe
     result.setDecoder(createDecoder());
     return result;
   }
+
+  /**
+   * Shuts down this factory, and free held resources, if any.
+   * Subclasses should override the default empty implementation, if needed.
+   */
+  public void shutdown() {
+    // empty by default
+  }
 }
diff --git a/eraser.starter/src/main/java/de/tudresden/inf/st/eraser/starter/EraserStarter.java b/eraser.starter/src/main/java/de/tudresden/inf/st/eraser/starter/EraserStarter.java
index 3e775d2e9a5d54219d280508868883cfbc75f5f9..37b1f52f61e4025b7ec1b3147ca865a431797903 100644
--- a/eraser.starter/src/main/java/de/tudresden/inf/st/eraser/starter/EraserStarter.java
+++ b/eraser.starter/src/main/java/de/tudresden/inf/st/eraser/starter/EraserStarter.java
@@ -209,6 +209,8 @@ public class EraserStarter {
     if (analyze != null) {
       analyze.stop();
     }
+    activityFactory.shutdown();
+    preferenceFactory.shutdown();
     InfluxAdapter influxAdapter = root.getInfluxRoot().influxAdapter();
     if (influxAdapter != null) {
       try {
diff --git a/feedbackloop.learner_backup/src/main/java/de/tudresden/inf/st/eraser/feedbackloop.learner_backup/CsvTransfer.java b/feedbackloop.learner_backup/src/main/java/de/tudresden/inf/st/eraser/feedbackloop.learner_backup/CsvTransfer.java
deleted file mode 100644
index 1c08268d59dd4003149e551d2e3e60895d30e3f6..0000000000000000000000000000000000000000
--- a/feedbackloop.learner_backup/src/main/java/de/tudresden/inf/st/eraser/feedbackloop.learner_backup/CsvTransfer.java
+++ /dev/null
@@ -1,60 +0,0 @@
-package de.tudresden.inf.st.eraser.feedbackloop.learner_backup;
-
-import java.io.*;
-import java.util.*;
-
-import com.opencsv.CSVReader;
-import com.opencsv.CSVWriter;
-
-
-public class CsvTransfer {
-    public static void main(String[] args){
-        Learner learner=new Learner();
-        learner.train("datasets/backup/activity_data.csv","datasets/backup/preference_data.csv");
-    }
-
-    //learner.train("datasets/backup/activity_data.csv","datasets/backup/preference_data.csv");
-    /**private static final String CSV_FILE_PATH
-            = "datasets/backup/activity_data_example.csv";
-    private static final String OUTPUT_FILE_PATH
-            = "datasets/backup/activity_data.csv";
-    public static void main(String[] args)
-    {
-        addDataToCSV(CSV_FILE_PATH, OUTPUT_FILE_PATH);
-    }
-    public static void addDataToCSV(String input, String output)
-    {
-        File input_file = new File(input);
-        File output_file = new File(output);
-        try {
-            // create FileWriter object with file as parameter
-            FileReader reader = new FileReader(input_file);
-            CSVReader csv_reader = new CSVReader(reader);
-            String[] nextRecord;
-            FileWriter writer = new FileWriter(output_file);
-            CSVWriter csv_writer = new CSVWriter(writer, ',',
-                    CSVWriter.NO_QUOTE_CHARACTER,
-                    CSVWriter.DEFAULT_ESCAPE_CHARACTER,
-                    CSVWriter.DEFAULT_LINE_END);
-            List<String[]> data = new ArrayList<String[]>();
-
-            while ((nextRecord = csv_reader.readNext()) != null) {
-                data.add(nextRecord);
-
-                for (String cell : nextRecord) {
-                    System.out.print(cell + "\t");
-                }
-                System.out.println();
-            }
-            csv_writer.writeAll(data);
-            writer.close();
-            csv_reader.close();
-        }
-        catch (Exception e) {
-            // TODO Auto-generated catch block
-            e.printStackTrace();
-        }
-    }*/
-}
-
-
diff --git a/feedbackloop.learner_backup/src/main/java/de/tudresden/inf/st/eraser/feedbackloop.learner_backup/Learner.java b/feedbackloop.learner_backup/src/main/java/de/tudresden/inf/st/eraser/feedbackloop.learner_backup/Learner.java
index 855db2bfaf6574ef5619898098ffc103c3d50e46..c9d33ba6809abbdfce3939c3d4b2951403e9ca79 100644
--- a/feedbackloop.learner_backup/src/main/java/de/tudresden/inf/st/eraser/feedbackloop.learner_backup/Learner.java
+++ b/feedbackloop.learner_backup/src/main/java/de/tudresden/inf/st/eraser/feedbackloop.learner_backup/Learner.java
@@ -3,7 +3,6 @@ package de.tudresden.inf.st.eraser.feedbackloop.learner_backup;
 import org.apache.logging.log4j.LogManager;
 import org.apache.logging.log4j.Logger;
 import org.encog.Encog;
-import org.encog.ml.MLClassification;
 import org.encog.ml.data.MLData;
 import org.encog.ml.data.versatile.NormalizationHelper;
 import org.encog.ml.data.versatile.VersatileMLDataSet;
@@ -36,8 +35,8 @@ public class Learner {
   private EncogModel p_model;
   private NormalizationHelper activity_helper;
   private NormalizationHelper preference_helper;
-  private MLClassification a_best_method;
-  private MLClassification p_best_method;
+  private BasicNetwork a_best_method;
+  private BasicNetwork p_best_method;
   private final Logger logger = LogManager.getLogger(Learner.class);
 
   public Learner() {
@@ -104,21 +103,14 @@ public class Learner {
     preference_helper = p_data.getNormHelper();
   }
 
-  void train(String activity_url, String preference_url) {
-    activity_train(activity_url);
-    preference_train(preference_url);
-    Encog.getInstance().shutdown();
-  }
-
   void activity_train(String activity_csv_url) {
     logger.info("Activity training is beginning ... ...");
     activityDataAnalyser(activity_csv_url);
     a_model.holdBackValidation(0.3, true, 1001);
     a_model.selectTrainingType(a_data);
-    a_best_method = (MLClassification) a_model.crossvalidate(5, true);
+    a_best_method = (BasicNetwork) a_model.crossvalidate(5, true);
     saveEncogModel(save_activity_model_file);
     logger.info("Activity training is finished ... ...");
-    Encog.getInstance().shutdown();
   }
 
   void preference_train(String prefence_csv_url) {
@@ -126,56 +118,29 @@ public class Learner {
     preferenceDataAnalyser(prefence_csv_url);
     p_model.holdBackValidation(0.3, true, 1001);
     p_model.selectTrainingType(p_data);
-    p_best_method = (MLClassification) p_model.crossvalidate(5, true);
+    p_best_method = (BasicNetwork) p_model.crossvalidate(5, true);
     saveEncogModel(save_preference_model_file);
     logger.info("Preference training is finished ... ...");
-    Encog.getInstance().shutdown();
-  }
-
-  String[] predictor(String[] new_data) {
-    String[] preference_data = new String[2];
-    String[] result = new String[3];
-    String[] activity_data = new String[12];
-    for (int i = 0; i < new_data.length; i++) {
-      activity_data[i] = new_data[i];
-    }
-    result[0] = activity_predictor(activity_data);
-    preference_data[0] = result[0];
-    preference_data[1] = new_data[12];
-    // FIXME should be done with array copy
-    String[] tmp = preference_predictor(preference_data);
-    result[1] = tmp[0];
-    result[2] = tmp[1];
-    Encog.getInstance().shutdown();
-    return result;
   }
 
   String activity_predictor(String[] new_data) {
-//    logger.info("Activity predicting ... ...");
     String activity_result;
-    activityDataAnalyser("../datasets/backup/activity_data.csv");
-    BasicNetwork activity_method = (BasicNetwork) loadObject(save_activity_model_file);
     MLData input = activity_helper.allocateInputVector();
     activity_helper.normalizeInputVector(new_data, input.getData(), false);
-    MLData output = activity_method.compute(input);
+    MLData output = a_best_method.compute(input);
     activity_result = activity_helper.denormalizeOutputVectorToString(output)[0];
-    Encog.getInstance().shutdown();
     logger.debug("Activity Predictor result is: {}", activity_result);
     return activity_result;
   }
 
   String[] preference_predictor(String[] new_data) {
-//    logger.info("Preference predicting ... ...");
-    String[] preference_result;
-    preference_result = new String[2];
-    preferenceDataAnalyser("../datasets/backup/preference_data.csv");
-    BasicNetwork preference_method = (BasicNetwork) loadObject(save_preference_model_file);
     MLData input = preference_helper.allocateInputVector();
     preference_helper.normalizeInputVector(new_data, input.getData(), false);
-    MLData output = preference_method.compute(input);
-    preference_result[0] = preference_helper.denormalizeOutputVectorToString(output)[0];
-    preference_result[1] = preference_helper.denormalizeOutputVectorToString(output)[1];
-    Encog.getInstance().shutdown();
+    MLData output = p_best_method.compute(input);
+    String[] preference_result = new String[] {
+      preference_helper.denormalizeOutputVectorToString(output)[0],
+      preference_helper.denormalizeOutputVectorToString(output)[1]
+    };
     logger.debug("Preference Predictor result, Color: {}, brightness: {}",
         Math.round(Float.parseFloat(preference_result[0])), Math.round(Float.parseFloat(preference_result[1])));
     return preference_result;
@@ -187,6 +152,9 @@ public class Learner {
     } else {
       saveObject(modelFile, this.p_best_method);
     }
+  }
 
+  void shutdown() {
+    Encog.getInstance().shutdown();
   }
 }
diff --git a/feedbackloop.learner_backup/src/main/java/de/tudresden/inf/st/eraser/feedbackloop.learner_backup/MachineLearningHandlerFactoryImpl.java b/feedbackloop.learner_backup/src/main/java/de/tudresden/inf/st/eraser/feedbackloop.learner_backup/MachineLearningHandlerFactoryImpl.java
index 6b487d6f6d5becc53da3f9b98cf2d3c514b81b6b..3d4500e5d1005b84f3b4dc0fff19e8e2f170ad91 100644
--- a/feedbackloop.learner_backup/src/main/java/de/tudresden/inf/st/eraser/feedbackloop.learner_backup/MachineLearningHandlerFactoryImpl.java
+++ b/feedbackloop.learner_backup/src/main/java/de/tudresden/inf/st/eraser/feedbackloop.learner_backup/MachineLearningHandlerFactoryImpl.java
@@ -43,4 +43,8 @@ public class MachineLearningHandlerFactoryImpl extends MachineLearningHandlerFac
   public MachineLearningDecoder createDecoder() {
     return handler;
   }
+
+  public void shutdown() {
+    learner.shutdown();
+  }
 }
diff --git a/feedbackloop.learner_backup/src/main/java/de/tudresden/inf/st/eraser/feedbackloop.learner_backup/Main.java b/feedbackloop.learner_backup/src/main/java/de/tudresden/inf/st/eraser/feedbackloop.learner_backup/Main.java
index 2759c6a8fd8ec2bdb14035e04f72a9041d4c8fcb..ee281c9b5171fe8d2864115fc2e62cfef3f4128d 100644
--- a/feedbackloop.learner_backup/src/main/java/de/tudresden/inf/st/eraser/feedbackloop.learner_backup/Main.java
+++ b/feedbackloop.learner_backup/src/main/java/de/tudresden/inf/st/eraser/feedbackloop.learner_backup/Main.java
@@ -8,134 +8,30 @@ import java.util.Arrays;
 public class Main {
 
   public static void main(String[] args) {
-    /**
-     * new data from KB
-     * */
+    /*
+      new data from KB
+      */
     //ReaderCSV reader = new ReaderCSV("datasets/backup/activity_data.csv","preference");
     //reader.updater();
     //Learner learner=new Learner();
     //learner.preference_train("../datasets/backup/preference_data.csv");
     //learner.train("datasets/backup/activity_data.csv","datasets/backup/preference_data.csv");
     activity_validation_learner();
-    //0.5793968,1.2126632,-4.6244006,-0.030779,0.801127,0.590978,-3.1411927,-0.93373865,-0.31124622,-0.35992432,0.33746338,-0.79608154,dancing
-    /*String[] new_data = new String[12];
-    new_data[0]="0.5793968";
-    new_data[1]="1.2126632";
-    new_data[2]="-4.6244006";
-    new_data[3]="-0.030779";
-    new_data[4]="0.801127";
-    new_data[5]="0.590978";
-    new_data[6]="-3.1411927";
-    new_data[7]="-0.93373865";
-    new_data[8]="-0.31124622";
-    new_data[9]="-0.35992432";
-    new_data[10]="0.33746338";
-    new_data[11]="-0.79608154";
-
-    String result =learner.activity_predictor(new_data);
-    System.out.println(result);
-
-    String[] new_data_1={result,"medium"};
-    learner.preference_predictor(new_data_1);
-
-    //List k=new ArrayList();
-
-    //k.add(new_data);*/
-
-    //learner.preference_train("datasets/backup/preference_data.csv");
-    //learner.train("datasets/backup/activity_data.csv","datasets/backup/preference_data.csv");
-    //walking,medium,120,70
-    //reading,bright,180,0
-
-    //activity_validation_learner();
-    //0.10654198,8.6574335,4.414908,0.040269,0.516884,0.853285,1.2066777,-1.1444284,9.648633,1.2207031E-4,-0.055358887,0.5834961 working
-    /**String[] new_data = new String[12];
-    new_data[0]="0.010773907";
-    new_data[1]="8.610746";
-    new_data[2]="4.4963107";
-    new_data[3]="0.047136";
-    new_data[4]="0.515427";
-    new_data[5]="0.852877";
-    new_data[6]="0.9720459";
-    new_data[7]="-1.3694834";
-    new_data[8]="9.696517";
-    new_data[9]="-0.0056152344";
-    new_data[10]="-0.049438477";
-    new_data[11]="0.5576782";
-    //0.010773907,8.610746,4.4963107,0.047136,0.515427,0.852877,0.9720459,-1.3694834,9.696517,-0.0056152344,-0.049438477,0.5576782 working
-    //0.9999999988939648,-0.9995820798966354,-0.9999999999999997,-0.9999988062118802,-0.9974031940544938,-1.0
-
-    //String result =learner.activity_predictor(new_data);
-    //System.out.println(result);
-
-    /**String[] new_data_1 =new String[12];
-    //-2.6252422,8.619126,-2.7030537,0.552147,0.5078,0.450302,-8.1881695,-1.2641385,0.038307227,-0.34222412,0.49102783,-0.016540527,walking
-    new_data_1[0]="-2.6252422";
-    new_data_1[1]="8.619126";
-    new_data_1[2]="-2.7030537";
-    new_data_1[3]="0.552147";
-    new_data_1[4]="0.5078";
-    new_data_1[5]="0.450302";
-    new_data_1[6]="-8.1881695";
-    new_data_1[7]="-1.2641385";
-    new_data_1[8]="0.038307227";
-    new_data_1[9]="-0.34222412";
-    new_data_1[10]="0.49102783";
-    new_data_1[11]="-0.016540527";
-    String result1 =learner.activity_predictor(new_data_1);
-    System.out.println(result1);
-    /**
-     * learner.train(activity_csv_url, preference_data_url)
-     * learner.predictor get the result from predictor for new data
-     * */
-    /**String[] new_data_2 = new String[12];
-    //-6.5565214,5.717354,5.6658783,0.185591,0.464146,0.413321,-20.580557,3.8498764,-0.4261679,0.7647095,-0.4713745,0.23999023,dancing
-    new_data_2[0]="-6.5565214";
-    new_data_2[1]="5.717354";
-    new_data_2[2]="5.6658783";
-    new_data_2[3]="0.185591";
-    new_data_2[4]="0.464146";
-    new_data_2[5]="0.413321";
-    new_data_2[6]="-20.580557";
-    new_data_2[7]="3.8498764";
-    new_data_2[8]="-0.4261679";
-    new_data_2[9]="0.7647095";
-    new_data_2[10]="-0.4713745";
-    new_data_2[11]="0.23999023";
-
-    String[] new_data_3 = new String[12];
-    new_data_3[0]="-5.3881507";
-    new_data_3[1]="0.25378537";
-    new_data_3[2]="7.69257";
-    new_data_3[3]="-0.122974";
-    new_data_3[4]="0.247411";
-    new_data_3[5]="0.439031";
-    new_data_3[6]="4.9224787";
-    new_data_3[7]="-10.601525";
-    new_data_3[8]="-4.927267";
-    new_data_3[9]="0.7946167";
-    new_data_3[10]="0.35272217";
-    new_data_3[11]="0.16192627";
-    //"-5.3881507","0.25378537","7.69257","-0.122974","0.247411","0.439031","4.9224787","-10.601525","-4.927267","0.7946167","0.35272217","0.16192627","lying"
-    Learner learner=new Learner();
-    //learner.train("datasets/backup/activity_data.csv", "datasets/preference_data.csv");
-    String[] result = learner.predictor(new_data_3);
-    System.out.println("activity is:" + result[0]);
-    //System.out.println("perference is: "+ result[1]);**/
   }
-  public static void activity_validation_learner(){
+
+  private static void activity_validation_learner() {
     ReadCSV csv = new ReadCSV("../datasets/backup/activity_data.csv", true, CSVFormat.DECIMAL_POINT);
     String[] line = new String[11];
     Learner learner = new Learner();
-    learner.train("../datasets/backup/activity_data.csv","../datasets/backup/preference_data.csv");
-    int wrong=0;
-    int right=0;
-    int i =0;
-    while(csv.next()) {
-      if(i==0){
+    learner.activity_train("../datasets/backup/activity_data.csv");
+    learner.preference_train("../datasets/backup/preference_data.csv");
+    int wrong = 0;
+    int right = 0;
+    int i = 0;
+    while (csv.next()) {
+      if (i == 0) {
         i++;
-
-      }else {
+      } else {
         StringBuilder result = new StringBuilder();
         line[0] = csv.get(0);
         line[1] = csv.get(1);
@@ -150,27 +46,28 @@ public class Main {
         line[10] = csv.get(10);
         //line[11] = csv.get(11);
         String correct = csv.get(11);
-        String irisChosen = learner.predictor(line)[0];
+        String irisChosen = learner.activity_predictor(line);
         result.append(Arrays.toString(line));
         result.append(" -> predicted: ");
         result.append(irisChosen);
         result.append("(correct: ");
         result.append(correct);
         result.append(")");
-        if (irisChosen.equals(correct)!=true){
+        if (!irisChosen.equals(correct)) {
           System.out.println(correct);
           System.out.println(irisChosen);
           ++wrong;
-        }else{
+        } else {
           ++right;
         }
         System.out.println(result.toString());
       }
-      System.out.println("wrong number"+wrong);
-      System.out.println("right number"+right);}
-
+      System.out.println("wrong number" + wrong);
+      System.out.println("right number" + right);
+    }
 
-      //double validation = (double(right))/(double(wrong+right));
-      //System.out.println("%.2f"+validation);
+    learner.shutdown();
+    //double validation = (double(right))/(double(wrong+right));
+    //System.out.println("%.2f"+validation);
   }
 }
diff --git a/feedbackloop.learner_backup/src/test/java/de/tudresden/inf/st/eraser/feedbackloop/learner_backup/LearnerSubjectUnderTest.java b/feedbackloop.learner_backup/src/test/java/de/tudresden/inf/st/eraser/feedbackloop/learner_backup/LearnerSubjectUnderTest.java
index 2b6fbb167456d14f5045d10ab5c0eee01a0ad69f..5743f0a94f79a234e063a26771b4069546cd5975 100644
--- a/feedbackloop.learner_backup/src/test/java/de/tudresden/inf/st/eraser/feedbackloop/learner_backup/LearnerSubjectUnderTest.java
+++ b/feedbackloop.learner_backup/src/test/java/de/tudresden/inf/st/eraser/feedbackloop/learner_backup/LearnerSubjectUnderTest.java
@@ -29,4 +29,8 @@ class LearnerSubjectUnderTest {
     encoder = factory.createEncoder();
     decoder = factory.createDecoder();
   }
+
+  void shutdown() {
+    factory.shutdown();
+  }
 }
diff --git a/feedbackloop.learner_backup/src/test/java/de/tudresden/inf/st/eraser/feedbackloop/learner_backup/LearnerTest.java b/feedbackloop.learner_backup/src/test/java/de/tudresden/inf/st/eraser/feedbackloop/learner_backup/LearnerTest.java
index e81b04345dcc54c715864d8ca2063ad4a24a0834..b82c6d3fdd9a84af22a44a9052bd60b3c25234a0 100644
--- a/feedbackloop.learner_backup/src/test/java/de/tudresden/inf/st/eraser/feedbackloop/learner_backup/LearnerTest.java
+++ b/feedbackloop.learner_backup/src/test/java/de/tudresden/inf/st/eraser/feedbackloop/learner_backup/LearnerTest.java
@@ -1,9 +1,8 @@
 package de.tudresden.inf.st.eraser.feedbackloop.learner_backup;
 
 import de.tudresden.inf.st.eraser.jastadd.model.*;
-import org.junit.Before;
-import org.junit.BeforeClass;
-import org.junit.Test;
+import org.encog.Encog;
+import org.junit.*;
 
 import java.net.MalformedURLException;
 import java.net.URL;
@@ -76,4 +75,9 @@ public class LearnerTest {
         PREFERENCE_LEARNING, true);
   }
 
+  @After
+  public void shutdownLearner() {
+    sut.shutdown();
+  }
+
 }