updated particle implementation