diff --git a/lib/geocoder/lookups/mapquest.rb b/lib/geocoder/lookups/mapquest.rb
index db954d33d72a8383837563ac4017fe0d014e5afb..632e86b66ef1ebaa59a34c19e9f6c9fb7cec62cc 100644
--- a/lib/geocoder/lookups/mapquest.rb
+++ b/lib/geocoder/lookups/mapquest.rb
@@ -34,9 +34,25 @@ module Geocoder::Lookup
       params.merge(super)
     end
 
+    # http://www.mapquestapi.com/geocoding/status_codes.html
+    # http://open.mapquestapi.com/geocoding/status_codes.html
     def results(query)
       return [] unless doc = fetch_data(query)
-      doc["results"][0]['locations']
+      return doc["results"][0]['locations'] if doc['info']['statuscode'] == 0 # A successful geocode call
+
+      messages = doc['info']['messages'].join
+
+      case doc['info']['statuscode']
+      when 400 # Error with input
+        raise_error(Geocoder::InvalidRequest, messages) ||
+          warn("Mapquest Geocoding API error: #{messages}")
+      when 403 # Key related error
+        raise_error(Geocoder::InvalidApiKey, messages) ||
+          warn("Mapquest Geocoding API error: #{messages}")
+      when 500 # Unknown error
+        raise_error(Geocoder::Error, messages) ||
+          warn("Mapquest Geocoding API error: #{messages}")
+      end
     end
 
   end
diff --git a/test/fixtures/mapquest_error b/test/fixtures/mapquest_error
new file mode 100644
index 0000000000000000000000000000000000000000..0f8adf2d4373dd6c5c8e32ed7ec64fdf2e146e9a
--- /dev/null
+++ b/test/fixtures/mapquest_error
@@ -0,0 +1,16 @@
+{
+  "results": [
+    {
+    "locations": []
+    }
+  ],
+  "info": {
+    "copyright": {
+      "text": "© 2012 MapQuest, Inc.",
+      "imageUrl": "http://api.mqcdn.com/res/mqlogo.gif",
+      "imageAltText": "© 2012 MapQuest, Inc."
+    },
+    "statuscode": 500,
+    "messages": ["Error processing request: ..."]
+  }
+}
diff --git a/test/fixtures/mapquest_invalid_api_key b/test/fixtures/mapquest_invalid_api_key
new file mode 100644
index 0000000000000000000000000000000000000000..f8df9eb206a991c89b71737054884717ea14e206
--- /dev/null
+++ b/test/fixtures/mapquest_invalid_api_key
@@ -0,0 +1,16 @@
+{
+  "results": [
+    {
+    "locations": []
+    }
+  ],
+  "info": {
+    "copyright": {
+      "text": "© 2012 MapQuest, Inc.",
+      "imageUrl": "http://api.mqcdn.com/res/mqlogo.gif",
+      "imageAltText": "© 2012 MapQuest, Inc."
+    },
+    "statuscode": 403,
+    "messages": ["..."]
+  }
+}
diff --git a/test/fixtures/mapquest_invalid_request b/test/fixtures/mapquest_invalid_request
new file mode 100644
index 0000000000000000000000000000000000000000..00845a647322829a848c921d5034e586f2ff5d5a
--- /dev/null
+++ b/test/fixtures/mapquest_invalid_request
@@ -0,0 +1,16 @@
+{
+  "results": [
+    {
+    "locations": []
+    }
+  ],
+  "info": {
+    "copyright": {
+      "text": "© 2012 MapQuest, Inc.",
+      "imageUrl": "http://api.mqcdn.com/res/mqlogo.gif",
+      "imageAltText": "© 2012 MapQuest, Inc."
+    },
+    "statuscode": 400,
+    "messages": ["Illegal argument from request: ..."]
+  }
+}
diff --git a/test/fixtures/mapquest_no_results b/test/fixtures/mapquest_no_results
index 0cfc3e76e385c41ecb2f9cfcea589e3f44ba38ab..b3924763c7c32b453c1c8af28df1d39292af90c9 100644
--- a/test/fixtures/mapquest_no_results
+++ b/test/fixtures/mapquest_no_results
@@ -3,5 +3,14 @@
     {
     "locations": []
     }
-  ]
+  ],
+  "info": {
+    "copyright": {
+      "text": "© 2012 MapQuest, Inc.",
+      "imageUrl": "http://api.mqcdn.com/res/mqlogo.gif",
+      "imageAltText": "© 2012 MapQuest, Inc."
+    },
+    "statuscode": 0,
+    "messages": []
+  }
 }
diff --git a/test/services_test.rb b/test/services_test.rb
index 3a4e8e1a55c436d558537f198af05fd8e37f94b1..68da4e9f0fbd6d3701bc6960dc03f3cb3291f194 100644
--- a/test/services_test.rb
+++ b/test/services_test.rb
@@ -316,6 +316,38 @@ class ServicesTest < Test::Unit::TestCase
       result.address
   end
 
+  def test_mapquest_no_results
+    Geocoder.configure(:lookup => :mapquest)
+    set_api_key!(:mapquest)
+    assert_equal [], Geocoder.search("no results")
+  end
+
+  def test_mapquest_raises_exception_when_invalid_request
+    Geocoder.configure(:always_raise => [Geocoder::InvalidRequest])
+    l = Geocoder::Lookup.get(:mapquest)
+    assert_raises Geocoder::InvalidRequest do
+      l.send(:results, Geocoder::Query.new("invalid request"))
+    end
+  end
+
+  def test_mapquest_raises_exception_when_invalid_api_key
+    Geocoder.configure(:always_raise => [Geocoder::InvalidApiKey])
+    l = Geocoder::Lookup.get(:mapquest)
+    assert_raises Geocoder::InvalidApiKey do
+      l.send(:results, Geocoder::Query.new("invalid api key"))
+    end
+  end
+
+  def test_mapquest_raises_exception_when_error
+    Geocoder.configure(:always_raise => [Geocoder::Error])
+    l = Geocoder::Lookup.get(:mapquest)
+    assert_raises Geocoder::Error do
+      l.send(:results, Geocoder::Query.new("error"))
+    end
+  end
+
+
+
   # --- Esri ---
 
   def test_esri_query_for_geocode