diff --git a/packages/autopeering/discover/manager.go b/packages/autopeering/discover/manager.go
index 33e41c788dd12b441a07df06e26dcfe627e02442..d7697aede72667e4244128a406e548f93bd57094 100644
--- a/packages/autopeering/discover/manager.go
+++ b/packages/autopeering/discover/manager.go
@@ -202,8 +202,8 @@ func (m *manager) peerToReverify() *mpeer {
 }
 
 // updatePeer moves the peer with the given ID to the front of the list of managed peers.
-// It returns true if a peer was bumped or false if there was no peer with that id
-func (m *manager) updatePeer(update *peer.Peer) bool {
+// It returns 0 if there was no peer with that id, otherwise the verifiedCount of the updated peer is returned.
+func (m *manager) updatePeer(update *peer.Peer) uint {
 	id := update.ID()
 	for i, p := range m.active {
 		if p.ID() == id {
@@ -217,11 +217,10 @@ func (m *manager) updatePeer(update *peer.Peer) bool {
 				verifiedCount: p.verifiedCount + 1,
 				lastNewPeers:  p.lastNewPeers,
 			}
-
-			return true
+			return p.verifiedCount + 1
 		}
 	}
-	return false
+	return 0
 }
 
 func (m *manager) addReplacement(p *mpeer) bool {
@@ -289,7 +288,11 @@ func (m *manager) addVerifiedPeer(p *peer.Peer) bool {
 	defer m.mutex.Unlock()
 
 	// if already in the list, move it to the front
-	if m.updatePeer(p) {
+	if v := m.updatePeer(p); v > 0 {
+		// trigger the event only for the first time the peer is updated
+		if v == 1 {
+			Events.PeerDiscovered.Trigger(&DiscoveredEvent{Peer: p})
+		}
 		return false
 	}
 
diff --git a/packages/autopeering/peer/peer.go b/packages/autopeering/peer/peer.go
index c7200dd1bb14f8fa518efa8afb7829c1e7ab71e6..30a1882f2fdc9da398af2a28754f9df627a72093 100644
--- a/packages/autopeering/peer/peer.go
+++ b/packages/autopeering/peer/peer.go
@@ -2,6 +2,7 @@ package peer
 
 import (
 	"crypto/ed25519"
+	"encoding/base64"
 	"errors"
 	"fmt"
 	"net/url"
@@ -50,7 +51,7 @@ func (p *Peer) Services() service.Service {
 func (p *Peer) String() string {
 	u := url.URL{
 		Scheme: "peer",
-		User:   url.User(fmt.Sprintf("%x", p.publicKey)),
+		User:   url.User(base64.StdEncoding.EncodeToString(p.PublicKey())),
 		Host:   p.Address(),
 	}
 	return u.String()
diff --git a/plugins/analysis/client/plugin.go b/plugins/analysis/client/plugin.go
index da700fadeab250016a45421f3344e888141d9d77..506982347c0b066946b2b0360c6cf034b2c6a7a4 100644
--- a/plugins/analysis/client/plugin.go
+++ b/plugins/analysis/client/plugin.go
@@ -1,7 +1,6 @@
 package client
 
 import (
-	"encoding/hex"
 	"net"
 	"time"
 
@@ -57,15 +56,19 @@ func Run(plugin *node.Plugin) {
 func getEventDispatchers(conn *network.ManagedConnection) *EventDispatchers {
 	return &EventDispatchers{
 		AddNode: func(nodeId []byte) {
+			log.Debugw("AddNode", "nodeId", nodeId)
 			_, _ = conn.Write((&addnode.Packet{NodeId: nodeId}).Marshal())
 		},
 		RemoveNode: func(nodeId []byte) {
+			log.Debugw("RemoveNode", "nodeId", nodeId)
 			_, _ = conn.Write((&removenode.Packet{NodeId: nodeId}).Marshal())
 		},
 		ConnectNodes: func(sourceId []byte, targetId []byte) {
+			log.Debugw("ConnectNodes", "sourceId", sourceId, "targetId", targetId)
 			_, _ = conn.Write((&connectnodes.Packet{SourceId: sourceId, TargetId: targetId}).Marshal())
 		},
 		DisconnectNodes: func(sourceId []byte, targetId []byte) {
+			log.Debugw("DisconnectNodes", "sourceId", sourceId, "targetId", targetId)
 			_, _ = conn.Write((&disconnectnodes.Packet{SourceId: sourceId, TargetId: targetId}).Marshal())
 		},
 	}
@@ -83,27 +86,22 @@ func setupHooks(plugin *node.Plugin, conn *network.ManagedConnection, eventDispa
 	// define hooks ////////////////////////////////////////////////////////////////////////////////////////////////////
 
 	onDiscoverPeer := events.NewClosure(func(ev *discover.DiscoveredEvent) {
-		log.Info("onDiscoverPeer: " + hex.EncodeToString(ev.Peer.ID().Bytes()))
 		eventDispatchers.AddNode(ev.Peer.ID().Bytes())
 	})
 
 	onDeletePeer := events.NewClosure(func(ev *discover.DeletedEvent) {
-		log.Info("onDeletePeer: " + hex.EncodeToString(ev.Peer.ID().Bytes()))
 		eventDispatchers.RemoveNode(ev.Peer.ID().Bytes())
 	})
 
 	onAddAcceptedNeighbor := events.NewClosure(func(ev *selection.PeeringEvent) {
-		log.Info("onAddAcceptedNeighbor: " + hex.EncodeToString(ev.Peer.ID().Bytes()) + " - " + hex.EncodeToString(local.GetInstance().ID().Bytes()))
 		eventDispatchers.ConnectNodes(ev.Peer.ID().Bytes(), local.GetInstance().ID().Bytes())
 	})
 
 	onRemoveNeighbor := events.NewClosure(func(ev *selection.DroppedEvent) {
-		log.Info("onRemoveNeighbor: " + hex.EncodeToString(ev.DroppedID.Bytes()) + " - " + hex.EncodeToString(local.GetInstance().ID().Bytes()))
 		eventDispatchers.DisconnectNodes(ev.DroppedID.Bytes(), local.GetInstance().ID().Bytes())
 	})
 
 	onAddChosenNeighbor := events.NewClosure(func(ev *selection.PeeringEvent) {
-		log.Info("onAddChosenNeighbor: " + hex.EncodeToString(local.GetInstance().ID().Bytes()) + " - " + hex.EncodeToString(ev.Peer.ID().Bytes()))
 		eventDispatchers.ConnectNodes(local.GetInstance().ID().Bytes(), ev.Peer.ID().Bytes())
 	})
 
diff --git a/plugins/analysis/plugin.go b/plugins/analysis/plugin.go
index 8be4a8422f10dff034cc7d90d793361115cf1243..1dc75fff1e3613bdd05dbced7c3bc4e832109a9a 100644
--- a/plugins/analysis/plugin.go
+++ b/plugins/analysis/plugin.go
@@ -25,12 +25,12 @@ func run(plugin *node.Plugin) {
 		webinterface.Run(plugin)
 		server.Run(plugin)
 	} else {
-		log.Info("Starting Plugin: Analysis ... server is disabled (server-port is 0)")
+		log.Info("Server is disabled (server-port is 0)")
 	}
 
 	if parameter.NodeConfig.GetString(client.CFG_SERVER_ADDRESS) != "" {
 		client.Run(plugin)
 	} else {
-		log.Info("Starting Plugin: Analysis ... client is disabled (server-address is empty)")
+		log.Info("Client is disabled (server-address is empty)")
 	}
 }
diff --git a/plugins/autopeering/autopeering.go b/plugins/autopeering/autopeering.go
index 9f019a64dd5a7db5caf84c21d5b0c408a8d87504..474fe2bd3f82d140b4ac9eecab4e09faeaffc966 100644
--- a/plugins/autopeering/autopeering.go
+++ b/plugins/autopeering/autopeering.go
@@ -99,7 +99,7 @@ func start(shutdownSignal <-chan struct{}) {
 		defer Selection.Close()
 	}
 
-	log.Infof("Auto Peering server started: ID=%x, address=%s", local.GetInstance().ID(), srv.LocalAddr())
+	log.Infof("Auto Peering started: address=%s", srv.LocalAddr())
 
 	<-shutdownSignal
 	log.Info("Stopping Auto Peering server ...")
diff --git a/plugins/autopeering/local/local.go b/plugins/autopeering/local/local.go
index cfafcb89f974cbafad8b308399a8f630d3145d5e..71e358c0f9d0d9faf6fbaaf4cedc704d551cad01 100644
--- a/plugins/autopeering/local/local.go
+++ b/plugins/autopeering/local/local.go
@@ -3,7 +3,6 @@ package local
 import (
 	"fmt"
 	"io/ioutil"
-	"log"
 	"net"
 	"net/http"
 	"strconv"
@@ -20,33 +19,47 @@ var (
 )
 
 func configureLocal() *peer.Local {
+	log := logger.NewLogger("Local")
+
 	ip := net.ParseIP(parameter.NodeConfig.GetString(CFG_ADDRESS))
 	if ip == nil {
 		log.Fatalf("Invalid IP address: %s", parameter.NodeConfig.GetString(CFG_ADDRESS))
 	}
 	if ip.IsUnspecified() {
-		myIp, err := getMyIP()
+		log.Info("Querying public IP ...")
+		myIp, err := getPublicIP(isIPv4(ip))
 		if err != nil {
-			log.Fatalf("Could not query public IP: %v", err)
+			log.Fatalf("Error querying public IP: %s", err)
 		}
 		ip = myIp
+		log.Infof("Public IP queried: address=%s", ip.String())
 	}
 
 	port := strconv.Itoa(parameter.NodeConfig.GetInt(CFG_PORT))
 
 	// create a new local node
-	db := peer.NewPersistentDB(logger.NewLogger("local"))
+	db := peer.NewPersistentDB(log)
 
 	local, err := peer.NewLocal("udp", net.JoinHostPort(ip.String(), port), db)
 	if err != nil {
-		log.Fatalf("NewLocal: %v", err)
+		log.Fatalf("Error creating local: %s", err)
 	}
+	log.Infof("Initialized local: %v", local)
 
 	return local
 }
 
-func getMyIP() (net.IP, error) {
-	url := "https://api.ipify.org?format=text"
+func isIPv4(ip net.IP) bool {
+	return ip.To4() != nil
+}
+
+func getPublicIP(ipv4 bool) (net.IP, error) {
+	var url string
+	if ipv4 {
+		url = "https://api.ipify.org"
+	} else {
+		url = "https://api6.ipify.org"
+	}
 	resp, err := http.Get(url)
 	if err != nil {
 		return nil, err
diff --git a/plugins/autopeering/plugin.go b/plugins/autopeering/plugin.go
index dd93e3984347c2764dc58572be10c2e1fe33b036..04321f98b21b2383b5b2c57d55c25ca9db1326dd 100644
--- a/plugins/autopeering/plugin.go
+++ b/plugins/autopeering/plugin.go
@@ -3,6 +3,7 @@ package autopeering
 import (
 	"github.com/iotaledger/goshimmer/packages/autopeering/discover"
 	"github.com/iotaledger/goshimmer/packages/autopeering/peer"
+	"github.com/iotaledger/goshimmer/packages/autopeering/selection"
 	"github.com/iotaledger/goshimmer/packages/gossip"
 	"github.com/iotaledger/hive.go/daemon"
 	"github.com/iotaledger/hive.go/events"
@@ -37,6 +38,19 @@ func configureEvents() {
 	}))
 
 	discover.Events.PeerDiscovered.Attach(events.NewClosure(func(ev *discover.DiscoveredEvent) {
-		log.Info("new peer discovered: " + ev.Peer.Address() + " / " + ev.Peer.ID().String())
+		log.Infof("Discovered: %s / %s", ev.Peer.Address(), ev.Peer.ID())
+	}))
+	discover.Events.PeerDeleted.Attach(events.NewClosure(func(ev *discover.DeletedEvent) {
+		log.Infof("Removed offline: %s / %s", ev.Peer.Address(), ev.Peer.ID())
+	}))
+
+	selection.Events.OutgoingPeering.Attach(events.NewClosure(func(ev *selection.PeeringEvent) {
+		log.Infof("Peering chosen: %s / %s", ev.Peer.Address(), ev.Peer.ID())
+	}))
+	selection.Events.IncomingPeering.Attach(events.NewClosure(func(ev *selection.PeeringEvent) {
+		log.Infof("Peering accepted: %s / %s", ev.Peer.Address(), ev.Peer.ID())
+	}))
+	selection.Events.Dropped.Attach(events.NewClosure(func(ev *selection.DroppedEvent) {
+		log.Infof("Peering dropped: %s", ev.DroppedID)
 	}))
 }
diff --git a/plugins/cli/plugin.go b/plugins/cli/plugin.go
index 39791c7c52a7e8f0f9506d4729f83e9414125c61..b18b78b37eb50ef5529f9822b63170b6de255ff8 100644
--- a/plugins/cli/plugin.go
+++ b/plugins/cli/plugin.go
@@ -45,7 +45,7 @@ func parseParameters() {
 }
 
 func LoadConfig() {
-	if err := parameter.FetchConfig(true); err != nil {
+	if err := parameter.FetchConfig(false); err != nil {
 		panic(err)
 	}
 	parseParameters()
@@ -56,7 +56,6 @@ func LoadConfig() {
 }
 
 func configure(ctx *node.Plugin) {
-
 	fmt.Println("  _____ _   _ ________  ______  ___ ___________ ")
 	fmt.Println(" /  ___| | | |_   _|  \\/  ||  \\/  ||  ___| ___ \\")
 	fmt.Println(" \\ `--.| |_| | | | | .  . || .  . || |__ | |_/ /")
@@ -64,6 +63,7 @@ func configure(ctx *node.Plugin) {
 	fmt.Println(" /\\__/ / | | |_| |_| |  | || |  | || |___| |\\ \\ ")
 	fmt.Printf(" \\____/\\_| |_/\\___/\\_|  |_/\\_|  |_/\\____/\\_| \\_| fullnode %s", AppVersion)
 	fmt.Println()
+	fmt.Println()
 
 	ctx.Node.Logger.Info("Loading plugins ...")
 }