diff --git a/app/controllers/application.rb b/app/controllers/application.rb
deleted file mode 100644
index 6d6338f..0000000
--- a/app/controllers/application.rb
+++ /dev/null
@@ -1,256 +0,0 @@
-# redMine - project management software
-# Copyright (C) 2006-2007  Jean-Philippe Lang
-#
-# This program is free software; you can redistribute it and/or
-# modify it under the terms of the GNU General Public License
-# as published by the Free Software Foundation; either version 2
-# of the License, or (at your option) any later version.
-# 
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-# GNU General Public License for more details.
-# 
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
-
-require 'uri'
-require 'cgi'
-
-class ApplicationController < ActionController::Base
-  include Redmine::I18n
-  
-  # In case the cookie store secret changes
-  rescue_from CGI::Session::CookieStore::TamperedWithCookie do |exception|
-    render :text => 'Your session was invalid and has been reset. Please, reload this page.', :status => 500
-  end
-  
-  layout 'base'
-  
-  before_filter :user_setup, :check_if_login_required, :set_localization
-  filter_parameter_logging :password
-  
-  include Redmine::MenuManager::MenuController
-  helper Redmine::MenuManager::MenuHelper
-  
-  REDMINE_SUPPORTED_SCM.each do |scm|
-    require_dependency "repository/#{scm.underscore}"
-  end
-  
-  def user_setup
-    # Check the settings cache for each request
-    Setting.check_cache
-    # Find the current user
-    User.current = find_current_user
-  end
-  
-  # Returns the current user or nil if no user is logged in
-  # and starts a session if needed
-  def find_current_user
-    if session[:user_id]
-      # existing session
-      (User.active.find(session[:user_id]) rescue nil)
-    elsif cookies[:autologin] && Setting.autologin?
-      # auto-login feature starts a new session
-      user = User.try_to_autologin(cookies[:autologin])
-      session[:user_id] = user.id if user
-      user
-    elsif params[:format] == 'atom' && params[:key] && accept_key_auth_actions.include?(params[:action])
-      # RSS key authentication does not start a session
-      User.find_by_rss_key(params[:key])
-    end
-  end
-  
-  # Sets the logged in user
-  def logged_user=(user)
-    if user && user.is_a?(User)
-      User.current = user
-      session[:user_id] = user.id
-    else
-      User.current = User.anonymous
-      session[:user_id] = nil
-    end
-  end
-  
-  # check if login is globally required to access the application
-  def check_if_login_required
-    # no check needed if user is already logged in
-    return true if User.current.logged?
-    require_login if Setting.login_required?
-  end 
-  
-  def set_localization
-    lang = nil
-    if User.current.logged?
-      lang = find_language(User.current.language)
-    end
-    if lang.nil? && request.env['HTTP_ACCEPT_LANGUAGE']
-      accept_lang = parse_qvalues(request.env['HTTP_ACCEPT_LANGUAGE']).first.downcase
-      if !accept_lang.blank?
-        lang = find_language(accept_lang) || find_language(accept_lang.split('-').first)
-      end
-    end
-    lang ||= Setting.default_language
-    set_language_if_valid(lang)
-  end
-  
-  def require_login
-    if !User.current.logged?
-      redirect_to :controller => "account", :action => "login", :back_url => url_for(params)
-      return false
-    end
-    true
-  end
-
-  def require_admin
-    return unless require_login
-    if !User.current.admin?
-      render_403
-      return false
-    end
-    true
-  end
-  
-  def deny_access
-    User.current.logged? ? render_403 : require_login
-  end
-
-  # Authorize the user for the requested action
-  def authorize(ctrl = params[:controller], action = params[:action], global = false)
-    allowed = User.current.allowed_to?({:controller => ctrl, :action => action}, @project, :global => global)
-    allowed ? true : deny_access
-  end
-
-  # Authorize the user for the requested action outside a project
-  def authorize_global(ctrl = params[:controller], action = params[:action], global = true)
-    authorize(ctrl, action, global)
-  end
-  
-  # make sure that the user is a member of the project (or admin) if project is private
-  # used as a before_filter for actions that do not require any particular permission on the project
-  def check_project_privacy
-    if @project && @project.active?
-      if @project.is_public? || User.current.member_of?(@project) || User.current.admin?
-        true
-      else
-        User.current.logged? ? render_403 : require_login
-      end
-    else
-      @project = nil
-      render_404
-      false
-    end
-  end
-
-  def redirect_back_or_default(default)
-    back_url = CGI.unescape(params[:back_url].to_s)
-    if !back_url.blank?
-      begin
-        uri = URI.parse(back_url)
-        # do not redirect user to another host or to the login or register page
-        if (uri.relative? || (uri.host == request.host)) && !uri.path.match(%r{/(login|account/register)})
-          redirect_to(back_url) and return
-        end
-      rescue URI::InvalidURIError
-        # redirect to default
-      end
-    end
-    redirect_to default
-  end
-  
-  def render_403
-    @project = nil
-    render :template => "common/403", :layout => !request.xhr?, :status => 403
-    return false
-  end
-    
-  def render_404
-    render :template => "common/404", :layout => !request.xhr?, :status => 404
-    return false
-  end
-  
-  def render_error(msg)
-    flash.now[:error] = msg
-    render :text => '', :layout => !request.xhr?, :status => 500
-  end
-  
-  def render_feed(items, options={})    
-    @items = items || []
-    @items.sort! {|x,y| y.event_datetime <=> x.event_datetime }
-    @items = @items.slice(0, Setting.feeds_limit.to_i)
-    @title = options[:title] || Setting.app_title
-    render :template => "common/feed.atom.rxml", :layout => false, :content_type => 'application/atom+xml'
-  end
-  
-  def self.accept_key_auth(*actions)
-    actions = actions.flatten.map(&:to_s)
-    write_inheritable_attribute('accept_key_auth_actions', actions)
-  end
-  
-  def accept_key_auth_actions
-    self.class.read_inheritable_attribute('accept_key_auth_actions') || []
-  end
-  
-  # TODO: move to model
-  def attach_files(obj, attachments)
-    attached = []
-    unsaved = []
-    if attachments && attachments.is_a?(Hash)
-      attachments.each_value do |attachment|
-        file = attachment['file']
-        next unless file && file.size > 0
-        a = Attachment.create(:container => obj, 
-                              :file => file,
-                              :description => attachment['description'].to_s.strip,
-                              :author => User.current)
-        a.new_record? ? (unsaved << a) : (attached << a)
-      end
-      if unsaved.any?
-        flash[:warning] = l(:warning_attachments_not_saved, unsaved.size)
-      end
-    end
-    attached
-  end
-
-  # Returns the number of objects that should be displayed
-  # on the paginated list
-  def per_page_option
-    per_page = nil
-    if params[:per_page] && Setting.per_page_options_array.include?(params[:per_page].to_s.to_i)
-      per_page = params[:per_page].to_s.to_i
-      session[:per_page] = per_page
-    elsif session[:per_page]
-      per_page = session[:per_page]
-    else
-      per_page = Setting.per_page_options_array.first || 25
-    end
-    per_page
-  end
-
-  # qvalues http header parser
-  # code taken from webrick
-  def parse_qvalues(value)
-    tmp = []
-    if value
-      parts = value.split(/,\s*/)
-      parts.each {|part|
-        if m = %r{^([^\s,]+?)(?:;\s*q=(\d+(?:\.\d+)?))?$}.match(part)
-          val = m[1]
-          q = (m[2] or 1).to_f
-          tmp.push([val, q])
-        end
-      }
-      tmp = tmp.sort_by{|val, q| -q}
-      tmp.collect!{|val, q| val}
-    end
-    return tmp
-  rescue
-    nil
-  end
-  
-  # Returns a string that can be used as filename value in Content-Disposition header
-  def filename_for_content_disposition(name)
-    request.env['HTTP_USER_AGENT'] =~ %r{MSIE} ? ERB::Util.url_encode(name) : name
-  end
-end
diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb
new file mode 100644
index 0000000..59d117e
--- /dev/null
+++ b/app/controllers/application_controller.rb
@@ -0,0 +1,251 @@
+# redMine - project management software
+# Copyright (C) 2006-2007  Jean-Philippe Lang
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+# 
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+# 
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
+
+require 'uri'
+require 'cgi'
+
+class ApplicationController < ActionController::Base
+  include Redmine::I18n
+
+  layout 'base'
+  
+  before_filter :user_setup, :check_if_login_required, :set_localization
+  filter_parameter_logging :password
+  
+  include Redmine::MenuManager::MenuController
+  helper Redmine::MenuManager::MenuHelper
+  
+  REDMINE_SUPPORTED_SCM.each do |scm|
+    require_dependency "repository/#{scm.underscore}"
+  end
+  
+  def user_setup
+    # Check the settings cache for each request
+    Setting.check_cache
+    # Find the current user
+    User.current = find_current_user
+  end
+  
+  # Returns the current user or nil if no user is logged in
+  # and starts a session if needed
+  def find_current_user
+    if session[:user_id]
+      # existing session
+      (User.active.find(session[:user_id]) rescue nil)
+    elsif cookies[:autologin] && Setting.autologin?
+      # auto-login feature starts a new session
+      user = User.try_to_autologin(cookies[:autologin])
+      session[:user_id] = user.id if user
+      user
+    elsif params[:format] == 'atom' && params[:key] && accept_key_auth_actions.include?(params[:action])
+      # RSS key authentication does not start a session
+      User.find_by_rss_key(params[:key])
+    end
+  end
+  
+  # Sets the logged in user
+  def logged_user=(user)
+    if user && user.is_a?(User)
+      User.current = user
+      session[:user_id] = user.id
+    else
+      User.current = User.anonymous
+      session[:user_id] = nil
+    end
+  end
+  
+  # check if login is globally required to access the application
+  def check_if_login_required
+    # no check needed if user is already logged in
+    return true if User.current.logged?
+    require_login if Setting.login_required?
+  end 
+  
+  def set_localization
+    lang = nil
+    if User.current.logged?
+      lang = find_language(User.current.language)
+    end
+    if lang.nil? && request.env['HTTP_ACCEPT_LANGUAGE']
+      accept_lang = parse_qvalues(request.env['HTTP_ACCEPT_LANGUAGE']).first.downcase
+      if !accept_lang.blank?
+        lang = find_language(accept_lang) || find_language(accept_lang.split('-').first)
+      end
+    end
+    lang ||= Setting.default_language
+    set_language_if_valid(lang)
+  end
+  
+  def require_login
+    if !User.current.logged?
+      redirect_to :controller => "account", :action => "login", :back_url => url_for(params)
+      return false
+    end
+    true
+  end
+
+  def require_admin
+    return unless require_login
+    if !User.current.admin?
+      render_403
+      return false
+    end
+    true
+  end
+  
+  def deny_access
+    User.current.logged? ? render_403 : require_login
+  end
+
+  # Authorize the user for the requested action
+  def authorize(ctrl = params[:controller], action = params[:action], global = false)
+    allowed = User.current.allowed_to?({:controller => ctrl, :action => action}, @project, :global => global)
+    allowed ? true : deny_access
+  end
+
+  # Authorize the user for the requested action outside a project
+  def authorize_global(ctrl = params[:controller], action = params[:action], global = true)
+    authorize(ctrl, action, global)
+  end
+  
+  # make sure that the user is a member of the project (or admin) if project is private
+  # used as a before_filter for actions that do not require any particular permission on the project
+  def check_project_privacy
+    if @project && @project.active?
+      if @project.is_public? || User.current.member_of?(@project) || User.current.admin?
+        true
+      else
+        User.current.logged? ? render_403 : require_login
+      end
+    else
+      @project = nil
+      render_404
+      false
+    end
+  end
+
+  def redirect_back_or_default(default)
+    back_url = CGI.unescape(params[:back_url].to_s)
+    if !back_url.blank?
+      begin
+        uri = URI.parse(back_url)
+        # do not redirect user to another host or to the login or register page
+        if (uri.relative? || (uri.host == request.host)) && !uri.path.match(%r{/(login|account/register)})
+          redirect_to(back_url) and return
+        end
+      rescue URI::InvalidURIError
+        # redirect to default
+      end
+    end
+    redirect_to default
+  end
+  
+  def render_403
+    @project = nil
+    render :template => "common/403", :layout => !request.xhr?, :status => 403
+    return false
+  end
+    
+  def render_404
+    render :template => "common/404", :layout => !request.xhr?, :status => 404
+    return false
+  end
+  
+  def render_error(msg)
+    flash.now[:error] = msg
+    render :text => '', :layout => !request.xhr?, :status => 500
+  end
+  
+  def render_feed(items, options={})    
+    @items = items || []
+    @items.sort! {|x,y| y.event_datetime <=> x.event_datetime }
+    @items = @items.slice(0, Setting.feeds_limit.to_i)
+    @title = options[:title] || Setting.app_title
+    render :template => "common/feed.atom.rxml", :layout => false, :content_type => 'application/atom+xml'
+  end
+  
+  def self.accept_key_auth(*actions)
+    actions = actions.flatten.map(&:to_s)
+    write_inheritable_attribute('accept_key_auth_actions', actions)
+  end
+  
+  def accept_key_auth_actions
+    self.class.read_inheritable_attribute('accept_key_auth_actions') || []
+  end
+  
+  # TODO: move to model
+  def attach_files(obj, attachments)
+    attached = []
+    unsaved = []
+    if attachments && attachments.is_a?(Hash)
+      attachments.each_value do |attachment|
+        file = attachment['file']
+        next unless file && file.size > 0
+        a = Attachment.create(:container => obj, 
+                              :file => file,
+                              :description => attachment['description'].to_s.strip,
+                              :author => User.current)
+        a.new_record? ? (unsaved << a) : (attached << a)
+      end
+      if unsaved.any?
+        flash[:warning] = l(:warning_attachments_not_saved, unsaved.size)
+      end
+    end
+    attached
+  end
+
+  # Returns the number of objects that should be displayed
+  # on the paginated list
+  def per_page_option
+    per_page = nil
+    if params[:per_page] && Setting.per_page_options_array.include?(params[:per_page].to_s.to_i)
+      per_page = params[:per_page].to_s.to_i
+      session[:per_page] = per_page
+    elsif session[:per_page]
+      per_page = session[:per_page]
+    else
+      per_page = Setting.per_page_options_array.first || 25
+    end
+    per_page
+  end
+
+  # qvalues http header parser
+  # code taken from webrick
+  def parse_qvalues(value)
+    tmp = []
+    if value
+      parts = value.split(/,\s*/)
+      parts.each {|part|
+        if m = %r{^([^\s,]+?)(?:;\s*q=(\d+(?:\.\d+)?))?$}.match(part)
+          val = m[1]
+          q = (m[2] or 1).to_f
+          tmp.push([val, q])
+        end
+      }
+      tmp = tmp.sort_by{|val, q| -q}
+      tmp.collect!{|val, q| val}
+    end
+    return tmp
+  rescue
+    nil
+  end
+  
+  # Returns a string that can be used as filename value in Content-Disposition header
+  def filename_for_content_disposition(name)
+    request.env['HTTP_USER_AGENT'] =~ %r{MSIE} ? ERB::Util.url_encode(name) : name
+  end
+end
diff --git a/app/controllers/repositories_controller.rb b/app/controllers/repositories_controller.rb
index 938ace9..4240546 100644
--- a/app/controllers/repositories_controller.rb
+++ b/app/controllers/repositories_controller.rb
@@ -259,7 +259,7 @@ private
 
   def graph_commits_per_author(repository)
     commits_by_author = repository.changesets.count(:all, :group => :committer)
-    commits_by_author.sort! {|x, y| x.last <=> y.last}
+    commits_by_author.to_a.sort! {|x, y| x.last <=> y.last}
 
     changes_by_author = repository.changes.count(:all, :group => :committer)
     h = changes_by_author.inject({}) {|o, i| o[i.first] = i.last; o}
diff --git a/app/views/settings/_authentication.rhtml b/app/views/settings/_authentication.rhtml
index 25d344d..f4b8dbf 100644
--- a/app/views/settings/_authentication.rhtml
+++ b/app/views/settings/_authentication.rhtml
@@ -2,7 +2,9 @@
 
 <div class="box tabular settings">
 <p><label><%= l(:setting_login_required) %></label>
-<%= check_box_tag 'settings[login_required]', 1, Setting.login_required? %><%= hidden_field_tag 'settings[login_required]', 0 %></p>
+<%= hidden_field_tag 'settings[login_required]', 0 %>
+<%= check_box_tag 'settings[login_required]', 1, Setting.login_required? %>
+</p>
 
 <p><label><%= l(:setting_autologin) %></label>
 <%= select_tag 'settings[autologin]', options_for_select( [[l(:label_disabled), "0"]] + [1, 7, 30, 365].collect{|days| [l('datetime.distance_in_words.x_days', :count => days), days.to_s]}, Setting.autologin) %></p>
@@ -19,10 +21,14 @@
 <%= text_field_tag 'settings[password_min_length]', Setting.password_min_length, :size => 6 %></p>
 
 <p><label><%= l(:label_password_lost) %></label>
-<%= check_box_tag 'settings[lost_password]', 1, Setting.lost_password? %><%= hidden_field_tag 'settings[lost_password]', 0 %></p>
+<%= hidden_field_tag 'settings[lost_password]', 0 %>
+<%= check_box_tag 'settings[lost_password]', 1, Setting.lost_password? %>
+</p>
 
 <p><label><%= l(:setting_openid) %></label>
-<%= check_box_tag 'settings[openid]', 1, Setting.openid?, :disabled => !Object.const_defined?(:OpenID) %><%= hidden_field_tag 'settings[openid]', 0 %></p>
+<%= hidden_field_tag 'settings[openid]', 0 %>
+<%= check_box_tag 'settings[openid]', 1, Setting.openid?, :disabled => !Object.const_defined?(:OpenID) %>
+</p>
 </div>
 
 <div style="float:right;">
diff --git a/app/views/settings/_display.rhtml b/app/views/settings/_display.rhtml
index a14ff47..984f762 100644
--- a/app/views/settings/_display.rhtml
+++ b/app/views/settings/_display.rhtml
@@ -17,7 +17,9 @@
 <%= select_tag 'settings[user_format]', options_for_select( @options[:user_format], Setting.user_format.to_s ) %></p>
 
 <p><label><%= l(:setting_gravatar_enabled) %></label>
-<%= check_box_tag 'settings[gravatar_enabled]', 1, Setting.gravatar_enabled? %><%= hidden_field_tag 'settings[gravatar_enabled]', 0 %></p>
+<%= hidden_field_tag 'settings[gravatar_enabled]', 0 %>
+<%= check_box_tag 'settings[gravatar_enabled]', 1, Setting.gravatar_enabled? %>
+</p>
 </div>
 
 <%= submit_tag l(:button_save) %>
diff --git a/app/views/settings/_issues.rhtml b/app/views/settings/_issues.rhtml
index 0703661..b0277fa 100644
--- a/app/views/settings/_issues.rhtml
+++ b/app/views/settings/_issues.rhtml
@@ -2,10 +2,14 @@
 
 <div class="box tabular settings">
 <p><label><%= l(:setting_cross_project_issue_relations) %></label>
-<%= check_box_tag 'settings[cross_project_issue_relations]', 1, Setting.cross_project_issue_relations? %><%= hidden_field_tag 'settings[cross_project_issue_relations]', 0 %></p>
+<%= hidden_field_tag 'settings[cross_project_issue_relations]', 0 %>
+<%= check_box_tag 'settings[cross_project_issue_relations]', 1, Setting.cross_project_issue_relations? %>
+</p>
 
 <p><label><%= l(:setting_display_subprojects_issues) %></label>
-<%= check_box_tag 'settings[display_subprojects_issues]', 1, Setting.display_subprojects_issues? %><%= hidden_field_tag 'settings[display_subprojects_issues]', 0 %></p>
+<%= hidden_field_tag 'settings[display_subprojects_issues]', 0 %>
+<%= check_box_tag 'settings[display_subprojects_issues]', 1, Setting.display_subprojects_issues? %>
+</p>
 
 <p><label><%= l(:setting_issues_export_limit) %></label>
 <%= text_field_tag 'settings[issues_export_limit]', Setting.issues_export_limit, :size => 6 %></p>
diff --git a/app/views/settings/_mail_handler.rhtml b/app/views/settings/_mail_handler.rhtml
index 830b1ba..8d83358 100644
--- a/app/views/settings/_mail_handler.rhtml
+++ b/app/views/settings/_mail_handler.rhtml
@@ -2,9 +2,10 @@
 
 <div class="box tabular settings">
 <p><label><%= l(:setting_mail_handler_api_enabled) %></label>
+<%= hidden_field_tag 'settings[mail_handler_api_enabled]', 0 %>
 <%= check_box_tag 'settings[mail_handler_api_enabled]', 1, Setting.mail_handler_api_enabled?,
                   :onclick => "if (this.checked) { Form.Element.enable('settings_mail_handler_api_key'); } else { Form.Element.disable('settings_mail_handler_api_key'); }" %>
-<%= hidden_field_tag 'settings[mail_handler_api_enabled]', 0 %></p>
+</p>
 
 <p><label><%= l(:setting_mail_handler_api_key) %></label>
 <%= text_field_tag 'settings[mail_handler_api_key]', Setting.mail_handler_api_key, 
diff --git a/app/views/settings/_notifications.rhtml b/app/views/settings/_notifications.rhtml
index bc01411..1b1b294 100644
--- a/app/views/settings/_notifications.rhtml
+++ b/app/views/settings/_notifications.rhtml
@@ -6,12 +6,14 @@
 <%= text_field_tag 'settings[mail_from]', Setting.mail_from, :size => 60 %></p>
 
 <p><label><%= l(:setting_bcc_recipients) %></label>
+<%= hidden_field_tag 'settings[bcc_recipients]', 0 %>
 <%= check_box_tag 'settings[bcc_recipients]', 1, Setting.bcc_recipients? %>
-<%= hidden_field_tag 'settings[bcc_recipients]', 0 %></p>
+</p>
 
 <p><label><%= l(:setting_plain_text_mail) %></label>
+<%= hidden_field_tag 'settings[plain_text_mail]', 0 %>
 <%= check_box_tag 'settings[plain_text_mail]', 1, Setting.plain_text_mail? %>
-<%= hidden_field_tag 'settings[plain_text_mail]', 0 %></p>
+</p>
 </div>
 
 <fieldset class="box" id="notified_events"><legend><%=l(:text_select_mail_notifications)%></legend>
diff --git a/app/views/settings/_projects.rhtml b/app/views/settings/_projects.rhtml
index 2f831c8..704905a 100644
--- a/app/views/settings/_projects.rhtml
+++ b/app/views/settings/_projects.rhtml
@@ -2,10 +2,14 @@
 
 <div class="box tabular settings">
 <p><label><%= l(:setting_default_projects_public) %></label>
-<%= check_box_tag 'settings[default_projects_public]', 1, Setting.default_projects_public? %><%= hidden_field_tag 'settings[default_projects_public]', 0 %></p>
+<%= hidden_field_tag 'settings[default_projects_public]', 0 %>
+<%= check_box_tag 'settings[default_projects_public]', 1, Setting.default_projects_public? %>
+</p>
 
 <p><label><%= l(:setting_sequential_project_identifiers) %></label>
-<%= check_box_tag 'settings[sequential_project_identifiers]', 1, Setting.sequential_project_identifiers? %><%= hidden_field_tag 'settings[sequential_project_identifiers]', 0 %></p>
+<%= hidden_field_tag 'settings[sequential_project_identifiers]', 0 %>
+<%= check_box_tag 'settings[sequential_project_identifiers]', 1, Setting.sequential_project_identifiers? %>
+</p>
 
 <p><label><%= l(:setting_new_project_user_role_id) %></label>
 <%= select_tag('settings[new_project_user_role_id]', options_for_select([["--- #{l(:actionview_instancetag_blank_option)} ---", '']] + Role.find_all_givable.collect {|r| [r.name, r.id]}, Setting.new_project_user_role_id.to_i)) %></p>
diff --git a/app/views/settings/_repositories.rhtml b/app/views/settings/_repositories.rhtml
index a20fc51..4f07f05 100644
--- a/app/views/settings/_repositories.rhtml
+++ b/app/views/settings/_repositories.rhtml
@@ -2,10 +2,14 @@
 
 <div class="box tabular settings">
 <p><label><%= l(:setting_autofetch_changesets) %></label>
-<%= check_box_tag 'settings[autofetch_changesets]', 1, Setting.autofetch_changesets? %><%= hidden_field_tag 'settings[autofetch_changesets]', 0 %></p>
+<%= hidden_field_tag 'settings[autofetch_changesets]', 0 %>
+<%= check_box_tag 'settings[autofetch_changesets]', 1, Setting.autofetch_changesets? %>
+</p>
 
 <p><label><%= l(:setting_sys_api_enabled) %></label>
-<%= check_box_tag 'settings[sys_api_enabled]', 1, Setting.sys_api_enabled? %><%= hidden_field_tag 'settings[sys_api_enabled]', 0 %></p>
+<%= hidden_field_tag 'settings[sys_api_enabled]', 0 %>
+<%= check_box_tag 'settings[sys_api_enabled]', 1, Setting.sys_api_enabled? %>
+</p>
 
 <p><label><%= l(:setting_enabled_scm) %></label>
 <% REDMINE_SUPPORTED_SCM.each do |scm| -%>
diff --git a/config/boot.rb b/config/boot.rb
index 67cc517..dd5e3b6 100644
--- a/config/boot.rb
+++ b/config/boot.rb
@@ -1,7 +1,7 @@
 # Don't change this file!
 # Configure your app in config/environment.rb and config/environments/*.rb
 
-RAILS_ROOT = File.expand_path("#{File.dirname(__FILE__)}/..") unless defined?(RAILS_ROOT)
+RAILS_ROOT = "#{File.dirname(__FILE__)}/.." unless defined?(RAILS_ROOT)
 
 module Rails
   class << self
@@ -44,6 +44,7 @@ module Rails
     def load_initializer
       require "#{RAILS_ROOT}/vendor/rails/railties/lib/initializer"
       Rails::Initializer.run(:install_gem_spec_stubs)
+      Rails::GemDependency.add_frozen_gem_path
     end
   end
 
@@ -81,8 +82,8 @@ module Rails
       end
 
       def load_rubygems
