 
 // A message packet
 struct Packet {
+	// A unique packet identifier in the simulation
+	var id: UInt
+
+	// Time the packet was created in the simulation
+	var created: SimulationTime
+
+	// Layer 2 Network
+	var l2src: UInt
+//	var l2dst	// Unimplemented, all packets are broadcast at the MAC level
+
+	// Layer 3 Network */
 	enum Destination {
 		case Unicast(destinationID: UInt)
 		case Broadcast(hopLimit: UInt)
 		case Geocast(targetArea: AreaType)
 	}
-
-	var id: UInt
-	var src: UInt
-	var dst: Destination
-
-	var created: SimulationTime
-
+	var l3src: UInt
+	var l3dst: Destination
+
+	// The packet's payload type and payload
+	var payloadType: PayloadType
 	var payload: Payload
-	var payloadType: PayloadType
 }
 
 // A payload is a simple text field

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

		let beaconPayload: Payload = Beacon(geo: self.geo).toPayload()

		// Construct the beacon packet, a broadcast with hoplimit = 1
		let beaconPacket = Packet(id: city.network.getNextPacketID(), created: city.events.now, l2src: self.id, l3src: self.id, l3dst: .Broadcast(hopLimit: 1), payloadType: .Beacon, payload: beaconPayload)

		// Send the beacon to our neighbors
		self.broadcastPacket(beaconPacket)
