diff --git a/sites/all/modules/imce/inc/admin.inc b/sites/all/modules/imce/inc/admin.inc
index 733136d..2b6242a 100644
--- a/sites/all/modules/imce/inc/admin.inc
+++ b/sites/all/modules/imce/inc/admin.inc
@@ -321,7 +321,12 @@ function imce_directory_form($directory = array()) {
     '#title' => t('Delete'),
     '#default_value' => $directory['delete'],
   );
-  $form['resize'] = array(
+  $form['rename'] = array(
+    '#type' => 'checkbox',
+    '#title' => t('Rename'),
+    '#default_value' => $directory['rename'],
+  );
+ $form['resize'] = array(
     '#type' => 'checkbox',
     '#title' => t('Resize'),
     '#default_value' => $directory['resize'],
diff --git a/sites/all/modules/imce/inc/js.inc b/sites/all/modules/imce/inc/js.inc
index 101ea60..415fc38 100644
--- a/sites/all/modules/imce/inc/js.inc
+++ b/sites/all/modules/imce/inc/js.inc
@@ -45,6 +45,16 @@ function imce_js_delete(&$imce) {
 }
 
 /**
+ * Ajax operation: rename
+ */
+function imce_js_rename(&$imce) {
+  if ($imce['perm']['rename']) {
+    $_POST['op'] = t('Rename');
+    return imce_process_fileop($imce);
+  }
+}
+
+/**
  * Ajax operation: resize
  */
 function imce_js_resize(&$imce) {
diff --git a/sites/all/modules/imce/inc/page.inc b/sites/all/modules/imce/inc/page.inc
index bba758d..d33728b 100644
--- a/sites/all/modules/imce/inc/page.inc
+++ b/sites/all/modules/imce/inc/page.inc
@@ -153,6 +153,15 @@ function imce_fileop_form(&$form_state, $ref) {
     ) + imce_delete_form($imce);
   }
 
+  //rename
+  if (imce_perm_exists($imce, 'rename')) {
+    $form['fset_rename'] = array(
+      '#type' => 'fieldset',
+      '#title' => t('Rename'),
+    ) + imce_rename_form($imce);
+  }
+
+
   //resize
   if (imce_perm_exists($imce, 'resize')) {
     $form['fset_resize'] = array(
@@ -166,6 +175,22 @@ function imce_fileop_form(&$form_state, $ref) {
 }
 
 /**
+ * Rename form.
+ */
+function imce_rename_form(&$imce) {
+  $form['newname'] = array(
+    '#type' => 'textfield',
+    '#title' => t('New filename'),
+  );
+  $form['rename'] =  array(
+    '#type' => 'submit',
+    '#value' => t('Rename File'),
+    '#submit' => $imce['perm']['rename'] ? array('imce_rename_submit') : NULL,//permission for submission
+  );
+  return $form;
+}
+
+/**
  * Thumbnail form.
  */
 function imce_thumb_form(&$imce) {
@@ -334,6 +359,20 @@ function imce_delete_submit($form, &$form_state) {
 }
 
 /**
+ * Submit rename form.
+ */
+function imce_rename_submit($form, &$form_state) {
+  $form_state['redirect'] = FALSE;
+  $imce =& $form['#parameters'][2]['imce'];
+
+  $renamed = imce_rename_file($form_state['values']['filenames'][0], $imce, $form_state['values']['newname']);
+  if ($renamed) {
+    drupal_set_message(t('File rename successful: %file changed to %newfile.', array('%file' => $form_state['values']['filenames'][0], '%newfile' => $form_state['values']['newname'])));
+  }
+}
+
+/**
  * Submit resize form.
  */
 function imce_resize_submit($form, &$form_state) {
@@ -389,6 +428,48 @@ function imce_delete_file($filename, &$imce) {
 }
 
 /**
+ * Rename a file.
+ */
+function imce_rename_file($filename, &$imce, $newname) {
+  $file = new stdClass();
+  $file->filename = $newfilename;
+
+  // Can rename only 1 file at a time
+  $num_selected = count($filenames); 
+  if ($num_selected > 1) {
+    $errors = t('Please select only one file to rename. %num are currently selected', array('%num' => $num_selected));
+  } 
+  // Ensure the new file name exists
+  if (empty($newname)) {
+    $errors = t('Please provide a valid file name.');
+  }
+  //validate file name
+  $errors = file_validate_name_length($file);
+  // Prevent changing the filename extension
+  if(substr($filename, strrpos($filename, '.')) != substr($newname, strrpos($newname, '.'))) {
+    $errors = t('The file extension cannot be changed from: %filename to %newname', array('%filename' => $filename, '%newname' => $newname));
+  }
+  if (!empty($errors)) {
+    drupal_set_message($errors, 'error');
+    return FALSE;
+  }
+
+  $filepath = file_directory_path() . ($imce['dir'] == '.' ? '' : '/'. $imce['dir']) .'/'. $filename;
+  $newfilename = file_directory_path() . ($imce['dir'] == '.' ? '' : '/'. $imce['dir']) .'/'. $newname;
+  $replace = variable_get('imce_settings_replace', FILE_EXISTS_RENAME);
+  
+  //move file to new filename
+  $moved = file_move($filepath, $newfilename, FILE_EXISTS_ERROR); 
+  if (!$moved) {
+    drupal_set_message(t('The file cannot be renamed to %newfile because it already exists.'), 'error');
+    return FALSE;
+  } else {
+    db_query("UPDATE {files} SET filename = '%s', filepath = '%s' WHERE filepath = '%s'", $newname, $newfilename, $filepath);
+  }
+  return TRUE;
+}
+
+/**
  * Create all selected thumbnails.
  */
 function imce_create_thumbnails($filename, &$imce, $values) {
diff --git a/sites/all/modules/imce/js/imce.js b/sites/all/modules/imce/js/imce.js
index 9421bf6..43e1774 100644
--- a/sites/all/modules/imce/js/imce.js
+++ b/sites/all/modules/imce/js/imce.js
@@ -227,7 +227,7 @@ fileToggleSelect: function (fid) {
 initiateOps: function() {
   imce.setHtmlOps();
   imce.setUploadOp();//upload
-  imce.setFileOps();//thumb, delete, resize
+  imce.setFileOps();//thumb, delete, rename, resize
 },
 
 //process existing html ops.
@@ -419,7 +419,7 @@ uploadSettings: function () {
 },
 
 /**************** FILE OPS  ********************/
-//validate default ops(delete, thumb, resize)
+//validate default ops(delete, thumb, resize, rename)
 fopValidate: function(fop) {
   if (!imce.validateSelCount(1, imce.conf.filenum)) return false;
   switch (fop) {
@@ -438,8 +438,12 @@ fopValidate: function(fop) {
         return imce.setMessage(Drupal.t('Please specify dimensions within the allowed range that is from 1x1 to @dimensions.', {'@dimensions': maxW ? imce.conf.dimensions : Drupal.t('unlimited')}), 'error');
       }
       return imce.validateImage();
+    case 'rename':
+      if (imce.el('edit-newname').value.replace(/\s/g, "") == '') {
+        return imce.setMessage(Drupal.t('Please provide a new filename.'), 'error');
+      }
+      return confirm(Drupal.t('Rename selected file?'));
   }
-
   var func = fop +'OpValidate';
   if (imce[func]) return imce[func](fop);
   return true;
@@ -448,7 +452,7 @@ fopValidate: function(fop) {
 //submit wrapper for default ops
 fopSubmit: function(fop) {
   switch (fop) {
-    case 'thumb': case 'delete': case 'resize':  return imce.commonSubmit(fop);
+    case 'thumb': case 'delete': case 'rename': case 'resize':  return imce.commonSubmit(fop);
   }
   var func = fop +'OpSubmit';
   if (imce[func]) return imce[func](fop);
