issue #2: introduce RoutingModel
issue #2: simplify
issue #2: refactor
issue #2: refactor
issue #2: refactor