diff --git a/project.clj b/project.clj
index e280238..cee94af 100644
--- a/project.clj
+++ b/project.clj
@@ -8,18 +8,21 @@
              "build-signature-timestamp" "unset"
              "Implementation-Version" "unset"
              }
-  :dependencies [[org.clojure/clojure "1.6.0"]
-                 [mw-engine "0.1.5-SNAPSHOT"]
-                 [mw-parser "0.1.5-SNAPSHOT"]
-                 [lib-noir "0.8.4"]
-                 [ring-server "0.3.1"]
-                 [selmer "0.6.8"]
+  :dependencies [[org.clojure/clojure "1.8.0"]
+                 [mw-engine "3.0.0-SNAPSHOT"]
+                 [mw-parser "3.0.0-SNAPSHOT"]
+                 [lib-noir "0.9.9"]
+                 [ring-server "0.4.0"]
+                 [selmer "1.0.9"]
                  [com.taoensso/timbre "3.2.1"]
-                 [com.taoensso/tower "2.0.2"]
-                 [markdown-clj "0.9.44"]
-                 [environ "0.5.0"]
-                 [noir-exception "0.2.2"]]
+                 [com.taoensso/tower "3.0.2"]
+                 [markdown-clj "0.9.89"]
+                 [environ "1.1.0"]
+                 [noir-exception "0.2.5"]]
 
+  :source-paths ["src/clj" "src/cljc"]
+  :license {:name "GNU General Public License v2"
+            :url "http://www.gnu.org/licenses/gpl-2.0.html"}
   :repl-options {:init-ns mw-ui.repl}
   :plugins [[lein-ring "0.8.11"]
             [lein-environ "0.5.0"]
@@ -37,8 +40,8 @@
                        :stacktraces?  false
                        :auto-reload?  false}}
    :dev {:dependencies [[ring-mock "0.1.5"]
-                        [ring/ring-devel "1.3.0"]
-                        [pjstadig/humane-test-output "0.6.0"]]
+                        [ring/ring-devel "1.5.0"]
+                        [pjstadig/humane-test-output "0.8.1"]]
          :injections [(require 'pjstadig.humane-test-output)
                       (pjstadig.humane-test-output/activate!)]
          :env {:dev true}}}
diff --git a/resources/public/css/standard.css b/resources/public/css/standard.css
index 131a881..62f3189 100644
--- a/resources/public/css/standard.css
+++ b/resources/public/css/standard.css
@@ -6,7 +6,7 @@ body {
 /* Overall container div, holds all content of page. Yes, I know it shouldn't have fixed width */
 #main-container{
   clear: both;
-/*  width:100%; */
+  width:100%;
 }
 
 /* footer of the document */
@@ -145,4 +145,3 @@ th, td {
 	text-align: left;
 	padding: 0 0.25em;
 }
-
diff --git a/resources/templates/base.html b/resources/templates/base.html
index 2be5573..46fe376 100644
--- a/resources/templates/base.html
+++ b/resources/templates/base.html
@@ -3,11 +3,7 @@
   <head>
     <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
     <title>{{title}}</title>
-    <link href="{{servlet-context}}/css/phone.css" media="only screen and (max-device-width: 480px)" rel="stylesheet" type="text/css" />
-    <link href="{{servlet-context}}/css/tablet.css" media="only screen and (min-device-width: 481px) and (max-device-width: 1024px)" rel="stylesheet" type="text/css" />
     <link href="{{servlet-context}}/css/standard.css" media="screen and (min-device-width: 1025px)" rel="stylesheet" type="text/css" />
-    <link href="{{servlet-context}}/css/print.css" media="print" rel="stylesheet" type="text/css" />
-    <link href="{{servlet-context}}/css/states.css" rel="stylesheet" type="text/css" />
         {% script "/lib/jquery-1.9.0.js" %}
         {% script "/lib/jquery.validate.min.js" %}
         {% script "/lib/script.js" %}
diff --git a/resources/templates/inspector.html b/resources/templates/inspector.html
index 7ba60b3..35441df 100644
--- a/resources/templates/inspector.html
+++ b/resources/templates/inspector.html
@@ -4,6 +4,7 @@
 	{{content|safe}}
 	</div>
 	<form action="inspect" method="post">
