diff --git a/packages/react-server-examples/bike-share/.babelrc b/packages/react-server-examples/bike-share/.babelrc
new file mode 100644
index 000000000..06ffde968
--- /dev/null
+++ b/packages/react-server-examples/bike-share/.babelrc
@@ -0,0 +1,3 @@
+{
+ "presets": ["react-server"]
+}
diff --git a/packages/react-server-examples/bike-share/.gitignore b/packages/react-server-examples/bike-share/.gitignore
new file mode 100644
index 000000000..c2dc4f6ec
--- /dev/null
+++ b/packages/react-server-examples/bike-share/.gitignore
@@ -0,0 +1,3 @@
+node_modules
+build
+__clientTemp
diff --git a/packages/react-server-examples/bike-share/Dockerfile b/packages/react-server-examples/bike-share/Dockerfile
new file mode 100644
index 000000000..dc7eabba1
--- /dev/null
+++ b/packages/react-server-examples/bike-share/Dockerfile
@@ -0,0 +1,5 @@
+FROM node:slim
+
+EXPOSE 3000
+ENV NODE_ENV=docker-dev
+VOLUME /www
\ No newline at end of file
diff --git a/packages/react-server-examples/bike-share/README.md b/packages/react-server-examples/bike-share/README.md
new file mode 100644
index 000000000..fd81a3d6d
--- /dev/null
+++ b/packages/react-server-examples/bike-share/README.md
@@ -0,0 +1,82 @@
+# react-server-examples/bike-share
+
+An example project for `react-server` which demos server rendering, interactivity
+on the client side, frameback, ReactServerAgent, url parameters and logging.
+Uses [api.citybik.es](http://api.citybik.es/v2/) to get data about bike shares
+and their availability around the world.
+
+To start in development mode:
+
+```shell
+npm start
+```
+
+Then go to [localhost:3000](http://localhost:3000/). You will see an index page
+that shows the covered bike share networks around the world. Each bike share
+network is a link to a details page that, when clicked, loads an iframe in front
+of the index page containing a network page for that bike share network,
+including information about each station in that network, and the number of
+available bikes the last time that data is available for.
+
+If you want to optimize the client code at the expense of startup time, type
+`NODE_ENV=production npm start`. You can also use
+[any react-server-cli arguments](../../react-server-cli#setting-options-manually)
+after `--`. For example:
+
+```shell
+# start in dev mode on port 4000
+npm start -- --port=4000
+```
+
+# Developing using Docker and Docker Compose
+
+These steps assume you are familiar with docker and already have it installed.
+Some basics:
+
+1. Download [Docker Toolbox](https://www.docker.com/products/docker-toolbox) and
+ install it.
+2. Start `docker quick start shell`
+3. Navigate to where you generated the project
+4. Add a configuration to set the `host` option to the ip given by
+ `docker-machine ip`. An example configuration might be like:
+```json
+{
+ "port": "3000",
+ "env": {
+ "docker": {
+ "host": "Your ip from `docker-machine ip` here"
+ },
+ "staging": {
+ "port": "3000"
+ },
+ "production": {
+ "port": "80"
+ }
+ }
+}
+```
+5. Now that your system is ready to go, start the containers:
+```shell
+docker-compose build --pull
+docker-compose up
+```
+
+The containers will now be running. At any time, press ctrl+c to stop them.
+
+To clean up, run the following commands:
+
+```shell
+docker-compose stop
+docker-compose rm --all
+docker volume ls # and get the name of the volume ending in react_server_node_modules
+# this name will be different depending on the name of the project
+docker volume rm _react_server_node_modules
+```
+
+The configuration included stores the node_modules directory in a "named volume".
+This is a special persistent data-store that Docker uses to keep around the
+node_modules directory so that they don't have to be built on each run of the
+container. If you need to get into the container in order to investigate what
+is in the volume, you can run `docker-compose exec react_server bash` which will
+open a shell in the container. Be aware that the exec functionality doesn't
+exist in Windows (as of this writing).
diff --git a/packages/react-server-examples/bike-share/api/network.js b/packages/react-server-examples/bike-share/api/network.js
new file mode 100644
index 000000000..51c05e327
--- /dev/null
+++ b/packages/react-server-examples/bike-share/api/network.js
@@ -0,0 +1,32 @@
+import {ReactServerAgent, logging} from 'react-server';
+
+const logger = logging.getLogger(__LOGGER__);
+
+export default class NetworkApi {
+ setConfigValues() {
+ return {isRawResponse: true};
+ }
+
+ handleRoute(next) {
+ this.network = this.getRequest().getQuery().network;
+ logger.info(`got network api request${this.network ? ' for network ' + this.network : ''}`);
+ return next();
+ }
+
+ getContentType() {
+ return 'application/json';
+ }
+
+ getResponseData() {
+ let url = 'http://api.citybik.es/v2/networks';
+ if (this.network) {
+ url += `/${this.network}`;
+ }
+ return new Promise(resolve => {
+ ReactServerAgent.get(url).then(data => {
+ logger.info(`got data ${JSON.stringify(data)} from url ${url}`);
+ resolve(JSON.stringify(data));
+ });
+ });
+ }
+}
diff --git a/packages/react-server-examples/bike-share/components/footer.js b/packages/react-server-examples/bike-share/components/footer.js
new file mode 100644
index 000000000..053f9ccac
--- /dev/null
+++ b/packages/react-server-examples/bike-share/components/footer.js
@@ -0,0 +1,14 @@
+import React from 'react';
+import {logging} from 'react-server';
+
+const logger = logging.getLogger(__LOGGER__);
+
+export default () => {
+ logger.info('rendering the footer');
+ return (