diff --git a/oembedcore.admin.inc b/oembedcore.admin.inc
index b552587..ea00277 100644
--- a/oembedcore.admin.inc
+++ b/oembedcore.admin.inc
@@ -25,6 +25,13 @@ function oembedcore_settings() {
     '#default_value' => variable_get('oembed_cache_flush', TRUE),
     '#description' => t('Unselect this to retain unexpired cached oEmbed output even when drupal_flush_all_caches() is called. In conjunction with a long %lifetime, this can help reduce costs when using an oEmbed provider service that charges a fee per request.', array('%lifetime' => t('Minimum oEmbed cache lifetime'))),
   );
+  $form['oembed_catchall_provider'] = array(
+    '#type' => 'select',
+    '#title' => t('Catch all provider'),
+    '#options' => array(0 => t('--- none ---')) + oembedcore_provider_list(),
+    '#default_value' => variable_get('oembed_catchall_provider', 0),
+    '#description' => t('Choose one provider to handle all URLs not matched by any other providers.'),
+  );
   return system_settings_form($form);
 }
 
diff --git a/oembedcore.module b/oembedcore.module
index 105e166..794ce69 100644
--- a/oembedcore.module
+++ b/oembedcore.module
@@ -240,6 +240,11 @@ function oembedcore_get_provider($url, &$matches) {
         return $info;
       }
     }
+    // If no matching provider was found, try the catch-all provider.
+    $catchall = variable_get('oembed_catchall_provider', 0);
+    if (!empty($catchall)) {
+      return (array) oembedcore_provider_load($catchall);
+    }
   }
   return FALSE;
 }
