<?xml version="1.0" encoding="UTF-8"?>
<commit>
  <added type="array">
    <added>
      <filename>merb-auth/merb-auth-core/spec/merb-auth-core/failed_login_spec.rb</filename>
    </added>
    <added>
      <filename>merb-core/lib/merb-core/dispatch/request_parsers.rb</filename>
    </added>
    <added>
      <filename>merb-core/lib/merb-core/test/helpers/cookie_jar.rb</filename>
    </added>
    <added>
      <filename>merb-core/spec/public/core_ext/dependency_after_load_spec.rb</filename>
    </added>
    <added>
      <filename>merb-core/spec/public/core_ext/fixtures/bad_require_gem/Rakefile</filename>
    </added>
    <added>
      <filename>merb-core/spec/public/core_ext/fixtures/bad_require_gem/lib/BadRequireGem.rb</filename>
    </added>
    <added>
      <filename>merb-core/spec/public/core_ext/fixtures/gems/bin/edit_json.rb</filename>
    </added>
    <added>
      <filename>merb-core/spec/public/core_ext/fixtures/gems/gems/bad_require_gem-0.0.1/Rakefile</filename>
    </added>
    <added>
      <filename>merb-core/spec/public/core_ext/fixtures/gems/gems/bad_require_gem-0.0.1/lib/BadRequireGem.rb</filename>
    </added>
    <added>
      <filename>merb-core/spec/public/core_ext/fixtures/gems/gems/json_pure-1.1.3/CHANGES</filename>
    </added>
    <added>
      <filename>merb-core/spec/public/core_ext/fixtures/gems/gems/json_pure-1.1.3/GPL</filename>
    </added>
    <added>
      <filename>merb-core/spec/public/core_ext/fixtures/gems/gems/json_pure-1.1.3/README</filename>
    </added>
    <added>
      <filename>merb-core/spec/public/core_ext/fixtures/gems/gems/json_pure-1.1.3/RUBY</filename>
    </added>
    <added>
      <filename>merb-core/spec/public/core_ext/fixtures/gems/gems/json_pure-1.1.3/Rakefile</filename>
    </added>
    <added>
      <filename>merb-core/spec/public/core_ext/fixtures/gems/gems/json_pure-1.1.3/TODO</filename>
    </added>
    <added>
      <filename>merb-core/spec/public/core_ext/fixtures/gems/gems/json_pure-1.1.3/VERSION</filename>
    </added>
    <added>
      <filename>merb-core/spec/public/core_ext/fixtures/gems/gems/json_pure-1.1.3/benchmarks/benchmark.txt</filename>
    </added>
    <added>
      <filename>merb-core/spec/public/core_ext/fixtures/gems/gems/json_pure-1.1.3/benchmarks/benchmark_generator.rb</filename>
    </added>
    <added>
      <filename>merb-core/spec/public/core_ext/fixtures/gems/gems/json_pure-1.1.3/benchmarks/benchmark_parser.rb</filename>
    </added>
    <added>
      <filename>merb-core/spec/public/core_ext/fixtures/gems/gems/json_pure-1.1.3/benchmarks/benchmark_rails.rb</filename>
    </added>
    <added>
      <filename>merb-core/spec/public/core_ext/fixtures/gems/gems/json_pure-1.1.3/bin/edit_json.rb</filename>
    </added>
    <added>
      <filename>merb-core/spec/public/core_ext/fixtures/gems/gems/json_pure-1.1.3/bin/prettify_json.rb</filename>
    </added>
    <added>
      <filename>merb-core/spec/public/core_ext/fixtures/gems/gems/json_pure-1.1.3/data/example.json</filename>
    </added>
    <added>
      <filename>merb-core/spec/public/core_ext/fixtures/gems/gems/json_pure-1.1.3/data/index.html</filename>
    </added>
    <added>
      <filename>merb-core/spec/public/core_ext/fixtures/gems/gems/json_pure-1.1.3/data/prototype.js</filename>
    </added>
    <added>
      <filename>merb-core/spec/public/core_ext/fixtures/gems/gems/json_pure-1.1.3/ext/json/ext/generator/extconf.rb</filename>
    </added>
    <added>
      <filename>merb-core/spec/public/core_ext/fixtures/gems/gems/json_pure-1.1.3/ext/json/ext/generator/generator.c</filename>
    </added>
    <added>
      <filename>merb-core/spec/public/core_ext/fixtures/gems/gems/json_pure-1.1.3/ext/json/ext/generator/unicode.c</filename>
    </added>
    <added>
      <filename>merb-core/spec/public/core_ext/fixtures/gems/gems/json_pure-1.1.3/ext/json/ext/generator/unicode.h</filename>
    </added>
    <added>
      <filename>merb-core/spec/public/core_ext/fixtures/gems/gems/json_pure-1.1.3/ext/json/ext/parser/extconf.rb</filename>
    </added>
    <added>
      <filename>merb-core/spec/public/core_ext/fixtures/gems/gems/json_pure-1.1.3/ext/json/ext/parser/parser.c</filename>
    </added>
    <added>
      <filename>merb-core/spec/public/core_ext/fixtures/gems/gems/json_pure-1.1.3/ext/json/ext/parser/parser.rl</filename>
    </added>
    <added>
      <filename>merb-core/spec/public/core_ext/fixtures/gems/gems/json_pure-1.1.3/ext/json/ext/parser/unicode.c</filename>
    </added>
    <added>
      <filename>merb-core/spec/public/core_ext/fixtures/gems/gems/json_pure-1.1.3/ext/json/ext/parser/unicode.h</filename>
    </added>
    <added>
      <filename>merb-core/spec/public/core_ext/fixtures/gems/gems/json_pure-1.1.3/install.rb</filename>
    </added>
    <added>
      <filename>merb-core/spec/public/core_ext/fixtures/gems/gems/json_pure-1.1.3/lib/json.rb</filename>
    </added>
    <added>
      <filename>merb-core/spec/public/core_ext/fixtures/gems/gems/json_pure-1.1.3/lib/json/Array.xpm</filename>
    </added>
    <added>
      <filename>merb-core/spec/public/core_ext/fixtures/gems/gems/json_pure-1.1.3/lib/json/FalseClass.xpm</filename>
    </added>
    <added>
      <filename>merb-core/spec/public/core_ext/fixtures/gems/gems/json_pure-1.1.3/lib/json/Hash.xpm</filename>
    </added>
    <added>
      <filename>merb-core/spec/public/core_ext/fixtures/gems/gems/json_pure-1.1.3/lib/json/Key.xpm</filename>
    </added>
    <added>
      <filename>merb-core/spec/public/core_ext/fixtures/gems/gems/json_pure-1.1.3/lib/json/NilClass.xpm</filename>
    </added>
    <added>
      <filename>merb-core/spec/public/core_ext/fixtures/gems/gems/json_pure-1.1.3/lib/json/Numeric.xpm</filename>
    </added>
    <added>
      <filename>merb-core/spec/public/core_ext/fixtures/gems/gems/json_pure-1.1.3/lib/json/String.xpm</filename>
    </added>
    <added>
      <filename>merb-core/spec/public/core_ext/fixtures/gems/gems/json_pure-1.1.3/lib/json/TrueClass.xpm</filename>
    </added>
    <added>
      <filename>merb-core/spec/public/core_ext/fixtures/gems/gems/json_pure-1.1.3/lib/json/add/core.rb</filename>
    </added>
    <added>
      <filename>merb-core/spec/public/core_ext/fixtures/gems/gems/json_pure-1.1.3/lib/json/add/rails.rb</filename>
    </added>
    <added>
      <filename>merb-core/spec/public/core_ext/fixtures/gems/gems/json_pure-1.1.3/lib/json/common.rb</filename>
    </added>
    <added>
      <filename>merb-core/spec/public/core_ext/fixtures/gems/gems/json_pure-1.1.3/lib/json/editor.rb</filename>
    </added>
    <added>
      <filename>merb-core/spec/public/core_ext/fixtures/gems/gems/json_pure-1.1.3/lib/json/ext.rb</filename>
    </added>
    <added>
      <filename>merb-core/spec/public/core_ext/fixtures/gems/gems/json_pure-1.1.3/lib/json/json.xpm</filename>
    </added>
    <added>
      <filename>merb-core/spec/public/core_ext/fixtures/gems/gems/json_pure-1.1.3/lib/json/pure.rb</filename>
    </added>
    <added>
      <filename>merb-core/spec/public/core_ext/fixtures/gems/gems/json_pure-1.1.3/lib/json/pure/generator.rb</filename>
    </added>
    <added>
      <filename>merb-core/spec/public/core_ext/fixtures/gems/gems/json_pure-1.1.3/lib/json/pure/parser.rb</filename>
    </added>
    <added>
      <filename>merb-core/spec/public/core_ext/fixtures/gems/gems/json_pure-1.1.3/lib/json/version.rb</filename>
    </added>
    <added>
      <filename>merb-core/spec/public/core_ext/fixtures/gems/gems/json_pure-1.1.3/tests/fixtures/fail1.json</filename>
    </added>
    <added>
      <filename>merb-core/spec/public/core_ext/fixtures/gems/gems/json_pure-1.1.3/tests/fixtures/fail10.json</filename>
    </added>
    <added>
      <filename>merb-core/spec/public/core_ext/fixtures/gems/gems/json_pure-1.1.3/tests/fixtures/fail11.json</filename>
    </added>
    <added>
      <filename>merb-core/spec/public/core_ext/fixtures/gems/gems/json_pure-1.1.3/tests/fixtures/fail12.json</filename>
    </added>
    <added>
      <filename>merb-core/spec/public/core_ext/fixtures/gems/gems/json_pure-1.1.3/tests/fixtures/fail13.json</filename>
    </added>
    <added>
      <filename>merb-core/spec/public/core_ext/fixtures/gems/gems/json_pure-1.1.3/tests/fixtures/fail14.json</filename>
    </added>
    <added>
      <filename>merb-core/spec/public/core_ext/fixtures/gems/gems/json_pure-1.1.3/tests/fixtures/fail18.json</filename>
    </added>
    <added>
      <filename>merb-core/spec/public/core_ext/fixtures/gems/gems/json_pure-1.1.3/tests/fixtures/fail19.json</filename>
    </added>
    <added>
      <filename>merb-core/spec/public/core_ext/fixtures/gems/gems/json_pure-1.1.3/tests/fixtures/fail2.json</filename>
    </added>
    <added>
      <filename>merb-core/spec/public/core_ext/fixtures/gems/gems/json_pure-1.1.3/tests/fixtures/fail20.json</filename>
    </added>
    <added>
      <filename>merb-core/spec/public/core_ext/fixtures/gems/gems/json_pure-1.1.3/tests/fixtures/fail21.json</filename>
    </added>
    <added>
      <filename>merb-core/spec/public/core_ext/fixtures/gems/gems/json_pure-1.1.3/tests/fixtures/fail22.json</filename>
    </added>
    <added>
      <filename>merb-core/spec/public/core_ext/fixtures/gems/gems/json_pure-1.1.3/tests/fixtures/fail23.json</filename>
    </added>
    <added>
      <filename>merb-core/spec/public/core_ext/fixtures/gems/gems/json_pure-1.1.3/tests/fixtures/fail24.json</filename>
    </added>
    <added>
      <filename>merb-core/spec/public/core_ext/fixtures/gems/gems/json_pure-1.1.3/tests/fixtures/fail25.json</filename>
    </added>
    <added>
      <filename>merb-core/spec/public/core_ext/fixtures/gems/gems/json_pure-1.1.3/tests/fixtures/fail27.json</filename>
    </added>
    <added>
      <filename>merb-core/spec/public/core_ext/fixtures/gems/gems/json_pure-1.1.3/tests/fixtures/fail28.json</filename>
    </added>
    <added>
      <filename>merb-core/spec/public/core_ext/fixtures/gems/gems/json_pure-1.1.3/tests/fixtures/fail3.json</filename>
    </added>
    <added>
      <filename>merb-core/spec/public/core_ext/fixtures/gems/gems/json_pure-1.1.3/tests/fixtures/fail4.json</filename>
    </added>
    <added>
      <filename>merb-core/spec/public/core_ext/fixtures/gems/gems/json_pure-1.1.3/tests/fixtures/fail5.json</filename>
    </added>
    <added>
      <filename>merb-core/spec/public/core_ext/fixtures/gems/gems/json_pure-1.1.3/tests/fixtures/fail6.json</filename>
    </added>
    <added>
      <filename>merb-core/spec/public/core_ext/fixtures/gems/gems/json_pure-1.1.3/tests/fixtures/fail7.json</filename>
    </added>
    <added>
      <filename>merb-core/spec/public/core_ext/fixtures/gems/gems/json_pure-1.1.3/tests/fixtures/fail8.json</filename>
    </added>
    <added>
      <filename>merb-core/spec/public/core_ext/fixtures/gems/gems/json_pure-1.1.3/tests/fixtures/fail9.json</filename>
    </added>
    <added>
      <filename>merb-core/spec/public/core_ext/fixtures/gems/gems/json_pure-1.1.3/tests/fixtures/pass1.json</filename>
    </added>
    <added>
      <filename>merb-core/spec/public/core_ext/fixtures/gems/gems/json_pure-1.1.3/tests/fixtures/pass15.json</filename>
    </added>
    <added>
      <filename>merb-core/spec/public/core_ext/fixtures/gems/gems/json_pure-1.1.3/tests/fixtures/pass16.json</filename>
    </added>
    <added>
      <filename>merb-core/spec/public/core_ext/fixtures/gems/gems/json_pure-1.1.3/tests/fixtures/pass17.json</filename>
    </added>
    <added>
      <filename>merb-core/spec/public/core_ext/fixtures/gems/gems/json_pure-1.1.3/tests/fixtures/pass2.json</filename>
    </added>
    <added>
      <filename>merb-core/spec/public/core_ext/fixtures/gems/gems/json_pure-1.1.3/tests/fixtures/pass26.json</filename>
    </added>
    <added>
      <filename>merb-core/spec/public/core_ext/fixtures/gems/gems/json_pure-1.1.3/tests/fixtures/pass3.json</filename>
    </added>
    <added>
      <filename>merb-core/spec/public/core_ext/fixtures/gems/gems/json_pure-1.1.3/tests/runner.rb</filename>
    </added>
    <added>
      <filename>merb-core/spec/public/core_ext/fixtures/gems/gems/json_pure-1.1.3/tests/test_json.rb</filename>
    </added>
    <added>
      <filename>merb-core/spec/public/core_ext/fixtures/gems/gems/json_pure-1.1.3/tests/test_json_addition.rb</filename>
    </added>
    <added>
      <filename>merb-core/spec/public/core_ext/fixtures/gems/gems/json_pure-1.1.3/tests/test_json_fixtures.rb</filename>
    </added>
    <added>
      <filename>merb-core/spec/public/core_ext/fixtures/gems/gems/json_pure-1.1.3/tests/test_json_generate.rb</filename>
    </added>
    <added>
      <filename>merb-core/spec/public/core_ext/fixtures/gems/gems/json_pure-1.1.3/tests/test_json_rails.rb</filename>
    </added>
    <added>
      <filename>merb-core/spec/public/core_ext/fixtures/gems/gems/json_pure-1.1.3/tests/test_json_unicode.rb</filename>
    </added>
    <added>
      <filename>merb-core/spec/public/core_ext/fixtures/gems/gems/json_pure-1.1.3/tools/fuzz.rb</filename>
    </added>
    <added>
      <filename>merb-core/spec/public/core_ext/fixtures/gems/gems/json_pure-1.1.3/tools/server.rb</filename>
    </added>
    <added>
      <filename>merb-core/spec/public/core_ext/fixtures/gems/gems/simple_gem-0.0.1/Rakefile</filename>
    </added>
    <added>
      <filename>merb-core/spec/public/core_ext/fixtures/gems/gems/simple_gem-0.0.1/lib/simple_gem.rb</filename>
    </added>
    <added>
      <filename>merb-core/spec/public/core_ext/fixtures/gems/gems/simple_gem-0.0.2/Rakefile</filename>
    </added>
    <added>
      <filename>merb-core/spec/public/core_ext/fixtures/gems/gems/simple_gem-0.0.2/lib/simple_gem.rb</filename>
    </added>
    <added>
      <filename>merb-core/spec/public/core_ext/fixtures/gems/specifications/bad_require_gem-0.0.1.gemspec</filename>
    </added>
    <added>
      <filename>merb-core/spec/public/core_ext/fixtures/gems/specifications/json_pure-1.1.3.gemspec</filename>
    </added>
    <added>
      <filename>merb-core/spec/public/core_ext/fixtures/gems/specifications/simple_gem-0.0.1.gemspec</filename>
    </added>
    <added>
      <filename>merb-core/spec/public/core_ext/fixtures/gems/specifications/simple_gem-0.0.2.gemspec</filename>
    </added>
    <added>
      <filename>merb-core/spec/public/core_ext/fixtures/simple_gem/Rakefile</filename>
    </added>
    <added>
      <filename>merb-core/spec/public/core_ext/fixtures/simple_gem/lib/simple_gem.rb</filename>
    </added>
    <added>
      <filename>merb-core/spec/public/core_ext/fixtures/simple_gem_2/Rakefile</filename>
    </added>
    <added>
      <filename>merb-core/spec/public/core_ext/fixtures/simple_gem_2/lib/simple_gem.rb</filename>
    </added>
    <added>
      <filename>merb-core/spec/public/core_ext/immediate_spec.rb</filename>
    </added>
    <added>
      <filename>merb-core/spec/public/core_ext/multi_versions_spec.rb</filename>
    </added>
    <added>
      <filename>merb-core/spec/public/core_ext/require_as_fail_spec.rb</filename>
    </added>
    <added>
      <filename>merb-core/spec/public/core_ext/require_as_immediate_spec.rb</filename>
    </added>
    <added>
      <filename>merb-core/spec/public/core_ext/require_as_version_spec.rb</filename>
    </added>
    <added>
      <filename>merb-core/spec/public/core_ext/require_as_working_spec.rb</filename>
    </added>
    <added>
      <filename>merb-core/spec/public/core_ext/simple_dependency_spec.rb</filename>
    </added>
    <added>
      <filename>merb-core/spec/public/core_ext/version_dependency_spec.rb</filename>
    </added>
    <added>
      <filename>merb-core/spec/public/test/controllers/request_controller.rb</filename>
    </added>
    <added>
      <filename>merb-core/spec/public/test/mock_request_helper_spec.rb</filename>
    </added>
    <added>
      <filename>merb-slices/lib/generators/templates/full/config/router.rb</filename>
    </added>
  </added>
  <modified type="array">
    <modified>
      <diff>@@ -69,8 +69,20 @@ module Merb
     def authenticate!(request, params, *rest)
       opts = rest.last.kind_of?(Hash) ? rest.pop : {}
       rest = rest.flatten