+        min_version = '1.3.2'
         require 'rubygems'
-        min_version = '1.3.1'
         unless rubygems_version >= min_version
           $stderr.puts %Q(Rails requires RubyGems >= #{min_version} (you have #{rubygems_version}). Please `gem update --system` and try again.)
           exit 1
diff --git a/config/environment.rb b/config/environment.rb
index f98968b..d173db4 100644
--- a/config/environment.rb
+++ b/config/environment.rb
@@ -5,7 +5,7 @@
 # ENV['RAILS_ENV'] ||= 'production'
 
 # Specifies gem version of Rails to use when vendor/rails is not present
-RAILS_GEM_VERSION = '2.2.2' unless defined? RAILS_GEM_VERSION
+RAILS_GEM_VERSION = '2.3.4' unless defined? RAILS_GEM_VERSION
 
 # Bootstrap the Rails environment, frameworks, and default configuration
 require File.join(File.dirname(__FILE__), 'boot')
diff --git a/config/initializers/10-patches.rb b/config/initializers/10-patches.rb
index f4ae06c..94d40fa 100644
--- a/config/initializers/10-patches.rb
+++ b/config/initializers/10-patches.rb
@@ -33,7 +33,7 @@ module ActiveRecord
             end
           else
             attr_name = @base.class.human_attribute_name(attr)
-            full_messages << attr_name + ' ' + message
+            full_messages << attr_name + ' ' + message.to_s
           end
         end
       end
diff --git a/config/initializers/backtrace_silencers.rb b/config/initializers/backtrace_silencers.rb
new file mode 100644
index 0000000..c2169ed
--- /dev/null
+++ b/config/initializers/backtrace_silencers.rb
@@ -0,0 +1,7 @@
+# Be sure to restart your server when you modify this file.
+
+# You can add backtrace silencers for libraries that you're using but don't wish to see in your backtraces.
+# Rails.backtrace_cleaner.add_silencer { |line| line =~ /my_noisy_library/ }
+
+# You can also remove all the silencers if you're trying do debug a problem that might steem from framework code.
+# Rails.backtrace_cleaner.remove_silencers!
\ No newline at end of file
diff --git a/config/initializers/inflections.rb b/config/initializers/inflections.rb
new file mode 100644
index 0000000..d531b8b
--- /dev/null
+++ b/config/initializers/inflections.rb
@@ -0,0 +1,10 @@
+# Be sure to restart your server when you modify this file.
+
+# Add new inflection rules using the following format 
+# (all these examples are active by default):
+# ActiveSupport::Inflector.inflections do |inflect|
+#   inflect.plural /^(ox)$/i, '\1en'
+#   inflect.singular /^(ox)en/i, '\1'
+#   inflect.irregular 'person', 'people'
+#   inflect.uncountable %w( fish sheep )
+# end
diff --git a/config/locales/bg.yml b/config/locales/bg.yml
index 00a82d0..ee5e54d 100644
--- a/config/locales/bg.yml
+++ b/config/locales/bg.yml
@@ -59,6 +59,22 @@ bg:
       over_x_years:
         one:   "over 1 year"
         other: "over {{count}} years"
+
+  number: 
+    human: 
+      format: 
+        precision: 1
+        delimiter: ""
+      storage_units: 
+        format: "%n %u"
+        units: 
+          kb: KB
+          tb: TB
+          gb: GB
+          byte: 
+            one: Byte
+            other: Bytes
+          mb: 'MB'
       
 # Used in array.to_sentence.
   support:
@@ -803,3 +819,4 @@ bg:
   text_journal_changed: "{{label}} changed from {{old}} to {{new}}"
   text_journal_set_to: "{{label}} set to {{value}}"
   text_journal_deleted: "{{label}} deleted"
+
diff --git a/config/locales/bs.yml b/config/locales/bs.yml
index a12ffda..db90d71 100644
--- a/config/locales/bs.yml
+++ b/config/locales/bs.yml
@@ -83,9 +83,16 @@ bs:
       format:
         delimiter: ""
         precision: 1
-
-
-
+      storage_units:
+        format: "%n %u"
+        units:
+          byte:
+            one: "Byte"
+            other: "Bytes"
+          kb: "KB"
+          mb: "MB"
+          gb: "GB"
+          tb: "TB"
         
 # Used in array.to_sentence.
   support:
diff --git a/config/locales/ca.yml b/config/locales/ca.yml
index 5a4078a..4cfb8b0 100644
--- a/config/locales/ca.yml
+++ b/config/locales/ca.yml
@@ -59,6 +59,22 @@ ca:
       over_x_years:
         one:   "més d'un any"
         other: "més de {{count}} anys"
+
+  number:
+    human:
+      format:
+        delimiter: ""
+        precision: 1
+      storage_units:
+        format: "%n %u"
+        units:
+          byte:
+            one: "Byte"
+            other: "Bytes"
+          kb: "KB"
+          mb: "MB"
+          gb: "GB"
+          tb: "TB"
         
 # Used in array.to_sentence.
   support:
diff --git a/config/locales/cs.yml b/config/locales/cs.yml
index 974ad24..d3e0b57 100644
--- a/config/locales/cs.yml
+++ b/config/locales/cs.yml
@@ -59,6 +59,22 @@ cs:
       over_x_years:
         one:   "více než 1 rok"
         other: "více než {{count}} roky"
+
+  number: 
+    human: 
+      format: 
+        precision: 1
+        delimiter: ""
+      storage_units: 
+        format: "%n %u"
+        units: 
+          kb: KB
+          tb: TB
+          gb: GB
+          byte: 
+            one: Byte
+            other: Bytes
+          mb: MB
         
 # Used in array.to_sentence.
   support:
diff --git a/config/locales/da.yml b/config/locales/da.yml
index ebe3ed1..955fcfc 100644
--- a/config/locales/da.yml
+++ b/config/locales/da.yml
@@ -85,7 +85,16 @@ da:
         # separator: 
         delimiter: ""
         precision: 1
-      storage_units: [Bytes, KB, MB, GB, TB]
+      storage_units:
+        format: "%n %u"
+        units:
+          byte:
+            one: "Byte"
+            other: "Bytes"
+          kb: "KB"
+          mb: "MB"
+          gb: "GB"
+          tb: "TB"
     percentage:
       format:
         # separator:
diff --git a/config/locales/de.yml b/config/locales/de.yml
index c0b732a..418f924 100644
--- a/config/locales/de.yml
+++ b/config/locales/de.yml
@@ -83,6 +83,16 @@ de:
       format:
         delimiter: ""
         precision: 1
+      storage_units:
+        format: "%n %u"
+        units:
+          byte:
+            one: "Byte"
+            other: "Bytes"
+          kb: "KB"
+          mb: "MB"
+          gb: "GB"
+          tb: "TB"
 
   support:
     array:
diff --git a/config/locales/el.yml b/config/locales/el.yml
index 95f52a0..881acbc 100644
--- a/config/locales/el.yml
+++ b/config/locales/el.yml
@@ -63,6 +63,22 @@ el:
         one:   "πάνω από 1 χρόνο"
         other: "πάνω από {{count}} χρόνια"
         
+  number: 
+    human: 
+      format: 
+        precision: 1
+        delimiter: ""
+      storage_units: 
+        format: "%n %u"
+        units: 
+          kb: KB
+          tb: TB
+          gb: GB
+          byte: 
+            one: Byte
+            other: Bytes
+          mb: MB
+
 # Used in array.to_sentence.
   support:
     array:
diff --git a/config/locales/en.yml b/config/locales/en.yml
index f77079e..f4f5548 100644
--- a/config/locales/en.yml
+++ b/config/locales/en.yml
@@ -59,6 +59,23 @@ en:
       over_x_years:
         one:   "over 1 year"
         other: "over {{count}} years"
+
+  number:
+    human:
+      format:
+        delimiter: ""
+        precision: 1
+      storage_units:
+        format: "%n %u"
+        units:
+          byte:
+            one: "Byte"
+            other: "Bytes"
+          kb: "KB"
+          mb: "MB"
+          gb: "GB"
+          tb: "TB"
+
         
 # Used in array.to_sentence.
   support:
diff --git a/config/locales/es.yml b/config/locales/es.yml
index 8cceca1..fcd0ab7 100644
--- a/config/locales/es.yml
+++ b/config/locales/es.yml
@@ -47,6 +47,16 @@ es:
         # separator: 
         delimiter: "" 
         precision: 1
+      storage_units:
+        format: "%n %u"
+        units:
+          byte:
+            one: "Byte"
+            other: "Bytes"
+          kb: "KB"
+          mb: "MB"
+          gb: "GB"
+          tb: "TB"
 
   # Used in distance_of_time_in_words(), distance_of_time_in_words_to_now(), time_ago_in_words()
   datetime:
diff --git a/config/locales/fi.yml b/config/locales/fi.yml
index 9bf2f3d..ed53a95 100644
--- a/config/locales/fi.yml
+++ b/config/locales/fi.yml
@@ -61,7 +61,16 @@ fi:
       format:
         delimiter: ""
         precision: 1
-      storage_units: [Tavua, KB, MB, GB, TB]
+      storage_units:
+        format: "%n %u"
+        units:
+          byte:
+            one: "Tavua"
+            other: "Tavua"
+          kb: "KB"
+          mb: "MB"
+          gb: "GB"
+          tb: "TB"
  
   datetime:
     distance_in_words:
diff --git a/config/locales/fr.yml b/config/locales/fr.yml
index bf53595..e5b7f11 100644
--- a/config/locales/fr.yml
+++ b/config/locales/fr.yml
@@ -84,7 +84,16 @@ fr:
     human:
       format:
         precision: 2
-      storage_units: [ Octet, ko, Mo, Go, To ]
+      storage_units:
+        format: "%n %u"
+        units:
+          byte:
+            one: "Octet"
+            other: "Octet"
+          kb: "ko"
+          mb: "Mo"
+          gb: "Go"
+          tb: "To"
   
   support:
     array:
diff --git a/config/locales/gl.yml b/config/locales/gl.yml
index c4fef59..b792f23 100644
--- a/config/locales/gl.yml
+++ b/config/locales/gl.yml
@@ -33,6 +33,16 @@ gl:
         # separator: 
         delimiter: "" 
         precision: 1
+      storage_units:
+        format: "%n %u"
+        units:
+          byte:
+            one: "Byte"
+            other: "Bytes"
+          kb: "KB"
+          mb: "MB"
+          gb: "GB"
+          tb: "TB"
   
   
   date:
diff --git a/config/locales/he.yml b/config/locales/he.yml
index 1dbf727..3c131f6 100644
--- a/config/locales/he.yml
+++ b/config/locales/he.yml
@@ -76,6 +76,17 @@ he:
         unit: 'שח'
         precision: 2
         format: '%u %n'
+    human:
+      storage_units:
+        format: "%n %u"
+        units:
+          byte:
+            one: "Byte"
+            other: "Bytes"
+          kb: "KB"
+          mb: "MB"
+          gb: "GB"
+          tb: "TB"
         
   support:
     array:
diff --git a/config/locales/hu.yml b/config/locales/hu.yml
index 45fd173..f4b8103 100644
--- a/config/locales/hu.yml
+++ b/config/locales/hu.yml
@@ -90,7 +90,16 @@
       format:
         delimiter: ""
         precision: 1
-      storage_units: [bájt, KB, MB, GB, TB]
+      storage_units:
+        format: "%n %u"
+        units:
+          byte:
+            one: "bájt"
+            other: "bájt"
+          kb: "KB"
+          mb: "MB"
+          gb: "GB"
+          tb: "TB"
 
   support:
     array:
diff --git a/config/locales/it.yml b/config/locales/it.yml
index ad5266d..c90b72a 100644
--- a/config/locales/it.yml
+++ b/config/locales/it.yml
@@ -74,6 +74,17 @@ it:
         unit: '€'
         precision: 2
         format: '%n %u'
+    human:
+      storage_units:
+        format: "%n %u"
+        units:
+          byte:
+            one: "Byte"
+            other: "Bytes"
+          kb: "KB"
+          mb: "MB"
+          gb: "GB"
+          tb: "TB"
         
   support:
     array:
diff --git a/config/locales/ja.yml b/config/locales/ja.yml
index 5aefde8..83d664f 100644
--- a/config/locales/ja.yml
+++ b/config/locales/ja.yml
@@ -96,6 +96,16 @@ ja:
       format:
         delimiter: ""
         precision: 1
+      storage_units:
+        format: "%n %u"
+        units:
+          byte:
+            one: "Byte"
+            other: "Bytes"
+          kb: "KB"
+          mb: "MB"
+          gb: "GB"
+          tb: "TB"
 
   activerecord:
     errors:
diff --git a/config/locales/ko.yml b/config/locales/ko.yml
index 62abf78..47c60dd 100644
--- a/config/locales/ko.yml
+++ b/config/locales/ko.yml
@@ -112,7 +112,16 @@ ko:
         # separator: 
         delimiter: ""
         precision: 1
-      storage_units: [Bytes, KB, MB, GB, TB]
+      storage_units:
+        format: "%n %u"
+        units:
+          byte:
+            one: "Byte"
+            other: "Bytes"
+          kb: "KB"
+          mb: "MB"
+          gb: "GB"
+          tb: "TB"
 
 # Used in array.to_sentence.
   support:
diff --git a/config/locales/lt.yml b/config/locales/lt.yml
index 8fc5bb1..b67ea5c 100644
--- a/config/locales/lt.yml
+++ b/config/locales/lt.yml
@@ -28,7 +28,16 @@ lt:
       format:
         delimiter: ""
         precision: 1
-      storage_units: [baitai, KB, MB, GB, TB]
+      storage_units:
+        format: "%n %u"
+        units:
+          byte:
+            one: "baitai"
+            other: "baitai"
+          kb: "KB"
+          mb: "MB"
+          gb: "GB"
+          tb: "TB"
 
   datetime:
     distance_in_words:
diff --git a/config/locales/nl.yml b/config/locales/nl.yml
index 16dc344..d8afe90 100644
--- a/config/locales/nl.yml
+++ b/config/locales/nl.yml
@@ -59,6 +59,22 @@ nl:
       over_x_years:
         one:   "over 1 jaar"
         other: "over {{count}} jaren"
+
+  number: 
+    human: 
+      format: 
+        precision: 1
+        delimiter: ""
+      storage_units: 
+        format: "%n %u"
+        units: 
+          kb: KB
+          tb: TB
+          gb: GB
+          byte: 
+            one: Byte
+            other: Bytes
+          mb: MB
         
 # Used in array.to_sentence.
   support:
diff --git a/config/locales/no.yml b/config/locales/no.yml
index 1b25a3f..67fc82e 100644
--- a/config/locales/no.yml
+++ b/config/locales/no.yml
@@ -67,6 +67,18 @@
       format:
         delimiter: ""
         precision: 4
+    human:
+      storage_units:
+        format: "%n %u"
+        units:
+          byte:
+            one: "Byte"
+            other: "Bytes"
+          kb: "KB"
+          mb: "MB"
+          gb: "GB"
+          tb: "TB"
+
   activerecord:
     errors:
       template:
diff --git a/config/locales/pl.yml b/config/locales/pl.yml
index 472063f..e0ea333 100644
--- a/config/locales/pl.yml
+++ b/config/locales/pl.yml
@@ -21,7 +21,16 @@ pl:
       format:
         delimiter: ""
         precision: 1
-      storage_units: [B, KB, MB, GB, TB]
+      storage_units:
+        format: "%n %u"
+        units:
+          byte:
+            one: "B"
+            other: "B"
+          kb: "KB"
+          mb: "MB"
+          gb: "GB"
+          tb: "TB"
 
   date:
     formats:
diff --git a/config/locales/pt-BR.yml b/config/locales/pt-BR.yml
index 0d515ad..299a80f 100644
--- a/config/locales/pt-BR.yml
+++ b/config/locales/pt-BR.yml
@@ -93,6 +93,16 @@ pt-BR:
       format:
         precision: 1
         delimiter: '.'
+      storage_units:
+        format: "%n %u"
+        units:
+          byte:
+            one: "Byte"
+            other: "Bytes"
+          kb: "KB"
+          mb: "MB"
+          gb: "GB"
+          tb: "TB"
   support:
     array:
       sentence_connector: "e"
diff --git a/config/locales/pt.yml b/config/locales/pt.yml
index 1ff51f8..b332e76 100644
--- a/config/locales/pt.yml
+++ b/config/locales/pt.yml
@@ -83,6 +83,16 @@ pt:
       format:
         precision: 1
         delimiter: ''
+      storage_units:
+        format: "%n %u"
+        units:
+          byte:
+            one: "Byte"
+            other: "Bytes"
+          kb: "KB"
+          mb: "MB"
+          gb: "GB"
+          tb: "TB"
 
   activerecord:
     errors:
diff --git a/config/locales/ro.yml b/config/locales/ro.yml
index 7bee52e..9cd0401 100644
--- a/config/locales/ro.yml
+++ b/config/locales/ro.yml
@@ -57,6 +57,22 @@ ro:
       over_x_years:
         one:   "peste un an"
         other: "peste {{count}} ani"
+
+  number: 
+    human: 
+      format: 
+        precision: 1
+        delimiter: ""
+      storage_units: 
+        format: "%n %u"
+        units: 
+          kb: KB
+          tb: TB
+          gb: GB
+          byte: 
+            one: Byte
+            other: Bytes
+          mb: MB
         
 # Used in array.to_sentence.
   support:
diff --git a/config/locales/sk.yml b/config/locales/sk.yml
index c984712..dd2c6df 100644
--- a/config/locales/sk.yml
+++ b/config/locales/sk.yml
@@ -808,3 +808,18 @@ sk:
   text_journal_changed: "{{label}} changed from {{old}} to {{new}}"
   text_journal_set_to: "{{label}} set to {{value}}"
   text_journal_deleted: "{{label}} deleted"
+  number: 
+    human: 
+      format: 
+        precision: 1
+        delimiter: ""
+      storage_units: 
+        format: "%n %u"
+        units: 
+          kb: KB
+          tb: TB
+          gb: GB
+          byte: 
+            one: Byte
+            other: Bytes
+          mb: MB
diff --git a/config/locales/sl.yml b/config/locales/sl.yml
index 0e556bb..92ce3eb 100644
--- a/config/locales/sl.yml
+++ b/config/locales/sl.yml
@@ -59,6 +59,22 @@ sl:
       over_x_years:
         one:   "over 1 year"
         other: "over {{count}} years"
+
+  number: 
+    human: 
+      format: 
+        precision: 1
+        delimiter: ""
+      storage_units: 
+        format: "%n %u"
+        units: 
+          kb: KB
+          tb: TB
+          gb: GB
+          byte: 
+            one: Byte
+            other: Bytes
+          mb: MB
         
 # Used in array.to_sentence.
   support:
diff --git a/config/locales/sr.yml b/config/locales/sr.yml
index 01318a0..de47ed2 100644
--- a/config/locales/sr.yml
+++ b/config/locales/sr.yml
@@ -81,6 +81,17 @@
         unit: 'ДИН'
         precision: 2
         format: '%n %u'
+    human:
+      storage_units:
+        format: "%n %u"
+        units:
+          byte:
+            one: "Byte"
+            other: "Bytes"
+          kb: "KB"
+          mb: "MB"
+          gb: "GB"
+          tb: "TB"
 
   support:
     array:
diff --git a/config/locales/sv.yml b/config/locales/sv.yml
index abf4b7a..2672f5d 100644
--- a/config/locales/sv.yml
+++ b/config/locales/sv.yml
@@ -47,7 +47,16 @@ sv:
         # separator: 
         delimiter: ""
         # precision: 1
-      storage_units: [Byte, KB, MB, GB, TB]
+      storage_units:
+        format: "%n %u"
+        units:
+          byte:
+            one: "Byte"
+            other: "Bytes"
+          kb: "KB"
+          mb: "MB"
+          gb: "GB"
+          tb: "TB"
 
   # Used in distance_of_time_in_words(), distance_of_time_in_words_to_now(), time_ago_in_words()
   datetime:
diff --git a/config/locales/th.yml b/config/locales/th.yml
index dbb309b..fee21cf 100644
--- a/config/locales/th.yml
+++ b/config/locales/th.yml
@@ -59,6 +59,22 @@ th:
       over_x_years:
         one:   "over 1 year"
         other: "over {{count}} years"
+
+  number: 
+    human: 
+      format: 
+        precision: 1
+        delimiter: ""
+      storage_units: 
+        format: "%n %u"
+        units: 
+          kb: KB
+          tb: TB
+          gb: GB
+          byte: 
+            one: Byte
+            other: Bytes
+          mb: MB
         
 # Used in array.to_sentence.
   support:
diff --git a/config/locales/tr.yml b/config/locales/tr.yml
index a189ab0..2925b4f 100644
--- a/config/locales/tr.yml
+++ b/config/locales/tr.yml
@@ -92,6 +92,16 @@ tr:
         delimiter: '.'
         separator: ','
         precision: 2
+      storage_units:
+        format: "%n %u"
+        units:
+          byte:
+            one: "Byte"
+            other: "Bytes"
+          kb: "KB"
+          mb: "MB"
+          gb: "GB"
+          tb: "TB"
 
   support:
     array:
diff --git a/config/locales/uk.yml b/config/locales/uk.yml
index ef28528..c3ceaf1 100644
--- a/config/locales/uk.yml
+++ b/config/locales/uk.yml
@@ -59,6 +59,22 @@ uk:
       over_x_years:
         one:   "over 1 year"
         other: "over {{count}} years"
+
+  number: 
+    human: 
+      format: 
+        precision: 1
+        delimiter: ""
+      storage_units: 
+        format: "%n %u"
+        units: 
+          kb: KB
+          tb: TB
+          gb: GB
+          byte: 
+            one: Byte
+            other: Bytes
+          mb: MB
         
 # Used in array.to_sentence.
   support:
diff --git a/config/locales/vi.yml b/config/locales/vi.yml
index 7bd76f5..d74f7d9 100644
--- a/config/locales/vi.yml
+++ b/config/locales/vi.yml
@@ -49,7 +49,16 @@ vi:
         # separator:
         delimiter: ""
         precision: 1
-      storage_units: [Bytes, KB, MB, GB, TB]
+      storage_units:
+        format: "%n %u"
+        units:
+          byte:
+            one: "Byte"
+            other: "Bytes"
+          kb: "KB"
+          mb: "MB"
+          gb: "GB"
+          tb: "TB"
 
   # Used in distance_of_time_in_words(), distance_of_time_in_words_to_now(), time_ago_in_words()
   datetime:
diff --git a/config/locales/zh-TW.yml b/config/locales/zh-TW.yml
index ab6c6a6..d7bdb4c 100644
--- a/config/locales/zh-TW.yml
+++ b/config/locales/zh-TW.yml
@@ -86,8 +86,9 @@
         precision: 1
         # 儲存單位輸出格式.
         # %u 是儲存單位, %n 是數值 (預設值: 2 MB)
+      storage_units:
         format: "%n %u"
-        storage_units:
+        units:
           byte:
             one: "位元組 (B)"
             other: "位元組 (B)"
diff --git a/config/locales/zh.yml b/config/locales/zh.yml
index db8d161..e569f1c 100644
--- a/config/locales/zh.yml
+++ b/config/locales/zh.yml
@@ -86,7 +86,16 @@ zh:
       format:
         delimiter: ""
         precision: 1
-      storage_units: [Bytes, KB, MB, GB, TB]
+      storage_units:
+        format: "%n %u"
+        units:
+          byte:
+            one: "Byte"
+            other: "Bytes"
+          kb: "KB"
+          mb: "MB"
+          gb: "GB"
+          tb: "TB"
   
   support:
     array:
diff --git a/config/routes.rb b/config/routes.rb
index ded3435..fb63b9e 100644
--- a/config/routes.rb
+++ b/config/routes.rb
@@ -6,11 +6,6 @@ ActionController::Routing::Routes.draw do |map|
   # map.connect 'products/:id', :controller => 'catalog', :action => 'view'
   # Keep in mind you can assign values other than :controller and :action
 
-  # Allow Redmine plugins to map routes and potentially override them
-  Rails.plugins.each do |plugin|
-    map.from_plugin plugin.name.to_sym
-  end
-
   map.home '', :controller => 'welcome'
   
   map.signin 'login', :controller => 'account', :action => 'login'
diff --git a/lib/tabular_form_builder.rb b/lib/tabular_form_builder.rb
index 5bf690b..8728266 100644
--- a/lib/tabular_form_builder.rb
+++ b/lib/tabular_form_builder.rb
@@ -43,7 +43,7 @@ class TabularFormBuilder < ActionView::Helpers::FormBuilder
       return '' if options.delete(:no_label)
       text = options[:label].is_a?(Symbol) ? l(options[:label]) : options[:label]
       text ||= l(("field_" + field.to_s.gsub(/\_id$/, "")).to_sym)
-      text << @template.content_tag("span", " *", :class => "required") if options.delete(:required)
+      text += @template.content_tag("span", " *", :class => "required") if options.delete(:required)
       @template.content_tag("label", text, 
                                      :class => (@object && @object.errors[field] ? "error" : nil), 
                                      :for => (@object_name.to_s + "_" + field.to_s))
diff --git a/test/functional/account_controller_test.rb b/test/functional/account_controller_test.rb
index fb23e6b..8184fa3 100644
--- a/test/functional/account_controller_test.rb
+++ b/test/functional/account_controller_test.rb
@@ -21,7 +21,7 @@ require 'account_controller'
 # Re-raise errors caught by the controller.
 class AccountController; def rescue_action(e) raise e end; end
 
-class AccountControllerTest < Test::Unit::TestCase
+class AccountControllerTest < ActionController::TestCase
   fixtures :users, :roles
   
   def setup
diff --git a/test/functional/admin_controller_test.rb b/test/functional/admin_controller_test.rb
index 32965de..47091c4 100644
--- a/test/functional/admin_controller_test.rb
+++ b/test/functional/admin_controller_test.rb
@@ -21,7 +21,7 @@ require 'admin_controller'
 # Re-raise errors caught by the controller.
 class AdminController; def rescue_action(e) raise e end; end
 
-class AdminControllerTest < Test::Unit::TestCase
+class AdminControllerTest < ActionController::TestCase
   fixtures :projects, :users, :roles
   
   def setup
diff --git a/test/functional/application_controller_test.rb b/test/functional/application_controller_test.rb
index 0232b6a..7e221c2 100644
--- a/test/functional/application_controller_test.rb
+++ b/test/functional/application_controller_test.rb
@@ -16,12 +16,12 @@
 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
 
 require File.dirname(__FILE__) + '/../test_helper'
-require 'application'
+require 'application_controller'
 
 # Re-raise errors caught by the controller.
 class ApplicationController; def rescue_action(e) raise e end; end
 
-class ApplicationControllerTest < Test::Unit::TestCase
+class ApplicationControllerTest < ActionController::TestCase
   include Redmine::I18n
   
   def setup
diff --git a/test/functional/attachments_controller_test.rb b/test/functional/attachments_controller_test.rb
index 3a4b897..bf57349 100644
--- a/test/functional/attachments_controller_test.rb
+++ b/test/functional/attachments_controller_test.rb
@@ -22,7 +22,7 @@ require 'attachments_controller'
 class AttachmentsController; def rescue_action(e) raise e end; end
 
 
-class AttachmentsControllerTest < Test::Unit::TestCase
+class AttachmentsControllerTest < ActionController::TestCase
   fixtures :users, :projects, :roles, :members, :member_roles, :enabled_modules, :issues, :trackers, :attachments,
            :versions, :wiki_pages, :wikis, :documents
   
diff --git a/test/functional/boards_controller_test.rb b/test/functional/boards_controller_test.rb
index eb9a50e..254ee93 100644
--- a/test/functional/boards_controller_test.rb
+++ b/test/functional/boards_controller_test.rb
@@ -21,7 +21,7 @@ require 'boards_controller'
 # Re-raise errors caught by the controller.
 class BoardsController; def rescue_action(e) raise e end; end
 
-class BoardsControllerTest < Test::Unit::TestCase
+class BoardsControllerTest < ActionController::TestCase
   fixtures :projects, :users, :members, :member_roles, :roles, :boards, :messages, :enabled_modules
   
   def setup
diff --git a/test/functional/custom_fields_controller_test.rb b/test/functional/custom_fields_controller_test.rb
index 10af235..5b27446 100644
--- a/test/functional/custom_fields_controller_test.rb
+++ b/test/functional/custom_fields_controller_test.rb
@@ -21,7 +21,7 @@ require 'custom_fields_controller'
 # Re-raise errors caught by the controller.
 class CustomFieldsController; def rescue_action(e) raise e end; end
 
-class CustomFieldsControllerTest < Test::Unit::TestCase
+class CustomFieldsControllerTest < ActionController::TestCase
   fixtures :custom_fields, :trackers, :users
   
   def setup
diff --git a/test/functional/documents_controller_test.rb b/test/functional/documents_controller_test.rb
index c0fe095..11c7065 100644
--- a/test/functional/documents_controller_test.rb
+++ b/test/functional/documents_controller_test.rb
@@ -21,7 +21,7 @@ require 'documents_controller'
 # Re-raise errors caught by the controller.
 class DocumentsController; def rescue_action(e) raise e end; end
 
-class DocumentsControllerTest < Test::Unit::TestCase
+class DocumentsControllerTest < ActionController::TestCase
   fixtures :projects, :users, :roles, :members, :member_roles, :enabled_modules, :documents, :enumerations
   
   def setup
diff --git a/test/functional/enumerations_controller_test.rb b/test/functional/enumerations_controller_test.rb
index afbe23a..8c66186 100644
--- a/test/functional/enumerations_controller_test.rb
+++ b/test/functional/enumerations_controller_test.rb
@@ -21,7 +21,7 @@ require 'enumerations_controller'
 # Re-raise errors caught by the controller.
 class EnumerationsController; def rescue_action(e) raise e end; end
 
-class EnumerationsControllerTest < Test::Unit::TestCase
+class EnumerationsControllerTest < ActionController::TestCase
   fixtures :enumerations, :issues, :users
   
   def setup
diff --git a/test/functional/issue_categories_controller_test.rb b/test/functional/issue_categories_controller_test.rb
index ffb8733..3d1dd06 100644
--- a/test/functional/issue_categories_controller_test.rb
+++ b/test/functional/issue_categories_controller_test.rb
@@ -21,7 +21,7 @@ require 'issue_categories_controller'
 # Re-raise errors caught by the controller.
 class IssueCategoriesController; def rescue_action(e) raise e end; end
 
-class IssueCategoriesControllerTest < Test::Unit::TestCase
+class IssueCategoriesControllerTest < ActionController::TestCase
   fixtures :projects, :users, :members, :member_roles, :roles, :enabled_modules, :issue_categories
   
   def setup
diff --git a/test/functional/issue_relations_controller_test.rb b/test/functional/issue_relations_controller_test.rb
index a23f64a..8566174 100644
--- a/test/functional/issue_relations_controller_test.rb
+++ b/test/functional/issue_relations_controller_test.rb
@@ -5,7 +5,7 @@ require 'issue_relations_controller'
 class IssueRelationsController; def rescue_action(e) raise e end; end
 
 
-class IssueRelationsControllerTest < Test::Unit::TestCase
+class IssueRelationsControllerTest < ActionController::TestCase
   fixtures :projects,
            :users,
            :roles,
diff --git a/test/functional/issues_controller_test.rb b/test/functional/issues_controller_test.rb
index 95e75b4..0d282c1 100644
--- a/test/functional/issues_controller_test.rb
+++ b/test/functional/issues_controller_test.rb
@@ -21,7 +21,7 @@ require 'issues_controller'
 # Re-raise errors caught by the controller.
 class IssuesController; def rescue_action(e) raise e end; end
 
-class IssuesControllerTest < Test::Unit::TestCase
+class IssuesControllerTest < ActionController::TestCase
   fixtures :projects,
            :users,
            :roles,
@@ -42,7 +42,8 @@ class IssuesControllerTest < Test::Unit::TestCase
            :custom_fields_trackers,
            :time_entries,
            :journals,
-           :journal_details
+           :journal_details,
+           :queries
   
   def setup
     @controller = IssuesController.new
@@ -452,14 +453,16 @@ class IssuesControllerTest < Test::Unit::TestCase
   
   def test_post_new
     @request.session[:user_id] = 2
-    post :new, :project_id => 1, 
-               :issue => {:tracker_id => 3,
-                          :subject => 'This is the test_new issue',
-                          :description => 'This is the description',
-                          :priority_id => 5,
-                          :estimated_hours => '',
-                          :custom_field_values => {'2' => 'Value for field 2'}}
-    assert_redirected_to :action => 'show'
+    assert_difference 'Issue.count' do
+      post :new, :project_id => 1, 
+                 :issue => {:tracker_id => 3,
+                            :subject => 'This is the test_new issue',
+                            :description => 'This is the description',
+                            :priority_id => 5,
+                            :estimated_hours => '',
+                            :custom_field_values => {'2' => 'Value for field 2'}}
+    end
+    assert_redirected_to :controller => 'issues', :action => 'show', :id => Issue.last.id
     
     issue = Issue.find_by_subject('This is the test_new issue')
     assert_not_nil issue
@@ -483,12 +486,14 @@ class IssuesControllerTest < Test::Unit::TestCase
   
   def test_post_new_without_custom_fields_param
     @request.session[:user_id] = 2
-    post :new, :project_id => 1, 
-               :issue => {:tracker_id => 1,
-                          :subject => 'This is the test_new issue',
-                          :description => 'This is the description',
-                          :priority_id => 5}
-    assert_redirected_to :action => 'show'
+    assert_difference 'Issue.count' do
+      post :new, :project_id => 1, 
+                 :issue => {:tracker_id => 1,
+                            :subject => 'This is the test_new issue',
+                            :description => 'This is the description',
+                            :priority_id => 5}
+    end
+    assert_redirected_to :controller => 'issues', :action => 'show', :id => Issue.last.id
   end
 
   def test_post_new_with_required_custom_field_and_without_custom_fields_param
@@ -536,14 +541,16 @@ class IssuesControllerTest < Test::Unit::TestCase
   def test_post_new_should_send_a_notification
     ActionMailer::Base.deliveries.clear
     @request.session[:user_id] = 2
-    post :new, :project_id => 1, 
-               :issue => {:tracker_id => 3,
-                          :subject => 'This is the test_new issue',
-                          :description => 'This is the description',
-                          :priority_id => 5,
-                          :estimated_hours => '',
-                          :custom_field_values => {'2' => 'Value for field 2'}}
-    assert_redirected_to :action => 'show'
+    assert_difference 'Issue.count' do
+      post :new, :project_id => 1, 
+                 :issue => {:tracker_id => 3,
+                            :subject => 'This is the test_new issue',
+                            :description => 'This is the description',
+                            :priority_id => 5,
+                            :estimated_hours => '',
+                            :custom_field_values => {'2' => 'Value for field 2'}}
+    end
+    assert_redirected_to :controller => 'issues', :action => 'show', :id => Issue.last.id
     
     assert_equal 1, ActionMailer::Base.deliveries.size
   end
diff --git a/test/functional/journals_controller_test.rb b/test/functional/journals_controller_test.rb
index ae112ab..0a11bab 100644
--- a/test/functional/journals_controller_test.rb
+++ b/test/functional/journals_controller_test.rb
@@ -21,7 +21,7 @@ require 'journals_controller'
 # Re-raise errors caught by the controller.
 class JournalsController; def rescue_action(e) raise e end; end
 
-class JournalsControllerTest < Test::Unit::TestCase
+class JournalsControllerTest < ActionController::TestCase
   fixtures :projects, :users, :members, :member_roles, :roles, :issues, :journals, :journal_details, :enabled_modules
   
   def setup
diff --git a/test/functional/mail_handler_controller_test.rb b/test/functional/mail_handler_controller_test.rb
index e99f99a..8365f31 100644
--- a/test/functional/mail_handler_controller_test.rb
+++ b/test/functional/mail_handler_controller_test.rb
@@ -21,7 +21,7 @@ require 'mail_handler_controller'
 # Re-raise errors caught by the controller.
 class MailHandlerController; def rescue_action(e) raise e end; end
 
-class MailHandlerControllerTest < Test::Unit::TestCase
+class MailHandlerControllerTest < ActionController::TestCase
   fixtures :users, :projects, :enabled_modules, :roles, :members, :member_roles, :issues, :issue_statuses, :trackers, :enumerations
   
   FIXTURES_PATH = File.dirname(__FILE__) + '/../fixtures/mail_handler'
diff --git a/test/functional/members_controller_test.rb b/test/functional/members_controller_test.rb
index 2680c39..f3571dd 100644
--- a/test/functional/members_controller_test.rb
+++ b/test/functional/members_controller_test.rb
@@ -22,7 +22,7 @@ require 'members_controller'
 class MembersController; def rescue_action(e) raise e end; end
 
 
-class MembersControllerTest < Test::Unit::TestCase
+class MembersControllerTest < ActionController::TestCase
   fixtures :projects, :members, :member_roles, :roles, :users
   
   def setup
diff --git a/test/functional/messages_controller_test.rb b/test/functional/messages_controller_test.rb
index 70061ac..2522f0a 100644
--- a/test/functional/messages_controller_test.rb
+++ b/test/functional/messages_controller_test.rb
@@ -21,7 +21,7 @@ require 'messages_controller'
 # Re-raise errors caught by the controller.
 class MessagesController; def rescue_action(e) raise e end; end
 
-class MessagesControllerTest < Test::Unit::TestCase
+class MessagesControllerTest < ActionController::TestCase
   fixtures :projects, :users, :members, :member_roles, :roles, :boards, :messages, :enabled_modules
   
   def setup
diff --git a/test/functional/my_controller_test.rb b/test/functional/my_controller_test.rb
index 9973400..8862466 100644
--- a/test/functional/my_controller_test.rb
+++ b/test/functional/my_controller_test.rb
@@ -21,7 +21,7 @@ require 'my_controller'
 # Re-raise errors caught by the controller.
 class MyController; def rescue_action(e) raise e end; end
 
-class MyControllerTest < Test::Unit::TestCase
+class MyControllerTest < ActionController::TestCase
   fixtures :users, :issues, :issue_statuses, :trackers, :enumerations, :custom_fields
   
   def setup
diff --git a/test/functional/news_controller_test.rb b/test/functional/news_controller_test.rb
index cea35ca..427d75b 100644
--- a/test/functional/news_controller_test.rb
+++ b/test/functional/news_controller_test.rb
@@ -21,7 +21,7 @@ require 'news_controller'
 # Re-raise errors caught by the controller.
 class NewsController; def rescue_action(e) raise e end; end
 
-class NewsControllerTest < Test::Unit::TestCase
+class NewsControllerTest < ActionController::TestCase
   fixtures :projects, :users, :roles, :members, :member_roles, :enabled_modules, :news, :comments
   
   def setup
diff --git a/test/functional/projects_controller_test.rb b/test/functional/projects_controller_test.rb
index 0560a54..81b501e 100644
--- a/test/functional/projects_controller_test.rb
+++ b/test/functional/projects_controller_test.rb
@@ -21,7 +21,7 @@ require 'projects_controller'
 # Re-raise errors caught by the controller.
 class ProjectsController; def rescue_action(e) raise e end; end
 
-class ProjectsControllerTest < Test::Unit::TestCase
+class ProjectsControllerTest < ActionController::TestCase
   fixtures :projects, :versions, :users, :roles, :members, :member_roles, :issues, :journals, :journal_details,
            :trackers, :projects_trackers, :issue_statuses, :enabled_modules, :enumerations, :boards, :messages,
            :attachments
diff --git a/test/functional/queries_controller_test.rb b/test/functional/queries_controller_test.rb
index 8edde44..af2a86e 100644
--- a/test/functional/queries_controller_test.rb
+++ b/test/functional/queries_controller_test.rb
@@ -21,7 +21,7 @@ require 'queries_controller'
 # Re-raise errors caught by the controller.
 class QueriesController; def rescue_action(e) raise e end; end
 
-class QueriesControllerTest < Test::Unit::TestCase
+class QueriesControllerTest < ActionController::TestCase
   fixtures :projects, :users, :members, :member_roles, :roles, :trackers, :issue_statuses, :issue_categories, :enumerations, :issues, :custom_fields, :custom_values, :queries
   
   def setup
@@ -70,7 +70,7 @@ class QueriesControllerTest < Test::Unit::TestCase
          :query => {"name" => "test_new_project_public_query", "is_public" => "1"}
          
     q = Query.find_by_name('test_new_project_public_query')
-    assert_redirected_to :controller => 'issues', :action => 'index', :query_id => q
+    assert_redirected_to :controller => 'issues', :action => 'index', :project_id => 'ecookbook', :query_id => q
     assert q.is_public?
     assert q.has_default_columns?
     assert q.valid?
@@ -88,7 +88,7 @@ class QueriesControllerTest < Test::Unit::TestCase
          :query => {"name" => "test_new_project_private_query", "is_public" => "1"}
          
     q = Query.find_by_name('test_new_project_private_query')
-    assert_redirected_to :controller => 'issues', :action => 'index', :query_id => q
+    assert_redirected_to :controller => 'issues', :action => 'index', :project_id => 'ecookbook', :query_id => q
     assert !q.is_public?
     assert q.has_default_columns?
     assert q.valid?
@@ -104,7 +104,7 @@ class QueriesControllerTest < Test::Unit::TestCase
          :query => {"name" => "test_new_global_private_query", "is_public" => "1", "column_names" => ["", "tracker", "subject", "priority", "category"]}
          
     q = Query.find_by_name('test_new_global_private_query')
-    assert_redirected_to :controller => 'issues', :action => 'index', :query_id => q
+    assert_redirected_to :controller => 'issues', :action => 'index', :project_id => nil, :query_id => q
     assert !q.is_public?
     assert !q.has_default_columns?
     assert_equal [:tracker, :subject, :priority, :category], q.columns.collect {|c| c.name}
diff --git a/test/functional/reports_controller_test.rb b/test/functional/reports_controller_test.rb
index 125b175..ab33b30 100644
--- a/test/functional/reports_controller_test.rb
+++ b/test/functional/reports_controller_test.rb
@@ -22,7 +22,7 @@ require 'reports_controller'
 class ReportsController; def rescue_action(e) raise e end; end
 
 
-class ReportsControllerTest < Test::Unit::TestCase
+class ReportsControllerTest < ActionController::TestCase
   fixtures :all
   
   def setup
diff --git a/test/functional/repositories_bazaar_controller_test.rb b/test/functional/repositories_bazaar_controller_test.rb
index 98aa236..18841d5 100644
--- a/test/functional/repositories_bazaar_controller_test.rb
+++ b/test/functional/repositories_bazaar_controller_test.rb
@@ -21,7 +21,7 @@ require 'repositories_controller'
 # Re-raise errors caught by the controller.
 class RepositoriesController; def rescue_action(e) raise e end; end
 
-class RepositoriesBazaarControllerTest < Test::Unit::TestCase
+class RepositoriesBazaarControllerTest < ActionController::TestCase
   fixtures :projects, :users, :roles, :members, :member_roles, :repositories, :enabled_modules
 
   # No '..' in the repository path
diff --git a/test/functional/repositories_controller_test.rb b/test/functional/repositories_controller_test.rb
index d51a429..d786c2e 100644
--- a/test/functional/repositories_controller_test.rb
+++ b/test/functional/repositories_controller_test.rb
@@ -21,7 +21,7 @@ require 'repositories_controller'
 # Re-raise errors caught by the controller.
 class RepositoriesController; def rescue_action(e) raise e end; end
 
-class RepositoriesControllerTest < Test::Unit::TestCase
+class RepositoriesControllerTest < ActionController::TestCase
   fixtures :projects, :users, :roles, :members, :member_roles, :repositories, :issues, :issue_statuses, :changesets, :changes, :issue_categories, :enumerations, :custom_fields, :custom_values, :trackers
   
   def setup
diff --git a/test/functional/repositories_cvs_controller_test.rb b/test/functional/repositories_cvs_controller_test.rb
index c728bf3..f3d4ecf 100644
--- a/test/functional/repositories_cvs_controller_test.rb
+++ b/test/functional/repositories_cvs_controller_test.rb
@@ -21,7 +21,7 @@ require 'repositories_controller'
 # Re-raise errors caught by the controller.
 class RepositoriesController; def rescue_action(e) raise e end; end
 
-class RepositoriesCvsControllerTest < Test::Unit::TestCase
+class RepositoriesCvsControllerTest < ActionController::TestCase
 
   # No '..' in the repository path
   REPOSITORY_PATH = RAILS_ROOT.gsub(%r{config\/\.\.}, '') + '/tmp/test/cvs_repository'
diff --git a/test/functional/repositories_darcs_controller_test.rb b/test/functional/repositories_darcs_controller_test.rb
index 3f841e9..b605ff8 100644
--- a/test/functional/repositories_darcs_controller_test.rb
+++ b/test/functional/repositories_darcs_controller_test.rb
@@ -21,7 +21,7 @@ require 'repositories_controller'
 # Re-raise errors caught by the controller.
 class RepositoriesController; def rescue_action(e) raise e end; end
 
-class RepositoriesDarcsControllerTest < Test::Unit::TestCase
+class RepositoriesDarcsControllerTest < ActionController::TestCase
   fixtures :projects, :users, :roles, :members, :member_roles, :repositories, :enabled_modules
 
   # No '..' in the repository path
diff --git a/test/functional/repositories_git_controller_test.rb b/test/functional/repositories_git_controller_test.rb
index 6c2502f..37c6fb8 100644
--- a/test/functional/repositories_git_controller_test.rb
+++ b/test/functional/repositories_git_controller_test.rb
@@ -21,7 +21,7 @@ require 'repositories_controller'
 # Re-raise errors caught by the controller.
 class RepositoriesController; def rescue_action(e) raise e end; end
 
-class RepositoriesGitControllerTest < Test::Unit::TestCase
+class RepositoriesGitControllerTest < ActionController::TestCase
   fixtures :projects, :users, :roles, :members, :member_roles, :repositories, :enabled_modules
 
   # No '..' in the repository path
diff --git a/test/functional/repositories_mercurial_controller_test.rb b/test/functional/repositories_mercurial_controller_test.rb
index ec25265..f2639ee 100644
--- a/test/functional/repositories_mercurial_controller_test.rb
+++ b/test/functional/repositories_mercurial_controller_test.rb
@@ -21,7 +21,7 @@ require 'repositories_controller'
 # Re-raise errors caught by the controller.
 class RepositoriesController; def rescue_action(e) raise e end; end
 
-class RepositoriesMercurialControllerTest < Test::Unit::TestCase
+class RepositoriesMercurialControllerTest < ActionController::TestCase
   fixtures :projects, :users, :roles, :members, :member_roles, :repositories, :enabled_modules
 
   # No '..' in the repository path
diff --git a/test/functional/repositories_subversion_controller_test.rb b/test/functional/repositories_subversion_controller_test.rb
index fe1b3db..865bae3 100644
--- a/test/functional/repositories_subversion_controller_test.rb
+++ b/test/functional/repositories_subversion_controller_test.rb
@@ -21,7 +21,7 @@ require 'repositories_controller'
 # Re-raise errors caught by the controller.
 class RepositoriesController; def rescue_action(e) raise e end; end
 
-class RepositoriesSubversionControllerTest < Test::Unit::TestCase
+class RepositoriesSubversionControllerTest < ActionController::TestCase
   fixtures :projects, :users, :roles, :members, :member_roles, :enabled_modules,
            :repositories, :issues, :issue_statuses, :changesets, :changes,
            :issue_categories, :enumerations, :custom_fields, :custom_values, :trackers
diff --git a/test/functional/roles_controller_test.rb b/test/functional/roles_controller_test.rb
index 61e9bd6..2004088 100644
--- a/test/functional/roles_controller_test.rb
+++ b/test/functional/roles_controller_test.rb
@@ -21,7 +21,7 @@ require 'roles_controller'
 # Re-raise errors caught by the controller.
 class RolesController; def rescue_action(e) raise e end; end
 
-class RolesControllerTest < Test::Unit::TestCase
+class RolesControllerTest < ActionController::TestCase
   fixtures :roles, :users, :members, :member_roles, :workflows
   
   def setup
diff --git a/test/functional/search_controller_test.rb b/test/functional/search_controller_test.rb
index 4f79081..b062468 100644
--- a/test/functional/search_controller_test.rb
+++ b/test/functional/search_controller_test.rb
@@ -4,7 +4,7 @@ require 'search_controller'
 # Re-raise errors caught by the controller.
 class SearchController; def rescue_action(e) raise e end; end
 
-class SearchControllerTest < Test::Unit::TestCase
+class SearchControllerTest < ActionController::TestCase
   fixtures :projects, :enabled_modules, :roles, :users, :members, :member_roles,
            :issues, :trackers, :issue_statuses,
            :custom_fields, :custom_values,
diff --git a/test/functional/settings_controller_test.rb b/test/functional/settings_controller_test.rb
index 0e919a7..1e0c48f 100644
--- a/test/functional/settings_controller_test.rb
+++ b/test/functional/settings_controller_test.rb
@@ -21,7 +21,7 @@ require 'settings_controller'
 # Re-raise errors caught by the controller.
 class SettingsController; def rescue_action(e) raise e end; end
 
-class SettingsControllerTest < Test::Unit::TestCase
+class SettingsControllerTest < ActionController::TestCase
   fixtures :users
   
   def setup
diff --git a/test/functional/sys_controller_test.rb b/test/functional/sys_controller_test.rb
index db9dd2a..59b1d2a 100644
--- a/test/functional/sys_controller_test.rb
+++ b/test/functional/sys_controller_test.rb
@@ -21,7 +21,7 @@ require 'sys_controller'
 # Re-raise errors caught by the controller.
 class SysController; def rescue_action(e) raise e end; end
 
-class SysControllerTest < Test::Unit::TestCase
+class SysControllerTest < ActionController::TestCase
   fixtures :projects, :repositories
   
   def setup
diff --git a/test/functional/timelog_controller_test.rb b/test/functional/timelog_controller_test.rb
index df80f5d..371fded 100644
--- a/test/functional/timelog_controller_test.rb
+++ b/test/functional/timelog_controller_test.rb
@@ -21,7 +21,7 @@ require 'timelog_controller'
 # Re-raise errors caught by the controller.
 class TimelogController; def rescue_action(e) raise e end; end
 
-class TimelogControllerTest < Test::Unit::TestCase
+class TimelogControllerTest < ActionController::TestCase
   fixtures :projects, :enabled_modules, :roles, :members, :member_roles, :issues, :time_entries, :users, :trackers, :enumerations, :issue_statuses, :custom_fields, :custom_values
 
   def setup
diff --git a/test/functional/trackers_controller_test.rb b/test/functional/trackers_controller_test.rb
index e2109ba..ec41224 100644
--- a/test/functional/trackers_controller_test.rb
+++ b/test/functional/trackers_controller_test.rb
@@ -21,7 +21,7 @@ require 'trackers_controller'
 # Re-raise errors caught by the controller.
 class TrackersController; def rescue_action(e) raise e end; end
 
-class TrackersControllerTest < Test::Unit::TestCase
+class TrackersControllerTest < ActionController::TestCase
   fixtures :trackers, :projects, :projects_trackers, :users, :issues
   
   def setup
diff --git a/test/functional/users_controller_test.rb b/test/functional/users_controller_test.rb
index 5f62b15..df87462 100644
--- a/test/functional/users_controller_test.rb
+++ b/test/functional/users_controller_test.rb
@@ -21,7 +21,7 @@ require 'users_controller'
 # Re-raise errors caught by the controller.
 class UsersController; def rescue_action(e) raise e end; end
 
-class UsersControllerTest < Test::Unit::TestCase
+class UsersControllerTest < ActionController::TestCase
   include Redmine::I18n
   
   fixtures :users, :projects, :members, :member_roles, :roles
diff --git a/test/functional/versions_controller_test.rb b/test/functional/versions_controller_test.rb
index 3d212de..4343b88 100644
--- a/test/functional/versions_controller_test.rb
+++ b/test/functional/versions_controller_test.rb
@@ -21,7 +21,7 @@ require 'versions_controller'
 # Re-raise errors caught by the controller.
 class VersionsController; def rescue_action(e) raise e end; end
 
-class VersionsControllerTest < Test::Unit::TestCase
+class VersionsControllerTest < ActionController::TestCase
   fixtures :projects, :versions, :issues, :users, :roles, :members, :member_roles, :enabled_modules
   
   def setup
diff --git a/test/functional/watchers_controller_test.rb b/test/functional/watchers_controller_test.rb
index 275599f..3b48767 100644
--- a/test/functional/watchers_controller_test.rb
+++ b/test/functional/watchers_controller_test.rb
@@ -21,7 +21,7 @@ require 'watchers_controller'
 # Re-raise errors caught by the controller.
 class WatchersController; def rescue_action(e) raise e end; end
 
-class WatchersControllerTest < Test::Unit::TestCase
+class WatchersControllerTest < ActionController::TestCase
   fixtures :projects, :users, :roles, :members, :member_roles, :enabled_modules,
            :issues, :trackers, :projects_trackers, :issue_statuses, :enumerations, :watchers
   
diff --git a/test/functional/welcome_controller_test.rb b/test/functional/welcome_controller_test.rb
index 0376fd8..5fef176 100644
--- a/test/functional/welcome_controller_test.rb
+++ b/test/functional/welcome_controller_test.rb
@@ -21,7 +21,7 @@ require 'welcome_controller'
 # Re-raise errors caught by the controller.
 class WelcomeController; def rescue_action(e) raise e end; end
 
-class WelcomeControllerTest < Test::Unit::TestCase
+class WelcomeControllerTest < ActionController::TestCase
   fixtures :projects, :news
   
   def setup
diff --git a/test/functional/wiki_controller_test.rb b/test/functional/wiki_controller_test.rb
index 9d104c5..cf247db 100644
--- a/test/functional/wiki_controller_test.rb
+++ b/test/functional/wiki_controller_test.rb
@@ -21,7 +21,7 @@ require 'wiki_controller'
 # Re-raise errors caught by the controller.
 class WikiController; def rescue_action(e) raise e end; end
 
-class WikiControllerTest < Test::Unit::TestCase
+class WikiControllerTest < ActionController::TestCase
   fixtures :projects, :users, :roles, :members, :member_roles, :enabled_modules, :wikis, :wiki_pages, :wiki_contents, :wiki_content_versions, :attachments
   
   def setup
diff --git a/test/functional/wikis_controller_test.rb b/test/functional/wikis_controller_test.rb
index 7a5634f..dc7df4d 100644
--- a/test/functional/wikis_controller_test.rb
+++ b/test/functional/wikis_controller_test.rb
@@ -21,7 +21,7 @@ require 'wikis_controller'
 # Re-raise errors caught by the controller.
 class WikisController; def rescue_action(e) raise e end; end
 
-class WikisControllerTest < Test::Unit::TestCase
+class WikisControllerTest < ActionController::TestCase
   fixtures :projects, :users, :roles, :members, :member_roles, :enabled_modules, :wikis
   
   def setup
diff --git a/test/functional/workflows_controller_test.rb b/test/functional/workflows_controller_test.rb
index d6078bb..19187b7 100644
--- a/test/functional/workflows_controller_test.rb
+++ b/test/functional/workflows_controller_test.rb
@@ -21,7 +21,7 @@ require 'workflows_controller'
 # Re-raise errors caught by the controller.
 class WorkflowsController; def rescue_action(e) raise e end; end
 
-class WorkflowsControllerTest < Test::Unit::TestCase
+class WorkflowsControllerTest < ActionController::TestCase
   fixtures :roles, :trackers, :workflows
   
   def setup
diff --git a/test/helper_testcase.rb b/test/helper_testcase.rb
index aba6784..1ce9d86 100644
--- a/test/helper_testcase.rb
+++ b/test/helper_testcase.rb
@@ -4,7 +4,7 @@ class StubController < ApplicationController
   attr_accessor :request, :url
 end
 
-class HelperTestCase < Test::Unit::TestCase
+class HelperTestCase < ActiveSupport::TestCase
 
   # Add other helpers here if you need them
   include ActionView::Helpers::ActiveRecordHelper
diff --git a/test/test_helper.rb b/test/test_helper.rb
index 88117e5..fba2987 100644
--- a/test/test_helper.rb
+++ b/test/test_helper.rb
@@ -21,7 +21,7 @@ require 'test_help'
 require File.expand_path(File.dirname(__FILE__) + '/helper_testcase')
 require File.join(RAILS_ROOT,'test', 'mocks', 'open_id_authentication_mock.rb')
 
-class Test::Unit::TestCase
+class ActiveSupport::TestCase
   # Transactional fixtures accelerate your tests by wrapping each test method
   # in a transaction that's rolled back on completion.  This ensures that the
   # test database remains unchanged so your fixtures don't have to be reloaded
@@ -55,7 +55,7 @@ class Test::Unit::TestCase
   end
   
   def test_uploaded_file(name, mime)
-    ActionController::TestUploadedFile.new(Test::Unit::TestCase.fixture_path + "/files/#{name}", mime)
+    ActionController::TestUploadedFile.new(ActiveSupport::TestCase.fixture_path + "/files/#{name}", mime)
   end
   
   # Use a temporary directory for attachment related tests
diff --git a/test/unit/activity_test.rb b/test/unit/activity_test.rb
index 0b1773d..86a07e6 100644
--- a/test/unit/activity_test.rb
+++ b/test/unit/activity_test.rb
@@ -17,7 +17,7 @@
 
 require File.dirname(__FILE__) + '/../test_helper'
 
-class ActivityTest < Test::Unit::TestCase
+class ActivityTest < ActiveSupport::TestCase
   fixtures :projects, :versions, :attachments, :users, :roles, :members, :member_roles, :issues, :journals, :journal_details,
            :trackers, :projects_trackers, :issue_statuses, :enabled_modules, :enumerations, :boards, :messages
 
diff --git a/test/unit/attachment_test.rb b/test/unit/attachment_test.rb
index ae92991..75a7a3c 100644
--- a/test/unit/attachment_test.rb
+++ b/test/unit/attachment_test.rb
@@ -17,7 +17,7 @@
 
 require File.dirname(__FILE__) + '/../test_helper'
 
-class AttachmentTest < Test::Unit::TestCase
+class AttachmentTest < ActiveSupport::TestCase
   fixtures :issues, :users
   
   def setup
diff --git a/test/unit/auth_source_ldap_test.rb b/test/unit/auth_source_ldap_test.rb
index 30abd5d..d0f7a6e 100644
--- a/test/unit/auth_source_ldap_test.rb
+++ b/test/unit/auth_source_ldap_test.rb
@@ -17,7 +17,7 @@
 
 require File.dirname(__FILE__) + '/../test_helper'
 
-class AuthSourceLdapTest < Test::Unit::TestCase
+class AuthSourceLdapTest < ActiveSupport::TestCase
 
   def setup
   end
diff --git a/test/unit/board_test.rb b/test/unit/board_test.rb
index 3ba4b2d..569c462 100644
--- a/test/unit/board_test.rb
+++ b/test/unit/board_test.rb
@@ -1,6 +1,6 @@
 require File.dirname(__FILE__) + '/../test_helper'
 
-class BoardTest < Test::Unit::TestCase
+class BoardTest < ActiveSupport::TestCase
   fixtures :projects, :boards, :messages
 
   def setup
diff --git a/test/unit/calendar_test.rb b/test/unit/calendar_test.rb
index 98d8569..05e1d0b 100644
--- a/test/unit/calendar_test.rb
+++ b/test/unit/calendar_test.rb
@@ -17,7 +17,7 @@
 
 require File.dirname(__FILE__) + '/../test_helper'
 
-class CalendarTest < Test::Unit::TestCase
+class CalendarTest < ActiveSupport::TestCase
   
   def test_monthly
     c = Redmine::Helpers::Calendar.new(Date.today, :fr, :month)
diff --git a/test/unit/changeset_test.rb b/test/unit/changeset_test.rb
index 51d8b74..9af53a3 100644
--- a/test/unit/changeset_test.rb
+++ b/test/unit/changeset_test.rb
@@ -17,7 +17,7 @@
 
 require File.dirname(__FILE__) + '/../test_helper'
 
-class ChangesetTest < Test::Unit::TestCase
+class ChangesetTest < ActiveSupport::TestCase
   fixtures :projects, :repositories, :issues, :issue_statuses, :changesets, :changes, :issue_categories, :enumerations, :custom_fields, :custom_values, :users, :members, :member_roles, :trackers
 
   def setup
diff --git a/test/unit/comment_test.rb b/test/unit/comment_test.rb
index c07ee82..0a62148 100644
--- a/test/unit/comment_test.rb
+++ b/test/unit/comment_test.rb
@@ -17,7 +17,7 @@
 
 require File.dirname(__FILE__) + '/../test_helper'
 
-class CommentTest < Test::Unit::TestCase
+class CommentTest < ActiveSupport::TestCase
   fixtures :users, :news, :comments
 
   def setup
diff --git a/test/unit/custom_field_test.rb b/test/unit/custom_field_test.rb
index 2f17d99..513c6fb 100644
--- a/test/unit/custom_field_test.rb
+++ b/test/unit/custom_field_test.rb
@@ -17,7 +17,7 @@
 
 require File.dirname(__FILE__) + '/../test_helper'
 
-class CustomFieldTest < Test::Unit::TestCase
+class CustomFieldTest < ActiveSupport::TestCase
   fixtures :custom_fields
   
   def test_create
diff --git a/test/unit/custom_value_test.rb b/test/unit/custom_value_test.rb
index 11578ae..08492ef 100644
--- a/test/unit/custom_value_test.rb
+++ b/test/unit/custom_value_test.rb
@@ -17,7 +17,7 @@
 
 require File.dirname(__FILE__) + '/../test_helper'
 
-class CustomValueTest < Test::Unit::TestCase
+class CustomValueTest < ActiveSupport::TestCase
   fixtures :custom_fields
 
   def test_string_field_validation_with_blank_value
diff --git a/test/unit/default_data_test.rb b/test/unit/default_data_test.rb
index 457f885..a63d205 100644
--- a/test/unit/default_data_test.rb
+++ b/test/unit/default_data_test.rb
@@ -17,7 +17,7 @@
 
 require File.dirname(__FILE__) + '/../test_helper'
 
-class DefaultDataTest < Test::Unit::TestCase
+class DefaultDataTest < ActiveSupport::TestCase
   include Redmine::I18n
   fixtures :roles
   
diff --git a/test/unit/document_category_test.rb b/test/unit/document_category_test.rb
index 6fa93a3..8b81443 100644
--- a/test/unit/document_category_test.rb
+++ b/test/unit/document_category_test.rb
@@ -17,7 +17,7 @@
 
 require File.dirname(__FILE__) + '/../test_helper'
 
-class DocumentCategoryTest < Test::Unit::TestCase
+class DocumentCategoryTest < ActiveSupport::TestCase
   fixtures :enumerations, :documents
 
   def test_should_be_an_enumeration
diff --git a/test/unit/document_test.rb b/test/unit/document_test.rb
index 1950f85..02ae94d 100644
--- a/test/unit/document_test.rb
+++ b/test/unit/document_test.rb
@@ -17,7 +17,7 @@
 
 require File.dirname(__FILE__) + '/../test_helper'
 
-class DocumentTest < Test::Unit::TestCase
+class DocumentTest < ActiveSupport::TestCase
   fixtures :projects, :enumerations, :documents
 
   def test_create
diff --git a/test/unit/enabled_module_test.rb b/test/unit/enabled_module_test.rb
index 3daec43..5e662eb 100644
--- a/test/unit/enabled_module_test.rb
+++ b/test/unit/enabled_module_test.rb
@@ -17,7 +17,7 @@
 
 require File.dirname(__FILE__) + '/../test_helper'
 
-class EnabledModuleTest < Test::Unit::TestCase
+class EnabledModuleTest < ActiveSupport::TestCase
   fixtures :projects, :wikis
   
   def test_enabling_wiki_should_create_a_wiki
diff --git a/test/unit/enumeration_test.rb b/test/unit/enumeration_test.rb
index 14ea5e2..4dc6e15 100644
--- a/test/unit/enumeration_test.rb
+++ b/test/unit/enumeration_test.rb
@@ -17,7 +17,7 @@
 
 require File.dirname(__FILE__) + '/../test_helper'
 
-class EnumerationTest < Test::Unit::TestCase
+class EnumerationTest < ActiveSupport::TestCase
   fixtures :enumerations, :issues
 
   def setup
diff --git a/test/unit/filesystem_adapter_test.rb b/test/unit/filesystem_adapter_test.rb
index 720d1e9..26e97bd 100644
--- a/test/unit/filesystem_adapter_test.rb
+++ b/test/unit/filesystem_adapter_test.rb
@@ -2,7 +2,7 @@
 require File.dirname(__FILE__) + '/../test_helper'
 
 
-class FilesystemAdapterTest < Test::Unit::TestCase
+class FilesystemAdapterTest < ActiveSupport::TestCase
   
   REPOSITORY_PATH = RAILS_ROOT.gsub(%r{config\/\.\.}, '') + '/tmp/test/filesystem_repository'  
   
diff --git a/test/unit/git_adapter_test.rb b/test/unit/git_adapter_test.rb
index 50bded0..9ab25c1 100644
--- a/test/unit/git_adapter_test.rb
+++ b/test/unit/git_adapter_test.rb
@@ -1,6 +1,6 @@
 require File.dirname(__FILE__) + '/../test_helper'
 
-class GitAdapterTest < Test::Unit::TestCase
+class GitAdapterTest < ActiveSupport::TestCase
   REPOSITORY_PATH = RAILS_ROOT.gsub(%r{config\/\.\.}, '') + '/tmp/test/git_repository'
 
   if File.directory?(REPOSITORY_PATH)  
diff --git a/test/unit/issue_category_test.rb b/test/unit/issue_category_test.rb
index a6edb3c..ebb9f0f 100644
--- a/test/unit/issue_category_test.rb
+++ b/test/unit/issue_category_test.rb
@@ -17,7 +17,7 @@
 
 require File.dirname(__FILE__) + '/../test_helper'
 
-class IssueCategoryTest < Test::Unit::TestCase
+class IssueCategoryTest < ActiveSupport::TestCase
   fixtures :issue_categories, :issues
 
   def setup
diff --git a/test/unit/issue_priority_test.rb b/test/unit/issue_priority_test.rb
index e2da1e8..6574bf3 100644
--- a/test/unit/issue_priority_test.rb
+++ b/test/unit/issue_priority_test.rb
@@ -17,7 +17,7 @@
 
 require File.dirname(__FILE__) + '/../test_helper'
 
-class IssuePriorityTest < Test::Unit::TestCase
+class IssuePriorityTest < ActiveSupport::TestCase
   fixtures :enumerations, :issues
 
   def test_should_be_an_enumeration
diff --git a/test/unit/issue_status_test.rb b/test/unit/issue_status_test.rb
index aebe74c..042f30e 100644
--- a/test/unit/issue_status_test.rb
+++ b/test/unit/issue_status_test.rb
@@ -17,7 +17,7 @@
 
 require File.dirname(__FILE__) + '/../test_helper'
 
-class IssueStatusTest < Test::Unit::TestCase
+class IssueStatusTest < ActiveSupport::TestCase
   fixtures :issue_statuses, :issues
 
   def test_create
diff --git a/test/unit/issue_test.rb b/test/unit/issue_test.rb
index a6710ed..147d31f 100644
--- a/test/unit/issue_test.rb
+++ b/test/unit/issue_test.rb
@@ -17,7 +17,7 @@
 
 require File.dirname(__FILE__) + '/../test_helper'
 
-class IssueTest < Test::Unit::TestCase
+class IssueTest < ActiveSupport::TestCase
   fixtures :projects, :users, :members, :member_roles,
            :trackers, :projects_trackers,
            :issue_statuses, :issue_categories, :issue_relations, :workflows, 
diff --git a/test/unit/journal_test.rb b/test/unit/journal_test.rb
index 147af4a..87273ad 100644
--- a/test/unit/journal_test.rb
+++ b/test/unit/journal_test.rb
@@ -17,7 +17,7 @@
 
 require File.dirname(__FILE__) + '/../test_helper'
 
-class JournalTest < Test::Unit::TestCase
+class JournalTest < ActiveSupport::TestCase
   fixtures :issues, :issue_statuses, :journals, :journal_details
 
   def setup
diff --git a/test/unit/lib/redmine/access_control_test.rb b/test/unit/lib/redmine/access_control_test.rb
index 5dd87d2..dcc84c1 100644
--- a/test/unit/lib/redmine/access_control_test.rb
+++ b/test/unit/lib/redmine/access_control_test.rb
@@ -17,7 +17,7 @@
 
 require File.dirname(__FILE__) + '/../../../test_helper'
 
-class Redmine::AccessControlTest < Test::Unit::TestCase
+class Redmine::AccessControlTest < ActiveSupport::TestCase
   
   def setup
     @access_module = Redmine::AccessControl
diff --git a/test/unit/lib/redmine/hook_test.rb b/test/unit/lib/redmine/hook_test.rb
index 9313a36..de74f1e 100644
--- a/test/unit/lib/redmine/hook_test.rb
+++ b/test/unit/lib/redmine/hook_test.rb
@@ -17,7 +17,7 @@
 
 require File.dirname(__FILE__) + '/../../../test_helper'
 
-class Redmine::Hook::ManagerTest < Test::Unit::TestCase
+class Redmine::Hook::ManagerTest < ActiveSupport::TestCase
 
   fixtures :issues
   
diff --git a/test/unit/lib/redmine/i18n_test.rb b/test/unit/lib/redmine/i18n_test.rb
index 8b91359..35401f1 100644
--- a/test/unit/lib/redmine/i18n_test.rb
+++ b/test/unit/lib/redmine/i18n_test.rb
@@ -17,7 +17,7 @@
 
 require File.dirname(__FILE__) + '/../../../test_helper'
 
-class Redmine::I18nTest < Test::Unit::TestCase
+class Redmine::I18nTest < ActiveSupport::TestCase
   include Redmine::I18n
   
   def setup
diff --git a/test/unit/lib/redmine/mime_type_test.rb b/test/unit/lib/redmine/mime_type_test.rb
index 79d0869..2cf1518 100644
--- a/test/unit/lib/redmine/mime_type_test.rb
+++ b/test/unit/lib/redmine/mime_type_test.rb
@@ -17,7 +17,7 @@
 
 require File.dirname(__FILE__) + '/../../../test_helper'
 
-class Redmine::MimeTypeTest < Test::Unit::TestCase
+class Redmine::MimeTypeTest < ActiveSupport::TestCase
   
   def test_of
     to_test = {'test.unk' => nil,
diff --git a/test/unit/lib/redmine/plugin_test.rb b/test/unit/lib/redmine/plugin_test.rb
index e6237c2..234da14 100644
--- a/test/unit/lib/redmine/plugin_test.rb
+++ b/test/unit/lib/redmine/plugin_test.rb
@@ -17,7 +17,7 @@
 
 require File.dirname(__FILE__) + '/../../../test_helper'
 
-class Redmine::PluginTest < Test::Unit::TestCase
+class Redmine::PluginTest < ActiveSupport::TestCase
 
   def setup
     @klass = Redmine::Plugin
diff --git a/test/unit/lib/redmine/unified_diff_test.rb b/test/unit/lib/redmine/unified_diff_test.rb
index 5e6ba1a..5b26cde 100644
--- a/test/unit/lib/redmine/unified_diff_test.rb
+++ b/test/unit/lib/redmine/unified_diff_test.rb
@@ -17,7 +17,7 @@
 
 require File.dirname(__FILE__) + '/../../../test_helper'
 
-class Redmine::UnifiedDiffTest < Test::Unit::TestCase
+class Redmine::UnifiedDiffTest < ActiveSupport::TestCase
   
   def setup
   end
diff --git a/test/unit/mail_handler_test.rb b/test/unit/mail_handler_test.rb
index 9a9d7d8..9b6c28b 100644
--- a/test/unit/mail_handler_test.rb
+++ b/test/unit/mail_handler_test.rb
@@ -17,7 +17,7 @@
 
 require File.dirname(__FILE__) + '/../test_helper'
 
-class MailHandlerTest < Test::Unit::TestCase
+class MailHandlerTest < ActiveSupport::TestCase
   fixtures :users, :projects, 
                    :enabled_modules,
                    :roles,
diff --git a/test/unit/mailer_test.rb b/test/unit/mailer_test.rb
index b1c39bb..ce5b0f0 100644
--- a/test/unit/mailer_test.rb
+++ b/test/unit/mailer_test.rb
@@ -17,7 +17,7 @@
 
 require File.dirname(__FILE__) + '/../test_helper'
 
-class MailerTest < Test::Unit::TestCase
+class MailerTest < ActiveSupport::TestCase
   include Redmine::I18n
   fixtures :projects, :issues, :users, :members, :member_roles, :documents, :attachments, :news, :tokens, :journals, :journal_details, :changesets, :trackers, :issue_statuses, :enumerations, :messages, :boards, :repositories
   
diff --git a/test/unit/member_test.rb b/test/unit/member_test.rb
index 66f1283..87e0086 100644
--- a/test/unit/member_test.rb
+++ b/test/unit/member_test.rb
@@ -17,7 +17,7 @@
 
 require File.dirname(__FILE__) + '/../test_helper'
 
-class MemberTest < Test::Unit::TestCase
+class MemberTest < ActiveSupport::TestCase
   fixtures :users, :projects, :roles, :members, :member_roles
 
   def setup
diff --git a/test/unit/mercurial_adapter_test.rb b/test/unit/mercurial_adapter_test.rb
index a2673ad..f7b0d3c 100644
--- a/test/unit/mercurial_adapter_test.rb
+++ b/test/unit/mercurial_adapter_test.rb
@@ -2,7 +2,7 @@ require File.dirname(__FILE__) + '/../test_helper'
 begin
   require 'mocha'
   
-  class MercurialAdapterTest < Test::Unit::TestCase
+  class MercurialAdapterTest < ActiveSupport::TestCase
     
     TEMPLATES_DIR = Redmine::Scm::Adapters::MercurialAdapter::TEMPLATES_DIR
     TEMPLATE_NAME = Redmine::Scm::Adapters::MercurialAdapter::TEMPLATE_NAME
diff --git a/test/unit/message_test.rb b/test/unit/message_test.rb
index 09857fb..5bce8a8 100644
--- a/test/unit/message_test.rb
+++ b/test/unit/message_test.rb
@@ -17,7 +17,7 @@
 
 require File.dirname(__FILE__) + '/../test_helper'
 
-class MessageTest < Test::Unit::TestCase
+class MessageTest < ActiveSupport::TestCase
   fixtures :projects, :roles, :members, :member_roles, :boards, :messages, :users, :watchers
 
   def setup
diff --git a/test/unit/news_test.rb b/test/unit/news_test.rb
index a4fc89e..e9d3880 100644
--- a/test/unit/news_test.rb
+++ b/test/unit/news_test.rb
@@ -17,7 +17,7 @@
 
 require File.dirname(__FILE__) + '/../test_helper'
 
-class NewsTest < Test::Unit::TestCase
+class NewsTest < ActiveSupport::TestCase
   fixtures :projects, :users, :roles, :members, :member_roles, :enabled_modules, :news
 
   def valid_news
diff --git a/test/unit/project_test.rb b/test/unit/project_test.rb
index 60bc4f1..7d55048 100644
--- a/test/unit/project_test.rb
+++ b/test/unit/project_test.rb
@@ -17,7 +17,7 @@
 
 require File.dirname(__FILE__) + '/../test_helper'
 
-class ProjectTest < Test::Unit::TestCase
+class ProjectTest < ActiveSupport::TestCase
   fixtures :projects, :enabled_modules, 
            :issues, :issue_statuses, :journals, :journal_details,
            :users, :members, :member_roles, :roles, :projects_trackers, :trackers, :boards,
diff --git a/test/unit/query_test.rb b/test/unit/query_test.rb
index 73efa42..f1f9397 100644
--- a/test/unit/query_test.rb
+++ b/test/unit/query_test.rb
@@ -17,7 +17,7 @@
 
 require File.dirname(__FILE__) + '/../test_helper'
 
-class QueryTest < Test::Unit::TestCase
+class QueryTest < ActiveSupport::TestCase
   fixtures :projects, :enabled_modules, :users, :members, :member_roles, :roles, :trackers, :issue_statuses, :issue_categories, :enumerations, :issues, :watchers, :custom_fields, :custom_values, :versions, :queries
 
   def test_custom_fields_for_all_projects_should_be_available_in_global_queries
diff --git a/test/unit/repository_bazaar_test.rb b/test/unit/repository_bazaar_test.rb
index b7a3cf9..c29e04e 100644
--- a/test/unit/repository_bazaar_test.rb
+++ b/test/unit/repository_bazaar_test.rb
@@ -17,7 +17,7 @@
 
 require File.dirname(__FILE__) + '/../test_helper'
 
-class RepositoryBazaarTest < Test::Unit::TestCase
+class RepositoryBazaarTest < ActiveSupport::TestCase
   fixtures :projects
   
   # No '..' in the repository path
diff --git a/test/unit/repository_cvs_test.rb b/test/unit/repository_cvs_test.rb
index 47c4070..d240a6e 100644
--- a/test/unit/repository_cvs_test.rb
+++ b/test/unit/repository_cvs_test.rb
@@ -17,7 +17,7 @@
 
 require File.dirname(__FILE__) + '/../test_helper'
 require 'pp'
-class RepositoryCvsTest < Test::Unit::TestCase
+class RepositoryCvsTest < ActiveSupport::TestCase
   fixtures :projects
   
   # No '..' in the repository path
diff --git a/test/unit/repository_darcs_test.rb b/test/unit/repository_darcs_test.rb
index 0c8c9a1..b9ad95d 100644
--- a/test/unit/repository_darcs_test.rb
+++ b/test/unit/repository_darcs_test.rb
@@ -17,7 +17,7 @@
 
 require File.dirname(__FILE__) + '/../test_helper'
 
-class RepositoryDarcsTest < Test::Unit::TestCase
+class RepositoryDarcsTest < ActiveSupport::TestCase
   fixtures :projects
   
   # No '..' in the repository path
diff --git a/test/unit/repository_filesystem_test.rb b/test/unit/repository_filesystem_test.rb
index 6b643f9..7688dd4 100644
--- a/test/unit/repository_filesystem_test.rb
+++ b/test/unit/repository_filesystem_test.rb
@@ -17,7 +17,7 @@
 
 require File.dirname(__FILE__) + '/../test_helper'
 
-class RepositoryFilesystemTest < Test::Unit::TestCase
+class RepositoryFilesystemTest < ActiveSupport::TestCase
   fixtures :projects
   
   # No '..' in the repository path
diff --git a/test/unit/repository_git_test.rb b/test/unit/repository_git_test.rb
index 3827743..5ebbb00 100644
--- a/test/unit/repository_git_test.rb
+++ b/test/unit/repository_git_test.rb
@@ -17,7 +17,7 @@
 
 require File.dirname(__FILE__) + '/../test_helper'
 
-class RepositoryGitTest < Test::Unit::TestCase
+class RepositoryGitTest < ActiveSupport::TestCase
   fixtures :projects
   
   # No '..' in the repository path
diff --git a/test/unit/repository_mercurial_test.rb b/test/unit/repository_mercurial_test.rb
index 0f993ac..6ce3d5f 100644
--- a/test/unit/repository_mercurial_test.rb
+++ b/test/unit/repository_mercurial_test.rb
@@ -17,7 +17,7 @@
 
 require File.dirname(__FILE__) + '/../test_helper'
 
-class RepositoryMercurialTest < Test::Unit::TestCase
+class RepositoryMercurialTest < ActiveSupport::TestCase
   fixtures :projects
   
   # No '..' in the repository path
diff --git a/test/unit/repository_subversion_test.rb b/test/unit/repository_subversion_test.rb
index b0eb88c..17a0a42 100644
--- a/test/unit/repository_subversion_test.rb
+++ b/test/unit/repository_subversion_test.rb
@@ -17,7 +17,7 @@
 
 require File.dirname(__FILE__) + '/../test_helper'
 
-class RepositorySubversionTest < Test::Unit::TestCase
+class RepositorySubversionTest < ActiveSupport::TestCase
   fixtures :projects
   
   # No '..' in the repository path for svn
diff --git a/test/unit/repository_test.rb b/test/unit/repository_test.rb
index 497eeab..cc356ec 100644
--- a/test/unit/repository_test.rb
+++ b/test/unit/repository_test.rb
@@ -17,7 +17,7 @@
 
 require File.dirname(__FILE__) + '/../test_helper'
 
-class RepositoryTest < Test::Unit::TestCase
+class RepositoryTest < ActiveSupport::TestCase
   fixtures :projects,
            :trackers,
            :projects_trackers,
diff --git a/test/unit/role_test.rb b/test/unit/role_test.rb
index cab668c..1e76dd8 100644
--- a/test/unit/role_test.rb
+++ b/test/unit/role_test.rb
@@ -17,7 +17,7 @@
 
 require File.dirname(__FILE__) + '/../test_helper'
 
-class RoleTest < Test::Unit::TestCase
+class RoleTest < ActiveSupport::TestCase
   fixtures :roles, :workflows
 
   def test_copy_workflows
diff --git a/test/unit/search_test.rb b/test/unit/search_test.rb
index 46d7694..71ed7ad 100644
--- a/test/unit/search_test.rb
+++ b/test/unit/search_test.rb
@@ -17,7 +17,7 @@
 
 require File.dirname(__FILE__) + '/../test_helper'
 
-class SearchTest < Test::Unit::TestCase
+class SearchTest < ActiveSupport::TestCase
   fixtures :users,
            :members, 
            :member_roles,
diff --git a/test/unit/setting_test.rb b/test/unit/setting_test.rb
index 34d07c1..25ec417 100644
--- a/test/unit/setting_test.rb
+++ b/test/unit/setting_test.rb
@@ -17,7 +17,7 @@
 
 require File.dirname(__FILE__) + '/../test_helper'
 
-class SettingTest < Test::Unit::TestCase
+class SettingTest < ActiveSupport::TestCase
   
   def test_read_default
     assert_equal "Redmine", Setting.app_title
diff --git a/test/unit/subversion_adapter_test.rb b/test/unit/subversion_adapter_test.rb
index 9f20883..ddef52d 100644
--- a/test/unit/subversion_adapter_test.rb
+++ b/test/unit/subversion_adapter_test.rb
@@ -19,7 +19,7 @@ require 'mkmf'
 
 require File.dirname(__FILE__) + '/../test_helper'
 
-class SubversionAdapterTest < Test::Unit::TestCase
+class SubversionAdapterTest < ActiveSupport::TestCase
   
   if find_executable0('svn')
     def test_client_version
diff --git a/test/unit/time_entry_activity_test.rb b/test/unit/time_entry_activity_test.rb
index f99c8ab..9422a91 100644
--- a/test/unit/time_entry_activity_test.rb
+++ b/test/unit/time_entry_activity_test.rb
@@ -17,7 +17,7 @@
 
 require File.dirname(__FILE__) + '/../test_helper'
 
-class TimeEntryActivityTest < Test::Unit::TestCase
+class TimeEntryActivityTest < ActiveSupport::TestCase
   fixtures :enumerations, :time_entries
 
   def test_should_be_an_enumeration
diff --git a/test/unit/time_entry_test.rb b/test/unit/time_entry_test.rb
index dd54fd1..7ac1c02 100644
--- a/test/unit/time_entry_test.rb
+++ b/test/unit/time_entry_test.rb
@@ -17,7 +17,7 @@
 
 require File.dirname(__FILE__) + '/../test_helper'
 
-class TimeEntryTest < Test::Unit::TestCase
+class TimeEntryTest < ActiveSupport::TestCase
   fixtures :issues, :projects, :users, :time_entries
 
   def test_hours_format
diff --git a/test/unit/token_test.rb b/test/unit/token_test.rb
index 64ac85a..42791e6 100644
--- a/test/unit/token_test.rb
+++ b/test/unit/token_test.rb
@@ -17,7 +17,7 @@
 
 require File.dirname(__FILE__) + '/../test_helper'
 
-class TokenTest < Test::Unit::TestCase
+class TokenTest < ActiveSupport::TestCase
   fixtures :tokens
 
   def test_create
diff --git a/test/unit/tracker_test.rb b/test/unit/tracker_test.rb
index 6dab889..efc2aa7 100644
--- a/test/unit/tracker_test.rb
+++ b/test/unit/tracker_test.rb
@@ -17,7 +17,7 @@
 
 require File.dirname(__FILE__) + '/../test_helper'
 
-class TrackerTest < Test::Unit::TestCase
+class TrackerTest < ActiveSupport::TestCase
   fixtures :trackers, :workflows
 
   def test_copy_workflows
diff --git a/test/unit/user_preference_test.rb b/test/unit/user_preference_test.rb
index cf6787b..19dc63f 100644
--- a/test/unit/user_preference_test.rb
+++ b/test/unit/user_preference_test.rb
@@ -17,7 +17,7 @@
 
 require File.dirname(__FILE__) + '/../test_helper'
 
-class UserPreferenceTest < Test::Unit::TestCase
+class UserPreferenceTest < ActiveSupport::TestCase
   fixtures :users, :user_preferences
 
   def test_create
diff --git a/test/unit/user_test.rb b/test/unit/user_test.rb
index 7080c0b..e685f53 100644
--- a/test/unit/user_test.rb
+++ b/test/unit/user_test.rb
@@ -17,7 +17,7 @@
 
 require File.dirname(__FILE__) + '/../test_helper'
 
-class UserTest < Test::Unit::TestCase
+class UserTest < ActiveSupport::TestCase
   fixtures :users, :members, :projects, :roles, :member_roles
 
   def setup
diff --git a/test/unit/version_test.rb b/test/unit/version_test.rb
index 6c5297f..7df8579 100644
--- a/test/unit/version_test.rb
+++ b/test/unit/version_test.rb
@@ -17,7 +17,7 @@
 
 require File.dirname(__FILE__) + '/../test_helper'
 
-class VersionTest < Test::Unit::TestCase
+class VersionTest < ActiveSupport::TestCase
   fixtures :projects, :users, :issues, :issue_statuses, :trackers, :enumerations, :versions
 
   def setup
diff --git a/test/unit/watcher_test.rb b/test/unit/watcher_test.rb
index 9566e6a..f49365e 100644
--- a/test/unit/watcher_test.rb
+++ b/test/unit/watcher_test.rb
@@ -17,7 +17,7 @@
 
 require File.dirname(__FILE__) + '/../test_helper'
 
-class WatcherTest < Test::Unit::TestCase
+class WatcherTest < ActiveSupport::TestCase
   fixtures :issues, :users
 
   def setup
diff --git a/test/unit/wiki_content_test.rb b/test/unit/wiki_content_test.rb
index f3f8bc0..372121b 100644
--- a/test/unit/wiki_content_test.rb
+++ b/test/unit/wiki_content_test.rb
@@ -17,7 +17,7 @@
 
 require File.dirname(__FILE__) + '/../test_helper'
 
-class WikiContentTest < Test::Unit::TestCase
+class WikiContentTest < ActiveSupport::TestCase
   fixtures :wikis, :wiki_pages, :wiki_contents, :wiki_content_versions, :users
 
   def setup
diff --git a/test/unit/wiki_page_test.rb b/test/unit/wiki_page_test.rb
index df41a4a..1837edb 100644
--- a/test/unit/wiki_page_test.rb
+++ b/test/unit/wiki_page_test.rb
@@ -17,7 +17,7 @@
 
 require File.dirname(__FILE__) + '/../test_helper'
 
-class WikiPageTest < Test::Unit::TestCase
+class WikiPageTest < ActiveSupport::TestCase
   fixtures :projects, :wikis, :wiki_pages, :wiki_contents, :wiki_content_versions
 
   def setup
diff --git a/test/unit/wiki_redirect_test.rb b/test/unit/wiki_redirect_test.rb
index 12f6b7d..7e80638 100644
--- a/test/unit/wiki_redirect_test.rb
+++ b/test/unit/wiki_redirect_test.rb
@@ -17,7 +17,7 @@
 
 require File.dirname(__FILE__) + '/../test_helper'
 
-class WikiRedirectTest < Test::Unit::TestCase
+class WikiRedirectTest < ActiveSupport::TestCase
   fixtures :projects, :wikis
 
   def setup
diff --git a/test/unit/wiki_test.rb b/test/unit/wiki_test.rb
index 23d4f44..fd8a375 100644
--- a/test/unit/wiki_test.rb
+++ b/test/unit/wiki_test.rb
@@ -17,7 +17,7 @@
 
 require File.dirname(__FILE__) + '/../test_helper'
 
-class WikiTest < Test::Unit::TestCase
+class WikiTest < ActiveSupport::TestCase
   fixtures :wikis, :wiki_pages, :wiki_contents, :wiki_content_versions
   
   def test_create
diff --git a/vendor/plugins/engines/Rakefile b/vendor/plugins/engines/Rakefile
index b964022..6c621de 100644
--- a/vendor/plugins/engines/Rakefile
+++ b/vendor/plugins/engines/Rakefile
@@ -172,16 +172,29 @@ namespace :test do
   
   desc 'Update the plugin and tests files in the test application from the plugin'
   task :mirror_engine_files => [:test_app, :copy_engines_plugin] do
-    puts "> Modifying default config files to load engines plugin"
+    puts "> Tweaking generated application to be suitable for testing"
+    
+    # Replace the Rails plugin loader with the engines one.
     insert_line("require File.join(File.dirname(__FILE__), '../vendor/plugins/engines/boot')",
                 :into => 'config/environment.rb',
                 :after => "require File.join(File.dirname(__FILE__), 'boot')")
-                
-    insert_line('map.from_plugin :test_routing', :into => 'config/routes.rb', 
-                :after => /\AActionController::Routing::Routes/)
-                
+    
+    # Add the engines test helper to handle fixtures & stuff.
     insert_line("require 'engines_test_helper'", :into => 'test/test_helper.rb')
     
+    # Run engine plugin tests when running the application 
+    insert_line("task :test => ['test:engines:all']", :into => 'Rakefile')
+    
+    # We want exceptions to be raised
+    insert_line("def rescue_action(e) raise e end;", 
+                :into => "app/controllers/application_controller.rb",
+                :after => "class ApplicationController < ActionController::Base")
+    
+    # We need this method to test where actions are being rendered from.
+    insert_line("include RenderInformation", 
+                :into => "app/controllers/application_controller.rb",
+                :after => "class ApplicationController < ActionController::Base")
+    
     puts "> Mirroring test application files into #{test_app_dir}"
     mirror_test_files('app')
     mirror_test_files('lib')
diff --git a/vendor/plugins/engines/about.yml b/vendor/plugins/engines/about.yml
index 619bd5a..13f55ec 100644
--- a/vendor/plugins/engines/about.yml
+++ b/vendor/plugins/engines/about.yml
@@ -4,4 +4,4 @@ homepage: http://www.rails-engines.org
 summary: Enhances the plugin mechanism to perform more flexible sharing
 description: The Rails Engines plugin allows the sharing of almost any type of code or asset that you could use in a Rails application, including controllers, models, stylesheets, and views.
 license: MIT
-version: 2.1.0
\ No newline at end of file
+version: 2.3.2
\ No newline at end of file
diff --git a/vendor/plugins/engines/boot.rb b/vendor/plugins/engines/boot.rb
index f80f2b1..1c55e21 100644
--- a/vendor/plugins/engines/boot.rb
+++ b/vendor/plugins/engines/boot.rb
@@ -1,7 +1,7 @@
 begin
   require 'rails/version'
-  unless Rails::VERSION::MAJOR >= 2 && Rails::VERSION::MINOR >= 2 && Rails::VERSION::TINY >= 0
-    raise "This version of the engines plugin requires Rails 2.2.0 or later!"
+  unless Rails::VERSION::MAJOR >= 2 && Rails::VERSION::MINOR >= 3 && Rails::VERSION::TINY >= 2
+    raise "This version of the engines plugin requires Rails 2.3.2 or later!"
   end
 end
 
diff --git a/vendor/plugins/engines/init.rb b/vendor/plugins/engines/init.rb
index df94526..2841816 100644
--- a/vendor/plugins/engines/init.rb
+++ b/vendor/plugins/engines/init.rb
@@ -1,5 +1,5 @@
 # Only call Engines.init once, in the after_initialize block so that Rails
 # plugin reloading works when turned on
 config.after_initialize do
-  Engines.init if defined? :Engines
-end
+  Engines.init(initializer) if defined? :Engines
+end
\ No newline at end of file
diff --git a/vendor/plugins/engines/lib/engines.rb b/vendor/plugins/engines/lib/engines.rb
index cb97e47..d601710 100644
--- a/vendor/plugins/engines/lib/engines.rb
+++ b/vendor/plugins/engines/lib/engines.rb
@@ -43,7 +43,7 @@ module Engines
   
   # List of extensions to load, can be changed in init.rb before calling Engines.init
   mattr_accessor :rails_extensions
-  self.rails_extensions = %w(action_mailer asset_helpers form_tag_helpers routing migrations dependencies)
+  self.rails_extensions = %w(asset_helpers form_tag_helpers migrations dependencies)
   
   # The name of the public directory to mirror public engine assets into.
   # Defaults to <tt>RAILS_ROOT/public/plugin_assets</tt>.
@@ -68,7 +68,7 @@ module Engines
   mattr_accessor :disable_application_code_loading
   self.disable_application_code_loading = false
   
-  # Set this ti true if code should not be mixed (i.e. it will be loaded
+  # Set this to true if code should not be mixed (i.e. it will be loaded
   # from the first valid path on $LOAD_PATH)
   mattr_accessor :disable_code_mixing
   self.disable_code_mixing = false
@@ -81,7 +81,7 @@ module Engines
   self.code_mixing_file_types = %w(controller helper)
   
   class << self
-    def init
+    def init(initializer)
       load_extensions
       Engines::Assets.initialize_base_public_directory
     end
@@ -124,9 +124,9 @@ module Engines
     # and that they are placed within plugin/app/things (the pluralized form of 'thing').
     # 
     # It's important to note that you'll also want to ensure that the "things" are
-    # on your load path in your plugin's init.rb:
+    # on your load path by including them in Rails load path mechanism, e.g. in init.rb:
     #
-    #   Rails.plugins[:my_plugin].code_paths << "app/things"
+    #  ActiveSupport::Dependencies.load_paths << File.join(File.dirname(__FILE__), 'app', 'things'))
     #
     def mix_code_from(*types)
       self.code_mixing_file_types += types.map { |x| x.to_s.singularize }
diff --git a/vendor/plugins/engines/lib/engines/plugin.rb b/vendor/plugins/engines/lib/engines/plugin.rb
index 488bcd4..c52bbb0 100644
--- a/vendor/plugins/engines/lib/engines/plugin.rb
+++ b/vendor/plugins/engines/lib/engines/plugin.rb
@@ -4,23 +4,9 @@
 #
 #   Engines.plugins[:plugin_name]
 #
-# If this plugin contains paths in directories other than <tt>app/controllers</tt>,
-# <tt>app/helpers</tt>, <tt>app/models</tt> and <tt>components</tt>, authors can
-# declare this by adding extra paths to #code_paths:
-#
-#    Rails.plugin[:my_plugin].code_paths << "app/sweepers" << "vendor/my_lib"
-#
 # Other properties of the Plugin instance can also be set.
 module Engines
   class Plugin < Rails::Plugin    
-    # Plugins can add code paths to this attribute in init.rb if they 
-    # need plugin directories to be added to the load path, i.e.
-    #
-    #   plugin.code_paths << 'app/other_classes'
-    #
-    # Defaults to ["app/controllers", "app/helpers", "app/models", "components"]
-    attr_accessor :code_paths
-
     # Plugins can add paths to this attribute in init.rb if they need
     # controllers loaded from additional locations. 
     attr_accessor :controller_paths
@@ -32,16 +18,6 @@ module Engines
     attr_accessor :public_directory   
     
     protected
-  
-      # The default set of code paths which will be added to $LOAD_PATH
-      # and Dependencies.load_paths
-      def default_code_paths
-        # lib will actually be removed from the load paths when we call
-        # uniq! in #inject_into_load_paths, but it's important to keep it
-        # around (for the documentation tasks, for instance).
-        %w(app/controllers app/helpers app/models components lib)
-      end
-    
       # The default set of code paths which will be added to the routing system
       def default_controller_paths
         %w(app/controllers components)
@@ -58,41 +34,23 @@ module Engines
   
     def initialize(directory)
       super directory
-      @code_paths = default_code_paths
       @controller_paths = default_controller_paths
       @public_directory = default_public_directory
     end
   
-    # Returns a list of paths this plugin wishes to make available in $LOAD_PATH
-    #
-    # Overwrites the correspondend method in the superclass  
-    def load_paths
-      report_nonexistant_or_empty_plugin! unless valid?
-      select_existing_paths :code_paths
-    end
-    
     # Extends the superclass' load method to additionally mirror public assets
     def load(initializer)
       return if loaded?
       super initializer
-      add_plugin_view_paths
       add_plugin_locale_paths
       Assets.mirror_files_for(self)
     end    
   
-    # for code_paths and controller_paths select those paths that actually 
-    # exist in the plugin's directory
+    # select those paths that actually exist in the plugin's directory
     def select_existing_paths(name)
       Engines.select_existing_paths(self.send(name).map { |p| File.join(directory, p) })
     end    
 
-    def add_plugin_view_paths
-      view_path = File.join(directory, 'app', 'views')
-      if File.exist?(view_path)
-        ActionController::Base.prepend_view_path(view_path) # push it just underneath the app
-      end
-    end
-
     def add_plugin_locale_paths
       locale_path = File.join(directory, 'locales')
       return unless File.exists?(locale_path)
@@ -112,11 +70,6 @@ module Engines
       "#{File.basename(Engines.public_directory)}/#{name}"
     end
     
-    # The path to this plugin's routes file
-    def routes_path
-      File.join(directory, "routes.rb")
-    end
-
     # The directory containing this plugin's migrations (<tt>plugin/db/migrate</tt>)
     def migration_directory
       File.join(self.directory, 'db', 'migrate')
diff --git a/vendor/plugins/engines/lib/engines/plugin/loader.rb b/vendor/plugins/engines/lib/engines/plugin/loader.rb
index a5be596..e316e47 100644
--- a/vendor/plugins/engines/lib/engines/plugin/loader.rb
+++ b/vendor/plugins/engines/lib/engines/plugin/loader.rb
@@ -5,14 +5,7 @@ module Engines
         def register_plugin_as_loaded(plugin)
           super plugin
           Engines.plugins << plugin
-          register_to_routing(plugin)
         end    
-        
-        # Registers the plugin's controller_paths for the routing system. 
-        def register_to_routing(plugin)
-          initializer.configuration.controller_paths += plugin.select_existing_paths(:controller_paths)
-          initializer.configuration.controller_paths.uniq!
-        end
     end
   end
 end
\ No newline at end of file
diff --git a/vendor/plugins/engines/lib/engines/rails_extensions/action_mailer.rb b/vendor/plugins/engines/lib/engines/rails_extensions/action_mailer.rb
deleted file mode 100644
index 32198d8..0000000
--- a/vendor/plugins/engines/lib/engines/rails_extensions/action_mailer.rb
+++ /dev/null
@@ -1,82 +0,0 @@
-# The way ActionMailer is coded in terms of finding templates is very restrictive, to the point
-# where all templates for rendering must exist under the single base path. This is difficult to
-# work around without re-coding significant parts of the action mailer code.
-#
-# ---
-#
-# The MailTemplates module overrides two (private) methods from ActionMailer to enable mail 
-# templates within plugins:
-#
-# [+template_path+]             which now produces the contents of #template_paths
-# [+initialize_template_class+] which now find the first matching template and creates 
-#                               an ActionVew::Base instance with the correct view_paths
-#
-# Ideally ActionMailer would use the same template-location logic as ActionView, and the same
-# view paths as ActionController::Base.view_paths, but it currently does not.
-module Engines::RailsExtensions::ActionMailer
-  def self.included(base) #:nodoc:
-    base.class_eval do
-      alias_method_chain :template_path, :engine_additions
-      alias_method_chain :initialize_template_class, :engine_additions
-    end
-  end
-
-  private
-  
-    #--
-    # ActionMailer::Base#create uses two mechanisms to determine the proper template file(s)
-    # to load. Firstly, it searches within the template_root for files that much the explicit
-    # (or implicit) part encodings (like signup.text.plain.erb for the signup action). 
-    # This is how implicit multipart emails are built, by the way.
-    #
-    # Secondly, it then creates an ActionMailer::Base instance with it's view_paths parameter
-    # set to the template_root, so that ActionMailer will then take over rendering the
-    # templates.
-    #
-    # Ideally, ActionMailer would pass the same set of view paths as it gets in a normal
-    # request (i.e. ActionController::Base.view_paths), so that all possible view paths
-    # were searched. However, this seems to introduce some problems with helper modules.
-    #
-    # So instead, and because we have to fool these two independent parts of ActionMailer,
-    # we fudge with the mechanisms it uses to find the templates (via template_paths, and
-    # template_path_with_engine_additions), and then intercept the creation of the ActionView
-    # instance so we can set the view_paths (in initialize_template_class_with_engine_additions).
-    #++
-  
-    # Returns all possible template paths for the current mailer, including those
-    # within the loaded plugins.
-    def template_paths
-      paths = Engines.plugins.by_precedence.map { |p| "#{p.directory}/app/views/#{mailer_name}" }
-      paths.unshift(template_path_without_engine_additions) unless Engines.disable_application_view_loading
-      paths
-    end
-
-    # Return something that Dir[] can glob against. This method is called in 
-    # ActionMailer::Base#create! and used as part of an argument to Dir. We can
-    # take advantage of this by using some of the features of Dir.glob to search
-    # multiple paths for matching files.
-    def template_path_with_engine_additions
-      "{#{template_paths.join(",")}}"
-    end
-
-    # Return an instance of ActionView::Base with the view paths set to all paths
-    # in ActionController::Base.view_paths (i.e. including all plugin view paths)
-    def initialize_template_class_with_engine_additions(assigns)
-      # I'd like to just return this, but I get problems finding methods in helper
-      # modules if the method implemention from the regular class is not called
-      # 
-      # ActionView::Base.new(ActionController::Base.view_paths.dup, assigns, self)
-      renderer = initialize_template_class_without_engine_additions(assigns)
-      renderer.view_paths.unshift(*ActionController::Base.view_paths.dup)
-      renderer
-    end
-end
-
-# We don't need to do this if ActionMailer hasn't been loaded.
-if Object.const_defined?(:ActionMailer) 
-  module ::ActionMailer #:nodoc:
-    class Base #:nodoc:
-      include Engines::RailsExtensions::ActionMailer
-    end
-  end
-end
\ No newline at end of file
diff --git a/vendor/plugins/engines/lib/engines/rails_extensions/routing.rb b/vendor/plugins/engines/lib/engines/rails_extensions/routing.rb
deleted file mode 100644
index aed85ff..0000000
--- a/vendor/plugins/engines/lib/engines/rails_extensions/routing.rb
+++ /dev/null
@@ -1,83 +0,0 @@
-# Effective use of Rails' routes can help create a tidy and elegant set of URLs,
-# and is a significant part of creating an external API for your web application.
-# 
-# When developing plugins which contain controllers, it seems obvious that including
-# the corresponding routes would be extremely useful. This is particularly true
-# when exposing RESTful resources using the new REST-ian features of Rails.
-#
-# == Including routes in your plugin
-#
-# The engines plugin makes it possible to include a set of routes within your plugin
-# very simply, as it turns out. Include a <tt>routes.rb</tt> file like the one below 
-# at the root of your plugin (along-side <tt>init.rb</tt> and <tt>lib/</tt>):
-# 
-#   connect "/login", :controller => "account", :action => "login"
-#
-#   # add a named route
-#   logout "/logout", :controller => "account", :action => "logout"
-#
-#   # some restful stuff
-#   resources :things do |t|
-#     t.resources :other_things
-#   end
-# 
-# Everywhere in a normal <tt>RAILS_ROOT/config/routes.rb</tt> file 
-# where you might have <tt>map.connect</tt>, you just use <tt>connect</tt> in your 
-# plugin's <tt>routes.rb</tt>.
-# 
-# === Hooking it up in your application
-#
-# While it would be possible to have each plugin's routes automagically included into
-# the application's route set, to do so would actually be a stunningly bad idea. Route
-# priority is the key issue here. You, the application developer, needs to be in complete
-# control when it comes to specifying the priority of routes in your application, since 
-# the ordering of your routes directly affects how Rails will interpret incoming requests.
-# 
-# To add plugin routes into your application's <tt>routes.rb</tt> file, you need to explicitly 
-# map them in using the Engines::RailsExtensions::Routing#from_plugin method:
-# 
-#   ApplicationController::Routing::Routes.draw do |map|
-#
-#     map.connect "/app_stuff", :controller => "application_thing" # etc...
-#
-#     # This line includes the routes from the given plugin at this point, giving you
-#     # control over the priority of your application routes 
-#     map.from_plugin :your_plugin
-#
-#     map.connect ":controller/:action/:id"
-#   end
-# 
-# By including routes in plugins which have controllers, you can now share in a simple way 
-# a compact and elegant URL scheme which corresponds to those controllers.
-#
-# ---
-#
-# The Engines::RailsExtensions::Routing module defines extensions to Rails' 
-# routing (ActionController::Routing) mechanism such that routes can be loaded 
-# from a given plugin.
-#
-# The key method is Engines::RailsExtensions::Routing#from_plugin, which can be called 
-# within your application's <tt>config/routes.rb</tt> file to load plugin routes at that point.
-#
-module Engines::RailsExtensions::Routing
-  # Loads the set of routes from within a plugin and evaluates them at this
-  # point within an application's main <tt>routes.rb</tt> file.
-  #
-  # Plugin routes are loaded from <tt><plugin_root>/routes.rb</tt>.
-  def from_plugin(name)
-    map = self # to make 'map' available within the plugin route file
-    routes_path = Engines.plugins[name].routes_path
-    eval(IO.read(routes_path), binding, routes_path) if File.file?(routes_path)
-  end
-end
-
-  
-module ::ActionController #:nodoc:
-  module Routing #:nodoc:
-    class RouteSet #:nodoc:
-      class Mapper #:nodoc:
-        include Engines::RailsExtensions::Routing
-      end
-    end
-  end
-end
diff --git a/vendor/plugins/engines/lib/engines/testing.rb b/vendor/plugins/engines/lib/engines/testing.rb
index f7833c3..c411f83 100644
--- a/vendor/plugins/engines/lib/engines/testing.rb
+++ b/vendor/plugins/engines/lib/engines/testing.rb
@@ -67,10 +67,14 @@ module Engines::Testing
   # This method is called by the engines-supplied plugin testing rake tasks
   def self.setup_plugin_fixtures(plugins = Engines.plugins.by_precedence)
     
+    # First, clear the directory
+    Dir.glob("#{self.temporary_fixtures_directory}/*.yml").each{|fixture| File.delete(fixture)}
+    
     # Copy all plugin fixtures, and then the application fixtures, into this directory
     plugins.each do |plugin| 
       plugin_fixtures_directory =  File.join(plugin.directory, "test", "fixtures")
-      if File.directory?(plugin_fixtures_directory)
+      plugin_app_directory =  File.join(plugin.directory, "app")
+      if File.directory?(plugin_app_directory) && File.directory?(plugin_fixtures_directory)
         Engines.mirror_files_from(plugin_fixtures_directory, self.temporary_fixtures_directory)
       end
     end
@@ -84,4 +88,14 @@ module Engines::Testing
     ActiveSupport::TestCase.fixture_path = self.temporary_fixtures_directory
     $LOAD_PATH.unshift self.temporary_fixtures_directory
   end
+  
+  # overridden test should be in test/{unit,functional,integration}/{plugin_name}/{test_name}
+  def self.override_tests_from_app
+    filename = caller.first.split(":").first
+    plugin_name = filename.split("/")[-4]
+    test_kind = filename.split("/")[-2]
+    override_file = File.expand_path(File.join(File.dirname(filename), "..", "..", "..", "..", "..", "test", 
+                                               test_kind, plugin_name, File.basename(filename)))
+    load(override_file) if File.exist?(override_file)
+  end
 end
\ No newline at end of file
diff --git a/vendor/plugins/engines/tasks/engines.rake b/vendor/plugins/engines/tasks/engines.rake
index 0ffd7e6..48e3170 100644
--- a/vendor/plugins/engines/tasks/engines.rake
+++ b/vendor/plugins/engines/tasks/engines.rake
@@ -118,10 +118,10 @@ namespace :db do
     end
     
     desc 'Migrate a specified plugin.'
-    task({:plugin => :environment}, :name, :version) do |task, args|
-      name = args[:name] || ENV['NAME']
+    task(:plugin => :environment) do
+      name = ENV['NAME']
       if plugin = Engines.plugins[name]
-        version = args[:version] || ENV['VERSION']
+        version = ENV['VERSION']
         puts "Migrating #{plugin.name} to " + (version ? "version #{version}" : 'latest version') + " ..."
         plugin.migrate(version ? version.to_i : nil)
       else
@@ -152,8 +152,8 @@ end
 
 # this is just a modification of the original task in railties/lib/tasks/documentation.rake, 
 # because the default task doesn't support subdirectories like <plugin>/app or
-# <plugin>/component. These tasks now include every file under a plugin's code paths (see
-# Plugin#code_paths).
+# <plugin>/component. These tasks now include every file under a plugin's load paths (see
+# Plugin#load_paths).
 namespace :doc do
 
   plugins = FileList['vendor/plugins/**'].collect { |plugin| File.basename(plugin) }
@@ -172,9 +172,9 @@ namespace :doc do
         options << '--line-numbers' << '--inline-source'
         options << '-T html'
 
-        # Include every file in the plugin's code_paths (see Plugin#code_paths)
+        # Include every file in the plugin's load_paths (see Plugin#load_paths)
         if Engines.plugins[plugin]
-          files.include("#{plugin_base}/{#{Engines.plugins[plugin].code_paths.join(",")}}/**/*.rb")
+          files.include("#{plugin_base}/{#{Engines.plugins[plugin].load_paths.join(",")}}/**/*.rb")
         end
         if File.exists?("#{plugin_base}/README")
           files.include("#{plugin_base}/README")    
@@ -217,6 +217,34 @@ Report any issues on http://dev.rails-engines.org. Thanks!
 -~===============( ... as you were ... )============================~-}
   end
   
+  namespace :engines do
+    
+    def engine_plugins
+      Dir["vendor/plugins/*"].select { |f| File.directory?(File.join(f, "app")) }.map { |f| File.basename(f) }.join(",")
+    end
+    
+    desc "Run tests from within engines plugins (plugins with an 'app' directory)"
+    task :all => [:units, :functionals, :integration]
+    
+    desc "Run unit tests from within engines plugins (plugins with an 'app' directory)"
+    Rake::TestTask.new(:units => "test:plugins:setup_plugin_fixtures") do |t|
+      t.pattern = "vendor/plugins/{#{ENV['PLUGIN'] || engine_plugins}}/test/unit/**/*_test.rb"
+      t.verbose = true
+    end
+
+    desc "Run functional tests from within engines plugins (plugins with an 'app' directory)"
+    Rake::TestTask.new(:functionals => "test:plugins:setup_plugin_fixtures") do |t|
+      t.pattern = "vendor/plugins/{#{ENV['PLUGIN'] || engine_plugins}}/test/functional/**/*_test.rb"
+      t.verbose = true
+    end
+
+    desc "Run integration tests from within engines plugins (plugins with an 'app' directory)"
+    Rake::TestTask.new(:integration => "test:plugins:setup_plugin_fixtures") do |t|
+      t.pattern = "vendor/plugins/{#{ENV['PLUGIN'] || engine_plugins}}/test/integration/**/*_test.rb"
+      t.verbose = true
+    end
+  end
+  
   namespace :plugins do
 
     desc "Run the plugin tests in vendor/plugins/**/test (or specify with PLUGIN=name)"
diff --git a/vendor/plugins/engines/test/app/controllers/app_and_plugin_controller.rb b/vendor/plugins/engines/test/app/controllers/app_and_plugin_controller.rb
new file mode 100644
index 0000000..90b13ff
--- /dev/null
+++ b/vendor/plugins/engines/test/app/controllers/app_and_plugin_controller.rb
@@ -0,0 +1,5 @@
+class AppAndPluginController < ApplicationController
+  def an_action
+    render_class_and_action 'from app'
+  end
+end
diff --git a/vendor/plugins/engines/test/app/controllers/namespace/app_and_plugin_controller.rb b/vendor/plugins/engines/test/app/controllers/namespace/app_and_plugin_controller.rb
new file mode 100644
index 0000000..05f9049
--- /dev/null
+++ b/vendor/plugins/engines/test/app/controllers/namespace/app_and_plugin_controller.rb
@@ -0,0 +1,5 @@
+class Namespace::AppAndPluginController < ApplicationController
+  def an_action
+    render_class_and_action 'from app'
+  end
+end
diff --git a/vendor/plugins/engines/test/app/helpers/mail_helper.rb b/vendor/plugins/engines/test/app/helpers/mail_helper.rb
new file mode 100644
index 0000000..9e081e7
--- /dev/null
+++ b/vendor/plugins/engines/test/app/helpers/mail_helper.rb
@@ -0,0 +1,5 @@
+module MailHelper
+  def do_something_helpful(var)
+    var.to_s.reverse
+  end
+end
\ No newline at end of file
diff --git a/vendor/plugins/engines/test/app/models/app_and_plugin_model.rb b/vendor/plugins/engines/test/app/models/app_and_plugin_model.rb
new file mode 100644
index 0000000..f0fe903
--- /dev/null
+++ b/vendor/plugins/engines/test/app/models/app_and_plugin_model.rb
@@ -0,0 +1,3 @@
+class AppAndPluginModel < ActiveRecord::Base
+  def self.report_location; TestHelper::report_location(__FILE__); end
+end
\ No newline at end of file
diff --git a/vendor/plugins/engines/test/app/models/notify_mail.rb b/vendor/plugins/engines/test/app/models/notify_mail.rb
new file mode 100644
index 0000000..899fc1a
--- /dev/null
+++ b/vendor/plugins/engines/test/app/models/notify_mail.rb
@@ -0,0 +1,26 @@
+class NotifyMail < ActionMailer::Base
+
+  helper :mail
+  
+  def signup(txt)
+    body(:name => txt)
+  end
+  
+  def multipart
+    recipients 'some_address@email.com'
+    subject    'multi part email'
+    from       "another_user@email.com"
+    content_type 'multipart/alternative'
+    
+    part :content_type => "text/html", :body => render_message("multipart_html", {})
+    part "text/plain" do |p|
+      p.body = render_message("multipart_plain", {})
+    end
+  end
+  
+  def implicit_multipart
+    recipients 'some_address@email.com'
+    subject    'multi part email'
+    from       "another_user@email.com"
+  end
+end
\ No newline at end of file
diff --git a/vendor/plugins/engines/test/app/things/thing.rb b/vendor/plugins/engines/test/app/things/thing.rb
new file mode 100644
index 0000000..ae6fbbf
--- /dev/null
+++ b/vendor/plugins/engines/test/app/things/thing.rb
@@ -0,0 +1,3 @@
+class Thing
+  def self.from_app; TestHelper::report_location(__FILE__); end
+end
\ No newline at end of file
diff --git a/vendor/plugins/engines/test/app/views/app_and_plugin/a_view.html.erb b/vendor/plugins/engines/test/app/views/app_and_plugin/a_view.html.erb
new file mode 100644
index 0000000..03e2bf8
--- /dev/null
+++ b/vendor/plugins/engines/test/app/views/app_and_plugin/a_view.html.erb
@@ -0,0 +1 @@
+<%= TestHelper.view_path_for __FILE__ %> (from app)
\ No newline at end of file
diff --git a/vendor/plugins/engines/test/app/views/namespace/app_and_plugin/a_view.html.erb b/vendor/plugins/engines/test/app/views/namespace/app_and_plugin/a_view.html.erb
new file mode 100644
index 0000000..03e2bf8
--- /dev/null
+++ b/vendor/plugins/engines/test/app/views/namespace/app_and_plugin/a_view.html.erb
@@ -0,0 +1 @@
+<%= TestHelper.view_path_for __FILE__ %> (from app)
\ No newline at end of file
diff --git a/vendor/plugins/engines/test/app/views/notify_mail/implicit_multipart.text.html.erb b/vendor/plugins/engines/test/app/views/notify_mail/implicit_multipart.text.html.erb
new file mode 100644
index 0000000..042b5c4
--- /dev/null
+++ b/vendor/plugins/engines/test/app/views/notify_mail/implicit_multipart.text.html.erb
@@ -0,0 +1 @@
+the implicit html part of the email <%= do_something_helpful("semaj") %>
\ No newline at end of file
diff --git a/vendor/plugins/engines/test/app/views/notify_mail/implicit_multipart.text.plain.erb b/vendor/plugins/engines/test/app/views/notify_mail/implicit_multipart.text.plain.erb
new file mode 100644
index 0000000..552acc1
--- /dev/null
+++ b/vendor/plugins/engines/test/app/views/notify_mail/implicit_multipart.text.plain.erb
@@ -0,0 +1 @@
+the implicit plaintext part of the email
\ No newline at end of file
diff --git a/vendor/plugins/engines/test/app/views/notify_mail/multipart_html.html.erb b/vendor/plugins/engines/test/app/views/notify_mail/multipart_html.html.erb
new file mode 100644
index 0000000..135488b
--- /dev/null
+++ b/vendor/plugins/engines/test/app/views/notify_mail/multipart_html.html.erb
@@ -0,0 +1 @@
+the html part of the email <%= do_something_helpful("semaj") %>
\ No newline at end of file
diff --git a/vendor/plugins/engines/test/app/views/notify_mail/multipart_plain.html.erb b/vendor/plugins/engines/test/app/views/notify_mail/multipart_plain.html.erb
new file mode 100644
index 0000000..e005046
--- /dev/null
+++ b/vendor/plugins/engines/test/app/views/notify_mail/multipart_plain.html.erb
@@ -0,0 +1 @@
+the plaintext part of the email
\ No newline at end of file
diff --git a/vendor/plugins/engines/test/app/views/notify_mail/signup.text.plain.erb b/vendor/plugins/engines/test/app/views/notify_mail/signup.text.plain.erb
new file mode 100644
index 0000000..5aaf46e
--- /dev/null
+++ b/vendor/plugins/engines/test/app/views/notify_mail/signup.text.plain.erb
@@ -0,0 +1,5 @@
+Signup template from application
+
+Here's a local variable set in the Mail object: <%= @name %>.
+
+And here's a method called in a mail helper: <%= do_something_helpful(@name) %>
diff --git a/vendor/plugins/engines/test/app/views/plugin_mail/mail_from_plugin_with_application_template.text.plain.erb b/vendor/plugins/engines/test/app/views/plugin_mail/mail_from_plugin_with_application_template.text.plain.erb
new file mode 100644
index 0000000..67a6b8f
--- /dev/null
+++ b/vendor/plugins/engines/test/app/views/plugin_mail/mail_from_plugin_with_application_template.text.plain.erb
@@ -0,0 +1 @@
+<%= @note %> (from application)
\ No newline at end of file
diff --git a/vendor/plugins/engines/test/app/views/plugin_mail/multipart_from_plugin_with_application_template_plain.html.erb b/vendor/plugins/engines/test/app/views/plugin_mail/multipart_from_plugin_with_application_template_plain.html.erb
new file mode 100644
index 0000000..284e450
--- /dev/null
+++ b/vendor/plugins/engines/test/app/views/plugin_mail/multipart_from_plugin_with_application_template_plain.html.erb
@@ -0,0 +1 @@
+plugin mail template loaded from application
\ No newline at end of file
diff --git a/vendor/plugins/engines/test/functional/controller_loading_test.rb b/vendor/plugins/engines/test/functional/controller_loading_test.rb
new file mode 100644
index 0000000..d51bc00
--- /dev/null
+++ b/vendor/plugins/engines/test/functional/controller_loading_test.rb
@@ -0,0 +1,51 @@
+# Tests in this file ensure that:
+#
+# * plugin controller actions are found
+# * actions defined in application controllers take precedence over those in plugins
+# * actions in controllers in subsequently loaded plugins take precendence over those in previously loaded plugins
+# * this works for actions in namespaced controllers accordingly
+
+require File.dirname(__FILE__) + '/../test_helper'
+
+class ControllerLoadingTest < ActionController::TestCase
+  def setup
+    @request    = ActionController::TestRequest.new
+    @response   = ActionController::TestResponse.new
+  end
+
+  # plugin controller actions should be found
+
+	def test_WITH_an_action_defined_only_in_a_plugin_IT_should_use_this_action
+	  get_action_on_controller :an_action, :alpha_plugin
+    assert_response_body 'rendered in AlphaPluginController#an_action'
+  end
+  
+	def test_WITH_an_action_defined_only_in_a_namespaced_plugin_controller_IT_should_use_this_action
+	  get_action_on_controller :an_action, :alpha_plugin, :namespace
+    assert_response_body 'rendered in Namespace::AlphaPluginController#an_action'
+  end
+
+  # app takes precedence over plugins
+
+  def test_WITH_an_action_defined_in_both_app_and_plugin_IT_should_use_the_one_in_app
+	  get_action_on_controller :an_action, :app_and_plugin
+    assert_response_body 'rendered in AppAndPluginController#an_action (from app)'
+  end
+  
+  def test_WITH_an_action_defined_in_namespaced_controllers_in_both_app_and_plugin_IT_should_use_the_one_in_app
+	  get_action_on_controller :an_action, :app_and_plugin, :namespace
+    assert_response_body 'rendered in Namespace::AppAndPluginController#an_action (from app)'
+  end
+
+  # subsequently loaded plugins take precendence over previously loaded plugins
+
+  def test_WITH_an_action_defined_in_two_plugin_controllers_IT_should_use_the_latter_of_both
+	  get_action_on_controller :an_action, :shared_plugin
+    assert_response_body 'rendered in SharedPluginController#an_action (from beta_plugin)'
+  end
+  
+  def test_WITH_an_action_defined_in_two_namespaced_plugin_controllers_IT_should_use_the_latter_of_both
+	  get_action_on_controller :an_action, :shared_plugin, :namespace
+    assert_response_body 'rendered in Namespace::SharedPluginController#an_action (from beta_plugin)'
+  end
+end
diff --git a/vendor/plugins/engines/test/functional/exception_notification_compatibility_test.rb b/vendor/plugins/engines/test/functional/exception_notification_compatibility_test.rb
new file mode 100644
index 0000000..3093306
--- /dev/null
+++ b/vendor/plugins/engines/test/functional/exception_notification_compatibility_test.rb
@@ -0,0 +1,29 @@
+require File.dirname(__FILE__) + '/../test_helper'
+
+class ExceptionNotificationCompatibilityTest < ActionController::TestCase
+  ExceptionNotifier.exception_recipients = %w(joe@schmoe.com bill@schmoe.com)
+  class SimpleController < ApplicationController
+    include ExceptionNotifiable
+    local_addresses.clear
+    consider_all_requests_local = false
+    def index
+      begin
+        raise "Fail!"
+      rescue Exception => e
+        rescue_action_in_public(e)
+      end
+    end
+  end
+  
+  def setup
+    @controller = SimpleController.new
+    @request    = ActionController::TestRequest.new
+    @response   = ActionController::TestResponse.new
+  end
+  
+  def test_should_work
+    assert_nothing_raised do
+      get :index
+    end
+  end
+end
\ No newline at end of file
diff --git a/vendor/plugins/engines/test/functional/locale_loading_test.rb b/vendor/plugins/engines/test/functional/locale_loading_test.rb
new file mode 100644
index 0000000..21c8c7f
--- /dev/null
+++ b/vendor/plugins/engines/test/functional/locale_loading_test.rb
@@ -0,0 +1,26 @@
+# Tests in this file ensure that:
+#
+# * translations in the application take precedence over those in plugins
+# * translations in subsequently loaded plugins take precendence over those in previously loaded plugins
+
+require File.dirname(__FILE__) + '/../test_helper'
+
+class LocaleLoadingTest < ActionController::TestCase
+  def setup
+    @request    = ActionController::TestRequest.new
+    @response   = ActionController::TestResponse.new
+  end
+
+  # app takes precedence over plugins
+	
+  def test_WITH_a_translation_defined_in_both_app_and_plugin_IT_should_find_the_one_in_app
+    assert_equal I18n.t('hello'), 'Hello world'
+  end
+	
+  # subsequently loaded plugins take precendence over previously loaded plugins
+	
+  def test_WITH_a_translation_defined_in_two_plugins_IT_should_find_the_latter_of_both
+    assert_equal I18n.t('plugin'), 'beta'
+  end
+end
+	
diff --git a/vendor/plugins/engines/test/functional/routes_test.rb b/vendor/plugins/engines/test/functional/routes_test.rb
new file mode 100644
index 0000000..733dd39
--- /dev/null
+++ b/vendor/plugins/engines/test/functional/routes_test.rb
@@ -0,0 +1,29 @@
+# Tests in this file ensure that:
+#
+# * Routes from plugins can be routed to
+# * Named routes can be defined within a plugin
+
+require File.dirname(__FILE__) + '/../test_helper'
+
+class RoutesTest < ActionController::TestCase
+  tests TestRoutingController
+  
+	def test_WITH_a_route_defined_in_a_plugin_IT_should_route_it
+	  path = '/routes/an_action'
+    opts = {:controller => 'test_routing', :action => 'an_action'}
+    assert_routing path, opts
+    assert_recognizes opts, path # not sure what exactly the difference is, but it won't hurt either
+  end
+
+	def test_WITH_a_route_for_a_namespaced_controller_defined_in_a_plugin_IT_should_route_it
+	  path = 'somespace/routes/an_action'
+    opts = {:controller => 'namespace/test_routing', :action => 'an_action'}
+    assert_routing path, opts
+    assert_recognizes opts, path
+  end
+  
+  def test_should_properly_generate_named_routes
+    get :test_named_routes_from_plugin
+    assert_response_body '/somespace/routes'
+  end
+end
\ No newline at end of file
diff --git a/vendor/plugins/engines/test/functional/view_helpers_test.rb b/vendor/plugins/engines/test/functional/view_helpers_test.rb
new file mode 100644
index 0000000..5448ffe
--- /dev/null
+++ b/vendor/plugins/engines/test/functional/view_helpers_test.rb
@@ -0,0 +1,37 @@
+require File.dirname(__FILE__) + '/../test_helper'
+
+class ViewHelpersTest < ActionController::TestCase
+  tests AssetsController
+  
+  def setup
+    get :index
+  end
+  
+  def test_plugin_javascript_helpers
+    base_selector = "script[type='text/javascript']"
+    js_dir = "/plugin_assets/test_assets/javascripts"
+    assert_select "#{base_selector}[src='#{js_dir}/file.1.js']"
+    assert_select "#{base_selector}[src='#{js_dir}/file2.js']"
+  end
+
+  def test_plugin_stylesheet_helpers
+    base_selector = "link[media='screen'][rel='stylesheet'][type='text/css']"
+    css_dir = "/plugin_assets/test_assets/stylesheets"
+    assert_select "#{base_selector}[href='#{css_dir}/file.1.css']"
+    assert_select "#{base_selector}[href='#{css_dir}/file2.css']"
+  end
+
+  def test_plugin_image_helpers
+    assert_select "img[src='/plugin_assets/test_assets/images/image.png'][alt='Image']"
+  end
+
+  def test_plugin_layouts
+    get :index
+    assert_select "div[id='assets_layout']"
+  end  
+
+  def test_plugin_image_submit_helpers
+    assert_select "input[src='/plugin_assets/test_assets/images/image.png'][type='image']"
+  end
+
+end
diff --git a/vendor/plugins/engines/test/functional/view_loading_test.rb b/vendor/plugins/engines/test/functional/view_loading_test.rb
new file mode 100644
index 0000000..28d4754
--- /dev/null
+++ b/vendor/plugins/engines/test/functional/view_loading_test.rb
@@ -0,0 +1,60 @@
+# Tests in this file ensure that:
+#
+# * plugin views are found
+# * views in the application take precedence over those in plugins
+# * views in subsequently loaded plugins take precendence over those in previously loaded plugins
+# * this works for namespaced views accordingly
+
+require File.dirname(__FILE__) + '/../test_helper'
+
+class ViewLoadingTest < ActionController::TestCase
+  def setup
+    @request    = ActionController::TestRequest.new
+    @response   = ActionController::TestResponse.new
+  end
+
+  # plugin views should be found
+
+ 	def test_WITH_a_view_defined_only_in_a_plugin_IT_should_find_the_view
+	  get_action_on_controller :a_view, :alpha_plugin
+    assert_response_body 'alpha_plugin/a_view'
+  end
+	
+	def test_WITH_a_namespaced_view_defined_only_in_a_plugin_IT_should_find_the_view
+	  get_action_on_controller :a_view, :alpha_plugin, :namespace
+    assert_response_body 'namespace/alpha_plugin/a_view'
+  end
+
+  # app takes precedence over plugins
+	
+	def test_WITH_a_view_defined_in_both_app_and_plugin_IT_should_find_the_one_in_app
+	  get_action_on_controller :a_view, :app_and_plugin
+    assert_response_body 'app_and_plugin/a_view (from app)'
+  end
+	
+	def test_WITH_a_namespaced_view_defined_in_both_app_and_plugin_IT_should_find_the_one_in_app
+	  get_action_on_controller :a_view, :app_and_plugin, :namespace
+    assert_response_body 'namespace/app_and_plugin/a_view (from app)'
+  end
+
+  # subsequently loaded plugins take precendence over previously loaded plugins
+	
+	def test_WITH_a_view_defined_in_two_plugins_IT_should_find_the_latter_of_both
+	  get_action_on_controller :a_view, :shared_plugin
+    assert_response_body 'shared_plugin/a_view (from beta_plugin)'
+  end
+	
+	def test_WITH_a_namespaced_view_defined_in_two_plugins_IT_should_find_the_latter_of_both
+	  get_action_on_controller :a_view, :shared_plugin, :namespace
+    assert_response_body 'namespace/shared_plugin/a_view (from beta_plugin)'
+  end
+  
+  # layouts loaded from plugins
+
+  def test_should_be_able_to_load_a_layout_from_a_plugin
+    get_action_on_controller :action_with_layout, :alpha_plugin
+    assert_response_body 'rendered in AlphaPluginController#action_with_layout (with plugin layout)'
+  end
+	
+end
+	
\ No newline at end of file
diff --git a/vendor/plugins/engines/test/lib/app_and_plugin_lib_model.rb b/vendor/plugins/engines/test/lib/app_and_plugin_lib_model.rb
new file mode 100644
index 0000000..6ffe178
--- /dev/null
+++ b/vendor/plugins/engines/test/lib/app_and_plugin_lib_model.rb
@@ -0,0 +1,3 @@
+class AppAndPluginLibModel < ActiveRecord::Base
+  def self.report_location; TestHelper::report_location(__FILE__); end
+end
\ No newline at end of file
diff --git a/vendor/plugins/engines/test/lib/engines_test_helper.rb b/vendor/plugins/engines/test/lib/engines_test_helper.rb
new file mode 100644
index 0000000..47bd2bb
--- /dev/null
+++ b/vendor/plugins/engines/test/lib/engines_test_helper.rb
@@ -0,0 +1,42 @@
+module TestHelper
+  def self.report_location(path)
+    [RAILS_ROOT + '/', 'vendor/plugins/'].each { |part| path.sub! part, ''}
+    path = path.split('/')
+    location, subject = path.first, path.last
+    if subject.sub! '.rb', ''
+      subject = subject.classify
+    else 
+      subject.sub! '.html.erb', ''
+    end
+    "#{subject} (from #{location})"
+  end
+  
+  def self.view_path_for path
+    [RAILS_ROOT + '/', 'vendor/plugins/', '.html.erb'].each { |part| path.sub! part, ''}
+    parts = path.split('/')
+    parts[(parts.index('views')+1)..-1].join('/')
+  end
+end
+
+class Test::Unit::TestCase
+  # Add more helper methods to be used by all tests here...  
+  def get_action_on_controller(*args)
+    action = args.shift
+    with_controller *args
+    get action
+  end
+  
+  def with_controller(controller, namespace = nil)
+    classname = controller.to_s.classify + 'Controller'
+    classname = namespace.to_s.classify + '::' + classname unless namespace.nil?
+    @controller = classname.constantize.new
+  end
+  
+  def assert_response_body(expected)
+    assert_equal expected, @response.body
+  end
+end
+
+# Because we're testing this behaviour, we actually want these features on!
+Engines.disable_application_view_loading = false
+Engines.disable_application_code_loading = false
diff --git a/vendor/plugins/engines/test/lib/render_information.rb b/vendor/plugins/engines/test/lib/render_information.rb
new file mode 100644
index 0000000..0deb5d9
--- /dev/null
+++ b/vendor/plugins/engines/test/lib/render_information.rb
@@ -0,0 +1,7 @@
+module RenderInformation
+  def render_class_and_action(note = nil, options={})
+    text = "rendered in #{self.class.name}##{params[:action]}"
+    text += " (#{note})" unless note.nil?
+    render options.update(:text => text)
+  end
+end
\ No newline at end of file
diff --git a/vendor/plugins/engines/test/plugins/alpha_plugin/app/controllers/alpha_plugin_controller.rb b/vendor/plugins/engines/test/plugins/alpha_plugin/app/controllers/alpha_plugin_controller.rb
new file mode 100644
index 0000000..736d59b
--- /dev/null
+++ b/vendor/plugins/engines/test/plugins/alpha_plugin/app/controllers/alpha_plugin_controller.rb
@@ -0,0 +1,8 @@
+class AlphaPluginController < ApplicationController
+  def an_action
+    render_class_and_action
+  end
+  def action_with_layout
+    render_class_and_action(nil, :layout => "plugin_layout")
+  end
+end
diff --git a/vendor/plugins/engines/test/plugins/alpha_plugin/app/controllers/app_and_plugin_controller.rb b/vendor/plugins/engines/test/plugins/alpha_plugin/app/controllers/app_and_plugin_controller.rb
new file mode 100644
index 0000000..c41d6ed
--- /dev/null
+++ b/vendor/plugins/engines/test/plugins/alpha_plugin/app/controllers/app_and_plugin_controller.rb
@@ -0,0 +1,5 @@
+class AppAndPluginController < ApplicationController
+  def an_action
+    render_class_and_action 'from alpha_plugin'
+  end
+end
diff --git a/vendor/plugins/engines/test/plugins/alpha_plugin/app/controllers/namespace/alpha_plugin_controller.rb b/vendor/plugins/engines/test/plugins/alpha_plugin/app/controllers/namespace/alpha_plugin_controller.rb
new file mode 100644
index 0000000..5edf81b
--- /dev/null
+++ b/vendor/plugins/engines/test/plugins/alpha_plugin/app/controllers/namespace/alpha_plugin_controller.rb
@@ -0,0 +1,5 @@
+class Namespace::AlphaPluginController < ApplicationController
+  def an_action
+    render_class_and_action
+  end  
+end
\ No newline at end of file
diff --git a/vendor/plugins/engines/test/plugins/alpha_plugin/app/controllers/namespace/app_and_plugin_controller.rb b/vendor/plugins/engines/test/plugins/alpha_plugin/app/controllers/namespace/app_and_plugin_controller.rb
new file mode 100644
index 0000000..7431a36
--- /dev/null
+++ b/vendor/plugins/engines/test/plugins/alpha_plugin/app/controllers/namespace/app_and_plugin_controller.rb
@@ -0,0 +1,5 @@
+class Namespace::AppAndPluginController < ApplicationController
+  def an_action
+    render_class_and_action 'from alpha_plugin'
+  end
+end
diff --git a/vendor/plugins/engines/test/plugins/alpha_plugin/app/controllers/namespace/shared_plugin_controller.rb b/vendor/plugins/engines/test/plugins/alpha_plugin/app/controllers/namespace/shared_plugin_controller.rb
new file mode 100644
index 0000000..fb162bc
--- /dev/null
+++ b/vendor/plugins/engines/test/plugins/alpha_plugin/app/controllers/namespace/shared_plugin_controller.rb
@@ -0,0 +1,5 @@
+class Namespace::SharedPluginController < ApplicationController
+  def an_action
+    render_class_and_action 'from alpha_plugin'
+  end
+end
diff --git a/vendor/plugins/engines/test/plugins/alpha_plugin/app/controllers/shared_plugin_controller.rb b/vendor/plugins/engines/test/plugins/alpha_plugin/app/controllers/shared_plugin_controller.rb
new file mode 100644
index 0000000..00539bb
--- /dev/null
+++ b/vendor/plugins/engines/test/plugins/alpha_plugin/app/controllers/shared_plugin_controller.rb
@@ -0,0 +1,5 @@
+class SharedEngineController < ApplicationController
+  def an_action
+    render_class_and_action 'from alpha_engine'
+  end
+end
diff --git a/vendor/plugins/engines/test/plugins/alpha_plugin/app/models/alpha_plugin_model.rb b/vendor/plugins/engines/test/plugins/alpha_plugin/app/models/alpha_plugin_model.rb
new file mode 100644
index 0000000..cde71b8
--- /dev/null
+++ b/vendor/plugins/engines/test/plugins/alpha_plugin/app/models/alpha_plugin_model.rb
@@ -0,0 +1,3 @@
+class AlphaPluginModel < ActiveRecord::Base
+  def self.report_location; TestHelper::report_location(__FILE__); end
+end
\ No newline at end of file
diff --git a/vendor/plugins/engines/test/plugins/alpha_plugin/app/models/app_and_plugin_model.rb b/vendor/plugins/engines/test/plugins/alpha_plugin/app/models/app_and_plugin_model.rb
new file mode 100644
index 0000000..92e6e62
--- /dev/null
+++ b/vendor/plugins/engines/test/plugins/alpha_plugin/app/models/app_and_plugin_model.rb
@@ -0,0 +1,7 @@
+class AppAndPluginModel < ActiveRecord::Base
+  def self.report_location; TestHelper::report_location(__FILE__); end
+
+  def defined_only_in_alpha_plugin_version
+    # should not be defined as the model in app/models takes precedence
+  end
+end
\ No newline at end of file
diff --git a/vendor/plugins/engines/test/plugins/alpha_plugin/app/models/shared_plugin_model.rb b/vendor/plugins/engines/test/plugins/alpha_plugin/app/models/shared_plugin_model.rb
new file mode 100644
index 0000000..e2ef43d
--- /dev/null
+++ b/vendor/plugins/engines/test/plugins/alpha_plugin/app/models/shared_plugin_model.rb
@@ -0,0 +1,3 @@
+class SharedPluginModel < ActiveRecord::Base  
+  def self.report_location; TestHelper::report_location(__FILE__); end
+end
\ No newline at end of file
diff --git a/vendor/plugins/engines/test/plugins/alpha_plugin/app/views/alpha_plugin/a_view.html.erb b/vendor/plugins/engines/test/plugins/alpha_plugin/app/views/alpha_plugin/a_view.html.erb
new file mode 100644
index 0000000..1ad6945
--- /dev/null
+++ b/vendor/plugins/engines/test/plugins/alpha_plugin/app/views/alpha_plugin/a_view.html.erb
@@ -0,0 +1 @@
+<%= TestHelper.view_path_for __FILE__ %>
\ No newline at end of file
diff --git a/vendor/plugins/engines/test/plugins/alpha_plugin/app/views/app_and_plugin/a_view.html.erb b/vendor/plugins/engines/test/plugins/alpha_plugin/app/views/app_and_plugin/a_view.html.erb
new file mode 100644
index 0000000..791a6fa
--- /dev/null
+++ b/vendor/plugins/engines/test/plugins/alpha_plugin/app/views/app_and_plugin/a_view.html.erb
@@ -0,0 +1 @@
+<%= TestHelper.view_path_for __FILE__ %> (from a_view)
\ No newline at end of file
diff --git a/vendor/plugins/engines/test/plugins/alpha_plugin/app/views/layouts/plugin_layout.erb b/vendor/plugins/engines/test/plugins/alpha_plugin/app/views/layouts/plugin_layout.erb
new file mode 100644
index 0000000..878e07c
--- /dev/null
+++ b/vendor/plugins/engines/test/plugins/alpha_plugin/app/views/layouts/plugin_layout.erb
@@ -0,0 +1 @@
+<%= yield %> (with plugin layout)
\ No newline at end of file
diff --git a/vendor/plugins/engines/test/plugins/alpha_plugin/app/views/namespace/alpha_plugin/a_view.html.erb b/vendor/plugins/engines/test/plugins/alpha_plugin/app/views/namespace/alpha_plugin/a_view.html.erb
new file mode 100644
index 0000000..1ad6945
--- /dev/null
+++ b/vendor/plugins/engines/test/plugins/alpha_plugin/app/views/namespace/alpha_plugin/a_view.html.erb
@@ -0,0 +1 @@
+<%= TestHelper.view_path_for __FILE__ %>
\ No newline at end of file
diff --git a/vendor/plugins/engines/test/plugins/alpha_plugin/app/views/namespace/app_and_plugin/a_view.html.erb b/vendor/plugins/engines/test/plugins/alpha_plugin/app/views/namespace/app_and_plugin/a_view.html.erb
new file mode 100644
index 0000000..1ad6945
--- /dev/null
+++ b/vendor/plugins/engines/test/plugins/alpha_plugin/app/views/namespace/app_and_plugin/a_view.html.erb
@@ -0,0 +1 @@
+<%= TestHelper.view_path_for __FILE__ %>
\ No newline at end of file
diff --git a/vendor/plugins/engines/test/plugins/alpha_plugin/app/views/namespace/shared_plugin/a_view.html.erb b/vendor/plugins/engines/test/plugins/alpha_plugin/app/views/namespace/shared_plugin/a_view.html.erb
new file mode 100644
index 0000000..f144ab3
--- /dev/null
+++ b/vendor/plugins/engines/test/plugins/alpha_plugin/app/views/namespace/shared_plugin/a_view.html.erb
@@ -0,0 +1 @@
+<%= TestHelper.view_path_for __FILE__ %> (from alpha_plugin)
\ No newline at end of file
diff --git a/vendor/plugins/engines/test/plugins/alpha_plugin/app/views/shared_plugin/a_view.html.erb b/vendor/plugins/engines/test/plugins/alpha_plugin/app/views/shared_plugin/a_view.html.erb
new file mode 100644
index 0000000..f144ab3
--- /dev/null
+++ b/vendor/plugins/engines/test/plugins/alpha_plugin/app/views/shared_plugin/a_view.html.erb
@@ -0,0 +1 @@
+<%= TestHelper.view_path_for __FILE__ %> (from alpha_plugin)
\ No newline at end of file
diff --git a/vendor/plugins/engines/test/plugins/alpha_plugin/lib/alpha_plugin_lib_model.rb b/vendor/plugins/engines/test/plugins/alpha_plugin/lib/alpha_plugin_lib_model.rb
new file mode 100644
index 0000000..0ce4f91
--- /dev/null
+++ b/vendor/plugins/engines/test/plugins/alpha_plugin/lib/alpha_plugin_lib_model.rb
@@ -0,0 +1,3 @@
+class AlphaPluginLibModel < ActiveRecord::Base
+  def self.report_location; TestHelper::report_location(__FILE__); end
+end
\ No newline at end of file
diff --git a/vendor/plugins/engines/test/plugins/alpha_plugin/lib/app_and_plugin_lib_model.rb b/vendor/plugins/engines/test/plugins/alpha_plugin/lib/app_and_plugin_lib_model.rb
new file mode 100644
index 0000000..645a70c
--- /dev/null
+++ b/vendor/plugins/engines/test/plugins/alpha_plugin/lib/app_and_plugin_lib_model.rb
@@ -0,0 +1,7 @@
+class AppAndPluginLibModel < ActiveRecord::Base
+  def self.report_location; TestHelper::report_location(__FILE__); end
+
+  def defined_only_in_alpha_plugin_version
+    # should not be defined
+  end
+end
\ No newline at end of file
diff --git a/vendor/plugins/engines/test/plugins/alpha_plugin/locales/en.yml b/vendor/plugins/engines/test/plugins/alpha_plugin/locales/en.yml
new file mode 100644
index 0000000..76d39d3
--- /dev/null
+++ b/vendor/plugins/engines/test/plugins/alpha_plugin/locales/en.yml
@@ -0,0 +1,3 @@
+en:
+  hello: "Hello from alfa"
+  plugin: "alfa"
diff --git a/vendor/plugins/engines/test/plugins/beta_plugin/app/controllers/app_and_plugin_controller.rb b/vendor/plugins/engines/test/plugins/beta_plugin/app/controllers/app_and_plugin_controller.rb
new file mode 100644
index 0000000..2e77989
--- /dev/null
+++ b/vendor/plugins/engines/test/plugins/beta_plugin/app/controllers/app_and_plugin_controller.rb
@@ -0,0 +1,5 @@
+class AppAndPluginController < ApplicationController
+  def an_action
+    render_class_and_action 'from beta_plugin'
+  end
+end
diff --git a/vendor/plugins/engines/test/plugins/beta_plugin/app/controllers/namespace/shared_plugin_controller.rb b/vendor/plugins/engines/test/plugins/beta_plugin/app/controllers/namespace/shared_plugin_controller.rb
new file mode 100644
index 0000000..971c7d5
--- /dev/null
+++ b/vendor/plugins/engines/test/plugins/beta_plugin/app/controllers/namespace/shared_plugin_controller.rb
@@ -0,0 +1,5 @@
+class Namespace::SharedPluginController < ApplicationController
+  def an_action
+    render_class_and_action 'from beta_plugin'
+  end
+end
diff --git a/vendor/plugins/engines/test/plugins/beta_plugin/app/controllers/shared_plugin_controller.rb b/vendor/plugins/engines/test/plugins/beta_plugin/app/controllers/shared_plugin_controller.rb
new file mode 100644
index 0000000..ddd9dbe
--- /dev/null
+++ b/vendor/plugins/engines/test/plugins/beta_plugin/app/controllers/shared_plugin_controller.rb
@@ -0,0 +1,5 @@
+class SharedPluginController < ApplicationController
+  def an_action
+    render_class_and_action 'from beta_plugin'
+  end
+end
diff --git a/vendor/plugins/engines/test/plugins/beta_plugin/app/models/shared_plugin_model.rb b/vendor/plugins/engines/test/plugins/beta_plugin/app/models/shared_plugin_model.rb
new file mode 100644
index 0000000..bfde227
--- /dev/null
+++ b/vendor/plugins/engines/test/plugins/beta_plugin/app/models/shared_plugin_model.rb
@@ -0,0 +1,3 @@
+class SharedPluginModel < ActiveRecord::Base
+  def self.report_location; TestHelper::report_location(__FILE__); end
+end
\ No newline at end of file
diff --git a/vendor/plugins/engines/test/plugins/beta_plugin/app/views/namespace/shared_plugin/a_view.html.erb b/vendor/plugins/engines/test/plugins/beta_plugin/app/views/namespace/shared_plugin/a_view.html.erb
new file mode 100644
index 0000000..77b5a15
--- /dev/null
+++ b/vendor/plugins/engines/test/plugins/beta_plugin/app/views/namespace/shared_plugin/a_view.html.erb
@@ -0,0 +1 @@
+<%= TestHelper.view_path_for __FILE__ %> (from beta_plugin)
\ No newline at end of file
diff --git a/vendor/plugins/engines/test/plugins/beta_plugin/app/views/shared_plugin/a_view.html.erb b/vendor/plugins/engines/test/plugins/beta_plugin/app/views/shared_plugin/a_view.html.erb
new file mode 100644
index 0000000..77b5a15
--- /dev/null
+++ b/vendor/plugins/engines/test/plugins/beta_plugin/app/views/shared_plugin/a_view.html.erb
@@ -0,0 +1 @@
+<%= TestHelper.view_path_for __FILE__ %> (from beta_plugin)
\ No newline at end of file
diff --git a/vendor/plugins/engines/test/plugins/beta_plugin/init.rb b/vendor/plugins/engines/test/plugins/beta_plugin/init.rb
new file mode 100644
index 0000000..b4c4b0e
--- /dev/null
+++ b/vendor/plugins/engines/test/plugins/beta_plugin/init.rb
@@ -0,0 +1 @@
+# just here so that Rails recognizes this as a plugin
\ No newline at end of file
diff --git a/vendor/plugins/engines/test/plugins/beta_plugin/locales/en.yml b/vendor/plugins/engines/test/plugins/beta_plugin/locales/en.yml
new file mode 100644
index 0000000..f49279c
--- /dev/null
+++ b/vendor/plugins/engines/test/plugins/beta_plugin/locales/en.yml
@@ -0,0 +1,3 @@
+en:
+  hello: "Hello from beta"
+  plugin: "beta"
diff --git a/vendor/plugins/engines/test/plugins/not_a_plugin/public/should_not_be_copied.txt b/vendor/plugins/engines/test/plugins/not_a_plugin/public/should_not_be_copied.txt
new file mode 100644
index 0000000..e69de29
diff --git a/vendor/plugins/engines/test/plugins/test_assets/app/controllers/assets_controller.rb b/vendor/plugins/engines/test/plugins/test_assets/app/controllers/assets_controller.rb
new file mode 100644
index 0000000..db5de2e
--- /dev/null
+++ b/vendor/plugins/engines/test/plugins/test_assets/app/controllers/assets_controller.rb
@@ -0,0 +1,2 @@
+class AssetsController < ApplicationController
+end
\ No newline at end of file
diff --git a/vendor/plugins/engines/test/plugins/test_assets/app/views/assets/index.html.erb b/vendor/plugins/engines/test/plugins/test_assets/app/views/assets/index.html.erb
new file mode 100644
index 0000000..8340f76
--- /dev/null
+++ b/vendor/plugins/engines/test/plugins/test_assets/app/views/assets/index.html.erb
@@ -0,0 +1,4 @@
+<%= image_tag 'image.png', :plugin => 'test_assets' %>
+<%= javascript_include_tag 'file.1.js', 'file2', :plugin => "test_assets" %>
+<%= stylesheet_link_tag 'file.1.css', 'file2', :plugin => "test_assets" %>
+<%= image_submit_tag 'image.png', :plugin => "test_assets" %>
diff --git a/vendor/plugins/engines/test/plugins/test_assets/app/views/layouts/assets.html.erb b/vendor/plugins/engines/test/plugins/test_assets/app/views/layouts/assets.html.erb
new file mode 100644
index 0000000..b7da375
--- /dev/null
+++ b/vendor/plugins/engines/test/plugins/test_assets/app/views/layouts/assets.html.erb
@@ -0,0 +1,3 @@
+<div id="assets_layout">
+	<%= yield %>
+</div>
\ No newline at end of file
diff --git a/vendor/plugins/engines/test/plugins/test_assets/init.rb b/vendor/plugins/engines/test/plugins/test_assets/init.rb
new file mode 100644
index 0000000..e69de29
diff --git a/vendor/plugins/engines/test/plugins/test_assets/public/file.txt b/vendor/plugins/engines/test/plugins/test_assets/public/file.txt
new file mode 100644
index 0000000..e69de29
diff --git a/vendor/plugins/engines/test/plugins/test_assets/public/subfolder/file_in_subfolder.txt b/vendor/plugins/engines/test/plugins/test_assets/public/subfolder/file_in_subfolder.txt
new file mode 100644
index 0000000..e69de29
diff --git a/vendor/plugins/engines/test/plugins/test_assets_with_assets_directory/assets/file.txt b/vendor/plugins/engines/test/plugins/test_assets_with_assets_directory/assets/file.txt
new file mode 100644
index 0000000..e69de29
diff --git a/vendor/plugins/engines/test/plugins/test_assets_with_assets_directory/assets/subfolder/file_in_subfolder.txt b/vendor/plugins/engines/test/plugins/test_assets_with_assets_directory/assets/subfolder/file_in_subfolder.txt
new file mode 100644
index 0000000..e69de29
diff --git a/vendor/plugins/engines/test/plugins/test_assets_with_assets_directory/init.rb b/vendor/plugins/engines/test/plugins/test_assets_with_assets_directory/init.rb
new file mode 100644
index 0000000..e69de29
diff --git a/vendor/plugins/engines/test/plugins/test_assets_with_no_subdirectory/assets/file.txt b/vendor/plugins/engines/test/plugins/test_assets_with_no_subdirectory/assets/file.txt
new file mode 100644
index 0000000..e69de29
diff --git a/vendor/plugins/engines/test/plugins/test_assets_with_no_subdirectory/init.rb b/vendor/plugins/engines/test/plugins/test_assets_with_no_subdirectory/init.rb
new file mode 100644
index 0000000..e69de29
diff --git a/vendor/plugins/engines/test/plugins/test_code_mixing/app/things/thing.rb b/vendor/plugins/engines/test/plugins/test_code_mixing/app/things/thing.rb
new file mode 100644
index 0000000..535d988
--- /dev/null
+++ b/vendor/plugins/engines/test/plugins/test_code_mixing/app/things/thing.rb
@@ -0,0 +1,3 @@
+class Thing
+  def self.from_plugin; TestHelper::report_location(__FILE__); end
+end
\ No newline at end of file
diff --git a/vendor/plugins/engines/test/plugins/test_code_mixing/init.rb b/vendor/plugins/engines/test/plugins/test_code_mixing/init.rb
new file mode 100644
index 0000000..b4c4b0e
--- /dev/null
+++ b/vendor/plugins/engines/test/plugins/test_code_mixing/init.rb
@@ -0,0 +1 @@
+# just here so that Rails recognizes this as a plugin
\ No newline at end of file
diff --git a/vendor/plugins/engines/test/plugins/test_load_path/init.rb b/vendor/plugins/engines/test/plugins/test_load_path/init.rb
new file mode 100644
index 0000000..e69de29
diff --git a/vendor/plugins/engines/test/plugins/test_migration/db/migrate/001_create_tests.rb b/vendor/plugins/engines/test/plugins/test_migration/db/migrate/001_create_tests.rb
new file mode 100644
index 0000000..804a0cd
--- /dev/null
+++ b/vendor/plugins/engines/test/plugins/test_migration/db/migrate/001_create_tests.rb
@@ -0,0 +1,11 @@
+class CreateTests < ActiveRecord::Migration
+  def self.up
+    create_table 'tests' do |t|
+      t.column 'name', :string
+    end
+  end
+
+  def self.down
+    drop_table 'tests'
+  end
+end
diff --git a/vendor/plugins/engines/test/plugins/test_migration/db/migrate/002_create_others.rb b/vendor/plugins/engines/test/plugins/test_migration/db/migrate/002_create_others.rb
new file mode 100644
index 0000000..756aca6
--- /dev/null
+++ b/vendor/plugins/engines/test/plugins/test_migration/db/migrate/002_create_others.rb
@@ -0,0 +1,11 @@
+class CreateOthers < ActiveRecord::Migration
+  def self.up
+    create_table 'others' do |t|
+      t.column 'name', :string
+    end
+  end
+
+  def self.down
+    drop_table 'others'
+  end
+end
diff --git a/vendor/plugins/engines/test/plugins/test_migration/db/migrate/003_create_extras.rb b/vendor/plugins/engines/test/plugins/test_migration/db/migrate/003_create_extras.rb
new file mode 100644
index 0000000..fb5b6c2
--- /dev/null
+++ b/vendor/plugins/engines/test/plugins/test_migration/db/migrate/003_create_extras.rb
@@ -0,0 +1,11 @@
+class CreateExtras < ActiveRecord::Migration
+  def self.up
+    create_table 'extras' do |t|
+      t.column 'name', :string
+    end
+  end
+
+  def self.down
+    drop_table 'extras'
+  end
+end
diff --git a/vendor/plugins/engines/test/plugins/test_migration/init.rb b/vendor/plugins/engines/test/plugins/test_migration/init.rb
new file mode 100644
index 0000000..e69de29
diff --git a/vendor/plugins/engines/test/plugins/test_plugin_mailing/app/models/plugin_mail.rb b/vendor/plugins/engines/test/plugins/test_plugin_mailing/app/models/plugin_mail.rb
new file mode 100644
index 0000000..4f36616
--- /dev/null
+++ b/vendor/plugins/engines/test/plugins/test_plugin_mailing/app/models/plugin_mail.rb
@@ -0,0 +1,26 @@
+class PluginMail < ActionMailer::Base
+  def mail_from_plugin(note=nil)
+    body(:note => note)
+  end
+  
+  def mail_from_plugin_with_application_template(note=nil)
+    body(:note => note)
+  end
+  
+  def multipart_from_plugin
+    content_type 'multipart/alternative'
+    part :content_type => "text/html", :body => render_message("multipart_from_plugin_html", {})
+    part "text/plain" do |p|
+      p.body = render_message("multipart_from_plugin_plain", {})
+    end
+  end
+  
+  def multipart_from_plugin_with_application_template
+    content_type 'multipart/alternative'
+    part :content_type => "text/html", :body => render_message("multipart_from_plugin_with_application_template_html", {})
+    part "text/plain" do |p|
+      p.body = render_message("multipart_from_plugin_with_application_template_plain", {})
+    end
+  end  
+  
+end
\ No newline at end of file
diff --git a/vendor/plugins/engines/test/plugins/test_plugin_mailing/app/views/plugin_mail/mail_from_plugin.erb b/vendor/plugins/engines/test/plugins/test_plugin_mailing/app/views/plugin_mail/mail_from_plugin.erb
new file mode 100644
index 0000000..2b49606
--- /dev/null
+++ b/vendor/plugins/engines/test/plugins/test_plugin_mailing/app/views/plugin_mail/mail_from_plugin.erb
@@ -0,0 +1 @@
+<%= @note %>
\ No newline at end of file
diff --git a/vendor/plugins/engines/test/plugins/test_plugin_mailing/app/views/plugin_mail/multipart_from_plugin_html.html.erb b/vendor/plugins/engines/test/plugins/test_plugin_mailing/app/views/plugin_mail/multipart_from_plugin_html.html.erb
new file mode 100644
index 0000000..46291d8
--- /dev/null
+++ b/vendor/plugins/engines/test/plugins/test_plugin_mailing/app/views/plugin_mail/multipart_from_plugin_html.html.erb
@@ -0,0 +1 @@
+html template
\ No newline at end of file
diff --git a/vendor/plugins/engines/test/plugins/test_plugin_mailing/app/views/plugin_mail/multipart_from_plugin_plain.html.erb b/vendor/plugins/engines/test/plugins/test_plugin_mailing/app/views/plugin_mail/multipart_from_plugin_plain.html.erb
new file mode 100644
index 0000000..f690dba
--- /dev/null
+++ b/vendor/plugins/engines/test/plugins/test_plugin_mailing/app/views/plugin_mail/multipart_from_plugin_plain.html.erb
@@ -0,0 +1 @@
+plain template
\ No newline at end of file
diff --git a/vendor/plugins/engines/test/plugins/test_plugin_mailing/app/views/plugin_mail/multipart_from_plugin_with_application_template_html.html.erb b/vendor/plugins/engines/test/plugins/test_plugin_mailing/app/views/plugin_mail/multipart_from_plugin_with_application_template_html.html.erb
new file mode 100644
index 0000000..795f0d5
--- /dev/null
+++ b/vendor/plugins/engines/test/plugins/test_plugin_mailing/app/views/plugin_mail/multipart_from_plugin_with_application_template_html.html.erb
@@ -0,0 +1 @@
+template from plugin
\ No newline at end of file
diff --git a/vendor/plugins/engines/test/plugins/test_plugin_mailing/app/views/plugin_mail/multipart_from_plugin_with_application_template_plain.html.erb b/vendor/plugins/engines/test/plugins/test_plugin_mailing/app/views/plugin_mail/multipart_from_plugin_with_application_template_plain.html.erb
new file mode 100644
index 0000000..795f0d5
--- /dev/null
+++ b/vendor/plugins/engines/test/plugins/test_plugin_mailing/app/views/plugin_mail/multipart_from_plugin_with_application_template_plain.html.erb
@@ -0,0 +1 @@
+template from plugin
\ No newline at end of file
diff --git a/vendor/plugins/engines/test/plugins/test_plugin_mailing/init.rb b/vendor/plugins/engines/test/plugins/test_plugin_mailing/init.rb
new file mode 100644
index 0000000..e69de29
diff --git a/vendor/plugins/engines/test/plugins/test_routing/app/controllers/namespace/test_routing_controller.rb b/vendor/plugins/engines/test/plugins/test_routing/app/controllers/namespace/test_routing_controller.rb
new file mode 100644
index 0000000..29d7bdb
--- /dev/null
+++ b/vendor/plugins/engines/test/plugins/test_routing/app/controllers/namespace/test_routing_controller.rb
@@ -0,0 +1,5 @@
+class Namespace::TestRoutingController < ApplicationController
+  def routed_action
+    render_class_and_action
+  end
+end
\ No newline at end of file
diff --git a/vendor/plugins/engines/test/plugins/test_routing/app/controllers/test_routing_controller.rb b/vendor/plugins/engines/test/plugins/test_routing/app/controllers/test_routing_controller.rb
new file mode 100644
index 0000000..ac3164a
--- /dev/null
+++ b/vendor/plugins/engines/test/plugins/test_routing/app/controllers/test_routing_controller.rb
@@ -0,0 +1,9 @@
+class TestRoutingController < ApplicationController
+  def routed_action
+    render_class_and_action
+  end
+  
+  def test_named_routes_from_plugin
+    render :text => plugin_route_path(:action => "index")
+  end
+end
\ No newline at end of file
diff --git a/vendor/plugins/engines/test/plugins/test_routing/config/routes.rb b/vendor/plugins/engines/test/plugins/test_routing/config/routes.rb
new file mode 100644
index 0000000..dbc49f9
--- /dev/null
+++ b/vendor/plugins/engines/test/plugins/test_routing/config/routes.rb
@@ -0,0 +1,4 @@
+ActionController::Routing::Routes.draw do |map|
+  map.connect 'routes/:action', :controller => "test_routing"
+  map.plugin_route 'somespace/routes/:action', :controller => "namespace/test_routing"
+end
\ No newline at end of file
diff --git a/vendor/plugins/engines/test/plugins/test_routing/init.rb b/vendor/plugins/engines/test/plugins/test_routing/init.rb
new file mode 100644
index 0000000..e69de29
diff --git a/vendor/plugins/engines/test/plugins/test_testing/app/README.txt b/vendor/plugins/engines/test/plugins/test_testing/app/README.txt
new file mode 100644
index 0000000..784e4fe
--- /dev/null
+++ b/vendor/plugins/engines/test/plugins/test_testing/app/README.txt
@@ -0,0 +1 @@
+Fixtures are only copied from plugins with an +app+ directory, but git needs this directory to be non-empty
\ No newline at end of file
diff --git a/vendor/plugins/engines/test/plugins/test_testing/init.rb b/vendor/plugins/engines/test/plugins/test_testing/init.rb
new file mode 100644
index 0000000..e69de29
diff --git a/vendor/plugins/engines/test/plugins/test_testing/test/fixtures/testing_fixtures.yml b/vendor/plugins/engines/test/plugins/test_testing/test/fixtures/testing_fixtures.yml
new file mode 100644
index 0000000..e69de29
diff --git a/vendor/plugins/engines/test/plugins/test_testing/test/unit/override_test.rb b/vendor/plugins/engines/test/plugins/test_testing/test/unit/override_test.rb
new file mode 100644
index 0000000..4c4c42a
--- /dev/null
+++ b/vendor/plugins/engines/test/plugins/test_testing/test/unit/override_test.rb
@@ -0,0 +1,13 @@
+require File.expand_path(File.join(File.dirname(__FILE__), *%w[.. .. .. .. .. test test_helper]))
+
+class OverrideTest < ActiveSupport::TestCase
+  def test_overrides_from_the_application_should_work
+    flunk "this test should be overridden by the app"
+  end
+  
+  def test_tests_within_the_plugin_should_still_run
+    assert true, "non-overridden plugin tests should still run"
+  end
+end
+
+Engines::Testing.override_tests_from_app
\ No newline at end of file
diff --git a/vendor/plugins/engines/test/unit/action_mailer_test.rb b/vendor/plugins/engines/test/unit/action_mailer_test.rb
new file mode 100644
index 0000000..fc3e756
--- /dev/null
+++ b/vendor/plugins/engines/test/unit/action_mailer_test.rb
@@ -0,0 +1,54 @@
+require File.dirname(__FILE__) + '/../test_helper'
+
+class ActionMailerWithinApplicationTest < Test::Unit::TestCase
+  
+  def test_normal_implicit_template
+    m = NotifyMail.create_signup("hello")
+    assert m.body =~ /^Signup template from application/
+  end
+  
+  def test_action_mailer_can_get_helper
+    m = NotifyMail.create_signup('James')
+    assert m.body =~ /James/
+    assert m.body =~ /semaJ/ # from the helper
+  end
+  
+  def test_multipart_mails_with_explicit_templates
+    m = NotifyMail.create_multipart
+    assert_equal 2, m.parts.length
+    assert_equal 'the html part of the email james', m.parts[0].body
+    assert_equal 'the plaintext part of the email', m.parts[1].body
+  end
+  
+  def test_multipart_mails_with_implicit_templates
+    m = NotifyMail.create_implicit_multipart
+    assert_equal 2, m.parts.length
+    assert_equal 'the implicit plaintext part of the email', m.parts[0].body    
+    assert_equal 'the implicit html part of the email james', m.parts[1].body
+  end
+end
+
+
+class ActionMailerWithinPluginsTest < Test::Unit::TestCase  
+  def test_should_be_able_to_create_mails_from_plugin
+    m = PluginMail.create_mail_from_plugin("from_plugin")
+    assert_equal "from_plugin", m.body
+  end
+  
+  def test_should_be_able_to_overload_views_within_the_application
+    m = PluginMail.create_mail_from_plugin_with_application_template("from_plugin")
+    assert_equal "from_plugin (from application)", m.body    
+  end
+  
+  def test_should_be_able_to_create_a_multipart_mail_from_within_plugin
+    m = PluginMail.create_multipart_from_plugin
+    assert_equal 2, m.parts.length
+    assert_equal 'html template', m.parts[0].body
+    assert_equal 'plain template', m.parts[1].body
+  end
+  
+  def test_plugin_mailer_template_overriding
+    m = PluginMail.create_multipart_from_plugin_with_application_template
+    assert_equal 'plugin mail template loaded from application', m.parts[1].body
+  end
+end
\ No newline at end of file
diff --git a/vendor/plugins/engines/test/unit/arbitrary_code_mixing_test.rb b/vendor/plugins/engines/test/unit/arbitrary_code_mixing_test.rb
new file mode 100644
index 0000000..4b862f3
--- /dev/null
+++ b/vendor/plugins/engines/test/unit/arbitrary_code_mixing_test.rb
@@ -0,0 +1,41 @@
+require File.dirname(__FILE__) + '/../test_helper'
+
+class ArbitraryCodeMixingTest < Test::Unit::TestCase  
+  def setup
+    Engines.code_mixing_file_types = %w(controller helper)
+  end
+  
+  def test_should_allow_setting_of_different_code_mixing_file_types
+    assert_nothing_raised {
+      Engines.mix_code_from :things
+    }
+  end
+
+  def test_should_add_new_types_to_existing_code_mixing_file_types
+    Engines.mix_code_from :things
+    assert_equal ["controller", "helper", "thing"], Engines.code_mixing_file_types
+    Engines.mix_code_from :other
+    assert_equal ["controller", "helper", "thing", "other"], Engines.code_mixing_file_types
+  end
+  
+  def test_should_allow_setting_of_multiple_types_at_once
+    Engines.mix_code_from :things, :other
+    assert_equal ["controller", "helper", "thing", "other"], Engines.code_mixing_file_types
+  end
+   
+  def test_should_singularize_elements_to_be_mixed
+    # this is the only test using mocha, so let's try to work around it
+    # also, this seems to be already tested with the :things in the tests above
+    # arg = stub(:to_s => stub(:singularize => "element")) 
+    Engines.mix_code_from :elements
+    assert Engines.code_mixing_file_types.include?("element")
+  end
+  
+  # TODO doesn't seem to work as expected?
+  
+  # def test_should_successfully_mix_custom_types
+  #   Engines.mix_code_from :things    
+  #   assert_equal 'Thing (from app)', Thing.from_app
+  #   assert_equal 'Thing (from test_code_mixing)', Thing.from_plugin
+  # end
+end
\ No newline at end of file
diff --git a/vendor/plugins/engines/test/unit/assets_test.rb b/vendor/plugins/engines/test/unit/assets_test.rb
new file mode 100644
index 0000000..3332c53
--- /dev/null
+++ b/vendor/plugins/engines/test/unit/assets_test.rb
@@ -0,0 +1,52 @@
+require File.dirname(__FILE__) + '/../test_helper'
+
+class AssetsTest < Test::Unit::TestCase  
+  def setup
+    Engines::Assets.mirror_files_for Engines.plugins[:test_assets]
+  end
+  
+  def teardown
+    FileUtils.rm_r(Engines.public_directory) if File.exist?(Engines.public_directory)
+  end
+  
+  def test_engines_has_created_base_public_file
+    assert File.exist?(Engines.public_directory)
+  end
+  
+  def test_engines_has_created_README_in_public_directory
+    assert File.exist?(File.join(Engines.public_directory, 'README'))
+  end
+  
+  def test_public_files_have_been_copied_from_test_assets_plugin
+    assert File.exist?(File.join(Engines.public_directory, 'test_assets'))
+    assert File.exist?(File.join(Engines.public_directory, 'test_assets', 'file.txt'))
+    assert File.exist?(File.join(Engines.public_directory, 'test_assets', 'subfolder'))
+    assert File.exist?(File.join(Engines.public_directory, 'test_assets', 'subfolder', 'file_in_subfolder.txt'))
+  end
+  
+  def test_engines_has_not_created_duplicated_file_structure
+    assert !File.exists?(File.join(Engines.public_directory, "test_assets", RAILS_ROOT))
+  end
+  
+  def test_public_files_have_been_copied_from_test_assets_with_assets_dir_plugin
+    Engines::Assets.mirror_files_for Engines.plugins[:test_assets_with_assets_directory]
+
+    assert File.exist?(File.join(Engines.public_directory, 'test_assets_with_assets_directory'))
+    assert File.exist?(File.join(Engines.public_directory, 'test_assets_with_assets_directory', 'file.txt'))
+    assert File.exist?(File.join(Engines.public_directory, 'test_assets_with_assets_directory', 'subfolder'))
+    assert File.exist?(File.join(Engines.public_directory, 'test_assets_with_assets_directory', 'subfolder', 'file_in_subfolder.txt'))
+  end
+  
+  def test_public_files_have_been_copied_from_test_assets_with_no_subdirectory_plugin
+    Engines::Assets.mirror_files_for Engines.plugins[:test_assets_with_no_subdirectory]
+
+    assert File.exist?(File.join(Engines.public_directory, 'test_assets_with_no_subdirectory'))
+    assert File.exist?(File.join(Engines.public_directory, 'test_assets_with_no_subdirectory', 'file.txt'))    
+  end
+  
+  def test_public_files_have_NOT_been_copied_from_plugins_without_public_or_asset_directories
+    Engines::Assets.mirror_files_for Engines.plugins[:alpha_plugin]
+    
+    assert !File.exist?(File.join(Engines.public_directory, 'alpha_plugin'))
+  end
+end
\ No newline at end of file
diff --git a/vendor/plugins/engines/test/unit/backwards_compat_test.rb b/vendor/plugins/engines/test/unit/backwards_compat_test.rb
new file mode 100644
index 0000000..4fa3698
--- /dev/null
+++ b/vendor/plugins/engines/test/unit/backwards_compat_test.rb
@@ -0,0 +1,8 @@
+require File.dirname(__FILE__) + '/../test_helper'
+
+class BackwardsCompatibilityTest < Test::Unit::TestCase
+  def test_rails_module_plugin_method_should_delegate_to_engines_plugins
+    assert_nothing_raised { Rails.plugins }
+    assert_equal Engines.plugins, Rails.plugins 
+  end
+end
\ No newline at end of file
diff --git a/vendor/plugins/engines/test/unit/load_path_test.rb b/vendor/plugins/engines/test/unit/load_path_test.rb
new file mode 100644
index 0000000..c26d331
--- /dev/null
+++ b/vendor/plugins/engines/test/unit/load_path_test.rb
@@ -0,0 +1,58 @@
+# Tests in this file ensure that:
+#
+# * the application /app/[controllers|helpers|models] and /lib 
+#   paths preceed the corresponding plugin paths
+# * the plugin paths are added to $LOAD_PATH in the order in which plugins are 
+#   loaded
+
+require File.dirname(__FILE__) + '/../test_helper'
+
+class LoadPathTest < Test::Unit::TestCase
+  def setup
+    @load_path = expand_paths($LOAD_PATH)
+  end
+  
+  # Not sure if these test actually make sense as this now essentially tests
+  # Rails core functionality. On the other hand Engines relies on this to some
+  # extend so this will choke if something important changes in Rails.
+  
+  # the application app/... and lib/ directories should appear
+  # before any plugin directories
+  
+  def test_application_app_libs_should_precede_all_plugin_app_libs
+    types = %w(app/controllers app/helpers app/models lib)
+    types.each do |t|
+      app_index = load_path_index(File.join(RAILS_ROOT, t))
+      assert_not_nil app_index, "#{t} is missing in $LOAD_PATH"
+      Engines.plugins.each do |plugin|
+        first_plugin_index = load_path_index(File.join(plugin.directory, t))
+        assert(app_index < first_plugin_index) unless first_plugin_index.nil?
+      end
+    end
+  end
+  
+  # the engine directories should appear in the proper order based on
+  # the order they were started  
+  
+  def test_plugin_dirs_should_appear_in_reverse_plugin_loading_order
+    app_paths = %w(app/controllers/ app app/models app/helpers lib)
+    app_paths.map { |p| File.join(RAILS_ROOT, p)}
+    plugin_paths = Engines.plugins.reverse.collect { |plugin| plugin.load_paths.reverse }.flatten    
+    
+    expected_paths = expand_paths(app_paths + plugin_paths)    
+    # only look at those paths that are also present in expected_paths so
+    # the only difference would be in the order of the paths
+    actual_paths = @load_path & expected_paths 
+    
+    assert_equal expected_paths, actual_paths
+  end
+  
+  protected    
+    def expand_paths(paths)
+      paths.collect { |p| File.expand_path(p) }
+    end
+    
+    def load_path_index(dir)
+      @load_path.index(File.expand_path(dir))
+    end  
+end
\ No newline at end of file
diff --git a/vendor/plugins/engines/test/unit/migration_test.rb b/vendor/plugins/engines/test/unit/migration_test.rb
new file mode 100644
index 0000000..eae7fe7
--- /dev/null
+++ b/vendor/plugins/engines/test/unit/migration_test.rb
@@ -0,0 +1,63 @@
+require File.dirname(__FILE__) + '/../test_helper'
+require 'rails_generator'
+require 'rails_generator/scripts/generate'
+
+class MigrationsTest < Test::Unit::TestCase
+  
+  @@migration_dir = "#{RAILS_ROOT}/db/migrate"
+
+  def setup
+    ActiveRecord::Migration.verbose = false
+    Engines.plugins[:test_migration].migrate(0)
+  end
+  
+  def teardown
+    FileUtils.rm_r(@@migration_dir) if File.exist?(@@migration_dir)
+  end
+  
+  def test_engine_migrations_can_run_down
+    assert !table_exists?('tests'), ActiveRecord::Base.connection.tables.inspect
+    assert !table_exists?('others'), ActiveRecord::Base.connection.tables.inspect
+    assert !table_exists?('extras'), ActiveRecord::Base.connection.tables.inspect
+  end
+    
+  def test_engine_migrations_can_run_up
+    Engines.plugins[:test_migration].migrate(3)
+    assert table_exists?('tests')
+    assert table_exists?('others')
+    assert table_exists?('extras')
+  end
+  
+  def test_engine_migrations_can_upgrade_incrementally
+    Engines.plugins[:test_migration].migrate(1)
+    assert table_exists?('tests')
+    assert !table_exists?('others')
+    assert !table_exists?('extras')
+    assert_equal 1, Engines::Plugin::Migrator.current_version(Engines.plugins[:test_migration])
+    
+    
+    Engines.plugins[:test_migration].migrate(2)
+    assert table_exists?('others')
+    assert_equal 2, Engines::Plugin::Migrator.current_version(Engines.plugins[:test_migration])
+    
+    
+    Engines.plugins[:test_migration].migrate(3)
+    assert table_exists?('extras')
+    assert_equal 3, Engines::Plugin::Migrator.current_version(Engines.plugins[:test_migration])
+  end
+    
+  def test_generator_creates_plugin_migration_file
+    Rails::Generator::Scripts::Generate.new.run(['plugin_migration', 'test_migration'], :quiet => true)
+    assert migration_file, "migration file is missing"
+  end
+  
+  private
+  
+  def table_exists?(table)
+    ActiveRecord::Base.connection.tables.include?(table)
+  end
+  
+  def migration_file
+    Dir["#{@@migration_dir}/*test_migration_to_version_3.rb"][0]
+  end
+end
\ No newline at end of file
diff --git a/vendor/plugins/engines/test/unit/model_and_lib_test.rb b/vendor/plugins/engines/test/unit/model_and_lib_test.rb
new file mode 100644
index 0000000..e5aa773
--- /dev/null
+++ b/vendor/plugins/engines/test/unit/model_and_lib_test.rb
@@ -0,0 +1,37 @@
+require File.dirname(__FILE__) + '/../test_helper'
+
+class ModelAndLibTest < Test::Unit::TestCase
+
+ 	def test_WITH_a_model_defined_only_in_a_plugin_IT_should_load_the_model
+ 	  assert_equal 'AlphaPluginModel (from alpha_plugin)', AlphaPluginModel.report_location
+  end
+  
+  def test_WITH_a_model_defined_only_in_a_plugin_lib_dir_IT_should_load_the_model
+ 	  assert_equal 'AlphaPluginLibModel (from alpha_plugin)', AlphaPluginLibModel.report_location
+  end
+
+  # app takes precedence over plugins
+	
+	def test_WITH_a_model_defined_in_both_app_and_plugin_IT_should_load_the_one_in_app
+ 	  assert_equal 'AppAndPluginModel (from app)',	AppAndPluginModel.report_location  
+ 	  assert_raises(NoMethodError) { AppAndPluginLibModel.defined_only_in_alpha_engine_version }
+  end
+	
+	def test_WITH_a_model_defined_in_both_app_and_plugin_lib_dirs_IT_should_load_the_one_in_app
+ 	  assert_equal 'AppAndPluginLibModel (from lib)', AppAndPluginLibModel.report_location
+ 	  assert_raises(NoMethodError) { AppAndPluginLibModel.defined_only_in_alpha_engine_version }
+  end
+
+  # subsequently loaded plugins take precendence over previously loaded plugins
+	
+  # TODO
+  #
+  # this does work when we rely on $LOAD_PATH while it won't work when we use
+  # Dependency constant autoloading. This somewhat confusing difference has
+  # been there since at least Rails 1.2.x. See http://www.ruby-forum.com/topic/134529
+  
+  def test_WITH_a_model_defined_in_two_plugins_IT_should_load_the_latter_of_both
+    require 'shared_plugin_model'
+    assert_equal SharedPluginModel.report_location, 'SharedPluginModel (from beta_plugin)'
+  end
+end
\ No newline at end of file
diff --git a/vendor/plugins/engines/test/unit/plugins_test.rb b/vendor/plugins/engines/test/unit/plugins_test.rb
new file mode 100644
index 0000000..f8627bc
--- /dev/null
+++ b/vendor/plugins/engines/test/unit/plugins_test.rb
@@ -0,0 +1,11 @@
+require File.dirname(__FILE__) + '/../test_helper'
+
+class PluginsTest < Test::Unit::TestCase
+  
+  def test_should_allow_access_to_plugins_by_strings_or_symbols
+    p = Engines.plugins["alpha_plugin"]
+    q = Engines.plugins[:alpha_plugin]
+    assert_kind_of Engines::Plugin, p
+    assert_equal p, q
+  end
+end
\ No newline at end of file
diff --git a/vendor/plugins/engines/test/unit/test_testing/override_test.rb b/vendor/plugins/engines/test/unit/test_testing/override_test.rb
new file mode 100644
index 0000000..ea58a51
--- /dev/null
+++ b/vendor/plugins/engines/test/unit/test_testing/override_test.rb
@@ -0,0 +1,7 @@
+require File.join(File.dirname(__FILE__), *%w[.. .. test_helper])
+
+class OverrideTest < ActiveSupport::TestCase
+  def test_overrides_from_the_application_should_work
+    assert true, "overriding plugin tests from the application should work"
+  end
+end
\ No newline at end of file
diff --git a/vendor/plugins/engines/test/unit/testing_test.rb b/vendor/plugins/engines/test/unit/testing_test.rb
new file mode 100644
index 0000000..c0c37ed
--- /dev/null
+++ b/vendor/plugins/engines/test/unit/testing_test.rb
@@ -0,0 +1,19 @@
+require File.dirname(__FILE__) + '/../test_helper'
+
+class TestingTest < Test::Unit::TestCase
+  def setup
+    Engines::Testing.set_fixture_path
+    @filename = File.join(Engines::Testing.temporary_fixtures_directory, 'testing_fixtures.yml')
+    File.delete(@filename) if File.exists?(@filename)
+  end
+  
+  def teardown
+    File.delete(@filename) if File.exists?(@filename)
+  end
+
+  def test_should_copy_fixtures_files_to_tmp_directory
+    assert !File.exists?(@filename)
+    Engines::Testing.setup_plugin_fixtures
+    assert File.exists?(@filename)
+  end
+end
\ No newline at end of file
diff --git a/vendor/plugins/prepend_engine_views/init.rb b/vendor/plugins/prepend_engine_views/init.rb
new file mode 100644
index 0000000..cbf0e89
--- /dev/null
+++ b/vendor/plugins/prepend_engine_views/init.rb
@@ -0,0 +1,21 @@
+module PrependEngineViews
+  def self.included(base)
+    base.send(:include, InstanceMethods)
+    base.class_eval do
+      alias_method_chain :add_engine_view_paths, :prepend
+    end
+  end
+
+  module InstanceMethods
+    # Patch Rails so engine's views are prepended to the view_path,
+    # thereby letting plugins override application views
+    def add_engine_view_paths_with_prepend
+      paths = ActionView::PathSet.new(engines.collect(&:view_path))
+      ActionController::Base.view_paths.unshift(*paths)
+      ActionMailer::Base.view_paths.unshift(*paths) if configuration.frameworks.include?(:action_mailer)
+    end
+  end
+end
+
+Rails::Plugin::Loader.send :include, PrependEngineViews
+

