Index: libcfa/src/concurrency/kernel/cluster.cfa
===================================================================
--- libcfa/src/concurrency/kernel/cluster.cfa	(revision 1e38178d2850a9cb987631ad78f994d928456ae6)
+++ libcfa/src/concurrency/kernel/cluster.cfa	(revision 13f066dea11d85202f3ce35355cc96fd2e00b47d)
@@ -69,23 +69,4 @@
 }
 
-#if   defined(CFA_HAVE_LINUX_LIBRSEQ)
-	// No forward declaration needed
-	#define __kernel_rseq_register rseq_register_current_thread
-	#define __kernel_rseq_unregister rseq_unregister_current_thread
-#elif defined(CFA_HAVE_LINUX_RSEQ_H)
-	static void __kernel_raw_rseq_register  (void);
-	static void __kernel_raw_rseq_unregister(void);
-
-	#define __kernel_rseq_register __kernel_raw_rseq_register
-	#define __kernel_rseq_unregister __kernel_raw_rseq_unregister
-#else
-	// No forward declaration needed
-	// No initialization needed
-	static inline void noop(void) {}
-
-	#define __kernel_rseq_register noop
-	#define __kernel_rseq_unregister noop
-#endif
-
 //=======================================================================
 // Cluster wide reader-writer lock
@@ -110,6 +91,4 @@
 // Lock-Free registering/unregistering of threads
 unsigned register_proc_id( void ) with(__scheduler_lock.lock) {
-	__kernel_rseq_register();
-
 	bool * handle = (bool *)&kernelTLS().sched_lock;
 
@@ -161,6 +140,4 @@
 
 	__atomic_store_n(cell, 0p, __ATOMIC_RELEASE);
-
-	__kernel_rseq_unregister();
 }
 
@@ -504,58 +481,2 @@
 	/* paranoid */ verify( mock_head(this)    == this.l.prev );
 }
-
-#if   defined(CFA_HAVE_LINUX_LIBRSEQ)
-	// No definition needed
-#elif defined(CFA_HAVE_LINUX_RSEQ_H)
-
-	#if defined( __x86_64 ) || defined( __i386 )
-		#define RSEQ_SIG	0x53053053
-	#elif defined( __ARM_ARCH )
-		#ifdef __ARMEB__
-		#define RSEQ_SIG    0xf3def5e7      /* udf    #24035    ; 0x5de3 (ARMv6+) */
-		#else
-		#define RSEQ_SIG    0xe7f5def3      /* udf    #24035    ; 0x5de3 */
-		#endif
-	#endif
-
-	extern void __disable_interrupts_hard();
-	extern void __enable_interrupts_hard();
-
-	static void __kernel_raw_rseq_register  (void) {
-		/* paranoid */ verify( __cfaabi_rseq.cpu_id == RSEQ_CPU_ID_UNINITIALIZED );
-
-		// int ret = syscall(__NR_rseq, &__cfaabi_rseq, sizeof(struct rseq), 0, (sigset_t *)0p, _NSIG / 8);
-		int ret = syscall(__NR_rseq, &__cfaabi_rseq, sizeof(struct rseq), 0, RSEQ_SIG);
-		if(ret != 0) {
-			int e = errno;
-			switch(e) {
-			case EINVAL: abort("KERNEL ERROR: rseq register invalid argument");
-			case ENOSYS: abort("KERNEL ERROR: rseq register no supported");
-			case EFAULT: abort("KERNEL ERROR: rseq register with invalid argument");
-			case EBUSY : abort("KERNEL ERROR: rseq register already registered");
-			case EPERM : abort("KERNEL ERROR: rseq register sig  argument  on unregistration does not match the signature received on registration");
-			default: abort("KERNEL ERROR: rseq register unexpected return %d", e);
-			}
-		}
-	}
-
-	static void __kernel_raw_rseq_unregister(void) {
-		/* paranoid */ verify( __cfaabi_rseq.cpu_id >= 0 );
-
-		// int ret = syscall(__NR_rseq, &__cfaabi_rseq, sizeof(struct rseq), RSEQ_FLAG_UNREGISTER, (sigset_t *)0p, _NSIG / 8);
-		int ret = syscall(__NR_rseq, &__cfaabi_rseq, sizeof(struct rseq), RSEQ_FLAG_UNREGISTER, RSEQ_SIG);
-		if(ret != 0) {
-			int e = errno;
-			switch(e) {
-			case EINVAL: abort("KERNEL ERROR: rseq unregister invalid argument");
-			case ENOSYS: abort("KERNEL ERROR: rseq unregister no supported");
-			case EFAULT: abort("KERNEL ERROR: rseq unregister with invalid argument");
-			case EBUSY : abort("KERNEL ERROR: rseq unregister already registered");
-			case EPERM : abort("KERNEL ERROR: rseq unregister sig  argument  on unregistration does not match the signature received on registration");
-			default: abort("KERNEL ERROR: rseq unregisteunexpected return %d", e);
-			}
-		}
-	}
-#else
-	// No definition needed
-#endif
Index: libcfa/src/concurrency/kernel/private.hfa
===================================================================
--- libcfa/src/concurrency/kernel/private.hfa	(revision 1e38178d2850a9cb987631ad78f994d928456ae6)
+++ libcfa/src/concurrency/kernel/private.hfa	(revision 13f066dea11d85202f3ce35355cc96fd2e00b47d)
@@ -10,6 +10,6 @@
 // Created On       : Mon Feb 13 12:27:26 2017
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Wed Aug 12 08:21:33 2020
-// Update Count     : 9
+// Last Modified On : Thu Mar  2 16:04:46 2023
+// Update Count     : 11
 //
 
