Improved, not finished