diff --git a/Task_A/src/Enumerable.java b/Task_A/src/Enumerable.java
index 177bce922b7d0268b8951c08ba5690c36647aeb1..98e26df7b54b4471cb3bdc89d8daed29aa9870e4 100644
--- a/Task_A/src/Enumerable.java
+++ b/Task_A/src/Enumerable.java
@@ -1,43 +1,36 @@
-
-
 import java.util.Collection;
+import java.util.ArrayList;
+import java.util.List;
 import java.util.Iterator;
 
 public class Enumerable<T> implements Iterable<T> {
 
-	private Iterator<T> iterator;
+	private List<IPredicate<T>> predicates;
+	private Collection<T> collection;
 
 	public Enumerable(Collection<T> collection) {
-		this.iterator = collection.iterator();
-	}
-
-	Enumerable<T> where(IPredicate<T> predicate) {
-		Iterator<T> oldIterator = iterator;
-		this.iterator = new Iterator<T>() {
-
-			@Override
-			public boolean hasNext() {
-				return oldIterator.hasNext();
-			}
-
-			@Override
-			public T next() {
-				T item = oldIterator.hasNext() ? oldIterator.next() : null;
-				while (oldIterator.hasNext() && !predicate.accept(item)) {
-					item = oldIterator.next();
-				}
-				return item;
-			}
-		};
-		return this;
+		this.collection = collection;
+		this.predicates = new ArrayList<IPredicate<T>>();
+	}	
+
+	public Enumerable(Collection<T> collection, List<IPredicate<T>> predicates) {
+		this.collection = collection;
+		this.predicates = predicates;
+	}	
+
+	public Enumerable<T> where(IPredicate<T> predicate) {
+		List<IPredicate<T>> newPredicates = new ArrayList<IPredicate<T>>(predicates);
+		newPredicates.add(predicate);
+		return new Enumerable<T>(collection, newPredicates);
 	}
 
 	@Override
 	public Iterator<T> iterator() {
-		return iterator;
+		return new EnumerableIterator<T>(collection, predicates);
 	}
 
-	void forEach(IAction<T> action) {
+	public void forEach(IAction<T> action) {
+		Iterator<T> iterator = iterator();
 		while (iterator.hasNext()) {
 			T t = (T) iterator.next();
 			action.perform(t);
@@ -45,3 +38,4 @@ public class Enumerable<T> implements Iterable<T> {
 	}
 
 }
+
diff --git a/Task_A/src/EnumerableIterator.java b/Task_A/src/EnumerableIterator.java
new file mode 100644
index 0000000000000000000000000000000000000000..a15e000113fc641548b134e147c7180ac7d3a8dd
--- /dev/null
+++ b/Task_A/src/EnumerableIterator.java
@@ -0,0 +1,46 @@
+import java.util.List;
+import java.util.Iterator;
+import java.util.Collection;
+
+public class EnumerableIterator<T> implements Iterator<T> {
+	
+	private Iterator<T> collectionIterator;
+	public T peaked;
+	private List<IPredicate<T>> predicates;
+
+	public EnumerableIterator(Collection<T> collection, List<IPredicate<T>> predicates) {
+		this.collectionIterator = collection.iterator();
+		this.predicates = predicates;
+	}
+
+	@Override
+	public boolean hasNext() {
+		if (peaked == null && collectionIterator.hasNext()) { // peaked is null if not checked
+			while (collectionIterator.hasNext()) {
+				peaked = collectionIterator.next();
+				if (accept(peaked))
+					return true;
+			}
+			peaked = null;
+		}
+		return peaked != null;
+	}
+
+	@Override
+	public T next() {
+		T next = null;
+		if (hasNext()) {
+			next = peaked;
+			peaked = null;
+		}
+		return next;
+	}
+	
+	private boolean accept(T t) {
+		for (IPredicate<T> p : predicates) {
+			if (!p.accept(t))
+				return false;
+		}
+		return true;
+	}
+}
diff --git a/Task_A/src/Test.java b/Task_A/src/Test.java
index 6f38516f1926177e588d87787c017f779da399c3..965a39cf2f8710b938dca96f821832aae6ac6cec 100644
--- a/Task_A/src/Test.java
+++ b/Task_A/src/Test.java
@@ -1,5 +1,3 @@
-
-
 import java.text.MessageFormat;
 import java.util.ArrayList;
 
@@ -13,7 +11,26 @@ public class Test {
 		arrayList.add(7);
 
 		Enumerable<Integer> enumerable = new Enumerable<>(arrayList);
-		Enumerable<Integer> evenNumbers = enumerable
+		Enumerable<Integer> enumerablePrimes = enumerable
+		
+				.where(new IPredicate<Integer>() {
+
+			@Override
+			public boolean accept(Integer element) {
+				if (element <= 3)
+					return element > 1;
+				else if (element % 2 == 0 || element % 3 == 0)
+			    	return false;
+			    int i = 5;
+				while (i * i <= element) {
+					if (element % i == 0 || element % (i + 2) == 0)
+						return false;
+			    	i = i + 6;
+				}
+	    	    return true;
+			}
+		});
+		Enumerable<Integer> evenNumbers = enumerablePrimes
 				.where(new IPredicate<Integer>() {
 
 					@Override
@@ -22,7 +39,7 @@ public class Test {
 					}
 				});
 
-		Enumerable<Integer> oddNumbers = enumerable
+		Enumerable<Integer> oddNumbers = enumerablePrimes
 				.where(new IPredicate<Integer>() {
 
 					@Override
@@ -43,7 +60,7 @@ public class Test {
 
 			@Override
 			public void perform(Integer t) {
-				System.out.println(MessageFormat.format("Odd number{0}", t));				
+				System.out.println(MessageFormat.format("Odd number {0}", t));				
 			}
 		});
 	}