diff --git a/Gemfile b/Gemfile
index 56c861fb1b6d6fe1fad66afc2cd4148ffea26f14..1b885f5d685d15dcd0433fef8b6bbae0fd905ef7 100644
--- a/Gemfile
+++ b/Gemfile
@@ -2,8 +2,9 @@ source "https://rubygems.org"
 
 ruby "2.2.0"
 
+gem 'administrate', path: "administrate"
+
 gem "airbrake"
-gem "bourbon", "~> 4.1.0"
 gem "coffee-rails", "~> 4.1.0"
 gem "delayed_job_active_record"
 gem "email_validator"
@@ -12,7 +13,6 @@ gem "flutie"
 gem "high_voltage"
 gem "i18n-tasks"
 gem "jquery-rails"
-gem "neat", "~> 1.7.0"
 gem "newrelic_rpm"
 gem "normalize-rails", "~> 3.0.0"
 gem "pg"
@@ -32,7 +32,6 @@ group :development do
 end
 
 group :development, :test do
-  gem "ammeter"
   gem "awesome_print"
   gem "bundler-audit", require: false
   gem "byebug"
diff --git a/Gemfile.lock b/Gemfile.lock
index afbc1a1f2955f3125dfe7c86eba477b366f9e47a..6685b3b70eb926956dc05c13cf14f48f464ed399 100644
--- a/Gemfile.lock
+++ b/Gemfile.lock
@@ -1,3 +1,10 @@
+PATH
+  remote: administrate
+  specs:
+    administrate (0.0.1)
+      neat (~> 1.7.0)
+      rails (~> 4.2.0)
+
 GEM
   remote: https://rubygems.org/
   specs:
@@ -277,10 +284,10 @@ PLATFORMS
   ruby
 
 DEPENDENCIES
+  administrate!
   airbrake
   ammeter
   awesome_print
-  bourbon (~> 4.1.0)
   bundler-audit
   byebug
   capybara-webkit (>= 1.2.0)
@@ -298,7 +305,6 @@ DEPENDENCIES
   i18n-tasks
   jquery-rails
   launchy
-  neat (~> 1.7.0)
   newrelic_rpm
   normalize-rails (~> 3.0.0)
   pg
diff --git a/administrate/.gitignore b/administrate/.gitignore
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/administrate/Gemfile b/administrate/Gemfile
new file mode 100644
index 0000000000000000000000000000000000000000..6ec93d1ab2bcda8e998f47edb584f6b3a811e7bb
--- /dev/null
+++ b/administrate/Gemfile
@@ -0,0 +1,14 @@
+source 'https://rubygems.org'
+
+# Declare your gem's dependencies in administrate.gemspec.
+# Bundler will treat runtime dependencies like base dependencies, and
+# development dependencies will be added by default to the :development group.
+gemspec
+
+# Declare any dependencies that are still in development here instead of in
+# your gemspec. These might include edge Rails or gems from your path or
+# Git. Remember to move these dependencies to your gemspec before releasing
+# your gem to rubygems.org.
+
+# To use a debugger
+# gem 'byebug', group: [:development, :test]
diff --git a/administrate/Gemfile.lock b/administrate/Gemfile.lock
new file mode 100644
index 0000000000000000000000000000000000000000..f1f9e04fe7d9468d213a7c1a33c408ce818d7dda
--- /dev/null
+++ b/administrate/Gemfile.lock
@@ -0,0 +1,106 @@
+PATH
+  remote: .
+  specs:
+    administrate (0.0.1)
+      rails (~> 4.2.0)
+
+GEM
+  remote: https://rubygems.org/
+  specs:
+    actionmailer (4.2.1)
+      actionpack (= 4.2.1)
+      actionview (= 4.2.1)
+      activejob (= 4.2.1)
+      mail (~> 2.5, >= 2.5.4)
+      rails-dom-testing (~> 1.0, >= 1.0.5)
+    actionpack (4.2.1)
+      actionview (= 4.2.1)
+      activesupport (= 4.2.1)
+      rack (~> 1.6)
+      rack-test (~> 0.6.2)
+      rails-dom-testing (~> 1.0, >= 1.0.5)
+      rails-html-sanitizer (~> 1.0, >= 1.0.1)
+    actionview (4.2.1)
+      activesupport (= 4.2.1)
+      builder (~> 3.1)
+      erubis (~> 2.7.0)
+      rails-dom-testing (~> 1.0, >= 1.0.5)
+      rails-html-sanitizer (~> 1.0, >= 1.0.1)
+    activejob (4.2.1)
+      activesupport (= 4.2.1)
+      globalid (>= 0.3.0)
+    activemodel (4.2.1)
+      activesupport (= 4.2.1)
+      builder (~> 3.1)
+    activerecord (4.2.1)
+      activemodel (= 4.2.1)
+      activesupport (= 4.2.1)
+      arel (~> 6.0)
+    activesupport (4.2.1)
+      i18n (~> 0.7)
+      json (~> 1.7, >= 1.7.7)
+      minitest (~> 5.1)
+      thread_safe (~> 0.3, >= 0.3.4)
+      tzinfo (~> 1.1)
+    arel (6.0.0)
+    builder (3.2.2)
+    erubis (2.7.0)
+    globalid (0.3.5)
+      activesupport (>= 4.1.0)
+    i18n (0.7.0)
+    json (1.8.3)
+    loofah (2.0.2)
+      nokogiri (>= 1.5.9)
+    mail (2.6.3)
+      mime-types (>= 1.16, < 3)
+    mime-types (2.6.1)
+    mini_portile (0.6.2)
+    minitest (5.7.0)
+    nokogiri (1.6.6.2)
+      mini_portile (~> 0.6.0)
+    rack (1.6.1)
+    rack-test (0.6.3)
+      rack (>= 1.0)
+    rails (4.2.1)
+      actionmailer (= 4.2.1)
+      actionpack (= 4.2.1)
+      actionview (= 4.2.1)
+      activejob (= 4.2.1)
+      activemodel (= 4.2.1)
+      activerecord (= 4.2.1)
+      activesupport (= 4.2.1)
+      bundler (>= 1.3.0, < 2.0)
+      railties (= 4.2.1)
+      sprockets-rails
+    rails-deprecated_sanitizer (1.0.3)
+      activesupport (>= 4.2.0.alpha)
+    rails-dom-testing (1.0.6)
+      activesupport (>= 4.2.0.beta, < 5.0)
+      nokogiri (~> 1.6.0)
+      rails-deprecated_sanitizer (>= 1.0.1)
+    rails-html-sanitizer (1.0.2)
+      loofah (~> 2.0)
+    railties (4.2.1)
+      actionpack (= 4.2.1)
+      activesupport (= 4.2.1)
+      rake (>= 0.8.7)
+      thor (>= 0.18.1, < 2.0)
+    rake (10.4.2)
+    sprockets (3.2.0)
+      rack (~> 1.0)
+    sprockets-rails (2.3.1)
+      actionpack (>= 3.0)
+      activesupport (>= 3.0)
+      sprockets (>= 2.8, < 4.0)
+    sqlite3 (1.3.10)
+    thor (0.19.1)
+    thread_safe (0.3.5)
+    tzinfo (1.2.2)
+      thread_safe (~> 0.1)
+
+PLATFORMS
+  ruby
+
+DEPENDENCIES
+  administrate!
+  sqlite3
diff --git a/administrate/MIT-LICENSE b/administrate/MIT-LICENSE
new file mode 100644
index 0000000000000000000000000000000000000000..5128c6027f2fb44897da2963126b2076b0381ef4
--- /dev/null
+++ b/administrate/MIT-LICENSE
@@ -0,0 +1,20 @@
+Copyright 2015 Grayson Wright
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/administrate/README.rdoc b/administrate/README.rdoc
new file mode 100644
index 0000000000000000000000000000000000000000..865d63466aa48bbd87e79cd0dc831c4b321bd866
--- /dev/null
+++ b/administrate/README.rdoc
@@ -0,0 +1,3 @@
+= Administrate
+
+This project rocks and uses MIT-LICENSE.
\ No newline at end of file
diff --git a/administrate/Rakefile b/administrate/Rakefile
new file mode 100644
index 0000000000000000000000000000000000000000..5a306e8266cfe1c145e8c23eeec97fb963ccd200
--- /dev/null
+++ b/administrate/Rakefile
@@ -0,0 +1,37 @@
+begin
+  require 'bundler/setup'
+rescue LoadError
+  puts 'You must `gem install bundler` and `bundle install` to run rake tasks'
+end
+
+require 'rdoc/task'
+
+RDoc::Task.new(:rdoc) do |rdoc|
+  rdoc.rdoc_dir = 'rdoc'
+  rdoc.title    = 'Administrate'
+  rdoc.options << '--line-numbers'
+  rdoc.rdoc_files.include('README.rdoc')
+  rdoc.rdoc_files.include('lib/**/*.rb')
+end
+
+APP_RAKEFILE = File.expand_path("../test/dummy/Rakefile", __FILE__)
+load 'rails/tasks/engine.rake'
+
+
+load 'rails/tasks/statistics.rake'
+
+
+
+Bundler::GemHelper.install_tasks
+
+require 'rake/testtask'
+
+Rake::TestTask.new(:test) do |t|
+  t.libs << 'lib'
+  t.libs << 'test'
+  t.pattern = 'test/**/*_test.rb'
+  t.verbose = false
+end
+
+
+task default: :test
diff --git a/administrate/administrate.gemspec b/administrate/administrate.gemspec
new file mode 100644
index 0000000000000000000000000000000000000000..356075b48f474de05c2f7e4205812ecbe1e66224
--- /dev/null
+++ b/administrate/administrate.gemspec
@@ -0,0 +1,24 @@
+$:.push File.expand_path("../lib", __FILE__)
+
+# Maintain your gem's version:
+require "administrate/version"
+
+# Describe your gem and declare its dependencies:
+Gem::Specification.new do |s|
+  s.name        = "administrate"
+  s.version     = Administrate::VERSION
+  s.authors     = ["Grayson Wright"]
+  s.email       = ["grayson@thoughtbot.com"]
+  s.homepage    = "TODO"
+  s.summary     = "TODO: Summary of Administrate."
+  s.description = "TODO: Description of Administrate."
+  s.license     = "MIT"
+
+  s.files = Dir["{app,config,db,lib}/**/*", "MIT-LICENSE", "Rakefile", "README.rdoc"]
+  s.test_files = Dir["test/**/*"]
+
+  s.add_dependency "rails", "~> 4.2.0"
+  s.add_dependency "neat", "~> 1.7.0"
+
+  s.add_development_dependency "sqlite3"
+end
diff --git a/administrate/app/assets/images/administrate/.keep b/administrate/app/assets/images/administrate/.keep
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/administrate/app/assets/javascripts/administrate/application.js b/administrate/app/assets/javascripts/administrate/application.js
new file mode 100644
index 0000000000000000000000000000000000000000..a707e052e588ac91ce66fd51f0e52d3172226791
--- /dev/null
+++ b/administrate/app/assets/javascripts/administrate/application.js
@@ -0,0 +1,3 @@
+//= require jquery
+//= require jquery_ujs
+//= require_tree .
diff --git a/app/assets/javascripts/components/table.js b/administrate/app/assets/javascripts/administrate/components/table.js
similarity index 100%
rename from app/assets/javascripts/components/table.js
rename to administrate/app/assets/javascripts/administrate/components/table.js
diff --git a/app/assets/stylesheets/_sidebar.scss b/administrate/app/assets/stylesheets/administrate/_sidebar.scss
similarity index 100%
rename from app/assets/stylesheets/_sidebar.scss
rename to administrate/app/assets/stylesheets/administrate/_sidebar.scss
diff --git a/app/assets/stylesheets/application.css.scss b/administrate/app/assets/stylesheets/administrate/application.scss
similarity index 90%
rename from app/assets/stylesheets/application.css.scss
rename to administrate/app/assets/stylesheets/administrate/application.scss
index 0439767dc7a253515fca6a5a5d56723d27c99ada..7ce94e52226aee3d54436bd28431d6416fcf7294 100644
--- a/app/assets/stylesheets/application.css.scss
+++ b/administrate/app/assets/stylesheets/administrate/application.scss
@@ -6,7 +6,6 @@
 @import "neat";
 @import "mixins/mixins";
 @import "base/base";
