Index: Source/ETCollection.m
===================================================================
--- Source/ETCollection.m	(revision 4851)
+++ Source/ETCollection.m	(working copy)
@@ -74,6 +74,12 @@
 
 @implementation NSArray (ETCollection)
 
+/** Returns NSMutableDictionary class. */
++ (Class) mutableClass
+{
+	return [NSMutableArray class];
+}
+
 - (BOOL) isOrdered
 {
 	return YES;
@@ -108,6 +114,12 @@
 
 @implementation NSDictionary (ETCollection)
 
+/** Returns NSMutableDictionary class. */
++ (Class) mutableClass
+{
+	return [NSMutableDictionary class];
+}
+
 - (BOOL) isOrdered
 {
 	return NO;
@@ -149,6 +161,12 @@
 
 @implementation NSSet (ETCollection)
 
+/** Returns NSMutableSet class. */
++ (Class) mutableClass
+{
+	return [NSMutableSet class];
+}
+
 - (BOOL) isOrdered
 {
 	return NO;
@@ -171,8 +189,26 @@
 
 @end
 
+@implementation NSCountedSet (ETCollection)
+
+/** Returns self, the NSCountedSet class.
+
+NSCountedSet is always mutable and has not immutable equivalent. */
++ (Class) mutableClass
+{
+	return self;
+}
+
+@end
+
 @implementation NSIndexSet (ETCollection)
 
+/** Returns NSMutableIndexSet class. */
++ (Class) mutableClass
+{
+	return [NSMutableIndexSet class];
+}
+
 - (BOOL) isOrdered
 {
 	return NO;
Index: Source/ETCollection+HOMMethods.m
===================================================================
--- Source/ETCollection+HOMMethods.m	(revision 4851)
+++ Source/ETCollection+HOMMethods.m	(working copy)
@@ -38,112 +38,7 @@
  * This file is included by ETCollection+HOM.m to provide reusable methods for
  * higher-order messaging on collection classes.
  */
-+ (Class) mutableSubclass
-{
-	/* 
-	 * First, find the class that the ETCollection protocol was declared
-	 * upon. This is needed because NSArray and friends are class clusters
-	 * which are likely to return some private subclass. Classes conforming
-	 * to ETCollectionMutation can be reused. 
-	 * This is done by shifting a pair of the collectionClass and its
-	 * superClass up through the class hierarchy until collectionClass
-	 * conforms to the protocol but superClass doesn't, meaning that
-	 * collectionClass is the class actually adopting the protocol.
-	 */
-	Class collectionClass = self;
-	Class superClass = [collectionClass superclass];
-	BOOL haveFirstAdoptingClass = NO;
-	while((NO == haveFirstAdoptingClass) && ([superClass superclass]!= Nil))
-	{
-		if((YES == [collectionClass conformsToProtocol:
-		                             @protocol(ETCollectionMutation)])||
-		   ((YES == [collectionClass conformsToProtocol:
-		                             @protocol(ETCollection)]) &&
-		    (NO == [superClass conformsToProtocol: 
-		                             @protocol(ETCollection)]))
-		  )
-		{
-			/*
-		         * Either collectionClass conforms to
-		         * ETCollectionMutation, or it derives from a superclass
-		         * (superClass) that doesn't conform to ETCollection,
-		         * hence collectionClass is the adopting class.
-		 	 */
-			haveFirstAdoptingClass = YES;
-		}
-		else
-		{
-			/*
-			 * Shift the class pair one step up the hierarchy and
-			 * try again.
-			 */
-			collectionClass = superClass;
-			superClass = [collectionClass superclass];
-		}
-	}
 
-	//Next, get the first level of subclasses for collectionClasses.
-	NSArray *classes = [NSArray arrayWithObject: collectionClass];
-	NSMutableArray *nextClasses = [[NSMutableArray alloc] init];
-	Class mutableCollectionClass = Nil;
-	[classes retain];
-	do
-	{
-		/* Find a class on the present level of subclasses that conforms
-		 * to ETCollectionMutation.
-		 */
-		FOREACHI(classes,class)
-		{
-			/*
-			 * It is needed to check for NSMutableArray explicitly
-			 * because it does not adopt the ETCollectionMutation
-			 * protocol correctly.
-			 */
-			if(([class conformsToProtocol:
-			                 @protocol(ETCollectionMutation)]
-		        || (class == [NSMutableArray class]) 
-		        ) &&
-			   (Nil == mutableCollectionClass))
-			{
-				mutableCollectionClass = class;	
-			}
-		}
-		if(Nil == mutableCollectionClass)
-		{
-			/* 
-			 * None of the classes at this level conform to
-			 * ETCollectionMutation. A new array containing all
-			 * subclasses of the present set of classes will be
-			 * constructed.
-			 */
-			[nextClasses removeAllObjects];
-			FOREACHI(classes, class)
-			{
-				NSArray *subClasses;
-				subClasses = [class directSubclasses];
-				if([subClasses count] > 0)
-				{
-					[nextClasses addObjectsFromArray:
-					                       subClasses];
-				}
-			}
-		}
-	[classes autorelease];
-	
-	//Set the classes for the next iteration to the subclasses just derived.
-	classes = [NSArray arrayWithArray: nextClasses];
-	[classes retain];
-	} while((Nil == mutableCollectionClass) && ([nextClasses count] > 0));
-	[classes release];
-	[nextClasses release];
-	return mutableCollectionClass;
-}
-
-- (Class) mutableSubclass 
-{
-	return [[self class] mutableSubclass];
-}
-
 - (id) mappedCollection
 {
 	return [[[ETCollectionMapProxy alloc] initWithCollection: self]
Index: Source/NSObject+Model.m
===================================================================
--- Source/NSObject+Model.m	(revision 4851)
+++ Source/NSObject+Model.m	(working copy)
@@ -132,6 +132,12 @@
 	return [self isKindOfClass: [NSNumber class]];
 }
 
+/** Returns a mutable counterpart class or Nil if such a class does not exist. */
++ (Class) mutableClass
+{
+	return Nil;
+}
+
 /** <override />
 	Returns YES if the receiver is declared as a group, otherwise returns NO. 
 	This method returns NO by default. You can override it to return YES if you
Index: Source/ETCollection+HOM.m
===================================================================
--- Source/ETCollection+HOM.m	(revision 4851)
+++ Source/ETCollection+HOM.m	(working copy)
@@ -51,8 +51,8 @@
 	SEL selector;
 	id<NSObject,ETCollection> theCollection = *aCollection;
 	Class mutableCollectionClass;
-	//Cast to NSArray because mutableClass is not yet in any protocol.
-	mutableCollectionClass = [(NSArray*)theCollection mutableSubclass];
+	//Cast to id because mutableClass is not yet in any protocol.
+	mutableCollectionClass = [[theCollection class] mutableClass];
 	id<ETCollectionMutation> mappedCollection;
 	mappedCollection = [[mutableCollectionClass alloc] init];
 
@@ -465,10 +465,9 @@
 {
 	id<NSObject,ETCollection> theCollection;
 	theCollection = *aCollection;
-	//Cast to NSArray because mutableClass is not yet in any protocols.
-	Class mutableSubclass = [(NSArray*)theCollection mutableSubclass];
+	Class mutableClass = [[theCollection class] mutableClass];
 	id<NSObject,ETCollectionMutation> mutableCollection;
-	mutableCollection = [[mutableSubclass alloc] init];
+	mutableCollection = [[mutableClass alloc] init];
 	ETHOMFilterCollectionWithBoIAsBlockAndTarget(               aCollection,
 	                                                      blockOrInvocation,
 	                                                                isBlock,
Index: Source/TestUUID.m
===================================================================
--- Source/TestUUID.m	(revision 4851)
+++ Source/TestUUID.m	(working copy)
@@ -10,6 +10,7 @@
 #import <UnitKit/UnitKit.h>
 #import "Macros.h"
 #import "ETUUID.h"
+#import "EtoileCompatibility.h"
 
 
 @interface TestUUID: NSObject <UKTest>
Index: Headers/NSObject+Model.h
===================================================================
--- Headers/NSObject+Model.h	(revision 4851)
+++ Headers/NSObject+Model.h	(working copy)
@@ -73,6 +73,8 @@
 
 /* Collection & Mutability */
 
++ (Class) mutableClass;
+
 - (BOOL) isMutable;
 - (BOOL) isCollection;
 - (BOOL) isMutableCollection;
Index: Headers/ETCollection+HOM.h
===================================================================
--- Headers/ETCollection+HOM.h	(revision 4851)
+++ Headers/ETCollection+HOM.h	(working copy)
@@ -37,18 +37,6 @@
 @protocol ETCollectionHOM
 
 /**
- * Returns a mutable subclass of the collection class or Nil if such a class
- * does not exist.
- */
-+ (Class) mutableSubclass;
-
-/**
- * Convenience method to return the mutable subclass of the class the receiver
- * belongs to.
- */
-- (Class) mutableSubclass;
-
-/**
  * Returns a proxy object on which methods can be called. These methods will
  * cause a collection to be returned containing the elements of the original
  * collection mapped by the method call.
Index: Headers/ETCollection.h
===================================================================
--- Headers/ETCollection.h	(revision 4851)
+++ Headers/ETCollection.h	(working copy)
@@ -90,6 +90,7 @@
 /* Adopted by the following Foundation classes  */
 
 @interface NSArray (ETCollection) <ETCollection>
++ (Class) mutableClass;
 - (BOOL) isOrdered;
 - (BOOL) isEmpty;
 - (id) content;
@@ -97,6 +98,7 @@
 @end
 
 @interface NSDictionary (ETCollection) <ETCollection>
++ (Class) mutableClass;
 - (BOOL) isOrdered;
 - (BOOL) isEmpty;
 - (id) content;
@@ -105,13 +107,21 @@
 @end
 
 @interface NSSet (ETCollection) <ETCollection>
++ (Class) mutableClass;
 - (BOOL) isOrdered;
 - (BOOL) isEmpty;
 - (id) content;
 - (NSArray *) contentArray;
 @end
 
+/** NSCountedSet is a NSMutableSet subclass and thereby inherits the collection 
+protocol methods implemented in NSSet(ETCollection). */
+@interface NSCountedSet (ETCollection)
++ (Class) mutableClass;
+@end
+
 @interface NSIndexSet (ETCollection) <ETCollection>
++ (Class) mutableClass;
 - (BOOL) isOrdered;
 - (BOOL) isEmpty;
 - (id) content;
