diff --git a/CHANGELOG.rdoc b/CHANGELOG.rdoc
index d911531a633cb396b246e9dea91f5e3ed9fa8942..72259fef2215494c9caa5bc11916d46e222495ea 100644
--- a/CHANGELOG.rdoc
+++ b/CHANGELOG.rdoc
@@ -2,6 +2,18 @@
 
 Per-release changes to Geocoder.
 
+== 1.0.4 (2011 Sep 18)
+
+* Remove klass method from rake task, which could conflict with app methods (thanks github.com/mguterl).
+
+== 1.0.3 (2011 Sep 17)
+
+* Add support for Google Premier geocoding service (thanks github.com/steveh).
+* Update Google API URL (thanks github.com/soorajb).
+* Allow rescue from timeout with FreeGeoIP (thanks github.com/lukeledet).
+* Fix: rake assets:precompile (Rails 3.1) not working in some situations.
+* Fix: stop double-adjusting units when using kilometers (thanks github.com/hairyheron).
+
 == 1.0.2 (2011 June 25)
 
 * Add support for MongoMapper (thanks github.com/spagalloco).
diff --git a/README.rdoc b/README.rdoc
index 2d8efa79cad17675ea637f4c2350b33e4da850ae..ce88545d3d50536d78b17a9c10bfd5538fca2b74 100644
--- a/README.rdoc
+++ b/README.rdoc
@@ -268,6 +268,7 @@ Languages:: ar, eu, bg, bn, ca, cs, da, de, el, en, en-AU, en-GB, es, eu, fa, fi
 Documentation:: http://code.google.com/apis/maps/documentation/geocoding/#JSON
 Terms of Service:: http://code.google.com/apis/maps/terms.html#section_10_12
 Limitations:: "You must not use or display the Content without a corresponding Google map, unless you are explicitly permitted to do so in the Maps APIs Documentation, or through written permission from Google." "You must not pre-fetch, cache, or store any Content, except that you may store: (i) limited amounts of Content for the purpose of improving the performance of your Maps API Implementation..."
+Notes:: To use Google Premier set <tt>Geocoder::Configuration.lookup = :google_premier</tt> and <tt>Geocoder::Configuration.api_key = [key, client, channel]</tt>.
 
 ==== Yahoo (<tt>:yahoo</tt>)
 
diff --git a/Rakefile b/Rakefile
index cf5eca52b84e50722e191e983e7a681fea07c9b3..70cea9efde1bb2471a68c1abf5a73be8fc8b4188 100644
--- a/Rakefile
+++ b/Rakefile
@@ -4,13 +4,19 @@ Bundler::GemHelper.install_tasks
 require 'rake/testtask'
 Rake::TestTask.new(:test) do |test|
   test.libs << 'lib' << 'test'
-  test.pattern = 'test/**/*_test.rb'
+  test.pattern = 'test/*_test.rb'
   test.verbose = true
 end
 
-task :default => :test
+Rake::TestTask.new(:integration) do |test|
+  test.libs << 'lib' << 'test'
+  test.pattern = 'test/integration/*_test.rb'
+  test.verbose = true
+end
+
+task :default => [:test, :integration]
 
-require 'rake/rdoctask'
+require 'rdoc/task'
 Rake::RDocTask.new do |rdoc|
   rdoc.rdoc_dir = 'rdoc'
   rdoc.title = "Geocoder #{Geocoder::VERSION}"
diff --git a/lib/geocoder.rb b/lib/geocoder.rb
index 4e648617223cb923a8fc1dfe122262e449a13a22..5bce2283b9e2463c76edf7ba9e4e99e1bd830ff7 100644
--- a/lib/geocoder.rb
+++ b/lib/geocoder.rb
@@ -56,7 +56,7 @@ module Geocoder
   # All street address lookups, default first.
   #
   def street_lookups
-    [:google, :yahoo, :bing, :geocoder_ca, :yandex]
+    [:google, :google_premier, :yahoo, :bing, :geocoder_ca, :yandex]
   end
 
   ##
