diff --git a/filefield_sources.css b/filefield_sources.css
index 58ae4a8..6b89e5a 100644
--- a/filefield_sources.css
+++ b/filefield_sources.css
@@ -29,3 +29,31 @@
   /* Helps with display consistency since references has a background. */
   background-image: inherit;
 }
+
+/* Views source. */
+.filefield-source-view-cell {
+  text-align: center;
+  vertical-align: bottom;
+  min-height: 100px;
+  width: 20%;
+}
+
+.filefield-source-view-cell img {
+  max-width: 100%;
+  height: auto;
+}
+
+.filefield-source-view-button {
+  cursor: pointer;
+  padding: 4px 17px;
+  color: #5A5A5A;
+  border: 1px solid #E4E4E4;
+  border-bottom: 1px solid #B4B4B4;
+  border-left-color: #D2D2D2;
+  border-right-color: #D2D2D2;
+  -moz-border-radius: 20px;
+  -webkit-border-radius: 20px;
+  border-radius: 20px;
+  display: block;
+  text-align: center;
+}
diff --git a/filefield_sources.js b/filefield_sources.js
index 65afa48..66dbd2b 100644
--- a/filefield_sources.js
+++ b/filefield_sources.js
@@ -26,6 +26,9 @@
         $fileFieldElement.find('div.' + fileFieldSourceClass).css('display', '');
       }
 
+      // Views Source integrations.
+      $fileFieldElement.find('.filefield-source-view-button').click(Drupal.fileFieldSources.viewSourceButton);
+
       // Add the active class.
       $(this).addClass('active');
       Drupal.fileFieldSources.updateHintText($fileFieldElement.get(0));
@@ -104,6 +107,17 @@
    */
   removeHintText: function() {
     $('div.filefield-source input.hint').val('').removeClass('hint');
+  },
+
+  /**
+   * Insert button for Views source.
+   */
+  viewSourceButton: function() {
+    var fid  = $(this).attr('data-fid');
+    var $wrapper = $(this).parents(".filefield-source-views:first");
+    $wrapper.find('input.form-text:first').val('[fid:' + fid + ']');
+    $wrapper.find('input.form-submit:first').mousedown();
+    return false;
   }
 };
 
diff --git a/filefield_sources.module b/filefield_sources.module
index 4ca5796..e4fc23c 100644
--- a/filefield_sources.module
+++ b/filefield_sources.module
@@ -615,3 +615,13 @@
   $b = (array)$b + array('weight' => 0, 'label' => '');
   return $a['weight'] < $b['weight'] ? -1 : ($a['weight'] > $b['weight'] ? 1 : strnatcasecmp($a['label'], $b['label']));
 }
