diff --git a/src/metabase/util.clj b/src/metabase/util.clj
index 689667dc69ce3a65922e55b13425c0dd4ab4f75b..870686898f7c1f05c388c675721c21a4f35cbf70 100644
--- a/src/metabase/util.clj
+++ b/src/metabase/util.clj
@@ -229,7 +229,7 @@
    Function is resolved (and its namespace required, if need be) at runtime.
    Useful for avoiding circular dependencies.
 
-    (def ^:private table->id (runtime-resolved-fn 'metabase.test-data 'table->id))
+    (def ^:private table->id (runtime-resolved-fn 'metabase.test.data 'table->id))
     (table->id :users) -> 4"
   [orig-namespace orig-fn-name]
   {:pre [(symbol? orig-namespace)
diff --git a/test/metabase/api/card_test.clj b/test/metabase/api/card_test.clj
index e480256b49853a86224e7e9f7ecd427a4b9232e0..c9ee01a21ca601909eb3da46e3533b92e0fb7974 100644
--- a/test/metabase/api/card_test.clj
+++ b/test/metabase/api/card_test.clj
@@ -5,9 +5,9 @@
             [metabase.db :refer :all]
             (metabase.models [card :refer [Card]]
                              [common :as common])
+            [metabase.test.data :refer :all]
             [metabase.test.data.users :refer :all]
-            [metabase.test.util :refer [match-$ expect-eval-actual-first random-name with-temp]]
-            [metabase.test-data :refer :all]))
+            [metabase.test.util :refer [match-$ expect-eval-actual-first random-name with-temp]]))
 
 ;; # CARD LIFECYCLE
 
diff --git a/test/metabase/api/common_test.clj b/test/metabase/api/common_test.clj
index 220f54402121a95a542b2721220ac6740c6d72ef..cba0ded0726c3232ef927b70cc5343317ec975f0 100644
--- a/test/metabase/api/common_test.clj
+++ b/test/metabase/api/common_test.clj
@@ -2,7 +2,7 @@
   (:require [expectations :refer :all]
             [metabase.api.common :refer :all]
             [metabase.api.common.internal :refer :all]
-            [metabase.test-data :refer :all]
+            [metabase.test.data :refer :all]
             [metabase.test.util :refer :all]
             [metabase.util :refer [regex= regex?]])
   (:import com.metabase.corvus.api.ApiException))
diff --git a/test/metabase/api/dash_test.clj b/test/metabase/api/dash_test.clj
index c498b01f9a0da186882f5af7b73ad0fb5bc95d45..e12bc4e94e3ee617804b50261c104626330c849d 100644
--- a/test/metabase/api/dash_test.clj
+++ b/test/metabase/api/dash_test.clj
@@ -10,9 +10,9 @@
                              [dashboard :refer [Dashboard]]
                              [dashboard-card :refer [DashboardCard]]
                              [user :refer [User]])
+            [metabase.test.data :refer :all]
             [metabase.test.data.users :refer :all]
-            [metabase.test.util :refer [match-$ expect-eval-actual-first random-name with-temp]]
-            [metabase.test-data :refer :all]))
+            [metabase.test.util :refer [match-$ expect-eval-actual-first random-name with-temp]]))
 
 ;; # DASHBOARD LIFECYCLE
 
diff --git a/test/metabase/api/meta/dataset_test.clj b/test/metabase/api/meta/dataset_test.clj
index acd749afdbf901bb73b36c87ab6df9d71f0efb2d..493cbc982cca84b04ae9495975280026c7ee5931 100644
--- a/test/metabase/api/meta/dataset_test.clj
+++ b/test/metabase/api/meta/dataset_test.clj
@@ -4,9 +4,9 @@
             [korma.core :refer :all]
             [metabase.db :refer :all]
             [metabase.models.query-execution :refer [QueryExecution]]
+            [metabase.test.data :refer :all]
             [metabase.test.data.users :refer :all]
-            [metabase.test.util :refer [match-$ expect-eval-actual-first]]
-            [metabase.test-data :refer :all]))
+            [metabase.test.util :refer [match-$ expect-eval-actual-first]]))
 
 ;;; ## POST /api/meta/dataset
 ;; Just a basic sanity check to make sure Query Processor endpoint is still working correctly.