-@import "refills/flashes";
 
 @import "layout";
 @import "sidebar";
diff --git a/app/assets/stylesheets/base/_base.scss b/administrate/app/assets/stylesheets/administrate/base/_base.scss
similarity index 100%
rename from app/assets/stylesheets/base/_base.scss
rename to administrate/app/assets/stylesheets/administrate/base/_base.scss
diff --git a/app/assets/stylesheets/base/_buttons.scss b/administrate/app/assets/stylesheets/administrate/base/_buttons.scss
similarity index 100%
rename from app/assets/stylesheets/base/_buttons.scss
rename to administrate/app/assets/stylesheets/administrate/base/_buttons.scss
diff --git a/app/assets/stylesheets/base/_forms.scss b/administrate/app/assets/stylesheets/administrate/base/_forms.scss
similarity index 100%
rename from app/assets/stylesheets/base/_forms.scss
rename to administrate/app/assets/stylesheets/administrate/base/_forms.scss
diff --git a/app/assets/stylesheets/base/_grid-settings.scss b/administrate/app/assets/stylesheets/administrate/base/_grid-settings.scss
similarity index 100%
rename from app/assets/stylesheets/base/_grid-settings.scss
rename to administrate/app/assets/stylesheets/administrate/base/_grid-settings.scss
diff --git a/app/assets/stylesheets/base/_lists.scss b/administrate/app/assets/stylesheets/administrate/base/_lists.scss
similarity index 100%
rename from app/assets/stylesheets/base/_lists.scss
rename to administrate/app/assets/stylesheets/administrate/base/_lists.scss
diff --git a/app/assets/stylesheets/base/_tables.scss b/administrate/app/assets/stylesheets/administrate/base/_tables.scss
similarity index 100%
rename from app/assets/stylesheets/base/_tables.scss
rename to administrate/app/assets/stylesheets/administrate/base/_tables.scss
diff --git a/app/assets/stylesheets/base/_typography.scss b/administrate/app/assets/stylesheets/administrate/base/_typography.scss
similarity index 100%
rename from app/assets/stylesheets/base/_typography.scss
rename to administrate/app/assets/stylesheets/administrate/base/_typography.scss
diff --git a/app/assets/stylesheets/base/_variables.scss b/administrate/app/assets/stylesheets/administrate/base/_variables.scss
similarity index 100%
rename from app/assets/stylesheets/base/_variables.scss
rename to administrate/app/assets/stylesheets/administrate/base/_variables.scss
diff --git a/app/assets/stylesheets/base/extends/_button.scss b/administrate/app/assets/stylesheets/administrate/base/extends/_button.scss
similarity index 100%
rename from app/assets/stylesheets/base/extends/_button.scss
rename to administrate/app/assets/stylesheets/administrate/base/extends/_button.scss
diff --git a/app/assets/stylesheets/base/extends/_clearfix.scss b/administrate/app/assets/stylesheets/administrate/base/extends/_clearfix.scss
similarity index 100%
rename from app/assets/stylesheets/base/extends/_clearfix.scss
rename to administrate/app/assets/stylesheets/administrate/base/extends/_clearfix.scss
diff --git a/app/assets/stylesheets/base/extends/_errors.scss b/administrate/app/assets/stylesheets/administrate/base/extends/_errors.scss
similarity index 100%
rename from app/assets/stylesheets/base/extends/_errors.scss
rename to administrate/app/assets/stylesheets/administrate/base/extends/_errors.scss
diff --git a/app/assets/stylesheets/base/extends/_flashes.scss b/administrate/app/assets/stylesheets/administrate/base/extends/_flashes.scss
similarity index 100%
rename from app/assets/stylesheets/base/extends/_flashes.scss
rename to administrate/app/assets/stylesheets/administrate/base/extends/_flashes.scss
diff --git a/app/assets/stylesheets/base/extends/_hide-text.scss b/administrate/app/assets/stylesheets/administrate/base/extends/_hide-text.scss
similarity index 100%
rename from app/assets/stylesheets/base/extends/_hide-text.scss
rename to administrate/app/assets/stylesheets/administrate/base/extends/_hide-text.scss
diff --git a/app/assets/stylesheets/components/_components.scss b/administrate/app/assets/stylesheets/administrate/components/_components.scss
similarity index 100%
rename from app/assets/stylesheets/components/_components.scss
rename to administrate/app/assets/stylesheets/administrate/components/_components.scss
diff --git a/app/assets/stylesheets/components/_form.scss b/administrate/app/assets/stylesheets/administrate/components/_form.scss
similarity index 100%
rename from app/assets/stylesheets/components/_form.scss
rename to administrate/app/assets/stylesheets/administrate/components/_form.scss
diff --git a/app/assets/stylesheets/components/_header.scss b/administrate/app/assets/stylesheets/administrate/components/_header.scss
similarity index 100%
rename from app/assets/stylesheets/components/_header.scss
rename to administrate/app/assets/stylesheets/administrate/components/_header.scss
diff --git a/app/assets/stylesheets/components/_table.scss b/administrate/app/assets/stylesheets/administrate/components/_table.scss
similarity index 100%
rename from app/assets/stylesheets/components/_table.scss
rename to administrate/app/assets/stylesheets/administrate/components/_table.scss
diff --git a/app/assets/stylesheets/layout.scss b/administrate/app/assets/stylesheets/administrate/layout.scss
similarity index 100%
rename from app/assets/stylesheets/layout.scss
rename to administrate/app/assets/stylesheets/administrate/layout.scss
diff --git a/app/assets/stylesheets/mixins/_mixins.scss b/administrate/app/assets/stylesheets/administrate/mixins/_mixins.scss
similarity index 100%
rename from app/assets/stylesheets/mixins/_mixins.scss
rename to administrate/app/assets/stylesheets/administrate/mixins/_mixins.scss
diff --git a/app/assets/stylesheets/mixins/_shadow.scss b/administrate/app/assets/stylesheets/administrate/mixins/_shadow.scss
similarity index 100%
rename from app/assets/stylesheets/mixins/_shadow.scss
rename to administrate/app/assets/stylesheets/administrate/mixins/_shadow.scss
diff --git a/administrate/app/controllers/administrate/application_controller.rb b/administrate/app/controllers/administrate/application_controller.rb
new file mode 100644
index 0000000000000000000000000000000000000000..032f2b70328f51c62e24377efea8097c78d0e03d
--- /dev/null
+++ b/administrate/app/controllers/administrate/application_controller.rb
@@ -0,0 +1,120 @@
+require "administrate/pages/form"
+require "administrate/pages/table"
+require "administrate/pages/show"
+
+module Administrate
+  class ApplicationController < ActionController::Base
+    def index
+      @resources = resource_class.all
+      @page = Administrate::Page::Table.new(dashboard)
+    end
+
+    def show
+      set_resource
+
+      @page = Administrate::Page::Show.new(dashboard, resource)
+    end
+
+    def new
+      @page = Administrate::Page::Form.new(dashboard, resource_class.new)
+    end
+
+    def edit
+      set_resource
+
+      @page = Administrate::Page::Form.new(dashboard, resource)
+    end
+
+    def create
+      set_resource(resource_class.new(resource_params))
+
+      if resource.save
+        redirect_to resource, notice: notices[:created]
+      else
+        @page = Administrate::Page::Form.new(dashboard, resource)
+        render :new
+      end
+    end
+
+    def update
+      set_resource
+
+      if resource.update(resource_params)
+        redirect_to resource, notice: notices[:updated]
+      else
+        @page = Administrate::Page::Form.new(dashboard, resource)
+        render :edit
+      end
+    end
+
+    def destroy
+      set_resource
+
+      resource.destroy
+      flash[:notice] = notices[:destroyed]
+      redirect_to action: :index
+    end
+
+    private
+
+    helper_method :link_class
+    def link_class(resource)
+      if resource_name.to_s.pluralize == resource.to_s
+        :active
+      end
+    end
+
+    def resource_class
+      Object.const_get(resource_class_name)
+    end
+
+    def dashboard
+      @dashboard ||= dashboard_class.new
+    end
+
+    def set_resource(resource = nil)
+      resource ||= resource_class.find(params[:id])
+      instance_variable_set(instance_variable, resource)
+    end
+
+    def resource
+      instance_variable_get(instance_variable)
+    end
+
+    def resource_params
+      params.require(:"#{resource_name}").permit(*permitted_attributes)
+    end
+
+    def permitted_attributes
+      dashboard.permitted_attributes
+    end
+
+    def dashboard_class
+      Object.const_get("#{resource_class_name}Dashboard")
+    end
+
+    def resource_class_name
+      resource_name.to_s.camelcase
+    end
+
+    def instance_variable
+      "@#{resource_name}"
+    end
+
+    def resource_title
+      resource_class_name.titleize
+    end
+
+    def notices
+      {
+        created: "#{resource_title} was successfully created.",
+        updated: "#{resource_title} was successfully updated.",
+        destroyed: "#{resource_title} was successfully destroyed.",
+      }
+    end
+
+    def resource_name
+      controller_name.singularize.to_sym
+    end
+  end
+end
diff --git a/administrate/app/helpers/administrate/application_helper.rb b/administrate/app/helpers/administrate/application_helper.rb
new file mode 100644
index 0000000000000000000000000000000000000000..6fcdde95306085989356124223645ffe98077d28
--- /dev/null
+++ b/administrate/app/helpers/administrate/application_helper.rb
@@ -0,0 +1,4 @@
+module Administrate
+  module ApplicationHelper
+  end
+end
diff --git a/administrate/app/views/administrate/application/_flashes.html.erb b/administrate/app/views/administrate/application/_flashes.html.erb
new file mode 100644
index 0000000000000000000000000000000000000000..fd9c3ccd13f8a6bbc2fb66cef6b5f44bebdbdc28
--- /dev/null
+++ b/administrate/app/views/administrate/application/_flashes.html.erb
@@ -0,0 +1,7 @@
+<% if flash.any? %>
+  <div id="flash">
+    <% flash.each do |key, value| -%>
+      <div class="flash-<%= key %>"><%= value %></div>
+    <% end -%>
+  </div>
+<% end %>
diff --git a/app/views/dashboard/_form.html.erb b/administrate/app/views/administrate/application/_form.html.erb
similarity index 100%
rename from app/views/dashboard/_form.html.erb
rename to administrate/app/views/administrate/application/_form.html.erb
diff --git a/administrate/app/views/administrate/application/_javascript.html.erb b/administrate/app/views/administrate/application/_javascript.html.erb
new file mode 100644
index 0000000000000000000000000000000000000000..56fa84ad7c360bcb4fe26ef3474b89bcd3cd90a8
--- /dev/null
+++ b/administrate/app/views/administrate/application/_javascript.html.erb
@@ -0,0 +1,10 @@
+<%= javascript_include_tag "administrate/application" %>
+
+<%= yield :javascript %>
+
+<% if Rails.env.test? %>
+  <%= javascript_tag do %>
+    $.fx.off = true;
+    $.ajaxSetup({ async: false });
+  <% end %>
+<% end %>
diff --git a/administrate/app/views/administrate/application/_sidebar.html.erb b/administrate/app/views/administrate/application/_sidebar.html.erb
new file mode 100644
index 0000000000000000000000000000000000000000..e5796d7e1668a15efa93c7fe85bd38f7b41b4ce5
--- /dev/null
+++ b/administrate/app/views/administrate/application/_sidebar.html.erb
@@ -0,0 +1,16 @@
+<ul class="sidebar-list">
+  <div class="sidebar-logo">
+    <%= image_tag "logo.svg" %>
+    <h1 class="sidebar-logo-heading">Administrate</h1>
+  </div>
+
+  <% DashboardManifest.new.dashboards.each do |resource| %>
+    <li>
+      <%= link_to(
+        resource.to_s.titleize,
+        resource,
+        class: link_class(resource)
+      ) %>
+    </li>
+  <% end %>
+</ul>
diff --git a/app/views/dashboard/_table.html.erb b/administrate/app/views/administrate/application/_table.html.erb
similarity index 100%
rename from app/views/dashboard/_table.html.erb
rename to administrate/app/views/administrate/application/_table.html.erb
diff --git a/app/views/dashboard/edit.html.erb b/administrate/app/views/administrate/application/edit.html.erb
similarity index 100%
rename from app/views/dashboard/edit.html.erb
rename to administrate/app/views/administrate/application/edit.html.erb
diff --git a/app/views/dashboard/index.html.erb b/administrate/app/views/administrate/application/index.html.erb
similarity index 100%
rename from app/views/dashboard/index.html.erb
rename to administrate/app/views/administrate/application/index.html.erb
diff --git a/app/views/dashboard/new.html.erb b/administrate/app/views/administrate/application/new.html.erb
similarity index 100%
rename from app/views/dashboard/new.html.erb
rename to administrate/app/views/administrate/application/new.html.erb
diff --git a/app/views/dashboard/show.html.erb b/administrate/app/views/administrate/application/show.html.erb
similarity index 100%
rename from app/views/dashboard/show.html.erb
rename to administrate/app/views/administrate/application/show.html.erb
diff --git a/app/views/fields/form/_belongs_to.html.erb b/administrate/app/views/fields/form/_belongs_to.html.erb
similarity index 100%
rename from app/views/fields/form/_belongs_to.html.erb
rename to administrate/app/views/fields/form/_belongs_to.html.erb
diff --git a/app/views/fields/form/_email.html.erb b/administrate/app/views/fields/form/_email.html.erb
similarity index 100%
rename from app/views/fields/form/_email.html.erb
rename to administrate/app/views/fields/form/_email.html.erb
diff --git a/app/views/fields/form/_has_many.html.erb b/administrate/app/views/fields/form/_has_many.html.erb
similarity index 100%
rename from app/views/fields/form/_has_many.html.erb
rename to administrate/app/views/fields/form/_has_many.html.erb
diff --git a/app/views/fields/form/_image.html.erb b/administrate/app/views/fields/form/_image.html.erb
similarity index 100%
rename from app/views/fields/form/_image.html.erb
rename to administrate/app/views/fields/form/_image.html.erb
diff --git a/app/views/fields/form/_string.html.erb b/administrate/app/views/fields/form/_string.html.erb
similarity index 100%
rename from app/views/fields/form/_string.html.erb
rename to administrate/app/views/fields/form/_string.html.erb
diff --git a/app/views/fields/index/_belongs_to.html.erb b/administrate/app/views/fields/index/_belongs_to.html.erb
similarity index 100%
rename from app/views/fields/index/_belongs_to.html.erb
rename to administrate/app/views/fields/index/_belongs_to.html.erb
diff --git a/app/views/fields/index/_email.html.erb b/administrate/app/views/fields/index/_email.html.erb
similarity index 100%
rename from app/views/fields/index/_email.html.erb
rename to administrate/app/views/fields/index/_email.html.erb
diff --git a/app/views/fields/index/_has_many.html.erb b/administrate/app/views/fields/index/_has_many.html.erb
similarity index 100%
rename from app/views/fields/index/_has_many.html.erb
rename to administrate/app/views/fields/index/_has_many.html.erb
diff --git a/app/views/fields/index/_image.html.erb b/administrate/app/views/fields/index/_image.html.erb
similarity index 100%
rename from app/views/fields/index/_image.html.erb
rename to administrate/app/views/fields/index/_image.html.erb
diff --git a/app/views/fields/index/_string.html.erb b/administrate/app/views/fields/index/_string.html.erb
similarity index 100%
rename from app/views/fields/index/_string.html.erb
rename to administrate/app/views/fields/index/_string.html.erb
diff --git a/app/views/fields/show/_belongs_to.html.erb b/administrate/app/views/fields/show/_belongs_to.html.erb
similarity index 100%
rename from app/views/fields/show/_belongs_to.html.erb
rename to administrate/app/views/fields/show/_belongs_to.html.erb
diff --git a/app/views/fields/show/_email.html.erb b/administrate/app/views/fields/show/_email.html.erb
similarity index 100%
rename from app/views/fields/show/_email.html.erb
rename to administrate/app/views/fields/show/_email.html.erb
diff --git a/app/views/fields/show/_has_many.html.erb b/administrate/app/views/fields/show/_has_many.html.erb
similarity index 100%
rename from app/views/fields/show/_has_many.html.erb
rename to administrate/app/views/fields/show/_has_many.html.erb
diff --git a/app/views/fields/show/_image.html.erb b/administrate/app/views/fields/show/_image.html.erb
similarity index 100%
rename from app/views/fields/show/_image.html.erb
rename to administrate/app/views/fields/show/_image.html.erb
diff --git a/app/views/fields/show/_string.html.erb b/administrate/app/views/fields/show/_string.html.erb
similarity index 100%
rename from app/views/fields/show/_string.html.erb
rename to administrate/app/views/fields/show/_string.html.erb
diff --git a/administrate/app/views/layouts/administrate/application.html.erb b/administrate/app/views/layouts/administrate/application.html.erb
new file mode 100644
index 0000000000000000000000000000000000000000..9b13de5e4283d7c6dee6b535a391262819005799
--- /dev/null
+++ b/administrate/app/views/layouts/administrate/application.html.erb
@@ -0,0 +1,28 @@
+<!DOCTYPE html>
+<html>
+<head>
+  <meta charset="utf-8" />
+  <meta name="ROBOTS" content="NOODP" />
+  <meta name="viewport" content="initial-scale=1" />
+  <title>Administrate</title>
+  <%= stylesheet_link_tag "//fonts.googleapis.com/css?family=Lato:300,400,900", media: "all" %>
+  <%= stylesheet_link_tag "administrate/application", media: "all" %>
+  <%= csrf_meta_tags %>
+</head>
+
+<body class="<%= body_class %>">
+  <main class="main">
+    <div class="sidebar">
+      <%= render "sidebar" -%>
+    </div>
+
+    <div class="content">
+      <%= render "flashes" -%>
+
+      <%= yield %>
+
+      <%= render "javascript" %>
+    </div>
+  </main>
+</body>
+</html>
diff --git a/administrate/bin/rails b/administrate/bin/rails
new file mode 100755
index 0000000000000000000000000000000000000000..98c954bef4915b40facfd07a370129d3a5e4c02a
--- /dev/null
+++ b/administrate/bin/rails
@@ -0,0 +1,12 @@
+#!/usr/bin/env ruby
+# This command will automatically be run when you run "rails" with Rails 4 gems installed from the root of your application.
+
+ENGINE_ROOT = File.expand_path('../..', __FILE__)
+ENGINE_PATH = File.expand_path('../../lib/administrate/engine', __FILE__)
+
+# Set up gems listed in the Gemfile.
+ENV['BUNDLE_GEMFILE'] ||= File.expand_path('../../Gemfile', __FILE__)
+require 'bundler/setup' if File.exist?(ENV['BUNDLE_GEMFILE'])
+
+require 'rails/all'
+require 'rails/engine/commands'
diff --git a/administrate/config/routes.rb b/administrate/config/routes.rb
new file mode 100644
index 0000000000000000000000000000000000000000..4e823e53a111beb197914dfb174da5418edbf872
--- /dev/null
+++ b/administrate/config/routes.rb
@@ -0,0 +1,2 @@
+Administrate::Engine.routes.draw do
+end
diff --git a/administrate/lib/administrate.rb b/administrate/lib/administrate.rb
new file mode 100644
index 0000000000000000000000000000000000000000..a31181102aa2bf624ec17b3d37640272a181c4d8
--- /dev/null
+++ b/administrate/lib/administrate.rb
@@ -0,0 +1,4 @@
+require "administrate/engine"
+
+module Administrate
+end
diff --git a/administrate/lib/administrate/base_dashboard.rb b/administrate/lib/administrate/base_dashboard.rb
new file mode 100644
index 0000000000000000000000000000000000000000..fdce961d2d3f32153c487eab93d39979de735a7b
--- /dev/null
+++ b/administrate/lib/administrate/base_dashboard.rb
@@ -0,0 +1,33 @@
+require "administrate/fields/belongs_to"
+require "administrate/fields/email"
+require "administrate/fields/has_many"
+require "administrate/fields/image"
+require "administrate/fields/string"
+
+module Administrate
+  class BaseDashboard
+    def permitted_attributes
+      form_attributes.map do |attr|
+        field_class(attr).permitted_attribute(attr)
+      end.uniq
+    end
+
+    def field_class(attr)
+      field_registry.fetch(attribute_types[attr])
+    end
+
+    private
+
+    def field_registry
+      {
+        belongs_to: Administrate::Field::BelongsTo,
+        datetime: Administrate::Field::String,
+        email: Administrate::Field::Email,
+        has_many: Administrate::Field::HasMany,
+        image: Administrate::Field::Image,
+        integer: Administrate::Field::String,
+        string: Administrate::Field::String,
+      }
+    end
+  end
+end
diff --git a/administrate/lib/administrate/engine.rb b/administrate/lib/administrate/engine.rb
new file mode 100644
index 0000000000000000000000000000000000000000..d83e10385c952fb43a178b94d906757d6c0d8e77
--- /dev/null
+++ b/administrate/lib/administrate/engine.rb
@@ -0,0 +1,7 @@
+require "neat"
+
+module Administrate
+  class Engine < ::Rails::Engine
+    isolate_namespace Administrate
+  end
+end
diff --git a/administrate/lib/administrate/fields/base.rb b/administrate/lib/administrate/fields/base.rb
new file mode 100644
index 0000000000000000000000000000000000000000..330b2de915449f143d53fa7102860cab64996929
--- /dev/null
+++ b/administrate/lib/administrate/fields/base.rb
@@ -0,0 +1,31 @@
+module Administrate
+  module Field
+    class Base
+      def initialize(attribute, data, page)
+        @attribute = attribute
+        @data = data
+        @page = page
+      end
+
+      def self.permitted_attribute(attr)
+        attr
+      end
+
+      def name
+        attribute.to_s
+      end
+
+      def to_partial_path
+        "/fields/#{page}/#{field_name}"
+      end
+
+      attr_reader :attribute, :data, :page
+
+      protected
+
+      def field_name
+        self.class.to_s.split("::").last.underscore
+      end
+    end
+  end
+end
diff --git a/administrate/lib/administrate/fields/belongs_to.rb b/administrate/lib/administrate/fields/belongs_to.rb
new file mode 100644
index 0000000000000000000000000000000000000000..f23aef55f55256acdb5ccca7362aec0f412a13f4
--- /dev/null
+++ b/administrate/lib/administrate/fields/belongs_to.rb
@@ -0,0 +1,19 @@
+require_relative "base"
+
+module Administrate
+  module Field
+    class BelongsTo < Field::Base
+      def self.permitted_attribute(attr)
+        :"#{attr}_id"
+      end
+
+      def permitted_attribute
+        self.class.permitted_attribute(attribute)
+      end
+
+      def candidate_records
+        Object.const_get(attribute.to_s.camelcase).all
+      end
+    end
+  end
+end
diff --git a/administrate/lib/administrate/fields/email.rb b/administrate/lib/administrate/fields/email.rb
new file mode 100644
index 0000000000000000000000000000000000000000..5d4d100fbfc7b625430a46571183151140ac8518
--- /dev/null
+++ b/administrate/lib/administrate/fields/email.rb
@@ -0,0 +1,8 @@
+require_relative "base"
+
+module Administrate
+  module Field
+    class Email < Field::Base
+    end
+  end
+end
diff --git a/administrate/lib/administrate/fields/has_many.rb b/administrate/lib/administrate/fields/has_many.rb
new file mode 100644
index 0000000000000000000000000000000000000000..2830288b4cfc2a90b881f241bbc2eecc9c8f1b0f
--- /dev/null
+++ b/administrate/lib/administrate/fields/has_many.rb
@@ -0,0 +1,38 @@
+require_relative "base"
+require "administrate/pages/table"
+
+module Administrate
+  module Field
+    class HasMany < Field::Base
+      def associated_table
+        Administrate::Page::Table.new(associated_dashboard)
+      end
+
+      def self.permitted_attribute(attribute)
+        { "#{attribute.to_s.singularize}_ids".to_sym => [] }
+      end
+
+      def permitted_attribute
+        self.class.permitted_attribute(attribute)
+      end
+
+      def attribute_key
+        permitted_attribute.keys.first
+      end
+
+      def candidate_records
+        Object.const_get(resource_class_name).all
+      end
+
+      private
+
+      def associated_dashboard
+        Object.const_get("#{resource_class_name}Dashboard").new
+      end
+
+      def resource_class_name
+        attribute.to_s.singularize.camelcase
+      end
+    end
+  end
+end
diff --git a/administrate/lib/administrate/fields/image.rb b/administrate/lib/administrate/fields/image.rb
new file mode 100644
index 0000000000000000000000000000000000000000..3589634926f201f0983fef82d0cf17d5f0483aed
--- /dev/null
+++ b/administrate/lib/administrate/fields/image.rb
@@ -0,0 +1,8 @@
+require_relative "base"
+
+module Administrate
+  module Field
+    class Image < Field::Base
+    end
+  end
+end
diff --git a/administrate/lib/administrate/fields/string.rb b/administrate/lib/administrate/fields/string.rb
new file mode 100644
index 0000000000000000000000000000000000000000..662735728e70a28b916283245ae61c779caf18b2
--- /dev/null
+++ b/administrate/lib/administrate/fields/string.rb
@@ -0,0 +1,8 @@
+require_relative "base"
+
+module Administrate
+  module Field
+    class String < Field::Base
+    end
+  end
+end
diff --git a/administrate/lib/administrate/pages/base.rb b/administrate/lib/administrate/pages/base.rb
new file mode 100644
index 0000000000000000000000000000000000000000..708e802109afd3cf58002604e8dd5a29320cdfd9
--- /dev/null
+++ b/administrate/lib/administrate/pages/base.rb
@@ -0,0 +1,28 @@
+module Administrate
+  module Page
+    class Base
+      def initialize(dashboard)
+        @dashboard = dashboard
+      end
+
+      def resource_name
+        @resource_name ||=
+          dashboard.class.to_s.scan(/(.+)Dashboard/).first.first.underscore
+      end
+
+      protected
+
+      def attribute_field(dashboard, resource, attribute_name, page)
+        value = resource.public_send(attribute_name)
+
+        dashboard.
+          field_class(attribute_name).
+          new(attribute_name, value, page)
+      end
+
+      protected
+
+      attr_reader :dashboard
+    end
+  end
+end
diff --git a/administrate/lib/administrate/pages/form.rb b/administrate/lib/administrate/pages/form.rb
new file mode 100644
index 0000000000000000000000000000000000000000..1b5bfdaee0ff2acc1b14a31c6144954f93f21cbc
--- /dev/null
+++ b/administrate/lib/administrate/pages/form.rb
@@ -0,0 +1,28 @@
+require_relative "base"
+
+module Administrate
+  module Page
+    class Form < Page::Base
+      def initialize(dashboard, resource)
+        super(dashboard)
+        @resource = resource
+      end
+
+      attr_reader :resource
+
+      def attributes
+        dashboard.form_attributes.map do |attribute|
+          attribute_field(dashboard, resource, attribute, :form)
+        end
+      end
+
+      def page_title
+        resource.to_s
+      end
+
+      protected
+
+      attr_reader :dashboard
+    end
+  end
+end
diff --git a/administrate/lib/administrate/pages/show.rb b/administrate/lib/administrate/pages/show.rb
new file mode 100644
index 0000000000000000000000000000000000000000..d2ef938c5971288dcb44a1950c44f29f77bbde50
--- /dev/null
+++ b/administrate/lib/administrate/pages/show.rb
@@ -0,0 +1,24 @@
+require_relative "base"
+
+module Administrate
+  module Page
+    class Show < Page::Base
+      def initialize(dashboard, resource)
+        super(dashboard)
+        @resource = resource
+      end
+
+      attr_reader :resource
+
+      def page_title
+        resource.to_s
+      end
+
+      def attributes
+        dashboard.show_page_attributes.map do |attr_name|
+          attribute_field(dashboard, resource, attr_name, :show)
+        end
+      end
+    end
+  end
+end
diff --git a/administrate/lib/administrate/pages/table.rb b/administrate/lib/administrate/pages/table.rb
new file mode 100644
index 0000000000000000000000000000000000000000..0fec66d499947a84ab4ed510542e600567e89a21
--- /dev/null
+++ b/administrate/lib/administrate/pages/table.rb
@@ -0,0 +1,21 @@
+require_relative "base"
+
+module Administrate
+  module Page
+    class Table < Page::Base
+      def attribute_names
+        dashboard.table_attributes
+      end
+
+      def attributes_for(resource)
+        attribute_names.map do |attr_name|
+          attribute_field(dashboard, resource, attr_name, :index)
+        end
+      end
+
+      def to_partial_path
+        "/dashboard/table"
+      end
+    end
+  end
+end
diff --git a/administrate/lib/administrate/version.rb b/administrate/lib/administrate/version.rb
new file mode 100644
index 0000000000000000000000000000000000000000..b610831ac16fb914d776c307696472ae0a603b55
--- /dev/null
+++ b/administrate/lib/administrate/version.rb
@@ -0,0 +1,3 @@
+module Administrate
+  VERSION = "0.0.1"
+end
diff --git a/administrate/lib/tasks/administrate_tasks.rake b/administrate/lib/tasks/administrate_tasks.rake
new file mode 100644
index 0000000000000000000000000000000000000000..8541acdbd65bf33b61e90be4f20712b23a685656
--- /dev/null
+++ b/administrate/lib/tasks/administrate_tasks.rake
@@ -0,0 +1,4 @@
+# desc "Explaining what the task does"
+# task :administrate do
+#   # Task goes here
+# end
diff --git a/app/assets/stylesheets/application.css b/app/assets/stylesheets/application.css
new file mode 100644
index 0000000000000000000000000000000000000000..f9cd5b34830b8b6fc6c33449c2dd0b32c6b79d85
--- /dev/null
+++ b/app/assets/stylesheets/application.css
@@ -0,0 +1,15 @@
+/*
+ * This is a manifest file that'll be compiled into application.css, which will include all the files
+ * listed below.
+ *
+ * Any CSS and SCSS file within this directory, lib/assets/stylesheets, vendor/assets/stylesheets,
+ * or any plugin's vendor/assets/stylesheets directory can be referenced here using a relative path.
+ *
+ * You're free to add application-wide styles to this file and they'll appear at the bottom of the
+ * compiled file so the styles you add here take precedence over styles defined in any styles
+ * defined in the other CSS/SCSS files in this directory. It is generally better to create a new
+ * file per style scope.
+ *
+ *= require_tree .
+ *= require_self
+ */
diff --git a/app/assets/stylesheets/refills/_flashes.scss b/app/assets/stylesheets/refills/_flashes.scss
deleted file mode 100644
index a78b46a7245a01eca6ce1810f87524610d5ae795..0000000000000000000000000000000000000000
--- a/app/assets/stylesheets/refills/_flashes.scss
+++ /dev/null
@@ -1,40 +0,0 @@
-$base-spacing: 1.5em !default;
-$alert-color: #fff6bf !default;
-$error-color: #fbe3e4 !default;
-$notice-color: #e5edf8 !default;
-$success-color: #e6efc2 !default;
-
-@mixin flash($color) {
-  background-color: $color;
-  color: darken($color, 60%);
-  display: block;
-  font-weight: 600;
-  margin-bottom: $base-spacing / 2;
-  padding: $base-spacing / 2;
-  text-align: center;
-
-  a {
-    color: darken($color, 70%);
-
-    &:focus,
-    &:hover {
-      color: darken($color, 90%);
-    }
-  }
-}
-
-.flash-alert {
-  @include flash($alert-color);
-}
-
-.flash-error {
-  @include flash($error-color);
-}
-
-.flash-notice {
-  @include flash($notice-color);
-}
-
-.flash-success {
-  @include flash($success-color);
-}
diff --git a/app/controllers/customers_controller.rb b/app/controllers/customers_controller.rb
index 3ed8e198f4c6fb468909578e90450955854251a3..bcd93fd7c8e02cd27279d62d8ce95d4ab0579cd3 100644
--- a/app/controllers/customers_controller.rb
+++ b/app/controllers/customers_controller.rb
@@ -1,2 +1,2 @@
-class CustomersController < DashboardController
+class CustomersController < Administrate::ApplicationController
 end
