diff --git a/SocrataSelectQuery.inc b/SocrataSelectQuery.inc
index f9cc019..ec11fde 100644
--- a/SocrataSelectQuery.inc
+++ b/SocrataSelectQuery.inc
@@ -75,8 +75,30 @@ class SocrataSelectQuery extends SelectQueryExtender {
     return "{$components['scheme']}://{$components['host']}/api/views/{$components['dataset_id']}/rows.{$format}?accessType=DOWNLOAD";
   }
 
+  /**
+   * Return Socrata metadata URL.
+   *
+   * @param $format string
+   *
+   * @return string
+   */
+  public function getMetaDataUrl() {
+    $source = isset($this->source) ? $this->source : $this->getSource();
+    $components = socrata_components_from_endpoint($source->endpoint);
 
-  public function execute() {
+    return "{$components['scheme']}://{$components['host']}/api/views/{$components['dataset_id']}.json";
+  }
+
+  /**
+   * Execute the query. In our case, this is actually the cURL request.
+   *
+   * @param $type string
+   *   cURL request type, if not the default. The only acceptable value is
+   *   currently 'metadata', but we might want others in the future?
+   *
+   * @return array
+   */
+  public function execute($type = NULL) {
     $retval = FALSE;
 
     $source = $this->getSource();
@@ -114,9 +136,19 @@ class SocrataSelectQuery extends SelectQueryExtender {
       do {
         $retval = FALSE;
 
-        // Construct URL
-        $soda_url = $this->getCurlUrl();
-        //$soda_url = url($endpoint, array('query' => $params, 'absolute' => TRUE));
+        // Construct the URL, based on the $type parameter.
+        if ($type == 'metadata') {
+          // Note that 'metadata' here represents an entirely separate API and
+          // endpoint, and is different from the special fields of type
+          // 'meta_data' (mentioned below) that are returned from the normal
+          // dataset API/endpoint, but when using an old version of the API.
+          // @todo Add version number for "old".
+          $soda_url = $this->getMetaDataURL();
+        }
+        else {
+          $soda_url = $this->getCurlUrl();
+          //$soda_url = url($endpoint, array('query' => $params, 'absolute' => TRUE));
+        }
         _socrata_dbg($soda_url);
 
         curl_setopt($ch, CURLOPT_URL, $soda_url);
@@ -139,6 +171,9 @@ class SocrataSelectQuery extends SelectQueryExtender {
             }
             else {
               // Generate an array mapping fields to types, if provided
+              // Note that the old API returns some fields of type 'meta_data'
+              // (e.g. ':id', ':created_at', ':updated_at').
+              // @todo Add version number for "old".
               if (isset($retval['headers']['x-soda2-fields']) && isset($retval['headers']['x-soda2-types'])) {
                 foreach ($retval['headers']['x-soda2-fields'] as $idx => $name) {
                   $retval['fields'][$name] = $retval['headers']['x-soda2-types'][$idx];
diff --git a/socrata_views/socrata_views.module b/socrata_views/socrata_views.module
index e7f9a67..2f7a5ab 100644
--- a/socrata_views/socrata_views.module
+++ b/socrata_views/socrata_views.module
@@ -112,6 +112,10 @@ function socrata_views_data() {
     $resp = $query->execute();
 
     if ($resp !== FALSE && !empty($resp['fields'])) {
+      // Also get the metadata.
+      $resp_metadata = $query->execute('metadata');
+      $metadata_field_list = $resp_metadata['data']['columns'];
+
       // Define basic table info
       $tables[$source_name] = array();
       $table = &$tables[$source_name];
@@ -129,12 +133,41 @@ function socrata_views_data() {
       );
 
       // Add fields to table
-      foreach ($resp['fields'] as $field_name => $field_type) {
+      foreach ($resp['fields'] as $field_machine_name => $field_type) {
         $field_options = array(
           'dataset' => $dataset,
           'soda2_type' => $field_type,
         );
-        $handlers = _socrata_views_handlers($field_name, $field_type, $field_options);
+        $handlers = _socrata_views_handlers($field_machine_name, $field_type, $field_options);
+
+        // Get a human-readable field name.
+        $field_name = $field_machine_name;
+        // For most fields, we should be able to get a human-readable name from
+        // the metadata query.
+        foreach($metadata_field_list as $metadata_field) {
+          if ($field_machine_name == $metadata_field['fieldName']) {
+            $field_name = $metadata_field['name'];
+            continue;
+          }
+        }
+
+        // If we still don't have a human-readable name...
+        // Hard-code values for a few special cases from the old API.
+        // @todo Add version number for "old".
+        if ($field_name == $field_machine_name) {
+          switch ($field_machine_name) {
+            case ':created_at':
+              $field_name = 'Created at';
+              break;
+            case ':updated_at':
+              $field_name = 'Updated at';
+              break;
+            case ':id':
+              $field_name = 'ID';
+              break;
+          }
+        }
+
         $field_def = array_merge_recursive(
           $handlers,
           array(
@@ -146,7 +179,7 @@ function socrata_views_data() {
           )
         );
 
-        $table[$field_name] = $field_def;
+        $table[$field_machine_name] = $field_def;
       }
 
       // Add result id field since we have to define at least one initial field
@@ -172,6 +205,8 @@ function _socrata_views_handlers($name, $type, $options) {
   $handlers = array();
 
   // Catch the special "meta_data" fields and override their types based on field id so they make sense
+  // These are only returned with the old API.
+  // @todo Add version number for "old".
   if ('meta_data' == $type) {
     switch ($name) {
       case ':created_at':