diff --git a/test/metabase/api/meta/db_test.clj b/test/metabase/api/meta/db_test.clj
index 6c5b830b7b5dd83c8739c55fd9624f5a8b0800f5..82a8a0b00828a82837a858edc89ea90611856f05 100644
--- a/test/metabase/api/meta/db_test.clj
+++ b/test/metabase/api/meta/db_test.clj
@@ -5,9 +5,9 @@
             [metabase.driver.mongo.test-data :as mongo-test-data]
             (metabase.models [database :refer [Database]]
                              [table :refer [Table]])
+            [metabase.test.data :refer :all]
             (metabase.test.data [datasets :as datasets]
                                 [users :refer :all])
-            [metabase.test-data :refer :all]
             [metabase.test.util :refer [match-$ random-name expect-eval-actual-first]]))
 
 ;; HELPER FNS
diff --git a/test/metabase/api/meta/field_test.clj b/test/metabase/api/meta/field_test.clj
index 16dab6f284a6e31aec9fd5f713eeb4b244e6b106..3437aa57d79782746bf815ebd0e7dd8552f0a0dc 100644
--- a/test/metabase/api/meta/field_test.clj
+++ b/test/metabase/api/meta/field_test.clj
@@ -4,8 +4,8 @@
             (metabase.models [field :refer [Field]]
                              [field-values :refer [FieldValues]]
                              [table :refer [Table]])
+            [metabase.test.data :refer :all]
             [metabase.test.data.users :refer :all]
-            [metabase.test-data :refer :all]
             [metabase.test.util :refer [match-$ expect-eval-actual-first]]))
 
 
diff --git a/test/metabase/api/meta/table_test.clj b/test/metabase/api/meta/table_test.clj
index 3ff8f170895df45ac2efdbb0af3bf06f546ea589..c166917e70e214340cff84bcb4eb0492c3137798 100644
--- a/test/metabase/api/meta/table_test.clj
+++ b/test/metabase/api/meta/table_test.clj
@@ -8,9 +8,9 @@
             (metabase.models [field :refer [Field]]
                              [foreign-key :refer [ForeignKey]]
                              [table :refer [Table]])
+            [metabase.test.data :refer :all]
             (metabase.test.data [datasets :as datasets, :refer [*dataset* with-dataset-when-testing]]
                                 [users :refer :all])
-            [metabase.test-data :refer :all]
             [metabase.test-data.data :as data]
             [metabase.test.util :refer [match-$ expect-eval-actual-first]]))
 
diff --git a/test/metabase/api/session_test.clj b/test/metabase/api/session_test.clj
index 0e106f7aebe5d1b554afd2a31d138783a9223c44..f07fcbedb6b5ece972cdf80e0cc97ce24a515c52 100644
--- a/test/metabase/api/session_test.clj
+++ b/test/metabase/api/session_test.clj
@@ -4,12 +4,11 @@
             [korma.core :refer :all]
             [metabase.db :refer :all]
             [metabase.http-client :refer :all]
-            [metabase.test-data :refer :all]
             (metabase.models [session :refer [Session]]
                              [user :refer [User]])
+            [metabase.test.data :refer :all]
             [metabase.test.data.users :refer :all]
-            [metabase.test.util :refer [random-name expect-eval-actual-first]]
-            [metabase.test-data :refer :all]))
+            [metabase.test.util :refer [random-name expect-eval-actual-first]]))
 
 ;; ## POST /api/session
 ;; Test that we can login
diff --git a/test/metabase/api/setting_test.clj b/test/metabase/api/setting_test.clj
index 6591352acd0876614d3df199aed4ff941565ae66..e5acf2e240d45ba6acaa7040da9af72f91043cab 100644
--- a/test/metabase/api/setting_test.clj
+++ b/test/metabase/api/setting_test.clj
@@ -5,9 +5,9 @@
                                                    setting-exists?
                                                    test-setting-1
                                                    test-setting-2]])
-            [metabase.test.data.users :refer :all]
-            [metabase.test-data :refer :all]
-            [metabase.test.util :refer :all]))
+            (metabase.test [data :refer :all]
+                           [util :refer :all])
+            [metabase.test.data.users :refer :all]))
 
 ;; ## Helper Fns
 (defn fetch-all-settings  []
diff --git a/test/metabase/api/setup_test.clj b/test/metabase/api/setup_test.clj
index 96b1364dd5a5e0a95bbf35df85c61729a733f509..0f60fc61a93905381dbf3a9a68578f1bf0a17ba9 100644
--- a/test/metabase/api/setup_test.clj
+++ b/test/metabase/api/setup_test.clj
@@ -6,8 +6,8 @@
             (metabase.models [session :refer [Session]]
                              [user :refer [User]])
             [metabase.setup :as setup]
-            [metabase.test.util :refer [match-$ random-name expect-eval-actual-first]]
-            [metabase.test-data :refer :all]))
+            (metabase.test [data :refer :all]
+                           [util :refer [match-$ random-name expect-eval-actual-first]])))
 
 
 ;; ## POST /api/setup/user
