some changes

hard to explain, look diff