-      strategies = rest.empty? ? Merb::Authentication.default_strategy_order : rest
-
+      
+      strategies = if rest.empty?
+        if request.session[:authentication_strategies] 
+          request.session[:authentication_strategies]
+        else
+          Merb::Authentication.default_strategy_order
+        end
+      else
+        request.session[:authentication_strategies] ||= []
+        request.session[:authentication_strategies] &lt;&lt; rest
+        request.session[:authentication_strategies].flatten!.uniq!
+        request.session[:authentication_strategies]
+      end
+    
       msg = opts[:message] || error_message
       user = nil    
       # This one should find the first one that matches.  It should not run antother
@@ -87,19 +99,13 @@ module Merb
           user
         end
       end
+      
       # Check after callbacks to make sure the user is still cool
-      Merb::Authentication.after_callbacks.each do |cb|
-        user = case cb
-        when Proc
-          cb.call(user, request, params)
-        when Symbol, String
-          user.send(cb)
-        end
-        break unless user
-      end if user
+      user = run_after_authentication_callbacks(user, request, params) if user
       
       # Finally, Raise an error if there is no user found, or set it in the session if there is.
       raise Merb::Controller::Unauthenticated, msg unless user
+      session[:authentication_strategies] = nil # clear the session of Failed Strategies if login is successful      
       self.user = user
     end
   
@@ -142,11 +148,12 @@ module Merb
     # Keeps track of strategies by class or string
     # When loading from string, strategies are loaded withing the Merb::Authentication::Strategies namespace
     # When loaded by class, the class is stored directly
+    # @private
     def self.lookup_strategy
       @strategy_lookup || reset_strategy_lookup!
     end
     
-    # Restets the strategy lookup.  Useful in specsd
+    # Restets the strategy lookup.  Useful in specs
     def self.reset_strategy_lookup!
       @strategy_lookup = Mash.new do |h,k| 
         case k
@@ -158,5 +165,26 @@ module Merb
       end
     end
     
+    # Maintains a list of keys to maintain when needing to keep some state 
+    # in the face of session.abandon! You need to maintain this state yourself
+    # @public
+    def self.maintain_session_keys
+      @maintain_session_keys ||= [:authentication_strategies]
+    end
+    
+    private
+    def run_after_authentication_callbacks(user, request, params)
+      Merb::Authentication.after_callbacks.each do |cb|
+        user = case cb
+        when Proc
+          cb.call(user, request, params)
+        when Symbol, String
+          user.send(cb)
+        end
+        break unless user
+      end
+      user
+    end
+    
   end # Merb::Authentication
 end # Merb</diff>
      <filename>merb-auth/merb-auth-core/lib/merb-auth-core/authentication.rb</filename>
    </modified>
    <modified>
      <diff>@@ -25,12 +25,12 @@ module Merb::AuthenticatedHelper
   #
   # set the ignore url via an :ignore option in the opts hash.
   def redirect_back_or(default_url, opts = {})
-    if session.authentication.return_to_url &amp;&amp; ![opts[:ignore]].flatten.include?(session.authentication.return_to_url)
-      redirect session.authentication.return_to_url, opts
+    if !session[:return_to].blank? &amp;&amp; ![opts[:ignore]].flatten.include?(session[:return_to].first)
+      redirect session[:return_to].first, opts
+      session[:return_to] = nil
     else
       redirect default_url, opts
     end
-    session.authentication.return_to_url = nil
     &quot;Redirecting to &lt;a href='#{default_url}'&gt;#{default_url}&lt;/a&gt;&quot;
   end
   
@@ -49,23 +49,30 @@ module Merb::Authentication::Mixins
     
     private   
     def _set_return_to
-      session.authentication.return_to_url ||= request.uri unless request.exceptions.blank?
+      unless request.exceptions.blank?
+        session[:return_to] ||= []
+        session[:return_to] &lt;&lt; request.uri
+        session[:return_to]
+      end
     end
 
   end # RedirectBack
 end # Merb::Authentication::Mixins
 
 # Adds required methods to  the Authentication object for redirection
-class Merb::Authentication
-
-  def return_to_url
-    @return_to_url ||= session[:return_to]
-  end
-  
-  def return_to_url=(return_url)
-    @return_to_url = session[:return_to] = return_url
-  end
+Merb::BootLoader.after_app_loads do
+  Merb::Authentication.maintain_session_keys &lt;&lt; :return_to
 end
