Index: libcfa/src/bits/queue.hfa
===================================================================
--- libcfa/src/bits/queue.hfa	(revision 636d3715218ad17f8c121dc651c8556740022e15)
+++ libcfa/src/bits/queue.hfa	(revision aeb31b1552ac9b7ba115fac5648545a58d8c5236)
@@ -11,6 +11,6 @@
 	inline {
 		// wrappers to make Collection have T
-		T * head( Queue(T) & q ) with( q ) {
-			return (T *)head( (Collection &)q );
+		T & head( Queue(T) & q ) with( q ) {
+			return *(T *)head( (Collection &)q );
 		} // post: empty() & head() == 0 | !empty() & head() in *q
 
@@ -23,69 +23,69 @@
 		} // post: empty()
 
-		T * tail( Queue(T) & q ) with( q ) {
-			return last;
+		T & tail( Queue(T) & q ) with( q ) {
+			return *last;
 		}
 
-		T * succ( Queue(T) & q, T * n ) with( q ) {		// pre: *n in *q
+		T & succ( Queue(T) & q, T & n ) with( q ) {		// pre: *n in *q
 #ifdef __CFA_DEBUG__
-			if ( ! listed( n ) ) abort( "(Queue &)%p.succ( %p ) : Node is not on a list.", &q, n );
+			if ( ! listed( &n ) ) abort( "(Queue &)%p.succ( %p ) : Node is not on a list.", &q, &n );
 #endif // __CFA_DEBUG__
-			return (Next( n ) == n) ? 0p : Next( n );
+			return (Next( &n ) == &n) ? *0p : *Next( &n );
 		} // post: n == tail() & succ(n) == 0 | n != tail() & *succ(n) in *q
 
-		void addHead( Queue(T) & q, T * n ) with( q ) {
+		void addHead( Queue(T) & q, T & n ) with( q ) {
 #ifdef __CFA_DEBUG__
-			if ( listed( n ) ) abort( "(Queue &)%p.addHead( %p ) : Node is already on another list.", &q, n );
+			if ( listed( &n ) ) abort( "(Queue &)%p.addHead( %p ) : Node is already on another list.", &q, &n );
 #endif // __CFA_DEBUG__
 			if ( last ) {
-				Next( n ) = head( q );
-				q.root = n;
+				Next( &n ) = &head( q );
+				q.root = &n;
 			} else {
-				root = last = n;
-				Next( n ) = n;							// last node points to itself
+				root = last = &n;
+				Next( &n ) = &n;							// last node points to itself
 			}
 		}
 
-		void addTail( Queue(T) & q, T * n ) with( q ) {
+		void addTail( Queue(T) & q, T & n ) with( q ) {
 #ifdef __CFA_DEBUG__
-			if ( listed( n ) ) abort( "(Queue &)%p.addTail( %p ) : Node is already on another list.", &q, n );
+			if ( listed( &n ) ) abort( "(Queue &)%p.addTail( %p ) : Node is already on another list.", &q, &n );
 #endif // __CFA_DEBUG__
-			if ( last ) Next( last ) = n;
-			else root = n;
-			last = n;
-			Next( n ) = n;								// last node points to itself
+			if ( last ) Next( last ) = &n;
+			else root = &n;
+			last = &n;
+			Next( &n ) = &n;								// last node points to itself
 		}
 
-		void add( Queue(T) & q, T * n ) with( q ) {
+		void add( Queue(T) & q, T & n ) with( q ) {
 			addTail( q, n );
 		}
 
-		T * dropHead( Queue(T) & q ) with( q ) {
-			T * t = head( q );
+		T & dropHead( Queue(T) & q ) with( q ) {
+			T * t = &head( q );
 			if ( root ) {
 				root = Next( root );
-				if ( head( q ) == t ) {
+				if ( &head( q ) == t ) {
 					root = last = 0p;					// only one element
 				}
 				Next( t ) = 0p;
 			}
-			return t;
+			return *t;
 		}
 
-		T * drop( Queue(T) & q ) with( q ) {
+		T & drop( Queue(T) & q ) with( q ) {
 			return dropHead( q );
 		}
 
-		void remove( Queue(T) & q, T * n ) with( q ) {	// O(n)
+		void remove( Queue(T) & q, T & n ) with( q ) {	// O(n)
 #ifdef __CFA_DEBUG__
-			if ( ! listed( (Colable &)(*n) ) ) abort( "(Queue &)%p.remove( %p ) : Node is not on a list.", &q, n );
+			if ( ! listed( (Colable &)n ) ) abort( "(Queue &)%p.remove( %p ) : Node is not on a list.", &q, &n );
 #endif // __CFA_DEBUG__
 			T * prev = 0;
 			T * curr = (T *)root;
 			for ( ;; ) {
-				if (n == curr) {						// found => remove
-					if ((T *)root == n) {
+				if (&n == curr) {						// found => remove
+					if ((T *)root == &n) {
 						dropHead( q );
-					} else if (last == n) {
+					} else if (last == &n) {
 						last = prev;
 						Next( last ) = last;
@@ -93,10 +93,10 @@
 						Next( prev ) = Next( curr );
 					}
-					Next( n ) = 0p;
+					Next( &n ) = 0p;
 					break;
 				}
 #ifdef __CFA_DEBUG__
 				// not found => error
-				if (curr == last) abort( "(Queue &)%p.remove( %p ) : Node is not in list.", &q, n );
+				if (curr == last) abort( "(Queue &)%p.remove( %p ) : Node is not in list.", &q, &n );
 #endif // __CFA_DEBUG__
 				prev = curr;
@@ -105,7 +105,7 @@
 		} // post: ! listed( n )
 
-		T * dropTail( Queue(T) & q ) with( q ) { // O(n)
-			T * n = tail( q );
-			return n ? remove( q, n ), n : 0p;
+		T & dropTail( Queue(T) & q ) with( q ) { // O(n)
+			T & n = tail( q );
+			return &n ? remove( q, n ), n : *0p;
 		}
 
@@ -116,5 +116,5 @@
 				root = from.root;
 			} else {									// "to" list not empty
-				Next( last ) = head( from );
+				Next( last ) = &head( from );
 			}
 			last = from.last;
@@ -124,16 +124,16 @@
 		// Transfer the "from" list up to node "n" to the end of queue list; the "from" list becomes the list after node "n".
 		// Node "n" must be in the "from" list.
-		void split( Queue(T) & q, Queue(T) & from, T * n ) with( q ) {
+		void split( Queue(T) & q, Queue(T) & from, T & n ) with( q ) {
 #ifdef __CFA_DEBUG__
-			if ( ! listed( (Colable &)(*n) ) ) abort( "(Queue &)%p.split( %p ) : Node is not on a list.", &q, n );
+			if ( ! listed( (Colable &)n ) ) abort( "(Queue &)%p.split( %p ) : Node is not on a list.", &q, &n );
 #endif // __CFA_DEBUG__
 			Queue(T) to;
 			to.root = from.root;						// start of "to" list
-			to.last = n;								// end of "to" list
-			from.root = Next( n );						// start of "from" list
-			if ( n == head( from ) ) {					// last node in list ?
+			to.last = &n;								// end of "to" list
+			from.root = Next( &n );						// start of "from" list
+			if ( &n == &head( from ) ) {					// last node in list ?
 				from.root = from.last = 0p;				// mark "from" list empty
 			} else {
-				Next( n ) = n;							// fix end of "to" list
+				Next( &n ) = &n;							// fix end of "to" list
 			}
 			transfer( q, to );
@@ -154,14 +154,14 @@
 		// create an iterator active in Queue q
 		void ?{}( QueueIter(T) & qi, Queue(T) & q ) with( qi ) {
-			curr = head( q );
+			curr = &head( q );
 		} // post: curr = {e in q}
 
-		void ?{}( QueueIter(T) & qi, T * start ) with( qi ) {
-			curr = start;
+		void ?{}( QueueIter(T) & qi, T & start ) with( qi ) {
+			curr = &start;
 		} // post: curr = {e in q}
 
 		// make existing iterator active in Queue q
 		void over( QueueIter(T) & qi, Queue(T) & q ) with( qi ) {
-			curr = head( q );
+			curr = &head( q );
 		} // post: curr = {e in q}
 
Index: libcfa/src/bits/queue_example.cfa
===================================================================
--- libcfa/src/bits/queue_example.cfa	(revision 636d3715218ad17f8c121dc651c8556740022e15)
+++ libcfa/src/bits/queue_example.cfa	(revision aeb31b1552ac9b7ba115fac5648545a58d8c5236)
@@ -27,5 +27,5 @@
 	
 	for ( i; 10 ) {
-		add( fred, new( 2 * i ) );
+		add( fred, *new( 2 * i ) );
 	}
 
@@ -36,5 +36,5 @@
 
 	for ( i; 9 ) {
-		delete( drop( fred ) );
+		delete( &drop( fred ) );
 	}
 
@@ -45,5 +45,5 @@
 	
 	for ( i; 10 ) {
-		add( fred, new( 2 * i + 1 ) );
+		add( fred, *new( 2 * i + 1 ) );
 	}
 	for ( over( fredIter, fred ); fredIter >> f; ) {
@@ -78,5 +78,5 @@
 	
 	for ( i; 10 ) {
-		add( mary, new( 2 * i ) );
+		add( mary, *new( 2 * i ) );
 	}
 
@@ -87,5 +87,5 @@
 	
 	for ( i; 9 ) {
-		delete( drop( mary ) );
+		delete( &drop( mary ) );
 	}
 
@@ -96,5 +96,5 @@
 	
 	for ( i; 10 ) {
-		add( mary, new( 2 * i + 1 ) );
+		add( mary, *new( 2 * i + 1 ) );
 	}
 	for ( over( maryIter, mary ); maryIter >> m; ) {
Index: libcfa/src/bits/sequence.hfa
===================================================================
--- libcfa/src/bits/sequence.hfa	(revision 636d3715218ad17f8c121dc651c8556740022e15)
+++ libcfa/src/bits/sequence.hfa	(revision aeb31b1552ac9b7ba115fac5648545a58d8c5236)
@@ -2,4 +2,6 @@
 
 #include "collection.hfa"
+#include <stdlib.hfa>
+#include <stdio.h>
 
 struct Seqable {
@@ -14,6 +16,6 @@
 	} // post: ! listed()
 
-	Seqable * getBack( Seqable & sq ) with( sq ) {
-		return back;
+	Seqable & getBack( Seqable & sq ) with( sq ) {
+		return *back;
 	}
 
@@ -30,6 +32,6 @@
 	inline {
 		// wrappers to make Collection have T
-		T * head( Sequence(T) & s ) with( s ) {
-			return (T *)head( (Collection &)s );
+		T & head( Sequence(T) & s ) with( s ) {
+			return *(T *)head( (Collection &)s );
 		} // post: empty() & head() == 0 | !empty() & head() in *s
 
@@ -47,21 +49,21 @@
 		// Return a pointer to the last sequence element, without removing it.	
 		T & tail( Sequence(T) & s ) with( s ) {
-			return root ? (T &)Back( head( s ) ) : *0p;	// needs cast?
-		}	// post: empty() & tail() == 0 | !empty() & tail() in *s
+			return root ? (T &)*Back( &head( s ) ) : *0p;
+		}	// post: empty() & tail() == 0 | !empty() & tail() in *s\
 
 		// Return a pointer to the element after *n, or 0p if there isn't one.
-		T * succ( Sequence(T) & s, T * n ) with( s ) {	// pre: *n in *s
-#ifdef __CFA_DEBUG__
-			if ( ! listed( n ) ) abort( "(Sequence &)%p.succ( %p ) : Node is not on a list.", &s, n );
-#endif // __CFA_DEBUG__
-			return Next( n ) == head( s ) ? 0p : Next( n );
+		T & succ( Sequence(T) & s, T & n ) with( s ) {	// pre: *n in *s
+#ifdef __CFA_DEBUG__
+			if ( ! listed( &n ) ) abort( "(Sequence &)%p.succ( %p ) : Node is not on a list.", &s, &n );
+#endif // __CFA_DEBUG__
+			return Next( &n ) == &head( s ) ? *0p : *Next( &n );
 		}	// post: n == tail() & succ(n) == 0 | n != tail() & *succ(n) in *s
 
 		// Return a pointer to the element before *n, or 0p if there isn't one.
-		T * pred( Sequence(T) & s, T * n ) with( s ) {	// pre: *n in *s
-#ifdef __CFA_DEBUG__
-			if ( ! listed( n ) ) abort( "(Sequence &)%p.pred( %p ) : Node is not on a list.", &s, n );
-#endif // __CFA_DEBUG__
-			return n == head( s ) ? 0p : Back( n );
+		T & pred( Sequence(T) & s, T & n ) with( s ) {	// pre: *n in *s
+#ifdef __CFA_DEBUG__
+			if ( ! listed( &n ) ) abort( "(Sequence &)%p.pred( %p ) : Node is not on a list.", &s, &n );
+#endif // __CFA_DEBUG__
+			return &n == &head( s ) ? *0p : *Back( &n );
 		}	// post: n == head() & head(n) == 0 | n != head() & *pred(n) in *s
 
@@ -72,11 +74,11 @@
 			if ( listed( &n ) ) abort( "(Sequence &)%p.insertBef( %p, %p ) : Node is already on another list.", &s, n, &bef );
 #endif // __CFA_DEBUG__
-			if ( &bef == head( s ) ) {					// must change root
+			if ( &bef == &head( s ) ) {					// must change root
 				if ( root ) {
-					Next( &n ) = head( s );
-					Back( &n ) = Back( head( s ) );
+					Next( &n ) = &head( s );
+					Back( &n ) = Back( &head( s ) );
 					// inserted node must be consistent before it is seen
 					asm( "" : : : "memory" );			// prevent code movement across barrier
-					Back( head( s ) ) = &n;
+					Back( &head( s ) ) = &n;
 					Next( Back( &n ) ) = &n;
 				} else {
@@ -88,5 +90,5 @@
 				root = &n;
 			} else {
-				if ( ! &bef ) &bef = head( s );
+				if ( ! &bef ) &bef = &head( s );
 				Next( &n ) = &bef;
 				Back( &n ) = Back( &bef );
@@ -106,9 +108,9 @@
 			if ( ! &aft ) {								// must change root
 				if ( root ) {
-					Next( &n ) = head( s );
-					Back( &n ) = Back( head( s ) );
+					Next( &n ) = &head( s );
+					Back( &n ) = Back( &head( s ) );
 					// inserted node must be consistent before it is seen
 					asm( "" : : : "memory" );			// prevent code movement across barrier
-					Back( head( s ) ) = &n;
+					Back( &head( s ) ) = &n;
 					Next( Back( &n ) ) = &n;
 				} else {
@@ -133,7 +135,7 @@
 			if ( ! listed( &n ) ) abort( "(Sequence &)%p.remove( %p ) : Node is not on a list.", &s, &n );
 #endif // __CFA_DEBUG__
-			if ( &n == head( s ) ) {
-				if ( Next( head( s ) ) == head( s ) ) root = 0p;
-				else root = Next( head(s ) );
+			if ( &n == &head( s ) ) {
+				if ( Next( &head( s ) ) == &head( s ) ) root = 0p;
+				else root = Next( &head(s ) );
 			} // if
 			Back( Next( &n ) ) = Back( &n );
@@ -156,6 +158,6 @@
 		// Remove and return the head element in the sequence.
 		T & dropHead( Sequence(T) & s ) {
-			T * n = head( s );
-			return n ? remove( s, *n ), *n : *0p;
+			T & n = head( s );
+			return &n ? remove( s, n ), n : *0p;
 		}
 		// Remove and return the head element in the sequence.
@@ -175,10 +177,10 @@
 				root = from.root;
 			} else {									// "to" list not empty
-				T * toEnd = Back( head( s ) );
-				T * fromEnd = Back( head( from ) );
+				T * toEnd = Back( &head( s ) );
+				T * fromEnd = Back( &head( from ) );
 				Back( root ) = fromEnd;
-				Next( fromEnd ) = head( s );
+				Next( fromEnd ) = &head( s );
 				Back( from.root ) = toEnd;
-				Next( toEnd ) = head( from );
+				Next( toEnd ) = &head( from );
 			} // if
 			from.root = 0p;								// mark "from" list empty
@@ -187,18 +189,18 @@
 		// Transfer the "from" list up to node "n" to the end of s list; the "from" list becomes the sequence after node "n".
 		// Node "n" must be in the "from" list.
-		void split( Sequence(T) & s, Sequence(T) & from, T * n ) with( s ) {
-#ifdef __CFA_DEBUG__
-			if ( ! listed( n ) ) abort( "(Sequence &)%p.split( %p ) : Node is not on a list.", &s, n );
+		void split( Sequence(T) & s, Sequence(T) & from, T & n ) with( s ) {
+#ifdef __CFA_DEBUG__
+			if ( ! listed( &n ) ) abort( "(Sequence &)%p.split( %p ) : Node is not on a list.", &s, &n );
 #endif // __CFA_DEBUG__
 			Sequence(T) to;
 			to.root = from.root;						// start of "to" list
-			from.root = Next( n );						// start of "from" list
+			from.root = Next( &n );						// start of "from" list
 			if ( to.root == from.root ) {				// last node in list ?
 				from.root = 0p;							// mark "from" list empty
 			} else {
-				Back( head( from ) ) = Back( head( to ) ); // fix "from" list
-		 		Next( Back( head( to ) ) ) = head( from );
-				Next( n ) = head( to );					// fix "to" list
-				Back( head( to ) ) = n;
+				Back( &head( from ) ) = Back( &head( to ) ); // fix "from" list
+		 		Next( Back( &head( to ) ) ) = &head( from );
+				Next( &n ) = &head( to );					// fix "to" list
+				Back( &head( to ) ) = &n;
 			} // if
 			transfer( s, to );
@@ -223,10 +225,10 @@
 			((ColIter &) si){};
 			seq = &s;
-			curr = head( s );
+			curr = &head( s );
 		} // post: elts = null.
 		
 		void over( SeqIter(T) & si, Sequence(T) & s ) with( si ) {
 			seq = &s;
-			curr = head( s );
+			curr = &head( s );
 		} // post: elts = {e in s}.
 
@@ -234,6 +236,6 @@
 			if ( curr ) {
 				&tp = Curr( si );
-				T * n = succ( *seq, Curr( si ) );
-				curr = n == head( *seq ) ? 0p : n;
+				T * n = &succ( *seq, *Curr( si ) );
+				curr = n == &head( *seq ) ? 0p : n;
 			} else &tp = 0p;
 			return &tp != 0p;
@@ -268,5 +270,5 @@
 			if ( curr ) {
 				&tp = Curr( si );
-				T * n = pred( *seq, Curr( si ) );
+				T * n = &pred( *seq, *Curr( si ) );
 				curr = n == &tail( *seq ) ? 0p : n;
 			} else &tp = 0p;
