Batch codes were introduced by Ishai, Kushilevitz, Ostrovsky and Sahai in 2004. A batch code encodes a string x into m strings stored on m distinct servers, such that any subset of k symbols from x can be retrieved by reading at most t symbols from each server. The goal is to keep the "load" t and the total storage size small. The problem is motivated by applications to load balancing in distributed storage and private information retrieval. Batch codes can be viewed as a common relaxation of expander graphs and locally decodable codes. Combinatorial batch codes are replication based, each server stores a subset of symbols of the string x. We give optimal constructions of combinatorial batch codes for a new range of parameters. Our constructions are based on transversal designs.