diff --git a/lib/geocoder/lookups/base.rb b/lib/geocoder/lookups/base.rb
index 8b2ddd11dd7ec1c0679862829bb0e54d7573d5b5..3d8c66febd4c514153b74ad9faf780ea8abfa98a 100644
--- a/lib/geocoder/lookups/base.rb
+++ b/lib/geocoder/lookups/base.rb
@@ -88,6 +88,13 @@ module Geocoder
         end
       end
 
+      ##
+      # Is the given string a loopback IP address?
+      #
+      def loopback_address?(ip)
+        !!(ip == "0.0.0.0" or ip.match(/^127/))
+      end
+
       ##
       # Simulate ActiveSupport's Object#to_query.
       #
diff --git a/lib/geocoder/lookups/freegeoip.rb b/lib/geocoder/lookups/freegeoip.rb
index 791bac4c2d5b79091915541d55b01538c01c90e0..dcc5e44f5565ef97cb2d73228a78ab3c55a7af7f 100644
--- a/lib/geocoder/lookups/freegeoip.rb
+++ b/lib/geocoder/lookups/freegeoip.rb
@@ -7,6 +7,8 @@ module Geocoder::Lookup
     private # ---------------------------------------------------------------
 
     def result(query, reverse = false)
+      # don't look up a loopback address, just return the stored result
+      return reserved_result(query) if loopback_address?(query)
       begin
         if doc = fetch_data(query, reverse)
           doc
@@ -16,6 +18,21 @@ module Geocoder::Lookup
       end
     end
 
+    def reserved_result(ip)
+      {
+        "ip"           => ip,
+        "city"         => "",
+        "region_code"  => "",
+        "region_name"  => "",
+        "metrocode"    => "",
+        "zipcode"      => "",
+        "latitude"     => "0",
+        "longitude"    => "0",
+        "country_name" => "Reserved",
+        "country_code" => "RD"
+      }
+    end
+
     def query_url(query, reverse = false)
       "http://freegeoip.net/json/#{query}"
     end
diff --git a/lib/geocoder/request.rb b/lib/geocoder/request.rb
index 909e9b3599a5aba544455d797f1a5c6b6f746b7e..dafb8db05c97ccf7dfe8285a298f1b9a82e7241d 100644
--- a/lib/geocoder/request.rb
+++ b/lib/geocoder/request.rb
@@ -6,12 +6,7 @@ module Geocoder
 
     def location
       unless defined?(@location)
-        if ip.nil? or ip == "0.0.0.0" or ip.match /^127/ # don't look up loopback
-          # but return a Geocoder::Result for consistency
-          @location = Geocoder::Result::Freegeoip.new("ip" => ip)
-        else
-          @location = Geocoder.search(ip)
-        end
+        @location = Geocoder.search(ip)
       end
       @location
     end