Pretty much done, need to test/put final touches on this