diff --git a/.gitignore b/.gitignore
index 21db16fd5eeb30cef1541527c9e29107172c3227..c52abc7fd1e95a4776f836b9081e3d5c0fc984ce 100644
--- a/.gitignore
+++ b/.gitignore
@@ -22,4 +22,4 @@ profiles.clj
 /node_modules/
 /.babel_cache
 /coverage
-/resources/sample-dataset-*
+/resources/sample-dataset*
diff --git a/build-uberjar b/build-uberjar
new file mode 100755
index 0000000000000000000000000000000000000000..9e267e521c74835e4c7bb6bb56a1dcc2883f3a45
--- /dev/null
+++ b/build-uberjar
@@ -0,0 +1,17 @@
+#! /bin/bash
+
+echo "Running 'npm install' to download javascript dependencies..." &&
+npm install &&
+
+echo "Running 'webpack -p' to assemble and minify frontend assets..." &&
+if [ -n "$CI_DISABLE_WEBPACK_MINIFICATION" ]; then
+    ./node_modules/webpack/bin/webpack.js
+else
+    ./node_modules/webpack/bin/webpack.js -p
+fi &&
+
+echo "Running 'lein generate-sample-dataset' to generate the sample dataset..." &&
+lein generate-sample-dataset &&
+
+echo "Running 'lein uberjar'..." &&
+lein uberjar
diff --git a/circle.yml b/circle.yml
index e17af33efb46cc0e85583b2c12d58477198c32dc..c985021f950dcc6681417de5a09fd7d644474434 100644
--- a/circle.yml
+++ b/circle.yml
@@ -11,6 +11,6 @@ test:
     # 2) runs Eastwood linter
     # 3) Bikeshed linter
     # 4) runs JS linter + JS test
-    # 5) runs lein uberjar
-    - case $CIRCLE_NODE_INDEX in 0) MB_TEST_DATASETS=h2,mongo,postgres lein test ;; 1) MB_DB_TYPE=postgres MB_DB_DBNAME=circle_test MB_DB_PORT=5432 MB_DB_USER=ubuntu MB_DB_HOST=localhost lein test ;; 2) lein eastwood ;; 3) lein bikeshed --max-line-length 240 ;; 4) npm run lint && npm run build && npm run test ;; 5) CI_DISABLE_WEBPACK_MINIFICATION=1 lein uberjar ;; esac:
+    # 5) runs ./build-uberjar
+    - case $CIRCLE_NODE_INDEX in 0) MB_TEST_DATASETS=h2,mongo,postgres lein test ;; 1) MB_DB_TYPE=postgres MB_DB_DBNAME=circle_test MB_DB_PORT=5432 MB_DB_USER=ubuntu MB_DB_HOST=localhost lein test ;; 2) lein eastwood ;; 3) lein bikeshed --max-line-length 240 ;; 4) npm run lint && npm run build && npm run test ;; 5) CI_DISABLE_WEBPACK_MINIFICATION=1 ./build-uberjar ;; esac:
         parallel: true
diff --git a/docs/DEVELOPERS.md b/docs/DEVELOPERS.md
index 119adc41e959ad4196aa6774230376a895654c51..9a8c039f4e8f77db6fbc4381a7ba23b5d9bf8869 100644
--- a/docs/DEVELOPERS.md
+++ b/docs/DEVELOPERS.md
@@ -36,7 +36,7 @@ Then run the HTTP server with
 
 Check that the project can compile successfully with
 
-    lein uberjar
+    ./build-uberjar
 
 Run the linters with
 
diff --git a/lein_tasks/leiningen/npm.clj b/lein_tasks/leiningen/npm.clj
deleted file mode 100644
index 79f9e4d93bda5b699dc5ec61c851010292c2835e..0000000000000000000000000000000000000000
--- a/lein_tasks/leiningen/npm.clj
+++ /dev/null
@@ -1,11 +0,0 @@
-(ns leiningen.npm
-  (:use clojure.java.shell))
-
-
-(defn npm [projects & args]
-  ;; TODO - some better validations such as checking if `npm` is available
-  (println "Running `npm install` to download javascript dependencies")
-  (let [result (sh "npm" "install")]
-    (if (= 0 (:exit result))
-      (println (:out result))
-      (println (:err result)))))
\ No newline at end of file
diff --git a/lein_tasks/leiningen/webpack.clj b/lein_tasks/leiningen/webpack.clj
deleted file mode 100644
index 3bc9aa3314de60dd2cdd5542ac402d34b4591cb2..0000000000000000000000000000000000000000
--- a/lein_tasks/leiningen/webpack.clj
+++ /dev/null
@@ -1,12 +0,0 @@
-(ns leiningen.webpack
-  (:require [clojure.java.shell :refer :all]))
-
-;; Set the CI_DISABLE_WEBPACK_MINIFICATION environment variable to skip minification which takes ~6+ minutes on CircleCI
-(defn webpack [projects & args]
-  ;; TODO - some better validations such as checking that we have webpack available
-  (println "Running `webpack -p` to assemble and minify frontend assets")
-  (let [result (sh (str (:root projects) "/node_modules/webpack/bin/webpack.js") (if (System/getenv "CI_DISABLE_WEBPACK_MINIFICATION") ""
-                                                                                     "-p"))]
-    (if (= 0 (:exit result))
-      (println (:out result))
-      (println (:err result)))))
diff --git a/project.clj b/project.clj
index 18146339b7b635d321ea7f2c915f9882e24a99b2..6670e6f37b2c477fb1ad35eea300a4065688d4bd 100644
--- a/project.clj
+++ b/project.clj
@@ -90,8 +90,7 @@
                                        "-Dmb.jetty.port=3010"
                                        "-Dmb.api.key=test-api-key"
                                        "-Xverify:none"]}              ; disable bytecode verification when running tests so they start slightly faster