diff --git a/app/controllers/dashboard_controller.rb b/app/controllers/dashboard_controller.rb
deleted file mode 100644
index 6c8149bb17d26497a896f76696cf3799c19987bf..0000000000000000000000000000000000000000
--- a/app/controllers/dashboard_controller.rb
+++ /dev/null
@@ -1,117 +0,0 @@
-require "pages/form"
-require "pages/table"
-require "pages/show"
-
-class DashboardController < ApplicationController
-  def index
-    @resources = resource_class.all
-    @page = Page::Table.new(dashboard)
-  end
-
-  def show
-    set_resource(resource_class.find(params[:id]))
-
-    @page = Page::Show.new(dashboard, resource)
-  end
-
-  def new
-    @page = Page::Form.new(dashboard, resource_class.new)
-  end
-
-  def edit
-    set_resource(resource_class.find(params[:id]))
-
-    @page = Page::Form.new(dashboard, resource)
-  end
-
-  def create
-    set_resource(resource_class.new(resource_params))
-
-    if resource.save
-      redirect_to resource, notice: notices[:created]
-    else
-      @page = Page::Form.new(dashboard, resource)
-      render :new
-    end
-  end
-
-  def update
-    set_resource(resource_class.find(params[:id]))
-
-    if resource.update(resource_params)
-      redirect_to resource, notice: notices[:updated]
-    else
-      @page = Page::Form.new(dashboard, resource)
-      render :edit
-    end
-  end
-
-  def destroy
-    set_resource(resource_class.find(params[:id]))
-
-    resource.destroy
-    flash[:notice] = notices[:destroyed]
-    redirect_to action: :index
-  end
-
-  private
-
-  helper_method :link_class
-  def link_class(resource)
-    if resource_name.to_s.pluralize == resource.to_s
-      :active
-    end
-  end
-
-  def resource_class
-    Object.const_get(resource_class_name)
-  end
-
-  def dashboard
-    @dashboard ||= dashboard_class.new
-  end
-
-  def set_resource(value)
-    instance_variable_set(instance_variable, value)
-  end
-
-  def resource
-    instance_variable_get(instance_variable)
-  end
-
-  def resource_params
-    params.require(:"#{resource_name}").permit(*permitted_attributes)
-  end
-
-  def permitted_attributes
-    dashboard.permitted_attributes
-  end
-
-  def dashboard_class
-    Object.const_get("#{resource_class_name}Dashboard")
-  end
-
-  def resource_class_name
-    resource_name.to_s.camelcase
-  end
-
-  def instance_variable
-    "@#{resource_name}"
-  end
-
-  def resource_title
-    resource_class_name.titleize
-  end
-
-  def notices
-    {
-      created: "#{resource_title} was successfully created.",
-      updated: "#{resource_title} was successfully updated.",
-      destroyed: "#{resource_title} was successfully destroyed.",
-    }
-  end
-
-  def resource_name
-    controller_name.singularize.to_sym
-  end
-end
diff --git a/app/controllers/line_items_controller.rb b/app/controllers/line_items_controller.rb
index 426e8c3a2ecc7dd758499b45d055ba765b600600..d95e9cbdfa7a7aa1d1f4e598712868c1d6d3024e 100644
--- a/app/controllers/line_items_controller.rb
+++ b/app/controllers/line_items_controller.rb
@@ -1,2 +1,2 @@
-class LineItemsController < DashboardController
+class LineItemsController < Administrate::ApplicationController
 end