+    {% csrf-field %}
 		<input type="hidden" name="x" value="{{x}}"/>
 		<input type="hidden" name="y" value="{{y}}"/>
 		<p class="widget">
diff --git a/resources/templates/params.html b/resources/templates/params.html
index f0e13cb..c872da8 100644
--- a/resources/templates/params.html
+++ b/resources/templates/params.html
@@ -1,6 +1,7 @@
 {% extends "templates/base.html" %}
 {% block content %}
 <form action="{{servlet-context}}/params" method="POST">
+  {% csrf-field %}
 	<p class="widget">
 		<label for="ruleset">The rule set to use</label>
 		<select name="ruleset">
@@ -34,4 +35,4 @@
 	</p>
 </form>
 
-{% endblock %}
\ No newline at end of file
+{% endblock %}
diff --git a/src/mw_ui/handler.clj b/src/clj/mw_ui/handler.clj
similarity index 100%
rename from src/mw_ui/handler.clj
rename to src/clj/mw_ui/handler.clj
diff --git a/src/mw_ui/layout.clj b/src/clj/mw_ui/layout.clj
similarity index 93%
rename from src/mw_ui/layout.clj
rename to src/clj/mw_ui/layout.clj
index 9861426..3754943 100644
--- a/src/mw_ui/layout.clj
+++ b/src/clj/mw_ui/layout.clj
@@ -4,6 +4,7 @@
   (:require [selmer.parser :as parser]
             [clojure.string :as s]
             [ring.util.response :refer [content-type response]]
+            [ring.util.anti-forgery :refer [anti-forgery-field]]
             [compojure.response :refer [Renderable]]))
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@@ -32,6 +33,7 @@
 
 (def template-path "templates/")
 
+(parser/add-tag! :csrf-field (fn [_ _] (anti-forgery-field)))
 
 (deftype RenderableTemplate [template params]
   Renderable
diff --git a/src/mw_ui/middleware.clj b/src/clj/mw_ui/middleware.clj
similarity index 100%
rename from src/mw_ui/middleware.clj
rename to src/clj/mw_ui/middleware.clj
diff --git a/src/mw_ui/render_world.clj b/src/clj/mw_ui/render_world.clj
similarity index 90%
rename from src/mw_ui/render_world.clj
rename to src/clj/mw_ui/render_world.clj
index 2d91180..df7eb2b 100644
--- a/src/mw_ui/render_world.clj
+++ b/src/clj/mw_ui/render_world.clj
@@ -2,10 +2,10 @@
       :author "Simon Brooke"}
   mw-ui.render-world
   (:require [clojure.java.io :as jio]
-            [mw-engine.core :as engine]
-            [mw-engine.world :as world]
-            [mw-engine.heightmap :as heightmap]
-            [mw-parser.bulk :as compiler]
+            [microworld.engine.core :as engine]
+            [microworld.engine.world :as world]
+            [microworld.engine.heightmap :as heightmap]
+            [microworld.parser.bulk :as compiler]
             [hiccup.core :refer [html]]
             [noir.io :as io]
             [noir.session :as session]))
@@ -70,12 +70,11 @@
   "Render the world implied by the current session as a complete HTML table in a DIV."
   []
   (let [world (or (session/get :world)
-                  (heightmap/apply-heightmap
-                      (io/get-resource "/img/heightmaps/small_hill.png")))
+                  (heightmap/apply-heightmap "public/img/heightmaps/small_hill.png"))
         rules (or (session/get :rules)
                   (do (session/put! :rules
                                     (compiler/compile-file
-                                      (io/get-resource "/rulesets/basic.txt")))
+                                      (jio/resource "public/rulesets/basic.txt")))
                     (session/get :rules)))
         generation (inc (or (session/get :generation) 0))
         w2 (engine/transform-world world rules)
diff --git a/src/mw_ui/repl.clj b/src/clj/mw_ui/repl.clj
similarity index 100%
rename from src/mw_ui/repl.clj
rename to src/clj/mw_ui/repl.clj
diff --git a/src/mw_ui/routes/home.clj b/src/clj/mw_ui/routes/home.clj
similarity index 85%
rename from src/mw_ui/routes/home.clj
rename to src/clj/mw_ui/routes/home.clj
index efdda85..4c40b4a 100644
--- a/src/mw_ui/routes/home.clj
+++ b/src/clj/mw_ui/routes/home.clj
@@ -3,9 +3,10 @@
   mw-ui.routes.home
   (:use clojure.walk
         compojure.core)
