diff --git a/content/using-input-fields/README.md b/content/using-input-fields/README.md
new file mode 100644
index 0000000..282cfd6
--- /dev/null
+++ b/content/using-input-fields/README.md
@@ -0,0 +1,383 @@
+# Using input fields with choo
+🌐 Made by [@louiscenter](https://twitter.com/louiscenter) 🌐
+
+✨ This guide will help demonstrate the use of input fields within a simple interactive `choo` application
+
+## choo handbook
+This guide has been published at [https://handbook.choo.io/using-input-fields](https://handbook.choo.io/using-input-fields).
+
+## Who is guide this for?
+To follow along, you should be comfortable with the basics of JavaScript, HTML & CSS.
+
+You should also feel comfortable with the basics of `choo`. If you haven't already, complete the [your-first-choo-app](https://handbook.choo.io/your-first-choo-app) guide before starting this one. It's a good introduction to what `choo` is, and how it works.
+
+## What will we build?
+For this guide, we're going to build a variation of the animal simulator we built in the [your-first-choo-app](https://handbook.choo.io/your-first-choo-app) tutorial, that will allow our animals to talk to one another. I call it `choo-talking-animals`.
+
+This is what it looks like:
+
+[![screenshot](images/choo-talking-animals.gif)](https://choo-talking-animals.glitch.me)
+
+Using the provided input fields, a user can change what each animal is saying to the other. The lion's input field will work slightly differently to the crocodile's input field, and this should help demonstrate the basic ways in which input fields can update our application's state.
+
+You can try the finished version of this app here: [https://choo-talking-animals.glitch.me](https://choo-talking-animals.glitch.me)
+
+## Let's get started!
+For this guide, we will be using the [Glitch](https://glitch.com/) code editor.
+
+If you're not familiar with how Glitch works, you should refer to the `Let's get started` section in our [your-first-choo-app](https://handbook.choo.io/your-first-choo-app) tutorial.
+
+If you're already familiar with Glitch, open the following starter project URL, remix/fork the project and let's begin: [https://glitch.com/edit/#!/project/choo-talking-animals-starter](https://glitch.com/edit/#!/project/choo-talking-animals-starter)
+
+## Creating input fields
+With our starter project loaded, let's have a look at what code is provided for us. Click the `index.js` file in Glitch's left sidebar, and make sure that you see the following:
+
+```js
+// import choo
+var choo = require('choo')
+
+// import template
+var main = require('./templates/main')
+
+// initialize choo
+var app = choo()
+
+// declare routes
+app.route('/', main)
+
+// start app
+app.mount('div')
+```
+
+First, we are importing the `choo` framework, as well as a pre-made HTML template into our codebase. We then initialize an instance of `choo` (stored in the `app` variable), and then create a new `/` route which points to the template we imported above. Finally, we mount the app to our webpage using the `mount()` function, which simultaneously starts the application when everything has finished loading.
+
+Let's take a look at the template which we imported, and stored in the `main` variable. Click on the `templates/main.js` file in Glitch's left sidebar, and make sure that you see the following:
+
+```js
+// import html helper
+var html = require('choo/html')
+
+// export function
+module.exports = function (state, emit) {
+ return html`
+
+
+
+
+
+
+
+
+
+
+
+
+
+ `
+}
+```
+
+At the top of this file, we've imported the `html` function that comes with `choo`, which allows us to create HTML templates that `choo` can understand and render on the page. Below, we're exporting a function that returns a template which will render a square of grass, a lion, a crocodile and some speech bubbles (the assets and CSS styles for these HTML elements are included with the starter project).
+
+We can see what our app currently looks like, by clicking the "Show" button near the top left hand corner of the window:
+
+![starter1](images/starter1.gif "Screenshot of starter project")
+
+Let's add some input fields to our application. Modify the HTML template inside `template/main.js` to read the following:
+
+```html
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
The Lion says
+
+
+
+
+
The Crocodile says
+
+
+
+
+
+```
+
+Let's see what our app looks like now:
+
+![inputs1](images/inputs1.gif "Screenshot of new input fields")
+
+Below our grass square (`
`), we've a added new container (`
`) which includes two input fields (``), and a `
+```
+
+Like before, we've added a `value` property to this input field, and set its value to the `crocodile` variable. However, you may have noticed that we didn't add an `oninput` property. Instead, we've added an `onclick` property to the `` element, which is set to trigger a function called `updateCrocodile()` when an interaction occurs.
+
+To finish, let's add the `updateCrocodile()` function below the `updateLion()` function:
+
+```js
+// update what lion says
+function updateLion (e) {
+ emit('updateAnimal', {
+ type: 'lion',
+ value: e.target.value
+ })
+}
+
+// update what crocodile says
+function updateCrocodile () {
+ emit('updateAnimal', {
+ type: 'crocodile',
+ value: document.getElementById('crocodile').value
+ })
+}
+```
+
+This is the last bit of code we'll write in this guide, so let's see how our app looks now. Switch to the application view, change the value of the Crocodile's input field, and press the `Update` button:
+
+![inputs5](images/inputs5.gif "The crocodile talks!")
+
+Awesome! Both inputs are now working, and we can change what both animals are saying to each other. Let's look closer at what our second input field is doing, and then figure out how these two input fields differ from each other:
+
+- First, the user changes the value of the Crocodile's input field, and then presses the `` element labelled "Update".
+
+- This then triggers the `updateCrocodile()` function, which then triggers the `emit()` function. We emit `updateAnimal` to `choo`'s event bus, and pass in an object, just like we do in our `updateLion()` function from earlier.
+
+- The object we pass into `emit()` here differs slightly from the one inside of `updateLion()`: its `type` property is set to `'crocodile'`, and its `value` property is set to `document.getElementById('crocodile').value`.
+
+The difference between these two approaches is mainly in the way we are obtaining the value of each input field:
+
+- In the first example, because we are running `updateLion()` after each key stroke, we can set the value of our application's state to the value of the `` element each time.
+
+- In the second example, we only run `updateCrocodile()` when the "Update" `` is clicked. As the interaction arises from the `` element, we must manually reach out to the `` element we're interested in and obtain its value, and we do this by using `document.getElementById('crocodile').value()`.
+
+## Pros and cons
+As mentioned previously, the goal of this guide is to demonstrate two ways in which the transfer of information between an `` element, and our application's `state` object can be achieved.
+
+There are more variations on this, but what we've shown here demonstrates the significance of *when* to re-render a page for the user.
+
+In certain circumstances, you may want your user interface to change after each keystroke or related interaction, but in other circumstances, you may want to avoid this because your page is already re-rendering increasingly often.
+
+You may have spotted this UI bug while playing around with the app:
+
+![ui-bug](images/ui-bug.gif "A small UI bug")
+
+First, we're changing the value of the Crocodile's input field, but before we click the "Update" button, we're also changing the value of the Lion's input field. This then causes the value of the Crocodile's input field to reset to the value of `state.animals.crocodile`.
+
+Remember, the Lion's input field updates our application's state *and* re-renders after each keystroke, so if we have entered a new value into the Crocodile's input, but have not yet updated the value of `state.animals.crocodile`, we wind up with this race condition.
+
+Deciding on which method you might want to use for your own application will differ depending on what you need the end result to look like, but be aware of any excessive re-rendering or unintended UI bugs.
+
+## Summary
+Yay! Another `choo` handbook guide in the bag!
+
+It seems like we've chewed through a lot information here just to get some `` fields on a page, but we've managed to touch on a number of topics:
+
+- HTML element event handlers (`oninput`, `onclick`)
+- Grabbing HTML element values (`document.getElementById()`)
+- Re-rendering (`emitter.emit('render')`)
+
+In the coming weeks, we will be publishing another guide on "Advanced Form Handling". This should cover a much wider scope of topics to help structure complex forms inside your `choo` application.
+
+Stay tuned!
diff --git a/content/using-input-fields/images/choo-talking-animals.gif b/content/using-input-fields/images/choo-talking-animals.gif
new file mode 100644
index 0000000..6a9fb5b
Binary files /dev/null and b/content/using-input-fields/images/choo-talking-animals.gif differ
diff --git a/content/using-input-fields/images/inputs1.gif b/content/using-input-fields/images/inputs1.gif
new file mode 100644
index 0000000..d856fc7
Binary files /dev/null and b/content/using-input-fields/images/inputs1.gif differ
diff --git a/content/using-input-fields/images/inputs2.gif b/content/using-input-fields/images/inputs2.gif
new file mode 100644
index 0000000..e847a22
Binary files /dev/null and b/content/using-input-fields/images/inputs2.gif differ
diff --git a/content/using-input-fields/images/inputs3.gif b/content/using-input-fields/images/inputs3.gif
new file mode 100644
index 0000000..4046095
Binary files /dev/null and b/content/using-input-fields/images/inputs3.gif differ
diff --git a/content/using-input-fields/images/inputs4.gif b/content/using-input-fields/images/inputs4.gif
new file mode 100644
index 0000000..d299697
Binary files /dev/null and b/content/using-input-fields/images/inputs4.gif differ
diff --git a/content/using-input-fields/images/inputs5.gif b/content/using-input-fields/images/inputs5.gif
new file mode 100644
index 0000000..9f5727b
Binary files /dev/null and b/content/using-input-fields/images/inputs5.gif differ
diff --git a/content/using-input-fields/images/starter1.gif b/content/using-input-fields/images/starter1.gif
new file mode 100644
index 0000000..d06426a
Binary files /dev/null and b/content/using-input-fields/images/starter1.gif differ
diff --git a/content/using-input-fields/images/ui-bug.gif b/content/using-input-fields/images/ui-bug.gif
new file mode 100644
index 0000000..38927f6
Binary files /dev/null and b/content/using-input-fields/images/ui-bug.gif differ