diff --git a/routing/kbucket/table.go b/routing/kbucket/table.go
index 6f37e94de1d33ca0902370515f5697e61104224e..5c3e04867629eac71169538f0bbe571cfd660c9c 100644
--- a/routing/kbucket/table.go
+++ b/routing/kbucket/table.go
@@ -65,18 +65,10 @@ func (rt *RoutingTable) Update(p peer.Peer) peer.Peer {
 
 		// Are we past the max bucket size?
 		if bucket.len() > rt.bucketsize {
+			// If this bucket is the rightmost bucket, and its full
+			// we need to split it and create a new bucket
 			if bucketID == len(rt.Buckets)-1 {
-				newBucket := bucket.Split(bucketID, rt.local)
-				rt.Buckets = append(rt.Buckets, newBucket)
-				if newBucket.len() > rt.bucketsize {
-					// TODO: This is a very rare and annoying case
-					panic("Case not handled.")
-				}
-
-				// If all elements were on left side of split...
-				if bucket.len() > rt.bucketsize {
-					return bucket.popBack()
-				}
+				return rt.nextBucket()
 			} else {
 				// If the bucket cant split kick out least active node
 				return bucket.popBack()
@@ -91,6 +83,22 @@ func (rt *RoutingTable) Update(p peer.Peer) peer.Peer {
 	return nil
 }
 
+func (rt *RoutingTable) nextBucket() peer.Peer {
+	bucket := rt.Buckets[len(rt.Buckets)-1]
+	newBucket := bucket.Split(len(rt.Buckets)-1, rt.local)
+	rt.Buckets = append(rt.Buckets, newBucket)
+	if newBucket.len() > rt.bucketsize {
+		// TODO: This is a very rare and annoying case
+		return rt.nextBucket()
+	}
+
+	// If all elements were on left side of split...
+	if bucket.len() > rt.bucketsize {
+		return bucket.popBack()
+	}
+	return nil
+}
+
 // A helper struct to sort peers by their distance to the local node
 type peerDistance struct {
 	p        peer.Peer