diff --git a/inc/imce.js.inc b/inc/imce.js.inc
index 9664d39..ab8d201 100644
--- a/inc/imce.js.inc
+++ b/inc/imce.js.inc
@@ -64,4 +64,13 @@ function imce_js_resize(&$imce) {
 function imce_process_fileop(&$imce) {
   drupal_get_form('imce_fileop_form', array('imce' => &$imce));
   return array('added' => isset($imce['added']) ? $imce['added'] : NULL, 'removed' => isset($imce['removed']) ? $imce['removed'] : NULL, 'dirsize' => format_size($imce['dirsize']));
-}
\ No newline at end of file
+}
+
+/**
+* Ajax operation: filter
+*/
+function imce_js_filter(&$imce) {
+  $_POST['op'] = t('Filter');
+  drupal_get_form('imce_filter_form', array('imce' => &$imce));
+  return array('filtered' => isset($imce['filtered']) ? $imce['filtered'] : NULL, 'dirsize' => format_size($imce['dirsize']));
+}
diff --git a/inc/imce.page.inc b/inc/imce.page.inc
index cd2b401..dcfb422 100644
--- a/inc/imce.page.inc
+++ b/inc/imce.page.inc
@@ -64,6 +64,9 @@ function imce_content($user, $jsop = NULL) {
     }
     //process file operations.
     $forms .= drupal_get_form('imce_fileop_form', $imce_ref);
+
+    //process file filter.
+    $forms .= drupal_get_form('imce_filter_form', $imce_ref);
   }
 
   //run custom content functions. possible to insert extra forms. content is invisible when js is enabled.
@@ -239,6 +242,40 @@ function imce_resize_form(&$imce) {
 }
 
 /**
+ * Filter form.
+ */
+function imce_filter_form(&$form_state, $ref) {
+  $imce =& $ref['imce'];
+  $form['contains'] = array(
+    '#type' => 'textfield',
+    '#title' => t('Contains'),
+    '#size' => 21,
+    '#maxlength' => 20,
+    '#prefix' => '<div class="container-inline">',
+  );  
+  $form['filter'] = array(
+    '#type' => 'submit',
+    '#value' => t('Filter'),
+    '#submit' => array('imce_filter_submit'),
+    '#suffix' => '</div>',
+  );
+  $form['help1'] = array(
+    '#value' => t('Note that this filter is cumulative: the results will only include items that were in any previous search.'),
+    '#prefix' => '<p>',
+    '#suffix' => '</p>',
+  );
+  $form['help2'] = array(
+    '#value' => t('To clear your filter, click on the directory name in the Navigation box at left.'),
+    '#prefix' => '<p>',
+    '#suffix' => '</p>',
+  );
+  
+  $form = array('fset_filter' => array('#type' => 'fieldset', '#title' => t('Filter files')) + $form);
+  $form['#action'] = $imce['url'];
+  return $form;
+}
+
+/**
  * Validate file operations form.
  */
 function imce_fileop_form_validate($form, &$form_state) {
@@ -390,6 +427,34 @@ function imce_process_files($filenames, &$imce, $function, $args = array()) {
 }
 
 /**
+ * Submit search form.
+ */
+function imce_filter_submit($form, &$form_state) {
+  $form_state['redirect'] = FALSE;
+  $imce =& $form['#parameters'][2]['imce'];
+
+  $contains = $form['#post']['contains'];
+  $keys = preg_grep("/^.*$contains.*$/i", array_keys($imce['files']));
+
+  $files = array();
+  $dirsize = 0;
+  foreach ($keys as $key) {
+    $files[$key] = $imce['files'][$key];
+    $dirsize += $files[$key]['size'];
+  }
+
+  $imce['files'] = $files;
+  $imce['dirsize'] = $dirsize;
+
+  if (isset($_GET['jsop'])) {
+    $imce['filtered'] = array_flip($keys);
+  }
+
+  drupal_set_message(t('Filtered files successful.'));
+}
+
+
+/**
  * Delete a file in the file list.
  */
 function imce_delete_file($filename, &$imce) {
diff --git a/js/imce.js b/js/imce.js
index abc162c..54e6319 100644
--- a/js/imce.js
+++ b/js/imce.js
@@ -225,6 +225,7 @@ initiateOps: function() {
   imce.setHtmlOps();
   imce.setUploadOp();//upload
   imce.setFileOps();//thumb, delete, resize
+  imce.setFilterOp();//filter
 },
 
 //process existing html ops.
@@ -268,6 +269,18 @@ setFileOps: function () {
   imce.vars.opform = $(form).serialize();//serialize remaining parts.
 },
 
+//convert filter form to an op.
+setFilterOp: function () {
+  if (!imce.el('imce-filter-form')) return;
+  var form = $(imce.el('imce-filter-form'));
+  $(form).find('fieldset').each(function() {//clean up fieldsets
+    this.removeChild(this.firstChild);
+    $(this).after(this.childNodes);
+  }).remove();
+  form.ajaxForm(imce.filterSettings());//set ajax
+  imce.opAdd({name: 'filter', title: Drupal.t('Filter files'), content: form});//add op
+},
+
 //refresh ops states. enable/disable
 refreshOps: function() {
   for (var p in imce.conf.perm) {
@@ -503,6 +516,18 @@ fopLoading: function(fop, state) {
   }
 },
 
+//validate filter form
+filterValidate: function (data, form, options) {
+  options.url = imce.ajaxURL('filter');
+  imce.fopLoading('filter', true);
+  return true;
+},
+
+//settings for filter
+filterSettings: function () {
+  return {beforeSubmit: imce.filterValidate, success: function (response) {imce.processResponse(Drupal.parseJson(response));}, complete: function () {imce.fopLoading('filter', false);}, resetForm: false};
+},
+
 //preview a file.
 setPreview: function (fid) {
   var row, html = '';
@@ -578,7 +603,7 @@ processResponse: function (response) {
 
 //process response data
 resData: function (data) {
-  var i, added, removed;
+  var i, added, removed, filtered;
   if (added = data.added) {
     var cnt = imce.findex.length;
     for (i in added) {//add new files or update existing
@@ -594,6 +619,9 @@ resData: function (data) {
   if (removed = data.removed) for (i in removed) {
     imce.fileRemove(removed[i]);
   }
+  if (filtered = data.filtered) {//filter the list of files
+    for (i in imce.fids) if (filtered[i] == null) imce.fileRemove(i);
+  }
   imce.conf.dirsize = data.dirsize;
   imce.updateStat();
 },
