diff --git a/samoa-api/src/main/java/org/apache/samoa/learners/classifiers/ensemble/AdaptiveBagging.java b/samoa-api/src/main/java/org/apache/samoa/learners/classifiers/ensemble/AdaptiveBagging.java
index 6680862..b92ab8a 100644
--- a/samoa-api/src/main/java/org/apache/samoa/learners/classifiers/ensemble/AdaptiveBagging.java
+++ b/samoa-api/src/main/java/org/apache/samoa/learners/classifiers/ensemble/AdaptiveBagging.java
@@ -67,9 +67,6 @@
   /** The distributor processor. */
   private BaggingDistributorProcessor distributorP;
 
-  /** The input streams for the ensemble, one per member. */
-  private Stream[] ensembleStreams;
-  
   /** The result stream. */
   protected Stream resultStream;
 
@@ -117,7 +114,8 @@
       }
     }
 
-    ensembleStreams = new Stream[ensembleSize];
+    /* The input streams for the ensemble, one per member. */
+    Stream[] ensembleStreams = new Stream[ensembleSize];
     for (int i = 0; i < ensembleSize; i++) {
       ensembleStreams[i] = builder.createStream(distributorP);
       builder.connectInputShuffleStream(ensembleStreams[i], ensemble[i].getInputProcessor()); // connect streams one-to-one with ensemble members (the type of connection does not matter)
diff --git a/samoa-api/src/main/java/org/apache/samoa/learners/classifiers/ensemble/Boosting.java b/samoa-api/src/main/java/org/apache/samoa/learners/classifiers/ensemble/Boosting.java
index 6512028..eac3d88 100644
--- a/samoa-api/src/main/java/org/apache/samoa/learners/classifiers/ensemble/Boosting.java
+++ b/samoa-api/src/main/java/org/apache/samoa/learners/classifiers/ensemble/Boosting.java
@@ -104,9 +104,6 @@
     Stream predictionStream = this.builder.createStream(distributorP);
     this.builder.connectInputKeyStream(predictionStream, classifier.getInputProcessor());
 
-//    distributorP.setOutputStream(testingStream);
-//    distributorP.setPredictionStream(predictionStream);
-
     // Addition to Bagging: stream to train
     /* The training stream. */
     Stream trainingStream = this.builder.createStream(predictionCombinerP);
diff --git a/samoa-api/src/main/java/org/apache/samoa/learners/classifiers/rules/centralized/AMRulesRegressorProcessor.java b/samoa-api/src/main/java/org/apache/samoa/learners/classifiers/rules/centralized/AMRulesRegressorProcessor.java
index 55f0064..685e2f9 100644
--- a/samoa-api/src/main/java/org/apache/samoa/learners/classifiers/rules/centralized/AMRulesRegressorProcessor.java
+++ b/samoa-api/src/main/java/org/apache/samoa/learners/classifiers/rules/centralized/AMRulesRegressorProcessor.java
@@ -163,7 +163,7 @@
     int numberOfRulesCovering = 0;
 
     for (ActiveRule rule : ruleSet) {
-      if (rule.isCovering(instance) == true) {
+      if (rule.isCovering(instance)) {
         numberOfRulesCovering++;
         double[] vote = rule.getPrediction(instance);
         double error = rule.getCurrentError();
@@ -179,9 +179,8 @@
       double error = defaultRule.getCurrentError();
       errorWeightedVote.addVote(vote, error);
     }
-    double[] weightedVote = errorWeightedVote.computeWeightedVote();
 
-    return weightedVote;
+    return errorWeightedVote.computeWeightedVote();
   }
 
   public ErrorWeightedVote newErrorWeightedVote() {
@@ -223,13 +222,13 @@
     Iterator<ActiveRule> ruleIterator = this.ruleSet.iterator();
     while (ruleIterator.hasNext()) {
       ActiveRule rule = ruleIterator.next();
-      if (rule.isCovering(instance) == true) {
+      if (rule.isCovering(instance)) {
         rulesCoveringInstance = true;
-        if (isAnomaly(instance, rule) == false) {
+        if (!isAnomaly(instance, rule)) {
           // Update Change Detection Tests
           double error = rule.computeError(instance); // Use adaptive mode error
           boolean changeDetected = ((RuleActiveRegressionNode) rule.getLearningNode()).updateChangeDetection(error);
-          if (changeDetected == true) {
+          if (changeDetected) {
             ruleIterator.remove();
           } else {
             rule.updateStatistics(instance);
@@ -245,10 +244,10 @@
       }
     }
 
-    if (rulesCoveringInstance == false) {
+    if (!rulesCoveringInstance) {
       defaultRule.updateStatistics(instance);
       if (defaultRule.getInstancesSeen() % this.gracePeriod == 0.0) {
-        if (defaultRule.tryToExpand(this.splitConfidence, this.tieThreshold) == true) {
+        if (defaultRule.tryToExpand(this.splitConfidence, this.tieThreshold)) {
           ActiveRule newDefaultRule = newRule(defaultRule.getRuleNumberID(),
               (RuleActiveRegressionNode) defaultRule.getLearningNode(),
               ((RuleActiveRegressionNode) defaultRule.getLearningNode()).getStatisticsOtherBranchSplit()); // other branch
@@ -274,7 +273,7 @@
     // AMRUles is equipped with anomaly detection. If on, compute the anomaly
     // value.
     boolean isAnomaly = false;
-    if (this.noAnomalyDetection == false) {
+    if (!this.noAnomalyDetection) {
       if (rule.getInstancesSeen() >= this.anomalyNumInstThreshold) {
         isAnomaly = rule.isAnomaly(instance,
             this.univariateAnomalyprobabilityThreshold,
@@ -308,19 +307,19 @@
         }
       }
     }
-    if (statistics != null && ((RuleActiveRegressionNode) r.getLearningNode()).getTargetMean() != null)
+    if (statistics != null && (r.getLearningNode()).getTargetMean() != null)
     {
       double mean;
       if (statistics[0] > 0) {
         mean = statistics[1] / statistics[0];
-        ((RuleActiveRegressionNode) r.getLearningNode()).getTargetMean().reset(mean, (long) statistics[0]);
+        (r.getLearningNode()).getTargetMean().reset(mean, (long) statistics[0]);
       }
     }
     return r;
   }
 
   private ActiveRule newRule(int ID) {
-    ActiveRule r = new ActiveRule.Builder().
+    return new ActiveRule.Builder().
         threshold(this.pageHinckleyThreshold).
         alpha(this.pageHinckleyAlpha).
         changeDetection(this.driftDetection).
@@ -329,7 +328,6 @@
         learningRatio(this.learningRatio).
         numericObserver(numericObserver).
         id(ID).build();
-    return r;
   }
 
   /*
@@ -342,7 +340,7 @@
     this.ruleNumberID = 0;
     this.defaultRule = newRule(++this.ruleNumberID);
 
-    this.ruleSet = new LinkedList<ActiveRule>();
+    this.ruleSet = new LinkedList<>();
   }
 
   /*
diff --git a/samoa-api/src/main/java/org/apache/samoa/learners/classifiers/rules/common/ActiveRule.java b/samoa-api/src/main/java/org/apache/samoa/learners/classifiers/rules/common/ActiveRule.java
index d233af0..871cdd7 100644
--- a/samoa-api/src/main/java/org/apache/samoa/learners/classifiers/rules/common/ActiveRule.java
+++ b/samoa-api/src/main/java/org/apache/samoa/learners/classifiers/rules/common/ActiveRule.java
@@ -38,8 +38,6 @@
 
   private static final long serialVersionUID = 1L;
 
-  private double[] statisticsOtherBranchSplit;
-
   private Builder builder;
 
   private RuleActiveRegressionNode learningNode;
@@ -89,10 +87,6 @@
     this.learningNode = (RuleActiveRegressionNode) learningNode;
   }
 
-  public double[] statisticsOtherBranchSplit() {
-    return this.statisticsOtherBranchSplit;
-  }
-
   public RuleSplitNode getLastUpdatedRuleSplitNode() {
     return this.lastUpdatedRuleSplitNode;
   }
@@ -104,7 +98,6 @@
 
     private static final long serialVersionUID = 1712887264918475622L;
     protected boolean changeDetection;
-    protected boolean usePerceptron;
     protected double threshold;
     protected double alpha;
     protected int predictionFunction;
@@ -115,8 +108,6 @@
 
     protected FIMTDDNumericAttributeClassLimitObserver numericObserver;
 
-    protected double lastTargetMean;
-
     public int id;
 
     public Builder() {
@@ -182,8 +173,7 @@
    */
   public boolean tryToExpand(double splitConfidence, double tieThreshold) {
 
-    boolean shouldSplit = this.learningNode.tryToExpand(splitConfidence, tieThreshold);
-    return shouldSplit;
+    return this.learningNode.tryToExpand(splitConfidence, tieThreshold);
 
   }
 
diff --git a/samoa-api/src/main/java/org/apache/samoa/learners/classifiers/rules/distributed/AMRLearnerProcessor.java b/samoa-api/src/main/java/org/apache/samoa/learners/classifiers/rules/distributed/AMRLearnerProcessor.java
index a718945..06a319c 100644
--- a/samoa-api/src/main/java/org/apache/samoa/learners/classifiers/rules/distributed/AMRLearnerProcessor.java
+++ b/samoa-api/src/main/java/org/apache/samoa/learners/classifiers/rules/distributed/AMRLearnerProcessor.java
@@ -50,10 +50,7 @@
 	 */
   private static final long serialVersionUID = -2302897295090248013L;
 
-  private static final Logger logger =
-      LoggerFactory.getLogger(AMRLearnerProcessor.class);
-
-  private int processorId;
+  private static final Logger logger = LoggerFactory.getLogger(AMRLearnerProcessor.class);
 
   private transient List<ActiveRule> ruleSet;
 
@@ -105,10 +102,10 @@
       ActiveRule rule = ruleIterator.next();
       if (rule.getRuleNumberID() == ruleID) {
         // Check (again) for coverage
-        if (rule.isCovering(instance) == true) {
+        if (rule.isCovering(instance)) {
           double error = rule.computeError(instance); // Use adaptive mode error
           boolean changeDetected = ((RuleActiveRegressionNode) rule.getLearningNode()).updateChangeDetection(error);
-          if (changeDetected == true) {
+          if (changeDetected) {
             ruleIterator.remove();
 
             this.sendRemoveRuleEvent(ruleID);
@@ -137,7 +134,7 @@
     // AMRUles is equipped with anomaly detection. If on, compute the anomaly
     // value.
     boolean isAnomaly = false;
-    if (this.noAnomalyDetection == false) {
+    if (!this.noAnomalyDetection) {
       if (rule.getInstancesSeen() >= this.anomalyNumInstThreshold) {
         isAnomaly = rule.isAnomaly(instance,
             this.univariateAnomalyprobabilityThreshold,
@@ -167,8 +164,7 @@
 
   @Override
   public void onCreate(int id) {
-    this.processorId = id;
-    this.ruleSet = new LinkedList<ActiveRule>();
+    this.ruleSet = new LinkedList<>();
   }
 
   @Override
diff --git a/samoa-api/src/main/java/org/apache/samoa/learners/classifiers/rules/distributed/AMRulesStatisticsProcessor.java b/samoa-api/src/main/java/org/apache/samoa/learners/classifiers/rules/distributed/AMRulesStatisticsProcessor.java
index 86fae3c..0b6fa80 100644
--- a/samoa-api/src/main/java/org/apache/samoa/learners/classifiers/rules/distributed/AMRulesStatisticsProcessor.java
+++ b/samoa-api/src/main/java/org/apache/samoa/learners/classifiers/rules/distributed/AMRulesStatisticsProcessor.java
@@ -49,10 +49,7 @@
 	 */
   private static final long serialVersionUID = 5268933189695395573L;
 
-  private static final Logger logger =
-      LoggerFactory.getLogger(AMRulesStatisticsProcessor.class);
-
-  private int processorId;
+  private static final Logger logger = LoggerFactory.getLogger(AMRulesStatisticsProcessor.class);
 
   private transient List<ActiveRule> ruleSet;
 
@@ -98,10 +95,10 @@
       if (rule.getRuleNumberID() == ruleID) {
         // Check (again) for coverage
         // Skip anomaly check as Aggregator's perceptron should be well-updated
-        if (rule.isCovering(instance) == true) {
+        if (rule.isCovering(instance)) {
           double error = rule.computeError(instance); // Use adaptive mode error
           boolean changeDetected = ((RuleActiveRegressionNode) rule.getLearningNode()).updateChangeDetection(error);
-          if (changeDetected == true) {
+          if (changeDetected) {
             ruleIterator.remove();
 
             this.sendRemoveRuleEvent(ruleID);
@@ -143,8 +140,7 @@
 
   @Override
   public void onCreate(int id) {
-    this.processorId = id;
-    this.ruleSet = new LinkedList<ActiveRule>();
+    this.ruleSet = new LinkedList<>();
   }
 
   @Override
diff --git a/samoa-api/src/main/java/org/apache/samoa/learners/clusterers/LocalClustererProcessor.java b/samoa-api/src/main/java/org/apache/samoa/learners/clusterers/LocalClustererProcessor.java
index 163184f..c7bb1ad 100644
--- a/samoa-api/src/main/java/org/apache/samoa/learners/clusterers/LocalClustererProcessor.java
+++ b/samoa-api/src/main/java/org/apache/samoa/learners/clusterers/LocalClustererProcessor.java
@@ -45,8 +45,7 @@
      *
      */
   private static final long serialVersionUID = -1577910988699148691L;
-  private static final Logger logger = LoggerFactory
-      .getLogger(LocalClustererProcessor.class);
+  private static final Logger logger = LoggerFactory.getLogger(LocalClustererProcessor.class);
   private LocalClustererAdapter model;
   private Stream outputStream;
   private int modelId;
@@ -84,7 +83,7 @@
    * Set the output streams.
    * 
    * @param outputStream
-   *          the new output stream {@link PredictionCombinerPE}.
+   *          the new output stream {@link Stream}.
    */
   public void setOutputStream(Stream outputStream) {
 
diff --git a/samoa-api/src/main/java/org/apache/samoa/learners/clusterers/SingleLearner.java b/samoa-api/src/main/java/org/apache/samoa/learners/clusterers/SingleLearner.java
index f6173f6..e0fa058 100644
--- a/samoa-api/src/main/java/org/apache/samoa/learners/clusterers/SingleLearner.java
+++ b/samoa-api/src/main/java/org/apache/samoa/learners/clusterers/SingleLearner.java
@@ -69,7 +69,7 @@
 
   protected void setLayout() {
     learnerP = new LocalClustererProcessor();
-    LocalClustererAdapter learner = (LocalClustererAdapter) this.learnerOption.getValue();
+    LocalClustererAdapter learner = this.learnerOption.getValue();
     learner.setDataset(this.dataset);
     learnerP.setLearner(learner);
 
@@ -96,7 +96,6 @@
    */
   @Override
   public Set<Stream> getResultStreams() {
-    Set<Stream> streams = ImmutableSet.of(this.resultStream);
-    return streams;
+    return ImmutableSet.of(this.resultStream);
   }
 }
diff --git a/samoa-api/src/main/java/org/apache/samoa/moa/cluster/Miniball.java b/samoa-api/src/main/java/org/apache/samoa/moa/cluster/Miniball.java
index da2a0e5..3dcdc5f 100644
--- a/samoa-api/src/main/java/org/apache/samoa/moa/cluster/Miniball.java
+++ b/samoa-api/src/main/java/org/apache/samoa/moa/cluster/Miniball.java
@@ -20,7 +20,6 @@
  * #L%
  */
 
-import com.dreizak.miniball.model.ArrayPointSet;
 import com.dreizak.miniball.model.PointSet;
 import java.util.ArrayList;
 import java.util.List;
@@ -62,7 +61,7 @@
 
     public PointStorage(int dimension) {
       this.dimension = dimension;
-      this.L = new ArrayList<double[]>();
+      this.L = new ArrayList<>();
     }
 
     public void add(double[] array) {
diff --git a/samoa-api/src/main/java/org/apache/samoa/moa/clusterers/AbstractClusterer.java b/samoa-api/src/main/java/org/apache/samoa/moa/clusterers/AbstractClusterer.java
index 02a5191..da77d04 100644
--- a/samoa-api/src/main/java/org/apache/samoa/moa/clusterers/AbstractClusterer.java
+++ b/samoa-api/src/main/java/org/apache/samoa/moa/clusterers/AbstractClusterer.java
@@ -20,6 +20,7 @@
  * #L%
  */
 
+import java.util.Collections;
 import java.util.LinkedList;
 import java.util.List;
 import java.util.Random;
@@ -134,21 +135,19 @@
   }
 
   public Measurement[] getModelMeasurements() {
-    List<Measurement> measurementList = new LinkedList<Measurement>();
+    List<Measurement> measurementList = new LinkedList<>();
     measurementList.add(new Measurement("model training instances",
         trainingWeightSeenByModel()));
     measurementList.add(new Measurement("model serialized size (bytes)",
         measureByteSize()));
     Measurement[] modelMeasurements = getModelMeasurementsImpl();
     if (modelMeasurements != null) {
-      for (Measurement measurement : modelMeasurements) {
-        measurementList.add(measurement);
-      }
+      Collections.addAll(measurementList, modelMeasurements);
     }
     // add average of sub-model measurements
     Clusterer[] subModels = getSubClusterers();
     if ((subModels != null) && (subModels.length > 0)) {
-      List<Measurement[]> subMeasurements = new LinkedList<Measurement[]>();
+      List<Measurement[]> subMeasurements = new LinkedList<>();
       for (Clusterer subModel : subModels) {
         if (subModel != null) {
           subMeasurements.add(subModel.getModelMeasurements());
@@ -157,9 +156,7 @@
       Measurement[] avgMeasurements = Measurement
           .averageMeasurements(subMeasurements
               .toArray(new Measurement[subMeasurements.size()][]));
-      for (Measurement measurement : avgMeasurements) {
-        measurementList.add(measurement);
-      }
+      Collections.addAll(measurementList, avgMeasurements);
     }
     return measurementList.toArray(new Measurement[measurementList.size()]);
   }
@@ -295,5 +292,5 @@
 
   public Clustering getMicroClusteringResult() {
     return null;
-  };
+  }
 }
diff --git a/samoa-api/src/main/java/org/apache/samoa/moa/clusterers/ClusterGenerator.java b/samoa-api/src/main/java/org/apache/samoa/moa/clusterers/ClusterGenerator.java
index b9f80b5..06c9cff 100644
--- a/samoa-api/src/main/java/org/apache/samoa/moa/clusterers/ClusterGenerator.java
+++ b/samoa-api/src/main/java/org/apache/samoa/moa/clusterers/ClusterGenerator.java
@@ -58,7 +58,6 @@
   public FloatOption clusterAddOption = new FloatOption("clusterAdd", 'A',
       "Adds additional clusters.", 0, 0, 1);
 
-  private static double err_intervall_width = 0.0;
   private ArrayList<DataPoint> points;
   private int instanceCounter;
   private int windowCounter;
@@ -67,7 +66,7 @@
 
   @Override
   public void resetLearningImpl() {
-    points = new ArrayList<DataPoint>();
+    points = new ArrayList<>();
     instanceCounter = 0;
     windowCounter = 0;
     random = new Random(227);
@@ -169,8 +168,9 @@
       double radius = sourceCluster.getRadius();
 
       // move cluster center
+      double err_interval_width = 0.0;
       if (errLevelPosition > 0) {
-        double errOffset = random.nextDouble() * err_intervall_width / 2.0;
+        double errOffset = random.nextDouble() * err_interval_width / 2.0;
         double errOffsetDirection = ((random.nextBoolean()) ? 1 : -1);
         double level = errLevelPosition + errOffsetDirection * errOffset;
         double[] vector = new double[center.length];
@@ -203,20 +203,15 @@
         }
         center = newCenter;
         for (int d = 0; d < center.length; d++) {
-          if (newCenter[d] >= 0 && newCenter[d] <= 1) {
-          }
-          else {
-            System.out
-                .println("This shouldnt have happend, Cluster center out of bounds:" + Arrays.toString(newCenter));
+          if (newCenter[d] < 0 || newCenter[d] > 1) {
+            System.out.println("This shouldnt have happend, Cluster center out of bounds:" + Arrays.toString(newCenter));
           }
         }
-        // System.out.println("new Center "+Arrays.toString(newCenter));
-
       }
 
       // alter radius
       if (errLevelRadiusDecrease > 0 || errLevelRadiusIncrease > 0) {
-        double errOffset = random.nextDouble() * err_intervall_width / 2.0;
+        double errOffset = random.nextDouble() * err_interval_width / 2.0;
         int errOffsetDirection = ((random.nextBoolean()) ? 1 : -1);
 
         if (errLevelRadiusDecrease > 0 && (errLevelRadiusIncrease == 0 || random.nextBoolean())) {
@@ -289,9 +284,7 @@
       for (int c1 = 0; c1 < clustering.size(); c1++) {
         SphereCluster sc1 = (SphereCluster) clustering.get(c1);
         double minDist = Double.MAX_VALUE;
-        double minOver = 1;
-        int maxindexCon = -1;
-        int maxindexOver = -1;
+        int maxIndexCon = -1;
         for (int c2 = 0; c2 < clustering.size(); c2++) {
           SphereCluster sc2 = (SphereCluster) clustering.get(c2);
           // double over = sc1.overlapRadiusDegree(sc2);
@@ -303,14 +296,11 @@
           double threshold = Math.min(sc1.getRadius(), sc2.getRadius()) * radiusFactor;
           if (dist > 0 && dist < minDist && dist < threshold) {
             minDist = dist;
-            maxindexCon = c2;
+            maxIndexCon = c2;
           }
         }
-        int maxindex = -1;
-        if (maxindexOver != -1)
-          maxindex = maxindexOver;
-        else
-          maxindex = maxindexCon;
+        int maxindex;
+        maxindex = maxIndexCon;
 
         if (maxindex != -1 && !merged[c1]) {
           merged[c1] = true;
diff --git a/samoa-api/src/main/java/org/apache/samoa/moa/evaluation/LearningCurve.java b/samoa-api/src/main/java/org/apache/samoa/moa/evaluation/LearningCurve.java
index dcc4f50..e4bdb82 100644
--- a/samoa-api/src/main/java/org/apache/samoa/moa/evaluation/LearningCurve.java
+++ b/samoa-api/src/main/java/org/apache/samoa/moa/evaluation/LearningCurve.java
@@ -39,11 +39,11 @@
 
   private static final long serialVersionUID = 1L;
 
-  protected List<String> measurementNames = new ArrayList<String>();
+  protected List<String> measurementNames = new ArrayList<>();
 
-  protected List<String> voteNames = new ArrayList<String>();
+  protected List<String> voteNames = new ArrayList<>();
 
-  protected List<double[]> measurementValues = new ArrayList<double[]>();
+  protected List<double[]> measurementValues = new ArrayList<>();
 
   protected List<String> voteValues = new ArrayList<String>();
 
@@ -154,7 +154,7 @@
   /**
    * This method is used to set generate header line of a text file containing predictions and votes (for classification
    * only)
-   * 
+   *
    * @return String This returns the text of the header of a file containing predictions and votes.
    */
   public String voteHeaderToString() {
@@ -174,7 +174,7 @@
   /**
    * This method is used to set generate one body line of a text file containing predictions and votes (for
    * classification only)
-   * 
+   *
    * @return String This returns the text of one line of a file containing predictions and votes.
    */
   public String voteEntryToString() {
diff --git a/samoa-api/src/main/java/org/apache/samoa/moa/evaluation/LearningEvaluation.java b/samoa-api/src/main/java/org/apache/samoa/moa/evaluation/LearningEvaluation.java
index 993667d..3389fda 100644
--- a/samoa-api/src/main/java/org/apache/samoa/moa/evaluation/LearningEvaluation.java
+++ b/samoa-api/src/main/java/org/apache/samoa/moa/evaluation/LearningEvaluation.java
@@ -46,7 +46,7 @@
 
   public LearningEvaluation(Measurement[] evaluationMeasurements,
       LearningPerformanceEvaluator cpe, Learner model) {
-    List<Measurement> measurementList = new LinkedList<Measurement>();
+    List<Measurement> measurementList = new LinkedList<>();
     measurementList.addAll(Arrays.asList(evaluationMeasurements));
     measurementList.addAll(Arrays.asList(cpe.getPerformanceMeasurements()));
     measurementList.addAll(Arrays.asList(model.getModelMeasurements()));
diff --git a/samoa-api/src/main/java/org/apache/samoa/moa/evaluation/MembershipMatrix.java b/samoa-api/src/main/java/org/apache/samoa/moa/evaluation/MembershipMatrix.java
index 4387c04..3510b4d 100644
--- a/samoa-api/src/main/java/org/apache/samoa/moa/evaluation/MembershipMatrix.java
+++ b/samoa-api/src/main/java/org/apache/samoa/moa/evaluation/MembershipMatrix.java
@@ -35,7 +35,7 @@
   int total_entries;
   int class_distribution[];
   int total_class_entries;
-  int initalBuildTimestamp = -1;
+  int initialBuildTimestamp = -1;
 
   public MembershipMatrix(Clustering foundClustering, ArrayList<DataPoint> points) {
     classmap = Clustering.classValues(points);
@@ -50,13 +50,13 @@
     class_sums = new int[numClasses];
     total_entries = 0;
     total_class_entries = points.size();
-    for (int p = 0; p < points.size(); p++) {
-      int worklabel = classmap.get((int) points.get(p).classValue());
+    for (DataPoint point : points) {
+      int worklabel = classmap.get((int) point.classValue());
       // real class distribution
       class_distribution[worklabel]++;
       boolean covered = false;
       for (int c = 0; c < numCluster - 1; c++) {
-        double prob = foundClustering.get(c).getInclusionProbability(points.get(p));
+        double prob = foundClustering.get(c).getInclusionProbability(point);
         if (prob >= 1) {
           cluster_class_weights[c][worklabel]++;
           class_sums[worklabel]++;
@@ -74,7 +74,7 @@
 
     }
 
-    initalBuildTimestamp = points.get(0).getTimestamp();
+    initialBuildTimestamp = points.get(0).getTimestamp();
   }
 
   public int getClusterClassWeight(int i, int j) {
@@ -119,7 +119,7 @@
 
   @Override
   public String toString() {
-    StringBuffer sb = new StringBuffer();
+    StringBuilder sb = new StringBuilder();
     sb.append("Membership Matrix\n");
     for (int i = 0; i < cluster_class_weights.length; i++) {
       for (int j = 0; j < cluster_class_weights[i].length; j++) {
@@ -128,22 +128,22 @@
       sb.append("| " + cluster_sums[i] + "\n");
     }
     // sb.append("-----------\n");
-    for (int i = 0; i < class_sums.length; i++) {
-      sb.append(class_sums[i] + "\t ");
+    for (int class_sum : class_sums) {
+      sb.append(class_sum + "\t ");
     }
     sb.append("| " + total_entries + "\n");
 
     sb.append("Real class distribution \n");
-    for (int i = 0; i < class_distribution.length; i++) {
-      sb.append(class_distribution[i] + "\t ");
+    for (int aClass_distribution : class_distribution) {
+      sb.append(aClass_distribution + "\t ");
     }
     sb.append("| " + total_class_entries + "\n");
 
     return sb.toString();
   }
 
-  public int getInitalBuildTimestamp() {
-    return initalBuildTimestamp;
+  public int getInitialBuildTimestamp() {
+    return initialBuildTimestamp;
   }
 
 }
diff --git a/samoa-api/src/main/java/org/apache/samoa/streams/clustering/RandomRBFGeneratorEvents.java b/samoa-api/src/main/java/org/apache/samoa/streams/clustering/RandomRBFGeneratorEvents.java
index 139b8f7..5fe70ea 100644
--- a/samoa-api/src/main/java/org/apache/samoa/streams/clustering/RandomRBFGeneratorEvents.java
+++ b/samoa-api/src/main/java/org/apache/samoa/streams/clustering/RandomRBFGeneratorEvents.java
@@ -37,7 +37,6 @@
 import org.apache.samoa.moa.cluster.SphereCluster;
 import org.apache.samoa.moa.core.AutoExpandVector;
 import org.apache.samoa.moa.core.DataPoint;
-import org.apache.samoa.moa.core.FastVector;
 import org.apache.samoa.moa.core.InstanceExample;
 import org.apache.samoa.moa.core.ObjectRepository;
 import org.apache.samoa.moa.tasks.TaskMonitor;
@@ -48,7 +47,7 @@
 import com.github.javacliparser.IntOption;
 
 public class RandomRBFGeneratorEvents extends ClusteringStream {
-  private transient Vector listeners;
+  private transient Vector<ClusterEventListener> listeners;
 
   private static final long serialVersionUID = 1L;
 
@@ -135,10 +134,10 @@
     int currentMovementSteps;
     boolean isSplitting = false;
 
-    LinkedList<DataPoint> points = new LinkedList<DataPoint>();
-    ArrayList<SphereCluster> microClusters = new ArrayList<SphereCluster>();
-    ArrayList<ArrayList<DataPoint>> microClustersPoints = new ArrayList();
-    ArrayList<Integer> microClustersDecay = new ArrayList();
+    LinkedList<DataPoint> points = new LinkedList<>();
+    ArrayList<SphereCluster> microClusters = new ArrayList<>();
+    ArrayList<ArrayList<DataPoint>> microClustersPoints = new ArrayList<>();
+    ArrayList<Integer> microClustersDecay = new ArrayList<>();
 
     public GeneratorCluster(int label) {
       boolean outofbounds = true;
@@ -230,8 +229,7 @@
       int minMicroIndex = -1;
       double minHullDist = Double.MAX_VALUE;
       boolean inserted = false;
-      // we favour more recently build clusters so we can remove earlier cluster
-      // sooner
+      // we favour more recently build clusters so we can remove earlier cluster sooner
       for (int m = microClusters.size() - 1; m >= 0; m--) {
         SphereCluster micro = microClusters.get(m);
         double hulldist = micro.getCenterDistance(point) - micro.getRadius();
@@ -251,49 +249,25 @@
         }
       }
       // Reseting index choice for alternative cluster building
-      int alt = 1;
-      if (alt == 1)
-        minMicroIndex = -1;
       if (!inserted) {
         // add to closest cluster and expand cluster
-        if (minMicroIndex != -1) {
-          microClustersPoints.get(minMicroIndex).add(point);
-          // we should keep the miniball instances and just check in
-          // new points instead of rebuilding the whole thing
-          SphereCluster s = new SphereCluster(microClustersPoints.get(minMicroIndex), numAttsOption.getValue());
-          // check if current microcluster is bigger then generating cluster
-          if (s.getRadius() > generator.getRadius()) {
-            // remove previously added point
-            microClustersPoints.get(minMicroIndex).remove(microClustersPoints.get(minMicroIndex).size() - 1);
-            minMicroIndex = -1;
-          }
-          else {
-            microClusters.set(minMicroIndex, s);
-            microClustersDecay.set(minMicroIndex, numGeneratedInstances);
-          }
-        }
         // minMicroIndex might have been reset above
         // create new micro cluster
-        if (minMicroIndex == -1) {
-          ArrayList<DataPoint> microPoints = new ArrayList<DataPoint>();
-          microPoints.add(point);
-          SphereCluster s;
-          if (alt == 0)
-            s = new SphereCluster(microPoints, numAttsOption.getValue());
-          else
-            s = new SphereCluster(generator.getCenter(), generator.getRadius(), 1);
+        ArrayList<DataPoint> microPoints = new ArrayList<>();
+        microPoints.add(point);
+        SphereCluster s;
+        s = new SphereCluster(generator.getCenter(), generator.getRadius(), 1);
 
-          microClusters.add(s);
-          microClustersPoints.add(microPoints);
-          microClustersDecay.add(numGeneratedInstances);
-          int id = 0;
-          while (id < kernels.size()) {
-            if (kernels.get(id) == this)
-              break;
-            id++;
-          }
-          s.setGroundTruth(id);
+        microClusters.add(s);
+        microClustersPoints.add(microPoints);
+        microClustersDecay.add(numGeneratedInstances);
+        int id = 0;
+        while (id < kernels.size()) {
+          if (kernels.get(id) == this)
+            break;
+          id++;
         }
+        s.setGroundTruth(id);
       }
 
     }
@@ -301,10 +275,7 @@
     private void move() {
       if (currentMovementSteps < totalMovementSteps) {
         currentMovementSteps++;
-        if (moveVector == null) {
-          return;
-        }
-        else {
+        if (moveVector != null) {
           double[] center = generator.getCenter();
           boolean outofbounds = true;
           while (outofbounds) {
@@ -426,24 +397,17 @@
       double radius = kernelRadiiOption.getValue();
       double avgWeight = 1.0 / numClusterOption.getValue();
       double weight = avgWeight + avgWeight * densityRangeOption.getValue() * instanceRandom.nextDouble();
-      SphereCluster spcluster = null;
+      SphereCluster spcluster;
 
       double[] center = generator.getCenter();
       spcluster = new SphereCluster(center, radius, weight);
 
-      if (spcluster != null) {
-        GeneratorCluster gc = new GeneratorCluster(clusterIdCounter++, spcluster);
-        gc.isSplitting = true;
-        kernels.add(gc);
-        normalizeWeights();
-        numActiveKernels++;
-        return "Split from Kernel " + generator.getId();
-      }
-      else {
-        System.out.println("Tried to split new kernel from C" + generator.getId() +
-            ". Not enough room for new cluster, decrease average radii, number of clusters or enable overlap.");
-        return "";
-      }
+      GeneratorCluster gc = new GeneratorCluster(clusterIdCounter++, spcluster);
+      gc.isSplitting = true;
+      kernels.add(gc);
+      normalizeWeights();
+      numActiveKernels++;
+      return "Split from Kernel " + generator.getId();
     }
 
     private String fadeOut() {
@@ -493,18 +457,18 @@
     numGeneratedInstances = 0;
     clusterIdCounter = 0;
     mergeClusterA = mergeClusterB = null;
-    kernels = new AutoExpandVector<GeneratorCluster>();
+    kernels = new AutoExpandVector<>();
 
     initKernels();
   }
 
   protected void generateHeader() { // 2013/06/02: Noise label
-    ArrayList<Attribute> attributes = new ArrayList<Attribute>();
+    ArrayList<Attribute> attributes = new ArrayList<>();
     for (int i = 0; i < this.numAttsOption.getValue(); i++) {
       attributes.add(new Attribute("att" + (i + 1)));
     }
 
-    ArrayList<String> classLabels = new ArrayList<String>();
+    ArrayList<String> classLabels = new ArrayList<>();
     for (int i = 0; i < this.numClusterOption.getValue(); i++) {
       classLabels.add("class" + (i + 1));
     }
@@ -531,7 +495,7 @@
 
     // make room for the classlabel
     double[] values_new = new double[numAttsOption.getValue()]; // +1
-    double[] values = null;
+    double[] values;
     int clusterChoice = -1;
 
     if (instanceRandom.nextDouble() > noiseLevelOption.getValue()) {
@@ -539,7 +503,7 @@
       values = kernels.get(clusterChoice).generator.sample(instanceRandom).toDoubleArray();
     }
     else {
-      // get ranodm noise point
+      // get random noise point
       values = getNoisePoint();
     }
 
@@ -569,8 +533,8 @@
 
   public Clustering getGeneratingClusters() {
     Clustering clustering = new Clustering();
-    for (int c = 0; c < kernels.size(); c++) {
-      clustering.add(kernels.get(c).generator);
+    for (GeneratorCluster kernel : kernels) {
+      clustering.add(kernel.generator);
     }
     return clustering;
   }
@@ -579,11 +543,11 @@
     Clustering clustering = new Clustering();
     int id = 0;
 
-    for (int c = 0; c < kernels.size(); c++) {
-      for (int m = 0; m < kernels.get(c).microClusters.size(); m++) {
-        kernels.get(c).microClusters.get(m).setId(id);
-        kernels.get(c).microClusters.get(m).setGroundTruth(kernels.get(c).generator.getId());
-        clustering.add(kernels.get(c).microClusters.get(m));
+    for (GeneratorCluster kernel : kernels) {
+      for (int m = 0; m < kernel.microClusters.size(); m++) {
+        kernel.microClusters.get(m).setId(id);
+        kernel.microClusters.get(m).setGroundTruth(kernel.generator.getId());
+        clustering.add(kernel.microClusters.get(m));
         id++;
       }
     }
@@ -595,8 +559,8 @@
   /**************************** EVENTS ******************************************/
   private void eventScheduler() {
 
-    for (int i = 0; i < kernels.size(); i++) {
-      kernels.get(i).updateKernel();
+    for (GeneratorCluster kernel : kernels) {
+      kernel.updateKernel();
     }
 
     nextEventCounter--;
@@ -604,8 +568,8 @@
     // should this be randomized as well???
     if (nextEventCounter % kernelMovePointFrequency == 0) {
       // move kernels
-      for (int i = 0; i < kernels.size(); i++) {
-        kernels.get(i).move();
+      for (GeneratorCluster kernel : kernels) {
+        kernel.move();
         // overlapControl();
       }
     }
@@ -715,8 +679,7 @@
     while (kernels.get(id).kill != -1)
       id = instanceRandom.nextInt(kernels.size());
 
-    String message = kernels.get(id).fadeOut();
-    return message;
+    return kernels.get(id).fadeOut();
   }
 
   private String fadeIn() {
@@ -782,9 +745,7 @@
     while (kernels.get(id).kill != -1)
       id = instanceRandom.nextInt(kernels.size());
 
-    String message = kernels.get(id).splitKernel();
-
-    return message;
+    return kernels.get(id).splitKernel();
   }
 
   private String mergeKernels(int steps) {
@@ -796,10 +757,7 @@
       // System.out.println("DisredDist:"+(2*diseredDist));
       for (int i = 0; i < kernels.size(); i++) {
         for (int j = 0; j < i; j++) {
-          if (kernels.get(i).kill != -1 || kernels.get(j).kill != -1) {
-            continue;
-          }
-          else {
+          if (kernels.get(i).kill == -1 && kernels.get(j).kill == -1) {
             double kernelDist = kernels.get(i).generator.getCenterDistance(kernels.get(j).generator);
             double d = kernelDist - 2 * diseredDist;
             // System.out.println("Dist:"+i+" / "+j+" "+d);
@@ -866,10 +824,10 @@
       incluster = false;
       if (!noiseInClusterOption.isSet() && counter > 0) {
         counter--;
-        for (int c = 0; c < kernels.size(); c++) {
-          for (int m = 0; m < kernels.get(c).microClusters.size(); m++) {
+        for (GeneratorCluster kernel : kernels) {
+          for (int m = 0; m < kernel.microClusters.size(); m++) {
             Instance inst = new DenseInstance(1, sample);
-            if (kernels.get(c).microClusters.get(m).getInclusionProbability(inst) > 0) {
+            if (kernel.microClusters.get(m).getInclusionProbability(inst) > 0) {
               incluster = true;
               break;
             }
@@ -904,11 +862,11 @@
 
   private void normalizeWeights() {
     double sumWeights = 0.0;
-    for (int i = 0; i < kernels.size(); i++) {
-      sumWeights += kernels.get(i).generator.getWeight();
+    for (GeneratorCluster kernel : kernels) {
+      sumWeights += kernel.generator.getWeight();
     }
-    for (int i = 0; i < kernels.size(); i++) {
-      kernels.get(i).generator.setWeight(kernels.get(i).generator.getWeight() / sumWeights);
+    for (GeneratorCluster kernel : kernels) {
+      kernel.generator.setWeight(kernel.generator.getWeight() / sumWeights);
     }
   }
 
@@ -919,14 +877,14 @@
   /** Add a listener */
   synchronized public void addClusterChangeListener(ClusterEventListener l) {
     if (listeners == null)
-      listeners = new Vector();
+      listeners = new Vector<>();
     listeners.addElement(l);
   }
 
   /** Remove a listener */
   synchronized public void removeClusterChangeListener(ClusterEventListener l) {
     if (listeners == null)
-      listeners = new Vector();
+      listeners = new Vector<>();
     listeners.removeElement(l);
   }
 
@@ -940,9 +898,9 @@
 
       // make a copy of the listener list in case
       // anyone adds/removes listeners
-      Vector targets;
+      Vector<ClusterEventListener> targets;
       synchronized (this) {
-        targets = (Vector) listeners.clone();
+        targets = (Vector<ClusterEventListener>) listeners.clone();
       }
 
       // walk through the listener list and
diff --git a/samoa-api/src/main/java/org/apache/samoa/streams/fs/HDFSFileStreamSource.java b/samoa-api/src/main/java/org/apache/samoa/streams/fs/HDFSFileStreamSource.java
index 67d5e79..07050eb 100644
--- a/samoa-api/src/main/java/org/apache/samoa/streams/fs/HDFSFileStreamSource.java
+++ b/samoa-api/src/main/java/org/apache/samoa/streams/fs/HDFSFileStreamSource.java
@@ -40,7 +40,7 @@
 public class HDFSFileStreamSource implements FileStreamSource {
 
   /**
-   * 
+   *
    */
   private static final long serialVersionUID = -3887354805787167400L;
 
@@ -63,7 +63,7 @@
         org.apache.hadoop.hdfs.DistributedFileSystem.class.getName());
     config.set("fs.file.impl",
         org.apache.hadoop.fs.LocalFileSystem.class.getName());
-    this.filePaths = new ArrayList<String>();
+    this.filePaths = new ArrayList<>();
     Path hdfsPath = new Path(path);
     FileSystem fs;
     try {
@@ -72,14 +72,14 @@
       if (fileStat.isDirectory()) {
         Path filterPath = hdfsPath;
         if (ext != null) {
-          filterPath = new Path(path.toString(), "*." + ext);
+          filterPath = new Path(path, "*." + ext);
         } else {
-          filterPath = new Path(path.toString(), "*");
+          filterPath = new Path(path, "*");
         }
         FileStatus[] filesInDir = fs.globStatus(filterPath);
-        for (int i = 0; i < filesInDir.length; i++) {
-          if (filesInDir[i].isFile()) {
-            filePaths.add(filesInDir[i].getPath().toString());
+        for (FileStatus aFilesInDir : filesInDir) {
+          if (aFilesInDir.isFile()) {
+            filePaths.add(aFilesInDir.getPath().toString());
           }
         }
       } else {
diff --git a/samoa-api/src/main/java/org/apache/samoa/streams/fs/LocalFileStreamSource.java b/samoa-api/src/main/java/org/apache/samoa/streams/fs/LocalFileStreamSource.java
index 129d247..addd232 100644
--- a/samoa-api/src/main/java/org/apache/samoa/streams/fs/LocalFileStreamSource.java
+++ b/samoa-api/src/main/java/org/apache/samoa/streams/fs/LocalFileStreamSource.java
@@ -25,7 +25,6 @@
 import java.io.FilenameFilter;
 import java.io.IOException;
 import java.io.InputStream;
-import java.nio.file.FileSystems;
 import java.util.ArrayList;
 import java.util.List;
 
@@ -49,12 +48,12 @@
   }
 
   public void init(String path, String ext) {
-    this.filePaths = new ArrayList<String>();
+    this.filePaths = new ArrayList<>();
     File fileAtPath = new File(path);
     if (fileAtPath.isDirectory()) {
       File[] filesInDir = fileAtPath.listFiles(new FileExtensionFilter(ext));
-      for (int i = 0; i < filesInDir.length; i++) {
-        filePaths.add(filesInDir[i].getAbsolutePath());
+      for (File aFilesInDir : filesInDir) {
+        filePaths.add(aFilesInDir.getAbsolutePath());
       }
     }
     else {
diff --git a/samoa-api/src/main/java/org/apache/samoa/streams/generators/HyperplaneGenerator.java b/samoa-api/src/main/java/org/apache/samoa/streams/generators/HyperplaneGenerator.java
index 8274040..3ac68ce 100644
--- a/samoa-api/src/main/java/org/apache/samoa/streams/generators/HyperplaneGenerator.java
+++ b/samoa-api/src/main/java/org/apache/samoa/streams/generators/HyperplaneGenerator.java
@@ -83,8 +83,6 @@
 
   protected int[] sigma;
 
-  public int numberInstance;
-
   @Override
   protected void prepareForUseImpl(TaskMonitor monitor, ObjectRepository repository) {
     monitor.setCurrentActivity("Preparing hyperplane...", -1.0);
@@ -160,7 +158,7 @@
 
   private void addDrift() {
     for (int i = 0; i < this.numDriftAttsOption.getValue(); i++) {
-      this.weights[i] += (double) ((double) sigma[i]) * ((double) this.magChangeOption.getValue());
+      this.weights[i] += ((double) sigma[i]) * this.magChangeOption.getValue();
       if (// this.weights[i] >= 1.0 || this.weights[i] <= 0.0 ||
       (1 + (this.instanceRandom.nextInt(100))) <= this.sigmaPercentageOption.getValue()) {
         this.sigma[i] *= -1;
diff --git a/samoa-local/src/test/java/org/apache/samoa/AlgosTest.java b/samoa-local/src/test/java/org/apache/samoa/AlgosTest.java
index f621aba..38099a8 100644
--- a/samoa-local/src/test/java/org/apache/samoa/AlgosTest.java
+++ b/samoa-local/src/test/java/org/apache/samoa/AlgosTest.java
@@ -20,7 +20,6 @@
  * #L%
  */
 
-import org.apache.samoa.LocalDoTask;
 import org.junit.Test;
 import org.apache.samoa.TestParams;
 
