diff --git a/lib/geocoder/exceptions.rb b/lib/geocoder/exceptions.rb
index 01153aaf5303a81b2e9aaa5b90e65fdf85e348d9..7f6a081c2c32a9f3f74c1334c0e7e24732e1479f 100644
--- a/lib/geocoder/exceptions.rb
+++ b/lib/geocoder/exceptions.rb
@@ -26,4 +26,7 @@ module Geocoder
   class InvalidApiKey < Error
   end
 
+  class ServiceUnavailable < Error
+  end
+
 end
diff --git a/lib/geocoder/lookups/bing.rb b/lib/geocoder/lookups/bing.rb
index 0149d144e8b1087d7b1eb6ecf0d801e49fd1b810..ce305f5d8e4e8ede37830e3c5b5f177cb0502256 100644
--- a/lib/geocoder/lookups/bing.rb
+++ b/lib/geocoder/lookups/bing.rb
@@ -55,5 +55,18 @@ module Geocoder::Lookup
         key: configuration.api_key
       }.merge(super)
     end
+
+    def check_response_for_errors!(response)
+      super
+      if response['x-ms-bm-ws-info'].to_i == 1
+        # Occasionally, the servers processing service requests can be overloaded, 
+        # and you may receive some responses that contain no results for queries that 
+        # you would normally receive a result. To identify this situation, 
+        # check the HTTP headers of the response. If the HTTP header X-MS-BM-WS-INFO is set to 1, 
+        # it is best to wait a few seconds and try again.
+        raise_error(Geocoder::ServiceUnavailable) ||
+          warn("Bing Geocoding API error: Service Unavailable")
+      end   
+    end
   end
 end
diff --git a/test/fixtures/bing_service_unavailable b/test/fixtures/bing_service_unavailable
new file mode 100644
index 0000000000000000000000000000000000000000..43135d615292b80f2776dffa35abd04b41400909
--- /dev/null
+++ b/test/fixtures/bing_service_unavailable
@@ -0,0 +1,16 @@
+{
+   "authenticationResultCode":"ValidCredentials",
+   "brandLogoUri":"http:\/\/dev.virtualearth.net\/Branding\/logo_powered_by.png",
+   "copyright":"Copyright © 2011 Microsoft and its suppliers. All rights reserved. This API cannot be accessed and the content and any results may not be used, reproduced or transmitted in any manner without express written permission from Microsoft Corporation.",
+   "resourceSets":[
+      {
+         "estimatedTotal":0,
+         "resources":[
+
+         ]
+      }
+   ],
+   "statusCode":200,
+   "statusDescription":"OK",
+   "traceId":"907b76a307bc49129a489de3d4c992ea|CH1M001463|02.00.82.2800|CH1MSNVM001383, CH1MSNVM001358, CH1MSNVM001397"
+}
diff --git a/test/test_helper.rb b/test/test_helper.rb
index fa73e12b4cf2d2ed1afd18907c40331d68f9c8b4..6b8fac8918609a27893e35ab9b0e7ca2ba91364e 100644
--- a/test/test_helper.rb
+++ b/test/test_helper.rb
@@ -118,6 +118,19 @@ module Geocoder
       end
     end
 
+    class Bing
+      private
+      def read_fixture(file)
+        if file == "bing_service_unavailable"
+          filepath = File.join("test", "fixtures", file)
+          s = File.read(filepath).strip.gsub(/\n\s*/, "")
+          MockHttpResponse.new(body: s, code: "200", headers: {'x-ms-bm-ws-info' => "1"})
+        else
+          super
+        end
+      end
+    end
+
     class GooglePremier
       private
       def fixture_prefix
@@ -415,9 +428,10 @@ class MockHttpResponse
   def initialize(options = {})
     @code = options[:code].to_s
     @body = options[:body]
+    @headers = options[:headers] || {}
   end
 
   def [](key)
-    send key if respond_to?(key)
+    @headers[key]
   end
 end
diff --git a/test/unit/lookups/bing_test.rb b/test/unit/lookups/bing_test.rb
index 9a63f90eb63c4f0c1bb8805061f98eecaf6a8eae..68e457925681085a532eca2c0a7b5ae3a6661df0 100644
--- a/test/unit/lookups/bing_test.rb
+++ b/test/unit/lookups/bing_test.rb
@@ -65,4 +65,12 @@ class BingTest < GeocoderTestCase
     assert_match(/Locations\/uk\?q=manchester,%20lancashire/, url)
     assert_no_match(/query/, url)
   end
+
+  def test_raises_exception_when_service_unavailable
+    Geocoder.configure(:always_raise => [Geocoder::ServiceUnavailable])
+    l = Geocoder::Lookup.get(:bing)
+    assert_raises Geocoder::ServiceUnavailable do
+      l.send(:results, Geocoder::Query.new("service unavailable"))
+    end
+  end
 end