add recursive capabilities
merge iterate branch