diff --git a/akamai.admin.inc b/akamai.admin.inc
index f87834d..547565a 100644
--- a/akamai.admin.inc
+++ b/akamai.admin.inc
@@ -12,13 +12,19 @@
 function akamai_settings() {
   $form = array();
 
-  $form['akamai_wsdl'] = array(
+  $form['akamai_ccu_wsdl'] = array(
     '#type'          => 'textfield',
-    '#title'         => t('SOAP WSDL'),
-    '#default_value' => variable_get('akamai_wsdl', ''),
+    '#title'         => t('CCU SOAP WSDL'),
+    '#default_value' => variable_get('akamai_ccu_wsdl', ''),
     '#description'   => t('The URL of the Akamai SOAP call WSDL, e.g. "https://soap.example.com/example.wsdl"')
   );
 
+  $form['akamai_eccu_wsdl'] = array(
+    '#type'          => 'textfield',
+    '#title'         => t('ECCU SOAP WSDL'),
+    '#default_value' => variable_get('akamai_eccu_wsdl', ''),
+    '#description'   => t('The URL of the Akamai SOAP call WSDL, e.g. "https://soap.example.com/example.wsdl"')
+  );
   $form['akamai_basepath'] = array(
     '#type'          => 'textfield',
     '#title'         => t('Base Path'),
@@ -141,7 +147,7 @@ function akamai_cache_control_submit($form, &$form_state) {
     drupal_set_message($message);
   }
   else {
-    drupal_set_message( t("There was a problem with your cache control request.  Check your log messages for more information.", array(), 'error') );
+    drupal_set_message(t("There was a problem with your cache control request.  Check your log messages for more information."), array(), 'error');
   }
 }
 
diff --git a/akamai.class.inc b/akamai.class.inc
index e5f8d93..71024c8 100644
--- a/akamai.class.inc
+++ b/akamai.class.inc
@@ -45,7 +45,8 @@ class AkamaiCacheControlClient implements AkamaiCacheControl {
       'action'    => variable_get("akamai_action", ""),
       'type'      => "arl",
       'domain'    => variable_get("akamai_domain", ""),
-      'soap_wsdl' => variable_get("akamai_wsdl", ""),
+      'ccu_soap_wsdl' => variable_get("akamai_ccu_wsdl", ""),
+      'eccu_soap_wsdl' => variable_get("akamai_eccu_wsdl", ""),
       'email'     => variable_get("akamai_email", ""),
     );
 
@@ -90,7 +91,7 @@ class AkamaiCacheControlClient implements AkamaiCacheControl {
     }
 
     try {
-      $ccuapi = new SoapClient($soap_wsdl,
+      $ccuapi = new SoapClient($ccu_soap_wsdl,
         array(
           'trace' => 1,
           'features' => SOAP_USE_XSI_ARRAY_TYPE,
@@ -172,3 +173,104 @@ class ErrorCacheControlClient implements AkamaiCacheControl {
     throw new Exception(t('Akamai Failure Condition Test'));
   }
 }
+
+/**
+ *
+ */
+
+class AkamaiEnhancedCacheControlClient extends AkamaiCacheControlClient {
+  function clear_url($paths) {
+
+    // Grab params
+    extract($this->parameters);
+
+    // make paths an array
+    if (!is_array($paths)) {
+      $url = array($paths);
+    }
+
+    // prepend base path to paths to make URIs
+    $uris = array();
+    foreach ($paths as $path) {
+      $path= rtrim(preg_match("/^\//", $path) ? $path : "/$path");
+      array_push($uris, $basepath . $path);
+    }
+
+    // Download the wsdl and reference it locally, because even though we're
+    // specifying basic auth info, php won't use it to actually fetch the wsdl to begin with…
+    $wsdl_parts = parse_url($eccu_soap_wsdl);
+    $eccu_soap_wsdl = $wsdl_parts['scheme'] . '://' . urlencode($name) . ':' . urlencode($pwd) . '@' . $wsdl_parts['host'] . $wsdl_parts['path'] . '?' . $wsdl_parts['query'];
+    $wsdl_destination = file_directory_temp() . '/eccu.wsdl';
+    if (!file_exists($wsdl_destination)) {
+      $result = drupal_http_request($eccu_soap_wsdl);
+      if ($result->code == 200) {
+        file_unmanaged_save_data($result->data, $wsdl_destination, FILE_EXISTS_REPLACE);
+      }
+    }
+
+    try {
+      $eccuapi = new SoapClient('file://' . $wsdl_destination,
+        array(
+          'trace' => 1,
+          'features' => SOAP_USE_XSI_ARRAY_TYPE,
+          'login' => $name,
+          'password' => $pwd,
+        )
+      );
+
+      $filename = 'eccu_cache_clear-' . time();
+      $notes = '';
+      $version_string = time();
+      $base_parts = parse_url($basepath);
+      $content = $this->__buildEccuXML($paths);
+      $property_name_exact_match = 0;
+      $response = $eccuapi->upload($filename, $content, $notes, $version_string, $base_parts['host'], 'hostheader', $property_name_exact_match, $email);
+      $is_success = ($response->resultCode < 300);
+      if (!$is_success) {
+        throw new Exception($response->resultMsg);
+      }
+      foreach ($uris as $uri) {
+        watchdog('Akamai', t("Akamai %action of %uri: %message"),
+          array('%uri' => $uri, '%action' => $action, '%message' => $response->resultMsg), WATCHDOG_NOTICE);
+      }
+      return array(
+        'success' => TRUE,
+        'code' => $response->resultCode,
+        'message' => $response->resultMsg,
+      );
+    }
+    catch (Exception $e) {
+      watchdog('Akamai', t("Error Clearing Akamai Cache: %msg"), array('%msg' => $e->getMessage()));
+      throw $e;
+    }
+  }
+
+  public function __buildEccuXML($paths) {
+    $regex = '/(?<path>[\w\/]+\/)?(?<wildcard>\*)(?:\.(?<ext>\w+))?$/';
+
+    $xml = '<eccu>';
+    foreach ($paths as $pattern) {
+      preg_match($regex, $pattern, $matches);
+      $recursive_dirs = FALSE;
+      if (!empty($matches['path'])) {
+        $xml .= '<match:recursive-dirs value="' . $matches['path'] . '">';
+        $recursive_dirs = TRUE;
+
+      }
+
+      if (isset($matches['wildcard']) && isset($matches['ext'])) {
+        $xml .= '<match:ext value="' . $matches['ext'] . '"><revalidate>now</revalidate></match:ext>';
+      }
+      elseif ($matches['path'] && $recursive_dirs) {
+       $xml .= '<revalidate>now</revalidate>';
+      }
+
+      if ($recursive_dirs) {
+        $xml .= '</match:recursive-dirs>';
+      }
+    }
+    $xml .= '</eccu>';
+
+    return $xml;
+  }
+}
\ No newline at end of file
diff --git a/akamai.module b/akamai.module
index 8d35343..5006d15 100644
--- a/akamai.module
+++ b/akamai.module
@@ -202,7 +202,9 @@ function akamai_clear_url($paths_in, $params = array(), $node = NULL) {
   }
 
   try {
-    $akamai = akamai_get_class($params);
+    // If there are wildcard characters in any of the paths, use the eccu api.
+    $eccu = (bool)strpos(implode('', $paths), '*');
+    $akamai = akamai_get_class($params, $eccu);
     $response = $akamai->clear_url($paths);
     $response['client'] = $akamai;
     return $response;
@@ -274,9 +276,10 @@ function akamai_get_notification_email() {
  * Returns the Akamai Cache Control class. This is abstracted to provide the capability
  * of a no-op or recording class for testing purposes.
  */
-function akamai_get_class($params = array()) {
+function akamai_get_class($params = array(), $eccu = FALSE) {
   module_load_include('inc', 'akamai', 'akamai.class');
-  $class = variable_get('akamai_service_class', 'AkamaiCacheControlClient');
+  $default_class = $eccu ? 'AkamaiEnhancedCacheControlClient' : 'AkamaiCacheControlClient';
+  $class = variable_get('akamai_service_class', $default_class);
   $akamai = new $class($params);
   return $akamai;
 }
