 					city.stats.metrics["beaconsReceived"] = recvBeacons
 				}
 			}
+
 		case .CoverageMapRequest:
 			// TODO: send over the coverage map
 			break
+
 		case .CoverageMap:
 			// TODO process this coverage map
 			// Store the map in a temporary buffer

	// Propagation algorithm
	let getSignalStrength: (distance: Double, lineOfSight: Bool) -> Double = portoEmpiricalDataModel

	// Packet ID generator - can be made to create random IDs
	var nextPacketID: UInt = 0
	func getNextPacketID() -> UInt {
		defer { nextPacketID += 1 }


		// Debug
		if debug.contains("RoadsideUnit.receive()"){
			print("\(city.events.now.asSeconds) RoadsideUnit.receive():\t".cyan(), "RSU", id, "received packet", packet.id, "l2src", packet.l2src, "l3src", packet.l3src,  "l3dst", packet.l3dst, "payload", packet.payloadType) }

		// Process destination field
		switch packet.l3dst {
		case .Unicast(let destinationID):
			// Disregard if we're not the message target
			if destinationID != id { return }

		case .Broadcast(let nHops):
			// Disregard if the hop limit is reached
			if nHops <= 1 { return }

			// 1. Clone the packet
			var rebroadcastPacket = packet
			// 2. Reduce TTL
			rebroadcastPacket.l3dst = .Broadcast(hopLimit: nHops-1)
			// 3. Refresh l2src
			rebroadcastPacket.l2src = self.id
			// 4. Rebroadcast
			self.broadcastPacket(rebroadcastPacket)

		case .Geocast(let targetArea):
			// Disregard if we're not in the destination area
			if targetArea.isPointInside(geo) == false { return }

			// 1. Clone the packet
			var rebroadcastPacket = packet
			// 2. Refresh l2src
			rebroadcastPacket.l2src = self.id
			// 2. Rebroadcast
			self.broadcastPacket(rebroadcastPacket)
		}

		// Process payload