@@ -91,12 +91,8 @@ module Geocoder
   # Retrieve a Lookup object from the store.
   #
   def get_lookup(name)
-    unless defined?(@lookups)
-      @lookups = {}
-    end
-    unless @lookups.include?(name)
-      @lookups[name] = spawn_lookup(name)
-    end
+    @lookups = {} unless defined?(@lookups)
+    @lookups[name] = spawn_lookup(name) unless @lookups.include?(name)
     @lookups[name]
   end
 
@@ -108,9 +104,9 @@ module Geocoder
       name = name.to_s
       require "geocoder/lookups/#{name}"
       klass = name.split("_").map{ |i| i[0...1].upcase + i[1..-1] }.join
-      eval("Geocoder::Lookup::#{klass}.new")
+      Geocoder::Lookup.const_get(klass).new
     else
-      valids = valid_lookups.map{ |l| ":#{l}" }.join(", ")
+      valids = valid_lookups.map(&:inspect).join(", ")
       raise ConfigurationError, "Please specify a valid lookup for Geocoder " +
         "(#{name.inspect} is not one of: #{valids})."
     end
@@ -120,7 +116,7 @@ module Geocoder
   # Does the given value look like an IP address?
   #
   # Does not check for actual validity, just the appearance of four
-  # dot-delimited 8-bit numbers.
+  # dot-delimited numbers.
   #
   def ip_address?(value)
     !!value.to_s.match(/^(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})$/)
diff --git a/lib/geocoder/configuration.rb b/lib/geocoder/configuration.rb
index 3381fb183137bd2d39f7109623c694efa71f446d..44baabeebf4547d063ee0798ce643a2d1aebfa86 100644
--- a/lib/geocoder/configuration.rb
+++ b/lib/geocoder/configuration.rb
@@ -22,6 +22,7 @@ module Geocoder
         [:https_proxy, nil],
 
         # API key for geocoding service
+        # for Google Premier use a 3-element array: [key, client, channel]
         [:api_key, nil],
 
         # cache object (must respond to #[], #[]=, and #keys)
@@ -38,20 +39,20 @@ module Geocoder
     end
 
     # define getters and setters for all configuration settings
-    self.options_and_defaults.each do |o,d|
-      eval("def self.#{o}; @@#{o}; end")
-      eval("def self.#{o}=(obj); @@#{o} = obj; end")
-    end
+    self.options_and_defaults.each do |option, default|
+      class_eval(<<-END, __FILE__, __LINE__ + 1)
+
+        @@#{option} = default unless defined? @@#{option}
+
+        def self.#{option}
+          @@#{option}
+        end
 
-    ##
-    # Set all values to default.
-    #
-    def self.set_defaults
-      self.options_and_defaults.each do |o,d|
-        self.send("#{o}=", d)
-      end
+        def self.#{option}=(obj)
+          @@#{option} = obj
+        end
+
+      END
     end
   end
 end
-
-Geocoder::Configuration.set_defaults
diff --git a/lib/geocoder/lookups/base.rb b/lib/geocoder/lookups/base.rb
index 39490e81d92e684961801fd1d7fc32170b1f929b..e8905707bc1a31ca6043183f2b8ebb9734eafe59 100644
--- a/lib/geocoder/lookups/base.rb
+++ b/lib/geocoder/lookups/base.rb
@@ -87,7 +87,7 @@ module Geocoder
       # Class of the result objects
       #
       def result_class
-        eval("Geocoder::Result::#{self.class.to_s.split(":").last}")
+        Geocoder::Result.const_get(self.class.to_s.split(":").last)
       end
 
       ##
@@ -141,8 +141,11 @@ module Geocoder
       def fetch_raw_data(query, reverse = false)
         timeout(Geocoder::Configuration.timeout) do
           url = query_url(query, reverse)
+          uri = URI.parse(url)
           unless cache and response = cache[url]
