diff --git a/p2p/discover/udp.go b/p2p/discover/udp.go
index 7213325da8665fdc92492c65a9d5aef6422eb8ea..1213c12c82e34f8acd722878577e58a8e77abe80 100644
--- a/p2p/discover/udp.go
+++ b/p2p/discover/udp.go
@@ -31,8 +31,8 @@ var (
 
 // Timeouts
 const (
-	respTimeout = 300 * time.Millisecond
-	sendTimeout = 300 * time.Millisecond
+	respTimeout = 500 * time.Millisecond
+	sendTimeout = 500 * time.Millisecond
 	expiration  = 20 * time.Second
 
 	refreshInterval = 1 * time.Hour
diff --git a/p2p/nat/nat.go b/p2p/nat/nat.go
index 4ae7e6b1721c3b23317c389b0ec7f2d655173952..fe00bdab0d2598098d76fd669279ff650ae4a057 100644
--- a/p2p/nat/nat.go
+++ b/p2p/nat/nat.go
@@ -91,7 +91,8 @@ func Map(m Interface, c chan struct{}, protocol string, extport, intport int, na
 	}()
 	glog.V(logger.Debug).Infof("add mapping: %s %d -> %d (%s) using %s\n", protocol, extport, intport, name, m)
 	if err := m.AddMapping(protocol, intport, extport, name, mapTimeout); err != nil {
-		glog.V(logger.Error).Infof("mapping error: %v\n", err)
+		glog.V(logger.Warn).Infof("network port %d could not be mapped: %v\n", intport, err)
+		glog.V(logger.Debug).Infof("mapping with %v returned %v\n", m, err)
 	}
 	for {
 		select {
@@ -102,7 +103,8 @@ func Map(m Interface, c chan struct{}, protocol string, extport, intport int, na
 		case <-refresh.C:
 			glog.V(logger.Detail).Infof("refresh mapping: %s %d -> %d (%s) using %s\n", protocol, extport, intport, name, m)
 			if err := m.AddMapping(protocol, intport, extport, name, mapTimeout); err != nil {
-				glog.V(logger.Error).Infof("mapping error: %v\n", err)
+				glog.V(logger.Warn).Infof("network port %d could not be mapped: %v\n", intport, err)
+				glog.V(logger.Debug).Infof("mapping with %v returned %v\n", m, err)
 			}
 			refresh.Reset(mapUpdateInterval)
 		}
@@ -225,7 +227,7 @@ func (n *autodisc) wait() error {
 		return nil
 	}
 	if found = <-n.done; found == nil {
-		return errors.New("no devices discovered")
+		return errors.New("no UPnP or NAT-PMP router discovered")
 	}
 	n.mu.Lock()
 	n.found = found
diff --git a/p2p/peer.go b/p2p/peer.go
index 94fa03f8d3a466aab7437022baf67bf04daa3f80..cdf9ba9652ceedb1028cd981c44f3522115fd395 100644
--- a/p2p/peer.go
+++ b/p2p/peer.go
@@ -10,6 +10,7 @@ import (
 	"time"
 
 	"github.com/ethereum/go-ethereum/logger"
+	"github.com/ethereum/go-ethereum/logger/glog"
 	"github.com/ethereum/go-ethereum/p2p/discover"
 	"github.com/ethereum/go-ethereum/rlp"
 )
@@ -34,10 +35,6 @@ const (
 
 // Peer represents a connected remote node.
 type Peer struct {
-	// Peers have all the log methods.
-	// Use them to display messages related to the peer.
-	*logger.Logger
-
 	conn    net.Conn
 	rw      *conn
 	running map[string]*protoRW
@@ -99,10 +96,8 @@ func (p *Peer) String() string {
 }
 
 func newPeer(fd net.Conn, conn *conn, protocols []Protocol) *Peer {
-	logtag := fmt.Sprintf("Peer %.8x %v", conn.ID[:], fd.RemoteAddr())
 	protomap := matchProtocols(protocols, conn.Caps, conn)
 	p := &Peer{
-		Logger:   logger.NewLogger(logtag),
 		conn:     fd,
 		rw:       conn,
 		running:  protomap,
@@ -130,7 +125,7 @@ func (p *Peer) run() DiscReason {
 		} else {
 			// Note: We rely on protocols to abort if there is a write
 			// error. It might be more robust to handle them here as well.
-			p.DebugDetailf("Read error: %v\n", err)
+			glog.V(logger.Detail).Infof("%v: Read error: %v\n", p, err)
 			reason = DiscNetworkError
 		}
 	case err := <-p.protoErr:
@@ -141,7 +136,7 @@ func (p *Peer) run() DiscReason {
 	close(p.closed)
 	p.politeDisconnect(reason)
 	p.wg.Wait()
-	p.Debugf("Disconnected: %v\n", reason)
+	glog.V(logger.Debug).Infof("%v: Disconnected: %v\n", p, reason)
 	return reason
 }
 
@@ -195,7 +190,7 @@ func (p *Peer) handle(msg Msg) error {
 		// This is the last message. We don't need to discard or
 		// check errors because, the connection will be closed after it.
 		rlp.Decode(msg.Payload, &reason)
-		p.Debugf("Disconnect requested: %v\n", reason[0])
+		glog.V(logger.Debug).Infof("%v: Disconnect Requested: %v\n", p, reason[0])
 		return DiscRequested
 	case msg.Code < baseProtocolLength:
 		// ignore other base protocol messages
@@ -239,14 +234,14 @@ func (p *Peer) startProtocols() {
 	for _, proto := range p.running {
 		proto := proto
 		proto.closed = p.closed
-		p.DebugDetailf("Starting protocol %s/%d\n", proto.Name, proto.Version)
+		glog.V(logger.Detail).Infof("%v: Starting protocol %s/%d\n", p, proto.Name, proto.Version)
 		go func() {
 			err := proto.Run(p, proto)
 			if err == nil {
-				p.DebugDetailf("Protocol %s/%d returned\n", proto.Name, proto.Version)
+				glog.V(logger.Detail).Infof("%v: Protocol %s/%d returned\n", p, proto.Name, proto.Version)
 				err = errors.New("protocol returned")
-			} else {
-				p.DebugDetailf("Protocol %s/%d error: %v\n", proto.Name, proto.Version, err)
+			} else if err != io.EOF {
+				glog.V(logger.Detail).Infof("%v: Protocol %s/%d error: \n", p, proto.Name, proto.Version, err)
 			}
 			p.protoErr <- err
 			p.wg.Done()
diff --git a/p2p/server.go b/p2p/server.go
index 4a78e0bb9eed65218f94a88c2d81a989e50c9422..5e0c917fc4c9e4ca6ab24a88ea8ea596b0903e30 100644
--- a/p2p/server.go
+++ b/p2p/server.go
@@ -428,7 +428,7 @@ func (srv *Server) dialLoop() {
 		case <-refresh.C:
 			// Grab some nodes to connect to if we're not at capacity.
 			srv.lock.RLock()
-			needpeers := len(srv.peers) < srv.MaxPeers
+			needpeers := len(srv.peers) < srv.MaxPeers/2
 			srv.lock.RUnlock()
 			if needpeers {
 				go func() {
diff --git a/whisper/peer.go b/whisper/peer.go
index 9fdc28434610a185b0798ec3372905f80b56e4de..0d9538ffc1d564642101ac89f44ee53fea8150e7 100644
--- a/whisper/peer.go
+++ b/whisper/peer.go
@@ -5,6 +5,8 @@ import (
 	"time"
 
 	"github.com/ethereum/go-ethereum/common"
+	"github.com/ethereum/go-ethereum/logger"
+	"github.com/ethereum/go-ethereum/logger/glog"
 	"github.com/ethereum/go-ethereum/p2p"
 	"github.com/ethereum/go-ethereum/rlp"
 	"gopkg.in/fatih/set.v0"
@@ -36,13 +38,13 @@ func newPeer(host *Whisper, remote *p2p.Peer, rw p2p.MsgReadWriter) *peer {
 // into the network.
 func (self *peer) start() {
 	go self.update()
-	self.peer.Debugln("whisper started")
+	glog.V(logger.Debug).Infof("%v: whisper started", self.peer)
 }
 
 // stop terminates the peer updater, stopping message forwarding to it.
 func (self *peer) stop() {
 	close(self.quit)
-	self.peer.Debugln("whisper stopped")
+	glog.V(logger.Debug).Infof("%v: whisper stopped", self.peer)
 }
 
 // handshake sends the protocol initiation status message to the remote peer and
@@ -94,7 +96,7 @@ func (self *peer) update() {
 
 		case <-transmit.C:
 			if err := self.broadcast(); err != nil {
-				self.peer.Infoln("broadcast failed:", err)
+				glog.V(logger.Info).Infof("%v: broadcast failed: %v", self.peer, err)
 				return
 			}
 
@@ -152,7 +154,6 @@ func (self *peer) broadcast() error {
 	if err := p2p.Send(self.ws, messagesCode, transmit); err != nil {
 		return err
 	}
-	self.peer.DebugDetailln("broadcasted", len(transmit), "message(s)")
-
+	glog.V(logger.Detail).Infoln(self.peer, "broadcasted", len(transmit), "message(s)")
 	return nil
 }
diff --git a/whisper/whisper.go b/whisper/whisper.go
index a48e1e380da83bdcf2b7704f62cc9bd614f9ebd0..994b4e5069fe9e526fd57d54f4d3cd8e8b898e73 100644
--- a/whisper/whisper.go
+++ b/whisper/whisper.go
@@ -197,14 +197,14 @@ func (self *Whisper) handlePeer(peer *p2p.Peer, rw p2p.MsgReadWriter) error {
 		}
 		var envelopes []*Envelope
 		if err := packet.Decode(&envelopes); err != nil {
-			peer.Infof("failed to decode enveloped: %v", err)
+			glog.V(logger.Info).Infof("%v: failed to decode envelope: %v", peer, err)
 			continue
 		}
 		// Inject all envelopes into the internal pool
 		for _, envelope := range envelopes {
 			if err := self.add(envelope); err != nil {
 				// TODO Punish peer here. Invalid envelope.
-				peer.Debugf("failed to pool envelope: %f", err)
+				glog.V(logger.Debug).Infof("%v: failed to pool envelope: %v", peer, err)
 			}
 			whisperPeer.mark(envelope)
 		}