 	public typealias ContactObserverHandler     	= (_ point: KCPoint, _ status: KCSpriteNodeStatus) -> Void
 	public typealias ContinuationCheckerHandler	= (_ status: Array<KCSpriteNodeStatus>) -> Bool
 
+	private struct NodeInfo {
+		public var 	node:		KCSpriteNode
+		public var 	context:	CNOperationContext
+
+		public init(node nd: KCSpriteNode, context ctxt: CNOperationContext){
+			node	= nd
+			context	= ctxt
+		}
+	}
+
 	private var mQueue:		CNOperationQueue
-	private var mNodes:		Dictionary<String, KCSpriteNode>	// node-name, node
-	private var mContexts:		Dictionary<String, CNOperationContext>	// node-name, context
+	private var mNodes:		Dictionary<String, NodeInfo>		// node-name, node-info
 	private var mConsole:		CNConsole?
 	private var mMapper:		CNGraphicsMapper
 	private var mWallCondition:	KCSpriteNodeCondition

	}

	public func allocate(nodeName name: String, image img: CNImage, initStatus istat: KCSpriteNodeStatus, initAction iact: KCSpriteNodeAction, condition cond: KCSpriteNodeCondition, context ctxt: CNOperationContext) -> KCSpriteNode {
		if let curnode = mNodes[name] {
			return curnode
		} else {
			/* Setup node */
			let newnode  = KCSpriteNode(graphiceMapper: mMapper, image: img, initStatus: istat, initialAction: iact, condition: cond)
			newnode.name    = name
			mNodes[name]    = newnode
			/* Setup context */
			KCSpriteOperationContext.setName(context: ctxt, name: name)
			KCSpriteOperationContext.setInterval(context: ctxt, interval: 0.0)
			KCSpriteOperationContext.setStatus(context: ctxt, status: istat)
			KCSpriteOperationContext.setAction(context: ctxt, action: KCSpriteNodeAction())
			mContexts[name] = ctxt
			CNExecuteInMainThread(doSync: false, execute: {
				[weak self] () -> Void in
				if let myself = self {


		/* Set inputs for each node */
		for name in mNodes.keys {
			if let nodeinfo = mNodes[name] {
				let node = nodeinfo.node
				let ctxt = nodeinfo.context
				KCSpriteOperationContext.setName(context: ctxt, name: name)
				KCSpriteOperationContext.setInterval(context: ctxt, interval: interval)
				KCSpriteOperationContext.setAction(context: ctxt, action: node.action)
				KCSpriteOperationContext.setStatus(context: ctxt, status: node.status)
			} else {
				log(type: .Error, string: "Invalid properties", file: #file, line: #line, function: #function)
			}
		}

		/* Collect contexts */
		var contexts: Array<CNOperationContext> = []
		for nodeinfo in mNodes.values {
			contexts.append(nodeinfo.context)
		}

		/* Execute the operation */
		let nonexecs = mQueue.execute(operations: Array(contexts), timeLimit: nil)
		if nonexecs.count > 0 {
			if let cons = console {
				cons.error(string: "Failed to execute some operations\n")