-            response = http_client.get_response(URI.parse(url)).body
+            client = http_client.new(uri.host, uri.port)
+            client.use_ssl = true if Geocoder::Configuration.use_https
+            response = client.get(uri.request_uri).body
             if cache
               cache[url] = response
             end
diff --git a/lib/geocoder/lookups/bing.rb b/lib/geocoder/lookups/bing.rb
index cba04c30814e7991acbf021a9aa35db28fc6d15f..2bec5a4f1ec09a6443692b8a1fc356fe42dbbdfe 100644
--- a/lib/geocoder/lookups/bing.rb
+++ b/lib/geocoder/lookups/bing.rb
@@ -12,7 +12,7 @@ module Geocoder::Lookup
 
     def results(query, reverse = false)
       return [] unless doc = fetch_data(query, reverse)
-      
+
       if doc['statusDescription'] == "OK"
         return doc['resourceSets'].first['estimatedTotal'] > 0 ? doc['resourceSets'].first['resources'] : []
       else
diff --git a/lib/geocoder/lookups/freegeoip.rb b/lib/geocoder/lookups/freegeoip.rb
index d9112bf8f3cf2559a8f7074d1f95aa589a47dcf1..63599a487cf768bf7d56033dcd108da17752793f 100644
--- a/lib/geocoder/lookups/freegeoip.rb
+++ b/lib/geocoder/lookups/freegeoip.rb
@@ -11,7 +11,8 @@ module Geocoder::Lookup
       return [reserved_result(query)] if loopback_address?(query)
       begin
         return (doc = fetch_data(query, reverse)) ? [doc] : []
-      rescue StandardError # Freegeoip.net returns HTML on bad request
+      rescue StandardError => err # Freegeoip.net returns HTML on bad request
+        raise_error(err)
         return []
       end
     end
diff --git a/lib/geocoder/lookups/google.rb b/lib/geocoder/lookups/google.rb
index 4d61dd6c5090747e4c9e9ab5dd82b5dcc604157f..9d0395503b2904654dcb69667742d43c61b944b7 100644
--- a/lib/geocoder/lookups/google.rb
+++ b/lib/geocoder/lookups/google.rb
@@ -31,7 +31,7 @@ module Geocoder::Lookup
         :language => Geocoder::Configuration.language,
         :key => Geocoder::Configuration.api_key
       }
-      "#{protocol}://maps.google.com/maps/api/geocode/json?" + hash_to_query(params)
+      "#{protocol}://maps.googleapis.com/maps/api/geocode/json?" + hash_to_query(params)
     end
   end
 end
diff --git a/lib/geocoder/lookups/google_premier.rb b/lib/geocoder/lookups/google_premier.rb
new file mode 100644
index 0000000000000000000000000000000000000000..6befdddf585167868fcdbb58a042f0ea8175ea6d
--- /dev/null
+++ b/lib/geocoder/lookups/google_premier.rb
@@ -0,0 +1,38 @@
+require 'openssl'
+require 'base64'
+require 'geocoder/lookups/google'
+require 'geocoder/results/google_premier'
+
+module Geocoder::Lookup
+  class GooglePremier < Google
+
+    private # ---------------------------------------------------------------
+
+    def query_url(query, reverse = false)
+      params = {
+        (reverse ? :latlng : :address) => query,
+        :sensor => 'false',
+        :language => Geocoder::Configuration.language,
+        :client => Geocoder::Configuration.api_key[1],
+        :channel => Geocoder::Configuration.api_key[2]
+      }.reject{ |key, value| value.nil? }
+      path = "/maps/api/geocode/json?#{hash_to_query(params)}"
+      "#{protocol}://maps.googleapis.com#{path}&signature=#{sign(path)}"
+    end
+
+    def sign(string)
+      raw_private_key = url_safe_base64_decode(Geocoder::Configuration.api_key[0])
+      digest = OpenSSL::Digest::Digest.new('sha1')
+      raw_signature = OpenSSL::HMAC.digest(digest, raw_private_key, string)
+      url_safe_base64_encode(raw_signature)
+    end
+
+    def url_safe_base64_decode(base64_string)
+      Base64.decode64(base64_string.tr('-_', '+/'))
+    end
+
+    def url_safe_base64_encode(raw)
+      Base64.encode64(raw).tr('+/', '-_').strip
+    end
+  end
+end
diff --git a/lib/geocoder/models/base.rb b/lib/geocoder/models/base.rb
index 1e944264aced08e5633551a088ae8329cb6a7b38..836233162770542dc063784b4d448c8324792708 100644
--- a/lib/geocoder/models/base.rb
+++ b/lib/geocoder/models/base.rb
@@ -31,7 +31,7 @@ module Geocoder
         unless @geocoder_options
           @geocoder_options = {}
           require "geocoder/stores/#{geocoder_file_name}"
