client.connect(host, function() {

	///////////////////////////////////////////////////////////////////////
	// Handler for connected device
	///////////////////////////////////////////////////////////////////////

	out("CONNECTED", "device", device);
	var nbSent = 0;
	var nbReceived = 0;

	if (!checkInstance(host, ref)) return;

	// create various namespace handlers 
	var connection = client.createChannel('sender-0', 'receiver-0', 'urn:x-cast:com.google.cast.tp.connection', 'JSON');
	var heartbeat  = client.createChannel('sender-0', 'receiver-0', 'urn:x-cast:com.google.cast.tp.heartbeat', 'JSON');
	var receiver   = client.createChannel('sender-0', 'receiver-0', 'urn:x-cast:com.google.cast.receiver', 'JSON');
 
	// establish virtual connection to the receiver 
	connection.send({ type: 'CONNECT' });
 
	// start heartbeating
	var iid = setInterval(function() {
	    // remove non-responding
	    if (nbSent>8 && nbSent/2>nbReceived)
		removeInstance(host, ref);

	    if (!hasInstance(host, ref)) {
		// dead or deleted instance
		connection.close();
		heartbeat.close();
		receiver.close();
		client.close();
		clearInterval(iid);
	    }
	    else {
		// ping
	        out("GET_STATUS", "get_status_request", {name:name, nbSent:nbSent, nbReceived:nbReceived});
		++nbSent;
	        receiver.send({ "type": "GET_STATUS", "requestId": ++seq });
	    }
	}, POLL_DELAY_MS);

	// display receiver status updates 
	receiver.on('message', function(data, broadcast) {
	    if(data.type) {
		++nbReceived;
		var message = { "device": device, "type": data.type };
		message[data.type.toLowerCase()] = data;
		out("MESSAGE", "message", message);
	    }
	});

	// initial status
	setTimeout(function() {
	    if (hasInstance(host, ref))
		receiver.send({ "type": "GET_STATUS", "requestId": ++seq });
	}, 2000);
    });
	var iid = setInterval(function() {
	    // remove non-responding
	    if (nbSent>8 && nbSent/2>nbReceived)
		removeInstance(host, ref);

	    if (!hasInstance(host, ref)) {
		// dead or deleted instance
		connection.close();
		heartbeat.close();
		receiver.close();
		client.close();
		clearInterval(iid);
	    }
	    else {
		// ping
	        out("GET_STATUS", "get_status_request", {name:name, nbSent:nbSent, nbReceived:nbReceived});
		++nbSent;
	        receiver.send({ "type": "GET_STATUS", "requestId": ++seq });
	    }
	}, POLL_DELAY_MS);