Looking through the source code for java ethereum I see UDPListener is part of the org.ethereum.net.rlpx.discover package and that this seems to use NioDatagramChannel (Netty's way of handling UDP datagrams) to handle Ping, Pong, FindNode and Neighbours messages and do the kademia DHT stuff. However the Devp2p specs say it is TCP only and indeed TCP is used for communication once nodes are discovered.
So I'm slightly confused; is UDP officially used for node discovery and then TCP for communication and if so where is this node discovery protocol documented?