Index: libcfa/src/containers/list2.hfa
===================================================================
--- libcfa/src/containers/list2.hfa	(revision 16800728942a47f77748c1e6da52e1f54dd89756)
+++ libcfa/src/containers/list2.hfa	(revision 1e5cd9a357bd981da7ec4fa42d5d655fd67c15c6)
@@ -18,23 +18,32 @@
 #include <assert.h>
 
-forall( T & ) struct tag {};
-#define ttag(T) ((tag(T)){})
-#define ztag(n) ttag(Z(n))
-
-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) )
 
 
@@ -85,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;
@@ -109,10 +112,4 @@
             ( ( dlink(tE) & ) this ){ listOrigin, listOrigin } ;
         }
-
-        // redundant
-        // void ?{}( diref(tE, tLinks) & this, tE & target ) {
-        //     tE && ref = this;
-        //     &ref = &target;
-        // }
     }
 
@@ -120,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;
@@ -178,55 +179,60 @@
 	}
 
-    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;
-    }
-
-    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 ) {
+        return *lastPtr;
+    }
+
+    static inline bool ?`isEmpty( dlist(tE, tLinks) & lst ) {
+        tE * firstPtr = lst.next;
+        if (ORIGIN_TAG_QUERY((size_t)firstPtr)) firstPtr = 0p;
+        return firstPtr == 0p;
+    }
+
+    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( 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;
+    }
+
     static inline void insert_first( dlist(tE, tLinks) &lst, tE & e ) {
         insert_after(lst`elems, e);