-          include eval("Geocoder::Store::" + geocoder_module_name)
+          include Geocoder::Store.const_get(geocoder_module_name)
         end
         @geocoder_options.merge! options
       end
diff --git a/lib/geocoder/models/mongo_base.rb b/lib/geocoder/models/mongo_base.rb
index 393e007fbd27793960224a222801838e674c1ab4..15bbbabe848b51c99247c2339dae34b764f45b1a 100644
--- a/lib/geocoder/models/mongo_base.rb
+++ b/lib/geocoder/models/mongo_base.rb
@@ -38,14 +38,14 @@ module Geocoder
         unless geocoder_initialized?
           @geocoder_options = {}
           require "geocoder/stores/#{geocoder_file_name}"
-          include eval("Geocoder::Store::" + geocoder_module_name)
+          include Geocoder::Store.const_get(geocoder_module_name)
         end
         @geocoder_options.merge! options
       end
 
       def geocoder_initialized?
         begin
-          included_modules.include? eval("Geocoder::Store::" + geocoder_module_name)
+          included_modules.include? Geocoder::Store.const_get(geocoder_module_name)
         rescue NameError
           false
         end
diff --git a/lib/geocoder/railtie.rb b/lib/geocoder/railtie.rb
index e39eb9d95755635d41da0f579475d0d9bad3c746..22ba8e83e6ba27eb51fe2dacfe3efbc16a41e6e8 100644
--- a/lib/geocoder/railtie.rb
+++ b/lib/geocoder/railtie.rb
@@ -18,7 +18,7 @@ module Geocoder
 
   class Railtie
     def self.insert
-      if defined?(::ActiveRecord)
+      if ENV['RAILS_GROUPS'].to_s != 'assets' and defined?(::ActiveRecord)
         ::ActiveRecord::Base.extend(Model::ActiveRecord)
       end
     end
diff --git a/lib/geocoder/results/freegeoip.rb b/lib/geocoder/results/freegeoip.rb
index 9aac491999d3e70b01b1e34c644766b6ceeda964..ee2cb6115449622058fa08aa86d435ba568b00b9 100644
--- a/lib/geocoder/results/freegeoip.rb
+++ b/lib/geocoder/results/freegeoip.rb
@@ -4,7 +4,8 @@ module Geocoder::Result
   class Freegeoip < Base
 
     def address(format = :full)
-      "#{city}#{', ' + state_code unless state_code == ''} #{postal_code}, #{country}".sub(/^[ ,]*/, "")
+      s = state_code.to_s == "" ? "" : ", #{state_code}"
+      "#{city}#{s} #{postal_code}, #{country}".sub(/^[ ,]*/, "")
     end
 
     def city
diff --git a/lib/geocoder/results/geocoder_ca.rb b/lib/geocoder/results/geocoder_ca.rb
index e0f4bdd8af89916f59207d23726d143b8592dd3c..4edb80a83e9911ba56d9752c570d142213275bfe 100644
--- a/lib/geocoder/results/geocoder_ca.rb
+++ b/lib/geocoder/results/geocoder_ca.rb
@@ -51,7 +51,7 @@ module Geocoder::Result
     end
 
 
