diff --git a/lib/geocoder.rb b/lib/geocoder.rb
index 76f5ec20cc01a26f4ce05ca73516ce786a6ac815..196cf75dede7e6339705c5d017ca84e1c8b282db 100644
--- a/lib/geocoder.rb
+++ b/lib/geocoder.rb
@@ -53,6 +53,13 @@ module Geocoder
     street_lookups + ip_lookups
   end
 
+  ##
+  # Array of valid Lookup names, excluding :test.
+  #
+  def valid_lookups_except_test
+    valid_lookups - [:test]
+  end
+
   ##
   # All street address lookups, default first.
   #
@@ -77,7 +84,7 @@ module Geocoder
   #
   def lookup(query)
     if ip_address?(query)
-      get_lookup(ip_lookups.first)
+      get_lookup(Configuration.ip_lookup || ip_lookups.first)
     else
       get_lookup(Configuration.lookup || street_lookups.first)
     end
diff --git a/lib/geocoder/cli.rb b/lib/geocoder/cli.rb
index 8822bf627a664ae6cb48ebddaf63f40a91329544..9a7fa13b0d6aad7fb546f09782df6da38f2f81e3 100644
--- a/lib/geocoder/cli.rb
+++ b/lib/geocoder/cli.rb
@@ -32,9 +32,10 @@ module Geocoder
           Geocoder::Configuration.http_proxy = proxy
         end
 
-        opts.on("-s <service>", Geocoder.street_lookups, "--service <service>",
-          "Geocoding service: #{Geocoder.street_lookups * ', '}") do |service|
+        opts.on("-s <service>", Geocoder.valid_lookups_except_test, "--service <service>",
+          "Geocoding service: #{Geocoder.valid_lookups_except_test * ', '}") do |service|
           Geocoder::Configuration.lookup = service.to_sym
+          Geocoder::Configuration.ip_lookup = service.to_sym
         end
 
         opts.on("-t <seconds>", "--timeout <seconds>",
diff --git a/lib/geocoder/configuration.rb b/lib/geocoder/configuration.rb
index 7bbe787daa8125d6597d5249962ed64ed6ea4688..c2df6d3eb2817afc7d29eaa7febde5df061e3403 100644
--- a/lib/geocoder/configuration.rb
+++ b/lib/geocoder/configuration.rb
@@ -40,6 +40,7 @@ module Geocoder
     OPTIONS = [
       :timeout,
       :lookup,
+      :ip_lookup,
       :language,
       :http_headers,
       :use_https,
@@ -61,7 +62,8 @@ module Geocoder
 
     def set_defaults
       @timeout      = 3           # geocoding service timeout (secs)
-      @lookup       = :google     # name of geocoding service (symbol)
+      @lookup       = :google     # name of street address geocoding service (symbol)
+      @ip_lookup    = :freegeoip  # name of IP address geocoding service (symbol)
       @language     = :en         # ISO-639 language code
       @http_headers = {}          # HTTP headers for lookup
       @use_https    = false       # use HTTPS for lookup requests? (if supported)
diff --git a/test/test_helper.rb b/test/test_helper.rb
index 8ac6b3e0a6a939e7635eca5e6f63479a532c4a4c..a9cf367fe3a1ab9e02faea9617da9d9f2808bf85 100644
--- a/test/test_helper.rb
+++ b/test/test_helper.rb
@@ -282,11 +282,11 @@ class Test::Unit::TestCase
   end
 
   def all_lookups_except_test
-    Geocoder.valid_lookups - [:test]
+    Geocoder.valid_lookups_except_test
   end
 
   def street_lookups
-    all_lookups - [:freegeoip]
+    Geocoder.street_lookups
   end
 
   def is_nan_coordinates?(coordinates)