Index: libcfa/src/containers/list2.hfa
===================================================================
--- libcfa/src/containers/list2.hfa	(revision 8d1ad36cef9bb7b219f38dfae154e557ae4f238e)
+++ libcfa/src/containers/list2.hfa	(revision 7d51ef867a6e78e1b2b6f9e5456b64a42c555758)
@@ -18,19 +18,32 @@
 #include <assert.h>
 
-extern "C" {
-    void * memset ( void * ptr, int value, size_t num );
-}
-
-trait embedded( tOuter &, tInner & ) {
-    tInner & ?`inner( tOuter & );
+forall( Decorator &, T & )
+struct tytagref {
+    inline T &;
 };
 
-// embedded is reflexive
-forall( tX & )
-static inline tX & ?`inner( tX & this ) { return this; }
+trait embedded( tOuter &, tMid &, tInner & ) {
+    tytagref( tMid, tInner ) ?`inner( tOuter & );
+};
+
+// embedded is reflexive, with no info (void) as the type tag
+forall (T &)
+tytagref(void, T) ?`inner ( T & this ) { tytagref( void, T ) ret = {this}; return ret; }
 
 // use this on every case of plan-9 inheritance, to make embedded a closure of plan-9 inheritance
-#define P9_EMBEDDED( tOuter, tInner ) \
-   static inline tInner & ?`inner( tOuter & this ) { return this; }
+#define P9_EMBEDDED( derived, immedBase ) \
+forall( Tbase &, TdiscardPath & | { tytagref( TdiscardPath, Tbase ) ?`inner( immedBase & ); } ) \
+    static inline tytagref(immedBase, Tbase) ?`inner( derived & this ) { \
+        immedBase & ib = this; \
+        Tbase & b = ib`inner; \
+        tytagref(immedBase, Tbase) result = { b }; \
+        return result; \
+    }
+
+#define EMBEDDED_VIA( OUTER, MID, INNER ) \
+   (struct { tytagref(MID, INNER) ( * ?`inner ) ( OUTER & ); }){ ?`inner } 
+
+#define DLINK_VIA( TE, TLINK ) \
+   EMBEDDED_VIA( TE, TLINK, dlink(TE) )
 
 
@@ -81,18 +94,12 @@
     }
 
-    forall( tLinks & = tE ) {
-
-        struct dlist {
-            inline dlink(tE);
-        };
-
-        struct diref {
-            inline tE &;
-        };
-    }
-
-    forall( tLinks & = tE | embedded( tE, tLinks ) | embedded( tLinks, dlink(tE) ) ) {
+    forall( tLinks & = dlink(tE) )
+    struct dlist {
+        inline dlink(tE);
+    };
+
+    forall( tLinks & | embedded( tE, tLinks, dlink(tE) ) ) {
         static inline tE * $get_list_origin_addr( dlist(tE, tLinks) & lst ) {
-            dlink(tE) & link_from_null = ( * (tE *) 0p )`inner`inner;
+            dlink(tE) & link_from_null = ( * (tE *) 0p )`inner;
             ptrdiff_t link_offset = (ptrdiff_t) & link_from_null;
             size_t origin_addr = ((size_t) & lst) - link_offset;
@@ -105,10 +112,4 @@
             ( ( dlink(tE) & ) this ){ listOrigin, listOrigin } ;
         }
-
-        // redundant
-        // void ?{}( diref(tE, tLinks) & this, tE & target ) {
-        //     tE && ref = this;
-        //     &ref = &target;
-        // }
     }
 
@@ -116,53 +117,57 @@
 
 
-forall( tE &, tLinks & | embedded( tE, tLinks ) | embedded( tLinks, dlink(tE) ) ) {
-
-	static inline void insert_after(diref(tE, tLinks) list_pos, tE &to_insert) {
+forall( tE &, tLinks & | embedded( tE, tLinks, dlink(tE) ) ) {
+
+	static inline void insert_after(tE & list_pos, tE &to_insert) {
 		verify (&list_pos != 0p);
 		verify (&to_insert != 0p);
-        dlink(tE) & linkToInsert = to_insert`inner`inner;
+        dlink(tE) & linkToInsert = to_insert`inner;
 		verify(linkToInsert.prev == 0p);
 		verify(linkToInsert.next == 0p);
         tE & list_pos_raw = list_pos;
         tE & list_pos_elem = * (tE *) ORIGIN_TAG_CLEAR( (size_t) & list_pos_raw );
-        asm( "" : : : "memory" );
-        tE & after_raw = * (list_pos_elem`inner`inner).next;
+        dlink(tE) & list_pos_links = list_pos_elem`inner;
+        asm( "" : : : "memory" );
+        tE & after_raw = * list_pos_links.next;
         tE & after_elem = * (tE *) ORIGIN_TAG_CLEAR( (size_t) & after_raw );
 		linkToInsert.prev = & list_pos_raw;
 		linkToInsert.next = & after_raw;
-        (after_elem`inner`inner).prev = &to_insert;
-		(list_pos_elem`inner`inner).next = &to_insert;
-        asm( "" : : : "memory" );
-	}
-
-	static inline void insert_before(diref(tE, tLinks) list_pos, tE &to_insert) {
+        dlink(tE) & afterLinks = after_elem`inner;
+        afterLinks.prev = &to_insert;
+		list_pos_links.next = &to_insert;
+        asm( "" : : : "memory" );
+	}
+
+	static inline void insert_before(tE & list_pos, tE &to_insert) {
 		verify (&list_pos != 0p);
 		verify (&to_insert != 0p);
-        dlink(tE) & linkToInsert = to_insert`inner`inner;
+        dlink(tE) & linkToInsert = to_insert`inner;
 		verify(linkToInsert.next == 0p);
 		verify(linkToInsert.prev == 0p);
         tE & list_pos_raw = list_pos;
         tE & list_pos_elem = * (tE *) ORIGIN_TAG_CLEAR( (size_t) & list_pos_raw );
-        asm( "" : : : "memory" );
-        tE & before_raw = * (list_pos_elem`inner`inner).prev;
+        dlink(tE) & list_pos_links = list_pos_elem`inner;
+        asm( "" : : : "memory" );
+        tE & before_raw = * (list_pos_links).prev;
         tE & before_elem = * (tE *) ORIGIN_TAG_CLEAR( (size_t) & before_raw );
 		linkToInsert.next = & list_pos_raw;
 		linkToInsert.prev = & before_raw;
-        (before_elem`inner`inner).next = &to_insert;
-		(list_pos_elem`inner`inner).prev = &to_insert;
-        asm( "" : : : "memory" );
-	}
-
-	static inline tE & remove(diref(tE, tLinks) list_pos) {
+        dlink(tE) & beforeLinks = before_elem`inner;
+        beforeLinks.next = &to_insert;
+		(list_pos_links).prev = &to_insert;
+        asm( "" : : : "memory" );
+	}
+
+	static inline tE & remove(tE & list_pos) {
 		verify (&list_pos != 0p);
         tE & list_pos_elem = list_pos;
         verify( ! ORIGIN_TAG_QUERY((size_t) & list_pos_elem) );
-        dlink(tE) & list_pos_links = list_pos_elem`inner`inner;
+        dlink(tE) & list_pos_links = list_pos_elem`inner;
         tE & before_raw = * list_pos_links.prev;
         tE & before_elem = * (tE *) ORIGIN_TAG_CLEAR( (size_t) & before_raw );
-        dlink(tE) & before_links = before_elem`inner`inner;
+        dlink(tE) & before_links = before_elem`inner;
         tE & after_raw = * list_pos_links.next;
         tE & after_elem = * (tE *) ORIGIN_TAG_CLEAR( (size_t) & after_raw );
-        dlink(tE) & after_links = after_elem`inner`inner;
+        dlink(tE) & after_links = after_elem`inner;
         before_links.next = &after_raw;
         after_links.prev = &before_raw;
@@ -174,15 +179,13 @@
 	}
 
-    static inline diref(tE, tLinks) ?`first( dlist(tE, tLinks) &lst ) {
+    static inline tE & ?`first( dlist(tE, tLinks) &lst ) {
         tE * firstPtr = lst.next;
         if (ORIGIN_TAG_QUERY((size_t)firstPtr)) firstPtr = 0p;
-        diref(tE, tLinks) ret = { *firstPtr };
-        return ret;
-    }
-    static inline diref(tE, tLinks) ?`last ( dlist(tE, tLinks) &lst ) {
+        return *firstPtr;
+    }
+    static inline tE & ?`last ( dlist(tE, tLinks) &lst ) {
         tE * lastPtr = lst.prev;
         if (ORIGIN_TAG_QUERY((size_t)lastPtr)) lastPtr = 0p;
-        diref(tE, tLinks) ret = { *lastPtr };
-        return ret;
+        return *lastPtr;
     }
 
@@ -193,62 +196,41 @@
     }
 
-    static inline int ?!=?( const diref(tE, tLinks) & list_pos, zero_t ) {
-        tE & list_pos_elem = list_pos;
-        if (ORIGIN_TAG_QUERY((size_t) & list_pos_elem)) return 0;
-        return & list_pos_elem != 0p;
-    }
-
-    static inline int DUMB_COMPARE( diref(tE, tLinks) list_pos, tE * elem ) {
-        tE & signifiedLhs = list_pos;
-        return &signifiedLhs == elem;
-    }
-
-    static inline diref(tE, tLinks) ?`from( tE & elem ) {
-        diref(tE, tLinks) ret = { elem };
-        return ret;
-    }
-
-    static inline diref(tE, tLinks) ?`elems( dlist(tE, tLinks) & lst ) {
+    static inline tE & ?`elems( dlist(tE, tLinks) & lst ) {
         tE * origin = $get_list_origin_addr( lst );
-        diref(tE, tLinks) ret = { *origin };
-        return ret;
-    }
-
-    static inline bool ?`moveNext( diref(tE, tLinks) & refx ) {
+        return *origin;
+    }
+
+    static inline bool ?`moveNext( tE && refx ) {
         tE && ref_inner = refx;
         tE & oldReferent = * (tE*) ORIGIN_TAG_CLEAR( (size_t) & ref_inner );
-        &ref_inner = oldReferent`inner`inner.next;
+        &ref_inner = oldReferent`inner.next;
         return &ref_inner != 0p  &&
             ! ORIGIN_TAG_QUERY( (size_t) & ref_inner );
     }
 
-    static inline bool ?`movePrev( diref(tE, tLinks) & refx ) {
+    static inline bool ?`movePrev( tE && refx ) {
         tE && ref_inner = refx;
         tE & oldReferent = * (tE*) ORIGIN_TAG_CLEAR( (size_t) & ref_inner );
-        &ref_inner = oldReferent`inner`inner.prev;
+        &ref_inner = oldReferent`inner.prev;
         return &ref_inner != 0p  &&
             ! ORIGIN_TAG_QUERY( (size_t) & ref_inner );
     }
 
-    static inline bool ?`hasNext( diref(tE, tLinks) refx ) {
-        return refx`moveNext;
-    }
-
-    static inline bool ?`hasPrev( diref(tE, tLinks) refx ) {
-        return refx`movePrev;
-    }
-
-    static inline diref(tE, tLinks) ?`next( diref(tE, tLinks) refx ) {
-        if( refx`moveNext ) return refx;
-        tE && ref_inner = refx;
-        & ref_inner = 0p;
-        return refx;
-    }
-
-    static inline diref(tE, tLinks) ?`prev( diref(tE, tLinks) refx ) {
-        if( refx`movePrev ) return refx;
-        tE && ref_inner = refx;
-        & ref_inner = 0p;
-        return refx;
+    static inline bool ?`hasNext( tE & e ) {
+        return e`moveNext;
+    }
+
+    static inline bool ?`hasPrev( tE & e ) {
+        return e`movePrev;
+    }
+
+    static inline tE & ?`next( tE & e ) {
+        if( e`moveNext ) return e;
+        return * 0p;
+    }
+
+    static inline tE & ?`prev( tE & e ) {
+        if( e`movePrev ) return e;
+        return * 0p;
     }
 
@@ -262,5 +244,5 @@
 
     static inline tE & try_pop_front( dlist(tE, tLinks) &lst ) {
-        diref(tE, tLinks) first_inlist = lst`first;
+        tE & first_inlist = lst`first;
         tE & first_item = first_inlist;
         if (&first_item) remove(first_inlist);
@@ -269,5 +251,5 @@
 
     static inline tE & try_pop_back( dlist(tE, tLinks) &lst ) {
-        diref(tE, tLinks) last_inlist = lst`last;
+        tE & last_inlist = lst`last;
         tE & last_item = last_inlist;
         if (&last_item) remove(last_inlist);
@@ -282,5 +264,5 @@
         tE & lagElem = *0p;
 
-        while ( diref(tE, tLinks) it = this`elems; it`moveNext ) {
+        while ( tE & it = this`elems; it`moveNext ) {
             if (& lagElem == 0p &&  &it != & this`first ) return false;
             & lagElem = & it;
@@ -297,5 +279,5 @@
         tE & lagElem = *0p;
 
-        while ( diref(tE, tLinks) it = this`elems; it`movePrev ) {
+        while ( tE & it = this`elems; it`movePrev ) {
             if (& lagElem == 0p &&  &it != & this`last ) return false;
             & lagElem = & it;
@@ -314,42 +296,2 @@
 }
 
-forall( tE & | embedded( tE, dlink(tE) ) ) {
-	static inline void insert_after(tE & list_pos, tE &to_insert ) {
-        diref(tE, tE) list_pos_ref = list_pos`from;
-        insert_after( list_pos_ref, to_insert );
-    }
-	static inline void insert_before(tE & list_pos, tE &to_insert ) {
-        diref(tE, tE) list_pos_ref = list_pos`from;
-        insert_before( list_pos_ref, to_insert );
-    }
-	static inline tE & remove(tE & list_pos ) {
-        diref(tE, tE) list_pos_ref = list_pos`from;
-        return remove( list_pos_ref );
-    }
-    static inline bool ?`moveNext( tE && ref ) {
-        diref(tE, tE) & ref_dird = (diref(tE, tE) &) & ref;
-        return ref_dird`moveNext;
-    }
-    static inline bool ?`movePrev( tE && ref ) {
-        diref(tE, tE) & ref_dird = (diref(tE, tE) &) & ref;
-        return ref_dird`movePrev;
-    }
-    static inline bool ?`hasNext( tE & ref ) {
-        diref(tE, tE) ref_dird = { ref };
-        return ref_dird`hasNext;
-    }
-    static inline bool ?`hasPrev( tE & ref ) {
-        diref(tE, tE) ref_dird = { ref };
-        return ref_dird`hasPrev;
-    }
-    static inline tE & ?`next( tE & ref ) {
-        diref(tE, tE) ref_dird = { ref };
-        diref(tE, tE) rslt = ref_dird`next;
-        return rslt;
-    }
-    static inline tE & ?`prev( tE & ref ) {
-        diref(tE, tE) ref_dird = { ref };
-        diref(tE, tE) rslt = ref_dird`prev;
-        return rslt;
-    }
-}
Index: tests/list/dlist-insert-remove-2.cfa
===================================================================
--- tests/list/dlist-insert-remove-2.cfa	(revision 8d1ad36cef9bb7b219f38dfae154e557ae4f238e)
+++ tests/list/dlist-insert-remove-2.cfa	(revision 7d51ef867a6e78e1b2b6f9e5456b64a42c555758)
@@ -55,5 +55,6 @@
 ////////////////////////////////////////////////////////////
 
-void printMyFredsFwd(diref(fred, fred.mine) f) {
+void printMyFredsFwd(fred & f) {
+    with( DLINK_VIA( fred, fred.mine ) )
 	do {
 		sout | f.adatum;
@@ -61,5 +62,6 @@
 }
 
-void printMyFredsRev(diref(fred, fred.mine) f) {
+void printMyFredsRev(fred & f) {
+    with( DLINK_VIA( fred, fred.mine ) )
 	do {
 		sout | f.adatum;
@@ -75,12 +77,12 @@
 	}
 	if (&f1) {
-		printMyFredsFwd(f1`from);	sout | '-';
-		printMyFredsRev(f1`from);	sout | '-';
+		printMyFredsFwd(f1);	sout | '-';
+		printMyFredsRev(f1);	sout | '-';
 	} else {
 		sout | '-'; sout | '-';
 	}
 	if (&f2) {
-		printMyFredsFwd(f2`from);	sout | '-';
-		printMyFredsRev(f2`from);	sout | '-';
+		printMyFredsFwd(f2);	sout | '-';
+		printMyFredsRev(f2);	sout | '-';
 	} else {
 		sout | '-'; sout | '-';
@@ -88,5 +90,6 @@
 }
 
-void printYourFredsFwd(diref(fred, fred.yours) f) {
+void printYourFredsFwd(fred & f) {
+    with( DLINK_VIA( fred, fred.yours ) )
 	do {
 		sout | f.adatum;
@@ -94,5 +97,6 @@
 }
 
-void printYourFredsRev(diref(fred, fred.yours) f) {
+void printYourFredsRev(fred & f) {
+    with( DLINK_VIA( fred, fred.yours ) )
 	do {
 		sout | f.adatum;
@@ -107,12 +111,12 @@
 	}
 	if (&f1) {
-		printYourFredsFwd(f1`from);	sout | '-';
-		printYourFredsRev(f1`from);	sout | '-';
+		printYourFredsFwd(f1);	sout | '-';
+		printYourFredsRev(f1);	sout | '-';
 	} else {
 		sout | '-'; sout | '-';
 	}
 	if (&f2) {
-		printYourFredsFwd(f2`from);	sout | '-';
-		printYourFredsRev(f2`from);	sout | '-';
+		printYourFredsFwd(f2);	sout | '-';
+		printYourFredsRev(f2);	sout | '-';
 	} else {
 		sout | '-'; sout | '-';
@@ -275,5 +279,4 @@
 // All three tests exercise the case of creating an empty container and
 // adding two items to it.
-
 void test__insertfirst_two_on_empty__fred_mine() {
 
@@ -317,5 +320,4 @@
 	printYourFreddies(f1, f2, 0);   // 3.14, 0.5; 3.14; 0.5; 0.5, 3.14 (modified)
 }
-
 void test__insertfirst_two_on_empty__mary() {
 
@@ -323,5 +325,5 @@
 	mary m2 = {0.5};
 
-	dlist(mary, mary) lm;
+	dlist(mary) lm;
 
 	verify(validate(lm));
@@ -392,5 +394,5 @@
 	mary m2 = {0.5};
 
-	dlist(mary, mary) lm;
+	dlist(mary) lm;
 
 	verify(validate(lm));
@@ -421,16 +423,15 @@
 	dlist(fred, fred.mine) lf;
 
-	assert(! lf`first);
-	assert(! lf`last);
+	assert( & lf`first == 0p );
+	assert( & lf`last == 0p );
 
 	insert_first(lf, f1);
 
-	assert(DUMB_COMPARE(lf`first, & f1));
-	assert(DUMB_COMPARE(lf`last , & f1));
+	assert( & lf`first == & f1 );
+	assert( & lf`last  == & f1 );
 
 	verify(validate(lf));
 
-	diref(fred, fred.mine) f1_mine = f1`from;
-	insert_after(f1_mine, f2);
+	with ( DLINK_VIA(fred, fred.mine) ) insert_after(f1, f2);
 
 	verify(validate(lf));
@@ -439,6 +440,6 @@
 	printYourFreddies(f1, f2, 0);   // 3.14; 3.14; 0.5; 0.5 (unmodified)
 
-	assert(DUMB_COMPARE(lf`first, & f1));
-	assert(DUMB_COMPARE(lf`last , & f2));
+	assert( & lf`first == & f1 );
+	assert( & lf`last  == & f2 );
 }
 
@@ -450,16 +451,15 @@
 	dlist(fred, fred.yours) lf;
 
-	assert(! lf`first);
-	assert(! lf`last);
+	assert( & lf`first == 0p );
+	assert( & lf`last == 0p );
 
 	insert_first(lf, f1);
 
-	assert(DUMB_COMPARE(lf`first, & f1));
-	assert(DUMB_COMPARE(lf`last , & f1));
+	assert( & lf`first == & f1 );
+	assert( & lf`last  == & f1 );
 
 	verify(validate(lf));
 
-	diref(fred, fred.yours) f1_yours = f1`from;
-	insert_after(f1_yours, f2);
+    with ( DLINK_VIA(fred, fred.yours) ) insert_after(f1, f2);
 
 	verify(validate(lf));
@@ -468,6 +468,6 @@
 	printYourFreddies(f1, f2, 0);   // 3.14, 0.5; 3.14; 0.5; 0.5, 3.14 (modified)
 
-	assert(DUMB_COMPARE(lf`first, & f1));
-	assert(DUMB_COMPARE(lf`last , & f2));
+	assert( & lf`first == & f1 );
+	assert( & lf`last  == & f2 );
 }
 
@@ -477,13 +477,13 @@
 	mary m2 = {0.5};
 
-	dlist(mary, mary) lm;
-
-	assert(! lm`first);
-	assert(! lm`last);
+	dlist(mary) lm;
+
+	assert( & lm`first == 0p );
+	assert( & lm`last == 0p );
 
 	insert_first(lm, m1);
 
-	assert(DUMB_COMPARE(lm`first, & m1));
-	assert(DUMB_COMPARE(lm`last , & m1));
+	assert( & lm`first == & m1 );
+	assert( & lm`last  == & m1 );
 
 	verify(validate(lm));
@@ -495,6 +495,6 @@
 	printMariatheotokos(m1, m2, 0); // 3.14, 0.5; 3.14; 0.5; 0.5, 3.14 (modified)
 
-	assert(DUMB_COMPARE(lm`first, & m1));
-	assert(DUMB_COMPARE(lm`last , & m2));
+	assert( & lm`first == & m1 );
+	assert( & lm`last  == & m2 );
 }
 
@@ -516,16 +516,15 @@
 	dlist(fred, fred.mine) lf;
 
-	assert(! lf`first);
-	assert(! lf`last);
+	assert( & lf`first == 0p );
+	assert( & lf`last == 0p );
 
 	insert_last(lf, f2);
 
-	assert(DUMB_COMPARE(lf`first, & f2));
-	assert(DUMB_COMPARE(lf`last , & f2));
+	assert( & lf`first == & f2 );
+	assert( & lf`last  == & f2 );
 
 	verify(validate(lf));
 
-	diref(fred, fred.mine) f2_mine = f2`from;
-	insert_before(f2_mine, f1);
+	with ( DLINK_VIA(fred, fred.mine) ) insert_before(f2, f1);
 
 	verify(validate(lf));
@@ -534,6 +533,6 @@
 	printYourFreddies(f1, f2, 0);   // 3.14; 3.14; 0.5; 0.5 (unmodified)
 
-	assert(DUMB_COMPARE(lf`first, & f1));
-	assert(DUMB_COMPARE(lf`last , & f2));
+	assert( & lf`first == & f1 );
+	assert( & lf`last  == & f2 );
 }
 
@@ -545,16 +544,15 @@
 	dlist(fred, fred.yours) lf;
 
-	assert(! lf`first);
-	assert(! lf`last);
+	assert( & lf`first == 0p );
+	assert( & lf`last == 0p );
 
 	insert_last(lf, f2);
 
-	assert(DUMB_COMPARE(lf`first, & f2));
-	assert(DUMB_COMPARE(lf`last , & f2));
+	assert( & lf`first == & f2 );
+	assert( & lf`last  == & f2 );
 
 	verify(validate(lf));
 
-	diref(fred, fred.yours) f2_yours = f2`from;
-	insert_before(f2_yours, f1);
+	with ( DLINK_VIA(fred, fred.yours) )insert_before(f2, f1);
 
 	verify(validate(lf));
@@ -563,6 +561,6 @@
 	printYourFreddies(f1, f2, 0);   // 3.14, 0.5; 3.14; 0.5; 0.5, 3.14 (modified)
 
-	assert(DUMB_COMPARE(lf`first, & f1));
-	assert(DUMB_COMPARE(lf`last , & f2));
+	assert( & lf`first == & f1 );
+	assert( & lf`last  == & f2 );
 }
 
@@ -572,13 +570,13 @@
 	mary m2 = {0.5};
 
-	dlist(mary, mary) lm;
-
-	assert(! lm`first);
-	assert(! lm`last);
+	dlist(mary) lm;
+
+	assert( & lm`first == 0p );
+	assert( & lm`last == 0p );
 
 	insert_last(lm, m2);
 
-	assert(DUMB_COMPARE(lm`first, & m2));
-	assert(DUMB_COMPARE(lm`last , & m2));
+	assert( & lm`first == & m2 );
+	assert( & lm`last  == & m2 );
 
 	verify(validate(lm));
@@ -590,8 +588,7 @@
 	printMariatheotokos(m1, m2, 0); // 3.14, 0.5; 3.14; 0.5; 0.5, 3.14 (modified)
 
-	assert(DUMB_COMPARE(lm`first, & m1));
-	assert(DUMB_COMPARE(lm`last , & m2));
-}
-
+	assert( & lm`first == & m1 );
+	assert( & lm`last  == & m2 );
+}
 #if 0
 
@@ -900,6 +897,5 @@
 	verify(validate(flm));
 
-	diref(fred, fred.mine) f1_mine = f1`from;
-	remove(f1_mine);
+	with( DLINK_VIA(fred, fred.mine) ) remove(f1);
 
 	verify(validate(fly));
@@ -916,4 +912,5 @@
 	// assert(f1.$links_mine.prev.is_terminator == false);
 }
+
 
 void test__remove_at_head__fred_yours() {
@@ -939,6 +936,5 @@
 	verify(validate(flm));
 
-	diref(fred, fred.yours) f1_yours = f1`from;
-	remove(f1_yours);
+	with( DLINK_VIA(fred, fred.yours) ) remove(f1);
 
 	verify(validate(fly));
@@ -962,5 +958,5 @@
 	mary m3 = {3.7};
 
-	dlist(mary, mary) ml;
+	dlist(mary) ml;
 	insert_last(ml, m1);
 	insert_last(ml, m2);
@@ -1017,6 +1013,5 @@
 	verify(validate(flm));
 
-	diref(fred, fred.mine) f3_mine = f3`from;
-	remove(f3_mine);
+	with( DLINK_VIA(fred, fred.mine) ) remove(f3);
 
 	verify(validate(fly));
@@ -1056,6 +1051,5 @@
 	verify(validate(flm));
 
-	diref(fred, fred.yours) f3_yours = f3`from;
-	remove(f3_yours);
+	with( DLINK_VIA(fred, fred.yours) ) remove(f3);
 
 	verify(validate(fly));
@@ -1079,5 +1073,5 @@
 	mary m3 = {3.7};
 
-	dlist(mary, mary) ml;
+	dlist(mary) ml;
 	insert_last(ml, m1);
 	insert_last(ml, m2);
@@ -1128,12 +1122,11 @@
 	verify(validate(flm));
 
-	diref(fred, fred.mine) f_mine = f`from;
-	remove(f_mine);
-
-	verify(validate(fly));
-	verify(validate(flm));
-
-	assert(! flm`first);
-	assert(! flm`last);
+	with( DLINK_VIA(fred, fred.mine) ) remove(f);
+
+	verify(validate(fly));
+	verify(validate(flm));
+
+	assert( & flm`first == 0p );
+	assert( & flm`last == 0p );
 
 	printYourFreddies(fly`first, fly`last, 0);   // 0.7; 0.7; 0.7; 0.7 (unmodified)
@@ -1168,12 +1161,11 @@
 	verify(validate(flm));
 
-	diref(fred, fred.yours) f_yours = f`from;
-	remove(f_yours);
-
-	verify(validate(fly));
-	verify(validate(flm));
-
-	assert(! fly`first);
-	assert(! fly`last);
+	with( DLINK_VIA(fred, fred.yours) ) remove(f);
+
+	verify(validate(fly));
+	verify(validate(flm));
+
+	assert( & fly`first == 0p );
+	assert( & fly`last == 0p );
 
 	printYourFreddies(flm`first, flm`last, 0);   // 0.7; 0.7; 0.7; 0.7 (unmodified)
@@ -1196,5 +1188,5 @@
 	mary m = {0.7};
 
-	dlist(mary, mary) ml;
+	dlist(mary) ml;
 	insert_last(ml, m);
 
@@ -1207,6 +1199,6 @@
 	verify(validate(ml));
 
-	assert(! ml`first);
-	assert(! ml`last);
+	assert( & ml`first == 0p );
+	assert( & ml`last == 0p );
 
 	// observe f is solo in mine (now unlisted); in yours, it was just traversed
@@ -1256,5 +1248,5 @@
 	verify(validate(flm));
 
-	fred & popped = remove(flm`first);
+	fred & popped = try_pop_front(flm);
 
 	verify(validate(fly));
@@ -1292,5 +1284,5 @@
 	verify(validate(flm));
 
-	fred & popped = remove(fly`first);
+	fred & popped = try_pop_front(fly);
 
 	verify(validate(fly));
@@ -1312,5 +1304,5 @@
 	mary m3 = {3.7};
 
-	dlist(mary, mary) ml;
+	dlist(mary) ml;
 	insert_last(ml, m1);
 	insert_last(ml, m2);
@@ -1321,5 +1313,5 @@
 	verify(validate(ml));
 
-	mary & popped = remove(ml`first);
+	mary & popped = try_pop_front(ml);
 
 	verify(validate(ml));
@@ -1355,5 +1347,5 @@
 	verify(validate(flm));
 
-	fred & popped = remove(flm`last);
+	fred & popped = try_pop_back(flm);
 
 	verify(validate(fly));
@@ -1391,5 +1383,5 @@
 	verify(validate(flm));
 
-	fred & popped = remove(fly`last);
+	fred & popped = try_pop_back(fly);
 
 	verify(validate(fly));
@@ -1411,5 +1403,5 @@
 	mary m3 = {3.7};
 
-	dlist(mary, mary) ml;
+	dlist(mary) ml;
 	insert_last(ml, m1);
 	insert_last(ml, m2);
@@ -1420,5 +1412,5 @@
 	verify(validate(ml));
 
-	mary & popped = remove(ml`last);
+	mary & popped = try_pop_back(ml);
 
 	verify(validate(ml));
@@ -1431,5 +1423,4 @@
 	assert( &popped == &m3 );
 }
-
 
 ////////////////////////////////////////////////////////////
@@ -1450,5 +1441,5 @@
 	mary m3 = {3.7};
 
-	dlist(mary, mary) ml;	assert( ml`isEmpty);
+	dlist(mary) ml;			assert( ml`isEmpty);
 
 	insert_last(ml, m1);	assert(!ml`isEmpty);
@@ -1486,5 +1477,5 @@
 	mary m3 = {3.7};
 
-	dlist(mary, mary) ml;
+	dlist(mary) ml;
 
 	mary &m1r = *0p;
@@ -1588,5 +1579,5 @@
 	mary m1 = {1.7};
 
-	dlist(mary, mary) ml;
+	dlist(mary) ml;
 	mary & mlorigin = ml`elems;
 