diff --git a/app/controllers/orders_controller.rb b/app/controllers/orders_controller.rb
index a7807ce3a82a5559a949498dca747da3bff27abc..62079cc6c8cad6b0ffa1cc5f89dd4c091a06cd2d 100644
--- a/app/controllers/orders_controller.rb
+++ b/app/controllers/orders_controller.rb
@@ -1,2 +1,2 @@
-class OrdersController < DashboardController
+class OrdersController < Administrate::ApplicationController
 end
diff --git a/app/controllers/products_controller.rb b/app/controllers/products_controller.rb
index d6d3aafbda7e12917b467956e0011e28bb1193d3..4d5b33879d7cd66ea42b09196dede9b24d2cd1a3 100644
--- a/app/controllers/products_controller.rb
+++ b/app/controllers/products_controller.rb
@@ -1,2 +1,2 @@
-class ProductsController < DashboardController
+class ProductsController < Administrate::ApplicationController
 end
diff --git a/app/dashboards/customer_dashboard.rb b/app/dashboards/customer_dashboard.rb
index 6564956c48f9dd06af8669aa0f498be5a5fc154c..25f7993d90a102232d1fd749073093d4aec93809 100644
--- a/app/dashboards/customer_dashboard.rb
+++ b/app/dashboards/customer_dashboard.rb
@@ -1,6 +1,6 @@
-require "base_dashboard"
+require "administrate/base_dashboard"
 