-  (:require [clojure.pprint :only [pprint]]
+  (:require [clojure.java.io :refer [file resource]]
+            [clojure.pprint :only [pprint]]
             [hiccup.core :refer [html]]
-            [mw-engine.utils :as engine-utils]
+            [microworld.engine.utils :as engine-utils]
             [mw-ui.layout :as layout]
             [mw-ui.render-world :as world]
             [mw-ui.routes.load :as load]
@@ -45,28 +46,28 @@
   (sort
     (filter #(not (nil? %))
             (map #(first (rest (re-matches #"([0-9a-z-]+).png" (.getName %))))
-                 (file-seq (clojure.java.io/file "resources/public/img/tiles"))))))
+                 (file-seq (resource "public/img/tiles"))))))
 
 
 (defn about-page []
   (layout/render "trusted-content.html"
                  {:title "About MicroWorld"
                   :about-selected "active"
-                  :content (util/md->html "/md/about.md")
+                  :content (util/md->html "public/md/about.md")
                   :version (System/getProperty "mw-ui.version")}))
 
 (defn docs-page []
   (layout/render "docs.html" {:title "Documentation"
-                              :parser (util/md->html "/md/mw-parser.md" )
-                              :states (util/list-resources "/img/tiles" #"([0-9a-z-_]+).png")
-                              :lessons (util/list-resources "/md/lesson-plans"  #"([0-9a-z-_]+).md")
-                              :components ["mw-engine" "mw-parser" "mw-ui"]
+                              :parser (util/md->html "public/md/microworld.parser.md" )
+                              :states (util/list-resources "public/img/tiles" #"([0-9a-z-_]+).png")
+                              :lessons (util/list-resources "public/md/lesson-plans"  #"([0-9a-z-_]+).md")
+                              :components ["microworld.engine" "microworld.parser" "mw-ui"]
                               :version (System/getProperty "mw-ui.version")}))
 
 (defn home-page []
   "Render the home page."
   (layout/render "trusted-content.html" {:title "Welcome to MicroWorld"
-                              :content (util/md->html "/md/mw-ui.md")
+                              :content (util/md->html "public/md/mw-ui.md")
                               :version (System/getProperty "mw-ui.version")}))
 
 (defn inspect-page [request]
@@ -91,7 +92,7 @@
                       :x (:x cell)
                       :y (:y cell)
                       :states (util/list-resources
-                                "/img/tiles" #"([0-9a-z-_]+).png")}))))
+                                "public/img/tiles" #"([0-9a-z-_]+).png")}))))
 
 (defn md-page
   "Render the markdown page specified in this request, if any. Probably undesirable,
diff --git a/src/mw_ui/routes/load.clj b/src/clj/mw_ui/routes/load.clj
similarity index 100%
rename from src/mw_ui/routes/load.clj
rename to src/clj/mw_ui/routes/load.clj
diff --git a/src/mw_ui/routes/params.clj b/src/clj/mw_ui/routes/params.clj
similarity index 84%
rename from src/mw_ui/routes/params.clj
rename to src/clj/mw_ui/routes/params.clj
index f68fcb3..19416d7 100644
--- a/src/mw_ui/routes/params.clj
+++ b/src/clj/mw_ui/routes/params.clj
@@ -4,9 +4,10 @@
   (:use clojure.walk
         clojure.java.io
         compojure.core)
-  (:require [hiccup.core :refer [html]]
-            [mw-engine.heightmap :as heightmap]
-            [mw-parser.bulk :as compiler]
+  (:require [clojure.java.io :refer [resource]]
+            [hiccup.core :refer [html]]
+            [microworld.engine.heightmap :as heightmap]
+            [microworld.parser.bulk :as compiler]
             [mw-ui.layout :as layout]
             [mw-ui.util :as util]
             [mw-ui.render-world :as world]
@@ -39,9 +40,9 @@
 
 (defn- send-params []
   {:title "Choose your world"
-   :heightmaps (util/list-resources "/img/heightmaps" #"([0-9a-z-_]+).png")
+   :heightmaps (util/list-resources "public/img/heightmaps" #"([0-9a-z-_]+).png")
    :pause (or (session/get :pause) 5)
-   :rulesets (util/list-resources "/rulesets" #"([0-9a-z-_]+).txt")
+   :rulesets (util/list-resources "public/rulesets" #"([0-9a-z-_]+).txt")
    })
 
 
@@ -57,14 +58,14 @@
             map (:heightmap params)
             pause (:pause params)
             rulefile (:ruleset params)
-            rulepath (str "/rulesets/" rulefile ".txt")]
+            rulepath (str "public/rulesets/" rulefile ".txt")]
         (if (not= map "")
           (session/put! :world
                         (heightmap/apply-heightmap
-                          (io/get-resource (str "/img/heightmaps/" map ".png")))))
+                          (resource (str "public/img/heightmaps/" map ".png")))))
         (when (not= rulefile "")
           (session/put! :rule-text (io/slurp-resource rulepath))
-          (session/put! :rules (compiler/compile-file (io/get-resource rulepath))))
+          (session/put! :rules (compiler/compile-file (resource rulepath))))
         (if (not= pause "")
           (session/put! :pause pause))
         (layout/render "params.html"
diff --git a/src/mw_ui/routes/rules.clj b/src/clj/mw_ui/routes/rules.clj
similarity index 98%
rename from src/mw_ui/routes/rules.clj
rename to src/clj/mw_ui/routes/rules.clj
index b49a4c8..8f128aa 100644
--- a/src/mw_ui/routes/rules.clj
+++ b/src/clj/mw_ui/routes/rules.clj
@@ -4,7 +4,7 @@
   (:use clojure.walk
         compojure.core)
   (:require [hiccup.core :refer [html]]
-            [mw-parser.bulk :as compiler]
+            [microworld.parser.bulk :as compiler]
             [mw-ui.layout :as layout]
             [mw-ui.util :as util]
             [mw-ui.render-world :as world]
diff --git a/src/mw_ui/routes/save.clj b/src/clj/mw_ui/routes/save.clj
similarity index 91%
rename from src/mw_ui/routes/save.clj
rename to src/clj/mw_ui/routes/save.clj
index d75417a..41a29db 100644
--- a/src/mw_ui/routes/save.clj
+++ b/src/clj/mw_ui/routes/save.clj
@@ -1,8 +1,9 @@
 (ns ^{:doc "Route which handles the saving of world state the client."
       :author "Simon Brooke"}
   mw-ui.routes.save
-  (:require [clojure.pprint :as pretty :only [pprint]]
+  (:require [clojure.pprint :refer [pprint]]
             [noir.session :as session]
+            [ring.util.response :as response]))
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 ;;;;
@@ -35,6 +36,6 @@
    any proprietary format."
   (response/header
    (response/response
-    (with-out-str (pretty/pprint  (session/get :world))))
+    (with-out-str (pprint  (session/get :world))))
     "Content-Type" "application/journeyman-mwm; charset=utf-8"))
 
diff --git a/src/mw_ui/util.clj b/src/clj/mw_ui/util.clj
similarity index 82%
rename from src/mw_ui/util.clj
rename to src/clj/mw_ui/util.clj
index fa59383..c52aaa9 100644
--- a/src/mw_ui/util.clj
+++ b/src/clj/mw_ui/util.clj
@@ -1,9 +1,9 @@
 (ns ^{:doc "Utility functions used by other namespaces in this package."
       :author "Simon Brooke"}
   mw-ui.util
-  (:require [noir.io :as io]
+  (:require [clojure.java.io :refer [resource file]]
             [noir.session :as session]
-            [markdown.core :as md]))
+            [markdown.core :refer [md-to-html-string]]))
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 ;;;;
@@ -33,16 +33,13 @@
   "reads a markdown file from public/md and returns an HTML string"
   [filename]
   (->>
-    (io/slurp-resource filename)
-    (md/md-to-html-string)))
+    (slurp (resource filename))
+    (md-to-html-string)))
 
 
 (defn list-resources [directory pattern]
   "List resource files matching `pattern` in `directory`."
-  (let
-    [path (str (io/resource-path) directory)]
-    (session/put! :list-resources-path path)
-    (sort
-      (remove nil?
+  (sort
+    (remove nil?
             (map #(first (rest (re-matches pattern (.getName %))))
-                 (file-seq (clojure.java.io/file path)))))))
+                 (file-seq (file (resource directory)))))))