diff --git a/test/metabase/api/user_test.clj b/test/metabase/api/user_test.clj
index b1bfe01aa496301dfa326b9f93c8e527b3ce2325..07b6ab2b49c639c92ef7d09d185e5884df59778a 100644
--- a/test/metabase/api/user_test.clj
+++ b/test/metabase/api/user_test.clj
@@ -7,9 +7,9 @@
             [metabase.middleware.auth :as auth]
             (metabase.models [session :refer [Session]]
                              [user :refer [User]])
+            [metabase.test.data :refer :all]
             [metabase.test.data.users :refer :all]
-            [metabase.test.util :refer [match-$ random-name expect-eval-actual-first]]
-            [metabase.test-data :refer :all]))
+            [metabase.test.util :refer [match-$ random-name expect-eval-actual-first]]))
 
 ;; ## /api/user/* AUTHENTICATION Tests
 ;; We assume that all endpoints for a given context are enforced by the same middleware, so we don't run the same
diff --git a/test/metabase/bootstrap.clj b/test/metabase/bootstrap.clj
index 060975b918595e7605990f77bd74cc608db69272..148fec468e544e364387e223c78c4f92bbd23337 100644
--- a/test/metabase/bootstrap.clj
+++ b/test/metabase/bootstrap.clj
@@ -1,9 +1,9 @@
 (ns metabase.bootstrap
   "Functions for creating new Orgs/Users from the command-line / REPL."
-  (:require (metabase [db :refer :all]
-                      [test-data :as data])
+  (:require [metabase.db :refer :all]
             (metabase.models [database :refer [Database]]
-                             [user :refer [User]])))
+                             [user :refer [User]])
+            [metabase.test.data :refer :all]))
 
 (declare bootstrap-user
          prompt-read-line
diff --git a/test/metabase/db/metadata_queries_test.clj b/test/metabase/db/metadata_queries_test.clj
index e8cd86a03a51e8e0735a66fad1101ce0410628a0..d601f37ff4c383867e613431a6331ec1d2a2dc07 100644
--- a/test/metabase/db/metadata_queries_test.clj
+++ b/test/metabase/db/metadata_queries_test.clj
@@ -1,10 +1,9 @@
 (ns metabase.db.metadata-queries-test
   (:require [expectations :refer :all]
-            (metabase [db :refer :all]
-                      [test-data :refer :all]
-                      test-setup)
+            [metabase.db :refer :all]
             [metabase.db.metadata-queries :refer :all]
-            [metabase.models.field :refer [Field]]))
+            [metabase.models.field :refer [Field]]
+            [metabase.test.data :refer :all]))
 
 (defn- fetch-field [table-kw field-kw]
   (sel :one Field :id (field->id table-kw field-kw)))
diff --git a/test/metabase/driver/generic_sql/connection_test.clj b/test/metabase/driver/generic_sql/connection_test.clj
index ed6a4f7eabe56e8af0fab85598351adbc8fe672d..913354ebef868c295a0f068918aed8e823d6f5d7 100644
--- a/test/metabase/driver/generic_sql/connection_test.clj
+++ b/test/metabase/driver/generic_sql/connection_test.clj
@@ -3,7 +3,7 @@
             [metabase.db :refer [sel]]
             [metabase.driver :as driver]
             [metabase.models.database :refer [Database]]
-            [metabase.test-data :refer :all]))
+            [metabase.test.data :refer :all]))
 
 ;; ## TESTS FOR CAN-CONNECT?
 
diff --git a/test/metabase/driver/generic_sql/native_test.clj b/test/metabase/driver/generic_sql/native_test.clj
index 5ae45ad46440675b5c661816a7040a5b929a703c..68a5a72c46d2af2103855a9bfa0a7d7c3c51cb78 100644
--- a/test/metabase/driver/generic_sql/native_test.clj
+++ b/test/metabase/driver/generic_sql/native_test.clj
@@ -3,7 +3,7 @@
             [colorize.core :as color]
             [expectations :refer :all]
             [metabase.driver :as driver]