-    private # ---------------------------------------------------------------- 
+    private # ----------------------------------------------------------------
 
     def canadian_province_abbreviations
       %w[ON QC NS NB MB BC PE SK AB NL]
diff --git a/lib/geocoder/results/google.rb b/lib/geocoder/results/google.rb
index cb45785fd45ee24e75fd0006d0bb3ec6831cdfe2..73e2289db58c0027b006f28d4520107e753e10b1 100644
--- a/lib/geocoder/results/google.rb
+++ b/lib/geocoder/results/google.rb
@@ -82,5 +82,9 @@ module Geocoder::Result
     def geometry
       @data['geometry']
     end
+
+    def precision
+      geometry['location_type'] if geometry
+    end
   end
 end
diff --git a/lib/geocoder/results/google_premier.rb b/lib/geocoder/results/google_premier.rb
new file mode 100644
index 0000000000000000000000000000000000000000..7237dc09047c55b81fab0bb033413e0d21a4e4ed
--- /dev/null
+++ b/lib/geocoder/results/google_premier.rb
@@ -0,0 +1,6 @@
+require 'geocoder/results/google'
+
+module Geocoder::Result
+  class GooglePremier < Google
+  end
+end
\ No newline at end of file
diff --git a/lib/geocoder/stores/active_record.rb b/lib/geocoder/stores/active_record.rb
index 1f80be4cf53d71db9a0edd4eb7e70a335d3f5bb2..bbcce73b62ceebd255420420c964411289120b2f 100644
--- a/lib/geocoder/stores/active_record.rb
+++ b/lib/geocoder/stores/active_record.rb
@@ -86,7 +86,6 @@ module Geocoder::Store
       # * +:exclude+ - an object to exclude (used by the +nearbys+ method)
       #
       def near_scope_options(latitude, longitude, radius = 20, options = {})
-        radius *= Geocoder::Calculations.km_in_mi if options[:units] == :km
         if connection.adapter_name.match /sqlite/i
           approx_near_scope_options(latitude, longitude, radius, options)
         else
diff --git a/lib/geocoder/version.rb b/lib/geocoder/version.rb
index e6372dd3ebb09eed9dccfb2158cdaabad5a103fa..f8b1aecb240934f1a5888ede69ef02492eaaa845 100644
--- a/lib/geocoder/version.rb
+++ b/lib/geocoder/version.rb
@@ -1,3 +1,3 @@
 module Geocoder
-  VERSION = "1.0.2"
+  VERSION = "1.0.4"
 end
diff --git a/lib/tasks/geocoder.rake b/lib/tasks/geocoder.rake
index b621b0592ce28542c75784f63cfd3d6d7d1acd3f..f235e1b51b2cb047021042a5d4719f3e4233ab40 100644
--- a/lib/tasks/geocoder.rake
+++ b/lib/tasks/geocoder.rake
@@ -1,13 +1,10 @@
-def klass
-  class_name = ENV['CLASS'] || ENV['class']
-  raise "Please specify a CLASS (model)" unless class_name
-  Object.const_get(class_name)
-end
-
 namespace :geocode do
-
   desc "Geocode all objects without coordinates."
   task :all => :environment do
+    class_name = ENV['CLASS'] || ENV['class']
+    raise "Please specify a CLASS (model)" unless class_name
+    klass = Object.const_get(class_name)
+
     klass.not_geocoded.each do |obj|
       obj.geocode; obj.save
     end
diff --git a/test/configuration_test.rb b/test/configuration_test.rb
index 61593c6b5730f832ef8f24384fd365021fe46f92..4c4e668186218874e10611f24cd2f899f667ab79 100644
--- a/test/configuration_test.rb
+++ b/test/configuration_test.rb
@@ -9,4 +9,5 @@ class ConfigurationTest < Test::Unit::TestCase
       Geocoder.search "something dumb"
     end
   end
