diff --git a/include/opendht/dht.h b/include/opendht/dht.h
index 68536db94a1759d30da814b26b240fa346bc583b..435f0f8fecd56f7a40f871e714d3b09cd637209d 100644
--- a/include/opendht/dht.h
+++ b/include/opendht/dht.h
@@ -436,17 +436,9 @@ private:
     RoutingTable& buckets(sa_family_t af) { return af == AF_INET ? buckets4 : buckets6; }
     const RoutingTable& buckets(sa_family_t af) const { return af == AF_INET ? buckets4 : buckets6; }
     Bucket* findBucket(const InfoHash& id, sa_family_t af) {
-        RoutingTable::iterator b;
-        switch (af) {
-        case AF_INET:
-            b = buckets4.findBucket(id);
-            return b == buckets4.end() ? nullptr : &(*b);
-        case AF_INET6:
-            b = buckets6.findBucket(id);
-            return b == buckets6.end() ? nullptr : &(*b);
-        default:
-            return nullptr;
-        }
+        auto& b = buckets(af);
+        auto it = b.findBucket(id);
+        return it == b.end() ? nullptr : &(*it);
     }
     const Bucket* findBucket(const InfoHash& id, sa_family_t af) const {
         return const_cast<Dht*>(this)->findBucket(id, af);
diff --git a/include/opendht/dhtrunner.h b/include/opendht/dhtrunner.h
index 659fd507b64ee3100c0f9281c8f1adfc745395df..aa638c5bc49615ebbddf63071b9109edef33bb14 100644
--- a/include/opendht/dhtrunner.h
+++ b/include/opendht/dhtrunner.h
@@ -52,7 +52,7 @@ struct SecureDhtConfig;
 class OPENDHT_PUBLIC DhtRunner {
 
 public:
-    typedef std::function<void(NodeStatus, NodeStatus)> StatusCallback;
+    using StatusCallback = std::function<void(NodeStatus, NodeStatus)>;
 
     struct Config {
         SecureDhtConfig dht_config;
diff --git a/src/dhtrunner.cpp b/src/dhtrunner.cpp
index e8f7f73d653491a7ff36c04a186733d2e486037d..fb96d0f8bda29fa4b883eac2cae8e130b9f07d95 100644
--- a/src/dhtrunner.cpp
+++ b/src/dhtrunner.cpp
@@ -50,12 +50,11 @@ struct DhtRunner::Listener {
     Where w;
 };
 
-class OPENDHT_PUBLIC NodeInsertionPack{
-public:
-    dht::InfoHash nodeid_;
-    in_port_t node_port_;
-    dht::NetId nid_;
-    MSGPACK_DEFINE(nodeid_, node_port_, nid_)
+struct NodeInsertionPack {
+    dht::InfoHash nodeId;
+    in_port_t port;
+    dht::NetId net;
+    MSGPACK_DEFINE(nodeId, port, net)
 };
 
 DhtRunner::DhtRunner() : dht_()
@@ -160,23 +159,17 @@ DhtRunner::run(const SockAddr& local4, const SockAddr& local6, const DhtRunner::
     });
 
     if (config.peer_discovery or config.peer_publish) {
-        if (context.peerDiscovery)
-            peerDiscovery_ = std::move(context.peerDiscovery);
-        else
-            peerDiscovery_.reset(new PeerDiscovery(PEER_DISCOVERY_PORT));
+        peerDiscovery_ = context.peerDiscovery ?
+            std::move(context.peerDiscovery) :
+            std::make_shared<PeerDiscovery>(PEER_DISCOVERY_PORT);
     }
 
     auto netId = config.dht_config.node_config.network;
     if (config.peer_discovery) {
-        peerDiscovery_->startDiscovery(PEER_DISCOVERY_DHT_SERVICE, [this, netId](msgpack::object&& obj, SockAddr&& add){
-            try {
-                auto v = obj.as<NodeInsertionPack>();
-                add.setPort(v.node_port_);
-                if(v.nodeid_ != dht_->getNodeId() && netId == v.nid_){
-                    bootstrap(v.nodeid_, add);
-                }
-            } catch(const msgpack::type_error &e){
-                std::cerr << "Msgpack Info Invalid: " << e.what() << '\n';
+        peerDiscovery_->startDiscovery<NodeInsertionPack>(PEER_DISCOVERY_DHT_SERVICE, [this, netId](NodeInsertionPack&& v, SockAddr&& addr){
+            addr.setPort(v.port);
+            if (v.nodeId != dht_->getNodeId() && netId == v.net){
+                bootstrap(v.nodeId, addr);
             }
         });
     }
@@ -184,13 +177,13 @@ DhtRunner::run(const SockAddr& local4, const SockAddr& local6, const DhtRunner::
         msgpack::sbuffer sbuf_node;
         // IPv4
         NodeInsertionPack adc;
-        adc.nid_ = netId;
-        adc.node_port_ = getBoundPort(AF_INET);
-        adc.nodeid_ = dht_->getNodeId();
+        adc.net = netId;
+        adc.port = getBoundPort(AF_INET);
+        adc.nodeId = dht_->getNodeId();
         msgpack::pack(sbuf_node, adc);
         peerDiscovery_->startPublish(AF_INET, PEER_DISCOVERY_DHT_SERVICE, sbuf_node);
         // IPv6
-        adc.node_port_ = getBoundPort(AF_INET6);
+        adc.port = getBoundPort(AF_INET6);
         sbuf_node.clear();
         msgpack::pack(sbuf_node, adc);
         peerDiscovery_->startPublish(AF_INET6, PEER_DISCOVERY_DHT_SERVICE, sbuf_node);