-             :uberjar {:aot :all
-                       :prep-tasks ^:replace ["npm" "webpack" "generate-sample-dataset" "javac" "compile"]}
+             :uberjar {:aot :all}
              :generate-sample-dataset {:dependencies [[faker "0.2.2"]                   ; Fake data generator -- port of Perl/Ruby
                                                       [incanter/incanter-core "1.5.6"]] ; Satistical functions like normal distibutions}})
                                        :source-paths ["sample_dataset"]
diff --git a/sample_dataset/metabase/sample_dataset/generate.clj b/sample_dataset/metabase/sample_dataset/generate.clj
index 5c1711e86eb352d169d9ecaeeb162d5dec581c10..ca6d777d5ba9815b112ff8856ac69175ea4f3abe 100644
--- a/sample_dataset/metabase/sample_dataset/generate.clj
+++ b/sample_dataset/metabase/sample_dataset/generate.clj
@@ -11,10 +11,8 @@
                    [db :as kdb]))
   (:import java.util.Date))
 
-(def ^:private ^:const sample-dataset-version "1.0.0")
-
 (def ^:private ^:const sample-dataset-filename
-  (str (System/getProperty "user.dir") (format "/resources/sample-dataset-%s.db" sample-dataset-version)))
+  (str (System/getProperty "user.dir") "/resources/sample-dataset.db"))
 
 (defn- normal-distribution-rand [mean median]
   (dist/draw (dist/normal-distribution mean median)))
diff --git a/src/metabase/core.clj b/src/metabase/core.clj
index f62a832ad85da1f2b265b5eb985c9edf33fab063..66c4ed1d4d4a650c9a78804b7bd1a5258b364497 100644
--- a/src/metabase/core.clj
+++ b/src/metabase/core.clj
@@ -16,6 +16,7 @@
             [medley.core :as medley]
             (metabase [config :as config]
                       [db :as db]
+                      [driver :as driver]
                       [routes :as routes]
                       [setup :as setup]
                       [task :as task])
@@ -23,6 +24,7 @@
                                  [log-api-call :refer :all]
                                  [format :refer :all])
             (metabase.models [setting :refer [defsetting]]
+                             [database :refer [Database]]
                              [user :refer [User]])))
 
 ;; ## CONFIG
@@ -134,6 +136,30 @@
     (.stop ^org.eclipse.jetty.server.Server @jetty-instance)
     (reset! jetty-instance nil)))
 
+(def ^:private ^:const sample-dataset-name "Sample Dataset")
+(def ^:private ^:const sample-dataset-filename "sample-dataset.db.mv.db")
+
+(defn- add-sample-dataset! []
+  (db/cascade-delete Database :name sample-dataset-name)
+  (when-not (db/exists? Database :name sample-dataset-name)
+    (try
+      (log/info "Loading sample dataset...")
+      (let [resource (-> (Thread/currentThread) ; hunt down the sample dataset DB file inside the current JAR
+                         .getContextClassLoader
+                         (.getResource sample-dataset-filename))]
+        (if-not resource
+          (log/error (format "Can't load sample dataset: the DB file '%s' can't be found by the ClassLoader." sample-dataset-filename))
+          (let [h2-file (-> (.getPath resource)
+                            (s/replace #"^file:" "zip:")         ; to connect to an H2 DB inside a JAR just replace file: with zip:
+                            (s/replace #"\.mv\.db$" "")          ; strip the .mv.db suffix from the path
+                            (str ";USER=GUEST;PASSWORD=guest"))] ; specify the GUEST user account created for the DB
+            (driver/sync-database! (db/ins Database
+                                     :name    sample-dataset-name
+                                     :details {:db h2-file}
+                                     :engine  :h2)))))
+      (catch Throwable e
+        (log/error (format "Failed to load sample dataset: %s" (.getMessage e)))))))
+
 
 (defn -main
   "Launch Metabase in standalone mode."
@@ -142,7 +168,10 @@
   (try
     ;; run our initialization process
     (init)
+    ;; add the sample dataset DB if applicable
+    (add-sample-dataset!)
     ;; launch embedded webserver
     (start-jetty)
     (catch Exception e
+      (.printStackTrace e)
       (log/error "Metabase Initialization FAILED: " (.getMessage e)))))