added a bunch of features, too lazy to list all