little design changes and many heavy thinking...