+
 end
diff --git a/test/custom_block_test.rb b/test/custom_block_test.rb
index ab2ad9e005b80896370271a2553cac770c263d64..8fab62e819aa6ff05a1b706e185ab7aba92008fc 100644
--- a/test/custom_block_test.rb
+++ b/test/custom_block_test.rb
@@ -3,10 +3,6 @@ require 'test_helper'
 
 class CustomBlockTest < Test::Unit::TestCase
 
-  def setup
-    Geocoder::Configuration.set_defaults
-  end
-
   def test_geocode_with_block_runs_block
     e = Event.new(*venue_params(:msg))
     coords = [40.750354, -73.993371]
diff --git a/test/error_handling_test.rb b/test/error_handling_test.rb
index e60c7b394eb2752f9d0aec58d886652bd5ace483..42b3c3fd1fd98711d97f133c71b5aa79fcb52e23 100644
--- a/test/error_handling_test.rb
+++ b/test/error_handling_test.rb
@@ -3,10 +3,6 @@ require 'test_helper'
 
 class ErrorHandlingTest < Test::Unit::TestCase
 
-  def setup
-    Geocoder::Configuration.set_defaults
-  end
-
   def test_does_not_choke_on_timeout
     # keep test output clean: suppress timeout warning
     orig = $VERBOSE; $VERBOSE = nil
@@ -19,13 +15,23 @@ class ErrorHandlingTest < Test::Unit::TestCase
 
   def test_always_raise_timeout_error
     Geocoder::Configuration.always_raise = [TimeoutError]
-    assert_raise(TimeoutError) { Geocoder.search("timeout") }
+    all_lookups.each do |l|
+      lookup = Geocoder.send(:get_lookup, l)
+      assert_raises TimeoutError do
+        lookup.send(:results, "timeout")
+      end
+    end
     Geocoder::Configuration.always_raise = []
   end
 
   def test_always_raise_socket_error
     Geocoder::Configuration.always_raise = [SocketError]
-    assert_raise(SocketError) { Geocoder.search("socket_error") }
+    all_lookups.each do |l|
+      lookup = Geocoder.send(:get_lookup, l)
+      assert_raises SocketError do
+        lookup.send(:results, "socket_error")
+      end
+    end
     Geocoder::Configuration.always_raise = []
   end
 end
diff --git a/test/fixtures/freegeoip_no_results.json b/test/fixtures/freegeoip_no_results.json
new file mode 100644
index 0000000000000000000000000000000000000000..2ac0915dd0c91079a1b0d2eb3fd3c21194e0a77a
--- /dev/null
+++ b/test/fixtures/freegeoip_no_results.json
@@ -0,0 +1 @@
+<html><title>404: Not Found</title><body>404: Not Found</body></html>
diff --git a/test/geocoder_test.rb b/test/geocoder_test.rb
index 2a0b02461f9e71268e47cc03814a7417ac1c7ae0..fe1682004ef4c537d7d6882e320c3c4b40d680a5 100644
--- a/test/geocoder_test.rb
+++ b/test/geocoder_test.rb
@@ -3,10 +3,6 @@ require 'test_helper'
 
 class GeocoderTest < Test::Unit::TestCase
 
-  def setup
-    Geocoder::Configuration.set_defaults
-  end
-
   def test_distance_to_returns_float
     v = Venue.new(*venue_params(:msg))
     v.latitude, v.longitude = [40.750354, -73.993371]
diff --git a/test/https_test.rb b/test/https_test.rb
index acba01e68a5f6428581c7b2bc650b5a5d3807273..58219d33cc8f013746583b0d20a699e93b534ad8 100644
--- a/test/https_test.rb
+++ b/test/https_test.rb
@@ -3,10 +3,6 @@ require 'test_helper'
 
 class HttpsTest < Test::Unit::TestCase
 
