removed second level generics as iOS can't handle them