@@ -235,4 +241,18 @@
     static inline void insert_last( dlist(tE, tLinks) &lst, tE & e ) {
         insert_before(lst`elems, e);
+    }
+
+    static inline tE & try_pop_front( dlist(tE, tLinks) &lst ) {
+        tE & first_inlist = lst`first;
+        tE & first_item = first_inlist;
+        if (&first_item) remove(first_inlist);
+        return first_item;
+    }
+
+    static inline tE & try_pop_back( dlist(tE, tLinks) &lst ) {
+        tE & last_inlist = lst`last;
+        tE & last_item = last_inlist;
+        if (&last_item) remove(last_inlist);
+        return last_item;
     }
 
@@ -244,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;
@@ -259,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;
@@ -276,25 +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;
-    }
-
-}
Index: tests/list/.expect/dlist-insert-remove-2.txt
===================================================================
--- tests/list/.expect/dlist-insert-remove-2.txt	(revision 16800728942a47f77748c1e6da52e1f54dd89756)
+++ tests/list/.expect/dlist-insert-remove-2.txt	(revision 1e5cd9a357bd981da7ec4fa42d5d655fd67c15c6)
@@ -1092,2 +1092,19 @@
 -
 -
+
+~~~~~~~~~~~~~~~~~~~ Ease-of-access cases ~~~~~~~~~~~~~~~~~~
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+Test 18-i.  Modifying Freds on MINE
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+Not implmented
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+Test 18-ii.  Modifying Freds on YOURS
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+Not implmented
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+Test 18-iii.  Modifying Maries
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+accessor_cases done
+try_pop cases done
+origin_mutation cases done
Index: tests/list/dlist-insert-remove-2.cfa
===================================================================
--- tests/list/dlist-insert-remove-2.cfa	(revision 16800728942a47f77748c1e6da52e1f54dd89756)
+++ tests/list/dlist-insert-remove-2.cfa	(revision 1e5cd9a357bd981da7ec4fa42d5d655fd67c15c6)
@@ -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));
@@ -1430,4 +1422,187 @@
 
 	assert( &popped == &m3 );
+}
+
+////////////////////////////////////////////////////////////
+//
+// Section 4g
+//
+// Test cases of `isEmpty, `hasPrev, `hasNext,
+// try_pop_front, try_pop_back, modifications via `elems
+//
+// Example of call-side user code
+//
+////////////////////////////////////////////////////////////
+
+void test__accessor_cases__mary() {
+
+	mary m1 = {1.7};
+	mary m2 = {2.7};
+	mary m3 = {3.7};
+
+	dlist(mary) ml;			assert( ml`isEmpty);
+
+	insert_last(ml, m1);	assert(!ml`isEmpty);
+	insert_last(ml, m2);	assert(!ml`isEmpty);
+	insert_last(ml, m3);	assert(!ml`isEmpty);
+
+	mary & m1prev = m1`prev;
+	mary & m1next = m1`next;
+	mary & m2prev = m2`prev;
+	mary & m2next = m2`next;
+	mary & m3prev = m3`prev;
+	mary & m3next = m3`next;
+
+	assert (&m1prev == 0p);
+	assert (&m1next == &m2);
+	assert (&m2prev == &m1);
+	assert (&m2next == &m3);
+	assert (&m3prev == &m2);
+	assert (&m3next == 0p);
+
+	assert(!m1`hasPrev);
+	assert( m1`hasNext);
+	assert( m2`hasPrev);
+	assert( m2`hasNext);
+	assert( m3`hasPrev);
+	assert(!m3`hasNext);
+
+	printf("accessor_cases done\n");
+}
+
+void test__try_pop__mary() {
+
+	mary m1 = {1.7};
+	mary m2 = {2.7};
+	mary m3 = {3.7};
+
+	dlist(mary) ml;
+
+	mary &m1r = *0p;
+	mary &m2r = *0p;
+	mary &m3r = *0p;
+	mary &mxr = *0p;
+
+	// queue, back to front
+
+	assert( ml`isEmpty);
+
+	insert_last(ml, m1);
+	insert_last(ml, m2);
+	insert_last(ml, m3);
+
+	&m1r = & try_pop_front(ml);	assert(!ml`isEmpty);
+	&m2r = & try_pop_front(ml);	assert(!ml`isEmpty);
+	&m3r = & try_pop_front(ml);	assert( ml`isEmpty);
+	&mxr = & try_pop_front(ml);	assert( ml`isEmpty);
+
+	assert( &m1r == &m1 );
+	assert( &m2r == &m2 );
+	assert( &m3r == &m3 );
+	assert( &mxr == 0p  );
+
+	&m1r = 0p;
+	&m2r = 0p;
+	&m3r = 0p;
+
+	// queue, front to back
+
+	assert( ml`isEmpty);
+
+	insert_first(ml, m1);
+	insert_first(ml, m2);
+	insert_first(ml, m3);
+
+	&m1r = & try_pop_back(ml);	assert(!ml`isEmpty);
+	&m2r = & try_pop_back(ml);	assert(!ml`isEmpty);
+	&m3r = & try_pop_back(ml);	assert( ml`isEmpty);
+	&mxr = & try_pop_back(ml);	assert( ml`isEmpty);
+
+	assert( &m1r == &m1 );
+	assert( &m2r == &m2 );
+	assert( &m3r == &m3 );
+	assert( &mxr == 0p  );
+
+	&m1r = 0p;
+	&m2r = 0p;
+	&m3r = 0p;
+
+	// stack at front
+
+	assert( ml`isEmpty);
+
+	insert_first(ml, m1);
+	insert_first(ml, m2);
+	insert_first(ml, m3);
+
+	&m3r = & try_pop_front(ml);	assert(!ml`isEmpty);
+	&m2r = & try_pop_front(ml);	assert(!ml`isEmpty);
+	&m1r = & try_pop_front(ml);	assert( ml`isEmpty);
+	&mxr = & try_pop_front(ml);	assert( ml`isEmpty);
+
+	assert( &m1r == &m1 );
+	assert( &m2r == &m2 );
+	assert( &m3r == &m3 );
+	assert( &mxr == 0p  );
+
+	&m1r = 0p;
+	&m2r = 0p;
+	&m3r = 0p;
+
+	// stack at back
+
+	assert( ml`isEmpty);
+
+	insert_last(ml, m1);
+	insert_last(ml, m2);
+	insert_last(ml, m3);
+
+	&m3r = & try_pop_back(ml);	assert(!ml`isEmpty);
+	&m2r = & try_pop_back(ml);	assert(!ml`isEmpty);
+	&m1r = & try_pop_back(ml);	assert( ml`isEmpty);
+	&mxr = & try_pop_back(ml);	assert( ml`isEmpty);
+
+	assert( &m1r == &m1 );
+	assert( &m2r == &m2 );
+	assert( &m3r == &m3 );
+	assert( &mxr == 0p  );
+
+	&m1r = 0p;
+	&m2r = 0p;
+	&m3r = 0p;
+
+	printf("try_pop cases done\n");
+}
+
+void test__origin_mutation__mary() {
+
+	mary m1 = {1.7};
+
+	dlist(mary) ml;
+	mary & mlorigin = ml`elems;
+
+	// insert before the origin
+
+	insert_before( ml`elems, m1 );
+	assert( ! ml`isEmpty );
+
+	mary & mlfirst = ml`first;
+	mary & mllast = ml`last;
+
+	assert( &m1 == & mlfirst );
+	assert( &m1 == & mllast );
+
+	// moveNext after last goes back to origin, &vv
+
+	bool canMoveNext = mllast`moveNext;
+	bool canMovePrev = mlfirst`movePrev;
+
+	assert( ! canMoveNext );
+	assert( ! canMovePrev );
+
+	assert( &mlorigin == & mlfirst );
+	assert( &mlorigin == & mllast );
+
+	printf("origin_mutation cases done\n");
 }
 
@@ -1708,4 +1883,26 @@
 	test__pop_last__maries();
 
+	sout | "";
+	sout | "~~~~~~~~~~~~~~~~~~~ Ease-of-access cases ~~~~~~~~~~~~~~~~~~";
+	sout | "";
+
+	sout | "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~";
+	sout | "Test 18-i.  Modifying Freds on MINE";
+	sout | "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~";
+	sout | "Not implmented";
+
+	sout | "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~";
+	sout | "Test 18-ii.  Modifying Freds on YOURS";
+	sout | "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~";
+	sout | "Not implmented";
+
+	sout | "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~";
+	sout | "Test 18-iii.  Modifying Maries";
+	sout | "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~";
+
+	test__accessor_cases__mary();
+	test__try_pop__mary();
+	test__origin_mutation__mary();
+
 	return 0;
 }