-            [metabase.test-data :refer :all]))
+            [metabase.test.data :refer :all]))
 
 ;; Just check that a basic query works
 (expect {:status :completed
diff --git a/test/metabase/driver/generic_sql/query_processor_test.clj b/test/metabase/driver/generic_sql/query_processor_test.clj
index 61e771cf86e81eee07e04d81d6db30ef6fd2f08f..87b55b793140a8ccead5bc99d2013693dbcc8838 100644
--- a/test/metabase/driver/generic_sql/query_processor_test.clj
+++ b/test/metabase/driver/generic_sql/query_processor_test.clj
@@ -5,7 +5,7 @@
             [expectations :refer :all]
             [metabase.driver :as driver]
             [metabase.driver.query-processor :refer [max-result-rows]]
-            [metabase.test-data :refer [db-id table->id field->id]]))
+            [metabase.test.data :refer [db-id table->id field->id]]))
 
 ;; # ERROR RESPONSES
 
diff --git a/test/metabase/driver/generic_sql_test.clj b/test/metabase/driver/generic_sql_test.clj
index a66647ffc56d10ba867c12c3b599218b445829d0..547c062bae81ce206c74e50044e5797dcd183737 100644
--- a/test/metabase/driver/generic_sql_test.clj
+++ b/test/metabase/driver/generic_sql_test.clj
@@ -9,7 +9,7 @@
             (metabase.models [field :refer [Field]]
                              [foreign-key :refer [ForeignKey]]
                              [table :refer [Table]])
-            [metabase.test-data :refer :all]
+            [metabase.test.data :refer :all]
             [metabase.test.util :refer [resolve-private-fns]]))
 
 (def users-table
diff --git a/test/metabase/driver/sync_test.clj b/test/metabase/driver/sync_test.clj
index 0c6d410a8f886940575318c05db3b85a79ec5d28..c4e8ea3f52516814262dd9e25b2b7bdc027c6c81 100644
--- a/test/metabase/driver/sync_test.clj
+++ b/test/metabase/driver/sync_test.clj
@@ -10,8 +10,8 @@
             (metabase.models [field :refer [Field]]
                              [foreign-key :refer [ForeignKey]]
                              [table :refer [Table]])
-            [metabase.test-data :refer :all]
-            [metabase.test.util :refer [resolve-private-fns]]))
+            (metabase.test [data :refer :all]
+                           [util :refer [resolve-private-fns]])))
 
 (def users-table
   (delay (sel :one Table :name "USERS")))
diff --git a/test/metabase/middleware/auth_test.clj b/test/metabase/middleware/auth_test.clj
index c19883f66b67346639cf7feb4f34f51dd1732ee3..871143d14a425766ed2ab26b17fec3b7b4e5dec7 100644
--- a/test/metabase/middleware/auth_test.clj
+++ b/test/metabase/middleware/auth_test.clj
@@ -5,8 +5,8 @@
             [metabase.api.common :refer [*current-user-id* *current-user*]]
             [metabase.middleware.auth :refer :all]
             [metabase.models.session :refer [Session]]
+            [metabase.test.data :refer :all]
             [metabase.test.data.users :refer :all]
-            [metabase.test-data :refer :all]
             [metabase.util :as util]))
 
 ;;  ===========================  TEST wrap-sessionid middleware  ===========================
diff --git a/test/metabase/models/field_test.clj b/test/metabase/models/field_test.clj
index 34d7a7412b8ab612b58ee299ffffaf07e579604b..4bdc0354789a96a3df6011a096d44e2f31ef858f 100644
--- a/test/metabase/models/field_test.clj
+++ b/test/metabase/models/field_test.clj
@@ -3,7 +3,7 @@
             [metabase.db :refer :all]
             (metabase.models [field :refer :all]
                              [field-values :refer :all])
