diff --git a/inc/imce.admin.inc b/inc/imce.admin.inc
index 23529c2..fab2984 100644
--- a/inc/imce.admin.inc
+++ b/inc/imce.admin.inc
@@ -250,6 +250,11 @@ function imce_profile_form($form, &$form_state, $pid = 0) {
     '#title' => t('Display file browser tab in user profile pages.'),
     '#default_value' => $profile['usertab'],
   );
+  $form['allow_url'] = array(
+    '#type' => 'checkbox',
+    '#title' => t('Allow upload file by URL.'),
+    '#default_value' => isset($profile['allow_url']) ? $profile['allow_url'] : FALSE,
+  );
   $form['filesize'] = array(
     '#type' => 'textfield',
     '#title' => t('Maximum file size per upload'),
@@ -744,4 +749,4 @@ function imce_admin_check_wildcard_upload($rid, $conf = NULL) {
 }
 
 //Include core profile functions.
-include_once DRUPAL_ROOT . '/' . drupal_get_path('module', 'imce') . '/inc/imce.core.profiles.inc';
\ No newline at end of file
+include_once DRUPAL_ROOT . '/' . drupal_get_path('module', 'imce') . '/inc/imce.core.profiles.inc';
diff --git a/inc/imce.core.profiles.inc b/inc/imce.core.profiles.inc
index 7495773..0ffde53 100644
--- a/inc/imce.core.profiles.inc
+++ b/inc/imce.core.profiles.inc
@@ -26,8 +26,8 @@ function imce_install_profiles() {
 /**
  * Construct a profile based on arguments.
  */
-function imce_construct_profile($n, $u, $f, $q, $tq, $e, $d, $fn, $ds, $ts) {
-  $profile = array('name' => $n, 'usertab' => $u, 'filesize' => $f, 'quota' => $q, 'tuquota' => $tq, 'extensions' => $e, 'dimensions' => $d, 'filenum' => $fn, 'directories' => array(), 'thumbnails' => array());
+function imce_construct_profile($n, $u, $f, $q, $tq, $e, $d, $fn, $ds, $ts, $au) {
+  $profile = array('name' => $n, 'usertab' => $u, 'filesize' => $f, 'quota' => $q, 'tuquota' => $tq, 'extensions' => $e, 'dimensions' => $d, 'filenum' => $fn, 'directories' => array(), 'thumbnails' => array(), 'allow_url' => $au);
   foreach ($ds as $d) {
     $profile['directories'][] = array('name' => $d[0], 'subnav' => $d[1], 'browse' => $d[2], 'upload' => $d[3], 'thumb' => $d[4], 'delete' => $d[5], 'resize' => $d[6]);
   }
@@ -45,12 +45,12 @@ function imce_user1_profile() {
   if (isset($profiles[1])) {
     return $profiles[1];
   }
-  return  imce_construct_profile('User-1', 1, 0, 0, 0, '*', '1200x1200', 0, array(array('.', 1, 1, 1, 1, 1, 1)), array(array('Small', '90x90', 'small_', ''), array('Medium', '120x120', 'medium_', ''), array('Large', '180x180', 'large_', '')));
+  return  imce_construct_profile('User-1', 1, 0, 0, 0, '*', '1200x1200', 0, array(array('.', 1, 1, 1, 1, 1, 1)), array(array('Small', '90x90', 'small_', ''), array('Medium', '120x120', 'medium_', ''), array('Large', '180x180', 'large_', '')), TRUE);
 }
 
 /**
  * Default profile.
  */
 function imce_sample_profile() {
-  return imce_construct_profile('Sample profile', 1, 1, 2, 0, 'gif png jpg jpeg', '800x600', 1, array(array('u%uid', 0, 1, 1, 1, 0, 0)), array(array('Thumb', '90x90', 'thumb_', '')));
+  return imce_construct_profile('Sample profile', 1, 1, 2, 0, 'gif png jpg jpeg', '800x600', 1, array(array('u%uid', 0, 1, 1, 1, 0, 0)), array(array('Thumb', '90x90', 'thumb_', '')), FALSE);
 }
diff --git a/inc/imce.page.inc b/inc/imce.page.inc
index 32e267c..9939ecd 100644
--- a/inc/imce.page.inc
+++ b/inc/imce.page.inc
@@ -81,7 +81,7 @@ function imce_content($user, $scheme = NULL, $jsop = NULL) {
 
   //make necessary changes for js conversion
   $imce['dir'] = str_replace('%2F', '/', rawurlencode($imce['dir']));
-  unset($imce['files'], $imce['name'], $imce['directories'], $imce['subdirectories'], $imce['filesize'], $imce['quota'], $imce['tuquota'], $imce['thumbnails'], $imce['uid'], $imce['usertab']);
+  unset($imce['files'], $imce['name'], $imce['directories'], $imce['subdirectories'], $imce['filesize'], $imce['quota'], $imce['tuquota'], $imce['thumbnails'], $imce['uid'], $imce['usertab'], $imce['allow_url']);
 
   drupal_add_js($imce_ref, 'setting');
 
@@ -131,6 +131,16 @@ function imce_upload_form($form, &$form_state, $ref) {
     '#title' => t('File'),
     '#size' => 30,
   );
+
+  if (!empty($imce['allow_url'])) {
+    $form['url'] = array(
+      '#type' => 'textfield',
+      '#title' => t('URL'),
+      '#description' => t('Leave empty "File" for uploading file from URL.'),
+      '#size' => 30,
+    );
+  }
+
   if (!empty($imce['thumbnails'])) {
     $form['thumbnails'] = array(
       '#type' => 'checkboxes',
@@ -184,7 +194,7 @@ function imce_fileop_form($form, &$form_state, $ref) {
       '#title' => t('Resize'),
     ) + imce_resize_form($imce);
   }
- 
+
   $form['#action'] = $imce['url'];
   return $form;
 }
@@ -293,8 +303,15 @@ function imce_upload_submit($form, &$form_state) {
 
   //save uploaded file.
   $replace = variable_get('imce_settings_replace', FILE_EXISTS_RENAME);
-  if ($file = file_save_upload('imce', $validators, $diruri, $replace)) {
 
+  if (empty($form_state['values']['imce']) && !empty($form_state['values']['url'])) {
+    $file = system_retrieve_file($form_state['values']['url'], $diruri, TRUE, $replace);
+  }
+  else {
+    $file = file_save_upload('imce', $validators, $diruri, $replace);
+  }
+
+  if ($file) {
     //core bug #54223.
     if ($replace == FILE_EXISTS_RENAME) {
       $name = drupal_basename($file->uri);
@@ -1126,4 +1143,4 @@ function imce_file_register($file) {
   if (!db_query("SELECT 1 FROM {file_usage} WHERE module = 'imce' AND fid = :fid", array(':fid' => $file->fid))->fetchField()) {
     file_usage_add($file, 'imce', 'file', $file->fid);
   }
-}
\ No newline at end of file
+}
diff --git a/js/imce.js b/js/imce.js
index 17c8f7c..591027c 100644
--- a/js/imce.js
+++ b/js/imce.js
@@ -262,7 +262,7 @@ setUploadOp: function () {
     if (el = form.elements.html_response) {
       el.value = 0;
     }
-  } 
+  }
   imce.opAdd({name: 'upload', title: Drupal.t('Upload'), content: form});//add op
 },
 
@@ -441,7 +441,11 @@ navCache: function (dir, newdir) {
 //validate upload form
 uploadValidate: function (data, form, options) {
   var path = $('#edit-imce').val();
-  if (!path) return false;
+  var url = $('#edit-url').val();
+  if (!path && !url) return false;
+
+  if (!path && url) path = url;
+
   if (imce.conf.extensions != '*') {
     var ext = path.substr(path.lastIndexOf('.') + 1);
     if ((' '+ imce.conf.extensions +' ').indexOf(' '+ ext.toLowerCase() +' ') == -1) {
@@ -450,6 +454,7 @@ uploadValidate: function (data, form, options) {
   }
   options.url = imce.ajaxURL('upload');//make url contain current dir.
   imce.fopLoading('upload', true);
+
   return true;
 },
 
@@ -696,7 +701,7 @@ getURL: function (fid, uncached) {
   return url;
 },
 
-//get encoded file path relative to root. 
+//get encoded file path relative to root.
 getRelpath: function (fid) {
   var dir = imce.conf.dir;
   return (dir === '.' ? '' : dir + '/') + fid;
@@ -854,4 +859,4 @@ updateUI: function() {
 //initiate
 $(document).ready(imce.initiate);
 
-})(jQuery);
\ No newline at end of file
+})(jQuery);
