diff --git a/README b/README
deleted file mode 100644
index 769e6ad4..00000000
--- a/README
+++ /dev/null
@@ -1,9 +0,0 @@
-Genoverse is a portable, customizable, back-end independent JavaScript and HTML5 based genome browser which allows the user to explore data in a dynamic and interactive manner.
-
-Data is visualized in the browser, meaning Genoverse can be installed on any website and show data from a wide range of online or local sources.
-
-Genoverse works with a variety of formats, such as XML, JSON, BED, VCF, GFF, GFF3 or delimited text files, and can be customized to parse and display any data source as required.
-
-More information coming soon. If you have any questions, please contact info@genoverse.org
-
-Example: http://genoverse.org
diff --git a/README.md b/README.md
new file mode 100644
index 00000000..34ba9347
--- /dev/null
+++ b/README.md
@@ -0,0 +1,48 @@
+# Genoverse
+
+Genoverse is a portable, customizable, back-end independent JavaScript and HTML5 based genome browser which allows the user to explore data in a dynamic and interactive manner.
+
+Data is visualized in the browser, meaning Genoverse can be installed on any website and show data from a wide range of online or local sources.
+
+Genoverse works with a variety of formats, such as JSON, BED, BAM, VCF, GFF, delimited text files, or XML, and can be customized to parse and display any data source as required.
+
+Genoverse works using a system of [**tracks**](docs/tracks.md) - essentially horizontal sections of the genome browser which display **features** - genes, variants, etc. with defined genomic start and end points. Each track has its own data set stored in a **model**, a method for displaying that data, stored in a **view**, and a **controller** to manage the creation of DOM elements, and user interactions with them.
+
+Tracks can have multiple models and views, which allows for switching between displays at different zoom levels. An example of this would be a track where you show genes when looking at a large region of a chromosome, and then switch to showing transcripts as the user zooms in.
+
+In addition to this, Genoverse has a set of [plugins](docs/plugins.md), which allow additional functionality beyond the core genome browser. These include a control panel for adding and removing tracks, and interacting with the browser more easily, a way to add controls to each individual track, and a way to enable drag and drop of local data files onto the genome browser.
+
+## Installation
+
+1. Download the latest version from GitHub
+ ```
+ git clone git@github.com:wtsi-web/Genoverse.git
+ ```
+
+2. Embed Genoverse using either
+ ```html
+
+ ```
+
+ which comes with jQuery and jQuery UI included, or
+ ```html
+
+ ```
+
+ if you already have them in the page
+
+3. Add a script tag or JavaScript file which initializes Genoverse, e.g.
+ ```html
+
+ ```
+ See [index.html](/index.html) for example configuration, or the [documentation](docs/configuration.md) for more details about configuration properties.
+
+Once initalized, the instance of Genoverse is avaliable as a jQuery data attribute on the container DOM element, and can be accessed by
+```javascript
+var genoverse = $(container).data('genoverse');
+```
+
diff --git a/docs/api.md b/docs/api.md
new file mode 100644
index 00000000..7b94f47e
--- /dev/null
+++ b/docs/api.md
@@ -0,0 +1,168 @@
+# API
+
+The following are methods that can be called on an instance of Genoverse or Genoverse.Track to perform actions required by UI changes external to the instance (i.e. from the website you have integrated Genoverse into).
+
+## Genoverse API
+
+#### genoverse.addTracks(tracks [, after ])
+> Add a number of tracks to the genome browser
+>
+> Argument | Type | Description
+> --- | --- | ---
+> tracks | Array | An array of `Genoverse.Track` class definitions to be added
+> after | Integer or undefined | The existing track after which the new tracks will be inserted. For example, if the existing tracks are `[ A, B, C, D, E ]`, `genoverse.addTracks([ X, Y ], 2)` will result in `[ A, B, X, Y, C, D, E ]`. If `undefined` , the tracks will be inserted after the existing tracks.
+
+#### genoverse.addTrack(track [, after ])
+> Add a single track to the genome browser
+>
+> Argument | Type | Description
+> --- | --- | ---
+> track | `Genoverse.Track` class | A `Genoverse.Track` class definition to be added
+> after | Integer or undefined | See `genoverse.addTracks`
+
+#### genoverse.removeTracks(tracks)
+> Remove a number of tracks from the genome browser
+>
+> Argument | Type | Description
+> --- | --- | ---
+> tracks | Array | An array of existing `Genoverse.Track` instances to be removed
+
+#### genoverse.removeTrack(track)
+> Remove a single track from the genome browser
+>
+> Argument | Type | Description
+> --- | --- | ---
+> track | `Genoverse.Track` instance | An existing `Genoverse.Track` instance to be removed
+
+#### genoverse.addHighlights(highlights)
+> Add a number of highlighted regions to the genome browser
+>
+> Argument | Type | Description
+> --- | --- | ---
+> tracks | Array | An array of highlighted regions to be added. See [configuration](configuration.md#highlights-default-) for the structure of highlights.
+
+#### genoverse.addHighlight(highlight)
+> Add a single highlighted regions to the genome browser
+>
+> Argument | Type | Description
+> --- | --- | ---
+> highlight | Object | A highlighted region to be added. See [configuration](configuration.md#highlights-default-) for the structure of highlights.
+
+#### genoverse.moveTo(chr, start, end [, update] [, keepLength])
+> Moves the viewpoint to the region between `start` and `end`
+>
+> Argument | Type | Description
+> --- | --- | ---
+> chr | String or undefined | The name of a chromosome defined by `genoverse.genome`. If `genoverse.genome` is undefined, `chr` must be undefined, or the current value of `genoverse.chr`.
+> start | Integer | A number between `1` and `genoverse.chromosomeSize`
+> end | Integer | A number between `start` and `genoverse.chromosomeSize`
+> update | Boolean or undefined | If `true`, the URL will be updated with the new `start` and `end`
+> keepLength | Boolean or undefined | if `true`, the new viewpoint will have the same zoom level as before (`end - start` remains unchanged), centered on the given `start` and `end`.
+
+#### genoverse.setWidth(width)
+> Resizes the `container` element for the instance of Genoverse
+>
+> Argument | Type | Description
+> --- | --- | ---
+> width | Integer | The width to resize to, in pixel
+
+#### genoverse.setDragAction(action)
+> Sets [`genoverse.dragAction`](/docs/configuration.md#dragaction-default-scroll), determining whether a drag (mousedown, mousemove, mouseup) results in the browser region moving, a region being selected, or nothing
+>
+> Argument | Type | Description
+> --- | --- | ---
+> action | `"select"`, `"scroll"`, or `"off"` | The value which `genoverse.dragAction` will be set to
+
+#### genoverse.setWheelAction(action)
+> Sets [`genoverse.wheelAction`](/docs/configuration.md#wheelaction-default-off), determining whether a mousewheel scroll zooms the browser in and out, or does nothing
+>
+> Argument | Type | Description
+> --- | --- | ---
+> action | `"zoom"` or `"off"` | The value which `genoverse.wheelAction` will be set to
+
+#### genoverse.closeMenus([ track ])
+> If `track` is a Genoverse.Track instance, closes (hides) all popup menus for that track.
+> If `track` is `undefined`, closes all popup menus.
+>
+> Argument | Type | Description
+> --- | --- | ---
+> track | Genoverse.Track instance or undefined | The object whose popup menus will be closed
+
+#### genoverse.on(events, [, onTracks ], callback)
+> Execute functions before or after Genoverse or Genoverse.Track functions
+>
+> Argument | Type | Description
+> --- | --- | ---
+> events | String | One or more space-separated events. Events are function names with an uppercase first letter, appended to "before" or "after", e.g. "beforeAddTrack" or "afterSetWidth".
+> onTracks | `"tracks"` or `Genoverse.Track` instance | If present, the callback will be executed on any track in the genome browser. *Note that providing a specific track instance does not mean the callback will be executed only for that track.* If omitted (i.e. `genoverse.on(events, callback)`, the callback will be executed on the instance of Genoverse.
+> callback | Function | The function to be executed for all of the space-separated events
+
+#### genoverse.on(events [, onTracks ])
+> Execute functions before or after Genoverse or Genoverse.Track functions
+>
+> Argument | Type | Description
+> --- | --- | ---
+> events | Object | An object whose keys are one or more space-separated events (see above), and whose values are the functions to be executed for those events
+> onTracks | `"tracks"` or `Genoverse.Track` instance | See above
+
+#### genoverse.once(events, [, onTracks ], callback)
+> Like [`genoverse.on`](#genoverseonevents--ontracks--callback), but the functions will only be called one time
+
+#### genoverse.once(events, [, onTracks ])
+> Like [`genoverse.on`](#genoverseonevents--ontracks-), but the functions will only be called one time
+
+#### genoverse.reset()
+> Removes all existing data visualizations, and recreates them
+
+#### genoverse.resetTrackHeights()
+> Sets all track heights to their initial values
+
+#### genoverse.destroy()
+> Removes the instance of Genoverse from the web page
+
+## Genoverse.Track API
+
+#### track.prop(key [, value ])
+> Get or set a property on the track or it's model, view or controller, without needing to know specifically which of these objects the property belongs to. Also available on `track.model`, `track.view`, and `track.controller` with identical functionality.
+>
+> Argument | Type | Description
+> --- | --- | ---
+> key | String | The name of the property to be returned.
+> value | Anything | If defined, the value of the property will be set to this argument. If `null`, the property will be removed from its object.
+
+#### track.setConfig(type, name)
+> Set the track's [configuration](/docs/tracks/configuration.md#changing-track-settings) after initalization
+>
+> Argument | Type | Description
+> --- | --- | ---
+> type | String | One of the keys in `track.configSettings`
+> name | String | One of the keys in `track.configSettings[type]`
+
+#### track.setConfig(config)
+> Set the track's [configuration](/docs/tracks/configuration.md#changing-track-settings) after initalization
+>
+> Argument | Type | Description
+> --- | --- | ---
+> config | Object | An object in the form `{ type1: "name1", type2, "name2" }`, where each `type` and `name` fulfills the criteria of `track.setConfig(type, name)`, above
+
+#### track.remove()
+> Remove the track from the genome browser
+
+#### track.disable()
+> Hide the track in the genome browser, without removing it
+
+#### track.enable()
+> Show the track in the genome browser, if it had previously been disabled
+
+#### track.reset()
+> Clears all data stored by the track's models and views, removes the images that have been drawn by the track so far, and then requests new data, and creates new images for the current location in the genome browser
+
+#### track.resetHeight()
+> Sets the track's height to its initial value
+
+#### track.updateName(name)
+> Changes the name of the track, as displayed in the label to the left of its images.
+>
+> Argument | Type | Description
+> --- | --- | ---
+> name | String | The name for the track.
diff --git a/docs/configuration.md b/docs/configuration.md
new file mode 100644
index 00000000..13e0c90f
--- /dev/null
+++ b/docs/configuration.md
@@ -0,0 +1,125 @@
+# Configuration
+
+Genoverse has a large number of configurable properties, in order to allow customization. A basic example with two tracks (a scalebar and some genes) and no plugins would be
+
+```js
+var genoverse = new Genoverse({
+ genome: 'grch38',
+ tracks: [ Genoverse.Track.Scalebar, Genoverse.Track.Gene ]
+});
+```
+
+The following properties can be provided to the constructor for Genoverse:
+
+## DOM element
+
+#### container (default `undefined`)
+> A DOM node, jQuery selector, or string to create a jQuery selector (e.g. `"#genoverse"`) inside which the instance of Genoverse will be created.
+If `undefined`, a `
` element will be appended to `document.body`.
+
+#### width (default `1000`)
+> The width that the `container` DOM element will be
+
+## Genomic coordinates
+
+#### chr (default `1`)
+> A string or number defining the initial chromosome to display
+
+#### start (default `1`)
+> A string or number defining the initial start position
+
+#### end (default `1000000`)
+> A string or number defining the initial end position
+
+#### assembly (default `undefined`)
+> A string defining the assembly, which can be used by [track URL templates](/docs/tracks/configuration.md#url-default-undefined)
+
+#### genome (default `undefined`)
+> The genome to be used. Can be:
+>
+> - an object with keys of the number/letter/name of the chromosomes, and values in the form `{ "size": 10000 }`.
+> Additionally an array of bands can be supplied for each chromosome for drawing purposes - see [js/genomes/grch38.js](https://github.com/wtsi-web/Genoverse/blob/gh-pages/js/genomes/grch38.js) for an example. These files can be created for species present in [Ensembl](http://www.ensembl.org/info/about/species.html) by modifying the example node script [utils/createGenome.js](https://github.com/wtsi-web/Genoverse/blob/gh-pages/utils/createGenome.js) for the species required.
+> - a string (e.g. `"grch38"`) which will be used to obtain a javascript file from the [js/genomes](https://github.com/wtsi-web/Genoverse/tree/gh-pages/js/genomes) directory
+> - `undefined`, in which case `chromosomeSize` **MUST** be set (see below)
+
+#### chromosomeSize (default `undefined`)
+> If `genome` not is provided, `chromosomeSize` **MUST** be set to the length of the chromosome.
+>
+> If `genome` is provided, `chromosomeSize` will be set to the chromosome's `size` property, as defined by the genome object.
+
+## What is displayed
+
+#### tracks (default `[]`)
+> An array of `Genoverse.Track` definitions to be displayed
+
+#### highlights (default `[]`)
+> An array of regions to highlight, in the form
+```
+{ "start": 100, "end", 200, "label": "My highlight", "removable": false }
+```
+> `label` defaults to "start-end" (e.g. "100-200") if not provided.
+>
+> If `removable === false`, the highlight cannot be removed.
+
+#### plugins (default `[]`)
+> An array of `Genoverse.Plugins` to be used (from the [js/plugins](https://github.com/wtsi-web/Genoverse/tree/gh-pages/js/plugins) directory), e.g.
+```
+[ "controlPanel", "trackControls" ]
+```
+> The strings in this array correspond to the namespace of each plugin, which are the same as their file names.
+
+## Interaction with the URL
+
+#### urlParamTemplate (default `"r=__CHR__:__START__-__END__"`)
+> The template used to alter the web browser's URL. Should contain placeholders for chr, start and end.
+>
+> If `false` or empty string, no changes will be made to the URL when navigation occurs.
+
+#### useHash (default `undefined`)
+> Determines how the browser's URL gets updated on navigation. Can be:
+>
+> - `true` - use `window.location.hash`
+> - `false` - use `window.history.pushState`
+> - `undefined` - use `window.history.pushState` if present in the browser, else use `window.location.hash`
+
+## User actions
+
+#### dragAction (default `"scroll"`)
+> The action performed when a mouse drag happens on the genome browser. Can be:
+>
+> - `"scroll"` - Move the browser left or right
+> - `"select"` - Select the region
+> - `"off"` - Do nothing
+
+#### wheelAction (default `"off"`)
+> The action performed when a mouse drag happens on the genome browser. Can be:
+>
+> - `"zoom"` - Zoom in or out
+> - `"off"` - Do nothing
+
+#### isStatic (default `false`)
+> If `true`, will stop drag, select and zoom actions occurring
+
+## Saving user configurations
+
+#### saveable (default `false`)
+> If `true`, track configuration and ordering will be saved in `window.sessionStorage`/`window.localStorage` (defined by `storageType`, below) so that users will see the same display when they refresh the page
+
+#### storageType (default `"sessionStorage"`)
+> The storage object used to save track configuration. Set to `"localStorage"` for permanence.
+>
+> See Mozilla's [sessionStorage](https://developer.mozilla.org/en-US/docs/Web/API/Window/sessionStorage) and [localStorage](https://developer.mozilla.org/en/docs/Web/API/Window/localStorage) documentation for further details.
+
+#### saveKey (default empty string)
+> The default key used in configuration storage is `"genoverse"`. `saveKey` will be appended to this to allow different configurations for different instances of Genoverse.
+
+## Default track display settings
+
+#### autoHideMessages (default `true`)
+> Determines whether to collapse track messages (toggleable pop-outs on the left side of a track's image) by default when the user interacts with the genome browser
+
+#### trackAutoHeight (default `false`)
+> Determines whether to automatically resize tracks to show all their features (can be overridden by `track.autoHeight`)
+
+#### hideEmptyTracks (default `true`)
+> Determines whether to hide an automatically resized tracks if it has no features, or to show it empty (can be overridden by `track.hideEmpty`)
diff --git a/docs/functions.md b/docs/functions.md
new file mode 100644
index 00000000..78e0d688
--- /dev/null
+++ b/docs/functions.md
@@ -0,0 +1,266 @@
+# Genoverse functions
+
+The following are functions that exist in the Genoverse object. Any of these can have before/after hooks added to them, or be overwritten by supplying them as properties in configuration.
+
+## Initialization
+
+#### genoverse.init()
+> Called once the Genoverse instance is created. Sets initial properties of the instance and calls functions to creates its DOM elements, event handlers, tracks and highlights, and set the starting location.
+
+#### genoverse.addDomElements(width)
+> Creates the DOM elements required by the instance of Genoverse
+>
+> Argument | Type | Description
+> --- | --- | ---
+> width | Integer | The width for the container DOM element (usually this should be the initial value of [`genoverse.width`](/docs/configuration.md#width-default-1000))
+
+#### genoverse.addUserEventHandlers()
+> Creates the event handlers required for users to interact with the instance of Genoverse
+
+## Configuration
+
+#### genoverse.loadConfig()
+> If [`genoverse.saveable`](/docs/configuration.md#saveable-default-false) is `true`, configuration will be loaded from `window[`[`genoverse.storageType`](/docs/configuration.md#storagetype-default-sessionstorage)`].getItem(`[`genoverse.saveKey`](/docs/configuration.md#savekey-default-empty-string)`)`. This configuration contains the user's previous tracks, their ordering, heights, and any other [track configuration settings](/docs/tracks/configuration.md#changing-track-settings). If no configuration exists, the default set of tracks will be used instead.
+
+#### genoverse.saveConfig()
+> If [`genoverse.saveable`](/docs/configuration.md#saveable-default-false) is `true`, the user's current tracks, their ordering, heights, and any other [track configuration settings](/docs/tracks/configuration.md#changing-track-settings) will be saved to `window[`[`genoverse.storageType`](/docs/configuration.md#storagetype-default-sessionstorage)`].getItem(`[`genoverse.saveKey`](/docs/configuration.md#savekey-default-empty-string)`)`.
+
+#### genoverse.resetConfig()
+> If [`genoverse.saveable`](/docs/configuration.md#saveable-default-false) is `true`, removes all tracks and unremovable highlights, adds the default set of tracks, and removes the value in [`genoverse.saveKey`](/docs/configuration.md#savekey-default-empty-string) from `window[`[`genoverse.storageType`](/docs/configuration.md#storagetype-default-sessionstorage)`]`.
+
+## Changing browser location
+
+#### genoverse.moveTo(chr, start, end [, update] [, keepLength])
+> See the [api documentation](/docs/api.md#genoversemovetochr-start-end--update--keeplength)
+
+#### genoverse.move(delta)
+> Move the browser region a number of pixels left or right. This will be translated into a new chromosomal location based on the current value of `genoverse.scale` (width of the browser's containing DOM element in pixels / size of genomic region being viewed).
+>
+> **Note:** [`genoverse.moveTo`](/docs/api.md#genoversemovetochr-start-end--update--keeplength) should be used instead to change the location of a Genoverse instance externally.
+>
+> Argument | Type | Description
+> --- | --- | ---
+> delta | Integer | The number of pixels to move the browser region by (> 1 for left to right, < 1 for right to left)
+
+#### genoverse.setRange(start, end [, update] [, keepLength])
+> Sets [`genoverse.start`](/docs/configuration.md#start-default-1) and [`genoverse.end`](/docs/configuration.md#end-default-1000000), moving the browser region in the process.
+>
+> **Note:** [`genoverse.moveTo`](/docs/api.md#genoversemovetochr-start-end--update--keeplength) should be used instead to change the location of a Genoverse instance externally.
+>
+> Argument | Type | Description
+> --- | --- | ---
+> start | Integer | A number between `1` and [`genoverse.chromosomeSize`](/docs/configuration.md#chromosomesize-default-undefined)
+> end | Integer | A number between `start` and [`genoverse.chromosomeSize`](/docs/configuration.md#chromosomesize-default-undefined)
+> update | Boolean or undefined | If `true`, the URL will be updated with the new `start` and `end`
+> keepLength | Boolean or undefined | if `true`, the new viewpoint will have the same zoom level as before (`end - start` remains unchanged), centered on the given `start` and `end`.
+
+#### genoverse.setScale()
+> Sets `genoverse.scale` to (width of the browser's containing DOM element in pixels / size of genomic region being viewed). If the scale changes, forces all tracks to draw new images at the new scale.
+
+## Track interactions
+
+#### genoverse.addTracks
+> See the [api documentation](/docs/api.md#genoverseaddtrackstracks--after-)
+
+#### genoverse.addTrack
+> See the [api documentation](/docs/api.md#genoverseaddtracktrack--after-)
+
+#### genoverse.removeTracks
+> See the [api documentation](/docs/api.md#genoverseremovetrackstracks)
+
+#### genoverse.removeTrack
+> See the [api documentation](/docs/api.md#genoverseremovetracktrack)
+
+#### genoverse.updateTrackOrder(e, ui)
+> Called when a user moves track labels to reorder tracks in the browser. Set the moved track's `order` property such that it is between the `order` properties of its new immediate siblings. [`genoverse.sortTracks`](#genoversesorttracks) is then called to update the position of the track's image element.
+>
+> See [jQuery UI sortable update event](http://api.jqueryui.com/sortable/#event-update) for argument details.
+
+#### genoverse.sortTracks
+> Reorders the tracks' DOM elements based on each track's `order` property, lowest first.
+
+## Highlight interactions
+
+#### genoverse.addHighlights(highlights)
+> See the [api documentation](/docs/api.md#genoverseaddhighlightshighlights)
+
+#### genoverse.addHighlight(highlight)
+> See the [api documentation](/docs/api.md#genoverseaddhighlighthighlight)
+
+## URL interactions
+
+#### genoverse.updateURL
+> If [`genoverse.urlParamTemplate`](/docs/configuration.md#urlparamtemplate-default-r__chr____start__-__end__) is set, the URL will be updated to reflect the current browser region. This will be done either by using [`window.history.pushState`](https://developer.mozilla.org/en-US/docs/Web/API/History_API#The_pushState()_method), or by updating `window.location.hash`, depending on the value of [`genoverse.useHash`](/docs/configuration.md#usehash-default-undefined).
+
+#### genoverse.popState
+> Called by [`window.onpopstate`](https://developer.mozilla.org/en-US/docs/Web/API/WindowEventHandlers/onpopstate) or [`window.onhashchange`](https://developer.mozilla.org/en/docs/Web/API/WindowEventHandlers/onhashchange) to update the browser region if the user uses the back or forward buttons in their web browser.
+
+#### genoverse.getURLCoords
+> Returns an object in the form `{ "chr": "1", "start": 123, "end": 456 }` by parsing the URL using the value of [`genoverse.urlParamTemplate`](/docs/configuration.md#urlparamtemplate-default-r__chr____start__-__end__)
+
+#### genoverse.getQueryString
+> Returns a string of [`genoverse.urlParamTemplate`](/docs/configuration.md#urlparamtemplate-default-r__chr____start__-__end__) with the placeholders replaced with their relevant values, to be used in updating the URL. If [`genoverse.useHash`](/docs/configuration.md#usehash-default-undefined) is `false`, this will be appended to any existing value of `window.location.search` such that other parameters are unchanged.
+
+## Popup menus
+
+#### genoverse.makeMenu(features [, event, track ])
+> Creates a popup menu for one or more features. If more than one feature is provided, the popup will contain one link per feature which each create another popup for that feature
+>
+> Argument | Type | Description
+> --- | --- | ---
+> features | Feature object or array of feature objects | The feature(s) to make the menu for
+> event | [jQuery event](http://api.jquery.com/category/events/) or undefined | The click event that created the menu, used to position the menu at the mouse pointer
+> track | Genoverse.Track or undefined | The track which was clicked on
+
+#### genoverse.makeFeatureMenu(features [, event, track ])
+> Called by [`genoverse.makeMenu`](#genoversemakemenufeatures--event-track-) to create a popup menu for a single feature
+>
+> Argument | Type | Description
+> --- | --- | ---
+> feature | Feature object | The feature to make the menu for
+> event | [jQuery event](http://api.jquery.com/category/events/) or undefined | The click event that created the menu, used to position the menu at the mouse pointer
+> track | Genoverse.Track instance or undefined | The track which was clicked on
+
+#### genoverse.closeMenus([ track ])
+> See the [api documentation](/docs/api.md#genoverseclosemenus-track-)
+
+## User events
+
+#### genoverse.setDragAction(action)
+> See the [api documentation](/docs/api.md#genoversesetdragactionaction)
+
+#### genoverse.setWheelAction(action)
+> See the [api documentation](/docs/api.md#genoversesetwheelactionaction)
+
+#### genoverse.startDragScroll(e)
+> Initializes a scroll action
+>
+> Argument | Type | Description
+> --- | --- | ---
+> e | [jQuery event](http://api.jquery.com/category/events/) | The user event which starts a scroll operation
+
+#### genoverse.stopDragScroll([ update ])
+> Ends a scroll action
+>
+> Argument | Type | Description
+> --- | --- | ---
+> update | Boolean or undefined | If not `false`, will update the URL to the new location (providing the URL is changeable by the instance of Genoverse)
+
+#### genoverse.startDragSelect(e)
+> Initializes a select action
+>
+> Argument | Type | Description
+> --- | --- | ---
+> e | [jQuery event](http://api.jquery.com/category/events/) | The user event which starts a select operation
+
+#### genoverse.stopDragSelect(e)
+> Ends a select action, showing an actions menu for the selected region
+>
+> Argument | Type | Description
+> --- | --- | ---
+> e | [jQuery event](http://api.jquery.com/category/events/) | The user event which ends a select operation
+
+#### genoverse.cancelSelect()
+> Hides the region selection element
+
+#### genoverse.dragSelect(e)
+> Resizes the region selection element based on a mousemove event
+>
+> Argument | Type | Description
+> --- | --- | ---
+> e | [jQuery event](http://api.jquery.com/category/events/) | The mousemove event
+
+#### genoverse.keydown(e)
+> If the shift key is pressed, region selection is enabled while it is held down (nothing happens if [`genoverse.dragAction`](/docs/configuration.md#dragaction-default-scroll) was already `"select"`). If the escape key is pressed, any popup menus (for track features or the region select menu) are hidden.
+>
+> Argument | Type | Description
+> --- | --- | ---
+> e | [jQuery event](http://api.jquery.com/category/events/) | The keydown event
+
+#### genoverse.keyup(e)
+> If the shift key is released, region selection is disabled if it was enabled by pressing the key initially (nothing happens if [`genoverse.dragAction`](/docs/configuration.md#dragaction-default-scroll) was already `"select"`).
+>
+> Argument | Type | Description
+> --- | --- | ---
+> e | [jQuery event](http://api.jquery.com/category/events/) | The keyup event
+
+#### genoverse.mousedown(e)
+> Starts a scroll or select action by calling [`genoverse.startDragScroll(e)`](#genoversestartdragscrolle) or [`genoverse.startDragSelect(e)`](#genoversestartdragselecte), based on the value of [`genoverse.dragAction`](/docs/configuration.md#dragaction-default-scroll)
+>
+> Argument | Type | Description
+> --- | --- | ---
+> e | [jQuery event](http://api.jquery.com/category/events/) | The mousedown event
+
+#### genoverse.mouseup(e)
+> Ends the current scroll or select action by calling [`genoverse.stopDragScroll(update)`](#genoversestopdragscroll-update-) or [`genoverse.stopDragSelect(e)`](#genoversestopdragselecte), as applicable
+>
+> Argument | Type | Description
+> --- | --- | ---
+> e | [jQuery event](http://api.jquery.com/category/events/) | The mouseup event
+
+#### genoverse.mousemove(e)
+> If a scroll action is taking place, moves the browser region as the mouse moves.
+> If a region select is taking place, changes the size of the selected region as the mouse moves.
+> If [`genoverse.dragAction`](/docs/configuration.md#dragaction-default-scroll) is `"select"` and a region select is not taking place, moves the region select element (a dotted red vertical line) to the location of the mouse pointer.
+>
+> Argument | Type | Description
+> --- | --- | ---
+> e | [jQuery event](http://api.jquery.com/category/events/) | The mousemove event
+
+#### genoverse.mousewheelZoom(e, delta)
+> Performs zoom in and zoom out operations
+>
+> Argument | Type | Description
+> --- | --- | ---
+> e | [jQuery event](http://api.jquery.com/category/events/) | The user event which will cause a zoom operation
+> delta | `1` or `-1` | `1` for zoom in, `-1` for zoom out
+
+#### genoverse.zoomIn([ x ])
+> Calls [`genoverse.setRange`](#genoversesetrangestart-end--update--keeplength) to zoom in, halving the size of the browser region (e.g. 100-200 becomes 125-175). If an `x` argument is provided, the zoom will step towards that point, instead of directly inward. `x`is the difference between the x coordinate of a mousewheel zoom event and the left offset of the browser images on the page.
+>
+> Argument | Type | Description
+> --- | --- | ---
+> x | Integer or undefined | The point to zoom towards
+
+#### genoverse.zoomOut([ x ])
+> Calls [`genoverse.setRange`](#genoversesetrangestart-end--update--keeplength) to zoom out, doubling the size of the browser region (e.g. 100-200 becomes 50-250). If an `x` argument is provided, the zoom will step towards that point, instead of directly outward. `x`is the difference between the x coordinate of a mousewheel zoom event and the left offset of the browser images on the page.
+>
+> Argument | Type | Description
+> --- | --- | ---
+> x | Integer or undefined | The point to zoom towards
+
+## Misc
+
+#### genoverse.on()
+> See the [api documentation](/docs/api.md#genoverseonevents--ontracks--callback)
+
+#### genoverse.once()
+> See the [api documentation](/docs/api.md#genoverseonceevents--ontracks--callback)
+
+#### genoverse.reset()
+> See the [api documentation](/docs/api.md#genoversereset)
+
+#### genoverse.destroy()
+> See the [api documentation](/docs/api.md#genoversedestroy)
+
+#### genoverse.setWidth(width)
+> See the [api documentation](/docs/api.md#genoversesetwidthwidth)
+
+#### genoverse.getChromosomeSize(chr)
+> If [`genoverse.genome`](/docs/configuration.md#genome-default-undefined) is an object, returns the size of the chromosome in the genome, else returns [`genoverse.chromosomeSize`](/docs/configuration.md#chromosomesize-default-undefined)
+>
+> Argument | Type | Description
+> --- | --- | ---
+> chr | String | The name of the chromosome
+
+#### genoverse.getSelectorPosition()
+> Returns an object in the form `{ "start": 1, "end": 2, "left": 1, "width", 1 }` representing the position of the region selector DOM element.
+> `start` and `end` are the genomic coordinates selected by the region, `left` and `width` are the CSS positional values of the element.
+
+#### genoverse.onTracks(functionName [, arg1, arg2, ...argN ])
+> Calls the function `functionName` on all tracks in the instance of Genoverse, with the arguments provided
+>
+> Argument | Type | Description
+> --- | --- | ---
+> functionName | String | The name of the function to call. This function can be in `Genoverse.Track`, `Genoverse.Track.Controller`, `Genoverse.Track.Model`, or `Genoverse.Track.View`
+> args | Anything | A list of arguments to be passed to the function being called
diff --git a/docs/plugins.md b/docs/plugins.md
new file mode 100644
index 00000000..009fd15a
--- /dev/null
+++ b/docs/plugins.md
@@ -0,0 +1,34 @@
+# Plugins
+
+Genoverse browser provides constitutive core functionality. `Genoverse.Plugins` namespace contains a set of optional, additional pieces of functionality - plugins - some projects may need and others might not.
+
+Genoverse can asynchronously load plugins from its [js/plugins](https://github.com/wtsi-web/Genoverse/tree/gh-pages/js/plugins) directory on your server itself. Or you may explicitly import plugins in your html with, for example, `