-            [metabase.test-data :refer :all]))
+            [metabase.test.data :refer :all]))
 
 ;; Check that setting a Field's special_type to :category will cause a corresponding FieldValues to be created asynchronously
 (expect
diff --git a/test/metabase/models/hydrate_test.clj b/test/metabase/models/hydrate_test.clj
index 20dd60e1b53e7cd472f41515892ee07b082b1a87..bf98426bc2b7e51c829d403f7186bd8ca7806a83 100644
--- a/test/metabase/models/hydrate_test.clj
+++ b/test/metabase/models/hydrate_test.clj
@@ -2,9 +2,9 @@
   (:require [expectations :refer :all]
             [medley.core :as m]
             [metabase.models.hydrate :refer :all]
-            [metabase.test.data.users :refer :all]
-            [metabase.test-data :refer :all]
-            [metabase.test.util :refer :all]))
+            (metabase.test [data :refer :all]
+                           [util :refer :all])
+            [metabase.test.data.users :refer :all]))
 
 (def d1 (delay 1))
 (def d2 (delay 2))
diff --git a/test/metabase/models/setting_test.clj b/test/metabase/models/setting_test.clj
index db8dede3e830c35714acaf9908283691de83aac2..f13bc6a0fde49cc010b70c679b3bd43bbd32214d 100644
--- a/test/metabase/models/setting_test.clj
+++ b/test/metabase/models/setting_test.clj
@@ -1,10 +1,10 @@
 (ns metabase.models.setting-test
   (:require [expectations :refer :all]
             [medley.core :as m]
-            (metabase [db :refer [sel]]
-                      [test-data :refer :all])
+            [metabase.db :refer [sel]]
             [metabase.models.setting :refer [defsetting Setting] :as setting]
-            [metabase.test.util :refer :all]))
+            (metabase.test [data :refer :all]
+                           [util :refer :all])))
 
 ;; ## TEST SETTINGS DEFINITIONS
 ;; TODO! These don't get loaded by `lein ring server` unless this file is touched
diff --git a/test/metabase/test/data.clj b/test/metabase/test/data.clj
index de6f4bb88deeb94986edcfe8937ba19922e8543f..a00704db5516029dd3700e0f19f9171aac4ff5e2 100644
--- a/test/metabase/test/data.clj
+++ b/test/metabase/test/data.clj
@@ -5,43 +5,16 @@
             [metabase.db :refer :all]
             [metabase.driver :as driver]
             (metabase.models [database :refer [Database]]
-                             [field :refer [Field] :as field])
-            [metabase.test.data.interface :refer :all])
+                             [field :refer [Field] :as field]
+                             [table :refer [Table]])
+            (metabase.test.data [data :as data]
+                                [h2 :as h2]
+                                [interface :refer :all]))
   (:import clojure.lang.Keyword
            (metabase.test.data.interface DatabaseDefinition
                                          FieldDefinition
                                          TableDefinition)))
 
-;; ## Functions for Creating New Definitions
-
-(defn create-field-definition
-  "Create a new `FieldDefinition`; verify its values."
-  ^FieldDefinition [{:keys [field-name base-type field-type special-type fk], :as field-definition-map}]
-  (assert (contains? field/base-types base-type))
-  (when field-type
-    (assert (contains? field/field-types field-type)))
-  (when special-type
-    (assert (contains? field/special-types special-type)))
-  (map->FieldDefinition field-definition-map))
-
-(defn create-table-definition
-  "Convenience for creating a `TableDefinition`."
-  ^TableDefinition [^String table-name field-definition-maps rows]
-  (map->TableDefinition {:table-name          table-name
-                         :rows                rows
-                         :field-definitions   (mapv create-field-definition field-definition-maps)
-                         :database-definition (promise)}))
-
-(defn create-database-definition
-  "Convenience for creating a new `DatabaseDefinition`."
-  ^DatabaseDefinition [^String database-name & table-name+field-definition-maps+rows]
-  {:pre [(string? database-name)
-         (not (s/blank? database-name))]}
-  (map->DatabaseDefinition {:database-name     database-name
-                            :table-definitions (mapv (partial apply create-table-definition)
-                                                     table-name+field-definition-maps+rows)}))
-
-
 ;; ## Loading / Deleting Test Datasets
 
 (defn get-or-create-database!
@@ -104,4 +77,78 @@
   (drop-physical-db! dataset-loader database-definition))
 
 
