diff --git a/p2p/discover/udp.go b/p2p/discover/udp.go
index 1213c12c82e34f8acd722878577e58a8e77abe80..2b215b45ce558a9a496b72806b5ce7ca804d5bba 100644
--- a/p2p/discover/udp.go
+++ b/p2p/discover/udp.go
@@ -402,7 +402,7 @@ func encodePacket(priv *ecdsa.PrivateKey, ptype byte, req interface{}) ([]byte,
 // readLoop runs in its own goroutine. it handles incoming UDP packets.
 func (t *udp) readLoop() {
 	defer t.conn.Close()
-	buf := make([]byte, 4096) // TODO: good buffer size
+	buf := make([]byte, 1280)
 	for {
 		nbytes, from, err := t.conn.ReadFromUDP(buf)
 		if err != nil {
@@ -510,9 +510,15 @@ func (req *findnode) handle(t *udp, from *net.UDPAddr, fromID NodeID, mac []byte
 		closestrpc[i] = nodeToRPC(n)
 	}
 	t.send(from, neighborsPacket, neighbors{
-		Nodes:      closestrpc,
+		Nodes:      closestrpc[:13],
 		Expiration: uint64(time.Now().Add(expiration).Unix()),
 	})
+	if len(closestrpc) > 13 {
+		t.send(from, neighborsPacket, neighbors{
+			Nodes:      closestrpc[13:],
+			Expiration: uint64(time.Now().Add(expiration).Unix()),
+		})
+	}
 	return nil
 }
 
diff --git a/p2p/discover/udp_test.go b/p2p/discover/udp_test.go
index f175835a8b61771efee748ac8fc6c61fe67bd8d3..7bf6df5abc38d107d6141da199882fd4cce6bc84 100644
--- a/p2p/discover/udp_test.go
+++ b/p2p/discover/udp_test.go
@@ -163,9 +163,9 @@ func TestUDP_findnode(t *testing.T) {
 	))
 	// check that closest neighbors are returned.
 	test.packetIn(nil, findnodePacket, &findnode{Target: testTarget, Expiration: futureExp})
+	expected := test.table.closest(targetHash, bucketSize)
 	test.waitPacketOut(func(p *neighbors) {
-		expected := test.table.closest(targetHash, bucketSize)
-		if len(p.Nodes) != bucketSize {
+		if len(p.Nodes) != 13 {
 			t.Errorf("wrong number of results: got %d, want %d", len(p.Nodes), bucketSize)
 		}
 		for i := range p.Nodes {
@@ -174,6 +174,16 @@ func TestUDP_findnode(t *testing.T) {
 			}
 		}
 	})
+	test.waitPacketOut(func(p *neighbors) {
+		if len(p.Nodes) != 3 {
+			t.Errorf("wrong number of results: got %d, want %d", len(p.Nodes), bucketSize)
+		}
+		for i := range p.Nodes {
+			if p.Nodes[i].ID != expected.entries[i + 13].ID {
+				t.Errorf("result mismatch at %d:\n  got:  %v\n  want: %v", i, p.Nodes[i], expected.entries[i])
+			}
+		}
+	})
 }
 
 func TestUDP_findnodeMultiReply(t *testing.T) {