+# class Merb::Authentication
+# 
+#   def return_to_url
+#     @return_to_url ||= session[:return_to]
+#   end
+#   
+#   def return_to_url=(return_url)
+#     @return_to_url = session[:return_to] = return_url
+#   end
+# end
 
 # Mixin the RedirectBack mixin before the after_app_loads block (i.e. make sure there is an exceptions controller)
 Merb::Authentication.customize_default do</diff>
      <filename>merb-auth/merb-auth-more/lib/merb-auth-more/mixins/redirect_back.rb</filename>
    </modified>
    <modified>
      <diff>@@ -4,80 +4,94 @@ require File.join(File.expand_path(File.dirname(__FILE__)), &quot;..&quot;, &quot;..&quot; ,&quot;lib&quot;, &quot;
 describe &quot;redirect_back&quot; do
   
   before(:all) do
+    Merb::Config[:exception_details] = true
     clear_strategies!
+    Merb::Router.reset!
+    Merb::Router.prepare do
+      match(&quot;/login&quot;, :method =&gt; :get).to(:controller =&gt; &quot;exceptions&quot;, :action =&gt; &quot;unauthenticated&quot;).name(:login)
+      match(&quot;/login&quot;, :method =&gt; :put).to(:controller =&gt; &quot;sessions&quot;, :action =&gt; &quot;update&quot;)
+      match(&quot;/go_back&quot;).to(:controller =&gt; &quot;my_controller&quot;)
+      match(&quot;/&quot;).to(:controller =&gt; &quot;my_controller&quot;)
+      match(&quot;/logout&quot;, :method =&gt; :delete).to(:controller =&gt; &quot;sessions&quot;, :action =&gt; &quot;destroy&quot;)
+    end
     
     class Merb::Authentication
       def store_user(user); user; end
       def fetch_user(session_info); session_info; end
     end
     
-    class MyStrategy &lt; Merb::Authentication::Strategy; def run!; request.env[&quot;USER&quot;]; end; end
+    # class MyStrategy &lt; Merb::Authentication::Strategy; def run!; request.env[&quot;USER&quot;]; end; end
+    class MyStrategy &lt; Merb::Authentication::Strategy
+      def run!
+        params[:pass_auth] = false if params[:pass_auth] == &quot;false&quot;
+        params[:pass_auth]
+      end
+    end
     
     class Application &lt; Merb::Controller; end
     
     class Exceptions &lt; Merb::Controller
       include Merb::Authentication::Mixins::RedirectBack
+      
       def unauthenticated; end
+
+    end
+    
+    class Sessions &lt; Merb::Controller
+      before :ensure_authenticated
+      def update
+        redirect_back_or &quot;/&quot;, :ignore =&gt; [url(:login)]
+      end
+      
+      def destroy
+        session.abandon!
+      end      
     end
 
     class MyController &lt; Application
       before :ensure_authenticated
-      def index; &quot;HERE!&quot; end
+      def index
+        &quot;IN MY CONTROLLER&quot;
+      end
     end
+
   end 
   
+  def login
+    request(&quot;/login&quot;, :method =&gt; &quot;put&quot;, :params =&gt; {:pass_auth =&gt; true})
+  end
+  
   it &quot;should set the return_to in the session when sent to the exceptions controller from a failed login&quot; do
-    controller = dispatch_to(Exceptions, :unauthenticated, {}, {:user =&gt; &quot;winna&quot;, :request_uri =&gt; &quot;go_back&quot;}) do |c|
-      c.request.exceptions =  [Merb::Controller::Unauthenticated.new]
-    end
-    controller.session.authentication.return_to_url.should == &quot;go_back&quot;
+    r = request(&quot;/go_back&quot;) 
+    r.status.should == Merb::Controller::Unauthenticated.status
+    r2 = login
+    r2.should redirect_to(&quot;/go_back&quot;)
   end
   
   it  &quot;should not set the return_to in the session when deliberately going to unauthenticated&quot; do
-    controller = dispatch_to(Exceptions, :unauthenticated, {}, {:user =&gt; &quot;winna&quot;, :request_uri =&gt; &quot;don't_go_back&quot;}) do |c|
-      c.request.exceptions = []
-    end
-    controller.session.authentication.return_to_url.should be_nil
+    r = login
+    r.should redirect_to(&quot;/&quot;)
   end
   
-  it &quot;should not set the return_to when loggin into a controller directly&quot; do 
-    controller = dispatch_to(MyController, :index, {}, :user =&gt; &quot;winna&quot;, :request_uri =&gt; &quot;NOOO&quot;)
-    controller.session.authentication.return_to_url.should be_nil
+  it &quot;should still redirect to the original even if it's failed many times&quot; do
+    request(&quot;/go_back&quot;)
+    request(&quot;/login&quot;, :method =&gt; &quot;put&quot;, :params =&gt; {:pass_auth =&gt; false})
+    request(&quot;/login&quot;, :method =&gt; &quot;put&quot;, :params =&gt; {:pass_auth =&gt; false})
+    request(&quot;/login&quot;, :method =&gt; &quot;put&quot;, :params =&gt; {:pass_auth =&gt; false})
+    r = login
+    r.should redirect_to(&quot;/go_back&quot;)
   end
-  
-  describe &quot;redirect_back helper&quot; do
-    
-    before(:each) do
-      @with_redirect = dispatch_to(Exceptions, :unauthenticated, {}, :user =&gt; &quot;WINNA&quot;, :request_uri =&gt; &quot;request_uri&quot;) do |c|
-        c.request.exceptions = [Merb::Controller::Unauthenticated.new]
-      end
-      @no_redirect = dispatch_to(MyController, :index, {}, :user =&gt; &quot;winna&quot;, :request_uri =&gt; &quot;NOOO&quot;)
-    end
-    
-    it &quot;should provide the url stored in the session&quot; do
-      @with_redirect.session.authentication.return_to_url.should == &quot;request_uri&quot;
-      @with_redirect.redirect_back_or(&quot;/some/path&quot;)
-      @with_redirect.headers[&quot;Location&quot;].should == &quot;request_uri&quot;
-    end
-    
-    it &quot;should provide the url passed in by default when there is no return_to&quot; do
-      @no_redirect.session.authentication.return_to_url.should be_nil
-      @no_redirect.redirect_back_or(&quot;/some/path&quot;)
-      @no_redirect.headers[&quot;Location&quot;].should ==  &quot;/some/path&quot;
-    end
-    
-    it &quot;should wipe out the return_to in the session after the redirect&quot; do
-      @with_redirect.session.authentication.return_to_url.should == &quot;request_uri&quot;
-      @with_redirect.redirect_back_or(&quot;somewhere&quot;)
-      @with_redirect.headers[&quot;Location&quot;].should == &quot;request_uri&quot;
-      @with_redirect.session.authentication.return_to_url.should be_nil
-    end
-    
-    it &quot;should ignore a return_to if it's the same as the ignore url&quot; do
-      @with_redirect.redirect_back_or(&quot;somewhere&quot;, :ignore =&gt; &quot;request_uri&quot;)
-      @with_redirect.headers[&quot;Location&quot;].should == &quot;somewhere&quot;
-    end
-     
+
+  it &quot;should not redirect back to a previous redirect back after being logged out&quot; do
+    request(&quot;/go_back&quot;)
+    request(&quot;/login&quot;, :method =&gt; &quot;put&quot;, :params =&gt; {:pass_auth =&gt; false})
+    request(&quot;/login&quot;, :method =&gt; &quot;put&quot;, :params =&gt; {:pass_auth =&gt; false})
+    request(&quot;/login&quot;, :method =&gt; &quot;put&quot;, :params =&gt; {:pass_auth =&gt; false})
+    r = login
+    r.should redirect_to(&quot;/go_back&quot;)
+    request(&quot;/logout&quot;, :method =&gt; &quot;delete&quot;)
+    r = login
+    r.should redirect_to(&quot;/&quot;)
   end
   
 end
\ No newline at end of file</diff>
      <filename>merb-auth/merb-auth-more/spec/mixins/redirect_back_spec.rb</filename>
    </modified>
    <modified>
      <diff>@@ -1,9 +1,8 @@
 class MerbAuthSlicePassword::Sessions &lt; MerbAuthSlicePassword::Application
   
-  before :_grab_return_to                       # Need to hang onto the redirection during the session.abandon!
-  after  :_store_return_to_in_session           # Need to hang onto the redirection during the session.abandon!
-  
+  before :_maintain_auth_session_before, :exclude =&gt; [:destroy]  # Need to hang onto the redirection during the session.abandon!
   before :_abandon_session,     :only =&gt; [:update, :destroy]
+  before  :_maintain_auth_session_after,  :exclude =&gt; [:destroy]  # Need to hang onto the redirection during the session.abandon!
   before :ensure_authenticated, :only =&gt; [:update]
 
   # redirect from an after filter for max flexibility
@@ -33,15 +32,20 @@ class MerbAuthSlicePassword::Sessions &lt; MerbAuthSlicePassword::Application
     message[:notice] = &quot;Logged Out&quot;
     redirect &quot;/&quot;, :message =&gt; message
   end  
-  
+
   # @private
-  def _grab_return_to
-    session.authentication.return_to_url
+  def _maintain_auth_session_before
+    @_maintain_auth_session = {}
+    Merb::Authentication.maintain_session_keys.each do |k|
+      @_maintain_auth_session[k] = session[k]
+    end
   end
-
+  
   # @private
-  def _store_return_to_in_session
-    session.authentication.return_to_url = session.authentication.return_to_url
+  def _maintain_auth_session_after
+    @_maintain_auth_session.each do |k,v|
+      session[k] = v
+    end
   end
   
   # @private</diff>
      <filename>merb-auth/merb-auth-slice-password/app/controllers/sessions.rb</filename>
    </modified>
    <modified>
      <diff>@@ -94,23 +94,23 @@ describe Merb::Cache::CacheMixin do
 
   describe &quot;#_parameters_and_conditions&quot; do
     it &quot;should remove the :params entry from the conditions hash&quot; do
-      @controller._parameters_and_conditions(:params =&gt; [:foo, :bar]).last.should_not include(:params)
+      @controller._parameters_and_conditions(:params =&gt; [:foo, :bar]).last.should_not have_key(:params)
     end
 
     it &quot;should remove the :store entry from the conditions hash&quot; do
-      @controller._parameters_and_conditions(:store =&gt; :foo_store).last.should_not include(:store)
+      @controller._parameters_and_conditions(:store =&gt; :foo_store).last.should_not have_key(:store)
     end
 
     it &quot;should remove the :stores entry from the conditions hash&quot; do
-      @controller._parameters_and_conditions(:stores =&gt; [:foo_store, :bar_store]).last.should_not include(:stores)
+      @controller._parameters_and_conditions(:stores =&gt; [:foo_store, :bar_store]).last.should_not have_key(:stores)
     end
 
     it &quot;should keep an :expires_in entry in the conditions hash&quot; do
-      @controller._parameters_and_conditions(:expire_in =&gt; 10).last.should include(:expire_in)
+      @controller._parameters_and_conditions(:expire_in =&gt; 10).last.should have_key(:expire_in)
     end
 
     it &quot;should move the :params entry to the parameters array&quot; do
-      @controller._parameters_and_conditions(:params =&gt; :foo).first.should include(:foo)
+      @controller._parameters_and_conditions(:params =&gt; :foo).first.should have_key(:foo)
     end
   end
 </diff>
      <filename>merb-cache/spec/merb-cache/merb_ext/controller_spec.rb</filename>
    </modified>
    <modified>
      <diff>@@ -230,6 +230,12 @@ end
 setup_specs(&quot;mri&quot;, &quot;spec&quot;)
 setup_specs(&quot;jruby&quot;, &quot;jruby -S spec&quot;)
 
+task &quot;specs:core_ext&quot; do
+  require &quot;lib/merb-core/test/run_specs&quot;
+  run_specs(&quot;spec/public/core_ext/*_spec.rb&quot;, &quot;spec&quot;, &quot;-c -f o&quot;)
+end
+
+task &quot;spec&quot;           =&gt; [&quot;specs:mri&quot;]
 task &quot;specs&quot;          =&gt; [&quot;specs:mri&quot;]
 task &quot;specs:private&quot;  =&gt; [&quot;specs:mri:private&quot;]
 task &quot;specs:public&quot;   =&gt; [&quot;specs:mri:public&quot;]</diff>
      <filename>merb-core/Rakefile</filename>
    </modified>
    <modified>
      <diff>@@ -402,7 +402,12 @@ module Merb
       Merb.logger.fatal!
 
       print_colorized_backtrace(e) if e &amp;&amp; Merb::Config[:verbose]
-      exit(1)
+      
+      if Merb::Config[:show_ugly_backtraces]
+        raise e
+      else
+        exit(1)
+      end
     end
     
     # Print a colorized backtrace to the merb logger.</diff>
      <filename>merb-core/lib/merb-core.rb</filename>
    </modified>
    <modified>
      <diff>@@ -14,6 +14,7 @@ module Merb
   autoload :Rack,                     &quot;merb-core/rack&quot;
   autoload :RenderMixin,              &quot;merb-core/controller/mixins/render&quot;
   autoload :Request,                  &quot;merb-core/dispatch/request&quot;
+  autoload :Parse,                    &quot;merb-core/dispatch/request_parsers.rb&quot;
   autoload :ResponderMixin,           &quot;merb-core/controller/mixins/responder&quot;
   autoload :Router,                   &quot;merb-core/dispatch/router&quot;
   autoload :Test,                     &quot;merb-core/test&quot;</diff>
      <filename>merb-core/lib/merb-core/autoload.rb</filename>
    </modified>
    <modified>
      <diff>@@ -133,7 +133,7 @@ module Merb
       default_redirect_options = { :message =&gt; nil, :permanent =&gt; false }
       opts = default_redirect_options.merge(opts)
       if opts[:message]
-        notice = Merb::Request.escape([Marshal.dump(opts[:message])].pack(&quot;m&quot;))
+        notice = Merb::Parse.escape([Marshal.dump(opts[:message])].pack(&quot;m&quot;))
         url = url =~ /\?/ ? &quot;#{url}&amp;_message=#{notice}&quot; : &quot;#{url}?_message=#{notice}&quot;
       end
       self.status = opts[:permanent] ? 301 : 302</diff>
      <filename>merb-core/lib/merb-core/controller/mixins/controller.rb</filename>
    </modified>
    <modified>
      <diff>@@ -18,20 +18,16 @@ module Kernel
   #
   # @api private
   def track_dependency(name, *ver, &amp;blk)
-    ver.pop if ver.last.is_a?(Hash) &amp;&amp; ver.last.empty?
-    dep = Gem::Dependency.new(name, ver.empty? ? nil : ver)
-    dep.require_block = blk
-    dep.require_as = (ver.last.is_a?(Hash) &amp;&amp; ver.last[:require_as]) || name
+    options = ver.pop if ver.last.is_a?(Hash)
+    new_dep = Gem::Dependency.new(name, ver.empty? ? nil : ver)
+    new_dep.require_block = blk
+    new_dep.require_as = (options &amp;&amp; options[:require_as]) || name
     
-    existing = Merb::BootLoader::Dependencies.dependencies.find { |d| d.name == dep.name }
-    if existing
-      index = Merb::BootLoader::Dependencies.dependencies.index(existing)
-      Merb::BootLoader::Dependencies.dependencies.delete(existing)
-      Merb::BootLoader::Dependencies.dependencies.insert(index, dep)
-    else
-      Merb::BootLoader::Dependencies.dependencies &lt;&lt; dep
-    end
-    return dep
+    deps = Merb::BootLoader::Dependencies.dependencies
+
+    deps.reject! {|current| current.name == new_dep.name }
+    deps &lt;&lt; new_dep
+    new_dep
   end
   
   # Loads the given string as a gem. Execution is deferred until</diff>
      <filename>merb-core/lib/merb-core/core_ext/kernel.rb</filename>
    </modified>
    <modified>
      <diff>@@ -68,7 +68,7 @@ module Merb
           options[&quot;expires&quot;] = expiry.gmtime.strftime(Merb::Const::COOKIE_EXPIRATION_FORMAT)
         end
         secure  = options.delete(&quot;secure&quot;)
-        kookie  = &quot;#{name}=#{Merb::Request.escape(value)}; &quot;
+        kookie  = &quot;#{name}=#{Merb::Parse.escape(value)}; &quot;
         # WebKit in particular doens't like empty cookie options - skip them.
         options.each { |k, v| kookie &lt;&lt; &quot;#{k}=#{v}; &quot; unless v.blank? }
         kookie  &lt;&lt; 'secure' if secure
@@ -116,7 +116,7 @@ module Merb
       # a Hash of key =&gt; value pairs.
       def cookies
         @cookies ||= begin
-          values  = self.class.query_parse(@env[Merb::Const::HTTP_COOKIE], ';,')
+          values  = Merb::Parse.query(@env[Merb::Const::HTTP_COOKIE], ';,')
           cookies = Merb::Cookies.new(values)
           cookies.update(default_cookies) if respond_to?(:default_cookies)
           cookies</diff>
      <filename>merb-core/lib/merb-core/dispatch/cookies.rb</filename>
    </modified>
    <modified>
      <diff>@@ -179,7 +179,7 @@ module Merb
     #
     # @api private
     def query_params
-      @query_params ||= self.class.query_parse(query_string || '')
+      @query_params ||= Merb::Parse.query(query_string || '')
     end
 
     # Parameters passed in the body of the request. Ajax calls from
@@ -192,7 +192,7 @@ module Merb
     def body_params
       @body_params ||= begin
         if content_type &amp;&amp; content_type.match(Merb::Const::FORM_URL_ENCODED_REGEXP) # or content_type.nil?
-          self.class.query_parse(raw_post)
+          Merb::Parse.query(raw_post)
         end
       end
     end
@@ -226,7 +226,7 @@ module Merb
           # if the content-type is multipart
           # parse the multipart. Otherwise return {}
           if (Merb::Const::MULTIPART_REGEXP =~ content_type)
-            self.class.parse_multipart(@body, $1, content_length)
+            Merb::Parse.multipart(@body, $1, content_length)
           else
             {}
           end
@@ -299,7 +299,7 @@ module Merb
     def message
       return {} unless params[:_message]
       begin
-        Marshal.load(Merb::Request.unescape(params[:_message]).unpack(&quot;m&quot;).first)
+        Marshal.load(Merb::Parse.unescape(params[:_message]).unpack(&quot;m&quot;).first)
       rescue ArgumentError, TypeError
         {}
       end
@@ -539,7 +539,7 @@ module Merb
     #
     # @api public
     def path_info
-      @path_info ||= self.class.unescape(@env[Merb::Const::PATH_INFO])
+      @path_info ||= Merb::Parse.unescape(@env[Merb::Const::PATH_INFO])
     end
 
     # ==== Returns
@@ -555,7 +555,8 @@ module Merb
     #
     # @api public
     def host
-      @env[Merb::Const::HTTP_X_FORWARDED_HOST] || @env[Merb::Const::HTTP_HOST]
+      @env[Merb::Const::HTTP_X_FORWARDED_HOST] || @env[Merb::Const::HTTP_HOST] ||
+        @env[Merb::Const::SERVER_NAME]
     end
 
     # ==== Parameters
@@ -603,227 +604,5 @@ module Merb
       end
     end
 
-    class &lt;&lt; self
-
-      # ==== Parameters
-      # value&lt;Array, Hash, Dictionary ~to_s&gt;:: The value for the query string.
-      # prefix&lt;~to_s&gt;:: The prefix to add to the query string keys.
-      #
-      # ==== Returns
-      # String:: The query string.
-      #
-      # ==== Alternatives
-      # If the value is a string, the prefix will be used as the key.
-      #
-      # ==== Examples
-      #   params_to_query_string(10, &quot;page&quot;)
-      #     # =&gt; &quot;page=10&quot;
-      #   params_to_query_string({ :page =&gt; 10, :word =&gt; &quot;ruby&quot; })
-      #     # =&gt; &quot;page=10&amp;word=ruby&quot;
-      #   params_to_query_string({ :page =&gt; 10, :word =&gt; &quot;ruby&quot; }, &quot;search&quot;)
-      #     # =&gt; &quot;search[page]=10&amp;search[word]=ruby&quot;
-      #   params_to_query_string([ &quot;ice-cream&quot;, &quot;cake&quot; ], &quot;shopping_list&quot;)
-      #     # =&gt; &quot;shopping_list[]=ice-cream&amp;shopping_list[]=cake&quot;
-      #
-      # @api private
-      def params_to_query_string(value, prefix = nil)
-        case value
-        when Array
-          value.map { |v|
-            params_to_query_string(v, &quot;#{prefix}[]&quot;)
-          } * &quot;&amp;&quot;
-        when Hash, Dictionary
-          value.map { |k, v|
-            params_to_query_string(v, prefix ? &quot;#{prefix}[#{Merb::Request.escape(k)}]&quot; : Merb::Request.escape(k))
-          } * &quot;&amp;&quot;
-        else
-          &quot;#{prefix}=#{Merb::Request.escape(value)}&quot;
-        end
-      end
-
-      # ==== Parameters
-      # s&lt;String&gt;:: String to URL escape.
-      #
-      # ==== returns
-      # String:: The escaped string.
-      #
-      # @api private
-      def escape(s)
-        s.to_s.gsub(/([^ a-zA-Z0-9_.-]+)/n) {
-          '%'+$1.unpack('H2'*$1.size).join('%').upcase
-        }.tr(' ', '+')
-      end
-
-      # ==== Parameter
-      # s&lt;String&gt;:: String to URL unescape.
-      #
-      # ==== returns
-      # String:: The unescaped string.
-      #
-      # @api private
-      def unescape(s)
-        s.tr('+', ' ').gsub(/((?:%[0-9a-fA-F]{2})+)/n){
-          [$1.delete('%')].pack('H*')
-        }
-      end
-
-      # ==== Parameters
-      # query_string&lt;String&gt;:: The query string.
-      # delimiter&lt;String&gt;:: The query string divider. Defaults to &quot;&amp;&quot;.
-      # preserve_order&lt;Boolean&gt;:: Preserve order of args. Defaults to false.
-      #
-      # ==== Returns
-      # Mash:: The parsed query string (Dictionary if preserve_order is set).
-      #
-      # ==== Examples
-      #   query_parse(&quot;bar=nik&amp;post[body]=heya&quot;)
-      #     # =&gt; { :bar =&gt; &quot;nik&quot;, :post =&gt; { :body =&gt; &quot;heya&quot; } }
-      #
-      # @api private
-      def query_parse(query_string, delimiter = '&amp;;', preserve_order = false)
-        query = preserve_order ? Dictionary.new : {}
-        for pair in (query_string || '').split(/[#{delimiter}] */n)
-          key, value = unescape(pair).split('=',2)
-          next if key.nil?
-          if key.include?('[')
-            normalize_params(query, key, value)
-          else
-            query[key] = value
-          end
-        end
-        preserve_order ? query : query.to_mash
-      end
-
-      NAME_REGEX = /Content-Disposition:.* name=&quot;?([^\&quot;;]*)&quot;?/ni.freeze
-      CONTENT_TYPE_REGEX = /Content-Type: (.*)\r\n/ni.freeze
-      FILENAME_REGEX = /Content-Disposition:.* filename=&quot;?([^\&quot;;]*)&quot;?/ni.freeze
-      CRLF = &quot;\r\n&quot;.freeze
-      EOL = CRLF
-
-      # ==== Parameters
-      # request&lt;IO&gt;:: The raw request.
-      # boundary&lt;String&gt;:: The boundary string.
-      # content_length&lt;Fixnum&gt;:: The length of the content.
-      #
-      # ==== Raises
-      # ControllerExceptions::MultiPartParseError:: Failed to parse request.
-      #
-      # ==== Returns
-      # Hash:: The parsed request.
-      #
-      # @api private
-      def parse_multipart(request, boundary, content_length)
-        boundary = &quot;--#{boundary}&quot;
-        paramhsh = {}
-        buf = &quot;&quot;
-        input = request
-        input.binmode if defined? input.binmode
-        boundary_size = boundary.size + EOL.size
-        bufsize = 16384
-        content_length -= boundary_size
-        status = input.read(boundary_size)
-        return {} if status == nil || status.empty?
-        raise ControllerExceptions::MultiPartParseError, &quot;bad content body:\n'#{status}' should == '#{boundary + EOL}'&quot;  unless status == boundary + EOL
-        rx = /(?:#{EOL})?#{Regexp.quote(boundary,'n')}(#{EOL}|--)/
-        loop {
-          head = nil
-          body = ''
-          filename = content_type = name = nil
-          read_size = 0
-          until head &amp;&amp; buf =~ rx
-            i = buf.index(&quot;\r\n\r\n&quot;)
-            if( i == nil &amp;&amp; read_size == 0 &amp;&amp; content_length == 0 )
-              content_length = -1
-              break
-            end
-            if !head &amp;&amp; i
-              head = buf.slice!(0, i+2) # First \r\n
-              buf.slice!(0, 2)          # Second \r\n
-              filename = head[FILENAME_REGEX, 1]
-              content_type = head[CONTENT_TYPE_REGEX, 1]
-              name = head[NAME_REGEX, 1]
-
-              if filename &amp;&amp; !filename.empty?
-                body = Tempfile.new(:Merb)
-                body.binmode if defined? body.binmode
-              end
-              next
-            end
-
-            # Save the read body part.
-            if head &amp;&amp; (boundary_size+4 &lt; buf.size)
-              body &lt;&lt; buf.slice!(0, buf.size - (boundary_size+4))
-            end
-
-            read_size = bufsize &lt; content_length ? bufsize : content_length
-            if( read_size &gt; 0 )
-              c = input.read(read_size)
-              raise ControllerExceptions::MultiPartParseError, &quot;bad content body&quot;  if c.nil? || c.empty?
-              buf &lt;&lt; c
-              content_length -= c.size
-            end
-          end
-
-          # Save the rest.
-          if i = buf.index(rx)
-            body &lt;&lt; buf.slice!(0, i)
-            buf.slice!(0, boundary_size+2)
-
-            content_length = -1  if $1 == &quot;--&quot;
-          end
-
-          if filename &amp;&amp; !filename.empty?
-            body.rewind
-            data = {
-              :filename =&gt; File.basename(filename),
-              :content_type =&gt; content_type,
-              :tempfile =&gt; body,
-              :size =&gt; File.size(body.path)
-            }
-          else
-            data = body
-          end
-          paramhsh = normalize_params(paramhsh,name,data)
-          break  if buf.empty? || content_length == -1
-        }
-        paramhsh
-      end
-
-      # Converts a query string snippet to a hash and adds it to existing
-      # parameters.
-      #
-      # ==== Parameters
-      # parms&lt;Hash&gt;:: Parameters to add the normalized parameters to.
-      # name&lt;String&gt;:: The key of the parameter to normalize.
-      # val&lt;String&gt;:: The value of the parameter.
-      #
-      # ==== Returns
-      # Hash:: Normalized parameters
-      #
-      # @api private
-      def normalize_params(parms, name, val=nil)
-        name =~ %r([\[\]]*([^\[\]]+)\]*)
-        key = $1 || ''
-        after = $' || ''
-
-        if after == &quot;&quot;
-          parms[key] = val
-        elsif after == &quot;[]&quot;
-          (parms[key] ||= []) &lt;&lt; val
-        elsif after =~ %r(^\[\]\[([^\[\]]+)\]$)
-          child_key = $1
-          parms[key] ||= []
-          if parms[key].last.is_a?(Hash) &amp;&amp; !parms[key].last.key?(child_key)
-            parms[key].last.update(child_key =&gt; val)
-          else
-            parms[key] &lt;&lt; { child_key =&gt; val }
-          end
-        else
-          parms[key] ||= {}
-          parms[key] = normalize_params(parms[key], after, val)
-        end
-        parms
-      end
-    end
   end
 end</diff>
      <filename>merb-core/lib/merb-core/dispatch/request.rb</filename>
    </modified>
    <modified>
      <diff>@@ -223,7 +223,7 @@ module Merb
           
           ruby &lt;&lt; &quot;  query_params.delete_if { |key, value| value.nil? }\n&quot;
           ruby &lt;&lt; &quot;  unless query_params.empty?\n&quot;
-          ruby &lt;&lt; '    url &lt;&lt; &quot;?#{Merb::Request.params_to_query_string(query_params)}&quot;' &lt;&lt; &quot;\n&quot;
+          ruby &lt;&lt; '    url &lt;&lt; &quot;?#{Merb::Parse.params_to_query_string(query_params)}&quot;' &lt;&lt; &quot;\n&quot;
           ruby &lt;&lt; &quot;  end\n&quot;
           ruby &lt;&lt; '  url &lt;&lt; &quot;##{fragment}&quot; if fragment' &lt;&lt; &quot;\n&quot;
           ruby &lt;&lt; &quot;  url\n&quot;</diff>
      <filename>merb-core/lib/merb-core/dispatch/router/route.rb</filename>
    </modified>
    <modified>
      <diff>@@ -126,7 +126,7 @@ module Merb
     def to_cookie
       unless self.empty?
         data = self.serialize
-        value = Merb::Request.escape &quot;#{data}--#{generate_digest(data)}&quot;
+        value = Merb::Parse.escape &quot;#{data}--#{generate_digest(data)}&quot;
         if value.size &gt; MAX
           msg = &quot;Cookies have limit of 4K. Session contents: #{data.inspect}&quot;
           Merb.logger.error!(msg)
@@ -164,7 +164,7 @@ module Merb
       if cookie.blank?
         {}
       else
-        data, digest = Merb::Request.unescape(cookie).split('--')
+        data, digest = Merb::Parse.unescape(cookie).split('--')
         return {} if data.blank? || digest.blank?
         unless digest == generate_digest(data)
           clear</diff>
      <filename>merb-core/lib/merb-core/dispatch/session/cookie.rb</filename>
    </modified>
    <modified>
      <diff>@@ -21,7 +21,6 @@ module Merb
     autoload :Tracer,              'merb-core/rack/middleware/tracer'
     autoload :ContentLength,       'merb-core/rack/middleware/content_length'
     autoload :ConditionalGet,      'merb-core/rack/middleware/conditional_get'
-    autoload :Csrf,                'merb-core/rack/middleware/csrf'
     autoload :StreamWrapper,       'merb-core/rack/stream_wrapper'
     autoload :Helpers,             'merb-core/rack/helpers'
   end # Rack</diff>
      <filename>merb-core/lib/merb-core/rack.rb</filename>
    </modified>
    <modified>
      <diff>@@ -33,14 +33,14 @@ module Merb
         # ==== Returns
         # Boolean:: True if file exists under the server root and is readable.
         def file_exist?(path)
-          full_path = ::File.join(@static_server.root, ::Merb::Request.unescape(path))
+          full_path = ::File.join(@static_server.root, ::Merb::Parse.unescape(path))
           ::File.file?(full_path) &amp;&amp; ::File.readable?(full_path)
         end
 
         # ==== Parameters
         # env&lt;Hash&gt;:: Environment variables to pass on to the server.
         def serve_static(env)
-          env[Merb::Const::PATH_INFO] = ::Merb::Request.unescape(env[Merb::Const::PATH_INFO])
+          env[Merb::Const::PATH_INFO] = ::Merb::Parse.unescape(env[Merb::Const::PATH_INFO])
           @static_server.call(env)
         end
       </diff>
      <filename>merb-core/lib/merb-core/rack/middleware/static.rb</filename>
    </modified>
    <modified>
      <diff>@@ -292,7 +292,7 @@ module GemManagement
       end
     end
   end
-
+  
   private
 
   def executable_wrapper(spec, bin_file_name, minigems = true)
@@ -316,6 +316,7 @@ end
 if File.directory?(gems_dir = File.join(Dir.pwd, 'gems')) ||
    File.directory?(gems_dir = File.join(File.dirname(__FILE__), '..', 'gems'))
   $BUNDLE = true; Gem.clear_paths; Gem.path.unshift(gems_dir)
+  ENV[&quot;PATH&quot;] = &quot;\#{File.dirname(__FILE__)}:\#{gems_dir}/bin:\#{ENV[&quot;PATH&quot;]}&quot;
   if (local_gem = Dir[File.join(gems_dir, &quot;specifications&quot;, &quot;#{spec.name}-*.gemspec&quot;)].last)
     version = File.basename(local_gem)[/-([\\.\\d]+)\\.gemspec$/, 1]
   end</diff>
      <filename>merb-core/lib/merb-core/tasks/gem_management.rb</filename>
    </modified>
    <modified>
      <diff>@@ -2,9 +2,10 @@
 # testing helpers
 module Merb::Test::Helpers; end
 
+require &quot;merb-core/test/helpers/cookie_jar&quot;
 require &quot;merb-core/test/helpers/mock_request_helper&quot;
+require &quot;merb-core/test/helpers/route_helper&quot;
 require &quot;merb-core/test/helpers/request_helper&quot;
 require &quot;merb-core/test/helpers/multipart_request_helper&quot;
 require &quot;merb-core/test/helpers/controller_helper&quot;
-require &quot;merb-core/test/helpers/route_helper&quot;
 require &quot;merb-core/test/helpers/view_helper&quot;
\ No newline at end of file</diff>
      <filename>merb-core/lib/merb-core/test/helpers.rb</filename>
    </modified>
    <modified>
      <diff>@@ -52,7 +52,7 @@ module Merb
             if value.blank?
               self.delete(key)
             else
-              self[key] = Merb::Request.unescape(value)
+              self[key] = Merb::Parse.unescape(value)
             end
           end
         end
@@ -210,7 +210,7 @@ module Merb
       # @api public    
       # @deprecated  
       def build_request(params = {}, env = {})
-        params             = Merb::Request.params_to_query_string(params)
+        params             = Merb::Parse.params_to_query_string(params)
 
         query_string = env[:query_string] || env['QUERY_STRING']
         env[:query_string] = query_string ? &quot;#{query_string}&amp;#{params}&quot; : params</diff>
      <filename>merb-core/lib/merb-core/test/helpers/mock_request_helper.rb</filename>
    </modified>
    <modified>
      <diff>@@ -2,54 +2,48 @@ require &quot;rack&quot;
 
 module Merb
   module Test
-    module RequestHelper
-
-      def describe_request(rack)
-        &quot;a #{rack.original_env[:method] || rack.original_env[&quot;REQUEST_METHOD&quot;] || &quot;GET&quot;} to '#{rack.url}'&quot;
-      end
-
-      def describe_input(input)
-        if input.respond_to?(:controller_name)
-          &quot;#{input.controller_name}##{input.action_name}&quot;
-        elsif input.respond_to?(:original_env)
-          describe_request(input)
-        else
-          input
-        end
-      end
-      
-      def status_code(input)
-        input.respond_to?(:status) ? input.status : input
-      end
+    module MakeRequest
 
       def request(uri, env = {})
-        uri = url(uri) if uri.is_a?(Symbol)    
+        uri = url(uri) if uri.is_a?(Symbol)
+        uri = URI(uri)
+        uri.scheme ||= &quot;http&quot;
+        uri.host   ||= &quot;example.org&quot;
 
         if (env[:method] == &quot;POST&quot; || env[&quot;REQUEST_METHOD&quot;] == &quot;POST&quot;)
           params = env.delete(:body_params) if env.key?(:body_params)
           params = env.delete(:params) if env.key?(:params) &amp;&amp; !env.key?(:input)
-          
+
           unless env.key?(:input)
-            env[:input] = Merb::Request.params_to_query_string(params)
+            env[:input] = Merb::Parse.params_to_query_string(params)
             env[&quot;CONTENT_TYPE&quot;] = &quot;application/x-www-form-urlencoded&quot;
           end
         end
 
         if env[:params]
-          uri &lt;&lt; &quot;?#{Merb::Request.params_to_query_string(env.delete(:params))}&quot;
+          uri.query = [
+            uri.query, Merb::Parse.params_to_query_string(env.delete(:params))
+          ].compact.join(&quot;&amp;&quot;)
         end
+        
+        ignore_cookies = env.has_key?(:jar) &amp;&amp; env[:jar].nil?
 
-        if @__cookie__
-          env[&quot;HTTP_COOKIE&quot;] = @__cookie__
+        unless ignore_cookies
+          # Setup a default cookie jar container
+          @__cookie_jar__ ||= Merb::Test::CookieJar.new
+          # Grab the cookie group name
+          jar = env.delete(:jar) || :default
+          # Set the cookie header with the cookies
+          env[&quot;HTTP_COOKIE&quot;] = @__cookie_jar__.for(jar, uri)
         end
-
+        
         app = Merb::Rack::Application.new
-        rack = app.call(::Rack::MockRequest.env_for(uri, env))
+        rack = app.call(::Rack::MockRequest.env_for(uri.to_s, env))
 
         rack = Struct.new(:status, :headers, :body, :url, :original_env).
-          new(rack[0], rack[1], rack[2], uri, env)
-
-        @__cookie__ = rack.headers[&quot;Set-Cookie&quot;] &amp;&amp; rack.headers[&quot;Set-Cookie&quot;].join
+          new(rack[0], rack[1], rack[2], uri.to_s, env)
+          
+        @__cookie_jar__.update(jar, uri, rack.headers[&quot;Set-Cookie&quot;]) unless ignore_cookies
 
         Merb::Dispatcher.work_queue.size.times do
           Merb::Dispatcher.work_queue.pop.call
@@ -57,9 +51,31 @@ module Merb
 
         rack
       end
-      alias requesting request
-      alias response_for request
+    end
+    
+    module RequestHelper
+      include MakeRequest
+
+      def describe_request(rack)
+        &quot;a #{rack.original_env[:method] || rack.original_env[&quot;REQUEST_METHOD&quot;] || &quot;GET&quot;} to '#{rack.url}'&quot;
+      end
+
+      def describe_input(input)
+        if input.respond_to?(:controller_name)
+          &quot;#{input.controller_name}##{input.action_name}&quot;
+        elsif input.respond_to?(:original_env)
+          describe_request(input)
+        else
+          input
+        end
+      end
+      
+      def status_code(input)
+        input.respond_to?(:status) ? input.status : input
+      end
       
+      def requesting(*args)   request(*args) end
+      def response_for(*args) request(*args) end
     end
   end
 end
\ No newline at end of file</diff>
      <filename>merb-core/lib/merb-core/test/helpers/request_helper.rb</filename>
    </modified>
    <modified>
      <diff>@@ -36,6 +36,26 @@ Spec::Matchers.create(:be_missing, :be_client_error) do
   end
 end
 
+Spec::Matchers.create(:have_body) do
+  matches do |rack, body|
+    @actual = if rack.respond_to?(:body)
+      rack.body.to_s
+    else
+      rack.to_s
+    end
+    
+    @actual == body
+  end
+  
+  negative_failure_message do |rack, body|
+    &quot;Expected the response not to match:\n    #{body}\nActual response was:\n    #{@actual}&quot; 
+  end
+  
+  failure_message do |rack, body|
+    &quot;Expected the response to match:\n    #{body}\nActual response was:\n    #{@actual}&quot; 
+  end
+end
+
 Spec::Matchers.create(:have_content_type) do
   matches do |rack, mime_symbol|
     content_type = rack.headers[&quot;Content-Type&quot;].split(&quot;; &quot;).first</diff>
      <filename>merb-core/lib/merb-core/test/matchers/request_matchers.rb</filename>
    </modified>
    <modified>
      <diff>@@ -56,7 +56,7 @@ module Merb::Test::Rspec::RouteMatchers
     # ==== Returns
     # String:: The failure message.
     def failure_message
-      &quot;expected the request to route to #{@expected_controller.camel_case}##{@expected_action}#{expected_parameters_message}, but was #{@target_controller.camel_case}##{@target_action}#{actual_parameters_message}&quot;
+      &quot;expected the request to route to #{@expected_controller.to_const_string}##{@expected_action}#{expected_parameters_message}, but was #{@target_controller.to_const_string}##{@target_action}#{actual_parameters_message}&quot;
     end
 
     # ==== Returns</diff>
      <filename>merb-core/lib/merb-core/test/matchers/route_matchers.rb</filename>
    </modified>
    <modified>
      <diff>@@ -16,12 +16,12 @@ describe Merb::Controller, &quot; redirects&quot; do
   it &quot;redirects with messages&quot; do
     @controller = dispatch_to(Merb::Test::Fixtures::Controllers::RedirectWithMessage, :index)
     @controller.status.should == 302
-    expected_url = Merb::Request.escape([Marshal.dump(:notice =&gt; &quot;what?&quot;)].pack(&quot;m&quot;))
+    expected_url = Merb::Parse.escape([Marshal.dump(:notice =&gt; &quot;what?&quot;)].pack(&quot;m&quot;))
     @controller.headers[&quot;Location&quot;].should == &quot;/?_message=#{expected_url}&quot;
   end
   
   it &quot;consumes redirects with messages&quot; do
-    message = Merb::Request.escape([Marshal.dump(:notice =&gt; &quot;what?&quot;)].pack(&quot;m&quot;))
+    message = Merb::Parse.escape([Marshal.dump(:notice =&gt; &quot;what?&quot;)].pack(&quot;m&quot;))
     @controller = dispatch_to(Merb::Test::Fixtures::Controllers::ConsumesMessage, :index, {:_message =&gt; message})
     @controller.body.should == &quot;\&quot;what?\&quot;&quot;
   end
@@ -32,7 +32,7 @@ describe Merb::Controller, &quot; redirects&quot; do
   end
 
   it &quot;handles malformed message&quot; do
-    message = Merb::Request.escape([Marshal.dump(:notice =&gt; &quot;what?&quot;)].pack(&quot;m&quot;))
+    message = Merb::Parse.escape([Marshal.dump(:notice =&gt; &quot;what?&quot;)].pack(&quot;m&quot;))
     message = message.reverse
     lambda do
       @controller = dispatch_to(Merb::Test::Fixtures::Controllers::SetsMessage, :index, {:_message =&gt; message})</diff>
      <filename>merb-core/spec/public/controller/redirect_spec.rb</filename>
    </modified>
    <modified>
      <diff>@@ -3,71 +3,6 @@ startup_merb
 
 $:.push File.join(File.dirname(__FILE__), &quot;fixtures&quot;)
 
-describe Kernel, &quot;#dependency&quot; do
-  
-  before { reset_dependency('core_ext_dependency', :CoreExtDependency) }
-  
-  it &quot;works even when the BootLoader has already finished&quot; do
-    dependency &quot;core_ext_dependency&quot;
-    defined?(CoreExtDependency).should_not be_nil
-  end
-  
-  it &quot;takes :immediate =&gt; true to require a dependency immediately&quot; do
-    Merb::BootLoader::finished.delete(&quot;Merb::BootLoader::Dependencies&quot;)
-    dependency &quot;core_ext_dependency&quot;
-    defined?(CoreExtDependency).should be_nil
-    dependency &quot;core_ext_dependency&quot;, :immediate =&gt; true
-    defined?(CoreExtDependency).should_not be_nil
-    Merb::BootLoader::finished &lt;&lt; &quot;Merb::BootLoader::Dependencies&quot;
-  end
-  
-  it &quot;returns a Gem::Dependency&quot; do
-    dep = dependency &quot;core_ext_dependency&quot;, &quot;&gt;= 1.1.2&quot;
-    dep.name.should == &quot;core_ext_dependency&quot;
-    dep.version_requirements.to_s.should == &quot;&gt;= 1.1.2&quot;
-  end
-  
-  it &quot;adds a Gem::Dependency item to Merb::BootLoader::Dependencies.dependencies&quot; do
-    dep = dependency &quot;core_ext_dependency&quot;, &quot;&gt;= 1.1.2&quot;
-    dep.name.should == &quot;core_ext_dependency&quot;
-    dep.version_requirements.to_s.should == &quot;&gt;= 1.1.2&quot;
-    Merb::BootLoader::Dependencies.dependencies.should include(dep)
-  end
-  
-  it &quot;will replace any previously registered dependencies with the same name&quot; do
-    dep = dependency &quot;core_ext_dependency&quot;, &quot;&gt;= 1.1.0&quot;
-    dep.version_requirements.to_s.should == &quot;&gt;= 1.1.0&quot;
-    dep = dependency &quot;core_ext_dependency&quot;, &quot;&gt;= 1.1.2&quot;
-    dep.version_requirements.to_s.should == &quot;&gt;= 1.1.2&quot;
-    entries = Merb::BootLoader::Dependencies.dependencies.select { |d| d.name == dep.name }
-    entries.first.version_requirements.to_s.should == &quot;&gt;= 1.1.2&quot;
-    entries.length.should == 1
-  end
-  
-end
-
-describe Kernel, &quot;#load_dependency&quot; do
-  
-  before { reset_dependency('core_ext_dependency', :CoreExtDependency) }
-  
-  it &quot;requires a dependency immediately&quot; do
-    load_dependency &quot;core_ext_dependency&quot;
-    defined?(CoreExtDependency).should_not be_nil
-  end
-  
-  it &quot;returns a Gem::Dependency&quot; do
-    dep = load_dependency &quot;core_ext_dependency&quot;
-    dep.name.should == &quot;core_ext_dependency&quot;
-    [&quot;&quot;, &quot;&gt;= 0&quot;].include?(dep.version_requirements.to_s.should)
-  end
-  
-  it &quot;adds a Gem::Dependency item to Merb::BootLoader::Dependencies.dependencies&quot; do
-    dep = load_dependency &quot;core_ext_dependency&quot;
-    Merb::BootLoader::Dependencies.dependencies.should include(dep)
-  end
-  
-end
-
 describe Kernel, &quot;#use_orm&quot; do
   
   before do</diff>
      <filename>merb-core/spec/public/core_ext/kernel_spec.rb</filename>
    </modified>
    <modified>
      <diff>@@ -31,7 +31,7 @@ describe Merb::Rack::Application do
   it 'does not set Date header' do
     status, headers, body = @app.call(@env)
 
-    headers.should_not include(Merb::Const::DATE)
+    headers.keys.should_not include(Merb::Const::DATE)
   end
   
   describe &quot;#deferred?&quot; do</diff>
      <filename>merb-core/spec/public/rack/rack_middleware_spec.rb</filename>
    </modified>
    <modified>
      <diff>@@ -2,268 +2,111 @@ require File.expand_path(File.join(File.dirname(__FILE__), &quot;spec_helper&quot;))
 
 Merb.start :environment =&gt; 'test', :log_level =&gt; :fatal
 
-Dir[File.join(File.dirname(__FILE__), &quot;controllers/**/*.rb&quot;)].each do |f|
-  require f
-end
+require File.dirname(__FILE__) / &quot;controllers/request_controller&quot;
 
 describe Merb::Test::RequestHelper do
   
-  describe Merb::Test::RequestHelper::CookieJar do
+  before(:each) do
+    Merb::Controller._default_cookie_domain = &quot;example.org&quot;
     
-    it &quot;should update its values from a request object&quot; do
-      cookie_jar = Merb::Test::RequestHelper::CookieJar.new
-      cookie_jar.should be_empty
-      request = fake_request
-      request.cookies[:foo] = &quot;bar+baz&quot; # escaped by default
-      cookie_jar.update_from_request request
-      cookie_jar[:foo].should == 'bar baz'
+    Merb::Router.prepare do
+      with(:controller =&gt; &quot;merb/test/request_controller&quot;) do
+        match(&quot;/set/short/long/read&quot;).to(:action =&gt; &quot;get&quot;)
+        match(&quot;/:action(/:junk)&quot;, :junk =&gt; &quot;.*&quot;).register
+      end
     end
-    
-  end  
+  end
   
-  describe &quot;#dispatch_to&quot; do
-
-    before(:all) do
-      @controller_klass = Merb::Test::DispatchController
-    end
-
-    it &quot;should dispatch to the given controller and action&quot; do
-      Merb::Test::ControllerAssertionMock.should_receive(:called).with(:index)
-
-      dispatch_to(@controller_klass, :index)
-    end
-
-    it &quot;should dispatch to the given controller and action with params&quot; do
-      Merb::Test::ControllerAssertionMock.should_receive(:called).with(:show)
-
-      controller = dispatch_to(@controller_klass, :show, :name =&gt; &quot;Fred&quot;)
-      controller.params[:name].should == &quot;Fred&quot;
-    end
-
-    it &quot;should dispatch to the given controller and action with the query string merged into the params&quot; do
-      Merb::Test::ControllerAssertionMock.should_receive(:called).with(:show)
-      controller = dispatch_to(@controller_klass, :show, {:name =&gt; &quot;Fred&quot;}, {'QUERY_STRING' =&gt; &quot;last_name=Jones&amp;age=42&quot;} )
-      
-      controller.params[:name].should == &quot;Fred&quot;
-      controller.params[:last_name].should == &quot;Jones&quot;
-      controller.params[:age].should == &quot;42&quot;   
-    end
-
-    it &quot;should not hit the router to match its route&quot; do
-      Merb::Router.should_not_receive(:match)
-      dispatch_to(@controller_klass, :index)
-    end
-    
-    it &quot;merges :controller into params&quot; do
-      controller = dispatch_to(@controller_klass, :show, :name =&gt; &quot;Fred&quot;)
-      
-      controller.params[:controller].should == @controller_klass.name.to_const_path
-    end
-    
-    it &quot;merges :action into params&quot; do
-      controller = dispatch_to(@controller_klass, :show, :name =&gt; &quot;Fred&quot;)
-      
-      controller.params[:action].should == &quot;show&quot;
-    end
-
-    it &quot;should support setting request.raw_post&quot; do
-      controller = dispatch_to(@controller_klass, :show, {}, {:post_body =&gt; 'some XML'})
-      controller.request.raw_post.should == 'some XML'
-    end
+  it &quot;should dispatch a request using GET by defalt&quot; do
+    request(&quot;/method&quot;).should have_body(&quot;Method - GET&quot;)
   end
   
-  describe &quot;#dispatch_with_basic_authentication_to&quot; do
-
-    before(:all) do
-      @controller_klass = Merb::Test::DispatchController
-    end
-
-    it &quot;should dispatch to the given controller and action&quot; do
-      Merb::Test::ControllerAssertionMock.should_receive(:called).with(:index)
-
-      dispatch_with_basic_authentication_to(@controller_klass, :index, &quot;Fred&quot;, &quot;secret&quot;)
-    end
-
-    it &quot;should dispatch to the given controller and action with authentication token&quot; do
-      Merb::Test::ControllerAssertionMock.should_receive(:called).with(:show)
-
-      controller = dispatch_with_basic_authentication_to(@controller_klass, :show, &quot;Fred&quot;, &quot;secret&quot;)
-
-      controller.request.env[&quot;X_HTTP_AUTHORIZATION&quot;].should == &quot;Basic #{Base64.encode64(&quot;Fred:secret&quot;)}&quot;
-    end
-    
-    it &quot;should dispatch to the given controller and action with authentication token and params&quot; do
-      Merb::Test::ControllerAssertionMock.should_receive(:called).with(:show)
-
-      controller = dispatch_with_basic_authentication_to(@controller_klass, :show, &quot;Fred&quot;, &quot;secret&quot;, :name =&gt; &quot;Fred&quot;)
-
-      controller.request.env[&quot;X_HTTP_AUTHORIZATION&quot;].should == &quot;Basic #{Base64.encode64(&quot;Fred:secret&quot;)}&quot;
-      controller.params[:name].should == &quot;Fred&quot;
-    end
-
-    it &quot;should not hit the router to match its route&quot; do
-      Merb::Router.should_not_receive(:match)
-      dispatch_with_basic_authentication_to(@controller_klass, :index, &quot;Fred&quot;, &quot;secret&quot;)
-    end
+  it &quot;should persist cookies across sequential cookie setting requests&quot; do
+    request(&quot;/counter&quot;).should have_body(&quot;1&quot;)
+    request(&quot;/counter&quot;).should have_body(&quot;2&quot;)
   end
-
-  describe &quot;#get&quot; do
-    before(:each) do 
-      Merb::Router.prepare do |r| 
-        r.resources :spec_helper_controller
-        r.match(&quot;/:controller/:action/:custom&quot;).to(:controller =&gt; &quot;:controller&quot;) 
-      end
-    end
-
-    it &quot;should perform the index action when used with a get&quot; do
-      Merb::Test::ControllerAssertionMock.should_receive(:called).with(:index)
-      get(&quot;/spec_helper_controller&quot;)  
-    end
-
-    it &quot;should perform the index action and have params available&quot; do
-      Merb::Test::ControllerAssertionMock.should_receive(:called).with(:index)
-      controller = get(&quot;/spec_helper_controller&quot;, :name =&gt; &quot;Harry&quot;)
-      controller.params[:name].should == &quot;Harry&quot;    
-    end
-    
-    it &quot;should perform the index action and have params available from the query string&quot; do
-      Merb::Test::ControllerAssertionMock.should_receive(:called).with(:index)
-      controller = get(&quot;/spec_helper_controller?last_name=Oswald&amp;age=25&quot;, :name =&gt; &quot;Harry&quot;)
-      controller.params[:name].should == &quot;Harry&quot;
-      controller.params[:last_name].should == &quot;Oswald&quot;
-      controller.params[:age].should == &quot;25&quot;
-    end
-
-    it &quot;should evaluate in the context of the controller in the block&quot; do
-      get(&quot;/spec_helper_controller&quot;) do |controller|
-        controller.class.should == SpecHelperController
-      end    
-    end
-
-    it &quot;should allow for custom router params&quot; do
-      controller = get(&quot;/spec_helper_controller/index/my_custom_stuff&quot;)
-      controller.params[:custom].should == &quot;my_custom_stuff&quot;    
-    end   
-
-    it &quot;should get the show action&quot; do
-      Merb::Test::ControllerAssertionMock.should_receive(:called).with(:show)
-      controller = get(&quot;/spec_helper_controller/my_id&quot;)
-      controller.params[:id].should == &quot;my_id&quot;    
-    end
+  
+  it &quot;should persist cookies across requests that don't return any cookie headers&quot; do
+    request(&quot;/counter&quot;).should have_body(&quot;1&quot;)
+    request(&quot;/void&quot;).should    have_body(&quot;Void&quot;)
+    request('/counter').should have_body(&quot;2&quot;)
   end
-
-  describe &quot;#post&quot; do
-    before(:each) do
-      Merb::Router.prepare do |r|
-        r.resources :spec_helper_controller
-      end
-    end
-
-    it &quot;should post to the create action&quot; do
-      Merb::Test::ControllerAssertionMock.should_receive(:called).with(:create)
-      post(&quot;/spec_helper_controller&quot;)
-    end
-
-    it &quot;should post to the create action with params&quot; do
-      Merb::Test::ControllerAssertionMock.should_receive(:called).with(:create)
-      controller = post(&quot;/spec_helper_controller&quot;, :name =&gt; &quot;Harry&quot;)
-      controller.params[:name].should == &quot;Harry&quot;
-    end
+  
+  it &quot;should delete cookies from the jar&quot; do
+    request(&quot;/counter&quot;).should have_body(&quot;1&quot;)
+    request(&quot;/delete&quot;).should  have_body(&quot;Delete&quot;)
+    request(&quot;/counter&quot;).should have_body(&quot;1&quot;)
   end
-
-  describe &quot;#put&quot; do
-    before(:each) do
-      Merb::Router.prepare do |r|
-        r.resources :spec_helper_controller
-      end
-    end
-    it &quot;should put to the update action&quot; do
-      Merb::Test::ControllerAssertionMock.should_receive(:called).with(:update)
-      put(&quot;/spec_helper_controller/1&quot;)
-    end
-
-    it &quot;should put to the update action with params&quot; do
-      Merb::Test::ControllerAssertionMock.should_receive(:called).with(:update)
-      controller = put(&quot;/spec_helper_controller/my_id&quot;, :name =&gt; &quot;Harry&quot;)
-      controller.params[:name].should == &quot;Harry&quot;
-      controller.params[:id].should   == &quot;my_id&quot;
-    end
+  
+  it &quot;should be able to disable the cookie jar&quot; do
+    request(&quot;/counter&quot;, :jar =&gt; nil).should have_body(&quot;1&quot;)
+    request(&quot;/counter&quot;, :jar =&gt; nil).should have_body(&quot;1&quot;)
+    request(&quot;/counter&quot;).should have_body(&quot;1&quot;)
+    request(&quot;/counter&quot;).should have_body(&quot;2&quot;)
   end
-
-  describe &quot;#delete&quot; do
-    before(:each) do
-      Merb::Router.prepare do |r|
-        r.resources :spec_helper_controller
-      end
-    end
-    it &quot;should put to the update action&quot; do
-      Merb::Test::ControllerAssertionMock.should_receive(:called).with(:destroy)
-      delete(&quot;/spec_helper_controller/1&quot;)
-    end
-
-    it &quot;should put to the update action with params&quot; do
-      Merb::Test::ControllerAssertionMock.should_receive(:called).with(:destroy)
-      controller = delete(&quot;/spec_helper_controller/my_id&quot;, :name =&gt; &quot;Harry&quot;)
-      controller.params[:name].should == &quot;Harry&quot;
-      controller.params[:id].should   == &quot;my_id&quot;
-    end
+  
+  it &quot;should be able to specify separate jars&quot; do
+    request(&quot;/counter&quot;, :jar =&gt; :one).should have_body(&quot;1&quot;)
+    request(&quot;/counter&quot;, :jar =&gt; :two).should have_body(&quot;1&quot;)
+    request(&quot;/counter&quot;, :jar =&gt; :one).should have_body(&quot;2&quot;)
+    request(&quot;/counter&quot;, :jar =&gt; :two).should have_body(&quot;2&quot;)
   end
   
-  describe &quot;#request&quot; do
-    before(:each) do 
-      Merb::Router.prepare do |r| 
-        r.namespace :namespaced do |namespaced|
-          namespaced.resources :spec_helper_controller
-        end
-      end
-    end
-    
-    it &quot;should support setting request.raw_post&quot; do
-      controller = mock_request(&quot;/namespaced/spec_helper_controller&quot;, {}, {:post_body =&gt; 'some XML'})
-      controller.request.raw_post.should == 'some XML'
-    end
-
-    it &quot;should get namespaced index action&quot; do
-      Merb::Test::ControllerAssertionMock.should_receive(:called).with(:index)
-      controller = mock_request(&quot;/namespaced/spec_helper_controller&quot;)
-      controller.class.should == Namespaced::SpecHelperController
-    end
-
-    it &quot;should make the post body available in the request on deferred routing&quot; do
-      Merb::Router.prepare do |r|
-        r.match('/xmlrpc').defer_to do |request, params|
-          request.raw_post.should == 'XMLRPC request body'
-          {:controller =&gt; 'spec_helper_controller', :action =&gt; :index}
-        end
-      end
-
-      mock_request('/xmlrpc', {}, {:post_body =&gt; 'XMLRPC request body'})
-    end
+  it &quot;should respect cookie domains when no domain is explicitly set&quot; do
+    request(&quot;http://example.org/counter&quot;).should     have_body(&quot;1&quot;)
+    request(&quot;http://www.example.org/counter&quot;).should have_body(&quot;2&quot;)
+    request(&quot;http://example.org/counter&quot;).should     have_body(&quot;3&quot;)
+    request(&quot;http://www.example.org/counter&quot;).should have_body(&quot;4&quot;)
   end
   
-end
-
-module Merb::Test::RequestHelper
-  describe FakeRequest, &quot;.new(env = {}, req = StringIO.new)&quot; do
-    it &quot;should create request with default enviroment, minus rack.input&quot; do
-      @mock = FakeRequest.new
-      @mock.env.except('rack.input').should == FakeRequest::DEFAULT_ENV
-    end
-
-    it &quot;should override default env values passed in HTTP format&quot; do
-      @mock = FakeRequest.new('HTTP_ACCEPT' =&gt; 'nothing')
-      @mock.env['HTTP_ACCEPT'].should == 'nothing'
-    end
-
-    it &quot;should override default env values passed in symbol format&quot; do
-      @mock = FakeRequest.new(:http_accept =&gt; 'nothing')
-      @mock.env['HTTP_ACCEPT'].should == 'nothing'
-    end
-
-    it &quot;should set rack input to an empty StringIO&quot; do
-      @mock = FakeRequest.new
-      @mock.env['rack.input'].should be_kind_of(StringIO)
-      @mock.env['rack.input'].read.should == ''
-    end
+  it &quot;should respect the domain set in the cookie&quot; do
+    request(&quot;http://example.org/domain&quot;).should     have_body(&quot;1&quot;)
+    request(&quot;http://foo.example.org/domain&quot;).should have_body(&quot;1&quot;)
+    request(&quot;http://example.org/domain&quot;).should     have_body(&quot;1&quot;)
+    request(&quot;http://foo.example.org/domain&quot;).should have_body(&quot;2&quot;)
+  end
+  
+  it &quot;should respect the path set in the cookie&quot; do
+    request(&quot;/path&quot;).should      have_body(&quot;1&quot;)
+    request(&quot;/path/zomg&quot;).should have_body(&quot;1&quot;)
+    request(&quot;/path&quot;).should      have_body(&quot;1&quot;)
+    request(&quot;/path/zomg&quot;).should have_body(&quot;2&quot;)
   end
+  
+  it &quot;should use the most specific path cookie&quot; do
+    request(&quot;/set/short&quot;)
+    request(&quot;/set/short/long&quot;)
+    request(&quot;/set/short/long/read&quot;).should have_body(&quot;/set/short/long&quot;)
+  end
+  
+  it &quot;should use the most specific path cookie even if it was defined first&quot; do
+    request(&quot;/set/short/long&quot;)
+    request(&quot;/set/short&quot;)
+    request(&quot;/set/short/long/read&quot;).should have_body(&quot;/set/short/long&quot;)
+  end
+  
+  it &quot;should leave the least specific cookie intact when specifying a more specific path&quot; do
+    request(&quot;/set/short&quot;)
+    request(&quot;/set/short/long/zomg/what/hi&quot;)
+    request(&quot;/set/short/long/read&quot;).should have_body(&quot;/set/short&quot;)
+  end
+  
+  it &quot;should use the most specific domain cookie&quot; do
+    request(&quot;http://test.com/domain_set&quot;)
+    request(&quot;http://one.test.com/domain_set&quot;)
+    request(&quot;http://one.test.com/domain_get&quot;).should have_body(&quot;one.test.com&quot;)
+  end
+  
+  it &quot;should keep the less specific domain cookie&quot; do
+    request(&quot;http://test.com/domain_set&quot;).should be_successful
+    request(&quot;http://one.test.com/domain_set&quot;).should be_successful
+    request(&quot;http://test.com/domain_get&quot;).should have_body(&quot;test.com&quot;)
+  end
+  
+  it &quot;should respect the expiration&quot; do
+    request(&quot;/expires&quot;).should have_body(&quot;1&quot;)
+    sleep(1)
+    request(&quot;/expires&quot;).should have_body(&quot;1&quot;)
+  end
+  
 end
\ No newline at end of file</diff>
      <filename>merb-core/spec/public/test/request_helper_spec.rb</filename>
    </modified>
    <modified>
      <diff>@@ -14,4 +14,4 @@ RewriteCond %{REQUEST_FILENAME} !-f
 RewriteRule ^(.*)$ merb.fcgi [QSA,L]
 
 
-ErrorDocument 500 &quot;&lt;h2&gt;Application Error&lt;/h2&gt;Merb could not be reached
+ErrorDocument 500 &quot;&lt;h2&gt;Application Error&lt;/h2&gt;Merb could not be reached&quot;</diff>
      <filename>merb-gen/lib/generators/templates/application/common/dothtaccess</filename>
    </modified>
    <modified>
      <diff>@@ -5,7 +5,7 @@ require 'fileutils'
 require 'yaml'
 
 # Important - don't change this line or its position
-MERB_THOR_VERSION = '0.0.53'
+MERB_THOR_VERSION = '0.1.0'
 
 ##############################################################################
 
@@ -301,7 +301,7 @@ module GemManagement
       end
     end
   end
-
+  
   private
 
   def executable_wrapper(spec, bin_file_name, minigems = true)
@@ -325,6 +325,7 @@ end
 if File.directory?(gems_dir = File.join(Dir.pwd, 'gems')) ||
    File.directory?(gems_dir = File.join(File.dirname(__FILE__), '..', 'gems'))
   $BUNDLE = true; Gem.clear_paths; Gem.path.unshift(gems_dir)
+  ENV[&quot;PATH&quot;] = &quot;\#{File.dirname(__FILE__)}:\#{gems_dir}/bin:\#{ENV[&quot;PATH&quot;]}&quot;
   if (local_gem = Dir[File.join(gems_dir, &quot;specifications&quot;, &quot;#{spec.name}-*.gemspec&quot;)].last)
     version = File.basename(local_gem)[/-([\\.\\d]+)\\.gemspec$/, 1]
   end
@@ -476,8 +477,9 @@ module MerbThorHelper
   end
   
   def install_dependency(dependency, opts = {})
-    opts[:version] ||= dependency.version_requirements.to_s
-    Merb::Gem.install(dependency.name, default_install_options.merge(opts))
+    version = dependency.version_requirements.to_s
+    install_opts = default_install_options.merge(:version =&gt; version)
+    Merb::Gem.install(dependency.name, install_opts.merge(opts))
   end
 
   def install_dependency_from_source(dependency, opts = {})
@@ -760,8 +762,10 @@ module Merb
         if only_missing = comp == 'missing'
           message &quot;Preparing to install missing gems #{where} using #{strategy} strategy...&quot;
           comp = nil
+          clobber = false
         else
           message &quot;Preparing to install #{where} using #{strategy} strategy...&quot;
+          clobber = true
         end
         
         # If comp given, filter on known stack components
@@ -777,7 +781,7 @@ module Merb
           warning &quot;No dependencies to install...&quot;
         else
           puts &quot;#{deps.length} dependencies to install...&quot;
-          install_dependencies(strategy, deps)
+          install_dependencies(strategy, deps, clobber)
         end
         
         # Show current dependency info now that we're done
@@ -873,10 +877,21 @@ module Merb
     # merb:dependencies:configure --config-file file.yml        # write to the specified config file 
     
     desc 'configure [comp]', 'Create a dependencies config file'
-    method_options &quot;--dry-run&quot; =&gt; :boolean, &quot;--force&quot; =&gt; :boolean
+    method_options &quot;--dry-run&quot; =&gt; :boolean, &quot;--force&quot; =&gt; :boolean, &quot;--versions&quot; =&gt; :boolean
     def configure(comp = nil)
       # If comp given, filter on known stack components
       deps = comp ? Merb::Stack.select_component_dependencies(dependencies, comp) : dependencies
+      
+      # If --versions is set, update the version_requirements with the actual version available
+      if options[:versions]
+        specs = local_gemspecs
+        deps.each do |dep|
+          if spec = specs.find { |s| s.name == dep.name }
+            dep.version_requirements = ::Gem::Requirement.create(spec.version)
+          end
+        end
+      end
+      
       config = YAML.dump(deps.map { |d| d.to_s })
       puts &quot;#{config}\n&quot;
       if File.exists?(config_file) &amp;&amp; !options[:force]
@@ -902,31 +917,33 @@ module Merb
       end
     end
     
-    def install_dependencies(strategy, deps)
+    def install_dependencies(strategy, deps, clobber = true)
       if method = strategy?(strategy)
         # Clobber existing local dependencies
-        clobber_dependencies!
+        clobber_dependencies! if clobber
         
         # Run the chosen strategy - collect files installed from stable gems
         installed_from_stable = send(method, deps).map { |d| d.name }
 
-        # Sleep a bit otherwise the following steps won't see the new files
-        sleep(deps.length) if deps.length &gt; 0
-      
-        # Leave a file to denote the strategy that has been used for this dependency
-        self.local.each do |spec|
-          next unless File.directory?(spec.full_gem_path)
-          unless installed_from_stable.include?(spec.name)
-            FileUtils.touch(File.join(spec.full_gem_path, &quot;#{strategy}.strategy&quot;))
-          else
-            FileUtils.touch(File.join(spec.full_gem_path, &quot;stable.strategy&quot;))
-          end           
-        end
+        unless dry_run?
+          # Sleep a bit otherwise the following steps won't see the new files
+          sleep(deps.length) if deps.length &gt; 0 &amp;&amp; deps.length &lt;= 10
+          
+          # Leave a file to denote the strategy that has been used for this dependency
+          self.local.each do |spec|
+            next unless File.directory?(spec.full_gem_path)
+            unless installed_from_stable.include?(spec.name)
+              FileUtils.touch(File.join(spec.full_gem_path, &quot;#{strategy}.strategy&quot;))
+            else
+              FileUtils.touch(File.join(spec.full_gem_path, &quot;stable.strategy&quot;))
+            end           
+          end
         
-        # Add local binaries for the installed framework dependencies
-        comps = Merb::Stack.all_components &amp; deps.map { |d| d.name }
-        comps &lt;&lt; { :no_minigems =&gt; 'merb-gen' }
-        ensure_bin_wrapper_for(*comps)          
+          # Add local binaries for the installed framework dependencies
+          comps = Merb::Stack.all_components &amp; deps.map { |d| d.name }
+          comps &lt;&lt; { :no_minigems =&gt; 'merb-gen' }
+          ensure_bin_wrapper_for(*comps)
+        end
         return true
       end
       false
@@ -967,7 +984,7 @@ module Merb
           end
         end
       end
-            
+      
       deps
     end
     
@@ -1037,15 +1054,12 @@ module Merb
       # Selectively update repositories for the matching dependencies
       update_dependency_repositories(deps) unless dry_run?
       
-      # Skip gem dependencies to prevent them from being installed from stable;
-      # however, core dependencies will be retrieved from source when available
-      install_opts = { :ignore_dependencies =&gt; true }
       if core = deps.find { |d| d.name == 'merb-core' }
         if dry_run?
           note &quot;Installing #{core.name}...&quot;
         else
-          if install_dependency_from_source(core, install_opts)
-          elsif install_dependency(core, install_opts)
+          if install_dependency_from_source(core)
+          elsif install_dependency(core)
             info &quot;Installed #{core.name} from rubygems...&quot;
             installed_from_rubygems &lt;&lt; core
           end
@@ -1057,8 +1071,8 @@ module Merb
         if dry_run?
           note &quot;Installing #{dependency.name}...&quot;
         else
-          if install_dependency_from_source(dependency, install_opts)
-          elsif install_dependency(dependency, install_opts)
+          if install_dependency_from_source(dependency)
+          elsif install_dependency(dependency)
             info &quot;Installed #{dependency.name} from rubygems...&quot;
             installed_from_rubygems &lt;&lt; dependency
           end
@@ -1079,24 +1093,31 @@ module Merb
     end
     
     # Extract application dependencies by querying the app directly.
-    def self.extract_dependencies(merb_root, env = 'production')
+    def self.extract_dependencies(merb_root)
       require 'merb-core'
       if !@_merb_loaded || Merb.root != merb_root
         Merb.start_environment(
+          :log_level =&gt; :fatal,
           :testing =&gt; true, 
           :adapter =&gt; 'runner', 
-          :environment =&gt; env, 
+          :environment =&gt; ENV['MERB_ENV'] || 'development', 
           :merb_root =&gt; merb_root
         )
         @_merb_loaded = true
       end
       Merb::BootLoader::Dependencies.dependencies
-    rescue =&gt; e
+    rescue StandardError =&gt; e     
       error &quot;Couldn't extract dependencies from application!&quot;
       error e.message
       puts  &quot;Make sure you're executing the task from your app (--merb-root), or&quot;
       puts  &quot;specify a config option (--config or --config-file=YAML_FILE)&quot;
       return []
+    rescue SystemExit      
+      error &quot;Couldn't extract dependencies from application!&quot;
+      error &quot;application failed to run&quot;
+      puts  &quot;Please check if your application runs using 'merb'; for example,&quot;
+      puts  &quot;look for any gem version mismatches in dependencies.rb&quot;
+      return []
     end
         
     # Parse the basic YAML config data, and process Gem::Dependency output.
@@ -1124,6 +1145,7 @@ module Merb
     
     DM_STACK = %w[
       extlib
+      data_objects
       dm-core
       dm-aggregates
       dm-migrations
@@ -1143,6 +1165,9 @@ module Merb
       merb-mailer
       merb-slices
       merb-auth
+      merb-auth-core
+      merb-auth-more 
+      merb-auth-slice-password
       merb-param-protection
       merb-exceptions
     ] + DM_STACK
@@ -1221,6 +1246,15 @@ module Merb
       dm-rest-adapter
     ]
     
+    DATA_OBJECTS = %w[
+      data_objects 
+      do_derby do_hsqldb 
+      do_jdbc
+      do_mysql
+      do_postgres
+      do_sqlite3
+    ]
+    
     attr_accessor :system, :local, :missing
     
     include MerbThorHelper
@@ -1391,6 +1425,7 @@ module Merb
         comps[&quot;merb-more&quot;]    = MERB_MORE.sort
         comps[&quot;merb-plugins&quot;] = MERB_PLUGINS.sort
         comps[&quot;dm-more&quot;]      = DM_MORE.sort
+        comps[&quot;do&quot;]           = DATA_OBJECTS.sort
         
         comps
       end     
@@ -1416,7 +1451,7 @@ module Merb
     end
     
     def self.framework_components
-      %w[merb-core merb-more merb-plugins].inject([]) do |all, comp| 
+      %w[merb-core merb-more].inject([]) do |all, comp| 
         all + components(comp)
       end
     end
@@ -1438,7 +1473,7 @@ module Merb
     end
     
     def self.base_components
-      %w[thor rake]
+      %w[thor rake extlib]
     end
     
     def self.all_components
@@ -1450,6 +1485,7 @@ module Merb
     def self.core_dependencies(gem_dir = nil, ignore_deps = false)
       @_core_dependencies ||= begin
         if gem_dir # add local gems to index
+          orig_gem_path = ::Gem.path
           ::Gem.clear_paths; ::Gem.path.unshift(gem_dir)
         end
         deps = []
@@ -1464,7 +1500,7 @@ module Merb
             deps += gemspec.dependencies
           end
         end
-        ::Gem.clear_paths if gem_dir # reset
+        ::Gem.path.replace(orig_gem_path) if gem_dir # reset
         deps
       end
     end
@@ -1821,6 +1857,8 @@ module Merb
           message &quot;Installing #{current_gem} from source...&quot;
           if install_dependency_from_source(dependency)
             ensure_bin_wrapper_for(dependency.name) if options[:binaries]
+          else
+            raise &quot;gem source not found&quot;
           end
         end
       end</diff>
      <filename>merb-gen/lib/generators/templates/application/common/merb.thor</filename>
    </modified>
    <modified>
      <diff>@@ -1,4 +1,3 @@
-
 # use PathPrefix Middleware if :path_prefix is set in Merb::Config
 if prefix = ::Merb::Config[:path_prefix]
   use Merb::Rack::PathPrefix, prefix</diff>
      <filename>merb-gen/lib/generators/templates/application/merb_core/config/rack.rb</filename>
    </modified>
    <modified>
      <diff>@@ -1,4 +1,3 @@
-
 # use PathPrefix Middleware if :path_prefix is set in Merb::Config
 if prefix = ::Merb::Config[:path_prefix]
   use Merb::Rack::PathPrefix, prefix</diff>
      <filename>merb-gen/lib/generators/templates/application/merb_stack/config/rack.rb</filename>
    </modified>
    <modified>
      <diff>@@ -52,9 +52,9 @@ describe &quot;resource(:&lt;%= plural_model %&gt;)&quot; do
     
     it &quot;redirects to resource(:&lt;%= plural_model %&gt;)&quot; do
       &lt;%- if orm.to_sym == :datamapper -%&gt;
-      @response.should redirect_to(resource(&lt;%= singular_model.capitalize %&gt;.first), :message =&gt; {:notice =&gt; &quot;&lt;%= singular_model %&gt; was successfully created&quot;})
+      @response.should redirect_to(resource(&lt;%= model_class_name %&gt;.first), :message =&gt; {:notice =&gt; &quot;&lt;%= singular_model %&gt; was successfully created&quot;})
       &lt;%- elsif orm.to_sym == :activerecord -%&gt;
-      @response.should redirect_to(resource(&lt;%= singular_model.capitalize %&gt;.first), :message =&gt; {:notice =&gt; &quot;&lt;%= singular_model %&gt; was successfully created&quot;})
+      @response.should redirect_to(resource(&lt;%= model_class_name %&gt;.first), :message =&gt; {:notice =&gt; &quot;&lt;%= singular_model %&gt; was successfully created&quot;})
       &lt;% end -%&gt;
     end
     </diff>
      <filename>merb-gen/lib/generators/templates/component/resource_controller/spec/requests/%file_name%_spec.rb</filename>
    </modified>
    <modified>
      <diff>@@ -36,7 +36,8 @@ describe Merb::Generators::FullSliceGenerator do
         &quot;testing/stubs/app/controllers&quot;, &quot;testing/stubs/app/controllers/application.rb&quot;, 
         &quot;testing/stubs/app/controllers/main.rb&quot;, &quot;testing/TODO&quot;
       ]
-      files.should == expected
+      diff = expected - files
+      diff.should be_empty
     end
     
     it &quot;should render templates successfully&quot; do</diff>
      <filename>merb-slices/spec/full_slice_generator_spec.rb</filename>
    </modified>
    <modified>
      <diff>@@ -3,6 +3,6 @@ $:.push File.join(File.dirname(__FILE__), '..', 'lib')
 
 require 'rubygems'
 
-gem 'dm-core', '=0.9.6'
+gem 'dm-core', '&gt;=0.9.6'
 require 'dm-core'
 require 'merb-core'</diff>
      <filename>merb_datamapper/spec/spec_helper.rb</filename>
    </modified>
  </modified>
  <removed type="array">
    <removed>
      <filename>merb-core/lib/merb-core/rack/middleware/csrf.rb</filename>
    </removed>
    <removed>
      <filename>merb-core/spec/public/rack/csrf_middleware_spec.rb</filename>
    </removed>
  </removed>
  <parents type="array">
    <parent>
      <id>063c2574a7ffa41473f802effa92b1a41089593f</id>
    </parent>
    <parent>
      <id>a319ad0c8480bc10225909d7f97898dfd3989e4f</id>
    </parent>
  </parents>
  <author>
    <name>Yehuda Katz</name>
    <email>wycats@gmail.com</email>
  </author>
  <url>http://github.com/wycats/merb/commit/3e5171265f2cf3e4495fe5824b63e8a3cae79e3c</url>
  <id>3e5171265f2cf3e4495fe5824b63e8a3cae79e3c</id>
  <committed-date>2008-10-29T14:31:13-07:00</committed-date>
  <authored-date>2008-10-29T14:31:13-07:00</authored-date>
  <message>Merge branch 'active' of git@github.com:wycats/merb into active</message>
  <tree>082b3455504721d7894ed07ada9f0e18ac09007f</tree>
  <committer>
    <name>Yehuda Katz</name>
    <email>wycats@gmail.com</email>
  </committer>
</commit>
