dnsjava is an implementation of the DNS protocol in Java. It supports all of the common record types. dnsjava provides both high and low level access to the resolver. The high level functions perform queries for records of a given name, type, and class, and return an array of records. A cache is used to reduce the number of queries sent. The low level functions allow direct manipulation of dns messages and records, as well as allowing additional resolver properties to be set. A 'dig' clone, dynamic update program, and basic server are also included. Extensions to the DNS protocol are supported as well (DNSSEC, TSIG, EDNS0).