--- a/src/desktop/unity-lens-recoll/recollscope/rclsearch.py
+++ b/src/desktop/unity-lens-recoll/recollscope/rclsearch.py
@@ -2,6 +2,10 @@
 import sys
 import subprocess
 import time
+import urllib
+import hashlib
+import os
+import locale
 
 from gi.repository import GLib, GObject, Gio
 from gi.repository import Dee
@@ -10,6 +14,18 @@
 import recoll
 
 BUS_PATH = "/org/recoll/unitylensrecoll/scope/main"
+
+# Thumbnails standard
+# 256x256 
+THMBDIRLARGE = "~/.thumbnails/large"
+# 128x128
+THMBDIRNORMAL = "~/.thumbnails/normal"
+
+# Icon names for some recoll mime types which don't have standard icon by the
+# normal method
+SPEC_MIME_ICONS = {'application/x-fsdirectory' : 'gnome-fs-directory.svg',
+                   'message/rfc822' : 'mail-read',
+                   'application/x-recoll' : 'recoll'}
 
 # These category ids must match the order in which we add them to the lens
 CATEGORY_ALL = 0
@@ -99,17 +115,15 @@
     def _on_global_search_changed (self, scope, param_spec):
         search = self.get_global_search_string()
         results = scope.props.global_results_model
-        
         #print "Global search changed to: '%s'" % search
-        
         self._update_results_model (search, results)
-        
+    
     def _update_results_model (self, search_string, model):
         if search_string:
             self._do_search (search_string, model)
         else:
             self._do_browse (model)
-    
+
     def _do_browse (self, model):
         if self.timeout_id is not None:
             GObject.source_remove(self.timeout_id)
@@ -134,12 +148,37 @@
         if TYPING_TIMEOUT == 0:
             self._really_do_search(search_string, model)
             return True
-        
+
         if self.timeout_id is not None:
             GObject.source_remove(self.timeout_id)
         self.timeout_id = \
             GObject.timeout_add(TYPING_TIMEOUT, self._on_timeout, 
                     search_string, model)
+
+    def _get_thumbnail_path(self, url):
+        """Look for a thumbnail for the input url, according to the
+        freedesktop thumbnail storage standard. The input 'url' always
+        begins with file:// and is unencoded. We encode it properly
+        and compute the path inside the thumbnail storage
+        directory. We return the path only if the thumbnail does exist
+        (no generation performed)"""
+        path = url
+        path = path.replace("file://", "", 1)
+        try:
+            path = "file://" + urllib.quote(path)
+        except:
+            #print "_get_thumbnail_path: quote failed"
+            return None
+        #print "_get_thumbnail: encoded path: [%s]" % (path,)
+        thumbname = hashlib.md5(path).hexdigest() + ".png"
+        #print "_get_thumbnail: thumbname: [%s]" % (thumbname,)
+        tpath = os.path.join(os.path.expanduser(THMBDIRNORMAL), thumbname)
+        if os.path.exists(tpath):
+            return tpath
+        tpath = os.path.join(os.path.expanduser(THMBDIRLARGE), thumbname)
+        if os.path.exists(tpath):
+            return tpath
+        return None
 
     def _really_do_search(self, search_string, model):
         #print "really_do_search:", "[" + search_string + "]"
@@ -183,12 +222,25 @@
 
             # Results with an ipath get a special mime type so that they
             # get opened by starting a recoll instance.
+            thumbnail = None
             if doc.ipath != "":
                 mimetype = "application/x-recoll"
                 url = doc.url + "#" + doc.ipath
             else:
                 mimetype = doc.mimetype
                 url = doc.url
+                # doc.url is a unicode string which is badly wrong. A
+                # future version of the pyrecoll module will have a
+                # separate method to retrieve the binary
+                # version. Until this happens, try to encode
+                # back. This won't work every time (ie: if the
+                # original path could not be translated to unicode by
+                # pyrecoll, or if the unicode can't be translated back
+                # in the current locale)
+                encoding = locale.nl_langinfo(locale.CODESET)
+                thumbnail = \
+                          self._get_thumbnail_path(url.encode(encoding,
+                                                              errors='replace'))
 
             #print "Recoll Lens: Using MIMETYPE", mimetype, " URL", url
 
@@ -196,9 +248,19 @@
             if titleorfilename == "":
                 titleorfilename = doc.filename
 
-            icon = Gio.content_type_get_icon(doc.mimetype)
-            if icon:
-                iconname = icon.get_names()[0]
+            iconname = None
+            if thumbnail:
+                iconname = thumbnail
+            else:
+                if SPEC_MIME_ICONS.has_key(doc.mimetype):
+                    iconname = SPEC_MIME_ICONS[doc.mimetype]
+                else:
+                    icon = Gio.content_type_get_icon(doc.mimetype)
+                    if icon:
+                        iconname = icon.get_names()[0]
+
+            #print "iconname:", iconname
+
 
             try:
                 abstract = self.db.makeDocAbstract(doc, query).encode('utf-8')