public synchronized void receive (Message m) {
	long t__recv, dt;
	double rate;
	long d;
	double average, deviation;
	count += 1;
	if (count == 1)
	    _t_recv = System.currentTimeMillis();
	d = (System.currentTimeMillis() - Long.parseLong(m.getPayload()));
	/* Accumulate */
	delay += d;
	delaysquared += (double) (d * d);
	if (count % Utils.STEP == 0) {
	    t__recv = System.currentTimeMillis();
	    dt = t__recv - _t_recv;
	    if (dt > 0)
		rate = (double) (Utils.STEP * 1000) / (double) dt;
	    else
		rate = 0.0;
	    /* Calculate average delay */
	    average = (double) delay / (double) Utils.STEP;
	    /* Calculate std deviation */
	    deviation = Math.sqrt(
				  (delaysquared - (double) (delay * delay) / (double) Utils.STEP) / (double) (Utils.STEP - 1)
				  );
	    Utils.out(pid, String.format("[RECV] %06d\trate %10.1f m/s\tavg. delay %10.1f\tstddev %10.1f", count, rate, average, deviation));
	    _t_recv = t__recv;
	    /* Reset delay */
	    delay = 0;
	    delaysquared = 0.0;
	}
    }