-;; ## Helper Functions for Writing Tests
+;; ## Helper Functions for Using the Default (H2) Dataset For Writing Tests
+
+(def test-db
+  "The test `Database` object."
+  (delay (get-or-create-database! (h2/dataset-loader) data/test-data)))
+
+(def db-id
+  "The ID of the test `Database`."
+  (delay (assert @test-db)
+         (:id @test-db)))
+
+(def ^{:arglists '([[table-name]])}
+  table->id
+  "Return the ID of a Table with TABLE-NAME.
+
+    (table->id :venues) -> 12"
+  (memoize
+   (fn [table-name]
+     {:pre [(keyword? table-name)]
+      :post [(integer? %)
+             (not (zero? %))]}
+     (sel :one :id Table :name (s/upper-case (name table-name)), :db_id @db-id))))
+
+(def ^{:arglists '([table-name field-name])}
+  field->id
+  "Return the ID of a Field with FIELD-NAME belonging to Table with TABLE-NAME.
+
+    (field->id :checkins :venue_id) -> 4"
+  (memoize
+   (fn [table-name field-name]
+     {:pre [(keyword? table-name)
+            (keyword? field-name)]
+      :post [(integer? %)
+             (not (zero? %))]}
+     (sel :one :id Field :name (s/upper-case (name field-name)), :table_id (table->id table-name)))))
+
+(defn table-name->table
+  "Fetch `Table` with TABLE-NAME."
+  [table-name]
+  {:pre [(keyword? table-name)]
+   :post [(map? %)]}
+  (sel :one Table :id (table->id (s/upper-case (name table-name)))))
+
+
+;; ## TODO! with-temp-table and related macros
+
+;; DEPRECATED ! Need to rewrite this to use the new TableDefinition stuff
+;; (defmacro with-temp-table
+;;   "Execute BODY with a temporary Table that will be dropped afterward.
+;;    The korma entity representing the Table is bound to TABLE-BINDING.
+;;    FIELDS-MAP should be a map of FIELD-NAME -> SQL-TYPE.
+
+;;     (with-temp-table [table {:name \"VARCHAR(254)\"}]
+;;       (insert table (values [{:name \"A\"}
+;;                              {:name \"B\"}]))
+;;       (select table values (where {:name \"A\"})))"
+;;   [[table-binding fields-map] & body]
+;;   {:pre [(map? fields-map)]}
+;;   (let [table-name (name (gensym "TABLE__"))
+;;         formatted-fields (->> fields-map
+;;                               (map (fn [[field-name field-type]]
+;;                                      (format "\"%s\" %s" (.toUpperCase ^String (name field-name)) (name field-type))))
+;;                               (interpose ", ")
+;;                               (reduce str))]
+;;     `(do (get-or-create-database! (h2/dataset-loader) data/test-data)
+;;          (h2/exec-sql data/test-data (format "DROP TABLE IF EXISTS \"%s\";" ~table-name))
+;;          (h2/exec-sql data/test-data (format "CREATE TABLE \"%s\" (%s, \"ID\" BIGINT AUTO_INCREMENT, PRIMARY KEY (\"ID\"));" ~table-name ~formatted-fields))
+;;          (let [~table-binding (h2/korma-entity (map->TableDefinition {:table-name ~table-name})
+;;                                                data/test-data)]
+;;            (try
+;;              ~@body
+;;              (catch Throwable e#
+;;                (println "E: " e#))
+;;              (finally
+;;                (h2/exec-sql data/test-data (format "DROP TABLE \"%s\";" ~table-name))))))))
diff --git a/test/metabase/test/data/data.clj b/test/metabase/test/data/data.clj
index fc8a284ca5f111848a68d8cfbfc2fec2dd2c6bd5..246a42782b43ce0ad81df1292b194a618f54b96f 100644
--- a/test/metabase/test/data/data.clj
+++ b/test/metabase/test/data/data.clj
@@ -1,7 +1,7 @@
 (ns metabase.test.data.data
   "The `DatabaseDefinition` and data of the primary test dataset."
-  (:require [metabase.test.data :refer :all]
-            [metabase.test-data.data :as test-data])
+  (:require [metabase.test-data.data :as test-data]
+            [metabase.test.data.interface :refer :all])
   (:import metabase.test.data.interface.DatabaseDefinition))
 
 ;; ## Test Database / Tables / Fields
diff --git a/test/metabase/test/data/datasets.clj b/test/metabase/test/data/datasets.clj
index 4e951e15ac308e688fe250645a1c891911ae2a94..5b0551b59111fdac97106a0bf492a3cab457716d 100644
--- a/test/metabase/test/data/datasets.clj
+++ b/test/metabase/test/data/datasets.clj
@@ -6,7 +6,7 @@
             [environ.core :refer [env]]
             [expectations :refer :all]
             [metabase.driver.mongo.test-data :as mongo-data]
-            [metabase.test-data :as generic-sql-data]))
+            [metabase.test.data :as generic-sql-data]))
 
 ;; # IDataset
 
@@ -63,14 +63,14 @@
     :DateField))
 
 
-;; ## Generic SQL
+;; ## Generic SQL (H2)
 
 (deftype GenericSqlDriverData []
   IDataset
   (load-data! [_]
     @generic-sql-data/test-db
     (assert (integer? @generic-sql-data/db-id)))
-  (db [_]
+  (db [this]
     @generic-sql-data/test-db)
   (table-name->table [_ table-name]
     (generic-sql-data/table-name->table table-name))
diff --git a/test/metabase/test/data/interface.clj b/test/metabase/test/data/interface.clj
index 23f1ac4dcb7bc4e5fb9e3ee459e885dbbf218f78..dac5e94f314c983630ad750e5fd820583ba92ea2 100644
--- a/test/metabase/test/data/interface.clj
+++ b/test/metabase/test/data/interface.clj
@@ -80,3 +80,33 @@
 
   (drop-physical-table! [this ^DatabaseDefinition database-definition, ^TableDefinition table-definition]
     "Drop the DBMS table/collection/etc. associated with TABLE-DEFINITION."))
+
+
+;; ## Helper Functions for Creating New Definitions
+
+(defn create-field-definition
+  "Create a new `FieldDefinition`; verify its values."
+  ^FieldDefinition [{:keys [field-name base-type field-type special-type fk], :as field-definition-map}]
+  (assert (contains? field/base-types base-type))
+  (when field-type
+    (assert (contains? field/field-types field-type)))
+  (when special-type
+    (assert (contains? field/special-types special-type)))
+  (map->FieldDefinition field-definition-map))
+
+(defn create-table-definition
+  "Convenience for creating a `TableDefinition`."
+  ^TableDefinition [^String table-name field-definition-maps rows]
+  (map->TableDefinition {:table-name          table-name
+                         :rows                rows
+                         :field-definitions   (mapv create-field-definition field-definition-maps)
+                         :database-definition (promise)}))
+
+(defn create-database-definition
+  "Convenience for creating a new `DatabaseDefinition`."
+  ^DatabaseDefinition [^String database-name & table-name+field-definition-maps+rows]
+  {:pre [(string? database-name)
+         (not (s/blank? database-name))]}
+  (map->DatabaseDefinition {:database-name     database-name
+                            :table-definitions (mapv (partial apply create-table-definition)
+                                                     table-name+field-definition-maps+rows)}))
diff --git a/test/metabase/test_data.clj b/test/metabase/test_data.clj
deleted file mode 100644
index af5c69f74bbbd9ac4c2cc35e60aef79181b6b246..0000000000000000000000000000000000000000
--- a/test/metabase/test_data.clj
+++ /dev/null
@@ -1,146 +0,0 @@
-(ns metabase.test-data
-  "Functions relating to using the test data, Database, Organization, and Users."
-  (:require [cemerick.friend.credentials :as creds]
-            [korma.core :as k]
-            [medley.core :as medley]
-            (metabase [db :refer :all])
-            (metabase.models [field :refer [Field]]
-                             [table :refer [Table]]
-                             [user :refer [User]])
-            [metabase.test.data :refer :all]
-            (metabase.test.data [data :as data]
-                                [h2 :as h2])))
-
-(declare tables
-         table-fields)
-
-
-;; # PUBLIC FUNCTIONS / VARS
-
-(def test-db
-  "The test `Database` object."
-  (delay (get-or-create-database! (h2/dataset-loader) data/test-data)))
-
-(def db-id
-  "The ID of the test `Database`."
-  (delay (assert @test-db)
-         (:id @test-db)))
-
-(defn field->id
-  "Return the ID of a Field with FIELD-NAME belonging to Table with TABLE-NAME.
-
-    (field->id :checkins :venue_id) -> 4"
-  [table-name field-name]
-  {:pre [(keyword? table-name)
-         (keyword? field-name)]
-   :post [(integer? %)
-          (not (zero? %))]}
-  (-> @table-fields table-name field-name))
-
-(defn table->id
-  "Return the ID of a Table with TABLE-NAME.
-
-    (table->id :venues) -> 12"
-  [table-name]
-  {:pre [(keyword? table-name)]
-   :post [(integer? %)
-          (not (zero? %))]}
-  (@tables table-name))
-
-(defn table-name->table
-  "Fetch `Table` with TABLE-NAME."
-  [table-name]
-  {:pre [(keyword? table-name)]
-   :post [(map? %)]}
-  (sel :one Table :id (table->id table-name)))
-
-
-
-
-
-
-
-
-
-;; ## Temporary Tables / Etc.
-
-;; DEPRECATED ! Need to rewrite this to use the new TableDefinition stuff
-;; (defmacro with-temp-table
-;;   "Execute BODY with a temporary Table that will be dropped afterward.
-;;    The korma entity representing the Table is bound to TABLE-BINDING.
-;;    FIELDS-MAP should be a map of FIELD-NAME -> SQL-TYPE.
-
-;;     (with-temp-table [table {:name \"VARCHAR(254)\"}]
-;;       (insert table (values [{:name \"A\"}
-;;                              {:name \"B\"}]))
-;;       (select table values (where {:name \"A\"})))"
-;;   [[table-binding fields-map] & body]
-;;   {:pre [(map? fields-map)]}
-;;   (let [table-name (name (gensym "TABLE__"))
-;;         formatted-fields (->> fields-map
-;;                               (map (fn [[field-name field-type]]
-;;                                      (format "\"%s\" %s" (.toUpperCase ^String (name field-name)) (name field-type))))
-;;                               (interpose ", ")
-;;                               (reduce str))]
-;;     `(do (get-or-create-database! (h2/dataset-loader) data/test-data)
-;;          (h2/exec-sql data/test-data (format "DROP TABLE IF EXISTS \"%s\";" ~table-name))
-;;          (h2/exec-sql data/test-data (format "CREATE TABLE \"%s\" (%s, \"ID\" BIGINT AUTO_INCREMENT, PRIMARY KEY (\"ID\"));" ~table-name ~formatted-fields))
-;;          (let [~table-binding (h2/korma-entity (map->TableDefinition {:table-name ~table-name})
-;;                                                data/test-data)]
-;;            (try
-;;              ~@body
-;;              (catch Throwable e#
-;;                (println "E: " e#))
-;;              (finally
-;;                (h2/exec-sql data/test-data (format "DROP TABLE \"%s\";" ~table-name))))))))
-
-
-;; # INTERNAL
-
-;; ## Tables + Fields
-
-(defn- map-table-kws
-  "Return a map create by mapping the keyword names of Tables in test DB (e.g. `:users`) against F, e.g.
-
-    {:users (f :users)
-     :venues (f :venues)
-     ...}"
-  [f]
-  (->> [:users :venues :checkins :categories]
-       (map (fn [table-kw]
-              {table-kw (f table-kw)}))
-       (into {})))
-
-(def
-  ^{:doc "A map of Table name keywords -> Table IDs.
-
-              {:users 100
-               :venues 101
-               ...}"
-    :private true}
-  tables
-  (delay
-   @test-db                         ; force lazy evaluation of Test DB
-   (map-table-kws (fn [table-kw]
-                    (sel :one :id Table, :db_id @db-id, :name (-> table-kw name .toUpperCase))))))
-
-(def
-  ^{:doc "A map of Table name keywords -> map of Field name keywords -> Field IDs.
-
-              {:users {:id 14
-                       :name 15}
-               :venues ...}"
-    :private true}
-  table-fields
-  (delay
-   @test-db ; force lazy evaluation of Test DB
-   (map-table-kws (fn [table-kw]
-                    (->> (sel :many [Field :name :id] :table_id (@tables table-kw))
-                         (map (fn [{:keys [^String name id]}]
-                                {:pre [(string? name)
-                                       (integer? id)
-                                       (not (zero? id))]}
-                                {(keyword (.toLowerCase name)) id}))
-                         (into {}))))))
-
-;; ## Users
diff --git a/test/metabase/test_setup.clj b/test/metabase/test_setup.clj
index 51540ca0fb9c056bd601f32784e2021f20dec715..afd08ecebe64b57cacdd08b6380b8122075c5974 100644
--- a/test/metabase/test_setup.clj
+++ b/test/metabase/test_setup.clj
@@ -5,10 +5,8 @@
             [expectations :refer :all]
             (metabase [core :as core]
                       [db :as db]
-                      [task :as task]
-                      [test-data :as h2-test-data])
-            [metabase.test.data.datasets :as datasets]
-            [metabase.driver.mongo.test-data :as mongo-test-data]))
+                      [task :as task])
+            [metabase.test.data.datasets :as datasets]))
 
 (declare clear-test-db)