diff --git a/services/__init__.py b/services/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..ed17e011b3a55e9e4c671a9b39e7b35eb39d8078
--- /dev/null
+++ b/services/__init__.py
@@ -0,0 +1,14 @@
+import os
+import json
+from flask import make_response
+
+
+def root_dir():
+    """ Returns root director for this project """
+    return os.path.dirname(os.path.realpath(__file__ + '/..'))
+
+
+def nice_json(arg):
+    response = make_response(json.dumps(arg, sort_keys = True, indent=4))
+    response.headers['Content-type'] = "application/json"
+    return response
\ No newline at end of file
diff --git a/services/bookings.py b/services/bookings.py
new file mode 100644
index 0000000000000000000000000000000000000000..6cf957a5d56f00558c222748e7484157ae54c5f6
--- /dev/null
+++ b/services/bookings.py
@@ -0,0 +1,38 @@
+from services import root_dir, nice_json
+from flask import Flask
+import json
+from werkzeug.exceptions import NotFound
+
+
+app = Flask(__name__)
+
+with open("{}/database/bookings.json".format(root_dir()), "r") as f:
+    bookings = json.load(f)
+
+
+@app.route("/", methods=['GET'])
+def hello():
+    return nice_json({
+        "uri": "/",
+        "subresource_uris": {
+            "bookings": "/bookings",
+            "booking": "/bookings/<username>"
+        }
+    })
+
+
+@app.route("/bookings", methods=['GET'])
+def booking_list():
+    return nice_json(bookings)
+
+
+@app.route("/bookings/<username>", methods=['GET'])
+def booking_record(username):
+    if username not in bookings:
+        raise NotFound
+
+    return nice_json(bookings[username])
+
+if __name__ == "__main__":
+    app.run(port=5003, debug=True)
+
diff --git a/services/movies.py b/services/movies.py
new file mode 100644
index 0000000000000000000000000000000000000000..b9907dd983bc3268bd1290425ee1bfb3e537a9dd
--- /dev/null
+++ b/services/movies.py
@@ -0,0 +1,41 @@
+from services import root_dir, nice_json
+from flask import Flask
+from werkzeug.exceptions import NotFound
+import json
+
+
+app = Flask(__name__)
+
+with open("{}/database/movies.json".format(root_dir()), "r") as f:
+    movies = json.load(f)
+
+
+@app.route("/", methods=['GET'])
+def hello():
+    return nice_json({
+        "uri": "/",
+        "subresource_uris": {
+            "movies": "/movies",
+            "movie": "/movies/<id>"
+        }
+    })
+
+@app.route("/movies/<movieid>", methods=['GET'])
+def movie_info(movieid):
+    if movieid not in movies:
+        raise NotFound
+
+    result = movies[movieid]
+    result["uri"] = "/movies/{}".format(movieid)
+
+    return nice_json(result)
+
+
+@app.route("/movies", methods=['GET'])
+def movie_record():
+    return nice_json(movies)
+
+
+if __name__ == "__main__":
+    app.run(port=5001, debug=True)
+
diff --git a/services/showtimes.py b/services/showtimes.py
new file mode 100644
index 0000000000000000000000000000000000000000..b6c622d2ce80a19faaa5166f2898266dc97f874b
--- /dev/null
+++ b/services/showtimes.py
@@ -0,0 +1,37 @@
+from services import root_dir, nice_json
+from flask import Flask
+from werkzeug.exceptions import NotFound
+import json
+
+
+app = Flask(__name__)
+
+with open("{}/database/showtimes.json".format(root_dir()), "r") as f:
+    showtimes = json.load(f)
+
+
+@app.route("/", methods=['GET'])
+def hello():
+    return nice_json({
+        "uri": "/",
+        "subresource_uris": {
+            "showtimes": "/showtimes",
+            "showtime": "/showtimes/<date>"
+        }
+    })
+
+
+@app.route("/showtimes", methods=['GET'])
+def showtimes_list():
+    return nice_json(showtimes)
+
+
+@app.route("/showtimes/<date>", methods=['GET'])
+def showtimes_record(date):
+    if date not in showtimes:
+        raise NotFound
+    print showtimes[date]
+    return nice_json(showtimes[date])
+
+if __name__ == "__main__":
+    app.run(port=5002, debug=True)
diff --git a/services/user.py b/services/user.py
new file mode 100644
index 0000000000000000000000000000000000000000..17edad230ee2d586ae2ce0da9b87da1f29cd0ee6
--- /dev/null
+++ b/services/user.py
@@ -0,0 +1,92 @@
+from services import root_dir, nice_json
+from flask import Flask
+from werkzeug.exceptions import NotFound, ServiceUnavailable
+import json
+import requests
+
+
+app = Flask(__name__)
+
+with open("{}/database/users.json".format(root_dir()), "r") as f:
+    users = json.load(f)
+
+
+@app.route("/", methods=['GET'])
+def hello():
+    return nice_json({
+        "uri": "/",
+        "subresource_uris": {
+            "users": "/users",
+            "user": "/users/<username>",
+            "bookings": "/users/<username>/bookings",
+            "suggested": "/users/<username>/suggested"
+        }
+    })
+
+
+@app.route("/users", methods=['GET'])
+def users_list():
+    return nice_json(users)
+
+
+@app.route("/users/<username>", methods=['GET'])
+def user_record(username):
+    if username not in users:
+        raise NotFound
+
+    return nice_json(users[username])
+
+
+@app.route("/users/<username>/bookings", methods=['GET'])
+def user_bookings(username):
+    """
+    Gets booking information from the 'Bookings Service' for the user, and
+     movie ratings etc. from the 'Movie Service' and returns a list.
+    :param username:
+    :return: List of Users bookings
+    """
+    if username not in users:
+        raise NotFound("User '{}' not found.".format(username))
+
+    try:
+        users_bookings = requests.get("http://127.0.0.1:5003/bookings/{}".format(username))
+    except requests.exceptions.ConnectionError:
+        raise ServiceUnavailable("The Bookings service is unavailable.")
+
+    if users_bookings.status_code == 404:
+        raise NotFound("No bookings were found for {}".format(username))
+
+    users_bookings = users_bookings.json()
+
+    # For each booking, get the rating and the movie title
+    result = {}
+    for date, movies in users_bookings.iteritems():
+        result[date] = []
+        for movieid in movies:
+            try:
+                movies_resp = requests.get("http://127.0.0.1:5001/movies/{}".format(movieid))
+            except requests.exceptions.ConnectionError:
+                raise ServiceUnavailable("The Movie service is unavailable.")
+            movies_resp = movies_resp.json()
+            result[date].append({
+                "title": movies_resp["title"],
+                "rating": movies_resp["rating"],
+                "uri": movies_resp["uri"]
+            })
+
+    return nice_json(result)
+
+
+@app.route("/users/<username>/suggested", methods=['GET'])
+def user_suggested(username):
+    """
+    Returns movie suggestions. The algorithm returns a list of 3 top ranked
+    movies that the user has not yet booked.
+    :param username:
+    :return: Suggested movies
+    """
+    raise NotImplementedError()
+
+
+if __name__ == "__main__":
+    app.run(port=5000, debug=True)