cleanup + toString + hashCode