reworking alot to make it easier to use. UNSTABLE