diff --git a/inc/imce.js.inc b/inc/imce.js.inc
index fce9d72..6f8498f 100644
--- a/inc/imce.js.inc
+++ b/inc/imce.js.inc
@@ -11,6 +11,7 @@
 function imce_js_navigate(&$imce) {
   return array(
     'files' => theme('imce_file_list', array('imce_ref' => array('imce' => &$imce))),
+		'files_obj' => $imce['files'],
     'dirsize' => format_size($imce['dirsize']),
     'subdirectories' => array_map('rawurlencode', $imce['subdirectories']),
     'perm' => $imce['perm']
@@ -64,4 +65,4 @@ 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
+}
diff --git a/inc/imce.page.inc b/inc/imce.page.inc
index bcb00b2..3bfa39b 100644
--- a/inc/imce.page.inc
+++ b/inc/imce.page.inc
@@ -81,6 +81,10 @@ function imce_content($user, $scheme = NULL, $jsop = NULL) {
 
   //make necessary changes for js conversion
   $imce['dir'] = str_replace('%2F', '/', rawurlencode($imce['dir']));
+	// copy files to settings
+	if (isset( $imce['files'] )) {
+		$imce['files_obj'] = $imce['files'];
+	}
   unset($imce['files'], $imce['name'], $imce['directories'], $imce['subdirectories'], $imce['filesize'], $imce['quota'], $imce['tuquota'], $imce['thumbnails'], $imce['uid'], $imce['usertab']);
 
   drupal_add_js($imce_ref, 'setting');
@@ -572,6 +576,7 @@ function imce_add_file($file, &$imce) {
   }
   $imce['files'][$file->filename] = array(
     'name' => $file->filename,
+		'url' => file_create_url( $file->uri ),
     'size' => $file->filesize,
     'width' => $file->width,
     'height' => $file->height,
@@ -996,6 +1001,7 @@ function imce_scan_directory($dirname, $imce) {
     $date = filemtime($path);
     $directory['files'][$file] = array(
       'name' => $file,
+			'url' => file_create_url( $path ),
       'size' => $size,
       'width' => $width,
       'height' => $height,
@@ -1114,4 +1120,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 480032a..1a66315 100644
--- a/js/imce.js
+++ b/js/imce.js
@@ -1,6 +1,6 @@
 (function($) {
 //Global container.
-window.imce = {tree: {}, findex: [], fids: {}, selected: {}, selcount: 0, ops: {}, cache: {}, urlId: {},
+window.imce = {tree: {}, findex: [], fids: {}, files_obj: {} , selected: {}, selcount: 0, ops: {}, cache: {}, urlId: {},
 vars: {previewImages: 1, cache: 1},
 hooks: {load: [], list: [], navigate: [], cache: []},
 
@@ -104,8 +104,19 @@ dirSubdirs: function(dir, subdirs) {
   }
 },
 
+//update files json cache
+dirFiles:function(dir, files_obj) {
+	if (typeof files_obj == 'undefined') return;
+	imce.files_obj = files_obj;
+},
+
 //process file list
 initiateList: function(cached) {
+	// load from initial config
+	if (imce.conf.files_obj) {
+		imce.files_obj = imce.conf.files_obj;
+		delete imce.conf.files_obj;
+	}
   var L = imce.hooks.list, dir = imce.conf.dir, token = {'%dir':  dir == '.' ? $(imce.tree['.'].a).text() : imce.decode(dir)}
   imce.findex = [], imce.fids = {}, imce.selected = {}, imce.selcount = 0, imce.vars.lastfid = null;
   imce.tbody = imce.el('file-list').tBodies[0];
@@ -131,8 +142,9 @@ initiateList: function(cached) {
 
 //add a file to the list. (having properties name,size,formatted size,width,height,date,formatted date)
 fileAdd: function(file) {
-  var row, fid = file.name, i = imce.findex.length, attr = ['name', 'size', 'width', 'height', 'date'];
+  var row, fid = file.name, i = imce.findex.length, attr = ['name', 'url' , 'size', 'width', 'height', 'date'];
   if (!(row = imce.fids[fid])) {
+		imce.files_obj[fid]=file;
     row = imce.findex[i] = imce.fids[fid] = imce.tbody.insertRow(i);
     for (var i in attr) row.insertCell(i).className = attr[i];
   }
@@ -404,6 +416,7 @@ navUpdate: function(data, dir) {
   if (cached) data.files.id = 'file-list';
   $(imce.FLW).html(data.files);
   imce.dirActivate(dir);
+	imce.dirFiles(dir, data.files_obj);
   imce.dirSubdirs(dir, data.subdirectories);
   $.extend(imce.conf.perm, data.perm);
   imce.refreshOps();
@@ -415,7 +428,7 @@ navUpdate: function(data, dir) {
 
 //set cache
 navCache: function (dir, newdir) {
-  var C = imce.cache[dir] = {'dir': dir, files: imce.el('file-list'), dirsize: imce.el('dir-size').innerHTML, perm: $.extend({}, imce.conf.perm)};
+  var C = imce.cache[dir] = {'dir': dir, files: imce.el('file-list'), files_obj: imce.files_obj, dirsize: imce.el('dir-size').innerHTML, perm: $.extend({}, imce.conf.perm)};
   C.files.id = 'cached-list-'+ dir;
   imce.FW.appendChild(C.files);
   imce.invoke('cache', C, newdir);
@@ -654,8 +667,13 @@ serialNames: function () {
 
 //get file url. re-encode & and # for mod rewrite
 getURL: function (fid) {
-  var path = (imce.conf.dir == '.' ? '' : imce.conf.dir +'/') + fid;
-  return imce.conf.furl + (imce.conf.modfix ? path.replace(/%(23|26)/g, '%25$1') : path);
+	// load file from the object if exists
+	if (typeof imce.files_obj[fid] != 'undefined' && typeof imce.files_obj[fid].url != 'undefined') {
+		return imce.files_obj[fid].url;
+	}
+	// otherwise fallback to the old route
+	var path = (imce.conf.dir == '.' ? '' : imce.conf.dir +'/') + fid;
+	return imce.conf.furl + (imce.conf.modfix ? path.replace(/%(23|26)/g, '%25$1') : path);
 },
 
 //el. by id
@@ -802,4 +820,4 @@ updateUI: function() {
 //initiate
 $(document).ready(imce.initiate).ajaxError(imce.ajaxError);
 
-})(jQuery);
\ No newline at end of file
+})(jQuery);
