pretty much done besides text formatting