Index: libcfa/src/bits/queue.hfa
===================================================================
--- libcfa/src/bits/queue.hfa	(revision 636d3715218ad17f8c121dc651c8556740022e15)
+++ libcfa/src/bits/queue.hfa	(revision a78c3ff302ed8743ba3d0a600fbf31010e04a554)
@@ -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}
 
