diff --git a/Comparison/src/main/java/cz/fidentis/analyst/icp/IcpVisitor.java b/Comparison/src/main/java/cz/fidentis/analyst/icp/IcpVisitor.java
index ad34644bdacba468e57eca70b1c4faddaff2cb9a..617af6773eeca93016133d2f9297467f6609ceb6 100644
--- a/Comparison/src/main/java/cz/fidentis/analyst/icp/IcpVisitor.java
+++ b/Comparison/src/main/java/cz/fidentis/analyst/icp/IcpVisitor.java
@@ -244,7 +244,7 @@ public class IcpVisitor extends MeshVisitor   {
         );
         
         MeshFacet reducedFacet = new ReducedMeshFacet(transformedFacet, reductionStrategy);
-
+        
         int currentIteration = 0;
         IcpTransformation transformation = null;
         
diff --git a/Comparison/src/main/java/cz/fidentis/analyst/icp/NoReductionStrategy.java b/Comparison/src/main/java/cz/fidentis/analyst/icp/NoReductionStrategy.java
index 9f40e79be7766196679677889f4f2e5de32e2277..eaa87eeeb0de264c6341222576f5c71d36e9eace 100644
--- a/Comparison/src/main/java/cz/fidentis/analyst/icp/NoReductionStrategy.java
+++ b/Comparison/src/main/java/cz/fidentis/analyst/icp/NoReductionStrategy.java
@@ -1,7 +1,6 @@
 package cz.fidentis.analyst.icp;
 
 import cz.fidentis.analyst.mesh.core.MeshPoint;
-import java.util.Collection;
 import java.util.List;
 
 /**
diff --git a/Comparison/src/main/java/cz/fidentis/analyst/icp/RandomReductionStrategy.java b/Comparison/src/main/java/cz/fidentis/analyst/icp/RandomReductionStrategy.java
index 7e747d9b129ed214f47ebb7219016ea0ff8b7396..8faed2b750c90c5b0c231bcf9cf72471df96ade0 100644
--- a/Comparison/src/main/java/cz/fidentis/analyst/icp/RandomReductionStrategy.java
+++ b/Comparison/src/main/java/cz/fidentis/analyst/icp/RandomReductionStrategy.java
@@ -2,11 +2,11 @@ package cz.fidentis.analyst.icp;
 
 import cz.fidentis.analyst.mesh.core.MeshPoint;
 import java.util.ArrayList;
-import java.util.Collection;
+import java.util.Arrays;
+import java.util.Collections;
 import java.util.List;
-import java.util.Random;
-import java.util.SortedMap;
-import java.util.TreeMap;
+import java.util.stream.Collectors;
+import java.util.stream.IntStream;
 
 /**
  * Random reduction strategy when the mesh vertices are selected randomly.
@@ -47,14 +47,27 @@ public class RandomReductionStrategy extends ReductionStrategy {
             return meshPoints;
         }
         
-        SortedMap<Integer, MeshPoint> map = new TreeMap<>();
-        for (int i = 0; i < meshPoints.size(); i++) {
-            map.put(i, meshPoints.get(i));
-        }
-        Random rand = new Random();
-        while (map.size() > maxVertices) {
-            map.remove(rand.nextInt(map.size()));
+        
+        // generate randomly ordered indexes:
+        List<Integer> range = IntStream.range(0, meshPoints.size()).boxed().collect(Collectors.toCollection(ArrayList::new));
+        Collections.shuffle(range);
+        
+        if (maxVertices < meshPoints.size()/2) { // copy indices
+            MeshPoint[] array = new MeshPoint[meshPoints.size()];
+            range.stream().limit(maxVertices).forEach(
+                    i -> array[i] = meshPoints.get(i)
+            );
+            return Arrays.stream(array).filter(
+                    p -> p != null
+            ).collect(Collectors.<MeshPoint>toList());
+        } else { // remove indices
+            List<MeshPoint> copy = new ArrayList<>(meshPoints);
+            range.stream().limit(meshPoints.size()-maxVertices).forEach(
+                    i -> copy.set(i, null)
+            );
+            return copy.parallelStream().filter(
+                    p -> p != null
+            ).collect(Collectors.<MeshPoint>toList());
         }
-        return new ArrayList<>(map.values());
     }
 }
diff --git a/Comparison/src/main/java/cz/fidentis/analyst/icp/ReductionStrategy.java b/Comparison/src/main/java/cz/fidentis/analyst/icp/ReductionStrategy.java
index f5fcf9b0357da82407ebe3c56b8c1c2b685f8cd1..78ce7e6a15bddcc1e2f11dd420b689e710a3ad2f 100644
--- a/Comparison/src/main/java/cz/fidentis/analyst/icp/ReductionStrategy.java
+++ b/Comparison/src/main/java/cz/fidentis/analyst/icp/ReductionStrategy.java
@@ -1,7 +1,6 @@
 package cz.fidentis.analyst.icp;
 
 import cz.fidentis.analyst.mesh.core.MeshPoint;
-import java.util.Collection;
 import java.util.List;
 
 /**
diff --git a/GUI/src/main/java/cz/fidentis/analyst/gui/RegistrationGLEventListener.java b/GUI/src/main/java/cz/fidentis/analyst/gui/RegistrationGLEventListener.java
index 7a1d03e250d5812f190af1e2033c6c86efcf2e1d..3f85e98a00a5c02eee02ed6095fb262fb765dde9 100644
--- a/GUI/src/main/java/cz/fidentis/analyst/gui/RegistrationGLEventListener.java
+++ b/GUI/src/main/java/cz/fidentis/analyst/gui/RegistrationGLEventListener.java
@@ -14,9 +14,7 @@ import static com.jogamp.opengl.GL2GL3.GL_LINE;
 import com.jogamp.opengl.GLAutoDrawable;
 import static com.jogamp.opengl.fixedfunc.GLMatrixFunc.GL_MODELVIEW_MATRIX;
 import static com.jogamp.opengl.fixedfunc.GLMatrixFunc.GL_PROJECTION_MATRIX;
-import cz.fidentis.analyst.icp.Icp;
 import cz.fidentis.analyst.icp.IcpVisitor;
-import cz.fidentis.analyst.icp.NoReductionStrategy;
 import cz.fidentis.analyst.icp.RandomReductionStrategy;
 //import cz.fidentis.analyst.face.HumanFace;
 import cz.fidentis.analyst.mesh.core.MeshFacet;
@@ -88,7 +86,7 @@ public class RegistrationGLEventListener extends GeneralGLEventListener{
             primaryModel = model;
         }
         else {
-            IcpVisitor icpVisitor = new IcpVisitor(primaryModel, 10, true, 0.05, new RandomReductionStrategy(0.5));
+            IcpVisitor icpVisitor = new IcpVisitor(primaryModel, 10, true, 0.05, new RandomReductionStrategy(0.25));
             for (MeshFacet f: model.getFacets()) {
                 icpVisitor.visitMeshFacet(f);
             }