Index: src/libcfa/concurrency/threads
===================================================================
--- src/libcfa/concurrency/threads	(revision bd98b588c3ea1cfcbdb262cfe07a29ade49b0de4)
+++ src/libcfa/concurrency/threads	(revision 8def349b0537df4d0b760ecaa43ce8f6d6fe9e94)
@@ -27,14 +27,12 @@
 // Anything that implements this trait can be resumed.
 // Anything that is resumed is a coroutine.
-trait is_thread(dtype T /*| sized(T)*/) {
+trait is_thread(dtype T | sized(T)) {
       void main(T* this);
       thread_h* get_thread(T* this);
-	/*void ?{}(T*);
-	void ^?{}(T*);*/
 };
 
 #define DECL_THREAD(X) static inline thread_h* get_thread(X* this) { return &this->t; } void main(X* this);
 
-forall(otype T | is_thread(T) )
+forall( dtype T | sized(T) | is_thread(T) )
 static inline coroutine* get_coroutine(T* this) {
 	return &get_thread(this)->c;
@@ -55,16 +53,16 @@
 // thread runner
 // Structure that actually start and stop threads
-forall(otype T | is_thread(T) )
+forall( dtype T | sized(T) | is_thread(T) )
 struct thread {
 	T handle;
 };
 
-forall(otype T | is_thread(T) )
+forall( dtype T | sized(T) | is_thread(T) | { void ?{}(T*); } )
 void ?{}( thread(T)* this );
 
-forall(otype T, ttype P | is_thread(T) | { void ?{}(T*, P); } )
+forall( dtype T, ttype P | sized(T) | is_thread(T) | { void ?{}(T*, P); } )
 void ?{}( thread(T)* this, P params );
 
-forall(otype T | is_thread(T) )
+forall( dtype T | sized(T) | is_thread(T) | { void ^?{}(T*); } )
 void ^?{}( thread(T)* this );
 
