diff --git a/lib/geocoder.rb b/lib/geocoder.rb
index 2030b787e880812dcc5bb8e414cd6322449f0540..b9e9c70458714fd6bc36573a2fc5aac1e89f2f46 100644
--- a/lib/geocoder.rb
+++ b/lib/geocoder.rb
@@ -1,6 +1,7 @@
 require "geocoder/configuration"
 require "geocoder/calculations"
 require "geocoder/railtie"
+require "geocoder/request"
 
 module Geocoder
   extend self
diff --git a/lib/geocoder/request.rb b/lib/geocoder/request.rb
new file mode 100644
index 0000000000000000000000000000000000000000..e2b1a9c8db28c09083bc41cdbaadd870ef98aae9
--- /dev/null
+++ b/lib/geocoder/request.rb
@@ -0,0 +1,20 @@
+require 'geocoder'
+require 'geocoder/results/freegeoip'
+
+module Geocoder
+  module Request
+
+    def 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
+        Geocoder::Result::Freegeoip.new("ip" => ip)
+      else
+        Geocoder.search(ip).first
+      end
+    end
+  end
+end
+
+if defined?(Rack) and defined?(Rack::Request)
+  Rack::Request.send :include, Geocoder::Request
+end