diff --git a/package.json b/package.json
index 1f6fe1b..28cbf17 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
 {
   "name": "ig-types",
-  "version": "5.0.6",
+  "version": "5.0.7",
   "description": "Generic JavaScript types and type extensions...",
   "main": "main.js",
   "scripts": {
diff --git a/runner.js b/runner.js
index cc0c26a..0a33d82 100644
--- a/runner.js
+++ b/runner.js
@@ -347,15 +347,30 @@ object.Constructor('TaskManager', Array, events.EventMixin('flat', {
 	sync_start: false,
 
 	//
-	//	.named(name)
-	//	.named(name, ..)
+	//	.titled(title)
+	//	.titled(title, ..)
 	//		-> manager
 	//
-	named: function(name){
-		var names = new Set([...arguments])
+	titled: function(title){
+		var titles = 
+			title == 'all'
+				|| title == '*'
+				|| new Set([...arguments])
 		return this
 			.filter(function(task){ 
-				return names.has(task.name) }) },
+				return titles === true
+					|| titles.has(task.title) }) },
+
+	send: function(title, ...args){
+		if(title == 'all' || title == '*'){
+			this.forEach(function(task){
+				task.send(...args) })
+			return this }
+		return this.titled(
+				...(title instanceof Array) ?
+					title
+					: [title]))
+			.send('all', ...args) },
 
 	// XXX each task should also trigger this when stopping and this 
 	// 		should not result in this and tasks infinitely playing 
@@ -364,29 +379,52 @@ object.Constructor('TaskManager', Array, events.EventMixin('flat', {
 	// 			when calling/binding to this it actually binds to each 
 	// 			task ???)
 	stop: events.Event('stop', 
-		function(handlers, name){
-			name != null ?
-				this.named(name).stop()
-				: this.forEach(function(task){
-					task.stop() }) }),
+		function(handlers, title='all'){
+			this.send(title, 'stop') }),
 
 	done: events.Event('done'),
 	error: events.Event('error'),
 
 
 	//
-	//	.Task(task, ..)
-	//	.Task(name, task, ..)
+	//	Create a task...
+	//	.Task(task)
+	//	.Task(title, task)
 	//		-> task-handler
 	//
+	//	Create a function task...
+	//	.Task(func, ..)
+	//	.Task(title, func, ..)
+	//		-> task-handler
+	//
+	//	func(tiket, ..)
+	//
+	//
+	// tiket:
+	// 	{
+	// 		title: 
,
+	// 		resolve: ,
+	// 		reject: ,
+	// 		onmessage: 
+	// 	}
+	//
+	//
+	// A task can be:
+	// 	- Promise.cooperative instance
+	// 	- Queue instance
+	// 	- function
+	// 	- Promise instance
+	//
+	//
+	// NOTE: the args are passed only if 
 	// NOTE: the task is started as soon as it is accepted.
-	Task: function(name, task, ...args){
+	Task: function(title, task, ...args){
 		var that = this
 
 		// anonymous task...
-		if(typeof(name) != typeof('str')){
+		if(typeof(title) != typeof('str')){
 			;[task, ...args] = arguments
-			name = null }
+			title = null }
 
 		// normalize handler...
 		var run
@@ -407,31 +445,45 @@ object.Constructor('TaskManager', Array, events.EventMixin('flat', {
 				: task instanceof Promise ?
 					Promise.interactive(
 						function(resolve, reject, onmsg){
+							// NOTE: since this is a promise, we can't
+							// 		stop it externally...
 							onmsg(function(msg){
 								msg == 'stop'
-									&& reject() })
+									&& reject('stop') })
 							task.then(resolve, reject) })
 				// function...
 				: Promise.interactive(
-					function(resolve, reject, onmsg){
+					function(resolve, reject, onmessage){
+						// NOTE: we need to start this a bit later hence 
+						// 		we wrap this into run(..) and call it when
+						// 		the context is ready...
 						run = function(){
-							resolve(task(onmsg, ...args)) } }))
-		// set handler name...
-		// NOTE: this will override the name of the handler if it was 
+							// NOTE: if the client calls resolve(..) this 
+							// 		second resolve(..) call has no effect...
+							resolve(
+								task({
+									title,
+									resolve,
+									reject,
+									onmessage,
+								}, ...args)) } }))
+		// set handler title...
+		// NOTE: this will override the title of the handler if it was 
 		// 		set before...
-		if(name){
-			handler.name
+		if(title){
+			handler.title
 				&& console.warn(
-					'TaskManager.Task(..): task name already defined:', handler.name,
-					'overwriting with:', name)
-			Object.assign(handler, {name})
+					'TaskManager.Task(..): task title already defined:', handler.title,
+					'overwriting with:', title)
+			Object.assign(handler, {title})
 		}
 
 		this.push(handler)
 
-		// handle done...
+		// handle task state...
 		handler
 			.then(
+				// done...
 				function(res){
 					that.splice(that.indexOf(handler), 1)
 					that.trigger('done', task, res) },
@@ -439,6 +491,8 @@ object.Constructor('TaskManager', Array, events.EventMixin('flat', {
 				function(res){
 					that.splice(that.indexOf(handler), 1)
 					that.trigger('error', task, res) })
+		// trigger .done('all')
+		// XXX should this be a different event -- a-la .queueEmpty(..)
 		handler
 			.finally(function(){
 				that.length == 0