We are using react-redux and redux-saga. We've actually created some code that auto-generates reducers, mapStateToDispatch and mapStateToProps for the common case of two way data binding. Might sound weird but 90% of our stuff was just "when this field changes, update the corresponding field in the store". Our approach reduces boiler plate code significantly. If we want to add more complex functionality to the reducer we have helper functions that basically adds a handler function for a specific action to the auto-generated reducer. Our state is entirely flat, and includes business and UI state stored in an Immutable.js map. So far this has worked well for us, but we are only in the prototyping stages so we might hit some speed-bumps that require a bit more structure. We combine container and components in the same file, exporting the redux-bound container as the default export, and then a 'component' property on the container has a reference to the "pure" component for testing purposes. For example: const component =({...props list ...}) => { return (<jsx></jsx>) }; const container = connect(...)(comp); container.component = component; export default container; Now that might be entirely insane, and one issue we've been having is with error reporting telling us there is an issue with component 'component' which might eventually force us to tweak things a bit, but other than that it works well. We do async requests using redux-saga, which is amazing once you wrap your head around generator syntax. We've also created some re-usable sagas for common fetching use cases. superagent-bluebird-promise is used to do the actual requests and it integrates well with sagas (as would anything that returns a Promise).