diff --git a/Task_A/src/Enumerable.java b/Task_A/src/Enumerable.java
index 177bce922b7d0268b8951c08ba5690c36647aeb1..98e10085b702e14cbb81b8f415cee925c2d75af6 100644
--- a/Task_A/src/Enumerable.java
+++ b/Task_A/src/Enumerable.java
@@ -1,37 +1,68 @@
-
-
 import java.util.Collection;
 import java.util.Iterator;
 
 public class Enumerable<T> implements Iterable<T> {
 
+	// Define variables
+
+	private Enumerable<T> newEnumerable;
 	private Iterator<T> iterator;
+	private Collection<T> newCollection;
+
+
+	// Use collection for iteration operations
 
 	public Enumerable(Collection<T> collection) {
+
 		this.iterator = collection.iterator();
+		this.newCollection = collection;
+
 	}
 
+	// Redefined where() method
+
 	Enumerable<T> where(IPredicate<T> predicate) {
-		Iterator<T> oldIterator = iterator;
-		this.iterator = new Iterator<T>() {
+
+		// Need to create a new Enumerable, or else the same reference will be used
+		// and you can only iterate through a given list once
+
+		newEnumerable = new Enumerable<T>(newCollection);
+
+		newEnumerable.iterator = new Iterator<T>() {
+
+			Iterator<T> oldIterator = newEnumerable.iterator;
 
 			@Override
-			public boolean hasNext() {
-				return oldIterator.hasNext();
-			}
+			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();
+
+				// define element as T
+				T element;
+
+				// if iterator has more items, we get it, else return null
+				if(oldIterator.hasNext()) {
+					element = oldIterator.next();
+				} else {
+					element = null;
 				}
-				return item;
+
+				while (oldIterator.hasNext() && !predicate.accept(element)) element = oldIterator.next();
+
+				// handle last element
+				if( !(oldIterator.hasNext() || predicate.accept(element)) ) element = null;
+
+				return element;
 			}
 		};
-		return this;
+
+		// cannot use or return this, else the same list cannot be reused after 1 full iteration
+		return newEnumerable;
+
 	}
 
+
 	@Override
 	public Iterator<T> iterator() {
 		return iterator;
@@ -39,9 +70,14 @@ public class Enumerable<T> implements Iterable<T> {
 
 	void forEach(IAction<T> action) {
 		while (iterator.hasNext()) {
-			T t = (T) iterator.next();
-			action.perform(t);
+
+			// get next element
+			T nextItem = (T) iterator.next();
+
+			// ignore last (null) element
+			if (nextItem != null) action.perform(nextItem);
 		}
 	}
 
+
 }