Более менее рабочая реализация