Replication between clusters

Please do not merge this pull request.
I would like to discuss some design issues which are commented by "TODO" in code.
add dynamic type check before dynamic_pointer_cast