Index: libcfa/src/containers/queueLockFree.hfa
===================================================================
--- libcfa/src/containers/queueLockFree.hfa	(revision 304de00717ef6362ebb9fec97808ec4a0cdc837c)
+++ libcfa/src/containers/queueLockFree.hfa	(revision 2d95a2deb3950aceb4799649cc98a9c7a58e86a5)
@@ -20,11 +20,12 @@
 		// Adds an element to the list
 		// Multi-Thread Safe, Lock-Free
-		T * push(mcs_queue(T) & this, T & elem) {
-			/* paranoid */ verify(!(&elem)`next);
+		T * push(mcs_queue(T) & this, T * elem) __attribute__((artificial));
+		T * push(mcs_queue(T) & this, T * elem) {
+			/* paranoid */ verify(!(elem`next));
 			// Race to add to the tail
-			T * prev = __atomic_exchange_n(&this.tail, &elem, __ATOMIC_SEQ_CST);
+			T * prev = __atomic_exchange_n(&this.tail, elem, __ATOMIC_SEQ_CST);
 			// If we aren't the first, we need to tell the person before us
 			// No need to
-			if (prev) prev`next = &elem;
+			if (prev) prev`next = elem;
 			return prev;
 		}
@@ -33,13 +34,19 @@
 		// Passing an element that is not the head is undefined behavior
 		// NOT Multi-Thread Safe, concurrent pushes are safe
-		T * advance(mcs_queue(T) & this, T & elem) {
-			T * expected = &elem;
+		T * advance(mcs_queue(T) & this, T * elem) __attribute__((artificial));
+		T * advance(mcs_queue(T) & this, T * elem) {
+			T * expected = elem;
 			// Check if this is already the last item
 			if (__atomic_compare_exchange_n(&this.tail, &expected, 0p, false, __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST)) return 0p;
 
-			// If not wait for next item to show-up
-			// added by push
-			while (!(&elem)`next) Pause();
-			return (&elem)`next;
+			// If not wait for next item to show-up, filled by push
+			while (!(elem`next)) Pause();
+
+			// we need to return if the next link was empty
+			T * ret = elem`next;
+
+			// invalidate link to reset to initial state
+			elem`next = 0p;
+			return ret;
 		}
 	}
@@ -64,7 +71,8 @@
 		// Added a new element to the queue
 		// Multi-Thread Safe, Lock-Free
-		T * push(mpsc_queue(T) & this, T & elem) {
+		T * push(mpsc_queue(T) & this, T * elem) __attribute__((artificial));
+		T * push(mpsc_queue(T) & this, T * elem) {
 			T * prev = push((mcs_queue(T)&)this, elem);
-			if (!prev) this.head = &elem;
+			if (!prev) this.head = elem;
 			return prev;
 		}
@@ -74,4 +82,5 @@
 		// next is set to the new head of the queue
 		// NOT Multi-Thread Safe
+		T * pop(mpsc_queue(T) & this, T *& next) __attribute__((artificial));
 		T * pop(mpsc_queue(T) & this, T *& next) {
 			T * elem = this.head;
@@ -84,4 +93,7 @@
 				// force memory sync
 				__atomic_thread_fence(__ATOMIC_SEQ_CST);
+
+				// invalidate link to reset to initial state
+				elem`next = 0p;
 			}
 			// Otherwise, there might be a race where it only looks but someone is enqueuing
@@ -91,5 +103,5 @@
 				// after that point, it could overwrite the write in push
 				this.head = 0p;
-				next = advance((mcs_queue(T)&)this, (*elem));
+				next = advance((mcs_queue(T)&)this, elem);
 
 				// Only write to the head if there is a next element
@@ -98,7 +110,4 @@
 				if (next) this.head = next;
 			}
-
-			// invalidate link
-			elem`next = 0p;
 
 			// return removed element
