implemented diffusion