basically complished, hope no bug