should be a kernel
implemented solver