-class CustomerDashboard < BaseDashboard
+class CustomerDashboard < Administrate::BaseDashboard
   def attribute_types
     {
       created_at: :datetime,
diff --git a/app/dashboards/line_item_dashboard.rb b/app/dashboards/line_item_dashboard.rb
index 4a5be1f8b78d86c1da89c74958d4e706907fc7d4..1f23c13cac4f407ab25a1ceb22dcafa8b84e4e70 100644
--- a/app/dashboards/line_item_dashboard.rb
+++ b/app/dashboards/line_item_dashboard.rb
@@ -1,6 +1,6 @@
-require "base_dashboard"
+require "administrate/base_dashboard"
 
-class LineItemDashboard < BaseDashboard
+class LineItemDashboard < Administrate::BaseDashboard
   def table_attributes
     attributes + [:total_price]
   end
diff --git a/app/dashboards/order_dashboard.rb b/app/dashboards/order_dashboard.rb
index a1e30c02e6c7ea56cafe70ec9caf1ee693d99288..070b95619fba18185ae2374db5e42008e9f30ede 100644
--- a/app/dashboards/order_dashboard.rb
+++ b/app/dashboards/order_dashboard.rb
@@ -1,6 +1,6 @@
-require "base_dashboard"
+require "administrate/base_dashboard"
 
-class OrderDashboard < BaseDashboard
+class OrderDashboard < Administrate::BaseDashboard
   def attribute_types
     {
       id: :string,
diff --git a/app/dashboards/product_dashboard.rb b/app/dashboards/product_dashboard.rb
index d8e6728a1cb89c006b51e3db5a2be8dba509e846..a93cfa9bd8de809d439db8ce66a9af7f090e5443 100644
--- a/app/dashboards/product_dashboard.rb
+++ b/app/dashboards/product_dashboard.rb
@@ -1,6 +1,6 @@
-require "base_dashboard"
+require "administrate/base_dashboard"
 
-class ProductDashboard < BaseDashboard
+class ProductDashboard < Administrate::BaseDashboard
   def attribute_types
     {
       description: :string,
diff --git a/app/views/application/_javascript.html.erb b/app/views/application/_javascript.html.erb
index a738f79975a910a21ad14a203e1265c47605770a..56fa84ad7c360bcb4fe26ef3474b89bcd3cd90a8 100644
--- a/app/views/application/_javascript.html.erb
+++ b/app/views/application/_javascript.html.erb
@@ -1,9 +1,7 @@
-<%= javascript_include_tag :application %>
+<%= javascript_include_tag "administrate/application" %>
 
 <%= yield :javascript %>
 
-<%= render "analytics" %>
-
 <% if Rails.env.test? %>
   <%= javascript_tag do %>
     $.fx.off = true;
diff --git a/app/views/refills/_flashes.html.erb b/app/views/refills/_flashes.html.erb
deleted file mode 100644
index 2152e05e7c89b1e9aaf9279170d6bb570a6adf8e..0000000000000000000000000000000000000000
--- a/app/views/refills/_flashes.html.erb
+++ /dev/null
@@ -1,15 +0,0 @@
-<div class="flash-success">
-  <span>This is a success message <a href="#">with a link</a></span>
-</div>
-
-<div class="flash-error">
-  <span>This is an error message <a href="#">with a link</a></span>
-</div>
-
-<div class="flash-notice">
-  <span>This is an notice message <a href="#">with a link</a></span>
-</div>
-
-<div class="flash-alert">
-  <span>This is an alert message <a href="#">with a link</a></span>
-</div>
diff --git a/config/i18n-tasks.yml b/config/i18n-tasks.yml
index 49e85e35f71456ac69d2fcb7d429892fadccb880..d8b2314e1cf55ed03d3d732803a99091238d91b8 100644
--- a/config/i18n-tasks.yml
+++ b/config/i18n-tasks.yml
@@ -11,6 +11,7 @@ data:
 
 ignore_unused:
   - activerecord.*
+  - administrate.*
   - date.*
   - simple_form.*
   - time.*
diff --git a/lib/base_dashboard.rb b/lib/base_dashboard.rb
deleted file mode 100644
index aa252342b9fe7281f71282526abca09429942bd4..0000000000000000000000000000000000000000
--- a/lib/base_dashboard.rb
+++ /dev/null
@@ -1,31 +0,0 @@
-require "fields/belongs_to"
-require "fields/email"
-require "fields/has_many"
-require "fields/image"
-require "fields/string"
-
-class BaseDashboard
-  def permitted_attributes
-    form_attributes.map do |attr|
-      field_class(attr).permitted_attribute(attr)
-    end.uniq
-  end
-
-  def field_class(attr)
-    field_registry.fetch(attribute_types[attr])
-  end
-
-  private
-
-  def field_registry
-    {
-      belongs_to: Field::BelongsTo,
-      datetime: Field::String,
-      email: Field::Email,
-      has_many: Field::HasMany,
-      image: Field::Image,
-      integer: Field::String,
-      string: Field::String,
-    }
-  end
-end
diff --git a/lib/fields/base.rb b/lib/fields/base.rb
deleted file mode 100644
index 0bac06f752036e9d78bdbbe48cf90a9602363070..0000000000000000000000000000000000000000
--- a/lib/fields/base.rb
+++ /dev/null
@@ -1,29 +0,0 @@
-module Field
-  class Base
-    def initialize(attribute, data, page)
-      @attribute = attribute
-      @data = data
-      @page = page
-    end
-
-    def self.permitted_attribute(attr)
-      attr
-    end
-
-    def name
-      attribute.to_s
-    end
-
-    def to_partial_path
-      "/fields/#{page}/#{field_name}"
-    end
-
-    attr_reader :attribute, :data, :page
-
-    protected
-
-    def field_name
-      self.class.to_s.split("::").last.underscore
-    end
-  end
-end
diff --git a/lib/fields/belongs_to.rb b/lib/fields/belongs_to.rb
deleted file mode 100644
index b4ce3018abdaffb3c98e3793522c9bef8cec56b8..0000000000000000000000000000000000000000
--- a/lib/fields/belongs_to.rb
+++ /dev/null
@@ -1,17 +0,0 @@
-require_relative "base"
-
-module Field
-  class BelongsTo < Field::Base
-    def self.permitted_attribute(attr)
-      :"#{attr}_id"
-    end
-
-    def permitted_attribute
-      self.class.permitted_attribute(attribute)
-    end
-
-    def candidate_records
-      Object.const_get(attribute.to_s.camelcase).all
-    end
-  end
-end
diff --git a/lib/fields/email.rb b/lib/fields/email.rb
deleted file mode 100644
index f186391571057a8e2afd15cbf3e82b44cb654440..0000000000000000000000000000000000000000
--- a/lib/fields/email.rb
+++ /dev/null
@@ -1,6 +0,0 @@
-require_relative "base"
-
-module Field
-  class Email < Field::Base
-  end
-end
diff --git a/lib/fields/has_many.rb b/lib/fields/has_many.rb
deleted file mode 100644
index 44a59fc198c0213e94a1abb2559f5c6317b17604..0000000000000000000000000000000000000000
--- a/lib/fields/has_many.rb
+++ /dev/null
@@ -1,36 +0,0 @@
-require_relative "base"
-require "pages/table"
-
-module Field
-  class HasMany < Field::Base
-    def associated_table
-      Page::Table.new(associated_dashboard)
-    end
-
-    def self.permitted_attribute(attribute)
-      { "#{attribute.to_s.singularize}_ids".to_sym => [] }
-    end
-
-    def permitted_attribute
-      self.class.permitted_attribute(attribute)
-    end
-
-    def attribute_key
-      permitted_attribute.keys.first
-    end
-
-    def candidate_records
-      Object.const_get(resource_class_name).all
-    end
-
-    private
-
-    def associated_dashboard
-      Object.const_get("#{resource_class_name}Dashboard").new
-    end
-
-    def resource_class_name
-      attribute.to_s.singularize.camelcase
-    end
-  end
-end
diff --git a/lib/fields/image.rb b/lib/fields/image.rb
deleted file mode 100644
index c5ee1d746654374b5e4471920218de5620ef597d..0000000000000000000000000000000000000000
--- a/lib/fields/image.rb
+++ /dev/null
@@ -1,6 +0,0 @@
-require_relative "base"
-
-module Field
-  class Image < Field::Base
-  end
-end
diff --git a/lib/fields/string.rb b/lib/fields/string.rb
deleted file mode 100644
index 63fad164fc1b30047e9da02e4de719c27c584db9..0000000000000000000000000000000000000000
--- a/lib/fields/string.rb
+++ /dev/null
@@ -1,6 +0,0 @@
-require_relative "base"
-
-module Field
-  class String < Field::Base
-  end
-end
diff --git a/lib/generators/dashboard/USAGE b/lib/generators/administrate/dashboard/USAGE
similarity index 100%
rename from lib/generators/dashboard/USAGE
rename to lib/generators/administrate/dashboard/USAGE
diff --git a/lib/generators/administrate/dashboard/dashboard_generator.rb b/lib/generators/administrate/dashboard/dashboard_generator.rb
new file mode 100644
index 0000000000000000000000000000000000000000..db2c1382fa435dc754c31ecee920acf702a2b634
--- /dev/null
+++ b/lib/generators/administrate/dashboard/dashboard_generator.rb
@@ -0,0 +1,47 @@
+require "rails/generators/named_base"
+
+module Administrate
+  module Generators
+    class DashboardGenerator < Rails::Generators::NamedBase
+      source_root File.expand_path("../templates", __FILE__)
+
+      def create_dashboard_definition
+        template "dashboard.rb.erb", "app/dashboards/#{file_name}_dashboard.rb"
+      end
+
+      def create_resource_controller
+        template(
+          "controller.rb.erb",
+          "app/controllers/admin/#{file_name.pluralize}_controller.rb"
+        )
+      end
+
+      private
+
+      def attributes
+        klass.attribute_names + klass.reflections.keys
+      end
+
+      def field_type(attribute)
+        klass.type_for_attribute(attribute).type ||
+          association_type(attribute)
+      end
+
+      def association_type(attribute)
+        reflection = klass.reflections[attribute.to_s]
+        if reflection.collection?
+          :has_many
+        elsif reflection.belongs_to?
+          :belongs_to
+        else
+          throw "Unknown association type: #{reflection.inspect}\n" +
+            "Please open an issue on the Administrate repo."
+        end
+      end
+
+      def klass
+        @klass ||= Object.const_get(class_name)
+      end
+    end
+  end
+end
diff --git a/lib/generators/dashboard/templates/controller.rb.erb b/lib/generators/administrate/dashboard/templates/controller.rb.erb
similarity index 100%
rename from lib/generators/dashboard/templates/controller.rb.erb
rename to lib/generators/administrate/dashboard/templates/controller.rb.erb
diff --git a/lib/generators/dashboard/templates/dashboard.rb.erb b/lib/generators/administrate/dashboard/templates/dashboard.rb.erb
similarity index 100%
rename from lib/generators/dashboard/templates/dashboard.rb.erb
rename to lib/generators/administrate/dashboard/templates/dashboard.rb.erb
diff --git a/lib/generators/administrate/install/install_generator.rb b/lib/generators/administrate/install/install_generator.rb
new file mode 100644
index 0000000000000000000000000000000000000000..e82fe99a6153240a4ef2bb6659e07ef0627cd425
--- /dev/null
+++ b/lib/generators/administrate/install/install_generator.rb
@@ -0,0 +1,48 @@
+Rails.application.eager_load!
+require "rails/generators/base"
+
+module Administrate
+  module Generators
+    class InstallGenerator < Rails::Generators::Base
+      source_root File.expand_path("../templates", __FILE__)
+
+      def create_dashboard_controller
+        copy_file(
+          "dashboard_controller.rb",
+          "app/controllers/admin/dashboard_controller.rb"
+        )
+      end
+
+      def create_dashboard_manifest
+        template(
+          "dashboard_manifest.rb.erb",
+          "app/dashboards/dashboard_manifest.rb"
+        )
+      end
+
+      def insert_dashboard_routes
+        route(dashboard_routes)
+      end
+
+      private
+
+      def dashboard_resources
+        database_models.map do |model_class|
+          model_class.to_s.pluralize.underscore
+        end
+      end
+
+      def database_models
+        ActiveRecord::Base.descendants
+      end
+
+      def dashboard_routes
+        File.read(routes_file_path)
+      end
+
+      def routes_file_path
+        File.expand_path(find_in_source_paths("routes.rb"))
+      end
+    end
+  end
+end
diff --git a/lib/generators/install/templates/dashboard_controller.rb b/lib/generators/administrate/install/templates/dashboard_controller.rb
similarity index 80%
rename from lib/generators/install/templates/dashboard_controller.rb
rename to lib/generators/administrate/install/templates/dashboard_controller.rb
index 980d545558f0f009ef1a8803e29a22441dacc7a3..206571d007fcfcfac5846d0b24d1f12dcbe7b3bc 100644
--- a/lib/generators/install/templates/dashboard_controller.rb
+++ b/lib/generators/administrate/install/templates/dashboard_controller.rb
@@ -4,9 +4,7 @@
 #
 # If you want to add pagination or other controller-level concerns,
 # you're free to overwrite the RESTful controller actions.
-class Admin::DashboardController < ApplicationController
-  include Adminsitrate::RestActions
-
+class Admin::DashboardController < Administrate::ApplicationController
   before_filter :authenticate_admin
 
   def authenticate_admin
diff --git a/lib/generators/install/templates/dashboard_manifest.rb.erb b/lib/generators/administrate/install/templates/dashboard_manifest.rb.erb
similarity index 100%
rename from lib/generators/install/templates/dashboard_manifest.rb.erb
rename to lib/generators/administrate/install/templates/dashboard_manifest.rb.erb
diff --git a/lib/generators/install/templates/routes.rb b/lib/generators/administrate/install/templates/routes.rb
similarity index 100%
rename from lib/generators/install/templates/routes.rb
rename to lib/generators/administrate/install/templates/routes.rb
diff --git a/lib/generators/dashboard/dashboard_generator.rb b/lib/generators/dashboard/dashboard_generator.rb
deleted file mode 100644
index dcbbebb4e4bb13b4b2b36a3c9b8b51845c6250e2..0000000000000000000000000000000000000000
--- a/lib/generators/dashboard/dashboard_generator.rb
+++ /dev/null
@@ -1,41 +0,0 @@
-class DashboardGenerator < Rails::Generators::NamedBase
-  source_root File.expand_path("../templates", __FILE__)
-
-  def create_dashboard_definition
-    template "dashboard.rb.erb", "app/dashboards/#{file_name}_dashboard.rb"
-  end
-
-  def create_resource_controller
-    template(
-      "controller.rb.erb",
-      "app/controllers/admin/#{file_name.pluralize}_controller.rb"
-    )
-  end
-
-  private
-
-  def attributes
-    klass.attribute_names + klass.reflections.keys
-  end
-
-  def field_type(attribute)
-    klass.type_for_attribute(attribute).type ||
-      association_type(attribute)
-  end
-
-  def association_type(attribute)
-    reflection = klass.reflections[attribute.to_s]
-    if reflection.collection?
-      :has_many
-    elsif reflection.belongs_to?
-      :belongs_to
-    else
-      throw "Unknown association type: #{reflection.inspect}\n" +
-        "Please open an issue on the Administrate repo."
-    end
-  end
-
-  def klass
-    @klass ||= Object.const_get(class_name)
-  end
-end
diff --git a/lib/generators/install/install_generator.rb b/lib/generators/install/install_generator.rb
deleted file mode 100644
index 6b44b0f3069242253101ac0e1e8e2f8faa6ddc2c..0000000000000000000000000000000000000000
--- a/lib/generators/install/install_generator.rb
+++ /dev/null
@@ -1,43 +0,0 @@
-Rails.application.eager_load!
-
-class InstallGenerator < Rails::Generators::Base
-  source_root File.expand_path("../templates", __FILE__)
-
-  def create_dashboard_controller
-    copy_file(
-      "dashboard_controller.rb",
-      "app/controllers/admin/dashboard_controller.rb"
-    )
-  end
-
-  def create_dashboard_manifest
-    template(
-      "dashboard_manifest.rb.erb",
-      "app/dashboards/dashboard_manifest.rb"
-    )
-  end
-
-  def insert_dashboard_routes
-    route(dashboard_routes)
-  end
-
-  private
-
-  def dashboard_resources
-    database_models.map do |model_class|
-      model_class.to_s.pluralize.underscore
-    end
-  end
-
-  def database_models
-    ActiveRecord::Base.descendants
-  end
-
-  def dashboard_routes
-    File.read(routes_file_path)
-  end
-
-  def routes_file_path
-    File.expand_path(find_in_source_paths("routes.rb"))
-  end
-end
diff --git a/lib/pages/base.rb b/lib/pages/base.rb
deleted file mode 100644
index de53bf8461b28bb6ca3130a7e1747d71682bde5f..0000000000000000000000000000000000000000
--- a/lib/pages/base.rb
+++ /dev/null
@@ -1,26 +0,0 @@
-module Page
-  class Base
-    def initialize(dashboard)
-      @dashboard = dashboard
-    end
-
-    def resource_name
-      @resource_name ||=
-        dashboard.class.to_s.scan(/(.+)Dashboard/).first.first.underscore
-    end
-
-    protected
-
-    def attribute_field(dashboard, resource, attribute_name, page)
-      value = resource.public_send(attribute_name)
-
-      dashboard.
-        field_class(attribute_name).
-        new(attribute_name, value, page)
-    end
-
-    protected
-
-    attr_reader :dashboard
-  end
-end
diff --git a/lib/pages/form.rb b/lib/pages/form.rb
deleted file mode 100644
index eea67705090be3d2557fa532fe935116935c1e50..0000000000000000000000000000000000000000
--- a/lib/pages/form.rb
+++ /dev/null
@@ -1,26 +0,0 @@
-require_relative "base"
-
-module Page
-  class Form < Page::Base
-    def initialize(dashboard, resource)
-      super(dashboard)
-      @resource = resource
-    end
-
-    attr_reader :resource
-
-    def attributes
-      dashboard.form_attributes.map do |attribute|
-        attribute_field(dashboard, resource, attribute, :form)
-      end
-    end
-
-    def page_title
-      resource.to_s
-    end
-
-    protected
-
-    attr_reader :dashboard
-  end
-end
diff --git a/lib/pages/show.rb b/lib/pages/show.rb
deleted file mode 100644
index e224d8f711950e0ea728b9430c2bec986dc23abe..0000000000000000000000000000000000000000
--- a/lib/pages/show.rb
+++ /dev/null
@@ -1,22 +0,0 @@
-require_relative "base"
-
-module Page
-  class Show < Page::Base
-    def initialize(dashboard, resource)
-      super(dashboard)
-      @resource = resource
-    end
-
-    attr_reader :resource
-
-    def page_title
-      resource.to_s
-    end
-
-    def attributes
-      dashboard.show_page_attributes.map do |attr_name|
-        attribute_field(dashboard, resource, attr_name, :show)
-      end
-    end
-  end
-end
diff --git a/lib/pages/table.rb b/lib/pages/table.rb
deleted file mode 100644
index dc39bade18d250ce076c6751ab01b24239900dd6..0000000000000000000000000000000000000000
--- a/lib/pages/table.rb
+++ /dev/null
@@ -1,19 +0,0 @@
-require_relative "base"
-
-module Page
-  class Table < Page::Base
-    def attribute_names
-      dashboard.table_attributes
-    end
-
-    def attributes_for(resource)
-      attribute_names.map do |attr_name|
-        attribute_field(dashboard, resource, attr_name, :index)
-      end
-    end
-
-    def to_partial_path
-      "/dashboard/table"
-    end
-  end
-end
diff --git a/spec/controllers/customers_controller_spec.rb b/spec/controllers/customers_controller_spec.rb
index 246b7d16db91565a42e1915869509f5e79a4068a..eb206fd115c4454b97d52a6ab24f8bc1b545a66a 100644
--- a/spec/controllers/customers_controller_spec.rb
+++ b/spec/controllers/customers_controller_spec.rb
@@ -1,7 +1,6 @@
 require 'rails_helper'
 
-RSpec.describe CustomersController, type: :controller do
-
+describe CustomersController, type: :controller do
   describe "GET index" do
     it "assigns all customers as @resources" do
       customer = create(:customer)
@@ -26,7 +25,7 @@ RSpec.describe CustomersController, type: :controller do
     it "assigns a new form page object as @page" do
       get :new
 
-      expect(assigns(:page)).to be_instance_of(Page::Form)
+      expect(assigns(:page)).to be_instance_of(Administrate::Page::Form)
     end
   end
 
diff --git a/spec/dashboards/customer_dashboard_spec.rb b/spec/dashboards/customer_dashboard_spec.rb
index 4c36039bbb7906fad388527d05d7c1e09555000d..556f6c3b5a90398e7cac1c1276e495733504e081 100644
--- a/spec/dashboards/customer_dashboard_spec.rb
+++ b/spec/dashboards/customer_dashboard_spec.rb
@@ -1,6 +1,6 @@
 require "rails_helper"
 
-RSpec.describe CustomerDashboard do
+describe CustomerDashboard do
   describe "#table_attributes" do
     it "includes the name and email" do
       dashboard = CustomerDashboard.new
diff --git a/spec/generators/dashboard_generator_spec.rb b/spec/generators/dashboard_generator_spec.rb
index 92efd58776c5e60d25fd51b11a22daa541249174..946981dd3a0cb53deea3661ec8351b8d72c7e4c5 100644
--- a/spec/generators/dashboard_generator_spec.rb
+++ b/spec/generators/dashboard_generator_spec.rb
@@ -1,7 +1,7 @@
 require "rails_helper"
-require "generators/dashboard/dashboard_generator"
+require "generators/administrate/dashboard/dashboard_generator"
 
-describe DashboardGenerator, :generator do
+describe Administrate::Generators::DashboardGenerator, :generator do
   describe "dashboard definition file" do
     it "has valid syntax" do
       dashboard = file("app/dashboards/customer_dashboard.rb")
diff --git a/spec/generators/install_generator_spec.rb b/spec/generators/install_generator_spec.rb
index 901979568a78b12307aefc5cdddbdec01cb9fb4b..753b6d3eeaa5a1b051d432ab6dec6ea34b852aca 100644
--- a/spec/generators/install_generator_spec.rb
+++ b/spec/generators/install_generator_spec.rb
@@ -1,8 +1,8 @@
 require "spec_helper"
-require "generators/install/install_generator"
+require "generators/administrate/install/install_generator"
 require "support/generator_spec_helpers"
 
-describe InstallGenerator, :generator do
+describe Administrate::Generators::InstallGenerator, :generator do
   describe "dashboard_controller" do
     it "is copied to the application" do
       provide_existing_routes_file
@@ -13,7 +13,7 @@ describe InstallGenerator, :generator do
       expect(controller).to exist
       expect(controller).to have_correct_syntax
       expect(controller).to contain(
-        "class Admin::DashboardController < ApplicationController"
+        "class Admin::DashboardController < Administrate::ApplicationController"
       )
     end
   end
diff --git a/spec/lib/fields/belongs_to_spec.rb b/spec/lib/fields/belongs_to_spec.rb
index 00736001224ab22437c62455875ecb54607aae3c..001bfc6e907f5d88ab98d75fb68f9225f70326ed 100644
--- a/spec/lib/fields/belongs_to_spec.rb
+++ b/spec/lib/fields/belongs_to_spec.rb
@@ -1,12 +1,12 @@
 require "spec_helper"
-require "fields/belongs_to"
+require "administrate/fields/belongs_to"
 
-describe Field::BelongsTo do
+describe Administrate::Field::BelongsTo do
   describe "#to_partial_path" do
     it "returns a partial based on the page being rendered" do
       page = :show
       owner = double
-      field = Field::BelongsTo.new(:owner, owner, page)
+      field = Administrate::Field::BelongsTo.new(:owner, owner, page)
 
       path = field.to_partial_path
 
diff --git a/spec/lib/fields/email_spec.rb b/spec/lib/fields/email_spec.rb
index 879d87ff6cfe85a142dd86d33e097139bb57c0f3..9a6f0026bb0cfb8a480a9e1b4f42d024a805f7e9 100644
--- a/spec/lib/fields/email_spec.rb
+++ b/spec/lib/fields/email_spec.rb
@@ -1,11 +1,11 @@
 require "spec_helper"
-require "fields/email"
+require "administrate/fields/email"
 
-describe Field::Email do
+describe Administrate::Field::Email do
   describe "#to_partial_path" do
     it "returns a partial based on the page being rendered" do
       page = :show
-      field = Field::Email.new(:email, "foo@example.com", page)
+      field = Administrate::Field::Email.new(:email, "foo@example.com", page)
 
       path = field.to_partial_path
 
diff --git a/spec/lib/fields/has_many_spec.rb b/spec/lib/fields/has_many_spec.rb
index 640411f8c27fd713bcc4a3af86c004104d0dad9c..6b74773709413d20c94bcb2bffdf71a9b3be5929 100644
--- a/spec/lib/fields/has_many_spec.rb
+++ b/spec/lib/fields/has_many_spec.rb
@@ -1,12 +1,12 @@
 require "spec_helper"
-require "fields/has_many"
+require "administrate/fields/has_many"
 
-describe Field::HasMany do
+describe Administrate::Field::HasMany do
   describe "#to_partial_path" do
     it "returns a partial based on the page being rendered" do
       page = :show
       items = double
-      field = Field::HasMany.new(:items, items, page)
+      field = Administrate::Field::HasMany.new(:items, items, page)
 
       path = field.to_partial_path
 
@@ -17,11 +17,11 @@ describe Field::HasMany do
   describe "#associated_table" do
     it "returns an index page for the dashboard of the associated attribute" do
       orders = []
-      field = Field::HasMany.new(:orders, orders, :show)
+      field = Administrate::Field::HasMany.new(:orders, orders, :show)
 
       page = field.associated_table
 
-      expect(page).to be_instance_of(Page::Table)
+      expect(page).to be_instance_of(Administrate::Page::Table)
     end
   end
 end
diff --git a/spec/lib/fields/image_spec.rb b/spec/lib/fields/image_spec.rb
index a1dceb68acd19479b95d6167b2a8931484a5f297..a39d1c9bbb2860176578c2b0a95f59c85fccbb28 100644
--- a/spec/lib/fields/image_spec.rb
+++ b/spec/lib/fields/image_spec.rb
@@ -1,11 +1,11 @@
 require "spec_helper"
-require "fields/image"
+require "administrate/fields/image"
 
-describe Field::Image do
+describe Administrate::Field::Image do
   describe "#to_partial_path" do
     it "returns a partial based on the page being rendered" do
       page = :show
-      field = Field::Image.new(:image, "/a.jpg", page)
+      field = Administrate::Field::Image.new(:image, "/a.jpg", page)
 
       path = field.to_partial_path
 
diff --git a/spec/lib/fields/string_spec.rb b/spec/lib/fields/string_spec.rb
index ac9439ba068ffdcc50d7b6341ae644568a2dd686..188deecb893c8c2cc5423bc67bb3df497d6adc3b 100644
--- a/spec/lib/fields/string_spec.rb
+++ b/spec/lib/fields/string_spec.rb
@@ -1,11 +1,11 @@
 require "spec_helper"
-require "fields/string"
+require "administrate/fields/string"
 
-describe Field::String do
+describe Administrate::Field::String do
   describe "#to_partial_path" do
     it "returns a partial based on the page being rendered" do
       page = :show
-      field = Field::String.new(:string, "hello", page)
+      field = Administrate::Field::String.new(:string, "hello", page)
 
       path = field.to_partial_path
 
diff --git a/spec/lib/pages/form_spec.rb b/spec/lib/pages/form_spec.rb
index 4f518dfd497660387af267c835e1ba6dc4b050b9..d4a32c739235afe46b35b2ae1680a8c04b149521 100644
--- a/spec/lib/pages/form_spec.rb
+++ b/spec/lib/pages/form_spec.rb
@@ -1,10 +1,10 @@
-require "pages/form"
+require "administrate/pages/form"
 
-describe Page::Form do
+describe Administrate::Page::Form do
   describe "#page_title" do
     it "is the value of the resource's key attribute" do
       customer = double(to_s: "Worf")
-      page = Page::Form.new(CustomerDashboard.new, customer)
+      page = Administrate::Page::Form.new(CustomerDashboard.new, customer)
 
       expect(page.page_title).to eq("Worf")
     end
diff --git a/spec/lib/pages/show_spec.rb b/spec/lib/pages/show_spec.rb
index 731a64f0b7aacb18f3eb10d109524b0195ea3b1d..307880440e45d0963cadc0e06c551a043496639b 100644
--- a/spec/lib/pages/show_spec.rb
+++ b/spec/lib/pages/show_spec.rb
@@ -1,10 +1,10 @@
-require "pages/show"
+require "administrate/pages/show"
 
-describe Page::Show do
+describe Administrate::Page::Show do
   describe "#page_title" do
     it "is the stringified resource" do
       customer = double(to_s: "Worf")
-      page = Page::Show.new(CustomerDashboard.new, customer)
+      page = Administrate::Page::Show.new(CustomerDashboard.new, customer)
 
       expect(page.page_title).to eq("Worf")
     end
diff --git a/spec/lib/pages/table_spec.rb b/spec/lib/pages/table_spec.rb
index e1f925c0914ac1a2d8186f5020d2243ca1d16565..a7233ca22c1d358ec67980feb62e32f79d797861 100644
--- a/spec/lib/pages/table_spec.rb
+++ b/spec/lib/pages/table_spec.rb
@@ -1,4 +1,4 @@
-require "pages/table"
+require "administrate/pages/table"
 
-describe Page::Table do
+describe Administrate::Page::Table do
 end