big refactoring agian and again ... ...