diff --git a/subprojects/nemora-postd/src/default_addresses.h b/subprojects/nemora-postd/src/default_addresses.h
new file mode 100644
index 0000000..2e1321e
--- /dev/null
+++ b/subprojects/nemora-postd/src/default_addresses.h
@@ -0,0 +1,88 @@
+/*
+ * Copyright 2021 Google LLC
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef PLATFORMS_NEMORA_PORTABLE_DEFAULT_ADDRESSES_H_
+#define PLATFORMS_NEMORA_PORTABLE_DEFAULT_ADDRESSES_H_
+//
+// Nemora dedicated port. Filtered by NIC.
+#define DEFAULT_ADDRESSES_RX_PORT 3959
+
+// NOTE: All the IPv4 addresses used in this file will be represented in the
+//       CPU order and therefore must *not* be used to initialize LWIP
+//       ip_addr types, unless the HTONL macro is used.
+//
+// Example: Given Nemora UDP collector VIP 172.20.0.197, the
+//   DEFAULT_ADDRESSES_TARGET_IP macro expands to the 32-bit number 0xAC1408C5
+//  (to help the reader: 172 is 0xAC), but with our little endian CPU that
+//  32-bit number is represented in memory as:
+//  0xC5 @ offset 0, 0x08 @ offset 1, 0x14 @ offset 2, 0xAC @ offset 3
+//  Since LWIP uses network order, a correct initialization requires:
+//  ip_addr collector = { .addr = HTONL(DEFAULT_ADDRESSES_TARGET_IP) };
+//
+#ifdef USE_LAB_UDP_DEST
+// Currently targets the lab installer fdcorp1.mtv
+#define DEFAULT_ADDRESSES_TARGET_IP ((172 << 24) | (18 << 16) | (107 << 8) | 1)
+#define DEFAULT_ADDRESSES_TARGET_PORT 50201
+#else
+// DEFAULT : Point to production Nemora collector (via anycast VIP).
+#define DEFAULT_ADDRESSES_TARGET_IP ((172 << 24) | (20 << 16) | (0 << 8) | 197)
+#define DEFAULT_ADDRESSES_TARGET_PORT 3960
+#endif
+
+// 2001:4860:f802::c5
+#define DEFAULT_ADDRESSES_TARGET_IP6                                           \
+    {                                                                          \
+        0x20014860, 0xf8020000, 0, 0xc5                                        \
+    }
+
+#ifdef NETWORK_UNITTEST
+#define DEFAULT_ADDRESSES_GATEWAY ((172 << 24) | (23 << 16) | (130 << 8) | 190)
+#define DEFAULT_ADDRESSES_NETMASK ((255 << 24) | (255 << 16) | (255 << 8) | 192)
+#define DEFAULT_ADDRESSES_LOCAL_IP ((172 << 24) | (23 << 16) | (130 << 8) | 141)
+#define DEFAULT_ADDRESSES_MAC                                                  \
+    {                                                                          \
+        0x00, 0x1a, 0x11, 0x30, 0xc9, 0x6f                                     \
+    }
+#define DEFAULT_ADDRESSES_GATEWAY6                                             \
+    {                                                                          \
+        0, 0, 0, 0                                                             \
+    }
+#define DEFAULT_ADDRESSES_GATEWAY6_MAC                                         \
+    {                                                                          \
+        0, 0, 0, 0, 0, 0                                                       \
+    }
+#else
+#define DEFAULT_ADDRESSES_GATEWAY 0
+#define DEFAULT_ADDRESSES_NETMASK 0
+#define DEFAULT_ADDRESSES_LOCAL_IP 0
+#define DEFAULT_ADDRESSES_MAC                                                  \
+    {                                                                          \
+        0, 0, 0, 0, 0, 0                                                       \
+    }
+// fe80::1 -- as of 2016-10-13 this is guaranteed to be the GW in prod.
+#define DEFAULT_ADDRESSES_GATEWAY6                                             \
+    {                                                                          \
+        0xfe, 0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1                   \
+    }
+// 02:32:00:00:00:00 -- as of 2016-10-13 this is guaranteed to be the
+// GW MAC addr in prod.
+#define DEFAULT_ADDRESSES_GATEWAY6_MAC                                         \
+    {                                                                          \
+        0x02, 0x32, 0, 0, 0, 0                                                 \
+    }
+#endif
+
+#endif // PLATFORMS_NEMORA_PORTABLE_DEFAULT_ADDRESSES_H_
diff --git a/subprojects/nemora-postd/src/host_manager.cpp b/subprojects/nemora-postd/src/host_manager.cpp
new file mode 100644
index 0000000..b27ac21
--- /dev/null
+++ b/subprojects/nemora-postd/src/host_manager.cpp
@@ -0,0 +1,111 @@
+// Copyright 2021 Google LLC
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "host_manager.hpp"
+
+#include <fmt/format.h>
+
+#include <phosphor-logging/log.hpp>
+#include <sdbusplus/bus.hpp>
+#include <sdbusplus/message.hpp>
+
+#include <functional>
+#include <iostream>
+#include <variant>
+
+using fmt::format;
+using phosphor::logging::level;
+using phosphor::logging::log;
+
+HostManager::HostManager() :
+    postcodes_(), bus_(sdbusplus::bus::new_default()),
+    signal_(bus_, HostManager::GetMatch().c_str(),
+            [this](auto& m) -> void { this->DbusHandleSignal(m); }),
+    post_poller_enabled_(true)
+{
+    // Spin off thread to listen on bus_
+    auto post_poller_thread = std::mem_fn(&HostManager::PostPollerThread);
+    post_poller_ = std::make_unique<std::thread>(post_poller_thread, this);
+}
+
+int HostManager::DbusHandleSignal(sdbusplus::message::message& msg)
+{
+    log<level::INFO>("Property Changed!");
+    std::string msgSensor, busName{POSTCODE_BUSNAME};
+    std::map<std::string,
+             std::variant<std::tuple<uint64_t, std::vector<uint8_t>>>>
+        msgData;
+    msg.read(msgSensor, msgData);
+
+    if (msgSensor == busName)
+    {
+        auto valPropMap = msgData.find("Value");
+        if (valPropMap != msgData.end())
+        {
+            uint64_t rawValue =
+                std::get<uint64_t>(std::get<0>(valPropMap->second));
+
+            PushPostcode(rawValue);
+        }
+    }
+
+    return 0;
+}
+
+void HostManager::PushPostcode(uint64_t postcode)
+{
+    // Get lock
+    std::lock_guard<std::mutex> lock(postcodes_lock_);
+    // Add postcode to queue
+    postcodes_.push_back(postcode);
+}
+
+std::vector<uint64_t> HostManager::DrainPostcodes()
+{
+    // Get lock
+    std::lock_guard<std::mutex> lock(postcodes_lock_);
+
+    auto count = postcodes_.size();
+    if (count > 0)
+    {
+        std::string msg = format("Draining Postcodes. Count: {}.", count);
+        log<level::ERR>(msg.c_str());
+    }
+
+    // Drain the queue into a list
+    // TODO: maximum # postcodes?
+    std::vector<uint64_t> result(postcodes_);
+    postcodes_.clear();
+
+    return result;
+}
+
+std::string HostManager::GetMatch()
+{
+    std::string obj{POSTCODE_OBJECTPATH};
+    return std::string("type='signal',"
+                       "interface='org.freedesktop.DBus.Properties',"
+                       "member='PropertiesChanged',"
+                       "path='" +
+                       obj + "'");
+}
+
+void HostManager::PostPollerThread()
+{
+    while (post_poller_enabled_)
+    {
+        bus_.process_discard();
+        bus_.wait();
+    }
+}
diff --git a/subprojects/nemora-postd/src/host_manager.hpp b/subprojects/nemora-postd/src/host_manager.hpp
new file mode 100644
index 0000000..6ed2a33
--- /dev/null
+++ b/subprojects/nemora-postd/src/host_manager.hpp
@@ -0,0 +1,78 @@
+// Copyright 2021 Google LLC
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#pragma once
+#include "nemora_types.hpp"
+
+#include <sdbusplus/bus.hpp>
+#include <sdbusplus/message.hpp>
+#include <sdbusplus/server.hpp>
+
+#include <mutex>
+#include <queue>
+#include <string>
+#include <unordered_map>
+#include <vector>
+
+#define POSTCODE_OBJECTPATH "/xyz/openbmc_project/state/boot/raw0"
+#define POSTCODE_BUSNAME "xyz.openbmc_project.State.Boot.Raw"
+
+class HostManager
+{
+  public:
+    HostManager();
+    ~HostManager() = default;
+
+    /**
+     * Callback for POST code DBus listener
+     * - msg: out-parameter for message received over DBus from callback
+     *
+     * - returns: error code or 0 for success
+     */
+    int DbusHandleSignal(sdbusplus::message::message& msg);
+
+    /**
+     * Helper to construct match string for callback registration for POST
+     * listener
+     * - returns: match string for use in registering callback
+     */
+    static std::string GetMatch();
+
+    /**
+     * Copies contents of POSTcode vector away to allow for sending via UDP
+     * - returns: vector filled with current state of postcodes_
+     */
+    std::vector<uint64_t> DrainPostcodes();
+
+    /**
+     * Add POST code to vector, thread-safely
+     * - postcode: POST code to add, typically only 8 or 16 bits wide
+     */
+    void PushPostcode(uint64_t postcode);
+
+  private:
+    /**
+     * Business logic of thread listening to DBus for POST codes
+     */
+    void PostPollerThread();
+
+    // It's important that postcodes_ be initialized before post_poller_!
+    std::vector<uint64_t> postcodes_;
+    std::mutex postcodes_lock_;
+
+    sdbusplus::bus::bus bus_;
+    sdbusplus::server::match::match signal_;
+    std::unique_ptr<std::thread> post_poller_;
+    bool post_poller_enabled_;
+};
diff --git a/subprojects/nemora-postd/src/nemora.cpp b/subprojects/nemora-postd/src/nemora.cpp
new file mode 100644
index 0000000..c5cff87
--- /dev/null
+++ b/subprojects/nemora-postd/src/nemora.cpp
@@ -0,0 +1,149 @@
+// Copyright 2021 Google LLC
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "nemora.hpp"
+
+#include "default_addresses.h"
+
+#include <netinet/in.h>
+#include <time.h>
+#include <unistd.h>
+
+#include <phosphor-logging/log.hpp>
+#include <sdbusplus/bus.hpp>
+#include <sdbusplus/exception.hpp>
+
+#include <cstdint>
+#include <cstring>
+#include <functional>
+#include <iostream>
+#include <variant>
+
+using phosphor::logging::level;
+using phosphor::logging::log;
+using sdbusplus::exception::SdBusError;
+
+constexpr auto MAC_FORMAT = "%02hhx:%02hhx:%02hhx:%02hhx:%02hhx:%02hhx";
+constexpr auto MAC_INTERFACE = "xyz.openbmc_project.Network.MACAddress";
+constexpr auto NETWORK_INTERFACE = "xyz.openbmc_project.Network";
+constexpr auto PROP_INTERFACE = "org.freedesktop.DBus.Properties";
+constexpr auto IFACE_ROOT = "/xyz/openbmc_project/network/";
+
+bool Nemora::ParseMac(const std::string& mac_addr, MacAddr* mac)
+{
+    int ret =
+        sscanf(mac_addr.c_str(), MAC_FORMAT, mac->octet, mac->octet + 1,
+               mac->octet + 2, mac->octet + 3, mac->octet + 4, mac->octet + 5);
+    return (ret == MAC_ADDR_SIZE);
+}
+
+bool Nemora::GetMacAddr(MacAddr* mac, const std::string& iface_path)
+{
+    if (mac == nullptr)
+    {
+        log<level::ERR>("Nemora::GetMacAddr MAC Address is nullptr");
+        return false;
+    }
+    auto dbus = sdbusplus::bus::new_default();
+    sdbusplus::message::message reply;
+
+    try
+    {
+        auto networkd_call = dbus.new_method_call(
+            NETWORK_INTERFACE, iface_path.c_str(), PROP_INTERFACE, "Get");
+        networkd_call.append(MAC_INTERFACE, "MACAddress");
+
+        reply = dbus.call(networkd_call);
+    }
+    catch (const SdBusError& e)
+    {
+        log<level::ERR>(
+            "Nemora::GetMacAddr failed to call Network D-Bus interface");
+        return false;
+    }
+
+    std::variant<std::string> result;
+    reply.read(result);
+    auto mac_addr = std::get<std::string>(result);
+    if (!ParseMac(mac_addr, mac))
+    {
+        log<level::ERR>("Nemora::GetMacAddr Failed to parse MAC Address");
+        return false;
+    }
+    return true;
+}
+
+void Nemora::InitEventData()
+{
+    event_data_.type = NemoraDatagramType::NemoraEvent;
+
+    // UDP IPv4 addr for POST
+    event_data_.destination.sin_family = AF_INET;
+    event_data_.destination.sin_port = htons(DEFAULT_ADDRESSES_TARGET_PORT);
+
+    // UDP IPv6 addr for POST
+    event_data_.destination6.sin6_family = AF_INET6;
+    event_data_.destination6.sin6_port = htons(DEFAULT_ADDRESSES_TARGET_PORT);
+}
+
+Nemora::Nemora()
+{
+    InitEventData();
+}
+
+Nemora::Nemora(const std::string& iface_name, const in_addr ipv4,
+               const in6_addr ipv6) :
+    socketManager_(),
+    hostManager_(), iface_path_{std::string(IFACE_ROOT) + iface_name}
+{
+    InitEventData();
+    event_data_.destination.sin_addr = ipv4;
+    event_data_.destination6.sin6_addr = ipv6;
+}
+
+void Nemora::UdpPoll()
+{
+    auto postcodes = hostManager_.DrainPostcodes();
+
+    // Don't bother updating if there is no POST code
+    // EC supports a flag EC_NEMORA_UDP_CONFIG_MASK_PERIODIC to send
+    // periodic updates, which is non-POR for gBMC for now.
+    bool shouldBroadcast = !postcodes.empty();
+
+    UpdateEventData(std::move(postcodes));
+
+    log<level::INFO>("UpdateEventData gets called.");
+
+    if (shouldBroadcast)
+    {
+        log<level::INFO>("Should broadcast");
+        std::lock_guard<std::mutex> lock(event_data_mutex_);
+        socketManager_.SendDatagram(static_cast<NemoraDatagram*>(&event_data_));
+    }
+
+    sleep(20);
+}
+
+void Nemora::UpdateEventData(std::vector<uint64_t>&& postcodes)
+{
+    MacAddr mac;
+    GetMacAddr(&mac, iface_path_);
+
+    std::lock_guard<std::mutex> lock(event_data_mutex_);
+
+    memcpy(event_data_.mac, mac.octet, sizeof(MacAddr));
+
+    event_data_.postcodes = std::move(postcodes);
+    event_data_.sent_time_s = time(0);
+}
diff --git a/subprojects/nemora-postd/src/nemora.hpp b/subprojects/nemora-postd/src/nemora.hpp
new file mode 100644
index 0000000..fe5799e
--- /dev/null
+++ b/subprojects/nemora-postd/src/nemora.hpp
@@ -0,0 +1,92 @@
+// Copyright 2021 Google LLC
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#pragma once
+
+#include "host_manager.hpp"
+#include "socket_manager.hpp"
+
+#include <cstdint>
+#include <mutex>
+#include <string>
+#include <thread>
+
+class Nemora
+{
+  public:
+    /**
+     * Constructs a Nemora object.
+     * - iface_name: The networking interface to use (eg. eth0)
+     * - ipv4: Target IPv4 address for UDP communication, i.e., POST streaming.
+     * - ipv6: Target IPv6 address for UDP communication, i.e., POST streaming.
+     */
+    Nemora(const std::string& iface_name, const in_addr ipv4,
+           const in6_addr ipv6);
+
+    /**
+     * Construct uninitialized Nemora object
+     */
+    Nemora();
+
+    /**
+     * Cancels polling threads and destructs Nemora object.
+     */
+    ~Nemora() = default;
+
+    /**
+     * Loops collecting the current state of event_data_ and sending via UDP.
+     */
+    void UdpPoll();
+
+  private:
+    /**
+     * Initialize event_data_ with default values.
+     * This is used by constructors.
+     */
+    void InitEventData();
+
+    /**
+     * Fetches MAC from host
+     * - mac: out-parameter for host mac address
+     * - iface_path: DBus path to network interface, typically
+     *   IFACE_ROOT + iface_path_.
+     *
+     * - returns: true if address was populated correctly, false if error
+     */
+    bool GetMacAddr(MacAddr* mac, const std::string& iface_path);
+
+    /**
+     * Converts from string to struct
+     * - mac_addr: string of format MAC_FORMAT
+     * - mac: out-parameter with MAC from mac_addr populated. must be allocated
+     * by caller
+     *
+     * - returns: true if mac_addr was correct format, false otherwise
+     */
+    bool ParseMac(const std::string& mac_addr, MacAddr* mac);
+
+    /**
+     * Update event_data_ from host.
+     * - postcodes: list of postcodes polled.
+     *   Forced to bind to temporary to avoid copying.
+     */
+    void UpdateEventData(std::vector<uint64_t>&& postcodes);
+
+    NemoraEvent event_data_ = {};
+    std::mutex event_data_mutex_;
+
+    SocketManager socketManager_;
+    HostManager hostManager_;
+    const std::string iface_path_;
+};
diff --git a/subprojects/nemora-postd/src/nemora_types.hpp b/subprojects/nemora-postd/src/nemora_types.hpp
new file mode 100644
index 0000000..6dde67d
--- /dev/null
+++ b/subprojects/nemora-postd/src/nemora_types.hpp
@@ -0,0 +1,59 @@
+// Copyright 2021 Google LLC
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#pragma once
+
+#include <arpa/inet.h>
+#include <sys/socket.h>
+
+#include <cstdint>
+#include <cstdio>
+#include <cstring>
+#include <memory>
+#include <vector>
+
+#define MAC_ADDR_SIZE 6
+
+struct MacAddr
+{
+    std::uint8_t octet[MAC_ADDR_SIZE]; // network order
+};
+
+enum class NemoraDatagramType
+{
+    NemoraEvent,
+};
+
+/**
+ * Encompasses all valid outbound UDP messages
+ */
+struct NemoraDatagram
+{
+    // destination
+    sockaddr_in destination;
+    sockaddr_in6 destination6;
+    // type
+    NemoraDatagramType type;
+    std::vector<uint8_t> payload;
+};
+
+/**
+ * Event information as broadcast to System Health Data Collector
+ */
+struct NemoraEvent : NemoraDatagram
+{
+    std::uint8_t mac[MAC_ADDR_SIZE];
+    std::uint64_t sent_time_s;
+    std::vector<uint64_t> postcodes;
+};
diff --git a/subprojects/nemora-postd/src/serializer.cpp b/subprojects/nemora-postd/src/serializer.cpp
new file mode 100644
index 0000000..52008b6
--- /dev/null
+++ b/subprojects/nemora-postd/src/serializer.cpp
@@ -0,0 +1,69 @@
+// Copyright 2021 Google LLC
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "serializer.hpp"
+
+#include "event_message.pb.h"
+
+#include <fmt/format.h>
+
+#include <phosphor-logging/log.hpp>
+
+using fmt::format;
+using phosphor::logging::level;
+using phosphor::logging::log;
+
+std::string Serializer::Serialize(const NemoraDatagram* dgram)
+{
+    std::string result;
+    switch (dgram->type)
+    {
+        case NemoraDatagramType::NemoraEvent:
+            result = SerializeEvent(static_cast<const NemoraEvent*>(dgram));
+            break;
+        default:
+            log<level::ERR>(
+                format("Type with ID {} not supported by "
+                       "Serializer::Serialize(const NemoraDatagram*)",
+                       static_cast<int>(dgram->type))
+                    .c_str());
+    }
+
+    return result;
+}
+
+std::string Serializer::SerializeEvent(const NemoraEvent* event)
+{
+    std::string result;
+    platforms::nemora::proto::EventSeries pb;
+
+    pb.set_magic(NEMORA_EVENT_PB_MAGIC);
+
+    const char* p_arr = reinterpret_cast<const char*>(event->mac);
+    pb.set_mac(p_arr, MAC_ADDR_SIZE);
+
+    pb.set_sent_time_us(event->sent_time_s * 1000000);
+
+    for (auto postcode : event->postcodes)
+    {
+        pb.add_postcodes(postcode);
+    }
+
+    pb.set_postcodes_protocol(
+        platforms::nemora::proto::EventSeries::NATIVE_32_BIT);
+
+    log<level::INFO>(format("NemoraEvent {}", pb.DebugString()).c_str());
+    pb.SerializeToString(&result);
+    return result;
+}
diff --git a/subprojects/nemora-postd/src/serializer.hpp b/subprojects/nemora-postd/src/serializer.hpp
new file mode 100644
index 0000000..2dedc85
--- /dev/null
+++ b/subprojects/nemora-postd/src/serializer.hpp
@@ -0,0 +1,38 @@
+// Copyright 2021 Google LLC
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#pragma once
+#include "nemora_types.hpp"
+
+#include <arpa/inet.h>
+
+#include <cstddef>
+#include <cstdint>
+#include <memory>
+#include <string>
+
+using std::int32_t;
+using std::size_t;
+using std::uint64_t;
+
+class Serializer
+{
+  public:
+    static std::string Serialize(const NemoraDatagram* dgram);
+
+  private:
+    static std::string SerializeEvent(const NemoraEvent* event);
+
+    static constexpr uint64_t NEMORA_EVENT_PB_MAGIC = 0x890ebd38ec325800;
+};
diff --git a/subprojects/nemora-postd/src/socket_manager.cpp b/subprojects/nemora-postd/src/socket_manager.cpp
new file mode 100644
index 0000000..13f3269
--- /dev/null
+++ b/subprojects/nemora-postd/src/socket_manager.cpp
@@ -0,0 +1,97 @@
+// Copyright 2021 Google LLC
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "socket_manager.hpp"
+
+#include "serializer.hpp"
+
+#include <errno.h>
+#include <fmt/format.h>
+#include <sys/socket.h>
+#include <unistd.h>
+
+#include <phosphor-logging/log.hpp>
+
+#include <cstring>
+
+using fmt::format;
+using phosphor::logging::level;
+using phosphor::logging::log;
+
+SocketManager::~SocketManager()
+{
+    std::lock_guard<std::mutex> lock(open_sockets_lock_);
+    for (auto fd : open_sockets_)
+    {
+        close(fd);
+    }
+}
+
+void SocketManager::SendDatagram(const NemoraDatagram* bcast)
+{
+    std::string serialized = Serializer::Serialize(bcast);
+
+    // Create socket
+    auto fd = socket(AF_INET6, SOCK_DGRAM, 0);
+    if (fd < 0)
+    {
+        log<level::ERR>("SocketManager::SendDatagram: Couldn't open socket");
+    }
+    TrackSocket(fd);
+
+    // Because we aren't sure whether the v6 or v4 target IP will be present,
+    // we send UDP packets to both. This puts us at feature parity with EC.
+
+    // Send serialized data (v6)
+    auto addr6 = reinterpret_cast<const sockaddr*>(&bcast->destination6);
+    auto err = sendto(fd, serialized.c_str(), serialized.length(), 0, addr6,
+                      sizeof(bcast->destination6));
+    if (err < 0)
+    {
+        log<level::ERR>(format("SocketManager::SendDatagram: Couldn't sendto "
+                               "socket (IPv6): {}",
+                               std::strerror(errno))
+                            .c_str());
+    }
+
+    // Send serialized data (v4)
+    auto addr4 = reinterpret_cast<const sockaddr*>(&bcast->destination);
+    err = sendto(fd, serialized.c_str(), serialized.length(), 0, addr4,
+                 sizeof(bcast->destination));
+    if (err < 0)
+    {
+        log<level::ERR>(format("SocketManager::SendDatagram: Couldn't sendto "
+                               "socket (IPv4): {}",
+                               std::strerror(errno))
+                            .c_str());
+    }
+
+    CloseSocketSafely(fd);
+}
+
+void SocketManager::CloseSocketSafely(int fd)
+{
+    std::lock_guard<std::mutex> lock(open_sockets_lock_);
+    if (open_sockets_.find(fd) != open_sockets_.end())
+    {
+        close(fd);
+        open_sockets_.erase(fd);
+    }
+}
+
+void SocketManager::TrackSocket(int fd)
+{
+    std::lock_guard<std::mutex> lock(open_sockets_lock_);
+    open_sockets_.insert(fd);
+}
diff --git a/subprojects/nemora-postd/src/socket_manager.hpp b/subprojects/nemora-postd/src/socket_manager.hpp
new file mode 100644
index 0000000..6435cf9
--- /dev/null
+++ b/subprojects/nemora-postd/src/socket_manager.hpp
@@ -0,0 +1,49 @@
+// Copyright 2021 Google LLC
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#pragma once
+#include "nemora_types.hpp"
+#include "serializer.hpp"
+
+#include <memory>
+#include <mutex>
+#include <string>
+#include <unordered_set>
+
+class SocketManager
+{
+  public:
+    SocketManager() = default;
+    ~SocketManager();
+
+    /**
+     * Sends a UDP packet to the address named in bcast object.
+     */
+    void SendDatagram(const NemoraDatagram* bcast);
+
+    /**
+     * Checks content of open_sockets_ and closes the socket if it is contained
+     * in the list. Closing a socket which is already closed causes problems.
+     */
+    void CloseSocketSafely(int fd);
+
+  private:
+    /**
+     * Adds a socket fd to open_sockets_ to allow tracking of which sockets are
+     * open or not.  Closing a socket which is already closed causes problems.
+     */
+    void TrackSocket(int fd);
+    std::unordered_set<int> open_sockets_;
+    std::mutex open_sockets_lock_;
+};