@@ -29,14 +29,5 @@
 
 extern "C" {
-#if   defined(CFA_HAVE_LINUX_LIBRSEQ)
-	#include <rseq/rseq.h>
-#elif defined(CFA_HAVE_LINUX_RSEQ_H)
-	#include <linux/rseq.h>
-#else
-	#ifndef _GNU_SOURCE
-	#error kernel/private requires gnu_source
-	#endif
 	#include <sched.h>
-#endif
 }
 
@@ -110,25 +101,7 @@
 // Hardware
 
-#if   defined(CFA_HAVE_LINUX_LIBRSEQ)
-	// No data needed
-#elif defined(CFA_HAVE_LINUX_RSEQ_H)
-	extern "Cforall" {
-		extern __attribute__((aligned(64))) __thread volatile struct rseq __cfaabi_rseq;
-	}
-#else
-	// No data needed
-#endif
-
 static inline int __kernel_getcpu() {
 	/* paranoid */ verify( ! __preemption_enabled() );
-#if   defined(CFA_HAVE_LINUX_LIBRSEQ)
-	return rseq_current_cpu();
-#elif defined(CFA_HAVE_LINUX_RSEQ_H)
-	int r = __cfaabi_rseq.cpu_id;
-	/* paranoid */ verify( r >= 0 );
-	return r;
-#else
 	return sched_getcpu();
-#endif
 }
 
Index: libcfa/src/concurrency/kernel/startup.cfa
===================================================================
--- libcfa/src/concurrency/kernel/startup.cfa	(revision 1e38178d2850a9cb987631ad78f994d928456ae6)
+++ libcfa/src/concurrency/kernel/startup.cfa	(revision 13f066dea11d85202f3ce35355cc96fd2e00b47d)
@@ -147,16 +147,4 @@
 __scheduler_RWLock_t __scheduler_lock @= { 0 };
 
-#if   defined(CFA_HAVE_LINUX_LIBRSEQ)
-	// No data needed
-#elif defined(CFA_HAVE_LINUX_RSEQ_H)
-	extern "Cforall" {
-		__attribute__((aligned(64))) __thread volatile struct rseq __cfaabi_rseq @= {
-			.cpu_id : RSEQ_CPU_ID_UNINITIALIZED,
-		};
-	}
-#else
-	// No data needed
-#endif
-
 //-----------------------------------------------------------------------------
 // Struct to steal stack
