Index: libcfa/src/collections/array.hfa
===================================================================
--- libcfa/src/collections/array.hfa	(revision 681e12fe6a6c02c012774ae0c71d29db74b18307)
+++ libcfa/src/collections/array.hfa	(revision cfbc56ecba6583d7520c7a7a6bf7f4194e8016a0)
@@ -131,13 +131,27 @@
 
     static inline void __taglen( tag(arpk(N, S, Timmed, Tbase)), tag(N) ) {}
-
-    // workaround #226 (and array relevance thereof demonstrated in mike102/otype-slow-ndims.cfa)
-    static inline void ?{}( arpk(N, S, Timmed, Tbase) & this ) {
-        void ?{}( S (&inner)[N] ) {}
-        ?{}(this.strides);
-    }
-    static inline void ^?{}( arpk(N, S, Timmed, Tbase) & this ) {
-        void ^?{}( S (&inner)[N] ) {}
-        ^?{}(this.strides);
+}
+
+// RAII pattern has workarounds for
+//  - Trac 226:  Simplest handling would be, require immediate element to be otype, let autogen
+//    raii happen.  Performance on even a couple dimensions is unacceptable because of exponential
+//    thunk creation: ?{}() needs all four otype funcs from next level, so does ^?{}(), so do the
+//    other two.  This solution offers ?{}() that needs only ?{}(), and similar for ^?{}.
+
+forall( [N], S & | sized(S), Timmed &, Tbase & | { void ?{}( Timmed & ); } )
+static inline void ?{}( arpk(N, S, Timmed, Tbase) & this ) {    
+    void ?{}( S (&)[N] ) {}
+    ?{}(this.strides);
+
+    for (i; N) ?{}( (Timmed &) this.strides[i] );
+}
+
+forall( [N], S & | sized(S), Timmed &, Tbase & | { void ^?{}( Timmed & ); } )
+static inline void ^?{}( arpk(N, S, Timmed, Tbase) & this ) {
+    void ^?{}( S (&)[N] ) {}
+    ^?{}(this.strides);
+
+    for (i; N ) {
+        ^?{}( (Timmed &) this.strides[N-i-1] );
     }
 }
@@ -147,5 +161,5 @@
 //
 
-forall( Te )
+forall( Te * )
 static inline Te mkar_( tag(Te) ) {}
 
