diff --git a/gtk/gtkfilesystemmodel.c b/gtk/gtkfilesystemmodel.c
index 738b061..90c6ec5 100644
--- a/gtk/gtkfilesystemmodel.c
+++ b/gtk/gtkfilesystemmodel.c
@@ -147,6 +147,7 @@ struct _GtkFileSystemModel
 					 * The hash table gets re-populated in node_get_for_file() if this mismatch is
 					 * detected.
 					 */
+  GHashTable *          hidden_files;    /* Hash table containing the entries of a .hidden file */
 
   guint                 n_columns;      /* number of columns */
   GType *               column_types;   /* types of each column */
@@ -350,7 +351,7 @@ node_should_be_visible (GtkFileSystemModel *model, guint id)
     return FALSE;
 
   if (!model->show_hidden &&
-      (g_file_info_get_is_hidden (node->info) || g_file_info_get_is_backup (node->info)))
+      (g_file_info_get_is_hidden (node->info) || g_file_info_get_is_backup (node->info) || g_hash_table_lookup(model->hidden_files,g_file_info_get_name (node->info)) != NULL))
     return FALSE;
 
   is_folder = _gtk_file_info_consider_as_directory (node->info);
@@ -1033,7 +1034,7 @@ _gtk_file_system_model_init (GtkFileSystemModel *model)
   model->show_files = TRUE;
   model->show_folders = TRUE;
   model->show_hidden = FALSE;
-
+  model->hidden_files = NULL;
   model->sort_column_id = GTK_TREE_SORTABLE_UNSORTED_SORT_COLUMN_ID;
 
   model->file_lookup = g_hash_table_new (g_file_hash, (GEqualFunc) g_file_equal);
@@ -1060,6 +1061,53 @@ thaw_func (gpointer data)
 }
 
 static void
+gtk_file_system_model_search_read_hidden_file_container (gpointer data)
+{
+  GtkFileSystemModel *model = data;
+
+  GFile *child;
+  GFileInfo *info;
+  GFileType type;
+  gsize file_size;
+  char *file_contents;
+  guint i;
+
+  child = g_file_get_child (model->dir, ".hidden");
+
+  type = G_FILE_TYPE_UNKNOWN;
+
+  info = g_file_query_info (child, G_FILE_ATTRIBUTE_STANDARD_TYPE, 0, NULL, NULL);
+  if (info != NULL)
+    {
+      type = g_file_info_get_file_type (info);
+      g_object_unref (info);
+    }
+
+  if (type == G_FILE_TYPE_REGULAR && g_file_load_contents (child, NULL, &file_contents, &file_size, NULL, NULL))
+    {
+      GHashTable *ghtable = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, NULL);
+      g_object_unref (child);
+      i = 0;
+      while (i < file_size)
+        {
+          gint start;
+          start = i;
+          while (i < file_size && file_contents[i] != '\n')
+            i++;
+          if (i > start)
+            {
+              char *hidden_filename;
+              hidden_filename = g_strndup (file_contents + start, i - start);
+              g_hash_table_insert (ghtable, hidden_filename, hidden_filename);
+            }
+          i++;
+        }
+      model->hidden_files = ghtable;
+    }
+  
+}
+
+static void
 gtk_file_system_model_got_files (GObject *object, GAsyncResult *res, gpointer data)
 {
   GFileEnumerator *enumerator = G_FILE_ENUMERATOR (object);
@@ -1083,6 +1131,8 @@ gtk_file_system_model_got_files (GObject *object, GAsyncResult *res, gpointer da
                                                                  NULL);
         }
 
+      gtk_file_system_model_search_read_hidden_file_container(model);
+
       for (walk = files; walk; walk = walk->next)
         {
           const char *name;
