diff --git a/lib/geocoder/lookups/bing.rb b/lib/geocoder/lookups/bing.rb
index b99c8d6ce6e5a8d2df95b3f24f24bc6887827a04..ce78da803275e7cacd93976279a363ed557fc540 100644
--- a/lib/geocoder/lookups/bing.rb
+++ b/lib/geocoder/lookups/bing.rb
@@ -17,13 +17,21 @@ module Geocoder::Lookup
     end
 
     def query_url(query)
-      "#{protocol}://dev.virtualearth.net/REST/v1/Locations" +
-        (query.reverse_geocode? ? "/#{query.sanitized_text}?" : "?") +
-        url_query_string(query)
+      base_url(query) + url_query_string(query)
     end
 
     private # ---------------------------------------------------------------
 
+    def base_url(query)
+      ["#{protocol}://dev.virtualearth.net/REST/v1/Locations",
+        query.options[:region],
+        sanitized_text(query)].compact.join("/") + "?"
+    end
+
+    def sanitized_text(query)
+      URI.escape(query.sanitized_text.strip) if !query.reverse_geocode?
+    end
+
     def results(query)
       return [] unless doc = fetch_data(query)
 
@@ -40,7 +48,7 @@ module Geocoder::Lookup
     def query_url_params(query)
       {
         :key => configuration.api_key,
-        :query => query.reverse_geocode? ? nil : query.sanitized_text
+        :query => query.reverse_geocode? ? query.sanitized_text : nil
       }.merge(super)
     end
   end
diff --git a/test/services_test.rb b/test/services_test.rb
index f7c7ca61ac38fd812e8e5f6bc46ca4cfd41b3090..e084a40c382eecacbf89c943364351118188d42e 100644
--- a/test/services_test.rb
+++ b/test/services_test.rb
@@ -264,6 +264,45 @@ class ServicesTest < Test::Unit::TestCase
     assert_equal 0, results.length
   end
 
+  def test_bing_query_url_contains_region
+    lookup = Geocoder::Lookup::Bing.new
+    url = lookup.query_url(Geocoder::Query.new(
+      "manchester",
+      :region => "uk"
+    ))
+    assert_match /Locations\/uk\/manchester/, url
+    assert_no_match /query/, url
+  end
+
+  def test_bing_query_url_without_region
+    lookup = Geocoder::Lookup::Bing.new
+    url = lookup.query_url(Geocoder::Query.new(
+      "manchester"
+    ))
+    assert_match /Locations\/manchester/, url
+    assert_no_match /query/, url
+  end
+
+  def test_bing_query_url_contains_address_with_spaces
+    lookup = Geocoder::Lookup::Bing.new
+    url = lookup.query_url(Geocoder::Query.new(
+      "manchester, lancashire",
+      :region => "uk"
+    ))
+    assert_match /Locations\/uk\/manchester,%20lancashire/, url
+    assert_no_match /query/, url
+  end
+
+  def test_bing_query_url_contains_address_with_trailing_and_leading_spaces
+    lookup = Geocoder::Lookup::Bing.new
+    url = lookup.query_url(Geocoder::Query.new(
+      " manchester, lancashire ",
+      :region => "uk"
+    ))
+    assert_match /Locations\/uk\/manchester,%20lancashire/, url
+    assert_no_match /query/, url
+  end
+
   # --- Nominatim ---
 
   def test_nominatim_result_components