-  def setup
-    Geocoder::Configuration.set_defaults
-  end
-
   def test_uses_https_for_secure_query
     Geocoder::Configuration.use_https = true
     g = Geocoder::Lookup::Google.new
diff --git a/test/integration/smoke_test.rb b/test/integration/smoke_test.rb
new file mode 100644
index 0000000000000000000000000000000000000000..8d80e1e14730cd9ad53072ef2ff9c07c5f4cf373
--- /dev/null
+++ b/test/integration/smoke_test.rb
@@ -0,0 +1,24 @@
+$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), *%w[ .. .. lib]))
+require 'pathname'
+require 'rubygems'
+require 'test/unit'
+require 'geocoder'
+
+class SmokeTest < Test::Unit::TestCase
+
+  def test_simple_zip_code_search
+    result = Geocoder.search "27701"
+    assert_equal "Durham", result.first.city
+    assert_equal "North Carolina", result.first.state
+  end
+
+  def test_simple_zip_code_search_with_ssl
+    Geocoder::Configuration.use_https = true
+    result = Geocoder.search "27701"
+    assert_equal "Durham", result.first.city
+    assert_equal "North Carolina", result.first.state
+  ensure
+    Geocoder::Configuration.use_https = false
+  end
+
+end
diff --git a/test/lookup_test.rb b/test/lookup_test.rb
index b6f4a4ac75c9de05dac5b61c59a70ddc7cddddba..3c72d05b84294fce0a7ce0394ee9645d649edf81 100644
--- a/test/lookup_test.rb
+++ b/test/lookup_test.rb
@@ -4,9 +4,9 @@ require 'test_helper'
 class LookupTest < Test::Unit::TestCase
 
   def test_search_returns_empty_array_when_no_results
-    street_lookups.each do |l|
-      Geocoder::Configuration.lookup = l
-      assert_equal [], Geocoder.search("no results"),
+    all_lookups.each do |l|
+      lookup = Geocoder.send(:get_lookup, l)
+      assert_equal [], lookup.send(:results, "no results"),
         "Lookup #{l} does not return empty array when no results."
     end
   end
diff --git a/test/method_aliases_test.rb b/test/method_aliases_test.rb
index f44c3478487de0617ad043485d4cb20918218bd9..993e96769bb3a1bbf307f6abe9e25208fb115673 100644
--- a/test/method_aliases_test.rb
+++ b/test/method_aliases_test.rb
@@ -3,10 +3,6 @@ require 'test_helper'
 
 class MethodAliasesTest < Test::Unit::TestCase
 
-  def setup
-    Geocoder::Configuration.set_defaults
-  end
-
   def test_distance_from_is_alias_for_distance_to
     v = Venue.new(*venue_params(:msg))
     v.latitude, v.longitude = [40.750354, -73.993371]
diff --git a/test/mongoid_test.rb b/test/mongoid_test.rb
index c4fb8ae07251f61f3c52480838b308c5ed9e3e36..44b4ca9a0798538974177cfb79332657d9908e3b 100644
--- a/test/mongoid_test.rb
+++ b/test/mongoid_test.rb
@@ -7,10 +7,6 @@ require 'mongoid_test_helper'
 
 class MongoidTest < Test::Unit::TestCase
 
-  def setup
-    Geocoder::Configuration.set_defaults
-  end
-
   def test_geocoded_check
     p = Place.new(*venue_params(:msg))
     p.location = [40.750354, -73.993371]
diff --git a/test/mongoid_test_helper.rb b/test/mongoid_test_helper.rb
index 5486a12436ce680d54f25271223e742f54ab17c7..69eb2fd044c593898780e3e73fb2f8463905e207 100644
--- a/test/mongoid_test_helper.rb
+++ b/test/mongoid_test_helper.rb
@@ -4,9 +4,9 @@ require 'test/unit'
 $LOAD_PATH.unshift(File.dirname(__FILE__))
 $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
 
