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;
		}
	}