diff --git a/app/views/spree/admin/countries/_form.html.erb b/app/views/spree/admin/countries/_form.html.erb
new file mode 100644
index 0000000000..347d5e6577
--- /dev/null
+++ b/app/views/spree/admin/countries/_form.html.erb
@@ -0,0 +1,22 @@
+
+
+
+ <%= f.label :name, Spree.t(:name) %>
+ <%= f.text_field :name, :class => 'fullwidth' %>
+
+
+
+
+ <%= f.label :iso_name, Spree.t(:iso_name) %>
+ <%= f.text_field :iso_name, :class => 'fullwidth' %>
+
+
+
+
+
+ <%= f.check_box :states_required %>
+ <%= Spree.t(:states_required) %>
+
+
+
+
\ No newline at end of file
diff --git a/app/views/spree/admin/countries/edit.html.erb b/app/views/spree/admin/countries/edit.html.erb
new file mode 100644
index 0000000000..d5f8fc27d1
--- /dev/null
+++ b/app/views/spree/admin/countries/edit.html.erb
@@ -0,0 +1,21 @@
+<%= render :partial => 'spree/admin/shared/configuration_menu' %>
+
+<% content_for :page_title do %>
+ <%= Spree.t(:editing_country) %>
+<% end %>
+
+<% content_for :page_actions do %>
+
+ <%= button_link_to Spree.t(:back_to_countries_list), spree.admin_countries_path, :icon => 'icon-arrow-left' %>
+
+<% end %>
+
+<%= render :partial => 'spree/shared/error_messages', :locals => { :target => @country } %>
+
+<%= form_for [:admin, @country] do |f| %>
+
+ <%= render :partial => 'form', :locals => { :f => f } %>
+
+ <%= render :partial => 'spree/admin/shared/edit_resource_links' %>
+
+<% end %>
diff --git a/app/views/spree/admin/countries/index.html.erb b/app/views/spree/admin/countries/index.html.erb
new file mode 100644
index 0000000000..2ad4c47956
--- /dev/null
+++ b/app/views/spree/admin/countries/index.html.erb
@@ -0,0 +1,34 @@
+<%= render :partial => 'spree/admin/shared/configuration_menu' %>
+
+<% content_for :page_title do %>
+ <%= Spree.t(:listing_countries) %>
+<% end %>
+
+
+
+
+
+
+
+
+
+
+ <%= Spree.t(:country_name) %>
+ <%= Spree.t(:iso_name) %>
+ <%= Spree.t(:states_required) %>
+
+
+
+
+ <% @countries.each do |country| %>
+
+ <%= country.name %>
+ <%= country.iso_name %>
+ <%= country.states_required.to_s.titleize %>
+
+ <%= link_to_edit country, :no_text => true %>
+
+
+ <% end %>
+
+
\ No newline at end of file
diff --git a/app/views/spree/admin/states/_form.html.erb b/app/views/spree/admin/states/_form.html.erb
new file mode 100644
index 0000000000..c9dff9e35c
--- /dev/null
+++ b/app/views/spree/admin/states/_form.html.erb
@@ -0,0 +1,14 @@
+
+
+ <%= f.field_container :name do %>
+ <%= f.label :name, Spree.t(:name) %>
+ <%= f.text_field :name, :class => 'fullwidth' %>
+ <% end %>
+
+
+ <%= f.field_container :abbr do %>
+ <%= f.label :abbr, Spree.t(:abbreviation) %>
+ <%= f.text_field :abbr, :class => 'fullwidth' %>
+ <% end %>
+
+
diff --git a/app/views/spree/admin/states/_state_list.html.erb b/app/views/spree/admin/states/_state_list.html.erb
new file mode 100644
index 0000000000..177921eadb
--- /dev/null
+++ b/app/views/spree/admin/states/_state_list.html.erb
@@ -0,0 +1,31 @@
+
+
+
+
+
+
+
+
+
+
+ <%= Spree.t(:name) %>
+ <%= Spree.t(:abbreviation) %>
+
+
+
+
+ <% @states.each do |state| %>
+
+ <%= state.name %>
+ <%= state.abbr %>
+
+ <%= link_to_with_icon 'icon-edit', Spree.t(:edit), edit_admin_country_state_url(@country, state), :no_text => true %>
+ <%= link_to_delete state, :no_text => true %>
+
+
+ <% end %>
+ <% if @states.empty? %>
+ <%= Spree.t(:none) %>
+ <% end %>
+
+
diff --git a/app/views/spree/admin/states/edit.html.erb b/app/views/spree/admin/states/edit.html.erb
new file mode 100644
index 0000000000..a83c9d0f5e
--- /dev/null
+++ b/app/views/spree/admin/states/edit.html.erb
@@ -0,0 +1,20 @@
+<%= render :partial => 'spree/admin/shared/configuration_menu' %>
+
+<% content_for :page_title do %>
+ <%= Spree.t(:editing_state) %> <%= @state.name %>
+<% end %>
+
+<% content_for :page_actions do %>
+
+ <%= button_link_to Spree.t(:back_to_states_list), spree.admin_country_states_url(@country), :icon => 'icon-arrow-left' %>
+
+<% end %>
+
+<%= render :partial => 'spree/shared/error_messages', :locals => { :target => @state } %>
+
+<%= form_for [:admin, @country, @state] do |f| %>
+
+ <%= render :partial => 'form', :locals => { :f => f } %>
+ <%= render :partial => 'spree/admin/shared/edit_resource_links' %>
+
+<% end %>
diff --git a/app/views/spree/admin/states/index.html.erb b/app/views/spree/admin/states/index.html.erb
new file mode 100644
index 0000000000..3eba92daea
--- /dev/null
+++ b/app/views/spree/admin/states/index.html.erb
@@ -0,0 +1,24 @@
+<%= render :partial => 'spree/admin/shared/configuration_menu' %>
+
+<% content_for :page_title do %>
+ <%= Spree.t(:states) %>
+<% end %>
+
+<% content_for :page_actions do %>
+
+ <%= button_link_to Spree.t(:new_state), new_admin_country_state_url(@country), { :remote => true, :icon => 'icon-plus', :id => 'new_state_link' } %>
+
+<% end %>
+
+
+ <%= label_tag :country, Spree.t(:country) %>
+
+ <%= options_from_collection_for_select(@countries, :id, :name, @country.id) %>
+
+
+
+<%= image_tag 'select2-spinner.gif', :plugin => 'spree', :style => 'display:none;', :id => 'busy_indicator' %>
+
+
+ <%= render :partial => 'state_list'%>
+
diff --git a/app/views/spree/admin/states/new.html.erb b/app/views/spree/admin/states/new.html.erb
new file mode 100644
index 0000000000..1db852502c
--- /dev/null
+++ b/app/views/spree/admin/states/new.html.erb
@@ -0,0 +1,15 @@
+<%= render :partial => 'spree/admin/shared/configuration_menu' %>
+
+<%= render :partial => 'spree/shared/error_messages', :locals => { :target => @state } %>
+
+<% content_for :page_title do %>
+ <%= Spree.t(:new_state) %>
+<% end %>
+
+<%= form_for [:admin, @country, @state] do |f| %>
+
+ <%= Spree.t(:new_state) %>
+ <%= render :partial => 'form', :locals => { :f => f } %>
+ <%= render :partial => 'spree/admin/shared/new_resource_links' %>
+
+<% end %>
diff --git a/app/views/spree/admin/states/new.js.erb b/app/views/spree/admin/states/new.js.erb
new file mode 100644
index 0000000000..4f8226e695
--- /dev/null
+++ b/app/views/spree/admin/states/new.js.erb
@@ -0,0 +1,2 @@
+$("#new_state").html("<%= escape_javascript(render :template => 'spree/admin/states/new', :formats => [:html], :handlers => [:erb]) %>");
+$("#new_state_link").parent().hide();
diff --git a/app/views/spree/admin/zones/_country_member.html.erb b/app/views/spree/admin/zones/_country_member.html.erb
new file mode 100644
index 0000000000..8294b5d151
--- /dev/null
+++ b/app/views/spree/admin/zones/_country_member.html.erb
@@ -0,0 +1,5 @@
+
+ <%= f.hidden_field :zoneable_type, :value => 'Spree::Country' %>
+ <%= f.collection_select(:zoneable_id, @countries, :id, :name, {:include_blank => true}, {:class => 'select2 fullwidth'}) %>
+ <%= remove_nested f %>
+
diff --git a/app/views/spree/admin/zones/_form.html.erb b/app/views/spree/admin/zones/_form.html.erb
new file mode 100644
index 0000000000..8d0d9886c3
--- /dev/null
+++ b/app/views/spree/admin/zones/_form.html.erb
@@ -0,0 +1,34 @@
+
+
+ <%= Spree.t(:general_settings)%>
+
+ <%= zone_form.field_container :name do %>
+ <%= zone_form.label :name, Spree.t(:name) %>
+ <%= zone_form.text_field :name, :class => 'fullwidth' %>
+ <% end %>
+
+ <%= zone_form.field_container :description do %>
+ <%= zone_form.label :description, Spree.t(:description) %>
+ <%= zone_form.text_field :description, :class => 'fullwidth' %>
+ <% end %>
+
+
+ <%= zone_form.check_box :default_tax %>
+ <%= label_tag Spree.t(:default_tax_zone) %>
+
+
+
+ <%= label_tag Spree.t(:type) %>
+
+
+ <%= zone_form.radio_button('kind', 'country', { :id => 'country_based' }) %>
+ <%= label_tag :country_based, Spree.t(:country_based) %>
+
+
+ <%= zone_form.radio_button('kind', 'state', { :id => 'state_based' }) %>
+ <%= label_tag :state_based, Spree.t(:state_based) %>
+
+
+
+
+
\ No newline at end of file
diff --git a/app/views/spree/admin/zones/_member_type.html.erb b/app/views/spree/admin/zones/_member_type.html.erb
new file mode 100644
index 0000000000..c28ca0e546
--- /dev/null
+++ b/app/views/spree/admin/zones/_member_type.html.erb
@@ -0,0 +1,19 @@
+<%= javascript_tag "var #{type}_member='#{generate_template(zone_form, :zone_members, {:partial => type + "_member"})}';" %>
+
+
+
+
+ <%= Spree.t(type) %>
+
+
+ <% members_of_type = zone_form.object.zone_members.select { |member| member.zoneable_type && member.zoneable_type == "Spree::#{type.camelize}" } %>
+ <%= zone_form.fields_for :zone_members, members_of_type do |member_form| %>
+ <%= render :partial => "#{type}_member", :locals => { :f => member_form } %>
+ <% end %>
+
+
+
+ <%= button_link_to Spree.t("add_#{type}"), "##{type}_member", { :icon => 'icon-plus', :id => "nested-#{type.dasherize}" } %>
+
+
+
diff --git a/app/views/spree/admin/zones/_state_member.html.erb b/app/views/spree/admin/zones/_state_member.html.erb
new file mode 100644
index 0000000000..28e2afe3b5
--- /dev/null
+++ b/app/views/spree/admin/zones/_state_member.html.erb
@@ -0,0 +1,5 @@
+
+ <%= f.hidden_field :zoneable_type, :value => 'Spree::State' %>
+ <%= f.collection_select(:zoneable_id, @states, :id, :name, {:include_blank => true}, {:class => 'select2 fullwidth'}) %>
+ <%= remove_nested f %>
+
diff --git a/app/views/spree/admin/zones/edit.html.erb b/app/views/spree/admin/zones/edit.html.erb
new file mode 100644
index 0000000000..2b0007b196
--- /dev/null
+++ b/app/views/spree/admin/zones/edit.html.erb
@@ -0,0 +1,23 @@
+<%= render :partial => 'spree/admin/shared/configuration_menu' %>
+
+<% content_for :page_title do %>
+ <%= Spree.t(:editing_zone) %>
+<% end %>
+
+<% content_for :page_actions do %>
+
+ <%= button_link_to Spree.t(:back_to_zones_list), admin_zones_path, :icon => 'icon-arrow-left' %>
+
+<% end %>
+
+<%= render :partial => 'spree/shared/error_messages', :locals => { :target => @zone } %>
+
+<%= form_for [:admin, @zone] do |zone_form| %>
+
+ <%= render :partial => 'form', :locals => { :zone_form => zone_form } %>
+ <%= render :partial => 'member_type', :locals => { :type => 'country', :zone_form => zone_form }%>
+ <%= render :partial => 'member_type', :locals => { :type => 'state', :zone_form => zone_form } %>
+
+ <%= render :partial => 'spree/admin/shared/edit_resource_links' %>
+
+<% end %>
diff --git a/app/views/spree/admin/zones/index.html.erb b/app/views/spree/admin/zones/index.html.erb
new file mode 100644
index 0000000000..19b081b19b
--- /dev/null
+++ b/app/views/spree/admin/zones/index.html.erb
@@ -0,0 +1,53 @@
+<%= render :partial => 'spree/admin/shared/configuration_menu' %>
+
+<% content_for :page_title do %>
+ <%= Spree.t(:zones) %>
+<% end %>
+
+<% content_for :page_actions do %>
+
+ <%= button_link_to Spree.t(:new_zone), new_object_url, :icon => 'icon-plus', :id => 'admin_new_zone_link' %>
+
+<% end %>
+
+<%= paginate @zones %>
+
+<% if @zones.empty? %>
+
+ <%= Spree.t(:none) %>
+
+<% else %>
+
+
+
+
+
+
+
+
+
+ <%= sort_link @search,:name, Spree.t(:name), :title => 'zones_order_by_name_title' %>
+
+ <%= sort_link @search,:description, Spree.t(:description), {}, {:title => 'zones_order_by_description_title'} %>
+
+ <%= Spree.t(:default_tax) %>
+
+
+
+
+ <% @zones.each do |zone| %>
+
+ <%=zone.name %>
+ <%=zone.description %>
+ <%=zone.default_tax %>
+
+ <%=link_to_edit zone, :no_text => true %>
+ <%=link_to_delete zone, :no_text => true %>
+
+
+ <% end %>
+
+
+<% end%>
+
+<%= paginate @zones %>
diff --git a/app/views/spree/admin/zones/new.html.erb b/app/views/spree/admin/zones/new.html.erb
new file mode 100644
index 0000000000..36c0c0a2e1
--- /dev/null
+++ b/app/views/spree/admin/zones/new.html.erb
@@ -0,0 +1,21 @@
+<%= render :partial => 'spree/admin/shared/configuration_menu' %>
+
+<% content_for :page_title do %>
+ <%= Spree.t(:new_zone) %>
+<% end %>
+
+<% content_for :page_actions do %>
+
+ <%= button_link_to Spree.t(:back_to_zones_list), spree.admin_zones_path, :icon => 'icon-arrow-left' %>
+
+<% end %>
+
+<%= render :partial => 'spree/shared/error_messages', :locals => { :target => @zone } %>
+
+<%= form_for [:admin, @zone] do |zone_form| %>
+ <%= render :partial => 'form', :locals => { :zone_form => zone_form } %>
+
+
+
+ <%= render :partial => 'spree/admin/shared/new_resource_links' %>
+<% end %>