Seems to work - need to check for leaks (not sure about retain() )