diff --git a/lib/geocoder/models/active_record.rb b/lib/geocoder/models/active_record.rb
index 29bbe5f406d5534ffc674599c28d4c86340f10ce..62c81422ea4ecf03f8f7d5fe9bc145aef1aff29f 100644
--- a/lib/geocoder/models/active_record.rb
+++ b/lib/geocoder/models/active_record.rb
@@ -16,7 +16,8 @@ module Geocoder
           :longitude     => options[:longitude] || :longitude,
           :geocode_block => block,
           :units         => options[:units],
-          :method        => options[:method]
+          :method        => options[:method],
+          :lookup        => options[:lookup]
         )
       end
 
@@ -30,8 +31,9 @@ module Geocoder
           :latitude        => latitude_attr,
           :longitude       => longitude_attr,
           :reverse_block   => block,
-          :units         => options[:units],
-          :method        => options[:method]
+          :units           => options[:units],
+          :method          => options[:method],
+          :lookup          => options[:lookup]
         )
       end
 
diff --git a/lib/geocoder/models/mongo_base.rb b/lib/geocoder/models/mongo_base.rb
index fe7a0e1f5fe968b1178aaed8b655b2087816cc42..1a4dd886a9df0703594f920cbf8ffec977527dc7 100644
--- a/lib/geocoder/models/mongo_base.rb
+++ b/lib/geocoder/models/mongo_base.rb
@@ -19,7 +19,8 @@ module Geocoder
           :geocode_block => block,
           :units         => options[:units],
           :method        => options[:method],
-          :skip_index    => options[:skip_index] || false
+          :skip_index    => options[:skip_index] || false,
+          :lookup        => options[:lookup]
         )
       end
 
@@ -34,7 +35,8 @@ module Geocoder
           :reverse_block   => block,
           :units           => options[:units],
           :method          => options[:method],
-          :skip_index      => options[:skip_index] || false
+          :skip_index      => options[:skip_index] || false,
+          :lookup          => options[:lookup]
         )
       end
 
diff --git a/lib/geocoder/query.rb b/lib/geocoder/query.rb
index d909ffcaaa8fc1e5f39d5417b4507644886583a5..d201c94fbe69c50ac12fe10dcb7e27248aa7efce 100644
--- a/lib/geocoder/query.rb
+++ b/lib/geocoder/query.rb
@@ -33,9 +33,9 @@ module Geocoder
     #
     def lookup
       if ip_address?
-        name = Configuration.ip_lookup || Geocoder::Lookup.ip_services.first
+        name = options[:ip_lookup] || Configuration.ip_lookup || Geocoder::Lookup.ip_services.first
       else
-        name = Configuration.lookup || Geocoder::Lookup.street_services.first
+        name = options[:lookup] || Configuration.lookup || Geocoder::Lookup.street_services.first
       end
       Lookup.get(name)
     end
diff --git a/lib/geocoder/stores/base.rb b/lib/geocoder/stores/base.rb
index dfe1cfd256cce9a3a0dc47143e0950e73d46348d..fd3ccaee9a23b0000314e52357daee94b6192ade 100644
--- a/lib/geocoder/stores/base.rb
+++ b/lib/geocoder/stores/base.rb
@@ -101,7 +101,14 @@ module Geocoder
           return
         end
 
-        results = Geocoder.search(query)
+        query_options = [:lookup, :ip_lookup].inject({}) do |hash, key|
+          if options.has_key?(key)
+            val = options[key]
+            hash[key] = val.respond_to?(:call) ? val.call(self) : val
+          end
+          hash
+        end
+        results = Geocoder.search(query, query_options)
 
         # execute custom block, if specified in configuration
         block_key = reverse ? :reverse_block : :geocode_block
diff --git a/test/geocoder_test.rb b/test/geocoder_test.rb
index a31b82c184a2a5635ece5b536b5d8de9643dbe09..343777820f954432281d88dd42cefd8b6ff22afd 100644
--- a/test/geocoder_test.rb
+++ b/test/geocoder_test.rb
@@ -56,4 +56,22 @@ class GeocoderTest < Test::Unit::TestCase
     g.reverse_geocode
     assert_not_nil g.location
   end
+
+  def test_geocode_with_custom_lookup_param
+    v = Church.new(*venue_params(:msg))
+    v.geocode
+    assert_equal Geocoder::Result::Nominatim, v.result_class
+  end
+
+  def test_geocode_with_custom_lookup_proc_param
+    v = BigChurch.new(*venue_params(:msg))
+    v.geocode
+    assert_equal Geocoder::Result::Nominatim, v.result_class
+  end
+
+  def test_reverse_geocode_with_custom_lookup_param
+    v = Temple.new(*landmark_params(:msg))
+    v.reverse_geocode
+    assert_equal Geocoder::Result::Nominatim, v.result_class
+  end
 end
diff --git a/test/query_test.rb b/test/query_test.rb
index 6f68278b359964e86a1d482be18d9add4c69b82f..58772d415835a4dc29d6a82bc9f126dfe1324862 100644
--- a/test/query_test.rb
+++ b/test/query_test.rb
@@ -42,4 +42,9 @@ class QueryTest < Test::Unit::TestCase
     q = Geocoder::Query.new([43.1313,11.3131])
     assert_equal "43.1313,11.3131", q.sanitized_text
   end
+
+  def test_custom_lookup
+    query = Geocoder::Query.new("address", :lookup => :nominatim)
+    assert_equal Geocoder::Lookup::Nominatim, query.lookup.class
+  end
 end
diff --git a/test/test_helper.rb b/test/test_helper.rb
index 9d635a18c729e80ec9c8e873e26e2ef919477df6..61e6844bc209ded85096cbeb7c4bc42ed6cb949f 100644
--- a/test/test_helper.rb
+++ b/test/test_helper.rb
@@ -251,6 +251,62 @@ class GasStation < ActiveRecord::Base
   end
 end
 
+##
+# Geocoded model with custom lookup.
+#
+class Church < ActiveRecord::Base
+  geocoded_by :address, :lookup => :nominatim do |obj,results|
+    if result = results.first
+      obj.result_class = result.class
+    end
+  end
+
+  def initialize(name, address)
+    super()
+    write_attribute :name, name
+    write_attribute :address, address
+  end
+end
+
+##
+# Geocoded model with custom lookup as proc.
+#
+class BigChurch < ActiveRecord::Base
+  geocoded_by :address, :lookup => lambda{|obj| obj.custom_lookup } do |obj,results|
+    if result = results.first
+      obj.result_class = result.class
+    end
+  end
+
+  def custom_lookup
+    :nominatim
+  end
+
+  def initialize(name, address)
+    super()
+    write_attribute :name, name
+    write_attribute :address, address
+  end
+end
+
+##
+# Reverse geocoded model with custom lookup.
+#
+class Temple < ActiveRecord::Base
+  reverse_geocoded_by :latitude, :longitude, :lookup => :nominatim do |obj,results|
+    if result = results.first
+      obj.result_class = result.class
+    end
+  end
+
+  def initialize(name, latitude, longitude)
+    super()
+    write_attribute :name, name
+    write_attribute :latitude, latitude
+    write_attribute :longitude, longitude
+  end
+end
+
 
 class Test::Unit::TestCase