+
+/**
+ * Implementation of hook_views_api().
+ */
+function filefield_sources_views_api() {
+  return array(
+    'api' => 3,
+    'path' => drupal_get_path('module', 'filefield_sources') . '/views',
+  );
+}
\ No newline at end of file
diff --git a/sources/views.inc b/sources/views.inc
new file mode 100644
index 0000000..84c17e9
--- /dev/null
+++ b/sources/views.inc
@@ -0,0 +1,175 @@
+<?php
+
+/**
+ * @file
+ * A FileField extension to allow referencing of existing files, search data
+ * using views (customizable by UI).
+ *
+ * The "hooks" in this file are not true hooks, they're called individually
+ * from the main filefield_sources.module in the corresponding hook by the
+ * same name. Any of these hooks could be broken out into a separate module.
+ */
+
+/**
+ * Implements hook_filefield_source_info().
+ */
+function filefield_source_views_info() {
+  $source = array();
+  $source['views'] = array(
+    'name' => t('Views-based selection'),
+    'label' => t('Select existing'),
+    'description' => t('Use a views to search file to add.'),
+    'process' => 'filefield_source_views_process',
+    'value' => 'filefield_source_views_value',
+  );
+  return $source;
+}
+
+/**
+ * Implements hook_theme().
+ */
+function filefield_source_views_theme() {
+  return array(
+    'filefield_source_views_element' => array(
+      'render element' => 'element',
+      'file' => 'sources/views.inc',
+    ),
+ );
+}
+
+/**
+ * Implements hook_filefield_source_settings().
+ */
+function filefield_source_views_settings($op, $instance) {
+  $return = array();
+
+  if ($op == 'form') {
+    $settings = isset($instance['widget']['settings']['filefield_sources']['views']) ? $instance['widget']['settings']['filefield_sources']['views'] : array();
+
+    $return['views'] = array(
+      '#title' => t('Views reference options'),
+      '#type' => 'fieldset',
+      '#collapsible' => TRUE,
+      '#collapsed' => TRUE,
+    );
+
+    // Populate views options
+    $options = array();
+    foreach (views_get_all_views() as $id => $view) {
+      $options[$id] = $view->human_name ? $view->human_name : $id;
+    }
+
+    // Choose views to use to search image.
+    $default = isset($options['filefield_source']) ? 'filefield_source' : NULL;
+    $return['views']['views_filter'] = array(
+      '#title' => t('View to search image'),
+      '#type' => 'select',
+      '#options' => $options,
+      '#default_value' => isset($settings['views_filter']) ? $settings['views_filter'] : $default,
+      '#description' => t('The views used to search image will be inserto in the content.'),
+      '#weight' => 15,
+    );
+  }
+  elseif ($op == 'save') {
+    $return = array(
+      'views' => array(
+        'views_filter' => 'filefield_source',
+      ),
+    );
+  }
+
+  return $return;
+}
+
+/**
+ * A #process callback to extend the filefield_widget element type.
+ */
+function filefield_source_views_process($element, &$form_state, $form) {
+  $instance = field_widget_instance($element, $form_state);
+  $settings = $instance['widget']['settings']['filefield_sources']['views'];
+
+  $element['filefield_views'] = array(
+    '#settings' => $settings,
+    '#weight' => 100.5,
+    '#theme' => 'filefield_source_views_element',
+    '#filefield_source' => TRUE, // Required for proper theming.
+    '#attached' => array(
+      'js' => array(
+        drupal_get_path('module', 'filefield_sources') . '/js/views.js',
+      ),
+    ),
+  );
+
+  $element['filefield_views']['fid'] = array(
+    '#type' => 'textfield',
+    '#attributes' => array('style' => 'display: none;'),
+  );
+
+  $element['filefield_views']['select'] = array(
+    '#name' => implode('_', $element['#array_parents']) . '_fid_select',
+    '#type' => 'submit',
+    '#value' => t('Select'),
+    '#validate' => array(),
+    '#submit' => array('filefield_sources_field_submit'),
+    '#name' => $element['#name'] . '[filefield_views][button]',
+    '#limit_validation_errors' => array($element['#parents']),
+    '#attributes' => array('style' => 'display: none;'),
+    '#ajax' => array(
+      'path' => 'file/ajax/' . implode('/', $element['#array_parents']) . '/' . $form['form_build_id']['#value'],
+      'wrapper' => $element['#id'] . '-ajax-wrapper',
+      'effect' => 'fade',
+    ),
+  );
+
+  return $element;
+}
+
+/**
+ * A #filefield_value_callback function.
+ */
+function filefield_source_views_value($element, &$item) {
+  if (isset($item['filefield_views']['fid'])) {
+    $matches = array();
+    if (preg_match('/\[fid:(\d+)\]/', $item['filefield_views']['fid'], $matches)) {
+      $fid = $matches[1];
+      if ($file = file_load($fid)) {
+
+        // Run all the normal validations, minus file size restrictions.
+        if (isset($element['#upload_validators']['file_validate_size'])) {
+          unset($element['#upload_validators']['file_validate_size']);
+        }
+
+        if (filefield_sources_element_validate($element, (object) $file)) {
+          $item = array_merge($item, (array) $file);
+        }
+      }
+      else {
+        form_error($element, t('The file could not be used because the file does not exist in the database.'));
+      }
+    }
+    // No matter what happens, clear the value from the autocomplete.
+    $item['filefield_views']['fid'] = '';
+  }
+}
+
+/**
+ * Theme the output of the field.
+ */
+function theme_filefield_source_views_element($variables) {
+  $element = $variables['element'];
+
+  $element['fid']['#field_suffix'] = drupal_render($element['select']);
+
+  // Load the view.
+  $view = views_get_view($element['#settings']['views_filter']);
+  $view->set_use_ajax(TRUE); // Force use of AJAX.
+
+  // Generate output.
+  $output = '';
+  $output .= '<div class="filefield-source filefield-source-views clear-block">';
+  $output .= drupal_render($element['fid']);
+  $output .= $view->render(); // Wrapper div replaced by AJAX.
+  $output .= '</div>';
+
+  return $output;
+}
diff --git a/views/filefield_sources.views_default.inc b/views/filefield_sources.views_default.inc
new file mode 100644
index 0000000..10b1863
--- /dev/null
+++ b/views/filefield_sources.views_default.inc
@@ -0,0 +1,139 @@
+<?php
+/**
+ * @file
+ * filefield_sources.views_default.inc
+ */
+
+/**
+ * Implementation of hook_views_default_views().
+ */
+function filefield_sources_views_default_views() {
+  $views = array();
+
+  $view = new view;
+  $view->name = 'filefield_source';
+  $view->description = '';
+  $view->tag = 'default';
+  $view->base_table = 'file_managed';
+  $view->human_name = 'Filefield Source View';
+  $view->core = 7;
+  $view->api_version = '3.0-alpha1';
+  $view->disabled = FALSE; /* Edit this to true to make a default view disabled initially */
+
+  /* Display: Master */
+  $handler = $view->new_display('default', 'Master', 'default');
+  $handler->display->display_options['use_ajax'] = TRUE;
+  $handler->display->display_options['access']['type'] = 'perm';
+  $handler->display->display_options['cache']['type'] = 'none';
+  $handler->display->display_options['query']['type'] = 'views_query';
+  $handler->display->display_options['query']['options']['query_comment'] = FALSE;
+  $handler->display->display_options['exposed_form']['type'] = 'basic';
+  $handler->display->display_options['pager']['type'] = 'full';
+  $handler->display->display_options['style_plugin'] = 'grid';
+  $handler->display->display_options['style_options']['row_class'] = 'filefield-source-view-cell';
+  $handler->display->display_options['style_options']['columns'] = '5';
+  $handler->display->display_options['style_options']['fill_single_line'] = 1;
+  $handler->display->display_options['row_plugin'] = 'fields';
+  $handler->display->display_options['row_options']['hide_empty'] = 0;
+  /* No results behavior: Global: Text area */
+  $handler->display->display_options['empty']['area']['id'] = 'area';
+  $handler->display->display_options['empty']['area']['table'] = 'views';
+  $handler->display->display_options['empty']['area']['field'] = 'area';
+  $handler->display->display_options['empty']['area']['label'] = 'Empty text';
+  $handler->display->display_options['empty']['area']['empty'] = FALSE;
+  $handler->display->display_options['empty']['area']['content'] = 'No files found.';
+  $handler->display->display_options['empty']['area']['format'] = filter_fallback_format();
+  $handler->display->display_options['empty']['area']['tokenize'] = 0;
+  /* Field: File: Path */
+  $handler->display->display_options['fields']['uri']['id'] = 'uri';
+  $handler->display->display_options['fields']['uri']['table'] = 'file_managed';
+  $handler->display->display_options['fields']['uri']['field'] = 'uri';
+  $handler->display->display_options['fields']['uri']['label'] = '';
+  $handler->display->display_options['fields']['uri']['alter']['alter_text'] = 1;
+  $handler->display->display_options['fields']['uri']['alter']['text'] = '<img src="[uri]" width="120" />';
+  $handler->display->display_options['fields']['uri']['alter']['make_link'] = 0;
+  $handler->display->display_options['fields']['uri']['alter']['absolute'] = 0;
+  $handler->display->display_options['fields']['uri']['alter']['external'] = 0;
+  $handler->display->display_options['fields']['uri']['alter']['replace_spaces'] = 0;
+  $handler->display->display_options['fields']['uri']['alter']['trim'] = 0;
+  $handler->display->display_options['fields']['uri']['alter']['nl2br'] = 0;
+  $handler->display->display_options['fields']['uri']['alter']['word_boundary'] = 1;
+  $handler->display->display_options['fields']['uri']['alter']['ellipsis'] = 1;
+  $handler->display->display_options['fields']['uri']['alter']['strip_tags'] = 0;
+  $handler->display->display_options['fields']['uri']['alter']['html'] = 0;
+  $handler->display->display_options['fields']['uri']['element_label_colon'] = 0;
+  $handler->display->display_options['fields']['uri']['element_default_classes'] = 1;
+  $handler->display->display_options['fields']['uri']['hide_empty'] = 0;
+  $handler->display->display_options['fields']['uri']['empty_zero'] = 0;
+  $handler->display->display_options['fields']['uri']['link_to_file'] = 0;
+  $handler->display->display_options['fields']['uri']['file_download_path'] = 1;
+  /* Field: File: File ID */
+  $handler->display->display_options['fields']['fid']['id'] = 'fid';
+  $handler->display->display_options['fields']['fid']['table'] = 'file_managed';
+  $handler->display->display_options['fields']['fid']['field'] = 'fid';
+  $handler->display->display_options['fields']['fid']['label'] = '';
+  $handler->display->display_options['fields']['fid']['alter']['alter_text'] = 1;
+  $handler->display->display_options['fields']['fid']['alter']['text'] = '<a class="filefield-source-view-button" href="#" data-fid="[fid]">Add image</a>';
+  $handler->display->display_options['fields']['fid']['alter']['make_link'] = 0;
+  $handler->display->display_options['fields']['fid']['alter']['path'] = '#[fid]';
+  $handler->display->display_options['fields']['fid']['alter']['absolute'] = 0;
+  $handler->display->display_options['fields']['fid']['alter']['external'] = 0;
+  $handler->display->display_options['fields']['fid']['alter']['replace_spaces'] = 0;
+  $handler->display->display_options['fields']['fid']['alter']['trim_whitespace'] = 0;
+  $handler->display->display_options['fields']['fid']['alter']['nl2br'] = 0;
+  $handler->display->display_options['fields']['fid']['alter']['word_boundary'] = 1;
+  $handler->display->display_options['fields']['fid']['alter']['ellipsis'] = 1;
+  $handler->display->display_options['fields']['fid']['alter']['strip_tags'] = 0;
+  $handler->display->display_options['fields']['fid']['alter']['trim'] = 0;
+  $handler->display->display_options['fields']['fid']['alter']['html'] = 0;
+  $handler->display->display_options['fields']['fid']['element_type'] = '0';
+  $handler->display->display_options['fields']['fid']['element_label_colon'] = FALSE;
+  $handler->display->display_options['fields']['fid']['element_default_classes'] = 0;
+  $handler->display->display_options['fields']['fid']['hide_empty'] = 0;
+  $handler->display->display_options['fields']['fid']['empty_zero'] = 0;
+  $handler->display->display_options['fields']['fid']['hide_alter_empty'] = 0;
+  $handler->display->display_options['fields']['fid']['link_to_file'] = 0;
+  /* Sort criterion: File: Upload date */
+  $handler->display->display_options['sorts']['timestamp']['id'] = 'timestamp';
+  $handler->display->display_options['sorts']['timestamp']['table'] = 'file_managed';
+  $handler->display->display_options['sorts']['timestamp']['field'] = 'timestamp';
+  $handler->display->display_options['sorts']['timestamp']['order'] = 'DESC';
+  /* Filter criterion: File: Mime type */
+  $handler->display->display_options['filters']['filemime']['id'] = 'filemime';
+  $handler->display->display_options['filters']['filemime']['table'] = 'file_managed';
+  $handler->display->display_options['filters']['filemime']['field'] = 'filemime';
+  $handler->display->display_options['filters']['filemime']['operator'] = 'contains';
+  $handler->display->display_options['filters']['filemime']['value'] = 'image';
+  /* Filter criterion: File: Name */
+  $handler->display->display_options['filters']['filename']['id'] = 'filename';
+  $handler->display->display_options['filters']['filename']['table'] = 'file_managed';
+  $handler->display->display_options['filters']['filename']['field'] = 'filename';
+  $handler->display->display_options['filters']['filename']['operator'] = 'contains';
+  $handler->display->display_options['filters']['filename']['exposed'] = TRUE;
+  $handler->display->display_options['filters']['filename']['expose']['operator_id'] = 'filename_op';
+  $handler->display->display_options['filters']['filename']['expose']['label'] = 'Search by file name';
+  $handler->display->display_options['filters']['filename']['expose']['operator'] = 'filename_op';
+  $handler->display->display_options['filters']['filename']['expose']['identifier'] = 'filename';
+  $handler->display->display_options['filters']['filename']['expose']['required'] = FALSE;
+  $handler->display->display_options['filters']['filename']['expose']['multiple'] = FALSE;
+  $translatables['filefield_source'] = array(
+    t('Master'),
+    t('more'),
+    t('Apply'),
+    t('Reset'),
+    t('Sort by'),
+    t('Asc'),
+    t('Desc'),
+    t('Items per page'),
+    t('- All -'),
+    t('Offset'),
+    t('<img src="[uri]" width="120" height="80" />'),
+    t('<span data-fid="[fid]">Add image</span>'),
+    t('#[fid]'),
+    t('File Name'),
+  );
+
+  $views[$view->name] = $view;
+
+  return $views;
+}
\ No newline at end of file