first implementation, graphical only