diff --git a/src/main/java/com/aparapi/internal/kernel/KernelPreferences.java b/src/main/java/com/aparapi/internal/kernel/KernelPreferences.java
index 3a82d67cb8ff3962de8b6844cf4ed86cacbedd5b..7b9922cdb369812798c3494a1a6155b4170d67bd 100644
--- a/src/main/java/com/aparapi/internal/kernel/KernelPreferences.java
+++ b/src/main/java/com/aparapi/internal/kernel/KernelPreferences.java
@@ -1,12 +1,12 @@
 /**
  * Copyright (c) 2016 - 2017 Syncleus, Inc.
- *
+ * <p>
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
  * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
+ * <p>
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * <p>
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS,
  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
@@ -22,70 +22,69 @@ import java.util.*;
 import java.util.concurrent.CopyOnWriteArrayList;
 
 public class KernelPreferences {
-   private final Class<? extends Kernel> kernelClass;
-   private final KernelManager manager;
-   private final List<Device> preferredDevices = new CopyOnWriteArrayList<>();
-   private final LinkedHashSet<Device> failedDevices = new LinkedHashSet<>();
-
-   public KernelPreferences(KernelManager manager, Class<? extends Kernel> kernelClass) {
-      this.kernelClass = kernelClass;
-      this.manager = manager;
-   }
-
-   /** What Kernel subclass is this the preferences for? */
-   public Class<? extends Kernel> getKernelClass() {
-      return kernelClass;
-   }
-
-   public List<Device> getPreferredDevices(Kernel kernel) {
-      maybeSetUpDefaultPreferredDevices();
-
-      if (kernel == null) {
-         return Collections.unmodifiableList(preferredDevices);
-      }
-      List<Device> localPreferredDevices = new ArrayList<>();
-      ArrayList<Device> copy;
-      synchronized (preferredDevices) {
-         copy = new ArrayList(preferredDevices);
-      }
-      for (Device device : copy) {
-         if (kernel.isAllowDevice(device)) {
-            localPreferredDevices.add(device);
-         }
-      }
-      return Collections.unmodifiableList(localPreferredDevices);
-   }
-
-   synchronized void setPreferredDevices(Collection<Device> _preferredDevices) {
-      //if (preferredDevices != null) {
-         preferredDevices.clear();
-         preferredDevices.addAll(_preferredDevices);
+    public final Class<? extends Kernel> kernelClass;
+    private final KernelManager manager;
+    private final List<Device> preferredDevices = new CopyOnWriteArrayList<>();
+    private final LinkedHashSet<Device> failedDevices = new LinkedHashSet<>();
+
+    public KernelPreferences(KernelManager manager, Class<? extends Kernel> kernelClass) {
+        this.kernelClass = kernelClass;
+        this.manager = manager;
+    }
+
+    public List<Device> getPreferredDevices(Kernel kernel) {
+
+        List<Device> p = this.preferredDevices;
+
+        if (p.isEmpty()) {
+            p = setPreferredDevices(manager.getDefaultPreferences().getPreferredDevices(null));
+        }
+
+        if (kernel == null) {
+            return Collections.unmodifiableList(p);
+        } else {
+
+            List<Device> localPreferredDevices = new ArrayList<>();
+            for (int i = 0, pSize = p.size(); i < pSize; i++) {
+                Device device = p.get(i);
+                if (kernel.isAllowDevice(device)) {
+                    localPreferredDevices.add(device);
+                }
+            }
+            return Collections.unmodifiableList(localPreferredDevices);
+        }
+    }
+
+    List<Device> setPreferredDevices(Collection<Device> _preferredDevices) {
+
+        synchronized (preferredDevices) {
+            preferredDevices.clear();
+            preferredDevices.addAll(_preferredDevices);
+            failedDevices.clear();
+        }
+
+        return preferredDevices;
+
       /*}
       else {
          preferredDevices = new LinkedList<>(_preferredDevices);
       }*/
-      failedDevices.clear();
-   }
-
-   public Device getPreferredDevice(Kernel kernel) {
-      List<Device> localPreferredDevices = getPreferredDevices(kernel);
-      return localPreferredDevices.isEmpty() ? null : localPreferredDevices.get(0);
-   }
-
-   synchronized void markPreferredDeviceFailed() {
-      if (preferredDevices.size() > 0) {
-         failedDevices.add(preferredDevices.remove(0));
-      }
-   }
-
-   private void maybeSetUpDefaultPreferredDevices() {
-      synchronized (this) {
-         if (preferredDevices.isEmpty())
-            setPreferredDevices(manager.getDefaultPreferences().getPreferredDevices(null));
-      }
-   }
-
-   List<Device> getFailedDevices() {
-      return new ArrayList<>(failedDevices);
-   }
+    }
+
+    public Device getPreferredDevice(Kernel kernel) {
+        List<Device> localPreferredDevices = getPreferredDevices(kernel);
+        return localPreferredDevices.isEmpty() ? null : localPreferredDevices.get(0);
+    }
+
+    synchronized void markPreferredDeviceFailed() {
+        synchronized (preferredDevices) {
+            if (!preferredDevices.isEmpty()) {
+                failedDevices.add(preferredDevices.remove(0));
+            }
+        }
+    }
+
+    List<Device> getFailedDevices() {
+        return new ArrayList<>(failedDevices);
+    }
 }