-Mongoid.configure do |config| 
+Mongoid.configure do |config|
   config.logger = Logger.new($stderr, :debug)
-end 
+end
 
 ##
 # Geocoded model.
diff --git a/test/proxy_test.rb b/test/proxy_test.rb
index fe4236050ff6c986e3c3e0ea49fde232bc569880..d701fdce39d2663d5732379676d6960e2268c796 100644
--- a/test/proxy_test.rb
+++ b/test/proxy_test.rb
@@ -3,10 +3,6 @@ require 'test_helper'
 
 class ProxyTest < Test::Unit::TestCase
 
-  def setup
-    Geocoder::Configuration.set_defaults
-  end
-
   def test_uses_proxy_when_specified
     Geocoder::Configuration.http_proxy = 'localhost'
     lookup = Geocoder::Lookup::Google.new
diff --git a/test/services_test.rb b/test/services_test.rb
index 5eb7555c7dd313bc8021c335baa0008217decec3..b01b84abcbdb03c4c2f466f6b39859d687b26774 100644
--- a/test/services_test.rb
+++ b/test/services_test.rb
@@ -1,11 +1,7 @@
 # encoding: utf-8
 require 'test_helper'
 
-class ServicesTest < Test::Unit::TestCase 
-
-  def setup
-    Geocoder::Configuration.set_defaults
-  end
+class ServicesTest < Test::Unit::TestCase
 
 
   # --- Google ---
@@ -26,6 +22,28 @@ class ServicesTest < Test::Unit::TestCase
     assert_equal nil, result.city
   end
 
+  def test_google_precision
+    result = Geocoder.search("Madison Square Garden, New York, NY").first
+    assert_equal "ROOFTOP",
+      result.precision
+  end
+
+
+  # --- Google Premier ---
+
+  def test_google_premier_result_components
+    Geocoder::Configuration.lookup = :google_premier
+    result = Geocoder.search("Madison Square Garden, New York, NY").first
+    assert_equal "Manhattan",
+      result.address_components_of_type(:sublocality).first['long_name']
+  end
+
+  def test_google_premier_query_url
+    Geocoder::Configuration.api_key = ["deadbeef", "gme-test", "test-dev"]
+    assert_equal "http://maps.googleapis.com/maps/api/geocode/json?address=Madison+Square+Garden%2C+New+York%2C+NY&channel=test-dev&client=gme-test&language=en&sensor=false&signature=doJvJqX7YJzgV9rJ0DnVkTGZqTg=",
+      Geocoder::Lookup::GooglePremier.new.send(:query_url, "Madison Square Garden, New York, NY", false)
+  end
+
 
   # --- Yahoo ---
 
diff --git a/test/test_helper.rb b/test/test_helper.rb
index f491504aaed96ec1748d11ce86f3640fa1a395cf..137f756fdbad489f0880c08e64f452d0bf2ef7cb 100644
--- a/test/test_helper.rb
+++ b/test/test_helper.rb
@@ -73,6 +73,9 @@ module Geocoder
       end
     end
 
+    class GooglePremier < Google
+    end
+
     class Yahoo < Base
       private #-----------------------------------------------------------------
       def fetch_raw_data(query, reverse = false)
@@ -122,7 +125,11 @@ module Geocoder
       def fetch_raw_data(query, reverse = false)
         raise TimeoutError if query == "timeout"
         raise SocketError if query == "socket_error"
-        read_fixture "freegeoip_74_200_247_59.json"
+        file = case query
+          when "no results";  :no_results
+          else                "74_200_247_59"
+        end
+        read_fixture "freegeoip_#{file}.json"
       end
     end
 
@@ -224,6 +231,12 @@ end
 
 
 class Test::Unit::TestCase
+
+  def teardown
+    Geocoder.send(:remove_const, :Configuration)
+    load "geocoder/configuration.rb"
+  end
+
   def venue_params(abbrev)
     {
       :msg => ["Madison Square Garden", "4 Penn Plaza, New York, NY"]