diff --git a/lib/geocoder/lookups/bing.rb b/lib/geocoder/lookups/bing.rb
index c4ce5453a674a83d04aacbeb70c8a4a4c3d2f1a3..125dcdcf340e0e6913ebcfbdc86b4e73996703d1 100644
--- a/lib/geocoder/lookups/bing.rb
+++ b/lib/geocoder/lookups/bing.rb
@@ -21,12 +21,14 @@ module Geocoder::Lookup
     def results(query)
       return [] unless doc = fetch_data(query)
 
-      if doc['statusDescription'] == "OK"
+      if doc['statusCode'] == 200
         return doc['resourceSets'].first['estimatedTotal'] > 0 ? doc['resourceSets'].first['resources'] : []
+      elsif doc['statusCode'] == 401 and doc["authenticationResultCode"] == "InvalidCredentials"
+        raise_error(Geocoder::InvalidApiKey) || warn("Invalid Bing API key.")
       else
         warn "Bing Geocoding API error: #{doc['statusCode']} (#{doc['statusDescription']})."
-        return []
       end
+      return []
     end
 
     def query_url_params(query)
diff --git a/test/fixtures/bing_invalid_key b/test/fixtures/bing_invalid_key
new file mode 100644
index 0000000000000000000000000000000000000000..d34e1e93ea9ee2fc878804fa9a2fea348b87e074
--- /dev/null
+++ b/test/fixtures/bing_invalid_key
@@ -0,0 +1 @@
+{"authenticationResultCode":"InvalidCredentials","brandLogoUri":"http:\\/\\/dev.virtualearth.net\\/Branding\\/logo_powered_by.png","copyright":"Copyright \xC2\xA9 2012 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.","errorDetails":["Access was denied. You may have entered your credentials incorrectly, or you might not have access to the requested resource or operation."],"resourceSets":[],"statusCode":401,"statusDescription":"Unauthorized","traceId":"5c539f6e70c44b2e858741b6c932318e|EWRM001670|02.00.83.1900|"}
diff --git a/test/lookup_test.rb b/test/lookup_test.rb
index 6ad02c52330dd7c48f7bc0afd124babb9411f2cc..190f638a855396fbffadbfe620b103b656999cf6 100644
--- a/test/lookup_test.rb
+++ b/test/lookup_test.rb
@@ -23,7 +23,7 @@ class LookupTest < Test::Unit::TestCase
   def test_raises_exception_on_invalid_key
     Geocoder.configure(:always_raise => [Geocoder::InvalidApiKey])
     #Geocoder::Lookup.all_services_except_test.each do |l|
-    [:yahoo, :yandex, :maxmind].each do |l|
+    [:bing, :yahoo, :yandex, :maxmind].each do |l|
       lookup = Geocoder::Lookup.get(l)
       assert_raises Geocoder::InvalidApiKey do
         lookup.send(:results, Geocoder::Query.new("invalid key"))