diff --git a/common/src/main/scala/net/psforever/packet/GamePacketOpcode.scala b/common/src/main/scala/net/psforever/packet/GamePacketOpcode.scala
index 5c5b7c9c4..2f1ee7d31 100644
--- a/common/src/main/scala/net/psforever/packet/GamePacketOpcode.scala
+++ b/common/src/main/scala/net/psforever/packet/GamePacketOpcode.scala
@@ -398,7 +398,7 @@ object GamePacketOpcode extends Enumeration {
case 0x40 => noDecoder(MountVehicleCargoMsg)
case 0x41 => noDecoder(DismountVehicleCargoMsg)
case 0x42 => noDecoder(CargoMountPointStatusMessage)
- case 0x43 => noDecoder(BeginZoningMessage)
+ case 0x43 => game.BeginZoningMessage.decode
case 0x44 => game.ItemTransactionMessage.decode
case 0x45 => game.ItemTransactionResultMessage.decode
case 0x46 => game.ChangeFireModeMessage.decode
diff --git a/common/src/main/scala/net/psforever/packet/game/BeginZoningMessage.scala b/common/src/main/scala/net/psforever/packet/game/BeginZoningMessage.scala
new file mode 100644
index 000000000..bcdf964c8
--- /dev/null
+++ b/common/src/main/scala/net/psforever/packet/game/BeginZoningMessage.scala
@@ -0,0 +1,26 @@
+// Copyright (c) 2017 PSForever
+package net.psforever.packet.game
+
+import net.psforever.packet.{GamePacketOpcode, Marshallable, PacketHelpers, PlanetSideGamePacket}
+import scodec.Codec
+
+/**
+ * Dispatched by the client after the current map has been fully loaded locally and its objects are ready to be initialized.
+ *
+ * When the server receives the packet, for each object on that map, it sends the packets to the client:
+ * - `SetEmpireMessage`
+ * - `HackMessage`
+ * - `PlanetSideAttributeMessage`
+ * - ... and so forth
+ * Afterwards, an avatar POV is declared and the remaining details about the said avatar are assigned.
+ */
+final case class BeginZoningMessage()
+ extends PlanetSideGamePacket {
+ type Packet = BeginZoningMessage
+ def opcode = GamePacketOpcode.BeginZoningMessage
+ def encode = BeginZoningMessage.encode(this)
+}
+
+object BeginZoningMessage extends Marshallable[BeginZoningMessage] {
+ implicit val codec : Codec[BeginZoningMessage] = PacketHelpers.emptyCodec(BeginZoningMessage())
+}
diff --git a/common/src/test/scala/game/BeginZoningMessageTest.scala b/common/src/test/scala/game/BeginZoningMessageTest.scala
new file mode 100644
index 000000000..eaacc6f63
--- /dev/null
+++ b/common/src/test/scala/game/BeginZoningMessageTest.scala
@@ -0,0 +1,27 @@
+// Copyright (c) 2017 PSForever
+package game
+
+import org.specs2.mutable._
+import net.psforever.packet._
+import net.psforever.packet.game._
+import scodec.bits._
+
+class BeginZoningMessageTest extends Specification {
+ val string = hex"43" //yes, just the opcode
+
+ "decode" in {
+ PacketCoding.DecodePacket(string).require match {
+ case BeginZoningMessage() =>
+ ok
+ case _ =>
+ ko
+ }
+ }
+
+ "encode" in {
+ val msg = BeginZoningMessage()
+ val pkt = PacketCoding.EncodePacket(msg).require.toByteVector
+
+ pkt mustEqual string
+ }
+}
diff --git a/pslogin/src/main/scala/WorldSessionActor.scala b/pslogin/src/main/scala/WorldSessionActor.scala
index 3eab336aa..56b00e014 100644
--- a/pslogin/src/main/scala/WorldSessionActor.scala
+++ b/pslogin/src/main/scala/WorldSessionActor.scala
@@ -235,6 +235,9 @@ class WorldSessionActor extends Actor with MDCContextAware {
case KeepAliveMessage(code) =>
sendResponse(PacketCoding.CreateGamePacket(0, KeepAliveMessage(0)))
+ case msg @ BeginZoningMessage() =>
+ log.info("Reticulating splines ...")
+
case msg @ PlayerStateMessageUpstream(avatar_guid, pos, vel, unk1, aim_pitch, unk2, seq_time, unk3, is_crouching, is_jumping, unk4, is_cloaking, unk5, unk6) =>
//log.info("PlayerState: " + msg)