Index: libcfa/src/containers/array.hfa
===================================================================
--- libcfa/src/containers/array.hfa	(revision 1e38178d2850a9cb987631ad78f994d928456ae6)
+++ libcfa/src/containers/array.hfa	(revision 13f066dea11d85202f3ce35355cc96fd2e00b47d)
@@ -9,9 +9,35 @@
 
 
-//
-// Single-dim array sruct (with explicit packing and atom)
-//
-
+// 
+// The `array` macro is the public interface.
+// It computes the type of a dense (trivially strided) array.
+// All user-declared objects are dense arrays.
+//
+// The `arpk` (ARray with PacKing info explicit) type is, generally, a slice with _any_ striding.
+// This type is meant for internal use.
+// CFA programmers should not instantiate it directly, nor access its field.
+// CFA programmers should call ?[?] on it.
+// Yet user-given `array(stuff)` expands to `arpk(stuff')`.
+// The comments here explain the resulting internals.
+//
+// Just as a plain-C "multidimesional" array is really array-of-array-of-...,
+// so does arpk generally show up as arpk-of-arpk-of...
+//
+// In the example of `array(float, 3, 4, 5) a;`,
+// `typeof(a)` is an `arpk` instantiation.
+// These comments explain _its_ arguments, i.e. those of the topmost `arpk` level.
+//
+// [N]    : the number of elements in `a`; 3 in the example
+// S      : carries the stride size (distance in bytes between &myA[0] and &myA[1]), in sizeof(S); 
+//          same as Timmed when striding is trivial, same as Timmed in the example
+// Timmed : (T-immediate) the inner type; conceptually, `typeof(a)` is "arpk of Timmed";
+//          array(float, 4, 5) in the example
+// Tbase  : (T-base) the deepest element type that is not arpk; float in the example
+//
 forall( [N], S & | sized(S), Timmed &, Tbase & ) {
+
+    //
+    // Single-dim array sruct (with explicit packing and atom)
+    //
     struct arpk {
         S strides[N];
Index: libcfa/src/interpose.cfa
===================================================================
--- libcfa/src/interpose.cfa	(revision 1e38178d2850a9cb987631ad78f994d928456ae6)
+++ libcfa/src/interpose.cfa	(revision 13f066dea11d85202f3ce35355cc96fd2e00b47d)
@@ -10,6 +10,6 @@
 // Created On       : Wed Mar 29 16:10:31 2017
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Fri Feb 24 15:31:03 2023
-// Update Count     : 185
+// Last Modified On : Thu Mar  2 13:56:26 2023
+// Update Count     : 191
 //
 
@@ -53,9 +53,10 @@
 
 static generic_fptr_t interpose_symbol( const char symbol[], const char version[] ) {
-	static void * library;
-	static void * pthread_library;
-
+	void * library;
+	#if defined( RTLD_NEXT )
+	library = RTLD_NEXT;
+	#else
+	library = dlopen( "libc.so.6", RTLD_LAZY );
 	if ( ! library ) {
-		library = dlopen( "libc.so.6", RTLD_LAZY );
 		const char * error = dlerror();
 		if ( error ) {
@@ -63,11 +64,5 @@
 		} // if
 	} // if
-	if ( ! pthread_library ) {
-		pthread_library = dlopen( "libpthread.so", RTLD_LAZY );
-		const char * error = dlerror();
-		if ( error ) {
-			abort( "interpose_symbol : failed to open libpthread, %s\n", error );
-		} // if
-	} // if
+	#endif
 
 	return do_interpose_symbol(library, symbol, version);
@@ -108,4 +103,14 @@
 
 		if(__cfathreadabi_interpose_startup) __cfathreadabi_interpose_startup( do_interpose_symbol );
+
+		// SKULLDUGGERY: In Ubuntu 22.04, someone augmented signal.h to allow SIGSTKSZ to be "sysconf(_SC_SIGSTKSZ)" in
+		// sigstksz.h, as well as 8192 in sigstack.h. HOWEVER, they forgot to provide a mechanism to tell signal.h to
+		// use sigstack.h rather than sigstksz.h. (I'm not happy.) By undefining _GNU_SOURCE before signal.h and
+		// redefining it afterwards, you can get 8192, but then nothing works correctly inside of signal.h without
+		// _GNU_SOURCE defined.  So what is needed is a way to get signal.h to use sigstack.h WITH _GNU_SOURCE defined.
+		// Basically something is wrong with features.h and its use in signal.h.
+
+		#undef SIGSTKSZ
+		#define SIGSTKSZ 8192
 
 		// As a precaution (and necessity), errors that result in termination are delivered on a separate stack because
Index: libcfa/src/interpose_thread.cfa
===================================================================
--- libcfa/src/interpose_thread.cfa	(revision 1e38178d2850a9cb987631ad78f994d928456ae6)
+++ libcfa/src/interpose_thread.cfa	(revision 13f066dea11d85202f3ce35355cc96fd2e00b47d)
@@ -39,7 +39,11 @@
 	const char version[]
 ) libcfa_public {
-	static void * library;
+	void * library;
+	#if defined( RTLD_NEXT )
+	library = RTLD_NEXT;
+	#else
+	// missing RTLD_NEXT => must hard-code library name, assuming libstdc++
+	library = dlopen( "libthread_db.so", RTLD_LAZY );
 	if ( ! library ) {
-		library = dlopen( "libpthread.so", RTLD_LAZY );
 		const char * error = dlerror();
 		if ( error ) {
@@ -47,4 +51,5 @@
 		}
 	} // if
+	#endif // RTLD_NEXT
 
 	return do_interpose_symbol(library, symbol, version);
Index: src/InitTweak/FixInitNew.cpp
===================================================================
--- src/InitTweak/FixInitNew.cpp	(revision 1e38178d2850a9cb987631ad78f994d928456ae6)
+++ src/InitTweak/FixInitNew.cpp	(revision 13f066dea11d85202f3ce35355cc96fd2e00b47d)
@@ -107,6 +107,6 @@
 	private:
 		/// hack to implement WithTypeSubstitution while conforming to mutation safety.
-		ast::TypeSubstitution * env;
-		bool                    envModified;
+		ast::TypeSubstitution * env         = nullptr;
+		bool                    envModified = false;
 	};
 
@@ -522,5 +522,4 @@
 	{
 		static UniqueName tempNamer("_tmp_cp");
-		assert( env );
 		const CodeLocation loc = impCpCtorExpr->location;
 		// CP_CTOR_PRINT( std::cerr << "Type Substitution: " << *env << std::endl; )
@@ -534,4 +533,5 @@
 
 		// xxx - this originally mutates arg->result in place. is it correct?
+		assert( env );
 		result = env->applyFree( result.get() ).node;
 		auto mutResult = result.get_and_mutate();
